This project has retired. For details please refer to its Attic page.
Source code
001package org.apache.archiva.web.security;
002/*
003 * Licensed to the Apache Software Foundation (ASF) under one
004 * or more contributor license agreements.  See the NOTICE file
005 * distributed with this work for additional information
006 * regarding copyright ownership.  The ASF licenses this file
007 * to you under the Apache License, Version 2.0 (the
008 * "License"); you may not use this file except in compliance
009 * with the License.  You may obtain a copy of the License at
010 *
011 * http://www.apache.org/licenses/LICENSE-2.0
012 *
013 * Unless required by applicable law or agreed to in writing,
014 * software distributed under the License is distributed on an
015 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
016 * KIND, either express or implied.  See the License for the
017 * specific language governing permissions and limitations
018 * under the License.
019 */
020
021import org.apache.archiva.admin.model.RepositoryAdminException;
022import org.apache.archiva.admin.model.runtime.RedbackRuntimeConfigurationAdmin;
023import org.apache.archiva.redback.components.cache.Cache;
024import org.apache.archiva.redback.rbac.AbstractRBACManager;
025import org.apache.archiva.redback.rbac.Operation;
026import org.apache.archiva.redback.rbac.Permission;
027import org.apache.archiva.redback.rbac.RBACManager;
028import org.apache.archiva.redback.rbac.RbacManagerException;
029import org.apache.archiva.redback.rbac.RbacObjectInvalidException;
030import org.apache.archiva.redback.rbac.RbacObjectNotFoundException;
031import org.apache.archiva.redback.rbac.Resource;
032import org.apache.archiva.redback.rbac.Role;
033import org.apache.archiva.redback.rbac.UserAssignment;
034import org.springframework.context.ApplicationContext;
035import org.springframework.stereotype.Service;
036
037import javax.inject.Inject;
038import javax.inject.Named;
039import java.util.ArrayList;
040import java.util.Collection;
041import java.util.HashMap;
042import java.util.LinkedHashMap;
043import java.util.List;
044import java.util.Map;
045import java.util.Set;
046
047/**
048 * @author Olivier Lamy
049 * @since 1.4-M4
050 */
051@Service( "rbacManager#archiva" )
052public class ArchivaRbacManager
053    extends AbstractRBACManager
054    implements RBACManager
055{
056
057    private Map<String, RBACManager> rbacManagersPerId;
058
059    @Inject
060    private ApplicationContext applicationContext;
061
062    @Inject
063    private RedbackRuntimeConfigurationAdmin redbackRuntimeConfigurationAdmin;
064
065    @Inject
066    @Named( value = "cache#operations" )
067    private Cache<String, Operation> operationsCache;
068
069    @Inject
070    @Named( value = "cache#permissions" )
071    private Cache<String, Permission> permissionsCache;
072
073    @Inject
074    @Named( value = "cache#resources" )
075    private Cache<String, Resource> resourcesCache;
076
077    @Inject
078    @Named( value = "cache#roles" )
079    private Cache<String, Role> rolesCache;
080
081    @Inject
082    @Named( value = "cache#userAssignments" )
083    private Cache<String, UserAssignment> userAssignmentsCache;
084
085    @Inject
086    @Named( value = "cache#userPermissions" )
087    private Cache<String, Map<String, List<Permission>>> userPermissionsCache;
088
089    @Inject
090    @Named( value = "cache#effectiveRoleSet" )
091    private Cache<String, Set<Role>> effectiveRoleSetCache;
092
093    @Override
094    public void initialize()
095    {
096        try
097        {
098            List<String> rbacManagerIds =
099                redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration().getRbacManagerImpls();
100
101            if ( rbacManagerIds.isEmpty() )
102            {
103                rbacManagerIds.add( RedbackRuntimeConfigurationAdmin.DEFAULT_RBAC_MANAGER_IMPL );
104            }
105
106            log.info( "use rbacManagerIds: '{}'", rbacManagerIds );
107
108            this.rbacManagersPerId = new LinkedHashMap<>( rbacManagerIds.size() );
109
110            for ( String id : rbacManagerIds )
111            {
112                RBACManager rbacManager = applicationContext.getBean( "rbacManager#" + id, RBACManager.class );
113
114                rbacManagersPerId.put( id, rbacManager );
115            }
116        }
117        catch ( RepositoryAdminException e )
118        {
119
120            log.error( e.getMessage(), e );
121            throw new RuntimeException( e.getMessage(), e );
122        }
123    }
124
125    protected RBACManager getRbacManagerForWrite()
126    {
127        for ( RBACManager rbacManager : this.rbacManagersPerId.values() )
128        {
129            if ( !rbacManager.isReadOnly() )
130            {
131                return rbacManager;
132            }
133        }
134        return this.rbacManagersPerId.isEmpty() ? applicationContext.getBean(
135            "rbacManager#" + RedbackRuntimeConfigurationAdmin.DEFAULT_RBAC_MANAGER_IMPL, RBACManager.class ) //
136            : this.rbacManagersPerId.values().iterator().next();
137    }
138
139    @Override
140    public Role createRole( String name )
141    {
142        return getRbacManagerForWrite().createRole( name );
143    }
144
145    @Override
146    public Role saveRole( Role role )
147        throws RbacObjectInvalidException, RbacManagerException
148    {
149        Exception lastException = null;
150        boolean allFailed = true;
151        for ( RBACManager rbacManager : rbacManagersPerId.values() )
152        {
153            try
154            {
155                if ( !rbacManager.isReadOnly() )
156                {
157                    role = rbacManager.saveRole( role );
158                    allFailed = false;
159                }
160            }
161            catch ( Exception e )
162            {
163                lastException = e;
164            }
165        }
166        if ( lastException != null && allFailed )
167        {
168            throw new RbacManagerException( lastException.getMessage(), lastException );
169        }
170        return role;
171    }
172
173    @Override
174    public void saveRoles( Collection<Role> roles )
175        throws RbacObjectInvalidException, RbacManagerException
176    {
177        Exception lastException = null;
178        boolean allFailed = true;
179        for ( RBACManager rbacManager : rbacManagersPerId.values() )
180        {
181            try
182            {
183                if ( !rbacManager.isReadOnly() )
184                {
185                    rbacManager.saveRoles( roles );
186                    allFailed = false;
187                }
188            }
189            catch ( Exception e )
190            {
191                lastException = e;
192            }
193        }
194        if ( lastException != null && allFailed )
195        {
196            throw new RbacManagerException( lastException.getMessage(), lastException );
197        }
198    }
199
200    @Override
201    public Role getRole( String roleName )
202        throws RbacObjectNotFoundException, RbacManagerException
203    {
204
205        Role el = rolesCache.get( roleName );
206        if ( el != null )
207        {
208            return el;
209        }
210
211        Exception lastException = null;
212        for ( RBACManager rbacManager : rbacManagersPerId.values() )
213        {
214            try
215            {
216                Role role = rbacManager.getRole( roleName );
217                if ( role != null )
218                {
219                    rolesCache.put( role.getName(), role );
220                    return role;
221                }
222            }
223            catch ( Exception e )
224            {
225                lastException = e;
226            }
227        }
228        log.debug( "cannot find role for name: ‘{}", roleName );
229        if ( lastException != null )
230        {
231            throw new RbacManagerException( lastException.getMessage(), lastException );
232        }
233        return null;
234    }
235
236    @Override
237    public List<Role> getAllRoles()
238        throws RbacManagerException
239    {
240        Map<String, Role> allRoles = new HashMap<>();
241        boolean allFailed = true;
242        Exception lastException = null;
243        for ( RBACManager rbacManager : rbacManagersPerId.values() )
244        {
245            try
246            {
247                List<Role> roles = rbacManager.getAllRoles();
248                for ( Role role : roles )
249                {
250                    allRoles.put( role.getName(), role );
251                }
252                allFailed = false;
253            }
254            catch ( Exception e )
255            {
256                lastException = e;
257            }
258        }
259
260        if ( lastException != null && allFailed )
261        {
262            throw new RbacManagerException( lastException.getMessage(), lastException );
263        }
264
265        return new ArrayList<>( allRoles.values() );
266    }
267
268    @Override
269    public void removeRole( Role role )
270        throws RbacObjectNotFoundException, RbacObjectInvalidException, RbacManagerException
271    {
272        boolean allFailed = true;
273        Exception lastException = null;
274        for ( RBACManager rbacManager : rbacManagersPerId.values() )
275        {
276            try
277            {
278                rbacManager.removeRole( role );
279                rolesCache.remove( role.getName() );
280                allFailed = false;
281            }
282            catch ( Exception e )
283            {
284                lastException = e;
285            }
286        }
287
288        if ( lastException != null && allFailed )
289        {
290            throw new RbacManagerException( lastException.getMessage(), lastException );
291        }
292    }
293
294    @Override
295    public Permission createPermission( String name )
296        throws RbacManagerException
297    {
298        return getRbacManagerForWrite().createPermission( name );
299    }
300
301    @Override
302    public Permission createPermission( String name, String operationName, String resourceIdentifier )
303        throws RbacManagerException
304    {
305        return getRbacManagerForWrite().createPermission( name, operationName, resourceIdentifier );
306    }
307
308    @Override
309    public Permission savePermission( Permission permission )
310        throws RbacObjectInvalidException, RbacManagerException
311    {
312        boolean allFailed = true;
313        Exception lastException = null;
314        for ( RBACManager rbacManager : rbacManagersPerId.values() )
315        {
316            try
317            {
318                if ( rbacManager.isReadOnly() )
319                {
320                    permission = rbacManager.savePermission( permission );
321                    allFailed = false;
322                }
323            }
324            catch ( Exception e )
325            {
326                lastException = e;
327            }
328        }
329
330        if ( lastException != null && allFailed )
331        {
332            throw new RbacManagerException( lastException.getMessage(), lastException );
333        }
334
335        return permission;
336    }
337
338    @Override
339    public Permission getPermission( String permissionName )
340        throws RbacObjectNotFoundException, RbacManagerException
341    {
342
343        Permission el = permissionsCache.get( permissionName );
344        if ( el != null )
345        {
346            return el;
347        }
348
349        Exception lastException = null;
350        for ( RBACManager rbacManager : rbacManagersPerId.values() )
351        {
352            try
353            {
354                Permission p = rbacManager.getPermission( permissionName );
355                if ( p != null )
356                {
357                    permissionsCache.put( permissionName, p );
358                    return p;
359                }
360            }
361            catch ( Exception e )
362            {
363                lastException = e;
364            }
365        }
366
367        if ( lastException != null )
368        {
369            throw new RbacManagerException( lastException.getMessage(), lastException );
370        }
371        return null;
372    }
373
374    @Override
375    public List<Permission> getAllPermissions()
376        throws RbacManagerException
377    {
378        Map<String, Permission> allPermissions = new HashMap<>();
379        boolean allFailed = true;
380        Exception lastException = null;
381        for ( RBACManager rbacManager : rbacManagersPerId.values() )
382        {
383            try
384            {
385                List<Permission> permissions = rbacManager.getAllPermissions();
386                for ( Permission p : permissions )
387                {
388                    allPermissions.put( p.getName(), p );
389                }
390                allFailed = false;
391            }
392            catch ( Exception e )
393            {
394                lastException = e;
395            }
396        }
397
398        if ( lastException != null && allFailed )
399        {
400            throw new RbacManagerException( lastException.getMessage(), lastException );
401        }
402        return new ArrayList<>( allPermissions.values() );
403    }
404
405    @Override
406    public void removePermission( Permission permission )
407        throws RbacObjectNotFoundException, RbacObjectInvalidException, RbacManagerException
408    {
409        boolean allFailed = true;
410        Exception lastException = null;
411        for ( RBACManager rbacManager : rbacManagersPerId.values() )
412        {
413            try
414            {
415                rbacManager.removePermission( permission );
416                permissionsCache.remove( permission.getName() );
417                allFailed = false;
418            }
419            catch ( Exception e )
420            {
421                lastException = e;
422            }
423        }
424
425        if ( lastException != null && allFailed )
426        {
427            throw new RbacManagerException( lastException.getMessage(), lastException );
428        }
429    }
430
431    @Override
432    public Operation createOperation( String name )
433        throws RbacManagerException
434    {
435        return getRbacManagerForWrite().createOperation( name );
436    }
437
438    @Override
439    public Operation saveOperation( Operation operation )
440        throws RbacObjectInvalidException, RbacManagerException
441    {
442        boolean allFailed = true;
443        Exception lastException = null;
444        for ( RBACManager rbacManager : rbacManagersPerId.values() )
445        {
446            try
447            {
448                if ( !rbacManager.isReadOnly() )
449                {
450                    operation = rbacManager.saveOperation( operation );
451                    allFailed = false;
452                }
453            }
454            catch ( Exception e )
455            {
456                lastException = e;
457            }
458        }
459
460        if ( lastException != null && allFailed )
461        {
462            throw new RbacManagerException( lastException.getMessage(), lastException );
463        }
464        return operation;
465    }
466
467    @Override
468    public Operation getOperation( String operationName )
469        throws RbacObjectNotFoundException, RbacManagerException
470    {
471
472        Operation el = operationsCache.get( operationName );
473        if ( el != null )
474        {
475            return el;
476        }
477
478        Exception lastException = null;
479        for ( RBACManager rbacManager : rbacManagersPerId.values() )
480        {
481            try
482            {
483                Operation o = rbacManager.getOperation( operationName );
484                if ( o != null )
485                {
486                    operationsCache.put( operationName, o );
487                    return o;
488                }
489            }
490            catch ( Exception e )
491            {
492                lastException = e;
493            }
494        }
495
496        if ( lastException != null )
497        {
498            throw new RbacManagerException( lastException.getMessage(), lastException );
499        }
500        return null;
501    }
502
503    @Override
504    public List<Operation> getAllOperations()
505        throws RbacManagerException
506    {
507        Map<String, Operation> allOperations = new HashMap<>();
508        boolean allFailed = true;
509        Exception lastException = null;
510        for ( RBACManager rbacManager : rbacManagersPerId.values() )
511        {
512            try
513            {
514                List<Operation> operations = rbacManager.getAllOperations();
515                for ( Operation o : operations )
516                {
517                    allOperations.put( o.getName(), o );
518                }
519                allFailed = false;
520            }
521            catch ( Exception e )
522            {
523                lastException = e;
524            }
525        }
526
527        if ( lastException != null && allFailed )
528        {
529            throw new RbacManagerException( lastException.getMessage(), lastException );
530        }
531        return new ArrayList<>( allOperations.values() );
532    }
533
534    @Override
535    public void removeOperation( Operation operation )
536        throws RbacObjectNotFoundException, RbacObjectInvalidException, RbacManagerException
537    {
538        boolean allFailed = true;
539        Exception lastException = null;
540        for ( RBACManager rbacManager : rbacManagersPerId.values() )
541        {
542            try
543            {
544                rbacManager.removeOperation( operation );
545                operationsCache.remove( operation.getName() );
546                allFailed = false;
547            }
548            catch ( Exception e )
549            {
550                lastException = e;
551            }
552        }
553
554        if ( lastException != null && allFailed )
555        {
556            throw new RbacManagerException( lastException.getMessage(), lastException );
557        }
558    }
559
560    @Override
561    public Resource createResource( String identifier )
562        throws RbacManagerException
563    {
564        return getRbacManagerForWrite().createResource( identifier );
565    }
566
567    @Override
568    public Resource saveResource( Resource resource )
569        throws RbacObjectInvalidException, RbacManagerException
570    {
571        boolean allFailed = true;
572        Exception lastException = null;
573        for ( RBACManager rbacManager : rbacManagersPerId.values() )
574        {
575            try
576            {
577                if ( !rbacManager.isReadOnly() )
578                {
579                    resource = rbacManager.saveResource( resource );
580                    allFailed = false;
581                }
582            }
583            catch ( Exception e )
584            {
585                lastException = e;
586            }
587        }
588
589        if ( lastException != null && allFailed )
590        {
591            throw new RbacManagerException( lastException.getMessage(), lastException );
592        }
593        return resource;
594    }
595
596    @Override
597    public Resource getResource( String resourceIdentifier )
598        throws RbacObjectNotFoundException, RbacManagerException
599    {
600
601        Resource el = resourcesCache.get( resourceIdentifier );
602        if ( el != null )
603        {
604            return el;
605        }
606
607        Exception lastException = null;
608        for ( RBACManager rbacManager : rbacManagersPerId.values() )
609        {
610            try
611            {
612                Resource r = rbacManager.getResource( resourceIdentifier );
613                if ( r != null )
614                {
615                    resourcesCache.put( resourceIdentifier, r );
616                    return r;
617                }
618            }
619            catch ( Exception e )
620            {
621                lastException = e;
622            }
623        }
624
625        if ( lastException != null )
626        {
627            throw new RbacManagerException( lastException.getMessage(), lastException );
628        }
629        return null;
630    }
631
632    @Override
633    public List<Resource> getAllResources()
634        throws RbacManagerException
635    {
636        Map<String, Resource> allResources = new HashMap<>();
637        boolean allFailed = true;
638        Exception lastException = null;
639        for ( RBACManager rbacManager : rbacManagersPerId.values() )
640        {
641            try
642            {
643                List<Resource> resources = rbacManager.getAllResources();
644                for ( Resource r : resources )
645                {
646                    allResources.put( r.getIdentifier(), r );
647                }
648                allFailed = false;
649            }
650            catch ( Exception e )
651            {
652                lastException = e;
653            }
654        }
655
656        if ( lastException != null && allFailed )
657        {
658            throw new RbacManagerException( lastException.getMessage(), lastException );
659        }
660        return new ArrayList<>( allResources.values() );
661    }
662
663    @Override
664    public void removeResource( Resource resource )
665        throws RbacObjectNotFoundException, RbacObjectInvalidException, RbacManagerException
666    {
667        boolean allFailed = true;
668        Exception lastException = null;
669        for ( RBACManager rbacManager : rbacManagersPerId.values() )
670        {
671            try
672            {
673                rbacManager.removeResource( resource );
674                resourcesCache.remove( resource.getIdentifier() );
675                allFailed = false;
676            }
677            catch ( Exception e )
678            {
679                lastException = e;
680            }
681        }
682
683        if ( lastException != null && allFailed )
684        {
685            throw new RbacManagerException( lastException.getMessage(), lastException );
686        }
687    }
688
689    @Override
690    public UserAssignment createUserAssignment( String principal )
691        throws RbacManagerException
692    {
693        return getRbacManagerForWrite().createUserAssignment( principal );
694    }
695
696    @Override
697    public UserAssignment saveUserAssignment( UserAssignment userAssignment )
698        throws RbacObjectInvalidException, RbacManagerException
699    {
700        boolean allFailed = true;
701        Exception lastException = null;
702        for ( RBACManager rbacManager : rbacManagersPerId.values() )
703        {
704            try
705            {
706                if ( !rbacManager.isReadOnly() )
707                {
708                    userAssignment = rbacManager.saveUserAssignment( userAssignment );
709                    allFailed = false;
710                }
711            }
712            catch ( Exception e )
713            {
714                lastException = e;
715            }
716        }
717
718        if ( lastException != null && allFailed )
719        {
720            throw new RbacManagerException( lastException.getMessage(), lastException );
721        }
722        return userAssignment;
723    }
724
725    @Override
726    public UserAssignment getUserAssignment( String principal )
727        throws RbacObjectNotFoundException, RbacManagerException
728    {
729        UserAssignment el = userAssignmentsCache.get( principal );
730        if ( el != null )
731        {
732            return el;
733        }
734        UserAssignment ua = null;
735        Exception lastException = null;
736        for ( RBACManager rbacManager : rbacManagersPerId.values() )
737        {
738            try
739            {
740                if ( ua == null )
741                {
742                    ua = rbacManager.getUserAssignment( principal );
743                }
744                else
745                {
746                    UserAssignment userAssignment = rbacManager.getUserAssignment( principal );
747                    if ( userAssignment != null )
748                    {
749                        for ( String roleName : userAssignment.getRoleNames() )
750                        {
751                            ua.addRoleName( roleName );
752                        }
753                    }
754                }
755            }
756            catch ( Exception e )
757            {
758                lastException = e;
759            }
760        }
761
762        if ( ua != null )
763        {
764            userAssignmentsCache.put( principal, ua );
765            return ua;
766        }
767
768        if ( lastException != null )
769        {
770            throw new RbacManagerException( lastException.getMessage(), lastException );
771        }
772        return null;
773    }
774
775    @Override
776    public boolean userAssignmentExists( String principal )
777    {
778
779        for ( RBACManager rbacManager : rbacManagersPerId.values() )
780        {
781            try
782            {
783                boolean exists = rbacManager.userAssignmentExists( principal );
784                if ( exists )
785                {
786                    return true;
787                }
788            }
789            catch ( Exception e )
790            {
791                // no op
792            }
793        }
794
795        return false;
796    }
797
798    @Override
799    public boolean userAssignmentExists( UserAssignment assignment )
800    {
801        for ( RBACManager rbacManager : rbacManagersPerId.values() )
802        {
803            try
804            {
805                boolean exists = rbacManager.userAssignmentExists( assignment );
806                if ( exists )
807                {
808                    return true;
809                }
810            }
811            catch ( Exception e )
812            {
813                // no op
814            }
815        }
816
817        return false;
818    }
819
820    @Override
821    public List<UserAssignment> getAllUserAssignments()
822        throws RbacManagerException
823    {
824        Map<String, UserAssignment> allUserAssignments = new HashMap<>();
825        boolean allFailed = true;
826        Exception lastException = null;
827        for ( RBACManager rbacManager : rbacManagersPerId.values() )
828        {
829            try
830            {
831                List<UserAssignment> userAssignments = rbacManager.getAllUserAssignments();
832                for ( UserAssignment ua : userAssignments )
833                {
834                    UserAssignment userAssignment = allUserAssignments.get( ua.getPrincipal() );
835                    if ( userAssignment != null )
836                    {
837                        for ( String roleName : ua.getRoleNames() )
838                        {
839                            userAssignment.addRoleName( roleName );
840                        }
841                    }
842                    allUserAssignments.put( ua.getPrincipal(), ua );
843                }
844                allFailed = false;
845            }
846            catch ( Exception e )
847            {
848                lastException = e;
849            }
850        }
851
852        if ( lastException != null && allFailed )
853        {
854            throw new RbacManagerException( lastException.getMessage(), lastException );
855        }
856        return new ArrayList<>( allUserAssignments.values() );
857    }
858
859    @Override
860    public List<UserAssignment> getUserAssignmentsForRoles( Collection<String> roleNames )
861        throws RbacManagerException
862    {
863        List<UserAssignment> allUserAssignments = new ArrayList<>();
864        boolean allFailed = true;
865        Exception lastException = null;
866        for ( RBACManager rbacManager : rbacManagersPerId.values() )
867        {
868            try
869            {
870                List<UserAssignment> userAssignments = rbacManager.getUserAssignmentsForRoles( roleNames );
871
872                allUserAssignments.addAll( userAssignments );
873
874                allFailed = false;
875            }
876            catch ( Exception e )
877            {
878                lastException = e;
879            }
880        }
881
882        if ( lastException != null && allFailed )
883        {
884            throw new RbacManagerException( lastException.getMessage(), lastException );
885        }
886        return allUserAssignments;
887    }
888
889    @Override
890    public void removeUserAssignment( UserAssignment userAssignment )
891        throws RbacObjectNotFoundException, RbacObjectInvalidException, RbacManagerException
892    {
893        boolean allFailed = true;
894        Exception lastException = null;
895        for ( RBACManager rbacManager : rbacManagersPerId.values() )
896        {
897            try
898            {
899                rbacManager.removeUserAssignment( userAssignment );
900                userAssignmentsCache.remove( userAssignment.getPrincipal() );
901                allFailed = false;
902            }
903            catch ( Exception e )
904            {
905                lastException = e;
906            }
907        }
908
909        if ( lastException != null && allFailed )
910        {
911            throw new RbacManagerException( lastException.getMessage(), lastException );
912        }
913    }
914
915    @Override
916    public boolean roleExists( String name )
917        throws RbacManagerException
918    {
919        Role r = rolesCache.get( name );
920        if ( r != null )
921        {
922            return true;
923        }
924
925        boolean allFailed = true;
926        Exception lastException = null;
927        for ( RBACManager rbacManager : rbacManagersPerId.values() )
928        {
929            try
930            {
931                boolean exists = rbacManager.roleExists( name );
932                if ( exists )
933                {
934                    return true;
935                }
936            }
937            catch ( Exception e )
938            {
939                lastException = e;
940            }
941        }
942
943        if ( lastException != null && allFailed )
944        {
945            throw new RbacManagerException( lastException.getMessage(), lastException );
946        }
947        return false;
948    }
949
950    @Override
951    public boolean roleExists( Role role )
952        throws RbacManagerException
953    {
954        return roleExists( role.getName() );
955    }
956
957    @Override
958    public void eraseDatabase()
959    {
960        log.warn( "eraseDatabase not implemented" );
961    }
962
963    @Override
964    public boolean isFinalImplementation()
965    {
966        return false;
967    }
968
969    @Override
970    public String getDescriptionKey()
971    {
972        return "archiva.redback.rbacmanager.archiva";
973    }
974
975    @Override
976    public boolean isReadOnly()
977    {
978        return false;
979    }
980}