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 }