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