summaryrefslogtreecommitdiff
path: root/source/com/c2kernel/lookup/AgentPath.java
blob: 01c764f2404bec6666510616f672f6801aadbf90 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/**************************************************************************
 * EntityPath.java
 *
 * $Revision: 1.12 $
 * $Date: 2005/10/13 08:15:00 $
 *
 * Copyright (C) 2001 CERN - European Organization for Nuclear Research
 * All rights reserved.
 **************************************************************************/

package com.c2kernel.lookup;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import org.apache.xerces.impl.dv.util.Base64;

import com.c2kernel.common.ObjectCannotBeUpdated;
import com.c2kernel.common.ObjectNotFoundException;
import com.c2kernel.process.Gateway;
import com.novell.ldap.LDAPAttribute;
import com.novell.ldap.LDAPAttributeSet;
import com.novell.ldap.LDAPEntry;


/**
* Extends Path to enforce SystemKey structure and support int form
*
* @version $Revision: 1.12 $ $Date: 2005/10/13 08:15:00 $
* @author  $Author: abranson $
**/
public class AgentPath extends EntityPath
{
          
	private String mAgentName=null;
	private String mPassword=null;
	    
    public AgentPath(int syskey, String agentName) 
    throws InvalidAgentPathException,InvalidEntityPathException  
    {
        super(syskey);
        if (agentName!=null && agentName.length()>0)
        	setAgentName(agentName);
		else        	
			throw new InvalidAgentPathException();
    }
    
    public AgentPath(int syskey)
    throws InvalidEntityPathException  
    {
        super(syskey);
    }
    
    public AgentPath(EntityPath entity) {
        super();
        try {
            setSysKey(entity.getSysKey());
        } catch (InvalidEntityPathException ex) {
            //won't happen as the entity path was valid
        }
    }
        
    public void setAgentName(String agentID)
    {
    	mAgentName = agentID;
    }

    public String getAgentName()
    {
    	if (mAgentName==null)
    	{
            try {
                LDAPEntry agentEntry = LDAPLookupUtils.getEntry(Gateway.getLDAPLookup().getConnection(), this.getDN() + mLocalPath);
                mAgentName = LDAPLookupUtils.getFirstAttributeValue(agentEntry,"uid");
            } catch (ObjectNotFoundException e) {
                mAgentName = "";
            }
		}    		
    	return mAgentName;
    }

    public RolePath[] getRoles()
    {
  		return Gateway.getLDAPLookup().getRoleManager().getRoles(this);		
    }
    
    public boolean hasRole(RolePath role) {
        return Gateway.getLDAPLookup().getRoleManager().hasRole(this, role);
    }
    
    public boolean hasRole(String role) {
        try {
            return hasRole(Gateway.getLDAPLookup().getRoleManager().getRolePath(role));
        } catch (ObjectNotFoundException ex) {
            return false;
        }
    }

    public void setPassword(String passwd)
    {
 		mPassword = passwd;
    }

    public String getPassword()
    {
    	return mPassword;
    }

    public String dump() {
        return super.dump()+
                "\n        agentID="+
                mAgentName;
    }	
    
    static String generateUserPassword(String pass, String algo) throws NoSuchAlgorithmException {
        MessageDigest sha = MessageDigest.getInstance(algo);
        sha.reset();
        sha.update(pass.getBytes());
        byte hash[] = sha.digest();
        StringBuffer digest = new StringBuffer("{").append(algo).append("}");
        digest.append(Base64.encode(hash));
        return digest.toString();
    }
    
    public LDAPAttributeSet createAttributeSet() throws ObjectCannotBeUpdated
    {
        LDAPAttributeSet attrs = new LDAPAttributeSet();
        attrs.add(new LDAPAttribute("objectclass","cristalagent"));
        attrs.add(new LDAPAttribute("intsyskey",Integer.toString(mSysKey)));     
        attrs.add(new LDAPAttribute("cn", getPath()[getPath().length-1]));
        if (mIOR != null)
            attrs.add(new LDAPAttribute("ior", Gateway.getORB().object_to_string(mIOR)));
        
        if (mAgentName!=null && mAgentName.length()>0)
            attrs.add(new LDAPAttribute("uid",mAgentName));
        else
            throw new ObjectCannotBeUpdated("Cannot create agent. No userId specified", "");
        
        if (mPassword!=null && mPassword.length()>0)
            try {
                attrs.add(new LDAPAttribute("userPassword",generateUserPassword(mPassword, "SHA")));
            } catch (NoSuchAlgorithmException ex) {
                throw new ObjectCannotBeUpdated("Cryptographic libraries for password hashing not found.", "");
            }
        else
            throw new ObjectCannotBeUpdated("Cannot create agent. No password given", "");
        
        return attrs;
    }
    
}