]> source.dussan.org Git - archiva.git/blob
17271f8e1c55df3d770089209f4f01d59abd2bae
[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  * 
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     public void afterConfigurationChange( Registry registry, String propertyName, Object propertyValue )
74     {
75         if ( ConfigurationNames.isManagedRepositories( propertyName ) )
76         {
77             createMissingManagedRepositoryRoles( archivaConfiguration.getConfiguration().getManagedRepositories() );
78         }
79     }
80
81     public void assignRepositoryObserverToGuestUser( List<ManagedRepositoryConfiguration> repos )
82     {
83         for ( ManagedRepositoryConfiguration repoConfig : repos )
84         {
85             String repoId = repoConfig.getId();
86
87             // TODO: Use the Redback / UserConfiguration..getString( "redback.default.guest" ) to get the right name.
88             String principal = "guest";
89
90             try
91             {
92                 UserAssignment ua;
93
94                 if ( rbacManager.userAssignmentExists( principal ) )
95                 {
96                     ua = rbacManager.getUserAssignment( principal );
97                 }
98                 else
99                 {
100                     ua = rbacManager.createUserAssignment( principal );
101                 }
102
103                 ua.addRoleName( ArchivaRoleConstants.toRepositoryObserverRoleName( repoId ) );
104                 rbacManager.saveUserAssignment( ua );
105             }
106             catch ( RbacManagerException e )
107             {
108                 log.warn(
109                                   "Unable to add role [" + ArchivaRoleConstants.toRepositoryObserverRoleName( repoId )
110                                       + "] to " + principal + " user.", e );
111             }
112         }
113     }
114
115     public void beforeConfigurationChange( Registry registry, String propertyName, Object propertyValue )
116     {
117         /* do nothing */
118     }
119
120     public void createMissingManagedRepositoryRoles( List<ManagedRepositoryConfiguration> repos )
121     {
122         // NOTE: Remote Repositories do not have roles or security placed around them.
123
124         for ( ManagedRepositoryConfiguration repoConfig : repos )
125         {
126             // manage roles for repositories
127             try
128             {
129                 userRepos.createMissingRepositoryRoles( repoConfig.getId() );
130             }
131             catch ( ArchivaSecurityException e )
132             {
133                 log.warn( e.getMessage(), e );
134             }
135         }
136     }
137
138     public void createMissingRepositoryRoles( List<String> repoIds )
139     {
140         for ( String repoId : repoIds )
141         {
142             // manage roles for repositories
143             try
144             {
145                 userRepos.createMissingRepositoryRoles( repoId );
146             }
147             catch ( ArchivaSecurityException e )
148             {
149                 log.warn( e.getMessage(), e );
150             }
151         }
152     }
153
154     public void executeEnvironmentChecks()
155         throws ArchivaException
156     {
157         if ( ( checkers == null ) || CollectionUtils.isEmpty( checkers.values() ) )
158         {
159             throw new ArchivaException( "Unable to initialize the Redback Security Environment, "
160                 + "no Environment Check components found." );
161         }
162
163         List<String> violations = new ArrayList<String>();
164
165         for ( Entry<String, EnvironmentCheck> entry : checkers.entrySet() )
166         {
167             EnvironmentCheck check = entry.getValue();
168             log.info( "Running Environment Check: " + entry.getKey() );
169             check.validateEnvironment( violations );
170         }
171
172         if ( CollectionUtils.isNotEmpty( violations ) )
173         {
174             StringBuffer msg = new StringBuffer();
175             msg.append( "EnvironmentCheck Failure.\n" );
176             msg.append( "======================================================================\n" );
177             msg.append( " ENVIRONMENT FAILURE !! \n" );
178             msg.append( "\n" );
179
180             for ( String violation : violations )
181             {
182                 msg.append( violation ).append( "\n" );
183             }
184
185             msg.append( "\n" );
186             msg.append( "======================================================================" );
187             log.error( msg.toString() );
188
189             throw new ArchivaException( "Unable to initialize Redback Security Environment, [" + violations.size()
190                 + "] violation(s) encountered, See log for details." );
191         }
192     }
193
194     public void startup()
195         throws ArchivaException
196     {
197         executeEnvironmentChecks();
198
199         createMissingManagedRepositoryRoles( archivaConfiguration.getConfiguration().getManagedRepositories() );
200         archivaConfiguration.addChangeListener( this );
201
202         if ( archivaConfiguration.isDefaulted() )
203         {
204             assignRepositoryObserverToGuestUser( archivaConfiguration.getConfiguration().getManagedRepositories() );
205         }
206     }
207 }