]> source.dussan.org Git - archiva.git/blob
f75c284ae7e6bc2e1b3a74072bf04aacd2f129e3
[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.users.User;
24 import org.apache.commons.lang.StringUtils;
25 import org.springframework.stereotype.Service;
26
27 import javax.annotation.PostConstruct;
28 import javax.inject.Inject;
29 import javax.inject.Named;
30 import javax.naming.directory.Attributes;
31 import javax.naming.directory.BasicAttributes;
32 import java.util.Date;
33
34 /**
35  * @author <a href="jesse@codehaus.org"> jesse
36  * @version $Id$
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" )
84     private UserConfiguration userConf;
85
86     @PostConstruct
87     public void initialize()
88     {
89         emailAttribute = userConf.getString( "ldap.config.mapper.attribute.email", emailAttribute );
90         fullNameAttribute = userConf.getString( "ldap.config.mapper.attribute.fullname", fullNameAttribute );
91         passwordAttribute = userConf.getString( "ldap.config.mapper.attribute.password", passwordAttribute );
92         userIdAttribute = userConf.getString( "ldap.config.mapper.attribute.user.id", userIdAttribute );
93         userBaseDn = userConf.getConcatenatedList( "ldap.config.mapper.attribute.user.base.dn",
94                                                    userConf.getConcatenatedList( "ldap.config.base.dn", userBaseDn ) );
95         userObjectClass = userConf.getString( "ldap.config.mapper.attribute.user.object.class", userObjectClass );
96         userFilter = userConf.getString( "ldap.config.mapper.attribute.user.filter", userFilter );
97         maxResultCount = userConf.getInt( "ldap.config.max.result.count", maxResultCount );
98     }
99
100     public Attributes getCreationAttributes( User user, boolean encodePasswordIfChanged )
101         throws MappingException
102     {
103         Attributes userAttrs = new BasicAttributes();
104
105         boolean passwordSet = false;
106
107         if ( !passwordSet && ( user.getEncodedPassword() != null ) )
108         {
109             userAttrs.put( getPasswordAttribute(), user.getEncodedPassword() );
110         }
111
112         if ( !StringUtils.isEmpty( user.getFullName() ) )
113         {
114             userAttrs.put( getUserFullNameAttribute(), user.getFullName() );
115         }
116
117         if ( !StringUtils.isEmpty( user.getEmail() ) )
118         {
119             userAttrs.put( getEmailAddressAttribute(), user.getEmail() );
120         }
121
122         return userAttrs;
123     }
124
125     public String getEmailAddressAttribute()
126     {
127         return emailAttribute;
128     }
129
130     public String getUserFullNameAttribute()
131     {
132         return fullNameAttribute;
133     }
134
135     public String getPasswordAttribute()
136     {
137         return passwordAttribute;
138     }
139
140     public String[] getUserAttributeNames()
141     {
142         return new String[]{ emailAttribute, fullNameAttribute, passwordAttribute, userIdAttribute };
143     }
144
145     public int getMaxResultCount()
146     {
147         return maxResultCount;
148     }
149
150     public UserUpdate getUpdate( LdapUser user )
151         throws MappingException
152     {
153
154         Attributes addAttrs = new BasicAttributes();
155
156         Attributes modAttrs = new BasicAttributes();
157
158         if ( !StringUtils.isEmpty( user.getFullName() ) )
159         {
160             if ( user.getFullName() == null )
161             {
162                 addAttrs.put( getUserFullNameAttribute(), user.getFullName() );
163             }
164             else if ( !user.getFullName().equals( user.getFullName() ) )
165             {
166                 modAttrs.put( getUserFullNameAttribute(), user.getFullName() );
167             }
168         }
169
170         if ( !StringUtils.isEmpty( user.getEmail() ) )
171         {
172             if ( user.getEmail() == null )
173             {
174                 addAttrs.put( getEmailAddressAttribute(), user.getEmail() );
175             }
176             else if ( !user.getEmail().equals( user.getEmail() ) )
177             {
178                 modAttrs.put( getEmailAddressAttribute(), user.getEmail() );
179             }
180         }
181
182         return null;
183     }
184
185     public LdapUser getUser( Attributes attributes )
186         throws MappingException
187     {
188         String userIdAttribute = getUserIdAttribute();
189         String emailAddressAttribute = getEmailAddressAttribute();
190         String nameAttribute = getUserFullNameAttribute();
191         String passwordAttribute = getPasswordAttribute();
192
193         String userId = ( LdapUtils.getAttributeValue( attributes, userIdAttribute, "username" ) );
194
195         LdapUser user = new LdapUser( userId );
196         user.setOriginalAttributes( attributes );
197
198         user.setEmail( LdapUtils.getAttributeValue( attributes, emailAddressAttribute, "email address" ) );
199         user.setFullName( LdapUtils.getAttributeValue( attributes, nameAttribute, "name" ) );
200
201         String encodedPassword = LdapUtils.getAttributeValueFromByteArray( attributes, passwordAttribute, "password" );
202
203         // it seems to be a common convention for the password to come back prepended with the encoding type..
204         // however we deal with that via configuration right now so just smoke it.
205         if ( encodedPassword != null && encodedPassword.startsWith( "{" ) )
206         {
207             encodedPassword = encodedPassword.substring( encodedPassword.indexOf( "}" ) + 1 );
208         }
209
210         user.setEncodedPassword( encodedPassword );
211
212         // REDBACK-215: skip NPE
213         user.setLastPasswordChange( new Date() );
214
215         return user;
216     }
217
218     public String getUserIdAttribute()
219     {
220         return userIdAttribute;
221     }
222
223     public String getEmailAttribute()
224     {
225         return emailAttribute;
226     }
227
228     public void setEmailAttribute( String emailAttribute )
229     {
230         this.emailAttribute = emailAttribute;
231     }
232
233     public String getFullNameAttribute()
234     {
235         return fullNameAttribute;
236     }
237
238     public void setFullNameAttribute( String fullNameAttribute )
239     {
240         this.fullNameAttribute = fullNameAttribute;
241     }
242
243     public void setMaxResultCount( int maxResultCount )
244     {
245         this.maxResultCount = maxResultCount;
246     }
247
248     public String getUserBaseDn()
249     {
250         return userBaseDn;
251     }
252
253     public void setUserBaseDn( String userBaseDn )
254     {
255         this.userBaseDn = userBaseDn;
256     }
257
258     public String getUserObjectClass()
259     {
260         return userObjectClass;
261     }
262
263     public String getUserFilter()
264     {
265         return userFilter;
266     }
267
268     public void setUserFilter( String userFilter )
269     {
270         this.userFilter = userFilter;
271     }
272
273     public void setUserObjectClass( String userObjectClass )
274     {
275         this.userObjectClass = userObjectClass;
276     }
277
278     public void setPasswordAttribute( String passwordAttribute )
279     {
280         this.passwordAttribute = passwordAttribute;
281     }
282
283     public void setUserIdAttribute( String userIdAttribute )
284     {
285         this.userIdAttribute = userIdAttribute;
286     }
287
288     public LdapUser newUserInstance( String username, String fullName, String email )
289     {
290         return new LdapUser( username, fullName, email );
291     }
292
293     public LdapUser newTemplateUserInstance()
294     {
295         return new LdapUser();
296     }
297
298     public String[] getReturningAttributes()
299     {
300         return new String[]{ getUserIdAttribute(), getEmailAttribute(), getFullNameAttribute(),
301             getPasswordAttribute() };
302     }
303
304     public UserConfiguration getUserConf()
305     {
306         return userConf;
307     }
308
309     public void setUserConf( UserConfiguration userConf )
310     {
311         this.userConf = userConf;
312     }
313 }