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