// 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";
<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>
<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>
<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-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>
+++ /dev/null
-/*
-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; }
-}
-
+++ /dev/null
-[#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] >[/#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 © <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!" "}[/@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!" "}</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!" "}[/@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!" "}</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 "Content-Type: ${io.mediaType}" 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 "Accept: ${io.mediaType}" 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!" "}</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!" "}</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!" "}</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!" "}</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!" "}</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!" "}</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!" "}[/@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!" "}</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!" "}[#if metaValue.title??]</abbr>[/#if][#if metaValue.href??]</a>[/#if]
- [#else]
-${metaValue}
- [/#if]
-[/#macro]
+++ /dev/null
-<?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
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
@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" ),
},
security = {
@SecurityRequirement(
- name = ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION
+ name = OPERATION_MANAGE_CONFIGURATION
)
},
responses = {
@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 = {
@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 = {
@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 = {
@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 = {
@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",
@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}"
}
@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",
@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",
@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",
@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 = {
try
{
boolean authz =
- securitySystem.isAuthorized( securitySession, ArchivaRoleConstants.OPERATION_REPOSITORY_ACCESS,
+ securitySystem.isAuthorized( securitySession, ArchivaRoleConstants.OPERATION_READ_REPOSITORY,
artifactTransferRequest.getRepositoryId() );
if ( !authz )
{
try
{
boolean authz =
- securitySystem.isAuthorized( securitySession, ArchivaRoleConstants.OPERATION_REPOSITORY_UPLOAD,
+ securitySystem.isAuthorized( securitySession, ArchivaRoleConstants.OPERATION_ADD_ARTIFACT,
artifactTransferRequest.getTargetRepositoryId() );
if ( !authz )
{
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>
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 )
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 )
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." );
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 );
}
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 );
}
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 )
{
SecuritySession securitySession = createSession( principal );
- return securitySystem.isAuthorized( securitySession, ArchivaRoleConstants.OPERATION_REPOSITORY_UPLOAD,
+ return securitySystem.isAuthorized( securitySession, ArchivaRoleConstants.OPERATION_ADD_ARTIFACT,
repoId );
}
{
SecuritySession securitySession = createSession( principal );
- return securitySystem.isAuthorized( securitySession, ArchivaRoleConstants.OPERATION_REPOSITORY_DELETE,
+ return securitySystem.isAuthorized( securitySession, ArchivaRoleConstants.OPERATION_DELETE_ARTIFACT,
repoId );
}
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 );
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 )
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 );
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 )
{
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 );
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
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 );
throws Exception
{
boolean isAuthorized =
- servletAuth.isAuthorized( USER_GUEST, "corporate", ArchivaRoleConstants.OPERATION_REPOSITORY_ACCESS );
+ servletAuth.isAuthorized( USER_GUEST, "corporate", ArchivaRoleConstants.OPERATION_READ_REPOSITORY );
assertFalse( isAuthorized );
}
@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 )
&& servletAuth.isAuthorized( req, //
securitySession, //
repoId, //
- ArchivaRoleConstants.OPERATION_REPOSITORY_ACCESS ) )
+ ArchivaRoleConstants.OPERATION_READ_REPOSITORY ) )
{
return true;
}
}
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;
}
}
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" ) );
new AuthenticationException( "Authentication error" ) );
EasyMock.expect( servletAuth.isAuthorized( "guest", "internal",
- ArchivaRoleConstants.OPERATION_REPOSITORY_UPLOAD ) ).andReturn(
+ ArchivaRoleConstants.OPERATION_ADD_ARTIFACT ) ).andReturn(
true );
// ArchivaDavResourceFactory#isAuthorized()
// 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();
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();
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();
new AuthenticationException( "Authentication error" ) );
EasyMock.expect( servletAuth.isAuthorized( "guest", "internal",
- ArchivaRoleConstants.OPERATION_REPOSITORY_ACCESS ) ).andReturn(
+ ArchivaRoleConstants.OPERATION_READ_REPOSITORY ) ).andReturn(
true );
// ArchivaDavResourceFactory#isAuthorized()
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();
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();
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();
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();