Updating permissions for v2 rest service

This commit is contained in:
Martin Stockhammer 2021-12-19 20:21:12 +01:00
parent 5e8ae2434d
commit 55b1e5d09f
15 changed files with 230 additions and 1826 deletions

View File

@ -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";

View File

@ -48,11 +48,31 @@
<name>archiva-merge-repository</name>
<description>Archiva Merge Repository</description>
</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>
@ -78,11 +98,6 @@
<name>archiva-edit-repository</name>
<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>
@ -238,12 +253,36 @@
<namePrefix>Repository Manager</namePrefix>
<assignable>true</assignable>
<permissions>
<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>
@ -256,12 +295,6 @@
<operation>archiva-delete-repository</operation>
<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>

View File

@ -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; }
}

View File

@ -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]

View File

@ -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>

View File

@ -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 <martin_s@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 = {

View File

@ -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 )
{

View File

@ -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 <martin_s@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 )

View File

@ -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." );

View File

@ -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 );
}

View File

@ -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 );
}

View File

@ -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 )

View File

@ -308,7 +308,7 @@ public class RssFeedServlet
&& servletAuth.isAuthorized( req, //
securitySession, //
repoId, //
ArchivaRoleConstants.OPERATION_REPOSITORY_ACCESS ) )
ArchivaRoleConstants.OPERATION_READ_REPOSITORY ) )
{
return true;
}

View File

@ -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;
}
}

View File

@ -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();