View Javadoc

1   package com.atlassian.user.impl.ldap.adaptor;
2   
3   import com.atlassian.user.EntityException;
4   import com.atlassian.user.Group;
5   import com.atlassian.user.User;
6   import com.atlassian.user.impl.RepositoryException;
7   import com.atlassian.user.impl.ldap.LDAPEntity;
8   import com.atlassian.user.impl.ldap.LDAPGroupFactory;
9   import com.atlassian.user.impl.ldap.properties.LdapSearchProperties;
10  import com.atlassian.user.impl.ldap.properties.LdapMembershipProperties;
11  import com.atlassian.user.impl.ldap.repository.LdapContextFactory;
12  import com.atlassian.user.impl.ldap.search.DefaultLDAPUserAdaptor;
13  import com.atlassian.user.impl.ldap.search.LDAPPagerInfo;
14  import com.atlassian.user.impl.ldap.search.LDAPUserAdaptor;
15  import com.atlassian.user.impl.ldap.search.LdapFilterFactory;
16  import com.atlassian.user.impl.ldap.search.page.LDAPEntityPager;
17  import com.atlassian.user.impl.ldap.search.page.LDAPMembershipToUsernamePager;
18  import com.atlassian.user.search.page.DefaultPager;
19  import com.atlassian.user.search.page.Pager;
20  import com.atlassian.user.util.LDAPUtils;
21  import com.atlassian.util.profiling.UtilTimerStack;
22  import net.sf.ldaptemplate.support.filter.EqualsFilter;
23  import net.sf.ldaptemplate.support.filter.Filter;
24  
25  public class LDAPStaticGroupAdaptor extends AbstractLDAPGroupAdaptor
26  {
27      private final LDAPUserAdaptor userAdaptor;
28      private final LdapMembershipProperties membershipProperties;
29  
30      public LDAPStaticGroupAdaptor(LdapContextFactory repository, LdapSearchProperties searchProperties,
31          LDAPGroupFactory groupFactory, LdapFilterFactory filterFactory, LdapMembershipProperties membershipProperties)
32      {
33          super(repository, searchProperties, groupFactory, filterFactory);
34          this.membershipProperties = membershipProperties;
35          userAdaptor = new DefaultLDAPUserAdaptor(repository, searchProperties, filterFactory);
36      }
37  
38      public Pager<Group> getGroups(User user) throws EntityException
39      {
40          LDAPPagerInfo info = getGroupEntriesViaMembership(user);
41  
42          if (info == null)
43              return DefaultPager.emptyPager();
44  
45          return new LDAPEntityPager<Group>(repository, groupFactory, info);
46      }
47  
48      public Pager<String> findMembers(Group group) throws EntityException
49      {
50          LDAPPagerInfo info =
51              getGroupEntries(group.getName(), new String[]{membershipProperties.getMembershipAttribute()}, null);
52  
53          return new LDAPMembershipToUsernamePager(repository, info);
54      }
55  
56      public Pager<String> findMemberNames(Group group) throws EntityException
57      {
58          LDAPPagerInfo info =
59              getGroupEntries(group.getName(), new String[]{membershipProperties.getMembershipAttribute()}, null);
60  
61          return new LDAPMembershipToUsernamePager(repository, info);
62      }
63  
64      public boolean hasStaticGroups()
65      {
66          return true;
67      }
68  
69      public boolean hasMembership(Group group, User user) throws RepositoryException
70      {
71          if (!(user instanceof LDAPEntity))
72              return false;
73  
74          if (UtilTimerStack.isActive())
75              UtilTimerStack.push(this.getClass().getName() + "_hasMembership(" + group + ", " + user + ")");
76  
77          Filter searchFilter = LDAPUtils.makeAndFilter(
78              new EqualsFilter(searchProperties.getGroupnameAttribute(), group.getName()),
79              new EqualsFilter(membershipProperties.getMembershipAttribute(), getNameForMembershipComparison(user)));
80  
81          String[] attributesToReturn = new String[]{searchProperties.getGroupnameAttribute()};
82          LDAPPagerInfo result = search(searchFilter, attributesToReturn);
83  
84          if (UtilTimerStack.isActive())
85              UtilTimerStack.pop(this.getClass().getName() + "_hasMembership(" + group + ", " + user + ")");
86  
87          return result.getNamingEnumeration().hasMoreElements();
88      }
89  
90      private String getNameForMembershipComparison(User user)
91      {
92          return membershipProperties.isMembershipAttributeUnqualified() ? user.getName() :
93              ((LDAPEntity) user).getDistinguishedName();
94      }
95  
96      public LDAPPagerInfo getGroupEntriesViaMembership(User user) throws EntityException
97      {
98          if (!(user instanceof LDAPEntity))
99          {
100             log.info("Membership check for a non " + LDAPEntity.class.getName());
101             return getGroupEntriesViaMembership(user.getName());
102         }
103 
104         if (UtilTimerStack.isActive())
105             UtilTimerStack.push(this.getClass().getName() + "_getLDAPGroupEntriesViaLDAPUser(" + user.getName() + ")");
106 
107         try
108         {
109             String[] attributesToReturn = new String[]{searchProperties.getGroupnameAttribute()};
110             Filter searchTerm =
111                 new EqualsFilter(membershipProperties.getMembershipAttribute(), getNameForMembershipComparison(user));
112             return getGroupEntries(attributesToReturn, searchTerm);
113         }
114         finally
115         {
116             if (UtilTimerStack.isActive())
117                 UtilTimerStack.pop(
118                     this.getClass().getName() + "_getLDAPGroupEntriesViaLDAPUser(" + user.getName() + ")");
119         }
120 
121     }
122 
123     public LDAPPagerInfo getGroupEntriesViaMembership(String username) throws EntityException
124     {
125         return getGroupEntriesViaMembership(username, null);
126     }
127 
128     public LDAPPagerInfo getGroupEntriesViaMembership(String username, String[] attributesToReturn)
129         throws EntityException
130     {
131         if (UtilTimerStack.isActive())
132             UtilTimerStack.push(this.getClass().getName() + "_getLDAPGroupEntriesViaMembership(" + username + ")");
133 
134         try
135         {
136             if (attributesToReturn == null)
137                 attributesToReturn = new String[]{searchProperties.getGroupnameAttribute()};
138 
139             String name = membershipProperties.isMembershipAttributeUnqualified() ?
140                 username : userAdaptor.getUserDN(username);
141             Filter searchTerm = new EqualsFilter(membershipProperties.getMembershipAttribute(), name);
142             return getGroupEntries(attributesToReturn, searchTerm);
143         }
144         catch (RepositoryException e)
145         {
146             throw new RepositoryException(e);
147         }
148         finally
149         {
150             if (UtilTimerStack.isActive())
151                 UtilTimerStack.pop(this.getClass().getName() + "_getLDAPGroupEntriesViaMembership(" + username + ")");
152         }
153 
154     }
155 }