]> source.dussan.org Git - archiva.git/blob
b81b7a5fa9a1bda777dd0913f8244a58ea08bb81
[archiva.git] /
1 package org.apache.maven.archiva.security;
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 java.util.ArrayList;
23 import java.util.List;
24 import java.util.Map;
25 import java.util.Map.Entry;
26
27 import org.apache.commons.collections.CollectionUtils;
28 import org.apache.maven.archiva.common.ArchivaException;
29 import org.apache.maven.archiva.configuration.ArchivaConfiguration;
30 import org.apache.maven.archiva.configuration.ConfigurationNames;
31 import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
32 import org.codehaus.plexus.redback.rbac.RBACManager;
33 import org.codehaus.plexus.redback.rbac.RbacManagerException;
34 import org.codehaus.plexus.redback.rbac.UserAssignment;
35 import org.codehaus.plexus.redback.system.check.EnvironmentCheck;
36 import org.codehaus.plexus.redback.users.UserManager;
37 import org.codehaus.plexus.registry.Registry;
38 import org.codehaus.plexus.registry.RegistryListener;
39 import org.slf4j.Logger;
40 import org.slf4j.LoggerFactory;
41
42 /**
43  * SecurityStartup
44  *
45  * @version $Id$
46  * @plexus.component role="org.apache.maven.archiva.security.SecurityStartup"
47  */
48 public class SecurityStartup
49     implements RegistryListener
50 {
51     private Logger log = LoggerFactory.getLogger( SecurityStartup.class );
52
53     /**
54      * @plexus.requirement
55      */
56     private UserRepositories userRepos;
57
58     /**
59      * @plexus.requirement role-hint="cached"
60      */
61     private RBACManager rbacManager;
62
63     /**
64      * @plexus.requirement role="org.codehaus.plexus.redback.system.check.EnvironmentCheck"
65      */
66     private Map<String, EnvironmentCheck> checkers;
67
68     /**
69      * @plexus.requirement
70      */
71     private ArchivaConfiguration archivaConfiguration;
72
73     /**
74      * @plexus.requirement
75      */
76     private ArchivaXworkUser archivaXworkUser;
77
78     public void afterConfigurationChange( Registry registry, String propertyName, Object propertyValue )
79     {
80         if ( ConfigurationNames.isManagedRepositories( propertyName ) )
81         {
82             createMissingManagedRepositoryRoles( archivaConfiguration.getConfiguration().getManagedRepositories() );
83         }
84     }
85
86     public void assignRepositoryObserverToGuestUser( List<ManagedRepositoryConfiguration> repos )
87     {
88         for ( ManagedRepositoryConfiguration repoConfig : repos )
89         {
90             String repoId = repoConfig.getId();
91
92             String principal = UserManager.GUEST_USERNAME;
93
94             try
95             {
96                 UserAssignment ua;
97
98                 if ( rbacManager.userAssignmentExists( principal ) )
99                 {
100                     ua = rbacManager.getUserAssignment( principal );
101                 }
102                 else
103                 {
104                     ua = rbacManager.createUserAssignment( principal );
105                 }
106
107                 ua.addRoleName( ArchivaRoleConstants.toRepositoryObserverRoleName( repoId ) );
108                 rbacManager.saveUserAssignment( ua );
109             }
110             catch ( RbacManagerException e )
111             {
112                 log.warn(
113                     "Unable to add role [" + ArchivaRoleConstants.toRepositoryObserverRoleName( repoId ) + "] to " +
114                         principal + " user.", e );
115             }
116         }
117     }
118
119     public void beforeConfigurationChange( Registry registry, String propertyName, Object propertyValue )
120     {
121         /* do nothing */
122     }
123
124     public void createMissingManagedRepositoryRoles( List<ManagedRepositoryConfiguration> repos )
125     {
126         // NOTE: Remote Repositories do not have roles or security placed around them.
127
128         for ( ManagedRepositoryConfiguration repoConfig : repos )
129         {
130             // manage roles for repositories
131             try
132             {
133                 userRepos.createMissingRepositoryRoles( repoConfig.getId() );
134             }
135             catch ( ArchivaSecurityException e )
136             {
137                 log.warn( e.getMessage(), e );
138             }
139         }
140     }
141
142     public void createMissingRepositoryRoles( List<String> repoIds )
143     {
144         for ( String repoId : repoIds )
145         {
146             // manage roles for repositories
147             try
148             {
149                 userRepos.createMissingRepositoryRoles( repoId );
150             }
151             catch ( ArchivaSecurityException e )
152             {
153                 log.warn( e.getMessage(), e );
154             }
155         }
156     }
157
158     public void executeEnvironmentChecks()
159         throws ArchivaException
160     {
161         if ( ( checkers == null ) || CollectionUtils.isEmpty( checkers.values() ) )
162         {
163             throw new ArchivaException(
164                 "Unable to initialize the Redback Security Environment, " + "no Environment Check components found." );
165         }
166
167         List<String> violations = new ArrayList<String>();
168
169         for ( Entry<String, EnvironmentCheck> entry : checkers.entrySet() )
170         {
171             EnvironmentCheck check = entry.getValue();
172             log.info( "Running Environment Check: " + entry.getKey() );
173             check.validateEnvironment( violations );
174         }
175
176         if ( CollectionUtils.isNotEmpty( violations ) )
177         {
178             StringBuffer msg = new StringBuffer();
179             msg.append( "EnvironmentCheck Failure.\n" );
180             msg.append( "======================================================================\n" );
181             msg.append( " ENVIRONMENT FAILURE !! \n" );
182             msg.append( "\n" );
183
184             for ( String violation : violations )
185             {
186                 msg.append( violation ).append( "\n" );
187             }
188
189             msg.append( "\n" );
190             msg.append( "======================================================================" );
191             log.error( msg.toString() );
192
193             throw new ArchivaException( "Unable to initialize Redback Security Environment, [" + violations.size() +
194                 "] violation(s) encountered, See log for details." );
195         }
196     }
197
198     public void startup()
199         throws ArchivaException
200     {
201         executeEnvironmentChecks();
202
203         createMissingManagedRepositoryRoles( archivaConfiguration.getConfiguration().getManagedRepositories() );
204         archivaConfiguration.addChangeListener( this );
205
206         if ( archivaConfiguration.isDefaulted() )
207         {
208             assignRepositoryObserverToGuestUser( archivaConfiguration.getConfiguration().getManagedRepositories() );
209         }
210     }
211 }