You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@archiva.apache.org by ma...@apache.org on 2021/12/19 19:21:19 UTC

[archiva] branch master updated: Updating permissions for v2 rest service

This is an automated email from the ASF dual-hosted git repository.

martin_s pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/archiva.git


The following commit(s) were added to refs/heads/master by this push:
     new 55b1e5d  Updating permissions for v2 rest service
55b1e5d is described below

commit 55b1e5d09f280f5747c1ba04517fbc233bed5d97
Author: Martin Stockhammer <ma...@apache.org>
AuthorDate: Sun Dec 19 20:21:12 2021 +0100

    Updating permissions for v2 rest service
---
 .../security/common/ArchivaRoleConstants.java      |  63 +-
 .../main/resources/META-INF/redback/redback.xml    |  59 +-
 .../archiva-rest-api/src/enunciate/archiva.css     | 765 -----------------
 .../archiva-rest-api/src/enunciate/archiva.fmt     | 937 ---------------------
 .../src/enunciate/enunciate.xml.org                |  47 --
 .../svc/maven/MavenManagedRepositoryService.java   | 109 ++-
 .../rest/services/DefaultRepositoriesService.java  |   4 +-
 .../svc/DefaultMavenManagedRepositoryService.java  |  12 +-
 .../security/ArchivaStandardRolesCheck.java        |   4 +-
 .../archiva/security/DefaultUserRepositories.java  |  12 +-
 .../security/ArchivaServletAuthenticatorTest.java  |  16 +-
 .../apache/archiva/web/api/FileUploadService.java  |   2 +-
 .../org/apache/archiva/web/rss/RssFeedServlet.java |   2 +-
 .../archiva/webdav/util/WebdavMethodUtil.java      |   6 +-
 .../webdav/RepositoryServletSecurityTest.java      |  20 +-
 15 files changed, 231 insertions(+), 1827 deletions(-)

diff --git a/archiva-modules/archiva-base/archiva-security-common/src/main/java/org/apache/archiva/security/common/ArchivaRoleConstants.java b/archiva-modules/archiva-base/archiva-security-common/src/main/java/org/apache/archiva/security/common/ArchivaRoleConstants.java
index 4700d96..5be7c8b 100644
--- a/archiva-modules/archiva-base/archiva-security-common/src/main/java/org/apache/archiva/security/common/ArchivaRoleConstants.java
+++ b/archiva-modules/archiva-base/archiva-security-common/src/main/java/org/apache/archiva/security/common/ArchivaRoleConstants.java
@@ -45,29 +45,84 @@ public class ArchivaRoleConstants
     // operations
     public static final String OPERATION_MANAGE_USERS = "archiva-manage-users";
 
+    /**
+     * Maintenance role, that allows to run all configuration changes
+     */
     public static final String OPERATION_MANAGE_CONFIGURATION = "archiva-manage-configuration";
 
     public static final String OPERATION_ACTIVE_GUEST = "archiva-guest";
 
+    /**
+     * Allows to run the indexer update
+     */
     public static final String OPERATION_RUN_INDEXER = "archiva-run-indexer";
 
+
     public static final String OPERATION_REGENERATE_INDEX = "archiva-regenerate-index";
 
     public static final String OPERATION_ACCESS_REPORT = "archiva-access-reports";
 
+    /**
+     * Permission to add a repository
+     * Scope: application
+     */
     public static final String OPERATION_ADD_REPOSITORY = "archiva-add-repository";
 
-    public static final String OPERATION_REPOSITORY_ACCESS = "archiva-read-repository";
+    /**
+     * Permission to read the attributes and contents of a repository
+     * Scope: repository
+     */
+    public static final String OPERATION_READ_REPOSITORY = "archiva-read-repository";
 
+    /**
+     * Permission to delete a repository
+     * Scope: repository
+     */
     public static final String OPERATION_DELETE_REPOSITORY = "archiva-delete-repository";
 
+    /**
+     * Permission edit attributes of a repository
+     * Scope: repository
+     */
     public static final String OPERATION_EDIT_REPOSITORY = "archiva-edit-repository";
 
-    public static final String OPERATION_REPOSITORY_UPLOAD = "archiva-upload-repository";
-
+    /**
+     * Permission to upload a artifact to a specific repository
+     * Scope: repository
+     */
+    public static final String OPERATION_ADD_ARTIFACT = "archiva-add-artifact";
+
+    /**
+     * Permission to delete a artifact from a repository
+     * Scope: repository
+     */
+    public static final String OPERATION_DELETE_ARTIFACT = "archiva-delete-artifact";
+
+    /**
+     * Permission to delete a namespace (maven group) from a repository.
+     * Scope: repository
+     */
+    public static final String OPERATION_DELETE_NAMESPACE = "archiva-delete-namespace";
+
+    /**
+     * Permission to delete a project
+     * Scope: repository
+     */
+    public static final String OPERATION_DELETE_PROJECT = "archiva-delete-project";
+
+    /**
+     * Permission to delete a version
+     * Scope: repository
+     */
+    public static final String OPERATION_DELETE_VERSION = "archiva-delete-version";
+
+    /**
+     * Permission to upload a file to the upload workspace
+     * Scope: application
+     */
     public static final String OPERATION_FILE_UPLOAD = "archiva-upload-file";
 
-    public static final String OPERATION_REPOSITORY_DELETE = "archiva-delete-artifact";
+
 
     public static final String OPERATION_MERGE_REPOSITORY = "archiva-merge-repository";
     
diff --git a/archiva-modules/archiva-base/archiva-security-common/src/main/resources/META-INF/redback/redback.xml b/archiva-modules/archiva-base/archiva-security-common/src/main/resources/META-INF/redback/redback.xml
index 3960314..e236e82 100644
--- a/archiva-modules/archiva-base/archiva-security-common/src/main/resources/META-INF/redback/redback.xml
+++ b/archiva-modules/archiva-base/archiva-security-common/src/main/resources/META-INF/redback/redback.xml
@@ -48,12 +48,32 @@
           <name>archiva-merge-repository</name>
           <description>Archiva Merge Repository</description>
         </operation>
-         <operation>
+        <operation>
+          <id>archiva-delete-namespace</id>
+          <name>archiva-delete-namespace</name>
+          <description>Delete Namespace (GroupID) from Archiva Repository</description>
+        </operation>
+        <operation>
+          <id>archiva-delete-project</id>
+          <name>archiva-delete-project</name>
+          <description>Delete Project (all versions) from Archiva Repository</description>
+        </operation>
+        <operation>
+          <id>archiva-delete-version</id>
+          <name>archiva-delete-version</name>
+          <description>Delete Version from Archiva Repository</description>
+        </operation>
+        <operation>
           <id>archiva-delete-artifact</id>
           <name>archiva-delete-artifact</name>
           <description>Delete Artifact</description>
         </operation>
         <operation>
+          <id>archiva-add-artifact</id>
+          <name>archiva-add-artifact</name>
+          <description>Add artifact to Archiva Repository</description>
+        </operation>
+        <operation>
           <id>archiva-access-reports</id>
           <name>archiva-access-reports</name>
           <description>Access Archiva Reports</description>
@@ -79,11 +99,6 @@
           <description>Edit Archiva Repository</description>
         </operation>
         <operation>
-          <id>archiva-upload-repository</id>
-          <name>archiva-upload-repository</name>
-          <description>Upload Archiva Repository</description>
-        </operation>
-        <operation>
           <id>archiva-upload-file</id>
           <name>archiva-upload-file</name>
           <description>Upload File to Archiva</description>
@@ -238,13 +253,37 @@
           <namePrefix>Repository Manager</namePrefix>
           <assignable>true</assignable>
           <permissions>
-             <permission>
+            <permission>
+              <id>archiva-delete-namespace</id>
+              <name>Archiva Delete Namespace (GroupId)</name>
+              <operation>archiva-delete-namespace</operation>
+              <resource>${resource}</resource>
+            </permission>
+            <permission>
+              <id>archiva-delete-project</id>
+              <name>Archiva Delete Project</name>
+              <operation>archiva-delete-project</operation>
+              <resource>${resource}</resource>
+            </permission>
+            <permission>
+              <id>archiva-delete-version</id>
+              <name>Archiva Delete Version</name>
+              <operation>archiva-delete-version</operation>
+              <resource>${resource}</resource>
+            </permission>
+            <permission>
               <id>archiva-delete-artifact</id>
               <name>Delete Artifact</name>
               <operation>archiva-delete-artifact</operation>
               <resource>${resource}</resource>
             </permission>
             <permission>
+              <id>archiva-add-artifact</id>
+              <name>Add Artifact</name>
+              <operation>archiva-add-artifact</operation>
+              <resource>${resource}</resource>
+            </permission>
+            <permission>
               <id>archiva-edit-repository</id>
               <name>Archiva Edit Repository</name>
               <operation>archiva-edit-repository</operation>
@@ -257,12 +296,6 @@
               <resource>${resource}</resource>
             </permission>
             <permission>
-              <id>archiva-upload-repository</id>
-              <name>Archiva Upload to Repository</name>
-              <operation>archiva-upload-repository</operation>
-              <resource>${resource}</resource>
-            </permission>
-            <permission>
               <id>archiva-upload-file</id>
               <name>Archiva Upload File to Archiva</name>
               <operation>archiva-upload-file</operation>
diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/enunciate/archiva.css b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/enunciate/archiva.css
deleted file mode 100644
index 8f3a291..0000000
--- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/enunciate/archiva.css
+++ /dev/null
@@ -1,765 +0,0 @@
-/*
-Copyright 2015 The Apache Software Foundation.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-/* 
-    Created on : 13 nov. 2015, 13:47:57
-    Author     : barboni
-*/
-/**
- * html5doctor.com Reset Stylesheet (Eric Meyer's Reset Reloaded + HTML5 baseline)
- * v1.6.1 2010-09-17 | Authors: Eric Meyer & Richard Clark
- * html5doctor.com/html-5-reset-stylesheet/
- */
-
-html, body, div, span, object, iframe,
-h1, h2, h3, h4, h5, h6, p, blockquote, pre,
-abbr, address, cite, code, del, dfn, em, img, ins, kbd, q, samp,
-small, strong, sub, sup, var, b, i, dl, dt, dd, ol, ul, li,
-fieldset, form, label, legend,
-table, caption, tbody, tfoot, thead, tr, th, td,
-article, aside, canvas, details, figcaption, figure,
-footer, header, hgroup, menu, nav, section, summary,
-time, mark, audio, video {
-  margin: 0;
-  padding: 0;
-  border: 0;
-  font-size: 100%;
-  font: inherit;
-  vertical-align: baseline;
-}
-
-article, aside, details, figcaption, figure,
-footer, header, hgroup, menu, nav, section {
-  display: block;
-}
-
-blockquote, q { quotes: none; }
-
-blockquote:before, blockquote:after,
-q:before, q:after { content: ""; content: none; }
-
-ins { background-color: #ff9; color: #000; text-decoration: none; }
-
-mark { background-color: #ff9; color: #000; font-style: italic; font-weight: bold; }
-
-del { text-decoration: line-through; }
-
-abbr[title], dfn[title] { border-bottom: 1px dotted; cursor: help; }
-
-table { border-collapse: collapse; border-spacing: 0; }
-
-hr { display: block; height: 1px; border: 0; border-top: 1px solid #ccc; margin: 1em 0; padding: 0; }
-
-input, select { vertical-align: middle; }
-
-
-/**
- * Font normalization inspired by YUI Library's fonts.css: developer.yahoo.com/yui/
- */
-
-body { font:13px/1.231 sans-serif; *font-size:small; } /* Hack retained to preserve specificity */
-select, input, textarea, button { font:99% sans-serif; }
-
-/* Normalize monospace sizing:
-   en.wikipedia.org/wiki/MediaWiki_talk:Common.css/Archive_11#Teletype_style_fix_for_Chrome */
-pre, code, kbd, samp { font-family: monospace, sans-serif; }
-
-
-/**
- * Minimal base styles.
- */
-
-/* Always force a scrollbar in non-IE */
-html { overflow-y: scroll; }
-
-/* Accessible focus treatment: people.opera.com/patrickl/experiments/keyboard/test */
-a:hover, a:active { outline: none; }
-
-ul, ol { margin-left: 2em; }
-ol { list-style-type: decimal; }
-
-/* Remove margins for navigation lists */
-nav ul, nav li { margin: 0; list-style:none; list-style-image: none; }
-
-small { font-size: 85%; }
-strong, th { font-weight: bold; }
-
-td { vertical-align: top; }
-
-/* Set sub, sup without affecting line-height: gist.github.com/413930 */
-sub, sup { font-size: 75%; line-height: 0; position: relative; }
-sup { top: -0.5em; }
-sub { bottom: -0.25em; }
-
-pre {
-  /* www.pathf.com/blogs/2008/05/formatting-quoted-code-in-blog-posts-css21-white-space-pre-wrap/ */
-  padding: 15px;
-}
-
-textarea { overflow: auto; } /* www.sitepoint.com/blogs/2010/08/20/ie-remove-textarea-scrollbars/ */
-
-.ie6 legend, .ie7 legend { margin-left: -7px; } 
-
-/* Align checkboxes, radios, text inputs with their label by: Thierry Koblentz tjkdesign.com/ez-css/css/base.css  */
-input[type="radio"] { vertical-align: text-bottom; }
-input[type="checkbox"] { vertical-align: bottom; }
-.ie7 input[type="checkbox"] { vertical-align: baseline; }
-.ie6 input { vertical-align: text-bottom; }
-
-/* Hand cursor on clickable input elements */
-label, input[type="button"], input[type="submit"], input[type="image"], button { cursor: pointer; }
-
-/* Webkit browsers add a 2px margin outside the chrome of form elements */
-button, input, select, textarea { margin: 0; }
-
-/* Colors for form validity */
-input:valid, textarea:valid   {  }
-input:invalid, textarea:invalid {
-   border-radius: 1px; -moz-box-shadow: 0px 0px 5px red; -webkit-box-shadow: 0px 0px 5px red; box-shadow: 0px 0px 5px red;
-}
-.no-boxshadow input:invalid, .no-boxshadow textarea:invalid { background-color: #f0dddd; }
-
-
-/* These selection declarations have to be separate
-   No text-shadow: twitter.com/miketaylr/status/12228805301
-   Also: hot pink! */
-::-moz-selection{ background: #FF5E99; color:#fff; text-shadow: none; }
-::selection { background:#FF5E99; color:#fff; text-shadow: none; }
-
-/* j.mp/webkit-tap-highlight-color */
-a:link { -webkit-tap-highlight-color: #FF5E99; }
-
-/* Make buttons play nice in IE:
-   www.viget.com/inspire/styling-the-button-element-in-internet-explorer/ */
-button {  width: auto; overflow: visible; }
-
-/* Bicubic resizing for non-native sized IMG:
-   code.flickr.com/blog/2008/11/12/on-ui-quality-the-little-things-client-side-image-resizing/ */
-.ie7 img { -ms-interpolation-mode: bicubic; }
-
-/**
- * You might tweak these..
- */
-
-body, select, input, textarea {
-  /* #444 looks better than black: twitter.com/H_FJ/statuses/11800719859 */
-  color: #444;
-  /* Set your base font here, to apply evenly */
-  /* font-family: Georgia, serif;  */
-}
-
-/* Headers (h1, h2, etc) have no default font-size or margin; define those yourself */
-h1, h2, h3, h4, h5, h6 { font-weight: bold; }
-
-a, a:active, a:visited { color: #607890; }
-a:hover { color: #036; }
-
-
-/**
- * Primary styles
- *
- * Author: 
- */
-
-
-body{text-align:center;margin:0}
-.container{text-align:left;position:relative;padding:0;margin:0 auto;width:800px}
-.column{float:left;margin:0 5px 0 0;padding:0}
-* html .column{overflow-x:hidden}
-.border{padding-right:2px;margin-right:2px;border-right:1px solid #ddd}
-.span-1{width:35px}
-.span-2{width:75px}
-.span-3{width:115px}
-.span-4{width:155px}
-.span-5{width:195px}
-.span-6{width:235px}
-.span-7{width:275px}
-.span-8{width:315px}
-.span-9{width:355px}
-.span-10{width:395px}
-.span-11{width:435px}
-.span-12{width:475px}
-.span-13{width:515px}
-.span-14{width:555px}
-.span-15{width:595px}
-.span-16{width:635px}
-.span-17{width:675px}
-.span-18{width:715px}
-.span-19{width:755px}
-.span-20{width:795px}
-.span-21{width:835px}
-.span-22{width:875px}
-.span-23{width:915px}
-.span-24{width:955px;margin:0}
-.last{margin-right:0}
-.append-1{padding-right:40px}
-.append-2{padding-right:80px}
-.append-3{padding-right:120px}
-.append-4{padding-right:160px}
-.append-5{padding-right:200px}
-.prepend-1{padding-left:40px}
-.prepend-2{padding-left:80px}
-.prepend-3{padding-left:120px}
-.prepend-4{padding-left:160px}
-.prepend-5{padding-left:200px}
-.clear{display:inline-block}
-.clear:after,.container:after{content:".";display:block;height:0;clear:both;visibility:hidden}
-* html .clear{height:1%}
-.clear{display:block}
-h1,h2,h3,h4,h5,h6, p,ul,ol,dl,pre,form{padding-left:5px;padding-right:5px}
-table{margin-left:5px;margin-right:5px}
-img{margin:0 0 18px 0}
-.pull-1{margin-left:-70px}
-.pull-2{margin-left:-140px}
-.pull-3{margin-left:-210px}
-.push-0{margin:0 0 0 18px;float:right}
-.push-1{margin:0 -70px 0 18px;float:right}
-.push-2{margin:0 -140px 0 18px;float:right}
-.push-3{margin:0 -210px 0 18px;float:right}
-.deprecated{text-decoration: line-through}
-
-/* @end */
-
-/* @group typography.css */
-
-body {
-  font-size: 12px;
-  line-height: 18px; /* Do a complete find/replace on "18px" to change this */
-}
-
-
-/* Default fonts */
-h1,h2,h3,
-h4,h5,h6  { font-family: "Helvetica Neue", Helvetica, sans-serif; }
-body      { font-family: "Lucida Grande", Calibri, Arial, sans-serif; }
-pre       { font-family: Monaco, "Courier New", monospace; }
-code      { font-family: Consolas, "Bitstream Vera Sans Mono", "Courier New", Monaco, Courier, monospace; }
-
-
-/* Headings
--------------------------------------------------------------- */
-
-h1,h2,h3,h4,h5,h6 {
-  color:#111;
-  clear:both;
-}
-
-h1 a, h2 a, h3 a, h4 a, h5 a, h6 a {
-    color: #111;
-    text-decoration: none;
-}
-
-h1 { font-size: 30px; line-height:36px; padding:10px 0 18px 0; }
-h2 { font-size: 20px; line-height:36px; }
-h3 { font-size: 12px; line-height:24px; }
-h4 { font-size: 12px; font-weight:bold; }
-h5 { font-size: 12px; font-weight:bold; }
-h6 { font-size: 12px; }
-
-
-/* Text elements
--------------------------------------------------------------- */
-
-p           { margin: 0 0 18px 0; text-align:justify; }
-p.last      { margin-bottom:0; }
-p img       { float: left; margin:18px 18px 18px 0; padding:0; }
-p img.top   { margin-top:0; } /* Use this if the image is at the top of the <p>. */
-
-ul, ol      { margin: 0 0 18px 0; }
-ul          { list-style-type:circle; }
-ol          { list-style-type: decimal; }
-dl          { margin: 0 0 18px 0; }
-dl dt       { font-weight: bold; }
-
-a           { color: #A68000; text-decoration: underline; outline: none; }
-a:hover     { color: #000; }
-
-blockquote  { margin: 0 0 18px 18px; color: #666; font-style: italic; }
-strong      { font-weight: bold; }
-em          { font-style: italic; }
-pre         { margin-bottom: 18px; background: #eee; border:1px solid #ddd; padding:16px; }
-code {
-    background: #eee;
-    border: 1px solid #ddd;
-    color: #555;
-    display: block;
-    font: normal 1.1em "Lucida Sans Unicode",serif;
-    margin-bottom: 12px;
-    padding: 8px 10px;
-    white-space: pre;
-    overflow: auto;
-    max-height: 300px;
-}
-
-/* Use this to create a horizontal ruler across a column. */
-hr {
-  background: #FFDF73;
-  color: #FFDF73;
-  clear: both;
-  float: none;
-  width: 100%;
-  height: 2px;
-  margin: 0 0 16px 0;
-  border: none;
-}
-
-
-/* Tables
--------------------------------------------------------------- */
-
-table   { margin-bottom: 16px; border-top:1px solid #ddd; border-left:1px solid #ddd; }
-th,td   { height: 13px; padding:2px 4px; border-bottom:1px solid #ddd; border-right:1px solid #ddd; }
-th      { font-weight:bold; }
-
-
-/* Some default classes
--------------------------------------------------------------- */
-
-p.small   { font-size: 10px; margin-bottom: 18px; }
-p.large   { font-size: 14px; line-height:36px; }
-p.quiet   { color: #666; }
-.hide     { display: none; }
-
-
-.caps {
-  font-variant: small-caps;
-  letter-spacing: 1px;
-  text-transform: lowercase;
-}
-
-/* @end */
-
-/* @group styles */
-
-/* @group Header */
-
-#header {
-	padding-top: 1.8em;
-	margin-bottom: 1.8em;
-}
-#site-name {
-    line-height: 36px;
-}
-#site-name a {
-    font-variant: small-caps;
-    font-size: 3em;
-    letter-spacing: 3px;
-    text-decoration: none;
-    color: #444;
-}
-#site-name a:visited {
-    color: #444;
-    text-decoration: none;
-}
-#site-name a strong {
-    color: black;
-}
-#site-description {
-	padding-top: 1.4em;
-	padding-bottom: 1.4em;
-}
-#site-description h3 {
-	font-size: 2em;
-	margin: 0;
-	font-weight: normal;
-}
-#site-description p#read-more {
-	text-align: right;
-	margin: 6px 0 0;
-}
-#site-description p#read-more a, #site-description p#read-more a:visited {
-	font-size: 1.4em;
-	color: #515151;
-}
-#site-description p#read-more a:hover {
-	color: #919191;
-}
-#site-description {
-	background-color: #4188D2;
-	border-top: 2px solid #fff;
-	color: #444;
-}
-/* @end */
-
-/* @group Navigation */
-
-ul.navigation, ul.navigation li {
-  list-style: none;
-}
-ul.navigation li {
-  display: inline;
-  margin-right: 1.3em;
-}
-
-#primary {
-	line-height: 72px;
-	margin-bottom: -24px;
-	text-align: right;
-}
-#primary li {
-	padding-bottom: 5px;
-}
-#primary a {
-	color: #444;
-	text-decoration: none;
-	font-size: 1.2em;
-}
-#primary li:hover {
-	border-bottom: 6px solid #FFDF73;
-}
-#secondary {
-	padding-top: 7px;
-	background-color: #FFDF73;
-}
-#secondary ul {
-    list-style: none;
-	margin-bottom: 7px;
-}
-#secondary ul li {
-    display: inline;
-    list-style: none;
-	margin-right: 0;
-}
-#secondary ul li a {
-	color: #515151;
-	text-decoration: none;
-	padding: 8px 24px 8px 24px;
-	margin-left: -4px;
-}
-#secondary ul li a.selected {
-	background-color: #515151;
-	color: #fff;
-}
-#secondary ul a:hover {
-	background: #fff4d0;
-}
-/*
-	xBreadcrumbs (Extended Breadcrumbs) jQuery Plugin
-	� 2009 ajaxBlender.com
-	For any questions please visit www.ajaxblender.com
-	or email us at support@ajaxblender.com
-*/
-.xbreadcrumbs {
-	position: relative;
-	z-index: 1000;
-}
-.xbreadcrumbs LI UL {
-	position: absolute;
-	float: left;
-}
-.xbreadcrumbs, .xbreadcrumbs LI, .xbreadcrumbs UL, .xbreadcrumbs UL LI {
-	list-style: none;
-	margin: 0;
-	padding: 0;
-}
-.xbreadcrumbs { clear: both; }
-.xbreadcrumbs, .xbreadcrumbs LI {
-	float: left;
-}
-.xbreadcrumbs UL {
-	display: none;
-}
-
-/*  Base style of xBreadcrumbs  */
-/*  Top Level  */
-.xbreadcrumbs {
-	background: #FFDF73;
-	width: 100%;
-}
-.xbreadcrumbs LI {
-    border-right: none;
-    padding: 5px 15px 5px 10px;
-	height: 16px;
-}
-.xbreadcrumbs LI.current {
-	background: none;
-}
-.xbreadcrumbs LI UL LI {
-    background: none;
-}
-.xbreadcrumbs LI A {
-	font-size: 11px;
-	color: #515151;
-	text-decoration: none;
-    padding-right: 2em;
-}
-.xbreadcrumbs LI A.home {
-    background: url( home.gif ) no-repeat left center;
-    padding-left: 20px;
-}
-.xbreadcrumbs LI A:HOVER, .xbreadcrumbs LI.hover A {
-	color: #000;
-}
-/*  Top Level - Current Page  */
-.xbreadcrumbs LI.current A {
-	color: #333333;
-	font-weight: bold;
-}
-/*  Sub-level  */
-.xbreadcrumbs LI UL {
-	padding: 3px;
-	background: #fff4d0;
-	font-size: 11px;
-	min-width: 180px;
-    max-height: 500px;
-    overflow: auto;
-	top: 25px;
-}
-.xbreadcrumbs LI UL LI {
-	float: left;
-	width: 100%;
-	border-right: none;
-	height: auto;
-}
-.xbreadcrumbs LI UL LI A {
-	text-decoration: none;
-	color: #666666 !important;
-	display: block;
-	padding: 4px;
-	border-bottom: 1px dotted #666666;
-}
-.xbreadcrumbs LI UL LI:last-child A {
-	border-bottom: none;
-}
-.xbreadcrumbs LI UL LI A:HOVER {
-    background: #fffbee;
-}
-body.advisories #nav-advisories,body.community #nav-community,body.blog #nav-blog,body.code #nav-code,body.about #nav-about,body.documentation #nav-documentation{border-bottom: 6px solid #FFDF73;}
-/* @end */
-
-/* @group Main */
-
-#main {
-	font-size: 1.2em;
-	line-height: 1.5em;
-	color: #1E250D;
-}
-#main h2 {
-	font-size: 1.8em;
-	font-weight: normal;
-    border-bottom: 3px solid #c2b2d4;
-    padding-top: 10px;
-	padding-left: 0;
-	padding-right: 0;
-	margin-bottom: 6px;
-}
-#main h3 {
-	font-size: 1.4em;
-	font-weight: normal;
-	border-bottom: 4px solid #f7f7f7;
-	padding: 0 0 5px;
-	margin-bottom: 0.4em;
-}
-#main h3 .caps {
-	font-size: 1.3em;
-}
-#main .hfeed .hentry {
-	list-style: none;
-	list-style-type: none;
-	margin-bottom: 2em;
-	border-bottom: 4px solid #eee;
-	padding-bottom: 1em;
-	clear: both;
-}
-#main .hfeed .hentry:last-child {
-	border-bottom: none;
-}#main .hfeed .hentry .entry-title {
-	border-bottom: none;
-}
-#main hr {
-	color: #FFDF73;
-	background-color: #FFDF73;
-	border-color: #FFDF73;
-}
-#main p {
-	text-align: left;
-	padding-left: 0;
-	padding-right: 0;
-}
-#main img {
-	max-width: 740px;
-}
-#main ol {
-	margin-left: 1.5em;
-}
-#main ul {
-	margin-left: 1.2em;
-	list-style: disc;
-}
-#main .intro {
-	font-size: 1.2em;
-	color: #515151;
-	border-bottom: 3px solid #f8fbfd;
-}
-#main .get-started a {
-	text-align: center;
-	background-color: #8942D6;
-	color: #fff;
-	display: block;
-	border-radius: 12px;
-	-webkit-border-radius: 12px;
-	-moz-border-radius: 12px;
-	padding: 8px 6px;
-	width: 10em;
-	font-size: 1.4em;
-	margin-left: auto;
-	margin-right: auto;
-	text-decoration: none;
-}
-#main .get-started a:hover {
-	background-color: #9D69D6;
-}
-#main pre {
-    max-height: 600px;
-	overflow: auto;
-}
-
-/* @end */
-/* @group Footer */
-
-#footer {
-	color: #666;
-	font-size: 11px;
-	border-top: 4px double #e7e7e7;
-	margin-top: 2em;
-	padding-top: 1.2em;
-	text-align: center;
-}
-/*#footer a {
-	color: #787878;
-	text-decoration: none;
-	border-bottom: 1px dotted #787878;
-}
-#footer a:hover {
-	border-bottom: 1px solid #787878;
-}*/
-
-/* @end */
-
-.update, .note, .notice, .alert {
-margin: 10px 0 20px;
-padding: 5px 20px 5px 20px;
-clear: both;
-}
-.note {
-	background: #e6ecf2;
-	border-top: 2px solid #8996ad;
-	border-bottom: 2px solid #8996ad;
-}
-.update, .notice {
-	background: #92ED6B;
-	border-top: 2px solid #2B8E00;
-	border-bottom: 2px solid #2B8E00;
-}
-.alert {
-	background: #ffbfbf;
-	border-top: 2px solid #f33;
-	border-bottom: 2px solid #f33;
-}
-.alert a {
-	color:#f00;
-}
-.alert a:visited {
-	color: #f33;
-}
-
-/* JavaDoc-Specific Styles */
-.TableHeadingColor     { text-align: left; border-width: 0 }
-.TableSubHeadingColor  { text-align: left; border-width: 0 }
-.TableRowColor         { text-align: left; border-width: 0 }
-.NavBarCell1    { text-align: left; border-width: 0 }
-.NavBarCell1Rev { text-align: left; border-width: 0 }
-.FrameItemFont { text-align: left; }
-
-/* @end */
-
-
-
-/**
- * Non-semantic helper classes: please define your styles before this section.
- */
-
-/* For image replacement */
-.ir { display: block; text-indent: -999em; overflow: hidden; background-repeat: no-repeat; text-align: left; direction: ltr; }
-
-/* Hide for both screenreaders and browsers:
-   css-discuss.incutio.com/wiki/Screenreader_Visibility */
-.hidden { display: none; visibility: hidden; }
-
-/* Hide only visually, but have it available for screenreaders: by Jon Neal.
-  www.webaim.org/techniques/css/invisiblecontent/  &  j.mp/visuallyhidden */
-.visuallyhidden { border: 0; clip: rect(0 0 0 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; }
-/* Extends the .visuallyhidden class to allow the element to be focusable when navigated to via the keyboard: drupal.org/node/897638 */
-.visuallyhidden.focusable:active,
-.visuallyhidden.focusable:focus { clip: auto; height: auto; margin: 0; overflow: visible; position: static; width: auto; }
-
-/* Hide visually and from screenreaders, but maintain layout */
-.invisible { visibility: hidden; }
-
-/* The Magnificent Clearfix: Updated to prevent margin-collapsing on child elements.
-   j.mp/bestclearfix */
-.clearfix:before, .clearfix:after { content: "\0020"; display: block; height: 0; overflow: hidden; }
-.clearfix:after { clear: both; }
-/* Fix clearfix: blueprintcss.lighthouseapp.com/projects/15318/tickets/5-extra-margin-padding-bottom-of-page */
-.clearfix { zoom: 1; }
-
-
-
-/**
- * Media queries for responsive design.
- *
- * These follow after primary styles so they will successfully override.
- */
-
-@media all and (orientation:portrait) {
-  /* Style adjustments for portrait mode goes here */
-
-}
-
-@media all and (orientation:landscape) {
-  /* Style adjustments for landscape mode goes here */
-
-}
-
-/* Grade-A Mobile Browsers (Opera Mobile, Mobile Safari, Android Chrome)
-   consider this: www.cloudfour.com/css-media-query-for-mobile-is-fools-gold/ */
-@media screen and (max-device-width: 480px) {
-
-
-  /* Uncomment if you don't want iOS and WinMobile to mobile-optimize the text for you: j.mp/textsizeadjust */
-  /* html { -webkit-text-size-adjust:none; -ms-text-size-adjust:none; } */
-}
-
-
-/**
- * Print styles.
- *
- * Inlined to avoid required HTTP connection: www.phpied.com/delay-loading-your-print-css/
- */
-@media print {
-  * { background: transparent !important; color: black !important; text-shadow: none !important; filter:none !important;
-  -ms-filter: none !important; } /* Black prints faster: sanbeiji.com/archives/953 */
-  a, a:visited { color: #444 !important; text-decoration: underline; }
-  a[href]:after { content: " (" attr(href) ")"; }
-  abbr[title]:after { content: " (" attr(title) ")"; }
-  .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; }  /* Don't show links for images, or javascript/internal links */
-  pre, blockquote { border: 1px solid #999; page-break-inside: avoid; }
-  thead { display: table-header-group; } /* css-discuss.incutio.com/wiki/Printing_Tables */
-  tr, img { page-break-inside: avoid; }
-  @page { margin: 0.5cm; }
-  p, h2, h3 { orphans: 3; widows: 3; }
-  h2, h3{ page-break-after: avoid; }
-}
-
diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/enunciate/archiva.fmt b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/enunciate/archiva.fmt
deleted file mode 100644
index 9d8a114..0000000
--- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/enunciate/archiva.fmt
+++ /dev/null
@@ -1,937 +0,0 @@
-[#ftl]
-<#-- 
-Copyright 2015 The Apache Software Foundation.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-[#-- @ftlvariable name="resourceApis" type="java.util.List<com.webcohesion.enunciate.api.resources.ResourceApi>" --]
-[#-- @ftlvariable name="serviceApis" type="java.util.List<com.webcohesion.enunciate.api.services.ServiceApi>" --]
-[#-- @ftlvariable name="data" type="java.util.List<com.webcohesion.enunciate.api.datatype.Syntax>" --]
-[#-- @ftlvariable name="downloads" type="java.util.List<com.webcohesion.enunciate.api.Download>" --]
-[#-- @ftlvariable name="title" type="java.lang.String" --]
-[#-- @ftlvariable name="indexPageName" type="java.lang.String" --]
-[#-- @ftlvariable name="disableMountpoint" type="java.lang.Boolean" --]
-[#-- @ftlvariable name="apiRelativePath" type="java.lang.String" --]
-[#-- @ftlvariable name="cssFile" type="java.lang.String" --]
-[#-- @ftlvariable name="additionalCssFiles" type="java.util.List<java.lang.String>" --]
-[#-- @ftlvariable name="copyright" type="java.lang.String" --]
-[#-- @ftlvariable name="apiDoc" type="java.lang.String" --]
-[#-- @ftlvariable name="swaggerUI" type="com.webcohesion.enunciate.api.InterfaceDescriptionFile" --]
-[#--set up the subnavigation menus--]
-[#assign nav_sections = { } /]
-[#if resourceApis?size > 0]
-  [#assign nav_sections = nav_sections + { "Resources" : "resources.html" }/]
-[/#if]
-[#if serviceApis?size > 0]
-  [#assign nav_sections = nav_sections + { "Services" : "services.html" }/]
-[/#if]
-[#if data?size > 0]
-  [#list data as syntax]
-    [#assign nav_sections = { syntax.label : syntax.slug + ".html" } /]
-  [/#list]
-[/#if]
-[#if downloads?size > 0]
-  [#assign nav_sections = nav_sections + { "Files and Libraries" : "downloads.html"} /]
-[/#if]
-[#--Basic boilerplate macro.--]
-[#macro boilerplate title=title breadcrumbs=[{"title" : "Home", "href" : indexPageName}] pagenav=[] codeblocks=true]
-<!DOCTYPE html>
-<html lang="en">
-<head>
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge">
-  <meta name="viewport" content="width=device-width, initial-scale=1">
-  <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
-
-  <title>${title}</title>
-
-  <!-- Mobile viewport optimized: j.mp/bplateviewport -->
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-  <!-- Bootstrap core CSS -->
-  <!-- <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css"> -->
-
-  [#if cssFile??]
-  <!--custom css for these pages-->
-  <link rel="stylesheet" href="${cssFile}">
-  [/#if]
-  [#list additionalCssFiles as additionalCssFile]
-  <link rel="stylesheet" href="${additionalCssFile}">
-  [/#list]
-
-  <link href="https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.css" type="text/css">
-
-  <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
-  <!--[if lt IE 9]>
-  <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
-  <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
-  <![endif]-->
-</head>
-
-<body class="home">
- <div class="container">
-  <header>
- 
-   <div id="header" class="column first last span-20">
-        <div id="site-name" class="column span-18 append-1 prepend-1 first last"><a href="${indexPageName}">${title}</a></div>
-        <div id="primary" class="column span-18 append-1 prepend-1 first last">
-          <ul class="navigation">
-            <li id="nav-rest"><a href="resources.html">REST</a></li>
-            <li id="nav-data"><a href="data.html">Data Model</a></li>
-          </ul>
-        </div>
-        <div>
-          <ul class="xbreadcrumbs" id="breadcrumbs">
-[#list breadcrumbs as crumb]
-<li[#if !crumb_has_next] class="current"[/#if]>
- <a href="${crumb.href}"[#if crumb_index = 0] class="home"[/#if]>${crumb.title}</a>[#if crumb_has_next] &gt;[/#if]
-
-            </li>
-          [/#list]
-          </ul>
-        </div>
-      </div>
-  <!--<nav class="navbar navbar-inverse navbar-fixed-top">
-    <div class="container-fluid">
-      <div class="navbar-header">
-        <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar">
-          <span class="sr-only">Toggle navigation</span>
-          <span class="icon-bar"></span>
-          <span class="icon-bar"></span>
-          <span class="icon-bar"></span>
-        </button>
-        <a class="navbar-brand" href="${indexPageName}">${title}</a>
-      </div>
-      <div id="navbar" class="navbar-collapse collapse">
-        <ul class="nav navbar-nav navbar-right">
-  [#if serviceApis?size > 0]
-          <li><a href="services.html">Services</a></li>
-  [/#if]
-  [#if resourceApis?size > 0]
-          <li><a href="resources.html">Resources</a></li>
-  [/#if]
-  [#if data?size > 0]
-          <li><a href="data.html">Data Types</a></li>
-  [/#if]
-  [#if downloads?size > 0]
-          <li><a href="downloads.html">Files and Libraries</a></li>
-  [/#if]
-        </ul>
-      </div>
-    </div>
-  </nav>-->
- </header>
-  <div id="main" class="column first last span-20">
-  
-        [#nested/]
-        
-        <footer>
-          <div class="footer">
-            [#if copyright??]Copyright &copy; <script type="text/javascript" language="javascript">d = new Date;document.write(d.getFullYear());</script> <span xmlns:cc="http://creativecommons.org/ns#" property="cc:attributionName">${copyright}</span>. [/#if]Generated by <a href="http://enunciate.webcohesion.com">Enunciate</a>.
-          </div>
-        </footer>
-
-      </div>
-    
-  </div>
-
-
-  <!-- JavaScript placed at the end of the document so the pages load faster. -->
-  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
-
-  
-  <!-- prettify code blocks. see http://code.google.com/p/google-code-prettify/ -->
-  <script src="https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/run_prettify.js" type="text/javascript"></script>
-  
-
-</body>
-</html>
-[/#macro]
-[#--Macro that wraps its text in a deprecated <s> tag if the element is deprecated.--]
-[#macro deprecation element]
-  [#assign deprecated=(element?? && element.deprecated??)/]
-  [#if deprecated]<s>[/#if][#nested/][#if deprecated]</s>[/#if]
-[/#macro]
-[@file name=indexPageName]
-  [#assign pagenav=[]/]
-  [#if resourceApis?size > 0]
-    [#assign pagenav=pagenav + [{ "href" : "#resources", "title" : "Resources" }]/]
-  [/#if]
-  [#if serviceApis?size > 0]
-    [#assign pagenav=pagenav + [{ "href" : "#services", "title" : "Services" }]/]
-  [/#if]
-  [#list data as syntax]
-    [#assign pagenav=pagenav + [{ "href" : "#" + syntax.slug, "title" : syntax.label }]/]
-  [/#list]
-  [@boilerplate pagenav=pagenav]
-    [#if apiDoc??]
-  <div class="jumbotron">
-    <div class="container">
-      ${apiDoc}
-    </div>
-  </div>
-    [/#if]
-    [#if resourceApis?size > 0]
-
-  <h1 class="page-header" id="resources">Resources</h1>
-      [#list resourceApis as resourceApi]
-        [#if downloads?size > 0]
-
-  <p>
-    The resources use a data model that is supported by a set of client-side libraries that are made available on the
-    <a href="downloads.html">files and libraries</a> page.
-  </p>
-        [/#if]
-        [#if resourceApi.wadlFile??]
-
-  <p>
-    There is a <a href="${resourceApi.wadlFile.href}">WADL document</a> available that describes the resources API.
-  </p>
-        [/#if]
-        [#if swaggerUI??]
-
-  <p>
-    You may also enjoy the <a href="${swaggerUI.href}">Swagger UI</a> provided for this API.
-  </p>
-        [/#if]
- <ul>
- [#list resourceApi.resourceGroups as resourceGroup]
- [@processResourceGroup resourceGroup=resourceGroup/]
-<li><a href="${resourceGroup.slug}.html">${resourceGroup.label}</a></li>
-      
- [/#list]
-  </ul>
-  
-      [/#list]
-    [/#if]
-    [#if serviceApis?size > 0]
-
-  <h1 class="page-header" id="services">Services</h1>
-      [#list serviceApis as serviceApi]
-        [#list serviceApi.serviceGroups as serviceGroup]
-
-  <table class="table table-hover">
-    <caption>Namespace <code>${serviceGroup.namespace!"(Default)"}</code>[#if serviceGroup.wsdlFile??] (<a href="${serviceGroup.wsdlFile.href}">wsdl</a>)[/#if]</caption>
-    <thead>
-    <tr>
-      <th align="center">name</th>
-      <th align="center">description</th>
-    </tr>
-    </thead>
-    <tbody data-link="row" class="rowlink">
-          [#list serviceGroup.services as service]
-            [@processService service=service/]
-    <tr class="clickable-row" data-href="${service.slug}.html">
-      <td>[@deprecation element=service]${service.label}[/@deprecation]</td>
-      <td>[@deprecation element=service]${service.description!"&nbsp;"}[/@deprecation]</td>
-    </tr>
-          [/#list]
-    </tbody>
-    </table>
-        [/#list]
-      [/#list]
-      [#if downloads?size > 0]
-
-  <p>The services API is also accessible by a set of client-side libraries that can be downloaded from the <a href="downloads.html">files and libraries page</a>.</p>
-      [/#if]
-    [/#if]
-    [#if data?size > 0]
-
-  <h1 class="page-header" id="data">Data Types</h1>
-      [#list data as syntax]
-        [@processDataSyntax syntax=syntax/]
-
-  <h3 id="${syntax.slug}">${syntax.label}</h3>
-        [#list syntax.namespaces as ns]
-          [#if ns.types?size > 0]
-
- 
-            [#if ns.uri?? && ns.uri?length > 0]
-    <p>Namespace <code>${ns.uri}</code>[#if ns.schemaFile??] (<a href="${ns.schemaFile.href}">schema</a>)[/#if]</p>
-            [#else]
-    <p>Default Namespace [#if ns.schemaFile??] (<a href="${ns.schemaFile.href}">schema</a>)[/#if]</p>
-            [/#if]
-    <ul>
-          [#list ns.types?sort_by("label") as type]
-    <li><a href="${type.slug}.html">${type.label}</a></li>
-     
-          [/#list]
-  </ul>
-   
-          [/#if]
-        [/#list]
-      [/#list]
-    [/#if]
-  [/@boilerplate]
-[/@file]
-[@file name="data.html"]
-  [#assign pagenav=[]/]
-  [#list data as syntax]
-    [#assign pagenav=pagenav + [{ "href" : "#" + syntax.slug, "title" : syntax.label }]/]
-  [/#list]
-  [@boilerplate title=title + ": Data Types" breadcrumbs=[{"title" : "Home", "href" : indexPageName}, {"title" : "Data Types" , "href" : "data.html"}] pagenav=pagenav]
-  <h1 class="page-header" id="data">Data Types</h1>
-    [#list data as syntax]
-
-  <h3 id="${syntax.slug}">${syntax.label}</h3>
-      [#list syntax.namespaces as ns]
-        [#if ns.types?size > 0]
-
- 
-          [#if ns.uri?? && ns.uri?length > 0]
-  <p>Namespace <code>${ns.uri}</code>[#if ns.schemaFile??] (<a href="${ns.schemaFile.href}">schema</a>)[/#if]</p>
-          [#else]
-  <p>Default Namespace [#if ns.schemaFile??] (<a href="${ns.schemaFile.href}">schema</a>)[/#if]</p>
-          [/#if]
-  
-  <ul>
-          [#list ns.types as type]
-    <li><a href="${type.slug}.html">${type.label}</a></li>
-     
-          [/#list]
-  </ul>
- 
-        [/#if]
-      [/#list]
-    [/#list]
-  [/@boilerplate]
-[/@file]
-[#if downloads?size > 0]
-  [@file name="downloads.html"]
-    [#assign pagenav=[]/]
-    [#list downloads as download]
-      [#assign pagenav=pagenav + [{ "href" : "#" + download.slug, "title" : download.name }]/]
-    [/#list]
-    [@boilerplate title=title + ": Files and Libraries" breadcrumbs=[{"title" : "Home", "href" : indexPageName}, { "title" : "Files and Libraries" , "href" : "downloads.html"}] codeblocks=true pagenav=pagenav]
-  <h1 class="page-header">Files and Libraries</h1>
-
-      [#list downloads as download]
-  <h3 id="${download.slug}">${download.name}</h3>
-        [#if download.created??]
-  <p class="lead">Created ${download.created?date?string.long}</p>
-        [/#if]
-        [#if download.description??]
-  <p>${download.description}</p>
-        [/#if]
-  <table class="table table-hover">
-    <caption>Files</caption>
-    <thead>
-    <tr>
-      <th>name</th>
-      <th>size</th>
-      <th>description</th>
-    </tr>
-    </thead>
-    <tbody data-link="row" class="rowlink">
-        [#list download.files as file]
-    <tr class="clickable-row" data-href="${file.name}">
-      <td>${file.name}</td>
-      <td>${file.size}</td>
-      <td>${file.description!"&nbsp;"}</td>
-    </tr>
-        [/#list]
-    </tbody>
-  </table>
-      [/#list]
-    [/@boilerplate]
-  [/@file]
-[/#if]
-[#if resourceApis?size > 0]
-  [@file name="resources.html"]
-    [@boilerplate title=title + ": Resources" breadcrumbs=[{"title" : "Home", "href" : indexPageName}, {"title" : "Resources" , "href" : "resources.html"}]]
-  <h1 class="page-header" id="resources">Resources</h1>
-
-      [#list resourceApis as resourceApi]
-        [#if downloads?size > 0]
-  <p>
-    The resources use a data model that is supported by a set of client-side libraries that are made available on the
-    <a href="downloads.html">files and libraries</a> page.
-  </p>
-        [/#if]
-        [#if resourceApi.wadlFile??]
-  <p>
-    There is a <a href="${resourceApi.wadlFile.href}">WADL document</a> available that describes the resources API.
-  </p>
-        [/#if]
-        [#if swaggerUI??]
-  <p>
-    You may also enjoy the <a href="${swaggerUI.href}">Swagger UI</a> provided for this API.
-  </p>
-        [/#if]
-
-  <ul>
- [#list resourceApi.resourceGroups as resourceGroup]
-<li><a href="${resourceGroup.slug}.html">${resourceGroup.label}</a></li>
-      
- [/#list]
-  </ul>
- 
-      [/#list]
-    [/@boilerplate]
-  [/@file]
-[/#if]
-[#if serviceApis?size > 0]
-  [@file name="services.html"]
-    [@boilerplate title=title + ": Services" breadcrumbs=[{"title" : "Home", "href" : indexPageName}, {"title" : "Services" , "href" : "services.html"}]]
-  <h1 class="page-header" id="services">Services</h1>
-      [#list serviceApis as serviceApi]
-        [#list serviceApi.serviceGroups as serviceGroup]
-
-  <table class="table table-hover">
-  <caption>Namespace <code>${serviceGroup.namespace}</code>[#if serviceGroup.wsdlFile??] (<a href="${serviceGroup.wsdlFile.href}">wsdl</a>)[/#if]</caption>
-  <thead>
-    <tr>
-      <th align="center">name</th>
-      <th align="center">description</th>
-    </tr>
-  </thead>
-  <tbody data-link="row" class="rowlink">
-         [#list serviceGroup.services as service]
-    <tr class="clickable-row" data-href="${service.slug}.html">
-      <td>[@deprecation element=service]${service.label}[/@deprecation]</td>
-      <td>[@deprecation element=service]${service.description!"&nbsp;"}[/@deprecation]</td>
-    </tr>
-          [/#list]
-  </tbody>
-  </table>
-        [/#list]
-      [/#list]
-      [#if downloads?size > 0]
-
-  <p>The services API is also accessible by a set of client-side libraries that can be downloaded from the <a href="downloads.html">files and libraries page</a>.</p>
-      [/#if]
-    [/@boilerplate]
-  [/@file]
-[/#if]
-[#macro processResourceGroup resourceGroup]
-  [#assign pagenav=[]/]
-  [#list resourceGroup.resources as resource]
-    [#list resource.methods as method]
-      [#assign pagenav=pagenav + [{ "href" : "#" + method.slug, "title" : method.label + " " + resource.path }]/]
-    [/#list]
-  [/#list]
-  [#-- @ftlvariable name="resourceGroup" type="com.webcohesion.enunciate.api.resources.ResourceGroup" --]
-  [@file name=resourceGroup.slug + ".html"]
-    [@boilerplate title=title + ": " + resourceGroup.label breadcrumbs=[{"title" : "Home", "href" : indexPageName}, {"title" : "Resources" , "href" : "resources.html"}, {"title" : resourceGroup.label , "href" : resourceGroup.slug + ".html"}] pagenav=pagenav]
-      <h1 class="page-header">${resourceGroup.label} <small>Resource</small></h1>
-      [#if resourceGroup.description??]
-
-      <p>${resourceGroup.description}</p>
-      [/#if]
-      <ul>
-      [#list resourceGroup.resources?sort_by("path") as resource]
-[#list resource.methods as method]
-        <li><a href="#${method.slug}">${apiRelativePath}${resourceGroup.contextPath!""}${resource.path}</a></li>
-[/#list]
-      [/#list]
-      </ul>
-      [#list resourceGroup.resources?sort_by("path") as resource]
-        [#if resource.since?? || resource.version??]
-
-      <dl class="dl-horizontal">
-        [#if resource.since??]
-        <dt>Available Since</dt>
-        <dd>${resource.since}</dd>
-        [/#if]
-        [#if resource.version??]
-        <dt>Version</dt>
-        <dd>${resource.version}</dd>
-        [/#if]
-      </dl>
-        [/#if]
-        [#list resource.methods as method]
-
-      <div id="${method.slug}">
-        <h2>${method.label} <small>${resource.path} <a href="${apiRelativePath}${resourceGroup.contextPath!""}${resource.path}" class="glyphicon glyphicon-new-window" target="_blank"></a></small></h2>
-          [#if resourceGroup.deprecated?? || method.deprecated??]
-
-        <div class="alert alert-danger">This method has been deprecated. [#if method.deprecated??] ${method.deprecated!""}[#else] ${resource.deprecated!""}[/#if]</div>
-          [/#if]
-          [#if method.description??]
-
-        <p>${method.description}</p>
-          [/#if]
-          [#-- would be nice to enable a "Try it out" link to Swagger. See https://github.com/swagger-api/swagger-spec/issues/239
-          [#if swaggerUI??]
-
-        <p><a href="${swaggerUI.href}#!/${resourceGroup.label?url}/${method.slug}" class="btn btn-default">Try it out!</a></p>
-          [/#if]
-          --]
-          [#if (method.since?? || method.version??)]
-
-        <dl class="dl-horizontal">
-            [#if method.since??]
-          <dt>Available Since</dt>
-          <dd>${method.since}</dd>
-            [/#if]
-            [#if method.version??]
-          <dt>Version</dt>
-          <dd>${method.version}</dd>
-            [/#if]
-        </dl>
-          [/#if]
-          [#if method.parameters?size > 0]
-
-        <table class="table">
-          <caption>Request Parameters</caption>
-          <thead>
-          <tr>
-            <th>name</th>
-            <th>type</th>
-            <th>description</th>
-            <th>default</th>
-          </tr>
-          </thead>
-          <tbody>
-            [#list method.parameters as parameter]
-          <tr>
-            <td>${parameter.name}</td>
-            <td>${parameter.typeLabel}</td>
-            <td>${parameter.description!"&nbsp;"}</td>
-            <td>${parameter.defaultValue!"n/a"}</td>
-          </tr>
-            [/#list]
-          </tbody>
-        </table>
-          [/#if]
-          [#if method.requestEntity??]
-
-        <table class="table">
-          <caption>Request Body</caption>
-          <thead>
-          <tr>
-            <th>media type</th>
-            <th>data type</th>
-            [#if method.requestEntity.description??]
-            <th>description</th>
-            [/#if]
-          </tr>
-          </thead>
-          <tbody>
-            [#list method.requestEntity.mediaTypes as io]
-          <tr>
-            <td><abbr data-toggle="tooltip" data-placement="top" title="Use the &quot;Content-Type: ${io.mediaType}&quot; HTTP header to specify this media type to the server.">${io.mediaType}</abbr></td>
-            <td>[@referenceDataType referenceType=io.dataType!{"label" : "(custom)"}/][#if io.syntax??] (${io.syntax})[/#if]</td>
-              [#if io_index = 0 && method.requestEntity.description??]
-            <td rowspan="${method.requestEntity.mediaTypes?size}">${method.requestEntity.description}</td>
-              [/#if]
-          </tr>
-            [/#list]
-          </tbody>
-        </table>
-          [/#if]
-          [#if method.responseCodes?size > 0]
-
-        <table class="table">
-          <caption>Response Codes</caption>
-          <thead>
-          <tr>
-            <th>code</th>
-            <th>condition</th>
-          </tr>
-          </thead>
-          <tbody>
-            [#list method.responseCodes as responseCode]
-          <tr>
-            <td>${responseCode.code}</td>
-            <td>${responseCode.condition}</td>
-          </tr>
-            [/#list]
-          </tbody>
-        </table>
-          [/#if]
-          [#if method.responseEntity??]
-
-        <table class="table">
-          <caption>Response Body</caption>
-          <thead>
-          <tr>
-            <th>media type</th>
-            <th>data type</th>
-            [#if method.responseEntity.description??]
-            <th>description</th>
-            [/#if]
-          </tr>
-          </thead>
-          <tbody>
-            [#list method.responseEntity.mediaTypes as io]
-          <tr>
-            <td><abbr data-toggle="tooltip" data-placement="top" title="Use the &quot;Accept: ${io.mediaType}&quot; HTTP header to request that this media type be provided by the server.">${io.mediaType}</abbr></td>
-            <td>[@referenceDataType referenceType=io.dataType!{"label" : "(custom)"}/][#if io.syntax??] (${io.syntax})[/#if]</td>
-              [#if io_index = 0 && method.responseEntity.description??]
-            <td rowspan="${method.responseEntity.mediaTypes?size}">${method.responseEntity.description}</td>
-              [/#if]
-          </tr>
-            [/#list]
-          </tbody>
-        </table>
-          [/#if]
-          [#if method.warnings?size > 0]
-
-        <table class="table">
-          <caption>Response Warnings</caption>
-          <thead>
-          <tr>
-            <th>code</th>
-            <th>condition</th>
-          </tr>
-          </thead>
-          <tbody>
-            [#list method.warnings as responseCode]
-          <tr>
-            <td>${responseCode.code}</td>
-            <td>${responseCode.condition}</td>
-          </tr>
-            [/#list]
-          </tbody>
-        </table>
-          [/#if]
-          [#if method.responseHeaders?size > 0]
-
-        <table class="table">
-          <caption>Response Headers</caption>
-          <thead>
-          <tr>
-            <th>name</th>
-            <th>description</th>
-          </tr>
-          </thead>
-          <tbody>
-            [#list method.responseHeaders as header]
-          <tr>
-            <td>${header.name}</td>
-            <td>${header.description!"&nbsp;"}</td>
-          </tr>
-            [/#list]
-          </tbody>
-        </table>
-          [/#if]
-      </div>
-        [/#list]
-      [/#list]
-    [/@boilerplate]
-  [/@file]
-[/#macro]
-[#macro processService service]
-  [#assign pagenav=[]/]
-  [#list service.operations as operation]
-    [#assign pagenav=pagenav + [{ "href" : "#" + operation.slug, "title" : operation.name }]/]
-  [/#list]
-  [#-- @ftlvariable name="service" type="com.webcohesion.enunciate.api.services.Service" --]
-  [@file name=service.slug + ".html"]
-    [@boilerplate title=title + ": " + service.label breadcrumbs=[{"title" : "Home", "href" : indexPageName}, {"title" : service.label , "href" : service.slug + ".html"}] pagenav=pagenav]
-      <h1 class="page-header">${service.label} <small>Service</small></h1>
-      [#if service.deprecated??]
-
-      <div class="alert alert-danger">This service has been deprecated. ${service.deprecated}</div>
-      [/#if]
-      [#if service.description??]
-
-      <p>${service.description}</p>
-      [/#if]
-
-      <dl class="dl-horizontal">
-        [#if service.namespace?? && service.namespace?length > 0]
-        <dt>Namespace</dt>
-        <dd>${service.namespace}</dd>
-        [/#if]
-        [#if service.group.wsdlFile??]
-        <dt>WSDL</dt>
-        <dd><a href="${service.group.wsdlFile.href}">${service.group.wsdlFile.href}</a></dd>
-        [/#if]
-        [#if service.path??]
-        <dt>Path</dt>
-        <dd><a href="${apiRelativePath}${service.path}">${service.path}</a></dd>
-        [/#if]
-        [#if service.since??]
-        <dt>Available Since</dt>
-        <dd>${service.since}</dd>
-        [/#if]
-        [#if service.version??]
-        <dt>Version</dt>
-        <dd>${service.version}</dd>
-        [/#if]
-      </dl>
-      [#list service.operations as operation]
-
-      <h2 id="${operation.slug}">${operation.name} <small>Operation</small></h2>
-        [#if operation.deprecated??]
-
-      <div class="alert alert-danger">This method has been deprecated. ${operation.deprecated}</div>
-        [/#if]
-        [#if operation.description??]
-
-        <p>${operation.description}</p>
-        [/#if]
-        [#if (operation.since?? || operation.version??)]
-
-      <dl class="dl-horizontal">
-          [#if operation.since??]
-        <dt>Available Since</dt>
-        <dd>${operation.since}</dd>
-          [/#if]
-          [#if operation.version??]
-        <dt>Version</dt>
-        <dd>${operation.version}</dd>
-          [/#if]
-      </dl>
-        [/#if]
-        [#if operation.inputParameters?size > 0]
-
-      <table class="table">
-        <caption>Input Parameters</caption>
-        <thead>
-        <tr>
-          <th>name</th>
-          <th>type</th>
-          <th>description</th>
-        </tr>
-        </thead>
-        <tbody>
-          [#list operation.inputParameters as parameter]
-        <tr>
-          <td>${parameter.name}</td>
-          <td>[@referenceDataType referenceType=parameter.dataType/]</td>
-          <td>${parameter.description!"&nbsp;"}</td>
-        </tr>
-          [/#list]
-        </tbody>
-      </table>
-        [/#if]
-        [#if operation.outputParameters?size > 0]
-
-      <table class="table">
-        <caption>Output Parameters</caption>
-        <thead>
-        <tr>
-          <th>name</th>
-          <th>type</th>
-          <th>description</th>
-        </tr>
-        </thead>
-        <tbody>
-          [#list operation.outputParameters as parameter]
-        <tr>
-          <td>${parameter.name}</td>
-          <td>[@referenceDataType referenceType=parameter.dataType/]</td>
-          <td>${parameter.description!"&nbsp;"}</td>
-        </tr>
-          [/#list]
-        </tbody>
-      </table>
-        [/#if]
-        [#if operation.returnType??]
-
-      <table class="table">
-        <caption>Return Value</caption>
-        <thead>
-        <tr>
-          <th>type</th>
-          <th>description</th>
-        </tr>
-        </thead>
-        <tbody>
-        <tr>
-          <td>[#if operation.returnType.slug??]<a href="${operation.returnType.slug}.html">[/#if]${operation.returnType.label}[#if operation.returnType.slug??]</a>[/#if]</td>
-          <td>${operation.returnDescription!"&nbsp;"}</td>
-        </tr>
-        </tbody>
-      </table>
-        [/#if]
-        [#if operation.faults?size > 0]
-
-      <table class="table">
-        <caption>Faults</caption>
-        <thead>
-        <tr>
-          <th>name</th>
-          <th>type</th>
-          <th>description</th>
-        </tr>
-        </thead>
-        <tbody>
-          [#list operation.faults as fault]
-        <tr>
-          <td>${fault.name}</td>
-          <td>[@referenceDataType referenceType=fault.dataType/]</td>
-          <td>${fault.description!"&nbsp;"}</td>
-        </tr>
-          [/#list]
-        </tbody>
-      </table>
-        [/#if]
-      [/#list]
-    [/@boilerplate]
-  [/@file]
-[/#macro]
-[#macro processDataSyntax syntax]
-  [#-- @ftlvariable name="syntax" type="com.webcohesion.enunciate.api.datatype.Syntax" --]
-  [@file name=syntax.slug + ".html"]
-    [@boilerplate title=title + ": " + syntax.label breadcrumbs=[{"title" : "Home", "href" : indexPageName}, {"title" : syntax.label , "href" : syntax.slug + ".html"} ]]
-  <h1 class="page-header">${syntax.label}</h1>
-      [#list syntax.namespaces as ns]
-        [#if ns.types?size > 0]
-
-  <table class="table table-hover">
-          [#if ns.uri?? && ns.uri?length > 0]
-  <caption>Namespace <code>${ns.uri}</code>[#if ns.schemaFile??] (<a href="${ns.schemaFile.href}">schema</a>)[/#if]</caption>
-          [#else]
-  <caption>Default Namespace [#if ns.schemaFile??] (<a href="${ns.schemaFile.href}">schema</a>)[/#if]</caption>
-          [/#if]
-  <thead>
-    <tr>
-      <th align="center">type</th>
-      <th align="center">description</th>
-    </tr>
-  </thead>
-  <tbody data-link="row" class="rowlink">
-          [#list ns.types as type]
-            [@processDataType type=type/]
-    <tr class="clickable-row" data-href="${type.slug}.html">
-      <td>[@deprecation element=type]${type.label}[/@deprecation]</td>
-      <td>[@deprecation element=type]${type.description}[/@deprecation]</td>
-    </tr>
-          [/#list]
-  </tbody>
-  </table>
-        [/#if]
-      [/#list]
-    [/@boilerplate]
-  [/@file]
-[/#macro]
-[#macro processDataType type]
-  [#-- @ftlvariable name="type" type="com.webcohesion.enunciate.api.datatype.DataType" --]
-  [@file name=type.slug + ".html"]
-    [@boilerplate title=title + ": " + type.label breadcrumbs=[{"title" : "Home", "href" : indexPageName}, {"title" : type.syntax.label , "href" : type.syntax.slug + ".html"}, {"title" : type.label , "href" : type.slug + ".html"} ] codeblocks=true]
-      <h1 class="page-header">${type.label} <small>Data Type</small></h1>
-      [#if type.deprecated??]
-
-      <div class="alert alert-danger">This data type has been deprecated. ${type.deprecated}</div>
-      [/#if]
-      [#if type.description??]
-
-      <p>${type.description}</p>
-      [/#if]
-
-      <dl class="dl-horizontal">
-      [#if type.namespace.uri??]
-        <dt>Namespace</dt>
-        [#if type.namespace.uri?length > 0]
-        <dd><code>${type.namespace.uri}</code></dd>
-        [#else]
-        <dd>(Default)</dd>
-        [/#if]
-      [/#if]
-      [#if type.namespace.schemaFile??]
-        <dt>Schema</dt>
-        <dd><a href="${type.namespace.schemaFile.href}">${type.namespace.schemaFile.href}</a></dd>
-      [/#if]
-      [#if type.since??]
-        <dt>Available Since</dt>
-        <dd>${type.since}</dd>
-      [/#if]
-      [#if type.version??]
-        <dt>Version</dt>
-        <dd>${type.version}</dd>
-      [/#if]
-      </dl>
-      [#if type.values??]
-
-      <table class="table">
-        <caption>Values</caption>
-        <thead>
-        <tr>
-          <th>value</th>
-          <th>description</th>
-        </tr>
-        </thead>
-        <tbody>
-          [#list type.values as value]
-        <tr>
-          <td>${value.value}</td>
-          <td>${value.description!"&nbsp;"}</td>
-        </tr>
-          [/#list]
-        </tbody>
-      </table>
-      [/#if]
-      [#if type.properties??]
-
-      <table class="table">
-        <caption>Properties</caption>
-        <thead>
-        <tr>
-          <th>name</th>
-          <th>data type</th>
-        [#list type.propertyMetadata?keys as meta]
-          <th>${type.propertyMetadata[meta]}</th>
-        [/#list]
-          <th>description</th>
-        </tr>
-        </thead>
-        <tbody>
-          [#list type.properties as property]
-        <tr>
-          <td>[@deprecation element=property]${property.name}[/@deprecation]</td>
-          <td>[@deprecation element=property][@referenceDataType referenceType=property.dataType/][/@deprecation]</td>
-            [#list type.propertyMetadata?keys as meta]
-          <td>[@deprecation element=property][@printPropertyMetadata property=property meta=meta/][/@deprecation]</td>
-            [/#list]
-          <td>[@deprecation element=property]${property.description!"&nbsp;"}[/@deprecation]</td>
-        </tr>
-          [/#list]
-        </tbody>
-          [#if type.supertypes??]
-            [#list type.supertypes as supertype]
-              [#if supertype.value?? && supertype.value.properties?? && supertype.value.properties?size > 0]
-        <tr>
-          <td colspan="${3 + type.propertyMetadata?size}"><h5 class="text-muted">Properties inherited from <a href="${supertype.slug}.html">${supertype.label}</a></h5></td>
-        </tr>
-        <tbody>
-                [#list supertype.value.properties as superProperty]
-        <tr>
-          <td>${superProperty.name}</td>
-          <td>[@referenceDataType referenceType=superProperty.dataType/]</td>
-            [#list type.propertyMetadata?keys as meta]
-          <td>[@printPropertyMetadata property=superProperty meta=meta/]</td>
-            [/#list]
-          <td>${superProperty.description!"&nbsp;"}</td>
-        </tr>
-                [/#list]
-        </tbody>
-              [/#if]
-            [/#list]
-          [/#if]
-      </table>
-      [/#if]
-      [#if type.example??]
-
-      <h2>Example</h2>
-
-      <pre class="prettyprint lang-${type.example.lang}">${type.example.body?xhtml}</pre>
-      [/#if]
-    [/@boilerplate]
-  [/@file]
-[/#macro]
-[#macro referenceDataType referenceType]
-[#-- @ftlvariable name="type" type="com.webcohesion.enunciate.api.datatype.DataTypeReference" --]
-[#if referenceType.containers??][#list referenceType.containers as container]${container?string} of [/#list][/#if][#if referenceType.slug??]<a href="${referenceType.slug}.html">[/#if]${referenceType.label!"(custom)"}[#if referenceType.slug??]</a>[/#if]
-[/#macro]
-[#macro printPropertyMetadata property meta]
-  [#assign metaValue=property[meta]!({ "structure" : true })/]
-  [#if metaValue?is_hash && metaValue.structure!false]
-[#if metaValue.href??]<a href="${metaValue.href}">[/#if][#if metaValue.title??]<abbr title="${metaValue.title}">[/#if]${metaValue.value!"&nbsp;"}[#if metaValue.title??]</abbr>[/#if][#if metaValue.href??]</a>[/#if]
-  [#else]
-${metaValue}
-  [/#if]
-[/#macro]
diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/enunciate/enunciate.xml.org b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/enunciate/enunciate.xml.org
deleted file mode 100644
index 3e1fe06..0000000
--- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/enunciate/enunciate.xml.org
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Licensed to the Apache Software Foundation (ASF) under one
-  ~ or more contributor license agreements.  See the NOTICE file
-  ~ distributed with this work for additional information
-  ~ regarding copyright ownership.  The ASF licenses this file
-  ~ to you under the Apache License, Version 2.0 (the
-  ~ "License"); you may not use this file except in compliance
-  ~ with the License.  You may obtain a copy of the License at
-  ~
-  ~   http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing,
-  ~ software distributed under the License is distributed on an
-  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  ~ KIND, either express or implied.  See the License for the
-  ~ specific language governing permissions and limitations
-  ~ under the License.
-  -->
-<enunciate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-   xsi:noNamespaceSchemaLocation="https://raw.githubusercontent.com/stoicflame/enunciate/v2.12.0/top/src/main/resources/META-INF/enunciate-2.2.0.xsd" >
-
-  <title>Apache Archiva REST API</title>
-  <modules>
-
-    <obj-c-xml-client disabled="true" />
-    <csharp-xml-client disabled="true" />
-    <cxf disabled="false"/>
-    <jersey disabled="true" />
-    <c disabled="true"/>
-    <csharp disabled="true"/>
-    <obj-c disabled="true"/>
-    <jaxws-ri disabled="true"/>
-    <jaxws-support disabled="true"/>
-    <jaxrs>
-      <application path="restServices"/>
-    </jaxrs>
-
-    <docs disabled="false"
-          docsSubdir="" freemarkerTemplate="${project.basedir}/src/enunciate/archiva.fmt" css="${project.basedir}/src/enunciate/archiva.css" >
-      <!--<war docsDir="apidocs" />-->
-    </docs>
-
-
-  </modules>
-
-</enunciate>
\ No newline at end of file
diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/v2/svc/maven/MavenManagedRepositoryService.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/v2/svc/maven/MavenManagedRepositoryService.java
index 404d913..98ac754 100644
--- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/v2/svc/maven/MavenManagedRepositoryService.java
+++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/v2/svc/maven/MavenManagedRepositoryService.java
@@ -50,9 +50,10 @@ import java.util.List;
 
 import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
 import static org.apache.archiva.rest.api.v2.svc.RestConfiguration.DEFAULT_PAGE_LIMIT;
+import static org.apache.archiva.security.common.ArchivaRoleConstants.*;
 
 /**
- * Service interface for managing managed maven repositories
+ * Service interface for update, delete, add of Managed Maven Repositories
  *
  * @author Martin Stockhammer <ma...@apache.org>
  * @since 3.0
@@ -66,7 +67,7 @@ public interface MavenManagedRepositoryService
     @Path( "" )
     @GET
     @Produces( {APPLICATION_JSON} )
-    @RedbackAuthorization( permissions = ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION )
+    @RedbackAuthorization( permissions = OPERATION_MANAGE_CONFIGURATION )
     @Operation( summary = "Returns all managed repositories.",
         parameters = {
             @Parameter( name = "q", description = "Search term" ),
@@ -77,7 +78,7 @@ public interface MavenManagedRepositoryService
         },
         security = {
             @SecurityRequirement(
-                name = ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION
+                name = OPERATION_MANAGE_CONFIGURATION
             )
         },
         responses = {
@@ -101,11 +102,18 @@ public interface MavenManagedRepositoryService
     @Path( "{id}" )
     @GET
     @Produces( {MediaType.APPLICATION_JSON} )
-    @RedbackAuthorization( permissions = ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION )
+    @RedbackAuthorization(
+        permissions = { OPERATION_MANAGE_CONFIGURATION, OPERATION_READ_REPOSITORY},
+        resource = "{id}"
+    )
     @Operation( summary = "Returns the managed repository with the given id.",
         security = {
             @SecurityRequirement(
-                name = ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION
+                name = OPERATION_MANAGE_CONFIGURATION
+            ),
+            @SecurityRequirement(
+                name = OPERATION_READ_REPOSITORY,
+                scopes = "{id}"
             )
         },
         responses = {
@@ -126,11 +134,18 @@ public interface MavenManagedRepositoryService
     @Path( "{id}" )
     @DELETE
     @Produces( {MediaType.APPLICATION_JSON} )
-    @RedbackAuthorization( permissions = ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION )
+    @RedbackAuthorization(
+        permissions = { OPERATION_MANAGE_CONFIGURATION, OPERATION_DELETE_REPOSITORY },
+        resource = "{id}"
+    )
     @Operation( summary = "Deletes the managed repository with the given id.",
         security = {
             @SecurityRequirement(
-                name = ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION
+                name = OPERATION_MANAGE_CONFIGURATION
+            ),
+            @SecurityRequirement(
+                name = OPERATION_DELETE_REPOSITORY,
+                scopes = "{id}"
             )
         },
         responses = {
@@ -152,11 +167,18 @@ public interface MavenManagedRepositoryService
     @POST
     @Consumes( {MediaType.APPLICATION_JSON} )
     @Produces( {MediaType.APPLICATION_JSON} )
-    @RedbackAuthorization( permissions = ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION )
+    @RedbackAuthorization(
+        permissions = { OPERATION_MANAGE_CONFIGURATION, OPERATION_ADD_REPOSITORY },
+        resource = "{id}"
+    )
     @Operation( summary = "Creates the managed repository",
         security = {
             @SecurityRequirement(
-                name = ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION
+                name = OPERATION_MANAGE_CONFIGURATION
+            ),
+            @SecurityRequirement(
+                name = OPERATION_ADD_REPOSITORY,
+                scopes = "{id}"
             )
         },
         responses = {
@@ -183,11 +205,18 @@ public interface MavenManagedRepositoryService
     @PUT
     @Consumes( {MediaType.APPLICATION_JSON} )
     @Produces( {MediaType.APPLICATION_JSON} )
-    @RedbackAuthorization( permissions = ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION )
+    @RedbackAuthorization(
+        permissions = { OPERATION_MANAGE_CONFIGURATION, OPERATION_EDIT_REPOSITORY },
+        resource = "{id}"
+    )
     @Operation( summary = "Updates the managed repository with the given id",
         security = {
             @SecurityRequirement(
-                name = ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION
+                name = OPERATION_MANAGE_CONFIGURATION
+            ),
+            @SecurityRequirement(
+                name = OPERATION_EDIT_REPOSITORY,
+                scopes = "{id}"
             )
         },
         responses = {
@@ -210,12 +239,20 @@ public interface MavenManagedRepositoryService
     @Path( "{id}/path/{filePath: .+}" )
     @GET
     @Produces( {MediaType.APPLICATION_JSON} )
-    @RedbackAuthorization( permissions = ArchivaRoleConstants.OPERATION_REPOSITORY_ACCESS, resource = "{id}")
+    @RedbackAuthorization(
+        permissions = { OPERATION_MANAGE_CONFIGURATION, OPERATION_READ_REPOSITORY},
+        resource = "{id}"
+    )
     @Operation( summary = "Returns the status of a given file in the repository",
         security = {
             @SecurityRequirement(
-                name = ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION
+                name = OPERATION_MANAGE_CONFIGURATION
+            ),
+            @SecurityRequirement(
+                name = OPERATION_READ_REPOSITORY,
+                scopes = "{id}"
             )
+
         },
         responses = {
             @ApiResponse( responseCode = "200",
@@ -243,13 +280,13 @@ public interface MavenManagedRepositoryService
     @Operation( summary = "Copies a artifact from the source repository to the destination repository",
         security = {
             @SecurityRequirement(
-                name = ArchivaRoleConstants.OPERATION_REPOSITORY_ACCESS,
+                name = OPERATION_READ_REPOSITORY,
                 scopes = {
                     "{srcId}"
                 }
             ),
             @SecurityRequirement(
-                name= ArchivaRoleConstants.OPERATION_REPOSITORY_UPLOAD,
+                name= OPERATION_ADD_ARTIFACT,
                 scopes = {
                     "{dstId}"
                 }
@@ -274,12 +311,20 @@ public interface MavenManagedRepositoryService
     @Path ("{id}/path/{path: .+}")
     @DELETE
     @Consumes ({ APPLICATION_JSON })
-    @RedbackAuthorization (noPermission = true)
+    @RedbackAuthorization (
+        permissions = { OPERATION_MANAGE_CONFIGURATION, OPERATION_DELETE_ARTIFACT },
+        resource = "{id}"
+    )
     @Operation( summary = "Deletes a artifact in the repository.",
         security = {
             @SecurityRequirement(
-                name = ArchivaRoleConstants.OPERATION_RUN_INDEXER
+                name = OPERATION_MANAGE_CONFIGURATION
+            ),
+            @SecurityRequirement(
+                name = OPERATION_DELETE_ARTIFACT,
+                scopes = "{id}"
             )
+
         },
         responses = {
             @ApiResponse( responseCode = "200",
@@ -297,12 +342,20 @@ public interface MavenManagedRepositoryService
     @Path ( "{id}/co/{group}/{project}/{version}" )
     @DELETE
     @Produces ({ MediaType.APPLICATION_JSON })
-    @RedbackAuthorization (noPermission = true)
+    @RedbackAuthorization (
+        permissions = { OPERATION_MANAGE_CONFIGURATION, OPERATION_DELETE_VERSION},
+        resource = "{id}"
+    )
     @Operation( summary = "Removes a version tree in the repository",
         security = {
             @SecurityRequirement(
-                name = ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION
+                name = OPERATION_MANAGE_CONFIGURATION
+            ),
+            @SecurityRequirement(
+                name = OPERATION_DELETE_VERSION,
+                scopes = "{id}"
             )
+
         },
         responses = {
             @ApiResponse( responseCode = "200",
@@ -327,8 +380,13 @@ public interface MavenManagedRepositoryService
     @Operation( summary = "Removes a project tree in the repository",
         security = {
             @SecurityRequirement(
-                name = ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION
+                name = OPERATION_MANAGE_CONFIGURATION
+            ),
+            @SecurityRequirement(
+                name = OPERATION_DELETE_PROJECT,
+                scopes = "{id}"
             )
+
         },
         responses = {
             @ApiResponse( responseCode = "200",
@@ -346,11 +404,18 @@ public interface MavenManagedRepositoryService
     @Path ( "{id}/co/{namespace}" )
     @DELETE
     @Produces ({ MediaType.APPLICATION_JSON })
-    @RedbackAuthorization (noPermission = true)
+    @RedbackAuthorization (
+        permissions = { OPERATION_MANAGE_CONFIGURATION, OPERATION_DELETE_NAMESPACE },
+        resource = "{id}"
+    )
     @Operation( summary = "Removes a namespace tree in the repository",
         security = {
             @SecurityRequirement(
-                name = ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION
+                name = OPERATION_MANAGE_CONFIGURATION
+            ),
+            @SecurityRequirement(
+                name = OPERATION_DELETE_NAMESPACE,
+                scopes = "{id}"
             )
         },
         responses = {
diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRepositoriesService.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRepositoriesService.java
index 8a8f0de..1df79ed 100644
--- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRepositoriesService.java
+++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRepositoriesService.java
@@ -339,7 +339,7 @@ public class DefaultRepositoriesService
         try
         {
             boolean authz =
-                securitySystem.isAuthorized( securitySession, ArchivaRoleConstants.OPERATION_REPOSITORY_ACCESS,
+                securitySystem.isAuthorized( securitySession, ArchivaRoleConstants.OPERATION_READ_REPOSITORY,
                                              artifactTransferRequest.getRepositoryId() );
             if ( !authz )
             {
@@ -357,7 +357,7 @@ public class DefaultRepositoriesService
         try
         {
             boolean authz =
-                securitySystem.isAuthorized( securitySession, ArchivaRoleConstants.OPERATION_REPOSITORY_UPLOAD,
+                securitySystem.isAuthorized( securitySession, ArchivaRoleConstants.OPERATION_ADD_ARTIFACT,
                                              artifactTransferRequest.getTargetRepositoryId() );
             if ( !authz )
             {
diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/v2/svc/DefaultMavenManagedRepositoryService.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/v2/svc/DefaultMavenManagedRepositoryService.java
index 0c67cd4..8296d04 100644
--- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/v2/svc/DefaultMavenManagedRepositoryService.java
+++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/v2/svc/DefaultMavenManagedRepositoryService.java
@@ -64,8 +64,8 @@ import java.util.List;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
-import static org.apache.archiva.security.common.ArchivaRoleConstants.OPERATION_REPOSITORY_ACCESS;
-import static org.apache.archiva.security.common.ArchivaRoleConstants.OPERATION_REPOSITORY_UPLOAD;
+import static org.apache.archiva.security.common.ArchivaRoleConstants.OPERATION_READ_REPOSITORY;
+import static org.apache.archiva.security.common.ArchivaRoleConstants.OPERATION_ADD_ARTIFACT;
 
 /**
  * @author Martin Stockhammer <ma...@apache.org>
@@ -327,11 +327,11 @@ public class DefaultMavenManagedRepositoryService implements MavenManagedReposit
         try
         {
             boolean authz =
-                securitySystem.isAuthorized( securitySession, OPERATION_REPOSITORY_ACCESS,
+                securitySystem.isAuthorized( securitySession, OPERATION_READ_REPOSITORY,
                     srcRepositoryId );
             if ( !authz )
             {
-                throw new ArchivaRestServiceException(ErrorMessage.of( ErrorKeys.PERMISSION_REPOSITORY_DENIED, srcRepositoryId, OPERATION_REPOSITORY_ACCESS ), 403);
+                throw new ArchivaRestServiceException(ErrorMessage.of( ErrorKeys.PERMISSION_REPOSITORY_DENIED, srcRepositoryId, OPERATION_READ_REPOSITORY ), 403);
             }
         }
         catch ( AuthorizationException e )
@@ -344,11 +344,11 @@ public class DefaultMavenManagedRepositoryService implements MavenManagedReposit
         try
         {
             boolean authz =
-                securitySystem.isAuthorized( securitySession, ArchivaRoleConstants.OPERATION_REPOSITORY_UPLOAD,
+                securitySystem.isAuthorized( securitySession, ArchivaRoleConstants.OPERATION_ADD_ARTIFACT,
                     dstRepositoryId );
             if ( !authz )
             {
-                throw new ArchivaRestServiceException( ErrorMessage.of( ErrorKeys.PERMISSION_REPOSITORY_DENIED, dstRepositoryId, OPERATION_REPOSITORY_UPLOAD ) );
+                throw new ArchivaRestServiceException( ErrorMessage.of( ErrorKeys.PERMISSION_REPOSITORY_DENIED, dstRepositoryId, OPERATION_ADD_ARTIFACT ) );
             }
         }
         catch ( AuthorizationException e )
diff --git a/archiva-modules/archiva-web/archiva-security/src/main/java/org/apache/archiva/security/ArchivaStandardRolesCheck.java b/archiva-modules/archiva-web/archiva-security/src/main/java/org/apache/archiva/security/ArchivaStandardRolesCheck.java
index 4d42f77..bf5f7c7 100644
--- a/archiva-modules/archiva-web/archiva-security/src/main/java/org/apache/archiva/security/ArchivaStandardRolesCheck.java
+++ b/archiva-modules/archiva-web/archiva-security/src/main/java/org/apache/archiva/security/ArchivaStandardRolesCheck.java
@@ -84,8 +84,8 @@ public class ArchivaStandardRolesCheck
                 ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION, ArchivaRoleConstants.OPERATION_REGENERATE_INDEX,
                 ArchivaRoleConstants.OPERATION_RUN_INDEXER, ArchivaRoleConstants.OPERATION_ACCESS_REPORT,
                 ArchivaRoleConstants.OPERATION_ADD_REPOSITORY, ArchivaRoleConstants.OPERATION_DELETE_REPOSITORY,
-                ArchivaRoleConstants.OPERATION_REPOSITORY_ACCESS, ArchivaRoleConstants.OPERATION_EDIT_REPOSITORY,
-                ArchivaRoleConstants.OPERATION_REPOSITORY_UPLOAD, ArchivaRoleConstants.OPERATION_REPOSITORY_ACCESS,
+                ArchivaRoleConstants.OPERATION_READ_REPOSITORY, ArchivaRoleConstants.OPERATION_EDIT_REPOSITORY,
+                ArchivaRoleConstants.OPERATION_ADD_ARTIFACT, ArchivaRoleConstants.OPERATION_READ_REPOSITORY,
                 "archiva-guest" };
 
             log.info( "Checking the existance of required operations." );
diff --git a/archiva-modules/archiva-web/archiva-security/src/main/java/org/apache/archiva/security/DefaultUserRepositories.java b/archiva-modules/archiva-web/archiva-security/src/main/java/org/apache/archiva/security/DefaultUserRepositories.java
index 4679bc7..c388a9b 100644
--- a/archiva-modules/archiva-web/archiva-security/src/main/java/org/apache/archiva/security/DefaultUserRepositories.java
+++ b/archiva-modules/archiva-web/archiva-security/src/main/java/org/apache/archiva/security/DefaultUserRepositories.java
@@ -64,7 +64,7 @@ public class DefaultUserRepositories
     public List<String> getObservableRepositoryIds( String principal )
         throws PrincipalNotFoundException, AccessDeniedException, ArchivaSecurityException
     {
-        String operation = ArchivaRoleConstants.OPERATION_REPOSITORY_ACCESS;
+        String operation = ArchivaRoleConstants.OPERATION_READ_REPOSITORY;
 
         return getAccessibleRepositoryIds( principal, operation );
     }
@@ -73,7 +73,7 @@ public class DefaultUserRepositories
     public List<String> getManagableRepositoryIds( String principal )
         throws PrincipalNotFoundException, AccessDeniedException, ArchivaSecurityException
     {
-        String operation = ArchivaRoleConstants.OPERATION_REPOSITORY_UPLOAD;
+        String operation = ArchivaRoleConstants.OPERATION_ADD_ARTIFACT;
 
         return getAccessibleRepositoryIds( principal, operation );
     }
@@ -96,12 +96,12 @@ public class DefaultUserRepositories
     public List<ManagedRepository> getAccessibleRepositories( String principal )
         throws ArchivaSecurityException, AccessDeniedException, PrincipalNotFoundException
     {
-        return getAccessibleRepositories( principal, ArchivaRoleConstants.OPERATION_REPOSITORY_ACCESS );
+        return getAccessibleRepositories( principal, ArchivaRoleConstants.OPERATION_READ_REPOSITORY );
     }
 
     @Override
     public List<ManagedRepository> getManagableRepositories(String principal) throws ArchivaSecurityException, AccessDeniedException, PrincipalNotFoundException {
-        return getAccessibleRepositories( principal, ArchivaRoleConstants.OPERATION_REPOSITORY_UPLOAD );
+        return getAccessibleRepositories( principal, ArchivaRoleConstants.OPERATION_ADD_ARTIFACT );
     }
 
     private List<ManagedRepository> getAccessibleRepositories( String principal, String operation )
@@ -206,7 +206,7 @@ public class DefaultUserRepositories
         {
             SecuritySession securitySession = createSession( principal );
 
-            return securitySystem.isAuthorized( securitySession, ArchivaRoleConstants.OPERATION_REPOSITORY_UPLOAD,
+            return securitySystem.isAuthorized( securitySession, ArchivaRoleConstants.OPERATION_ADD_ARTIFACT,
                                                 repoId );
 
         }
@@ -224,7 +224,7 @@ public class DefaultUserRepositories
         {
             SecuritySession securitySession = createSession( principal );
 
-            return securitySystem.isAuthorized( securitySession, ArchivaRoleConstants.OPERATION_REPOSITORY_DELETE,
+            return securitySystem.isAuthorized( securitySession, ArchivaRoleConstants.OPERATION_DELETE_ARTIFACT,
                                                 repoId );
 
         }
diff --git a/archiva-modules/archiva-web/archiva-security/src/test/java/org/apache/archiva/security/ArchivaServletAuthenticatorTest.java b/archiva-modules/archiva-web/archiva-security/src/test/java/org/apache/archiva/security/ArchivaServletAuthenticatorTest.java
index ce0218e..9258abe 100644
--- a/archiva-modules/archiva-web/archiva-security/src/test/java/org/apache/archiva/security/ArchivaServletAuthenticatorTest.java
+++ b/archiva-modules/archiva-web/archiva-security/src/test/java/org/apache/archiva/security/ArchivaServletAuthenticatorTest.java
@@ -110,7 +110,7 @@ public class ArchivaServletAuthenticatorTest
 
         SecuritySession session = new DefaultSecuritySession( result, user );
         boolean isAuthorized =
-            servletAuth.isAuthorized( request, session, "corporate", ArchivaRoleConstants.OPERATION_REPOSITORY_UPLOAD );
+            servletAuth.isAuthorized( request, session, "corporate", ArchivaRoleConstants.OPERATION_ADD_ARTIFACT );
 
         assertTrue( isAuthorized );
 
@@ -139,7 +139,7 @@ public class ArchivaServletAuthenticatorTest
 
         try
         {
-            servletAuth.isAuthorized( request, session, "corporate", ArchivaRoleConstants.OPERATION_REPOSITORY_UPLOAD );
+            servletAuth.isAuthorized( request, session, "corporate", ArchivaRoleConstants.OPERATION_ADD_ARTIFACT );
             fail( "UnauthorizedException should have been thrown." );
         }
         catch ( UnauthorizedException e )
@@ -167,7 +167,7 @@ public class ArchivaServletAuthenticatorTest
 
         SecuritySession session = new DefaultSecuritySession( result, user );
         boolean isAuthorized =
-            servletAuth.isAuthorized( request, session, "corporate", ArchivaRoleConstants.OPERATION_REPOSITORY_ACCESS );
+            servletAuth.isAuthorized( request, session, "corporate", ArchivaRoleConstants.OPERATION_READ_REPOSITORY );
 
         assertTrue( isAuthorized );
 
@@ -188,7 +188,7 @@ public class ArchivaServletAuthenticatorTest
         SecuritySession session = new DefaultSecuritySession( result, user );
         try
         {
-            servletAuth.isAuthorized( request, session, "corporate", ArchivaRoleConstants.OPERATION_REPOSITORY_ACCESS );
+            servletAuth.isAuthorized( request, session, "corporate", ArchivaRoleConstants.OPERATION_READ_REPOSITORY );
             fail( "UnauthorizedException should have been thrown." );
         }
         catch ( UnauthorizedException e )
@@ -205,7 +205,7 @@ public class ArchivaServletAuthenticatorTest
     {
         assignRepositoryManagerRole( USER_GUEST, "corporate" );
         boolean isAuthorized =
-            servletAuth.isAuthorized( USER_GUEST, "corporate", ArchivaRoleConstants.OPERATION_REPOSITORY_UPLOAD );
+            servletAuth.isAuthorized( USER_GUEST, "corporate", ArchivaRoleConstants.OPERATION_ADD_ARTIFACT );
 
         assertTrue( isAuthorized );
 
@@ -221,7 +221,7 @@ public class ArchivaServletAuthenticatorTest
         assignRepositoryObserverRole( USER_GUEST, "corporate" );
 
         boolean isAuthorized =
-            servletAuth.isAuthorized( USER_GUEST, "corporate", ArchivaRoleConstants.OPERATION_REPOSITORY_UPLOAD );
+            servletAuth.isAuthorized( USER_GUEST, "corporate", ArchivaRoleConstants.OPERATION_ADD_ARTIFACT );
         assertFalse( isAuthorized );
 
         // cleanup previously add karma
@@ -236,7 +236,7 @@ public class ArchivaServletAuthenticatorTest
         assignRepositoryObserverRole( USER_GUEST, "corporate" );
 
         boolean isAuthorized =
-            servletAuth.isAuthorized( USER_GUEST, "corporate", ArchivaRoleConstants.OPERATION_REPOSITORY_ACCESS );
+            servletAuth.isAuthorized( USER_GUEST, "corporate", ArchivaRoleConstants.OPERATION_READ_REPOSITORY );
 
         assertTrue( isAuthorized );
 
@@ -249,7 +249,7 @@ public class ArchivaServletAuthenticatorTest
         throws Exception
     {
         boolean isAuthorized =
-            servletAuth.isAuthorized( USER_GUEST, "corporate", ArchivaRoleConstants.OPERATION_REPOSITORY_ACCESS );
+            servletAuth.isAuthorized( USER_GUEST, "corporate", ArchivaRoleConstants.OPERATION_READ_REPOSITORY );
 
         assertFalse( isAuthorized );
     }
diff --git a/archiva-modules/archiva-web/archiva-web-common/src/main/java/org/apache/archiva/web/api/FileUploadService.java b/archiva-modules/archiva-web/archiva-web-common/src/main/java/org/apache/archiva/web/api/FileUploadService.java
index 215bda1..2413496 100644
--- a/archiva-modules/archiva-web/archiva-web-common/src/main/java/org/apache/archiva/web/api/FileUploadService.java
+++ b/archiva-modules/archiva-web/archiva-web-common/src/main/java/org/apache/archiva/web/api/FileUploadService.java
@@ -70,7 +70,7 @@ public interface FileUploadService
     @Path( "save/{repositoryId}/{groupId}/{artifactId}/{version}/{packaging}" )
     @GET
     @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
-    @RedbackAuthorization( resource = "{repositoryId}", permissions = ArchivaRoleConstants.OPERATION_REPOSITORY_UPLOAD )
+    @RedbackAuthorization( resource = "{repositoryId}", permissions = ArchivaRoleConstants.OPERATION_ADD_ARTIFACT )
     Boolean save( @PathParam( "repositoryId" ) String repositoryId, @PathParam( "groupId" ) String groupId,
                   @PathParam( "artifactId" ) String artifactId, @PathParam( "version" ) String version,
                   @PathParam( "packaging" ) String packaging, @QueryParam( "generatePom" ) boolean generatePom )
diff --git a/archiva-modules/archiva-web/archiva-web-common/src/main/java/org/apache/archiva/web/rss/RssFeedServlet.java b/archiva-modules/archiva-web/archiva-web-common/src/main/java/org/apache/archiva/web/rss/RssFeedServlet.java
index 30a15c4..cbd1e86 100644
--- a/archiva-modules/archiva-web/archiva-web-common/src/main/java/org/apache/archiva/web/rss/RssFeedServlet.java
+++ b/archiva-modules/archiva-web/archiva-web-common/src/main/java/org/apache/archiva/web/rss/RssFeedServlet.java
@@ -308,7 +308,7 @@ public class RssFeedServlet
                     && servletAuth.isAuthorized( req, //
                                                  securitySession, //
                                                  repoId, //
-                                                 ArchivaRoleConstants.OPERATION_REPOSITORY_ACCESS ) )
+                                                 ArchivaRoleConstants.OPERATION_READ_REPOSITORY ) )
                 {
                     return true;
                 }
diff --git a/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/util/WebdavMethodUtil.java b/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/util/WebdavMethodUtil.java
index cf1a9fd..ce06750 100644
--- a/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/util/WebdavMethodUtil.java
+++ b/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/util/WebdavMethodUtil.java
@@ -53,15 +53,15 @@ public class WebdavMethodUtil
         }
         if ( READ_METHODS.contains( method.toUpperCase( Locale.US ) ) )
         {
-            return ArchivaRoleConstants.OPERATION_REPOSITORY_ACCESS;
+            return ArchivaRoleConstants.OPERATION_READ_REPOSITORY;
         }
         else if ( "DELETE".equals( method.toUpperCase( Locale.US ) ) )
         {
-            return ArchivaRoleConstants.OPERATION_REPOSITORY_DELETE;
+            return ArchivaRoleConstants.OPERATION_DELETE_ARTIFACT;
         }
         else
         {
-            return ArchivaRoleConstants.OPERATION_REPOSITORY_UPLOAD;
+            return ArchivaRoleConstants.OPERATION_ADD_ARTIFACT;
         }
     }
 
diff --git a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/RepositoryServletSecurityTest.java b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/RepositoryServletSecurityTest.java
index a73b2f4..6713786 100644
--- a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/RepositoryServletSecurityTest.java
+++ b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/RepositoryServletSecurityTest.java
@@ -265,7 +265,7 @@ public class RepositoryServletSecurityTest
                                      EasyMock.anyObject( AuthenticationResult.class ) );
         EasyMock.expectLastCall().andThrow( new AuthenticationException( "Authentication error" ) );
 
-        servletAuth.isAuthorized( "guest", "internal", ArchivaRoleConstants.OPERATION_REPOSITORY_UPLOAD );
+        servletAuth.isAuthorized( "guest", "internal", ArchivaRoleConstants.OPERATION_ADD_ARTIFACT );
 
         EasyMock.expectLastCall().andThrow( new UnauthorizedException( "'guest' has no write access to repository" ) );
 
@@ -313,7 +313,7 @@ public class RepositoryServletSecurityTest
             new AuthenticationException( "Authentication error" ) );
 
         EasyMock.expect( servletAuth.isAuthorized( "guest", "internal",
-                                                   ArchivaRoleConstants.OPERATION_REPOSITORY_UPLOAD ) ).andReturn(
+                                                   ArchivaRoleConstants.OPERATION_ADD_ARTIFACT ) ).andReturn(
             true );
 
         // ArchivaDavResourceFactory#isAuthorized()
@@ -332,7 +332,7 @@ public class RepositoryServletSecurityTest
 
         // check if guest has write access
         EasyMock.expect( servletAuth.isAuthorized( "guest", "internal",
-                                                   ArchivaRoleConstants.OPERATION_REPOSITORY_UPLOAD ) ).andReturn(
+                                                   ArchivaRoleConstants.OPERATION_ADD_ARTIFACT ) ).andReturn(
             true );
 
         httpAuthControl.replay();
@@ -399,7 +399,7 @@ public class RepositoryServletSecurityTest
 
         EasyMock.expect(
             servletAuth.isAuthorized( anyObject( HttpServletRequest.class ), eq( session ), eq( "internal" ),
-                                      eq( ArchivaRoleConstants.OPERATION_REPOSITORY_UPLOAD ) ) ).andThrow(
+                                      eq( ArchivaRoleConstants.OPERATION_ADD_ARTIFACT ) ) ).andThrow(
             new UnauthorizedException( "User not authorized" ) );
         httpAuthControl.replay();
         servletAuthControl.replay();
@@ -473,7 +473,7 @@ public class RepositoryServletSecurityTest
 
         EasyMock.expect(
             servletAuth.isAuthorized( anyObject( HttpServletRequest.class ), eq( session ), eq( "internal" ),
-                                      eq( ArchivaRoleConstants.OPERATION_REPOSITORY_UPLOAD ) ) ).andReturn( true );
+                                      eq( ArchivaRoleConstants.OPERATION_ADD_ARTIFACT ) ) ).andReturn( true );
 
         httpAuthControl.replay();
         servletAuthControl.replay();
@@ -528,7 +528,7 @@ public class RepositoryServletSecurityTest
             new AuthenticationException( "Authentication error" ) );
 
         EasyMock.expect( servletAuth.isAuthorized( "guest", "internal",
-                                                   ArchivaRoleConstants.OPERATION_REPOSITORY_ACCESS ) ).andReturn(
+                                                   ArchivaRoleConstants.OPERATION_READ_REPOSITORY ) ).andReturn(
             true );
 
         // ArchivaDavResourceFactory#isAuthorized()
@@ -547,7 +547,7 @@ public class RepositoryServletSecurityTest
 
         EasyMock.expect(
             servletAuth.isAuthorized( anyObject( HttpServletRequest.class ), eq( session ), eq( "internal" ),
-                                      eq( ArchivaRoleConstants.OPERATION_REPOSITORY_ACCESS ) ) ).andReturn( true );
+                                      eq( ArchivaRoleConstants.OPERATION_READ_REPOSITORY ) ) ).andReturn( true );
         httpAuthControl.replay();
         servletAuthControl.replay();
 
@@ -594,7 +594,7 @@ public class RepositoryServletSecurityTest
             new AuthenticationException( "Authentication error" ) );
 
         EasyMock.expect( servletAuth.isAuthorized( "guest", "internal",
-                                                   ArchivaRoleConstants.OPERATION_REPOSITORY_ACCESS ) ).andReturn(
+                                                   ArchivaRoleConstants.OPERATION_READ_REPOSITORY ) ).andReturn(
             false );
         httpAuthControl.replay();
         servletAuthControl.replay();
@@ -659,7 +659,7 @@ public class RepositoryServletSecurityTest
 
         EasyMock.expect(
             servletAuth.isAuthorized( anyObject( HttpServletRequest.class ), eq( session ), eq( "internal" ),
-                                      eq( ArchivaRoleConstants.OPERATION_REPOSITORY_ACCESS ) ) ).andReturn( true );
+                                      eq( ArchivaRoleConstants.OPERATION_READ_REPOSITORY ) ) ).andReturn( true );
 
         httpAuthControl.replay();
         servletAuthControl.replay();
@@ -726,7 +726,7 @@ public class RepositoryServletSecurityTest
 
         EasyMock.expect(
             servletAuth.isAuthorized( anyObject( HttpServletRequest.class ), eq( session ), eq( "internal" ),
-                                      eq( ArchivaRoleConstants.OPERATION_REPOSITORY_ACCESS ) ) ).andThrow(
+                                      eq( ArchivaRoleConstants.OPERATION_READ_REPOSITORY ) ) ).andThrow(
             new UnauthorizedException( "User not authorized to read repository." ) );
         httpAuthControl.replay();
         servletAuthControl.replay();