]> source.dussan.org Git - archiva.git/blob
614ca015859ca43f951dc837f6d209794f9d55eb
[archiva.git] /
1 package org.apache.archiva.redback.common.ldap;
2
3 /*
4  * Licensed to the Apache Software Foundation (ASF) under one
5  * or more contributor license agreements.  See the NOTICE file
6  * distributed with this work for additional information
7  * regarding copyright ownership.  The ASF licenses this file
8  * to you under the Apache License, Version 2.0 (the
9  * "License"); you may not use this file except in compliance
10  * with the License.  You may obtain a copy of the License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing,
15  * software distributed under the License is distributed on an
16  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17  * KIND, either express or implied.  See the License for the
18  * specific language governing permissions and limitations
19  * under the License.
20  */
21
22 import org.apache.archiva.redback.configuration.UserConfiguration;
23 import org.apache.archiva.redback.configuration.UserConfigurationKeys;
24 import org.apache.archiva.redback.users.User;
25 import org.apache.commons.lang.StringUtils;
26 import org.springframework.stereotype.Service;
27
28 import javax.annotation.PostConstruct;
29 import javax.inject.Inject;
30 import javax.inject.Named;
31 import javax.naming.directory.Attributes;
32 import javax.naming.directory.BasicAttributes;
33 import java.util.Date;
34
35 /**
36  * @author <a href="jesse@codehaus.org"> jesse
37  */
38 @Service("userMapper#ldap")
39 public class LdapUserMapper
40     implements UserMapper
41 {
42     /**
43      *
44      */
45     String emailAttribute = "mail";
46
47     /**
48      *
49      */
50     String fullNameAttribute = "givenName";
51
52     /**
53      *
54      */
55     String passwordAttribute = "userPassword";
56
57     /**
58      *
59      */
60     String userIdAttribute = "cn";
61
62     /**
63      *
64      */
65     String userBaseDn;
66
67     /**
68      *
69      */
70     String userObjectClass = "inetOrgPerson";
71
72     /**
73      *
74      */
75     String userFilter;
76
77     /**
78      *
79      */
80     int maxResultCount = 0;
81
82     @Inject
83     @Named(value = "userConfiguration#default")
84     private UserConfiguration userConf;
85
86     @PostConstruct
87     public void initialize()
88     {
89         emailAttribute = userConf.getString( UserConfigurationKeys.LDAP_MAPPER_USER_ATTRIBUTE_EMAIL, emailAttribute );
90         fullNameAttribute =
91             userConf.getString( UserConfigurationKeys.LDAP_MAPPER_USER_ATTRIBUTE_FULLNAME, fullNameAttribute );
92         passwordAttribute =
93             userConf.getString( UserConfigurationKeys.LDAP_MAPPER_USER_ATTRIBUTE_PASSWORD, passwordAttribute );
94         userIdAttribute = userConf.getString( UserConfigurationKeys.LDAP_MAPPER_USER_ATTRIBUTE_ID, userIdAttribute );
95         userBaseDn = userConf.getConcatenatedList( "ldap.config.mapper.attribute.user.base.dn",
96                                                    userConf.getConcatenatedList( "ldap.config.base.dn", userBaseDn ) );
97         userObjectClass =
98             userConf.getString( UserConfigurationKeys.LDAP_MAPPER_USER_ATTRIBUTE_OBJECT_CLASS, userObjectClass );
99         userFilter = userConf.getString( UserConfigurationKeys.LDAP_MAPPER_USER_ATTRIBUTE_FILTER, userFilter );
100         maxResultCount = userConf.getInt( UserConfigurationKeys.LDAP_MAX_RESULT_COUNT, maxResultCount );
101     }
102
103     public Attributes getCreationAttributes( User user, boolean encodePasswordIfChanged )
104         throws MappingException
105     {
106         Attributes userAttrs = new BasicAttributes();
107
108         boolean passwordSet = false;
109
110         if ( !passwordSet && ( user.getEncodedPassword() != null ) )
111         {
112             userAttrs.put( getPasswordAttribute(), user.getEncodedPassword() );
113         }
114
115         if ( !StringUtils.isEmpty( user.getFullName() ) )
116         {
117             userAttrs.put( getUserFullNameAttribute(), user.getFullName() );
118         }
119
120         if ( !StringUtils.isEmpty( user.getEmail() ) )
121         {
122             userAttrs.put( getEmailAddressAttribute(), user.getEmail() );
123         }
124
125         return userAttrs;
126     }
127
128     public String getEmailAddressAttribute()
129     {
130         return emailAttribute;
131     }
132
133     public String getUserFullNameAttribute()
134     {
135         return fullNameAttribute;
136     }
137
138     public String getPasswordAttribute()
139     {
140         return passwordAttribute;
141     }
142
143     public String[] getUserAttributeNames()
144     {
145         return new String[]{ emailAttribute, fullNameAttribute, passwordAttribute, userIdAttribute };
146     }
147
148     public int getMaxResultCount()
149     {
150         return maxResultCount;
151     }
152
153     public UserUpdate getUpdate( LdapUser user )
154         throws MappingException
155     {
156
157         Attributes addAttrs = new BasicAttributes();
158
159         Attributes modAttrs = new BasicAttributes();
160
161         if ( !StringUtils.isEmpty( user.getFullName() ) )
162         {
163             if ( user.getFullName() == null )
164             {
165                 addAttrs.put( getUserFullNameAttribute(), user.getFullName() );
166             }
167             else if ( !user.getFullName().equals( user.getFullName() ) )
168             {
169                 modAttrs.put( getUserFullNameAttribute(), user.getFullName() );
170             }
171         }
172
173         if ( !StringUtils.isEmpty( user.getEmail() ) )
174         {
175             if ( user.getEmail() == null )
176             {
177                 addAttrs.put( getEmailAddressAttribute(), user.getEmail() );
178             }
179             else if ( !user.getEmail().equals( user.getEmail() ) )
180             {
181                 modAttrs.put( getEmailAddressAttribute(), user.getEmail() );
182             }
183         }
184
185         return null;
186     }
187
188     public LdapUser getUser( Attributes attributes )
189         throws MappingException
190     {
191         String userIdAttribute = getUserIdAttribute();
192         String emailAddressAttribute = getEmailAddressAttribute();
193         String nameAttribute = getUserFullNameAttribute();
194         String passwordAttribute = getPasswordAttribute();
195
196         String userId = ( LdapUtils.getAttributeValue( attributes, userIdAttribute, "username" ) );
197
198         LdapUser user = new LdapUser( userId );
199         user.setOriginalAttributes( attributes );
200
201         user.setEmail( LdapUtils.getAttributeValue( attributes, emailAddressAttribute, "email address" ) );
202         user.setFullName( LdapUtils.getAttributeValue( attributes, nameAttribute, "name" ) );
203
204         String encodedPassword = LdapUtils.getAttributeValueFromByteArray( attributes, passwordAttribute, "password" );
205
206         // it seems to be a common convention for the password to come back prepended with the encoding type..
207         // however we deal with that via configuration right now so just smoke it.
208         if ( encodedPassword != null && encodedPassword.startsWith( "{" ) )
209         {
210             encodedPassword = encodedPassword.substring( encodedPassword.indexOf( "}" ) + 1 );
211         }
212
213         user.setEncodedPassword( encodedPassword );
214
215         // REDBACK-215: skip NPE
216         user.setLastPasswordChange( new Date() );
217
218         return user;
219     }
220
221     public String getUserIdAttribute()
222     {
223         return userIdAttribute;
224     }
225
226     public String getEmailAttribute()
227     {
228         return emailAttribute;
229     }
230
231     public void setEmailAttribute( String emailAttribute )
232     {
233         this.emailAttribute = emailAttribute;
234     }
235
236     public String getFullNameAttribute()
237     {
238         return fullNameAttribute;
239     }
240
241     public void setFullNameAttribute( String fullNameAttribute )
242     {
243         this.fullNameAttribute = fullNameAttribute;
244     }
245
246     public void setMaxResultCount( int maxResultCount )
247     {
248         this.maxResultCount = maxResultCount;
249     }
250
251     public String getUserBaseDn()
252     {
253         return userBaseDn;
254     }
255
256     public void setUserBaseDn( String userBaseDn )
257     {
258         this.userBaseDn = userBaseDn;
259     }
260
261     public String getUserObjectClass()
262     {
263         return userObjectClass;
264     }
265
266     public String getUserFilter()
267     {
268         return userFilter;
269     }
270
271     public void setUserFilter( String userFilter )
272     {
273         this.userFilter = userFilter;
274     }
275
276     public void setUserObjectClass( String userObjectClass )
277     {
278         this.userObjectClass = userObjectClass;
279     }
280
281     public void setPasswordAttribute( String passwordAttribute )
282     {
283         this.passwordAttribute = passwordAttribute;
284     }
285
286     public void setUserIdAttribute( String userIdAttribute )
287     {
288         this.userIdAttribute = userIdAttribute;
289     }
290
291     public LdapUser newUserInstance( String username, String fullName, String email )
292     {
293         return new LdapUser( username, fullName, email );
294     }
295
296     public LdapUser newTemplateUserInstance()
297     {
298         return new LdapUser();
299     }
300
301     public String[] getReturningAttributes()
302     {
303         return new String[]{ getUserIdAttribute(), getEmailAttribute(), getFullNameAttribute(),
304             getPasswordAttribute() };
305     }
306
307     public UserConfiguration getUserConf()
308     {
309         return userConf;
310     }
311
312     public void setUserConf( UserConfiguration userConf )
313     {
314         this.userConf = userConf;
315     }
316 }