58 |
58 |
/**
|
59 |
59 |
* An implementation of the AuthInterface interface that
|
60 |
60 |
* allows Metacat to use the LDAP protocol for directory services.
|
61 |
|
* The LDAP authentication service is used to determine if a user
|
|
61 |
* The LDAP authentication service is used to determine if a user
|
62 |
62 |
* is authenticated, and whether they are a member of a particular group.
|
63 |
63 |
*/
|
64 |
64 |
public class AuthLdap implements AuthInterface, Runnable {
|
... | ... | |
75 |
75 |
ReferralException refExc;
|
76 |
76 |
//String uid=null;
|
77 |
77 |
|
78 |
|
/**
|
|
78 |
/**
|
79 |
79 |
* Construct an AuthLdap
|
80 |
80 |
*/
|
81 |
81 |
public AuthLdap() {
|
... | ... | |
104 |
104 |
String identifier = user;
|
105 |
105 |
//get uid here.
|
106 |
106 |
//uid=user.substring(0, user.indexOf(","));
|
107 |
|
|
|
107 |
|
108 |
108 |
try {
|
109 |
109 |
// Check the usename as passed in
|
110 |
110 |
authenticated = ldapAuthenticate(identifier, password);
|
... | ... | |
138 |
138 |
}
|
139 |
139 |
//authenticated = ldapAuthenticate(identifier, password);
|
140 |
140 |
}
|
141 |
|
|
|
141 |
|
142 |
142 |
} catch (NullPointerException e) {
|
143 |
143 |
util.debugMessage("NullPointerException b' password is null", 30);
|
144 |
|
util.debugMessage("NullPointerException while authenticating in " +
|
|
144 |
util.debugMessage("NullPointerException while authenticating in " +
|
145 |
145 |
"AuthLdap.authenticate: " + e, 30);
|
146 |
146 |
throw new ConnectException(
|
147 |
|
"NullPointerException while authenticating in " +
|
|
147 |
"NullPointerException while authenticating in " +
|
148 |
148 |
"AuthLdap.authenticate: " + e);
|
149 |
149 |
} catch (NamingException e) {
|
150 |
|
util.debugMessage("Naming exception while authenticating in " +
|
|
150 |
util.debugMessage("Naming exception while authenticating in " +
|
151 |
151 |
"AuthLdap.authenticate: " + e, 30);
|
152 |
152 |
e.printStackTrace();
|
153 |
153 |
} catch (Exception e) {
|
... | ... | |
166 |
166 |
private boolean ldapAuthenticate(String identifier, String password)
|
167 |
167 |
throws ConnectException, NamingException, NullPointerException
|
168 |
168 |
{
|
169 |
|
return ldapAuthenticate(identifier, password,
|
|
169 |
return ldapAuthenticate(identifier, password,
|
170 |
170 |
this.ldapsUrl, this.ldapBase);
|
171 |
171 |
}
|
172 |
172 |
|
... | ... | |
184 |
184 |
double totStartTime = System.currentTimeMillis();
|
185 |
185 |
boolean authenticated = false;
|
186 |
186 |
if (identifier != null && !password.equals("")) {
|
187 |
|
|
|
187 |
|
188 |
188 |
//Pass the username and password to run() method
|
189 |
189 |
userName=identifier;
|
190 |
190 |
userPassword=password;
|
191 |
191 |
// Identify service provider to use
|
192 |
192 |
Hashtable env = new Hashtable(11);
|
193 |
|
env.put(Context.INITIAL_CONTEXT_FACTORY,
|
|
193 |
env.put(Context.INITIAL_CONTEXT_FACTORY,
|
194 |
194 |
"com.sun.jndi.ldap.LdapCtxFactory");
|
195 |
195 |
env.put(Context.REFERRAL, "throw");
|
196 |
196 |
env.put(Context.PROVIDER_URL, directoryUrl + searchBase);
|
... | ... | |
233 |
233 |
|
234 |
234 |
Thread t = new Thread(this);
|
235 |
235 |
t.start();
|
236 |
|
Thread.sleep(5000); //this is a manual override of ldap's
|
|
236 |
Thread.sleep(5000); //this is a manual override of ldap's
|
237 |
237 |
//hideously long time out period.
|
238 |
238 |
util.debugMessage("Awake after 5 seconds.", 35);
|
239 |
239 |
if (referralContext == null) {
|
... | ... | |
246 |
246 |
authenticated = false;
|
247 |
247 |
}
|
248 |
248 |
}
|
249 |
|
} else {
|
|
249 |
} else {
|
250 |
250 |
util.debugMessage("User not found", 30);
|
251 |
251 |
}
|
252 |
252 |
double totStopTime = System.currentTimeMillis();
|
253 |
|
util.debugMessage("total ldap authentication time: " +
|
|
253 |
util.debugMessage("total ldap authentication time: " +
|
254 |
254 |
(totStopTime - totStartTime)/1000 + " seconds", 35);
|
255 |
255 |
return authenticated;
|
256 |
256 |
}
|
257 |
|
|
258 |
|
|
259 |
257 |
|
|
258 |
|
|
259 |
|
260 |
260 |
/**
|
261 |
261 |
* Get the identifying name for a given userid or name. This is the name
|
262 |
262 |
* that is used in conjunction withthe LDAP BaseDN to create a
|
263 |
263 |
* distinguished name (dn) for the record
|
264 |
264 |
*
|
265 |
265 |
* @param user the user for which the identifying name is requested
|
266 |
|
* @returns String the identifying name for the user,
|
|
266 |
* @returns String the identifying name for the user,
|
267 |
267 |
* or null if not found
|
268 |
268 |
*/
|
269 |
269 |
private String getIdentifyingName(String user, String ldapUrl,
|
... | ... | |
279 |
279 |
env.put(Context.PROVIDER_URL, ldapUrl + ldapBase);
|
280 |
280 |
// non-secure LDAP context; dn are publicly readable
|
281 |
281 |
try {
|
282 |
|
|
|
282 |
|
283 |
283 |
// Bind to the LDAP server, in order to search for the right
|
284 |
284 |
// distinguished name (dn) based on userid (uid) or common name (cn)
|
285 |
285 |
DirContext ctx = new InitialDirContext(env);
|
286 |
286 |
SearchControls ctls = new SearchControls();
|
287 |
287 |
ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);
|
288 |
|
// Search for the user id or name using the uid, then cn and sn
|
|
288 |
// Search for the user id or name using the uid, then cn and sn
|
289 |
289 |
//attributes
|
290 |
290 |
// If we find a record, determine the dn for the record
|
291 |
291 |
// The following blocks need to be refactored into a subroutine
|
... | ... | |
296 |
296 |
int position = user.indexOf(",");
|
297 |
297 |
String comp1 = user.substring(0, position);
|
298 |
298 |
MetaCatUtil.debugMessage("First comp is: " + comp1, 35);
|
299 |
|
String comp2 = user.substring(position+1,
|
|
299 |
String comp2 = user.substring(position+1,
|
300 |
300 |
user.indexOf(",", position+1));
|
301 |
301 |
MetaCatUtil.debugMessage("Second comp is: " + comp2, 35);
|
302 |
302 |
|
... | ... | |
331 |
331 |
if (answer.hasMore()) {
|
332 |
332 |
SearchResult sr = (SearchResult)answer.next();
|
333 |
333 |
identifier = sr.getName();
|
334 |
|
if ( !sr.isRelative() ) {
|
|
334 |
if ( !sr.isRelative() ) {
|
335 |
335 |
this.ldapUrl = identifier.substring(0,
|
336 |
336 |
identifier.lastIndexOf("/")+1);
|
337 |
337 |
this.ldapBase = identifier.substring(identifier.indexOf(",")+1);
|
... | ... | |
350 |
350 |
if (answer.hasMore()) {
|
351 |
351 |
SearchResult sr = (SearchResult)answer.next();
|
352 |
352 |
identifier = sr.getName();
|
353 |
|
if ( !sr.isRelative() ) {
|
|
353 |
if ( !sr.isRelative() ) {
|
354 |
354 |
this.ldapUrl = identifier.substring(0,identifier.lastIndexOf("/")+1);
|
355 |
355 |
this.ldapBase = identifier.substring(identifier.indexOf(",")+1);
|
356 |
356 |
identifier = identifier.substring(identifier.lastIndexOf("/")+1,
|
... | ... | |
366 |
366 |
if (answer2.hasMore()) {
|
367 |
367 |
SearchResult sr = (SearchResult)answer2.next();
|
368 |
368 |
identifier = sr.getName();
|
369 |
|
if ( !sr.isRelative() ) {
|
|
369 |
if ( !sr.isRelative() ) {
|
370 |
370 |
this.ldapUrl = identifier.substring(0,
|
371 |
371 |
identifier.lastIndexOf("/")+1);
|
372 |
372 |
this.ldapBase = identifier.substring(identifier.indexOf(",")+1);
|
... | ... | |
383 |
383 |
if (answer3.hasMore()) {
|
384 |
384 |
SearchResult sr = (SearchResult)answer3.next();
|
385 |
385 |
identifier = sr.getName();
|
386 |
|
if ( !sr.isRelative() ) {
|
|
386 |
if ( !sr.isRelative() ) {
|
387 |
387 |
this.ldapUrl = identifier.substring(0,
|
388 |
388 |
identifier.lastIndexOf("/")+1);
|
389 |
389 |
this.ldapBase = identifier.substring(identifier.indexOf(",")+1);
|
... | ... | |
412 |
412 |
* @param password the password for authenticating against the service
|
413 |
413 |
* @returns string array of all of the user names
|
414 |
414 |
*/
|
415 |
|
public String[] getUsers(String user, String password)
|
|
415 |
public String[][] getUsers(String user, String password)
|
416 |
416 |
throws ConnectException
|
417 |
417 |
{
|
418 |
|
String[] users = null;
|
|
418 |
String[][] users = null;
|
419 |
419 |
|
420 |
420 |
// Identify service provider to use
|
421 |
421 |
Hashtable env = new Hashtable(11);
|
422 |
|
env.put(Context.INITIAL_CONTEXT_FACTORY,
|
|
422 |
env.put(Context.INITIAL_CONTEXT_FACTORY,
|
423 |
423 |
"com.sun.jndi.ldap.LdapCtxFactory");
|
424 |
424 |
env.put(Context.REFERRAL, referral);
|
425 |
425 |
env.put(Context.PROVIDER_URL, ldapUrl);
|
426 |
|
|
|
426 |
|
427 |
427 |
try {
|
428 |
428 |
|
429 |
429 |
// Create the initial directory context
|
... | ... | |
432 |
432 |
// Specify the attributes to match.
|
433 |
433 |
// Users are objects that have the attribute objectclass=InetOrgPerson.
|
434 |
434 |
SearchControls ctls = new SearchControls();
|
435 |
|
String[] attrIDs = {"dn"};
|
|
435 |
String[] attrIDs = {"dn", "cn", "mail"};
|
436 |
436 |
ctls.setReturningAttributes(attrIDs);
|
437 |
437 |
ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);
|
438 |
438 |
//ctls.setCountLimit(1000);
|
439 |
439 |
String filter = "(objectClass=inetOrgPerson)";
|
440 |
440 |
NamingEnumeration enum = ctx.search(ldapBase, filter, ctls);
|
441 |
|
|
|
441 |
|
442 |
442 |
// Store the users in a vector
|
443 |
443 |
Vector uvec = new Vector();
|
|
444 |
Vector uname = new Vector();
|
|
445 |
Vector umail = new Vector();
|
|
446 |
Attributes tempAttr = null;
|
444 |
447 |
try {
|
445 |
448 |
while (enum.hasMore()) {
|
446 |
449 |
SearchResult sr = (SearchResult)enum.next();
|
|
450 |
tempAttr = sr.getAttributes();
|
|
451 |
|
|
452 |
if((tempAttr.get("cn")+"").startsWith("cn: ")){
|
|
453 |
uname.add( (tempAttr.get("cn") + "").substring(4));
|
|
454 |
} else {
|
|
455 |
uname.add( tempAttr.get("cn") + "");
|
|
456 |
}
|
|
457 |
|
|
458 |
if((tempAttr.get("mail")+"").startsWith("mail: ")){
|
|
459 |
umail.add((tempAttr.get("mail") + "").substring(6));
|
|
460 |
} else {
|
|
461 |
umail.add(tempAttr.get("mail") + "");
|
|
462 |
}
|
|
463 |
|
447 |
464 |
uvec.add(sr.getName()+","+ldapBase);
|
448 |
465 |
}
|
449 |
466 |
} catch (SizeLimitExceededException slee) {
|
... | ... | |
452 |
469 |
}
|
453 |
470 |
|
454 |
471 |
// initialize users[]; fill users[]
|
455 |
|
users = new String[uvec.size()];
|
|
472 |
users = new String[uvec.size()][3];
|
456 |
473 |
for (int i=0; i < uvec.size(); i++) {
|
457 |
|
users[i] = (String)uvec.elementAt(i);
|
|
474 |
users[i][0] = (String)uvec.elementAt(i);
|
|
475 |
users[i][1] = (String)uname.elementAt(i);
|
|
476 |
users[i][2] = (String)umail.elementAt(i);
|
458 |
477 |
}
|
459 |
478 |
|
460 |
479 |
// Close the context when we're done
|
... | ... | |
478 |
497 |
* @param group the group whose user list should be returned
|
479 |
498 |
* @returns string array of the user names belonging to the group
|
480 |
499 |
*/
|
481 |
|
public String[] getUsers(String user, String password, String group)
|
|
500 |
public String[] getUsers(String user, String password, String group)
|
482 |
501 |
throws ConnectException
|
483 |
502 |
{
|
484 |
503 |
String[] users = null;
|
485 |
504 |
|
486 |
505 |
// Identify service provider to use
|
487 |
506 |
Hashtable env = new Hashtable(11);
|
488 |
|
env.put(Context.INITIAL_CONTEXT_FACTORY,
|
|
507 |
env.put(Context.INITIAL_CONTEXT_FACTORY,
|
489 |
508 |
"com.sun.jndi.ldap.LdapCtxFactory");
|
490 |
509 |
env.put(Context.REFERRAL, referral);
|
491 |
510 |
env.put(Context.PROVIDER_URL, ldapUrl);
|
... | ... | |
504 |
523 |
try {
|
505 |
524 |
for (NamingEnumeration ae = answer.getAll(); ae.hasMore();) {
|
506 |
525 |
Attribute attr = (Attribute)ae.next();
|
507 |
|
for (NamingEnumeration e = attr.getAll();
|
|
526 |
for (NamingEnumeration e = attr.getAll();
|
508 |
527 |
e.hasMore();
|
509 |
|
uvec.add(e.next())
|
|
528 |
uvec.add(e.next())
|
510 |
529 |
);
|
511 |
530 |
}
|
512 |
531 |
} catch (SizeLimitExceededException slee) {
|
... | ... | |
517 |
536 |
// initialize users[]; fill users[]
|
518 |
537 |
users = new String[uvec.size()];
|
519 |
538 |
for (int i=0; i < uvec.size(); i++) {
|
520 |
|
users[i] = (String)uvec.elementAt(i);
|
|
539 |
users[i] = (String)uvec.elementAt(i);
|
521 |
540 |
}
|
522 |
541 |
|
523 |
542 |
// Close the context when we're done
|
... | ... | |
540 |
559 |
* @param password the password for authenticating against the service
|
541 |
560 |
* @returns string array of the group names
|
542 |
561 |
*/
|
543 |
|
public String[] getGroups(String user, String password)
|
|
562 |
public String[][] getGroups(String user, String password)
|
544 |
563 |
throws ConnectException
|
545 |
564 |
{
|
546 |
565 |
return getGroups(user, password, null);
|
... | ... | |
554 |
573 |
* @param foruser the user whose group list should be returned
|
555 |
574 |
* @returns string array of the group names
|
556 |
575 |
*/
|
557 |
|
public String[] getGroups(String user, String password, String foruser)
|
|
576 |
public String[][] getGroups(String user, String password, String foruser)
|
558 |
577 |
throws ConnectException
|
559 |
578 |
{
|
560 |
579 |
Vector uvec = new Vector();
|
|
580 |
Vector desc = new Vector();
|
|
581 |
Attributes tempAttr = null;
|
|
582 |
|
561 |
583 |
//Pass the username and password to run() method
|
562 |
584 |
userName=user;
|
563 |
585 |
userPassword=password;
|
564 |
586 |
// Identify service provider to use
|
565 |
|
env.put(Context.INITIAL_CONTEXT_FACTORY,
|
|
587 |
env.put(Context.INITIAL_CONTEXT_FACTORY,
|
566 |
588 |
"com.sun.jndi.ldap.LdapCtxFactory");
|
567 |
589 |
env.put(Context.REFERRAL, "throw");
|
568 |
590 |
env.put(Context.PROVIDER_URL, ldapUrl);
|
... | ... | |
570 |
592 |
// Create the initial directory context
|
571 |
593 |
DirContext ctx = new InitialDirContext(env);
|
572 |
594 |
// Specify the ids of the attributes to return
|
573 |
|
String[] attrIDs = {"cn"};
|
|
595 |
String[] attrIDs = {"cn", "description"};
|
574 |
596 |
// Specify the attributes to match.
|
575 |
597 |
// Groups are objects with attribute objectclass=groupofuniquenames.
|
576 |
598 |
// and have attribute uniquemember: uid=foruser,ldapbase.
|
577 |
599 |
SearchControls ctls = new SearchControls();
|
578 |
600 |
ctls.setReturningAttributes(attrIDs);
|
579 |
601 |
ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);
|
580 |
|
|
|
602 |
|
581 |
603 |
String filter = null;
|
582 |
604 |
String gfilter = "(objectClass=groupOfUniqueNames)";
|
583 |
605 |
if (null == foruser) {
|
... | ... | |
591 |
613 |
// Print the groups
|
592 |
614 |
MetaCatUtil.debugMessage("getting group results.", 50);
|
593 |
615 |
while (enum.hasMore()) {
|
594 |
|
SearchResult sr = (SearchResult)enum.next();
|
|
616 |
SearchResult sr = (SearchResult)enum.next();
|
|
617 |
tempAttr = sr.getAttributes();
|
|
618 |
|
|
619 |
if((tempAttr.get("description")+"").startsWith("description: ")){
|
|
620 |
desc.add( (tempAttr.get("description") + "").substring(13));
|
|
621 |
} else {
|
|
622 |
desc.add( tempAttr.get("description") + "");
|
|
623 |
}
|
|
624 |
|
595 |
625 |
uvec.add(sr.getName()+","+ldapBase);
|
596 |
|
MetaCatUtil.debugMessage("group " + sr.getName() +
|
|
626 |
MetaCatUtil.debugMessage("group " + sr.getName() +
|
597 |
627 |
" added to Group vector", 35);
|
598 |
628 |
}
|
599 |
629 |
// Close the context when we're done
|
600 |
630 |
ctx.close();
|
601 |
631 |
|
602 |
|
}
|
603 |
|
catch (ReferralException re)
|
|
632 |
}
|
|
633 |
catch (ReferralException re)
|
604 |
634 |
{
|
605 |
635 |
refExc = re;
|
606 |
636 |
Thread t = new Thread(new GetGroup());
|
... | ... | |
621 |
651 |
if (referralContext == null)
|
622 |
652 |
{
|
623 |
653 |
util.debugMessage("thread timed out...returning groups: " + uvec.toString(), 35);
|
624 |
|
String groups[] = new String[uvec.size()];
|
|
654 |
String groups[][] = new String[uvec.size()][2];
|
625 |
655 |
for(int i=0; i<uvec.size(); i++)
|
626 |
656 |
{
|
627 |
|
groups[i] = (String)uvec.elementAt(i);
|
|
657 |
groups[i][0] = (String)uvec.elementAt(i);
|
|
658 |
groups[i][1] = (String)desc.elementAt(i);
|
628 |
659 |
}
|
629 |
660 |
t.interrupt();
|
630 |
661 |
return groups;
|
631 |
662 |
}
|
632 |
663 |
DirContext dc = (DirContext)referralContext;
|
633 |
|
String[] attrIDs = {"cn"};
|
|
664 |
String[] attrIDs = {"cn", "description"};
|
634 |
665 |
// Specify the attributes to match.
|
635 |
666 |
// Groups are objects with attribute objectclass=groupofuniquenames.
|
636 |
667 |
// and have attribute uniquemember: uid=foruser,ldapbase.
|
637 |
668 |
SearchControls ctls = new SearchControls();
|
638 |
669 |
ctls.setReturningAttributes(attrIDs);
|
639 |
670 |
ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);
|
640 |
|
|
|
671 |
|
641 |
672 |
String filter = null;
|
642 |
673 |
String gfilter = "(objectClass=groupOfUniqueNames)";
|
643 |
674 |
if (null == foruser) {
|
... | ... | |
645 |
676 |
} else {
|
646 |
677 |
filter = "(& " + gfilter + "(uniqueMember=" + foruser + "))";
|
647 |
678 |
}
|
648 |
|
|
|
679 |
|
649 |
680 |
try
|
650 |
681 |
{
|
651 |
682 |
NamingEnumeration enum = dc.search(ldapBase, filter, ctls);
|
652 |
683 |
// Print the groups
|
653 |
684 |
while (enum.hasMore()) {
|
654 |
685 |
SearchResult sr = (SearchResult)enum.next();
|
|
686 |
tempAttr = sr.getAttributes();
|
|
687 |
|
|
688 |
if((tempAttr.get("description")+"").startsWith("description: ")){
|
|
689 |
desc.add( (tempAttr.get("description") + "").substring(13));
|
|
690 |
} else {
|
|
691 |
desc.add( tempAttr.get("description") + "");
|
|
692 |
}
|
|
693 |
|
655 |
694 |
uvec.add(sr.getName()+","+ldapBase);
|
656 |
695 |
}
|
657 |
|
|
|
696 |
|
658 |
697 |
referralContext.close();
|
659 |
698 |
dc.close();
|
660 |
699 |
}
|
661 |
700 |
catch(NamingException ne)
|
662 |
701 |
{
|
663 |
|
MetaCatUtil.debugMessage("Naming Exception in AuthLdap.getGroups", 30);
|
|
702 |
MetaCatUtil.debugMessage("Naming Exception in AuthLdap.getGroups" + ne.getExplanation() + ne.getMessage(), 30);
|
664 |
703 |
}
|
665 |
704 |
} catch (NamingException e) {
|
666 |
705 |
e.printStackTrace(System.err);
|
667 |
|
String groups[] = new String[uvec.size()];
|
|
706 |
String groups[][] = new String[uvec.size()][2];
|
668 |
707 |
for(int i=0; i<uvec.size(); i++)
|
669 |
708 |
{
|
670 |
|
groups[i] = (String)uvec.elementAt(i);
|
|
709 |
groups[i][0] = (String)uvec.elementAt(i);
|
|
710 |
groups[i][1] = (String)desc.elementAt(i);
|
671 |
711 |
}
|
672 |
712 |
return groups;
|
673 |
713 |
/*throw new ConnectException(
|
674 |
714 |
"Problem getting groups for a user in AuthLdap.getGroups:" + e);*/
|
675 |
|
}
|
676 |
|
|
677 |
|
MetaCatUtil.debugMessage("The user is in the following groups: " +
|
|
715 |
}
|
|
716 |
|
|
717 |
MetaCatUtil.debugMessage("The user is in the following groups: " +
|
678 |
718 |
uvec.toString(), 35);
|
679 |
|
String groups[] = new String[uvec.size()];
|
|
719 |
String groups[][] = new String[uvec.size()][2];
|
680 |
720 |
for(int i=0; i<uvec.size(); i++)
|
681 |
721 |
{
|
682 |
|
groups[i] = (String)uvec.elementAt(i);
|
|
722 |
groups[i][0] = (String)uvec.elementAt(i);
|
|
723 |
groups[i][1] = (String)desc.elementAt(i);
|
683 |
724 |
}
|
684 |
725 |
return groups;
|
685 |
726 |
}
|
... | ... | |
690 |
731 |
* @param foruser the user for which the attribute list is requested
|
691 |
732 |
* @returns HashMap a map of attribute name to a Vector of values
|
692 |
733 |
*/
|
693 |
|
public HashMap getAttributes(String foruser)
|
|
734 |
public HashMap getAttributes(String foruser)
|
694 |
735 |
throws ConnectException
|
695 |
736 |
{
|
696 |
737 |
return getAttributes(null, null, foruser);
|
... | ... | |
704 |
745 |
* @param foruser the user whose attributes should be returned
|
705 |
746 |
* @returns HashMap a map of attribute name to a Vector of values
|
706 |
747 |
*/
|
707 |
|
public HashMap getAttributes(String user, String password, String foruser)
|
|
748 |
public HashMap getAttributes(String user, String password, String foruser)
|
708 |
749 |
throws ConnectException
|
709 |
750 |
{
|
710 |
751 |
HashMap attributes = new HashMap();
|
711 |
752 |
String ldapUrl = this.ldapUrl;
|
712 |
753 |
String ldapBase = this.ldapBase;
|
713 |
754 |
String userident = foruser;
|
714 |
|
|
|
755 |
|
715 |
756 |
// Identify service provider to use
|
716 |
757 |
Hashtable env = new Hashtable(11);
|
717 |
|
env.put(Context.INITIAL_CONTEXT_FACTORY,
|
|
758 |
env.put(Context.INITIAL_CONTEXT_FACTORY,
|
718 |
759 |
"com.sun.jndi.ldap.LdapCtxFactory");
|
719 |
760 |
env.put(Context.REFERRAL, referral);
|
720 |
761 |
env.put(Context.PROVIDER_URL, ldapUrl);
|
721 |
762 |
|
722 |
763 |
try {
|
723 |
|
|
|
764 |
|
724 |
765 |
// Create the initial directory context
|
725 |
766 |
DirContext ctx = new InitialDirContext(env);
|
726 |
|
|
727 |
|
// Ask for all attributes of the user
|
|
767 |
|
|
768 |
// Ask for all attributes of the user
|
728 |
769 |
//Attributes attrs = ctx.getAttributes(userident);
|
729 |
770 |
Attributes attrs = ctx.getAttributes(foruser);
|
730 |
|
|
|
771 |
|
731 |
772 |
// Print all of the attributes
|
732 |
773 |
NamingEnumeration en = attrs.getAll();
|
733 |
774 |
while (en.hasMore()) {
|
... | ... | |
741 |
782 |
}
|
742 |
783 |
attributes.put(attName, values);
|
743 |
784 |
}
|
744 |
|
|
|
785 |
|
745 |
786 |
// Close the context when we're done
|
746 |
787 |
ctx.close();
|
747 |
788 |
} catch (NamingException e) {
|
748 |
|
util.debugMessage("Problem getting attributes in " +
|
|
789 |
util.debugMessage("Problem getting attributes in " +
|
749 |
790 |
"AuthLdap.getAttributes:" + e, 35);
|
750 |
791 |
throw new ConnectException(
|
751 |
792 |
"Problem getting attributes in AuthLdap.getAttributes:" + e);
|
... | ... | |
756 |
797 |
|
757 |
798 |
/**
|
758 |
799 |
* Get list of all subtrees holding Metacat's groups and users
|
759 |
|
* starting from the Metacat LDAP root,
|
|
800 |
* starting from the Metacat LDAP root,
|
760 |
801 |
* i.e. ldap://dev.nceas.ucsb.edu/dc=ecoinformatics,dc=org
|
761 |
802 |
*/
|
762 |
803 |
private Hashtable getSubtrees(String user, String password,
|
... | ... | |
767 |
808 |
|
768 |
809 |
// Identify service provider to use
|
769 |
810 |
Hashtable env = new Hashtable(11);
|
770 |
|
env.put(Context.INITIAL_CONTEXT_FACTORY,
|
|
811 |
env.put(Context.INITIAL_CONTEXT_FACTORY,
|
771 |
812 |
"com.sun.jndi.ldap.LdapCtxFactory");
|
772 |
813 |
env.put(Context.REFERRAL, referral);
|
773 |
814 |
env.put(Context.PROVIDER_URL, ldapUrl + ldapBase);
|
... | ... | |
782 |
823 |
SearchControls ctls = new SearchControls();
|
783 |
824 |
ctls.setReturningAttributes(attrIDs);
|
784 |
825 |
ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);
|
785 |
|
|
|
826 |
|
786 |
827 |
// Specify the attributes to match.
|
787 |
828 |
// Subtrees from the main server are found as objects with attribute
|
788 |
829 |
// objectclass=organization or objectclass=referral to the subtree
|
... | ... | |
801 |
842 |
Attribute attr = (Attribute)enum1.next();
|
802 |
843 |
String attrValue = (String)attr.get();
|
803 |
844 |
String attrName = (String)attr.getID();
|
804 |
|
|
|
845 |
|
805 |
846 |
if ( enum1.hasMore() ) {
|
806 |
847 |
attr = (Attribute)enum1.next();
|
807 |
848 |
String refValue = (String)attr.get();
|
... | ... | |
813 |
854 |
trees.put(refName + "=" + refValue + "," + ldapBase,
|
814 |
855 |
attrValue.substring(0,attrValue.lastIndexOf("/")+1) );
|
815 |
856 |
}
|
816 |
|
|
|
857 |
|
817 |
858 |
} else if ( ldapBase.startsWith(attrName + "=" + attrValue) ) {
|
818 |
859 |
trees.put(ldapBase, ldapUrl);
|
819 |
|
} else {
|
820 |
|
trees.put(attrName + "=" + attrValue + "," + ldapBase, ldapUrl);
|
|
860 |
} else {
|
|
861 |
trees.put(attrName + "=" + attrValue + "," + ldapBase, ldapUrl);
|
821 |
862 |
}
|
822 |
863 |
}
|
823 |
864 |
}
|
... | ... | |
826 |
867 |
ctx.close();
|
827 |
868 |
|
828 |
869 |
} catch (NamingException e) {
|
829 |
|
util.debugMessage("Problem getting subtrees in AuthLdap.getSubtrees:"
|
|
870 |
util.debugMessage("Problem getting subtrees in AuthLdap.getSubtrees:"
|
830 |
871 |
+ e, 30);
|
831 |
872 |
throw new ConnectException(
|
832 |
873 |
"Problem getting subtrees in AuthLdap.getSubtrees:" + e);
|
... | ... | |
846 |
887 |
{
|
847 |
888 |
StringBuffer out = new StringBuffer();
|
848 |
889 |
Vector usersIn = new Vector();
|
849 |
|
|
850 |
|
out.append("<?xml version=\"1.0\"?>\n");
|
|
890 |
|
|
891 |
out.append("<?xml version=\"1.0\" encoding=\"US-ASCII\"?>\n");
|
851 |
892 |
out.append("<principals>\n");
|
852 |
|
|
|
893 |
|
853 |
894 |
/*
|
854 |
|
* get all subtrees first in the current dir context
|
|
895 |
* get all subtrees first in the current dir context
|
855 |
896 |
* and then the Metacat users under them
|
856 |
897 |
*/
|
857 |
898 |
Hashtable subtrees = getSubtrees(user,password,this.ldapUrl,this.ldapBase);
|
858 |
|
|
|
899 |
|
859 |
900 |
Enumeration enum = subtrees.keys();
|
860 |
901 |
while ( enum.hasMoreElements() ) {
|
861 |
902 |
this.ldapBase = (String)enum.nextElement();
|
862 |
903 |
this.ldapUrl = (String)subtrees.get(ldapBase);
|
863 |
|
|
864 |
|
out.append(" <authSystem URI=\"" +
|
|
904 |
|
|
905 |
out.append(" <authSystem URI=\"" +
|
865 |
906 |
this.ldapUrl + this.ldapBase + "\">\n");
|
866 |
907 |
|
867 |
908 |
// get all groups for directory context
|
868 |
|
String[] groups = getGroups(user, password);
|
|
909 |
String[][] groups = getGroups(user, password);
|
|
910 |
String[][] users = getUsers(user, password);
|
|
911 |
int userIndex = 0;
|
869 |
912 |
|
870 |
913 |
// for the groups and users that belong to them
|
871 |
914 |
if ( groups!=null && groups.length > 0 ) {
|
872 |
915 |
for (int i=0; i < groups.length; i++ ) {
|
873 |
916 |
out.append(" <group>\n");
|
874 |
|
out.append(" <groupname>" + groups[i] + "</groupname>\n");
|
875 |
|
String[] usersForGroup = getUsers(user,password,groups[i]);
|
|
917 |
out.append(" <groupname>" + groups[i][0] + "</groupname>\n");
|
|
918 |
out.append(" <description>" + groups[i][1] + "</description>\n");
|
|
919 |
String[] usersForGroup = getUsers(user,password,groups[i][0]);
|
876 |
920 |
for (int j=0; j < usersForGroup.length; j++ ) {
|
877 |
921 |
usersIn.addElement(usersForGroup[j]);
|
|
922 |
|
|
923 |
userIndex = searchUser(usersForGroup[j], users);
|
878 |
924 |
out.append(" <user>\n");
|
879 |
|
out.append(" <username>" + usersForGroup[j] +
|
880 |
|
"</username>\n");
|
|
925 |
|
|
926 |
if(userIndex < 0){
|
|
927 |
out.append(" <userdn>" + usersForGroup[j] +
|
|
928 |
"</userdn>\n");
|
|
929 |
} else {
|
|
930 |
out.append(" <username>" + users[userIndex][0] + "</username>\n");
|
|
931 |
out.append(" <name>" + users[userIndex][1] + "</name>\n");
|
|
932 |
out.append(" <email>" + users[userIndex][2] + "</email>\n");
|
|
933 |
}
|
|
934 |
|
881 |
935 |
out.append(" </user>\n");
|
882 |
936 |
}
|
883 |
937 |
out.append(" </group>\n");
|
884 |
938 |
}
|
885 |
939 |
}
|
|
940 |
|
886 |
941 |
// for the users not belonging to any group
|
887 |
|
String[] users = getUsers(user, password);
|
888 |
942 |
for (int j=0; j < users.length; j++ ) {
|
889 |
|
if ( !usersIn.contains(users[j]) ) {
|
|
943 |
if ( !usersIn.contains(users[j][0]) ) {
|
890 |
944 |
out.append(" <user>\n");
|
891 |
|
out.append(" <username>" + users[j] + "</username>\n");
|
|
945 |
out.append(" <username>" + users[j][0] + "</username>\n");
|
|
946 |
out.append(" <name>" + users[j][1] + "</name>\n");
|
|
947 |
out.append(" <email>" + users[j][2] + "</email>\n");
|
892 |
948 |
out.append(" </user>\n");
|
893 |
949 |
}
|
894 |
950 |
}
|
895 |
|
|
|
951 |
|
896 |
952 |
out.append(" </authSystem>\n");
|
897 |
953 |
if ( !usersIn.isEmpty() ) {
|
898 |
954 |
usersIn.removeAllElements();
|
899 |
955 |
usersIn.trimToSize();
|
900 |
956 |
}
|
901 |
|
|
|
957 |
|
902 |
958 |
}
|
903 |
959 |
out.append("</principals>");
|
904 |
960 |
return out.toString();
|
905 |
961 |
}
|
906 |
962 |
|
|
963 |
|
907 |
964 |
/**
|
|
965 |
* Method for getting index of user DN in User info array
|
|
966 |
*/
|
|
967 |
int searchUser(String user, String userGroup[][]){
|
|
968 |
for (int j=0; j < userGroup.length; j++ ) {
|
|
969 |
if (user.compareTo(userGroup[j][0]) == 0){
|
|
970 |
return j;
|
|
971 |
}
|
|
972 |
}
|
|
973 |
return -1;
|
|
974 |
}
|
|
975 |
|
|
976 |
/**
|
908 |
977 |
* Test method for the class
|
909 |
978 |
*/
|
910 |
979 |
public static void main(String[] args) {
|
... | ... | |
916 |
985 |
MetaCatUtil.debugMessage("Creating session...", 20);
|
917 |
986 |
AuthLdap authservice = new AuthLdap();
|
918 |
987 |
MetaCatUtil.debugMessage("Session exists...", 20);
|
919 |
|
|
|
988 |
|
920 |
989 |
boolean isValid = false;
|
921 |
990 |
try {
|
922 |
991 |
MetaCatUtil.debugMessage("Authenticating...", 20);
|
... | ... | |
947 |
1016 |
// get the groups
|
948 |
1017 |
if (isValid) {
|
949 |
1018 |
MetaCatUtil.debugMessage("\nGetting all groups....", 20);
|
950 |
|
String[] groups = authservice.getGroups(user, password);
|
|
1019 |
String[][] groups = authservice.getGroups(user, password);
|
951 |
1020 |
MetaCatUtil.debugMessage("Groups found: " + groups.length, 20);
|
952 |
1021 |
for (int i=0; i < groups.length; i++) {
|
953 |
|
MetaCatUtil.debugMessage("Group " + i + ": " + groups[i], 20);
|
|
1022 |
MetaCatUtil.debugMessage("Group " + i + ": " + groups[i][0], 20);
|
954 |
1023 |
}
|
955 |
1024 |
}
|
956 |
1025 |
|
... | ... | |
958 |
1027 |
String savedGroup = null;
|
959 |
1028 |
if (isValid) {
|
960 |
1029 |
MetaCatUtil.debugMessage("\nGetting groups for user....", 20);
|
961 |
|
String[] groups = authservice.getGroups(user, password, user);
|
|
1030 |
String[][] groups = authservice.getGroups(user, password, user);
|
962 |
1031 |
MetaCatUtil.debugMessage("Groups found: " + groups.length, 20);
|
963 |
1032 |
for (int i=0; i < groups.length; i++) {
|
964 |
|
MetaCatUtil.debugMessage("Group " + i + ": " + groups[i], 20);
|
965 |
|
savedGroup = groups[i];
|
|
1033 |
MetaCatUtil.debugMessage("Group " + i + ": " + groups[i][0], 20);
|
|
1034 |
savedGroup = groups[i][0];
|
966 |
1035 |
}
|
967 |
1036 |
}
|
968 |
1037 |
|
... | ... | |
980 |
1049 |
// get all users
|
981 |
1050 |
if (isValid) {
|
982 |
1051 |
MetaCatUtil.debugMessage("\nGetting all users ....", 20);
|
983 |
|
String[] users = authservice.getUsers(user, password);
|
|
1052 |
String[][] users = authservice.getUsers(user, password);
|
984 |
1053 |
MetaCatUtil.debugMessage("Users found: " + users.length, 20);
|
985 |
|
|
|
1054 |
|
986 |
1055 |
}
|
987 |
1056 |
|
988 |
1057 |
// get the whole list groups and users in XML format
|
... | ... | |
1006 |
1075 |
MetaCatUtil.debugMessage("I/O Error writing to file principals.txt", 20);
|
1007 |
1076 |
}
|
1008 |
1077 |
}
|
1009 |
|
|
|
1078 |
|
1010 |
1079 |
/**
|
1011 |
1080 |
* This method will be called by start a thread.
|
1012 |
1081 |
* It can handle if a referral exception happend.
|
1013 |
|
*/
|
|
1082 |
*/
|
1014 |
1083 |
public void run()
|
1015 |
1084 |
{
|
1016 |
1085 |
referralContext = null;
|
... | ... | |
1022 |
1091 |
while (moreReferrals)
|
1023 |
1092 |
{
|
1024 |
1093 |
try
|
1025 |
|
{
|
|
1094 |
{
|
1026 |
1095 |
//revise environment variable
|
1027 |
1096 |
referralInfo=(String)refExc.getReferralInfo();
|
1028 |
1097 |
util.debugMessage("Processing referral (pr0): ", 35);
|
... | ... | |
1059 |
1128 |
//catch a authentication exception
|
1060 |
1129 |
catch (AuthenticationException ae)
|
1061 |
1130 |
{
|
1062 |
|
util.debugMessage("Error running referral handler thread (ae1): " +
|
|
1131 |
util.debugMessage("Error running referral handler thread (ae1): " +
|
1063 |
1132 |
ae.getMessage(), 20);
|
1064 |
1133 |
//check if has another referral
|
1065 |
1134 |
moreReferrals=refExc.skipReferral();
|
... | ... | |
1069 |
1138 |
//catch a naming exception
|
1070 |
1139 |
catch (NamingException ne)
|
1071 |
1140 |
{
|
1072 |
|
util.debugMessage("Error running referral handler thread (ne1): " +
|
|
1141 |
util.debugMessage("Error running referral handler thread (ne1): " +
|
1073 |
1142 |
ne.getMessage(), 20);
|
1074 |
1143 |
//check if has another referral
|
1075 |
1144 |
moreReferrals=refExc.skipReferral();
|
1076 |
1145 |
//don't get context
|
1077 |
|
referralContext = null;
|
|
1146 |
referralContext = null;
|
1078 |
1147 |
}
|
1079 |
1148 |
}//while
|
1080 |
1149 |
}//run()
|
1081 |
|
|
|
1150 |
|
1082 |
1151 |
private class GetGroup implements Runnable
|
1083 |
1152 |
{
|
1084 |
1153 |
public void run()
|
... | ... | |
1087 |
1156 |
MetaCatUtil.debugMessage("getting groups context", 50);
|
1088 |
1157 |
DirContext refDirContext=null;
|
1089 |
1158 |
boolean moreReferrals=true;
|
1090 |
|
//set a while loop is because we don't know if a referral excption
|
|
1159 |
//set a while loop is because we don't know if a referral excption
|
1091 |
1160 |
//contains another referral exception
|
1092 |
1161 |
while (moreReferrals)
|
1093 |
1162 |
{
|
... | ... | |
1098 |
1167 |
refInfo = (String)refExc.getReferralInfo();
|
1099 |
1168 |
if(refInfo != null)
|
1100 |
1169 |
{
|
1101 |
|
MetaCatUtil.debugMessage("Referral in thread to: " +
|
|
1170 |
MetaCatUtil.debugMessage("Referral in thread to: " +
|
1102 |
1171 |
refInfo.toString(), 40);
|
1103 |
1172 |
}
|
1104 |
1173 |
else
|
... | ... | |
1108 |
1177 |
get(Context.PROVIDER_URL);
|
1109 |
1178 |
}
|
1110 |
1179 |
MetaCatUtil.debugMessage("refInfo: " + refInfo, 40);
|
1111 |
|
|
1112 |
|
env.put(Context.INITIAL_CONTEXT_FACTORY,
|
|
1180 |
|
|
1181 |
env.put(Context.INITIAL_CONTEXT_FACTORY,
|
1113 |
1182 |
"com.sun.jndi.ldap.LdapCtxFactory");
|
1114 |
1183 |
env.put(Context.REFERRAL, "throw");
|
1115 |
1184 |
env.put(Context.PROVIDER_URL, refInfo);
|
1116 |
|
|
|
1185 |
|
1117 |
1186 |
MetaCatUtil.debugMessage("creating referralContext", 40);
|
1118 |
1187 |
referralContext = new InitialDirContext(env);
|
1119 |
1188 |
MetaCatUtil.debugMessage("referralContext created", 40);
|
... | ... | |
1129 |
1198 |
}
|
1130 |
1199 |
catch (AuthenticationException ae)
|
1131 |
1200 |
{
|
1132 |
|
util.debugMessage("Error running referral handler thread (ae2): " +
|
|
1201 |
util.debugMessage("Error running referral handler thread (ae2): " +
|
1133 |
1202 |
ae.getMessage(), 50);
|
1134 |
1203 |
//check if has another referral
|
1135 |
1204 |
moreReferrals=refExc.skipReferral();
|
... | ... | |
1138 |
1207 |
}
|
1139 |
1208 |
catch (NamingException ne)
|
1140 |
1209 |
{
|
1141 |
|
util.debugMessage("Error running referral handler thread (ne2): " +
|
|
1210 |
util.debugMessage("Error running referral handler thread (ne2): " +
|
1142 |
1211 |
ne.getMessage(), 50);
|
1143 |
1212 |
//check if has another referral
|
1144 |
1213 |
moreReferrals=refExc.skipReferral();
|
1145 |
1214 |
//don't get context
|
1146 |
|
referralContext = null;
|
|
1215 |
referralContext = null;
|
1147 |
1216 |
}
|
1148 |
1217 |
}//while
|
1149 |
1218 |
}//run()
|
Made changes in these three files so that getPrincipal returns back more details about users and groups. Users now contain userDN, user Name and user Email. Groups now contain Group name and Group description. So some function calls which returned single string array earlier now returns multiple string arrays. AuthSession.java called one of these functions - so accordingly changes were made to fix that part of the code.