Merge "Sonar fixes related to exceptions"
authorJonathan Gathman <jonathan.gathman@att.com>
Fri, 20 Jul 2018 21:57:39 +0000 (21:57 +0000)
committerGerrit Code Review <gerrit@onap.org>
Fri, 20 Jul 2018 21:57:39 +0000 (21:57 +0000)
132 files changed:
INFO.yaml
auth/auth-cass/docker/dinstall.sh
auth/auth-cass/src/main/cql/build.sh [new file with mode: 0644]
auth/auth-cass/src/main/cql/config.dat [new file with mode: 0644]
auth/auth-cass/src/main/cql/osaaf.cql
auth/auth-cass/src/main/cql/pull.sh [new file with mode: 0644]
auth/auth-cass/src/main/cql/push.sh [new file with mode: 0644]
auth/auth-cass/src/main/cql/temp_identity.cql
auth/auth-cass/src/main/java/org/onap/aaf/auth/direct/DirectAAFLur.java
auth/auth-cass/src/main/java/org/onap/aaf/auth/direct/DirectRegistrar.java
auth/auth-certman/pom.xml
auth/auth-certman/src/main/java/org/onap/aaf/auth/cm/ca/CA.java
auth/auth-certman/src/main/java/org/onap/aaf/auth/cm/ca/LocalCA.java
auth/auth-certman/src/main/java/org/onap/aaf/auth/cm/cert/BCFactory.java
auth/auth-certman/src/main/java/org/onap/aaf/auth/cm/cert/CSRMeta.java
auth/auth-certman/src/main/java/org/onap/aaf/auth/cm/facade/FacadeImpl.java
auth/auth-certman/src/main/java/org/onap/aaf/auth/cm/service/CMService.java
auth/auth-certman/src/test/java/org/onap/aaf/auth/cm/facade/JU_FacadeImpl.java
auth/auth-cmd/src/main/java/org/onap/aaf/auth/cmd/Version.java
auth/auth-cmd/src/test/java/org/onap/aaf/auth/cmd/test/HMangrStub.java [new file with mode: 0644]
auth/auth-cmd/src/test/java/org/onap/aaf/auth/cmd/test/mgmt/JU_Clear.java
auth/auth-cmd/src/test/java/org/onap/aaf/auth/cmd/test/mgmt/JU_Deny.java
auth/auth-cmd/src/test/java/org/onap/aaf/auth/cmd/test/mgmt/JU_Log.java
auth/auth-cmd/src/test/java/org/onap/aaf/auth/cmd/test/mgmt/JU_SessClear.java
auth/auth-cmd/src/test/java/org/onap/aaf/auth/cmd/test/ns/JU_Admin.java
auth/auth-cmd/src/test/java/org/onap/aaf/auth/cmd/test/ns/JU_Attrib.java
auth/auth-cmd/src/test/java/org/onap/aaf/auth/cmd/test/ns/JU_Create.java
auth/auth-cmd/src/test/java/org/onap/aaf/auth/cmd/test/ns/JU_Delete.java
auth/auth-cmd/src/test/java/org/onap/aaf/auth/cmd/test/ns/JU_Describe.java
auth/auth-cmd/src/test/java/org/onap/aaf/auth/cmd/test/ns/JU_ListActivity.java
auth/auth-cmd/src/test/java/org/onap/aaf/auth/cmd/test/ns/JU_ListAdminResponsible.java
auth/auth-cmd/src/test/java/org/onap/aaf/auth/cmd/test/ns/JU_ListByName.java
auth/auth-cmd/src/test/java/org/onap/aaf/auth/cmd/test/ns/JU_ListUsersContact.java
auth/auth-cmd/src/test/java/org/onap/aaf/auth/cmd/test/perm/JU_Create.java
auth/auth-cmd/src/test/java/org/onap/aaf/auth/cmd/test/perm/JU_Delete.java
auth/auth-cmd/src/test/java/org/onap/aaf/auth/cmd/test/perm/JU_Describe.java
auth/auth-cmd/src/test/java/org/onap/aaf/auth/cmd/test/perm/JU_Grant.java
auth/auth-cmd/src/test/java/org/onap/aaf/auth/cmd/test/perm/JU_ListActivity.java
auth/auth-cmd/src/test/java/org/onap/aaf/auth/cmd/test/perm/JU_ListByName.java
auth/auth-cmd/src/test/java/org/onap/aaf/auth/cmd/test/perm/JU_Rename.java
auth/auth-cmd/src/test/java/org/onap/aaf/auth/cmd/test/role/JU_CreateDelete.java
auth/auth-cmd/src/test/java/org/onap/aaf/auth/cmd/test/role/JU_Describe.java
auth/auth-cmd/src/test/java/org/onap/aaf/auth/cmd/test/role/JU_ListActivity.java
auth/auth-cmd/src/test/java/org/onap/aaf/auth/cmd/test/role/JU_ListByNameOnly.java
auth/auth-cmd/src/test/java/org/onap/aaf/auth/cmd/test/role/JU_ListByUser.java
auth/auth-cmd/src/test/java/org/onap/aaf/auth/cmd/test/role/JU_User.java
auth/auth-cmd/src/test/java/org/onap/aaf/auth/cmd/test/user/JU_Cred.java
auth/auth-cmd/src/test/java/org/onap/aaf/auth/cmd/test/user/JU_Delg.java
auth/auth-cmd/src/test/java/org/onap/aaf/auth/cmd/test/user/JU_ListApprovals.java
auth/auth-cmd/src/test/java/org/onap/aaf/auth/cmd/test/user/JU_ListForCreds.java
auth/auth-cmd/src/test/java/org/onap/aaf/auth/cmd/test/user/JU_Role.java
auth/auth-core/src/main/java/org/onap/aaf/auth/env/AuthzTrans.java
auth/auth-core/src/main/java/org/onap/aaf/auth/env/AuthzTransImpl.java
auth/auth-core/src/main/java/org/onap/aaf/auth/env/NullTrans.java
auth/auth-core/src/test/java/org/onap/aaf/auth/common/test/JU_Define.java
auth/auth-deforg/src/main/java/org/onap/aaf/org/DefaultOrg.java
auth/auth-deforg/src/test/java/org/onap/aaf/org/test/JU_DefaultOrg.java
auth/auth-deforg/src/test/java/org/onap/aaf/org/test/JU_Passwords.java [new file with mode: 0644]
auth/auth-gui/src/main/java/org/onap/aaf/auth/gui/Page.java
auth/auth-gui/src/main/java/org/onap/aaf/auth/gui/pages/CMArtiChangeForm.java
auth/auth-gui/src/main/java/org/onap/aaf/auth/gui/pages/RoleDetail.java
auth/auth-locate/src/main/java/org/onap/aaf/auth/locate/api/API_AAFAccess.java
auth/auth-locate/src/main/java/org/onap/aaf/auth/locate/service/LocateServiceImpl.java
auth/auth-oauth/src/main/java/org/onap/aaf/auth/oauth/service/JSONPermLoaderFactory.java
auth/auth-oauth/src/main/java/org/onap/aaf/auth/oauth/service/OAuthService.java
auth/auth-service/src/main/java/org/onap/aaf/auth/service/validation/ServiceValidator.java
auth/docker/.gitignore
auth/docker/Dockerfile.client [new file with mode: 0644]
auth/docker/Dockerfile.config
auth/docker/README.txt
auth/docker/aaf.props [new file with mode: 0644]
auth/docker/aaf.sh [new file with mode: 0644]
auth/docker/agent.sh
auth/docker/d.props.init
auth/docker/dbounce.sh
auth/docker/dbuild.sh
auth/docker/dclean.sh
auth/sample/bin/client.sh [new file with mode: 0644]
auth/sample/bin/service.sh [moved from auth/sample/bin/agent.sh with 75% similarity]
auth/sample/data/identities.dat
auth/sample/data/sample.identities.dat
auth/sample/etc/org.osaaf.aaf.cm.props
auth/sample/etc/org.osaaf.aaf.fs.props
auth/sample/etc/org.osaaf.aaf.gui.props
auth/sample/etc/org.osaaf.aaf.hello.props
auth/sample/etc/org.osaaf.aaf.locate.props
auth/sample/etc/org.osaaf.aaf.oauth.props
auth/sample/etc/org.osaaf.aaf.service.props
auth/sample/local/.gitignore [deleted file]
auth/sample/local/aaf.props
auth/sample/local/initialConfig.props
auth/sample/local/org.osaaf.aaf.cm.ca.props
auth/sample/logs/clean
auth/sample/logs/taillog
cadi/aaf/src/main/java/org/onap/aaf/cadi/aaf/AAFPermission.java
cadi/aaf/src/main/java/org/onap/aaf/cadi/aaf/Defaults.java [new file with mode: 0644]
cadi/aaf/src/main/java/org/onap/aaf/cadi/aaf/TestConnectivity.java
cadi/aaf/src/main/java/org/onap/aaf/cadi/aaf/v2_0/AAFLurPerm.java
cadi/aaf/src/main/java/org/onap/aaf/cadi/aaf/v2_0/AAFTrustChecker.java
cadi/aaf/src/main/java/org/onap/aaf/cadi/aaf/v2_0/AbsAAFLocator.java
cadi/aaf/src/main/java/org/onap/aaf/cadi/aaf/v2_0/AbsAAFLur.java
cadi/aaf/src/main/java/org/onap/aaf/cadi/configure/Agent.java
cadi/aaf/src/main/java/org/onap/aaf/cadi/configure/PlaceArtifactInKeystore.java
cadi/aaf/src/main/java/org/onap/aaf/cadi/configure/PlaceArtifactOnStream.java
cadi/aaf/src/main/java/org/onap/aaf/cadi/oauth/OAuth2Lur.java
cadi/aaf/src/main/java/org/onap/aaf/cadi/oauth/TokenClient.java
cadi/aaf/src/main/java/org/onap/aaf/cadi/oauth/TokenClientFactory.java
cadi/aaf/src/main/java/org/onap/aaf/cadi/oauth/TokenPerm.java
cadi/aaf/src/main/java/org/onap/aaf/cadi/olur/OLur.java
cadi/aaf/src/main/java/org/onap/aaf/cadi/register/RemoteRegistrant.java
cadi/aaf/src/main/java/org/onap/aaf/cadi/sso/AAFSSO.java
cadi/aaf/src/test/java/org/onap/aaf/cadi/aaf/test/JU_AAFPermission.java
cadi/aaf/src/test/java/org/onap/aaf/cadi/cm/test/JU_ArtifactDir.java
cadi/aaf/src/test/java/org/onap/aaf/cadi/cm/test/JU_PlaceArtifactInKeystore.java
cadi/aaf/src/test/java/org/onap/aaf/cadi/oauth/test/JU_TokenPerm.java
cadi/aaf/src/test/java/org/onap/aaf/client/sample/Sample.java
cadi/client/src/test/java/org/onap/aaf/cadi/locator/test/JU_PropertyLocator.java
cadi/core/src/main/java/org/onap/aaf/cadi/AbsUserCache.java
cadi/core/src/main/java/org/onap/aaf/cadi/Lur.java
cadi/core/src/main/java/org/onap/aaf/cadi/Symm.java
cadi/core/src/main/java/org/onap/aaf/cadi/config/Config.java
cadi/core/src/main/java/org/onap/aaf/cadi/lur/EpiLur.java
cadi/core/src/main/java/org/onap/aaf/cadi/lur/LocalLur.java
cadi/core/src/main/java/org/onap/aaf/cadi/lur/NullLur.java
cadi/core/src/test/java/org/onap/aaf/cadi/lur/test/JU_EpiLur.java
cadi/core/src/test/java/org/onap/aaf/cadi/test/JU_AbsUserCache.java
cadi/core/src/test/java/org/onap/aaf/cadi/test/JU_CadiWrap.java
cadi/oauth-enduser/src/test/java/org/onap/aaf/cadi/enduser/test/OAuthExample.java
cadi/oauth-enduser/src/test/java/org/onap/aaf/cadi/enduser/test/OnapClientExample.java
docs/sections/installation/client_vol.rst [new file with mode: 0644]
docs/sections/installation/install_from_source.rst [new file with mode: 0644]
docs/sections/installation/sample.rst [moved from docs/sections/installation/fromsource.rst with 100% similarity]

index b90cb9b..840eb5e 100644 (file)
--- a/INFO.yaml
+++ b/INFO.yaml
@@ -3,9 +3,9 @@ project: 'aaf-authz'
 project_creation_date: '2017-07-12'
 lifecycle_state: 'Incubation'
 project_lead: &onap_releng_ptl
-    name: 'Ram Koya'
-    email: 'rk541m@att.com'
-    id: 'rampi_k'
+    name: 'Jonathan Gathman'
+    email: 'jonathan.gathman@us.att.com'
+    id: 'instrumental'
     company: 'ATT'
     timezone: 'America/Dallas'
 primary_contact: *onap_releng_ptl
index bdbadf6..d6fcb9f 100644 (file)
@@ -56,6 +56,7 @@ if [ "`$DOCKER ps -a | grep aaf_cass`" == "" ]; then
     echo " cqlsh -f keyspace.cql"
     echo " cqlsh -f init.cql"
     echo " cqlsh -f osaaf.cql"
+    echo " cqlsh -f temp_identity.cql"
     echo ""
     echo "The following will give you a temporary identity with which to start working, or emergency"
     echo " cqlsh -f temp_identity.cql"
diff --git a/auth/auth-cass/src/main/cql/build.sh b/auth/auth-cass/src/main/cql/build.sh
new file mode 100644 (file)
index 0000000..caa0749
--- /dev/null
@@ -0,0 +1,6 @@
+#!/bin/bash
+CQLSH=/Volumes/Data/apache-cassandra-2.1.14/bin/cqlsh
+DIR=.
+for T in ns perm role user_role cred config; do
+  $CQLSH -e  "COPY authz.$T TO '$DIR/$T.dat' WITH DELIMITER='|'"
+done
diff --git a/auth/auth-cass/src/main/cql/config.dat b/auth/auth-cass/src/main/cql/config.dat
new file mode 100644 (file)
index 0000000..7eba23e
--- /dev/null
@@ -0,0 +1,10 @@
+aaf|aaf_env|DEV\r
+aaf|aaf_locate_url|https://meriadoc.mithril.sbc.com:8095\r
+aaf|cadi_x509_issuers|CN=intermediateCA_1, OU=OSAAF, O=ONAP, C=US:CN=intermediateCA_7, OU=OSAAF, O=ONAP, C=US\r
+aaf|aaf_oauth2_introspect_url|https://AAF_LOCATE_URL/AAF_NS.introspect:2.1/introspect\r
+aaf|aaf_oauth2_token_url|https://AAF_LOCATE_URL/AAF_NS.token:2.1/token\r
+aaf|aaf_url|https://AAF_LOCATE_URL/AAF_NS.service:2.1\r
+aaf|cadi_protocols|TLSv1.1,TLSv1.2\r
+aaf|cm_url|https://AAF_LOCATE_URL/AAF_NS.cm:2.1\r
+aaf|fs_url|https://AAF_LOCATE_URL/AAF_NS.fs.2.1\r
+aaf|gui_url|https://AAF_LOCATE_URL/AAF_NS.gui.2.1\r
index 40e79f1..51e6b90 100644 (file)
@@ -51,10 +51,10 @@ INSERT INTO role(ns, name, perms, description)
 
 // OSAAF Root
 INSERT INTO user_role(user,role,expires,ns,rname)
-  VALUES ('osaaf@aaf.osaaf.org','org.admin','2018-10-31','org','admin') using TTL 14400;
+  VALUES ('aaf@aaf.osaaf.org','org.admin','2018-10-31','org','admin');
 
 INSERT INTO user_role(user,role,expires,ns,rname)
-  VALUES ('osaaf@aaf.osaaf.org','org.osaaf.aaf.admin','2018-10-31','org.osaaf.aaf','admin') using TTL 14400;
+  VALUES ('aaf@aaf.osaaf.org','org.osaaf.aaf.admin','2018-10-31','org.osaaf.aaf','admin');
 
 
 // ONAP Specific Entities
@@ -79,6 +79,19 @@ INSERT INTO perm(ns, type, instance, action, roles, description)
 INSERT INTO role(ns, name, perms, description)
   VALUES('org.onap.portal','admin',{'org.onap.portal.access|*|*'},'Portal Admins');
 
+// AAF Admin
+insert into cred (id,type,expires,cred,notes,ns,other) values('aaf_admin@people.osaaf.org',2,'2019-05-01',0xd993c5617486296f1b99d04de31633332b8ba1a550038e23860f9dbf0b2fcf95,'Initial ID','org.osaaf.people',53344);
+INSERT INTO user_role(user,role,expires,ns,rname)
+  VALUES ('aaf_admin@people.osaaf.org','org.osaaf.aaf.admin','2018-10-31','org.osaaf.aaf','admin');
+
+// A Deployer
+insert into cred (id,type,expires,cred,notes,ns,other) values('deployer@people.osaaf.org',2,'2019-05-01',0xd993c5617486296f1b99d04de31633332b8ba1a550038e23860f9dbf0b2fcf95,'Initial ID','org.osaaf.people',53344);
+INSERT INTO role(ns, name, perms, description)
+  VALUES('org.osaaf.aaf','deploy',{},'ONAP Deployment Role');
+INSERT INTO user_role(user,role,expires,ns,rname)
+  VALUES ('deployer@people.osaaf.org','org.osaaf.aaf.deploy','2018-10-31','org.osaaf.aaf','deploy');
+
+
 // DEMO ID (OPS)
 insert into cred (id,type,expires,cred,notes,ns,other) values('demo@people.osaaf.org',2,'2019-05-01',0xd993c5617486296f1b99d04de31633332b8ba1a550038e23860f9dbf0b2fcf95,'Initial ID','org.osaaf.people',53344);
 INSERT INTO user_role(user,role,expires,ns,rname)
diff --git a/auth/auth-cass/src/main/cql/pull.sh b/auth/auth-cass/src/main/cql/pull.sh
new file mode 100644 (file)
index 0000000..f4db573
--- /dev/null
@@ -0,0 +1,5 @@
+for T in x509 ns_attrib config cred user_role perm role artifact ns; do
+  cqlsh -e "use authz; COPY $T TO '$T.dat' WITH DELIMITER='|';"
+done
+tar -cvzf dat.gz *.dat
+
diff --git a/auth/auth-cass/src/main/cql/push.sh b/auth/auth-cass/src/main/cql/push.sh
new file mode 100644 (file)
index 0000000..8026c9f
--- /dev/null
@@ -0,0 +1,5 @@
+tar -xvf dat.gz
+for T in x509 ns_attrib config cred user_role perm role artifact ns; do
+  cqlsh -e "use authz; COPY $T FROM '$T.dat' WITH DELIMITER='|';"
+done
+
index b7415be..3032372 100644 (file)
@@ -1,5 +1,5 @@
 USE authz;
 // Create Root pass
 INSERT INTO cred (id,ns,type,cred,expires)
-  VALUES ('osaaf@aaf.osaaf.org','org.osaaf.aaf',1,0xdd82c1882969461de74b46427961ea2c,'2099-12-31') using TTL 14400;
+  VALUES ('aaf@aaf.osaaf.org','org.osaaf.aaf',1,0xdd82c1882969461de74b46427961ea2c,'2099-12-31') using TTL 14400;
 
index 5bdb215..eb44e14 100644 (file)
@@ -28,16 +28,16 @@ import java.util.List;
 
 import org.onap.aaf.auth.dao.cass.NsSplit;
 import org.onap.aaf.auth.dao.cass.PermDAO;
-import org.onap.aaf.auth.dao.cass.Status;
 import org.onap.aaf.auth.dao.cass.PermDAO.Data;
+import org.onap.aaf.auth.dao.cass.Status;
 import org.onap.aaf.auth.dao.hl.Question;
 import org.onap.aaf.auth.env.AuthzEnv;
 import org.onap.aaf.auth.env.AuthzTrans;
 import org.onap.aaf.auth.env.NullTrans;
 import org.onap.aaf.auth.layer.Result;
+import org.onap.aaf.cadi.Access.Level;
 import org.onap.aaf.cadi.Lur;
 import org.onap.aaf.cadi.Permission;
-import org.onap.aaf.cadi.Access.Level;
 import org.onap.aaf.cadi.lur.LocalPermission;
 import org.onap.aaf.misc.env.util.Split;
 
@@ -52,17 +52,23 @@ public class DirectAAFLur implements Lur {
        }
 
        @Override
-       public boolean fish(Principal bait, Permission pond) {
+       public boolean fish(Principal bait, Permission ... pond) {
                return fish(env.newTransNoAvg(),bait,pond);
        }
        
-       public boolean fish(AuthzTrans trans, Principal bait, Permission pond) {
+       public boolean fish(AuthzTrans trans, Principal bait, Permission ... pond) {
+               boolean rv = false;
                Result<List<Data>> pdr = question.getPermsByUser(trans, bait.getName(),false);
                switch(pdr.status) {
                        case OK:
                                for(PermDAO.Data d : pdr.value) {
-                                       if(new PermPermission(d).match(pond)) {
-                                               return true;
+                                       if(!rv) {
+                                               for (Permission p : pond) {
+                                                       if(new PermPermission(d).match(p)) {
+                                                               rv=true;
+                                                               break;
+                                                       }
+                                               }
                                        }
                                }
                                break;
@@ -72,7 +78,7 @@ public class DirectAAFLur implements Lur {
                        default:
                                trans.error().log("Can't access Cassandra to fulfill Permission Query: ",pdr.status,"-",pdr.details);
                }
-               return false;
+               return rv;
        }
 
        @Override
@@ -94,7 +100,7 @@ public class DirectAAFLur implements Lur {
        }
 
        @Override
-       public boolean handlesExclusively(Permission pond) {
+       public boolean handlesExclusively(Permission ... pond) {
                return false;
        }
        
index 695d80f..1ddf022 100644 (file)
@@ -63,7 +63,7 @@ public class DirectRegistrar implements Registrant<AuthzEnv> {
                        locate.patch = split.length>2?Integer.parseInt(split[2]):0;
                        locate.minor = split.length>1?Integer.parseInt(split[1]):0;
                        locate.major = split.length>0?Integer.parseInt(split[0]):0;
-                       locate.hostname = access.getProperty(Config.CADI_REGISTRATION_HOSTNAME, null);
+                       locate.hostname = access.getProperty(Config.AAF_REGISTER_AS, null);
                        if(locate.hostname==null) {
                                locate.hostname = access.getProperty(Config.HOSTNAME, null);
                        }
index 26c3c67..8b1729e 100644 (file)
                        <groupId>org.onap.aaf.authz</groupId>
                        <artifactId>aaf-cadi-aaf</artifactId>
                </dependency>
+               
+                               <!-- Add the Organizations you wish to support. You can delete ONAP if 
+                       you have something else Match with Property Entry: Organization.<root ns>, 
+                       i.e. Organization.onap.org=org.onap.org.DefaultOrg -->
+               <dependency>
+                       <groupId>org.onap.aaf.authz</groupId>
+                       <artifactId>aaf-auth-deforg</artifactId>
+               </dependency>
 
                <dependency>
                        <groupId>com.google.code.jscep</groupId>
index e840ef5..f1f70a7 100644 (file)
@@ -57,20 +57,22 @@ public abstract class CA {
        private final String name;
        private final String env;
        private MessageDigest messageDigest;
+       private final String permNS; 
        private final String permType;
        private final ArrayList<String> idDomains;
        private String[] trustedCAs;
        private String[] caIssuerDNs;
-       private List<RDN> rdns; 
+       private List<RDN> rdns;
 
 
        protected CA(Access access, String caName, String env) throws IOException, CertException {
                trustedCAs = new String[4]; // starting array
                this.name = caName;
                this.env = env;
-               permType = access.getProperty(CM_CA_PREFIX + name + ".perm_type",null);
+               permNS = CM_CA_PREFIX + name;
+               permType = access.getProperty(permNS + ".perm_type",null);
                if(permType==null) {
-                       throw new CertException(CM_CA_PREFIX + name + ".perm_type" + MUST_EXIST_TO_CREATE_CSRS_FOR + caName);
+                       throw new CertException(permNS + ".perm_type" + MUST_EXIST_TO_CREATE_CSRS_FOR + caName);
                }
                caIssuerDNs = Split.splitTrim(':', access.getProperty(Config.CADI_X509_ISSUERS, null));
                
@@ -204,6 +206,10 @@ public abstract class CA {
        }
        
        
+       public String getPermNS() {
+               return permNS;
+       }
+       
        public String getPermType() {
                return permType;
        }
index af2d2f6..893e9f3 100644 (file)
@@ -203,7 +203,7 @@ public class LocalCA extends CA {
        public X509andChain sign(Trans trans, CSRMeta csrmeta) throws IOException, CertException {
                GregorianCalendar gc = new GregorianCalendar();
                Date start = gc.getTime();
-               gc.add(GregorianCalendar.MONTH, 2);
+               gc.add(GregorianCalendar.MONTH, 6);
                Date end = gc.getTime();
                X509Certificate x509;
                TimeTaken tt = trans.start("Create/Sign Cert",Env.SUB);
index 70ddd43..e40a7a2 100644 (file)
@@ -116,7 +116,7 @@ public class BCFactory extends Factory {
                CertmanValidator v = new CertmanValidator();
                if(v.nullOrBlank("cn", csr.cn())
                        .nullOrBlank("mechID", csr.mechID())
-                       .nullOrBlank("email", csr.email())
+//                     .nullOrBlank("email", csr.email())
                        .err()) {
                        return v.errs();
                } else {
index 7d417d5..f9fcad1 100644 (file)
@@ -156,6 +156,7 @@ public class CSRMeta {
                Date start = gc.getTime();
                gc.add(GregorianCalendar.DAY_OF_MONTH,2);
                Date end = gc.getTime();
+               @SuppressWarnings("deprecation")
                X509v3CertificateBuilder xcb = new X509v3CertificateBuilder(
                                x500Name(),
                                new BigInteger(12,random), // replace with Serialnumber scheme
index 794f63a..98fdf11 100644 (file)
@@ -32,16 +32,6 @@ import static org.onap.aaf.auth.layer.Result.ERR_Security;
 import static org.onap.aaf.auth.layer.Result.OK;
 
 import java.io.IOException;
-import java.security.KeyStore;
-import java.security.KeyStoreException;
-import java.security.NoSuchAlgorithmException;
-import java.security.PrivateKey;
-import java.security.cert.Certificate;
-import java.security.cert.CertificateException;
-import java.security.cert.X509Certificate;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -58,8 +48,6 @@ import org.onap.aaf.auth.env.AuthzEnv;
 import org.onap.aaf.auth.env.AuthzTrans;
 import org.onap.aaf.auth.layer.Result;
 import org.onap.aaf.cadi.aaf.AAFPermission;
-import org.onap.aaf.cadi.configure.CertException;
-import org.onap.aaf.cadi.configure.Factory;
 import org.onap.aaf.misc.env.APIException;
 import org.onap.aaf.misc.env.Data;
 import org.onap.aaf.misc.env.Env;
@@ -232,10 +220,17 @@ public abstract class FacadeImpl<REQ,CERT,ARTIFACTS,ERROR> extends org.onap.aaf.
        @Override
        public Result<Void> check(AuthzTrans trans, HttpServletResponse resp, String perm) throws IOException {
                String[] p = Split.split('|',perm);
-               if(p.length!=3) {
-                       return Result.err(Result.ERR_BadData,"Invalid Perm String");
+               AAFPermission ap;
+               switch(p.length) {
+                       case 3:
+                                ap = new AAFPermission(null, p[0],p[1],p[2]);
+                                break;
+                       case 4:
+                               ap = new AAFPermission(p[0],p[1],p[2],p[3]);
+                               break;
+                       default:
+                               return Result.err(Result.ERR_BadData,"Invalid Perm String");
                }
-               AAFPermission ap = new AAFPermission(p[0],p[1],p[2]);
                if(certman.aafLurPerm.fish(trans.getUserPrincipal(), ap)) {
                        resp.setContentType(voidResp);
                        resp.getOutputStream().write(0);
@@ -360,33 +355,33 @@ public abstract class FacadeImpl<REQ,CERT,ARTIFACTS,ERROR> extends org.onap.aaf.
 //             return Result.ok();
        }
 
-       private KeyStore keystore(AuthzTrans trans, CertResp cr, String[] trustChain, String name, char[] cap) throws KeyStoreException, CertificateException, APIException, IOException, CertException, NoSuchAlgorithmException {
-               KeyStore jks = KeyStore.getInstance("jks");
-               jks.load(null, cap);
-               
-               // Get the Cert(s)... Might include Trust store
-               List<String> lcerts = new ArrayList<>();
-               lcerts.add(cr.asCertString());
-               for(String s : trustChain) {
-                       lcerts.add(s);
-               }
-               
-               Collection<? extends Certificate> certColl = Factory.toX509Certificate(lcerts);
-               X509Certificate[] certs = new X509Certificate[certColl.size()];
-               certColl.toArray(certs);
-               KeyStore.ProtectionParameter protParam = new KeyStore.PasswordProtection(cap);
-               
-               PrivateKey pk = Factory.toPrivateKey(trans, cr.privateString());
-               KeyStore.PrivateKeyEntry pkEntry = 
-                               new KeyStore.PrivateKeyEntry(pk, new Certificate[] {certs[0]});
-               jks.setEntry(name, pkEntry, protParam);
-               
-               int i=0;
-               for(X509Certificate x509 : certs) {
-                       jks.setCertificateEntry("cert_"+ ++i, x509);
-               }
-               return jks;
-       }
+//     private KeyStore keystore(AuthzTrans trans, CertResp cr, String[] trustChain, String name, char[] cap) throws KeyStoreException, CertificateException, APIException, IOException, CertException, NoSuchAlgorithmException {
+//             KeyStore jks = KeyStore.getInstance("jks");
+//             jks.load(null, cap);
+//             
+//             // Get the Cert(s)... Might include Trust store
+//             List<String> lcerts = new ArrayList<>();
+//             lcerts.add(cr.asCertString());
+//             for(String s : trustChain) {
+//                     lcerts.add(s);
+//             }
+//             
+//             Collection<? extends Certificate> certColl = Factory.toX509Certificate(lcerts);
+//             X509Certificate[] certs = new X509Certificate[certColl.size()];
+//             certColl.toArray(certs);
+//             KeyStore.ProtectionParameter protParam = new KeyStore.PasswordProtection(cap);
+//             
+//             PrivateKey pk = Factory.toPrivateKey(trans, cr.privateString());
+//             KeyStore.PrivateKeyEntry pkEntry = 
+//                             new KeyStore.PrivateKeyEntry(pk, new Certificate[] {certs[0]});
+//             jks.setEntry(name, pkEntry, protParam);
+//             
+//             int i=0;
+//             for(X509Certificate x509 : certs) {
+//                     jks.setCertificateEntry("cert_"+ ++i, x509);
+//             }
+//             return jks;
+//     }
 
        @Override
        public Result<Void> renewCert(AuthzTrans trans, HttpServletRequest req, HttpServletResponse resp, boolean withTrust) {
index 376ae1b..744c3c3 100644 (file)
@@ -58,156 +58,173 @@ import org.onap.aaf.auth.org.Organization;
 import org.onap.aaf.auth.org.Organization.Identity;
 import org.onap.aaf.auth.org.OrganizationException;
 import org.onap.aaf.cadi.Hash;
+import org.onap.aaf.cadi.Permission;
 import org.onap.aaf.cadi.aaf.AAFPermission;
+import org.onap.aaf.cadi.config.Config;
 import org.onap.aaf.cadi.configure.Factory;
 import org.onap.aaf.cadi.util.FQI;
 import org.onap.aaf.misc.env.APIException;
 import org.onap.aaf.misc.env.util.Chrono;
 
-
 public class CMService {
        // If we add more CAs, may want to parameterize
        private static final int STD_RENEWAL = 30;
        private static final int MAX_RENEWAL = 60;
        private static final int MIN_RENEWAL = 10;
-       
+
        public static final String REQUEST = "request";
+       public static final String IGNORE_IPS = "ignoreIPs";
        public static final String RENEW = "renew";
        public static final String DROP = "drop";
-       public static final String IPS = "ips";
        public static final String DOMAIN = "domain";
 
-       private static final String CERTMAN = ".certman";
-       private static final String ACCESS = ".access";
-       
+       private static final String CERTMAN = "certman";
+       private static final String ACCESS = "access";
+
        private static final String[] NO_NOTES = new String[0];
+       private final Permission root_read_permission;
        private final CertDAO certDAO;
        private final CredDAO credDAO;
        private final ArtiDAO artiDAO;
        private AAF_CM certman;
 
-//     @SuppressWarnings("unchecked")
+       // @SuppressWarnings("unchecked")
        public CMService(final AuthzTrans trans, AAF_CM certman) throws APIException, IOException {
-               // Jonathan 4/2015 SessionFilter unneeded... DataStax already deals with Multithreading well
-               
-               HistoryDAO hd = new HistoryDAO(trans,  certman.cluster, CassAccess.KEYSPACE);
+               // Jonathan 4/2015 SessionFilter unneeded... DataStax already deals with
+               // Multithreading well
+
+               HistoryDAO hd = new HistoryDAO(trans, certman.cluster, CassAccess.KEYSPACE);
                CacheInfoDAO cid = new CacheInfoDAO(trans, hd);
                certDAO = new CertDAO(trans, hd, cid);
                credDAO = new CredDAO(trans, hd, cid);
                artiDAO = new ArtiDAO(trans, hd, cid);
 
                this.certman = certman;
+               
+               root_read_permission=new AAFPermission(
+                       trans.getProperty(Config.AAF_ROOT_NS, Config.AAF_ROOT_NS_DEF),
+                       "access",
+                       "*",
+                       "read"
+               );
        }
-       
-       public Result<CertResp> requestCert(final AuthzTrans trans,final Result<CertReq> req, final CA ca) {
-               if(req.isOK()) {
 
-                       if(req.value.fqdns.isEmpty()) {
-                               return Result.err(Result.ERR_BadData,"No Machines passed in Request");
+       public Result<CertResp> requestCert(final AuthzTrans trans, final Result<CertReq> req, final CA ca) {
+               if (req.isOK()) {
+
+                       if (req.value.fqdns.isEmpty()) {
+                               return Result.err(Result.ERR_BadData, "No Machines passed in Request");
                        }
-                       
+
                        String key = req.value.fqdns.get(0);
-                       
+
                        // Policy 6: Requester must be granted Change permission in Namespace requested
                        String mechNS = FQI.reverseDomain(req.value.mechid);
-                       if(mechNS==null) {
-                               return Result.err(Status.ERR_Denied, "%s does not reflect a valid AAF Namespace",req.value.mechid);
-                       }
-                       
-
-                       // Disallow non-AAF CA without special permission
-                       if(!"aaf".equals(ca.getName()) && !trans.fish( new AAFPermission(mechNS+CERTMAN, ca.getName(), REQUEST))) {
-                               return Result.err(Status.ERR_Denied, "'%s' does not have permission to request Certificates from Certificate Authority '%s'", 
-                                               trans.user(),ca.getName());
+                       if (mechNS == null) {
+                               return Result.err(Status.ERR_Denied, "%s does not reflect a valid AAF Namespace", req.value.mechid);
                        }
 
                        List<String> notes = null;
                        List<String> fqdns = new ArrayList<>(req.value.fqdns);
-                       
-                       
+
                        String email = null;
 
                        try {
                                Organization org = trans.org();
-                               
+
+                               boolean ignoreIPs = trans.fish(new AAFPermission(mechNS,CERTMAN, ca.getName(), IGNORE_IPS));
+
                                InetAddress primary = null;
                                // Organize incoming information to get to appropriate Artifact
-                               if(!fqdns.isEmpty()) {
+                               if (!fqdns.isEmpty()) {
                                        // Accept domain wild cards, but turn into real machines
                                        // Need *domain.com:real.machine.domain.com:san.machine.domain.com:...
-                                       if(fqdns.get(0).startsWith("*")) { // Domain set
-                                               if(!trans.fish(new AAFPermission(ca.getPermType(), ca.getName(), DOMAIN))) {
-                                                       return Result.err(Result.ERR_Denied, "Domain based Authorizations (" + fqdns.get(0) + ") requires Exception");
+                                       if (fqdns.get(0).startsWith("*")) { // Domain set
+                                               if (!trans.fish(new AAFPermission(null,ca.getPermType(), ca.getName(), DOMAIN))) {
+                                                       return Result.err(Result.ERR_Denied,
+                                                                       "Domain based Authorizations (" + fqdns.get(0) + ") requires Exception");
                                                }
-                                               
-                                               //TODO check for Permission in Add Artifact?
+
+                                               // TODO check for Permission in Add Artifact?
                                                String domain = fqdns.get(0).substring(1);
                                                fqdns.remove(0);
-            if(fqdns.isEmpty()) {
-              return Result.err(Result.ERR_Denied, "Requests using domain require machine declaration");
-            }
-
-            InetAddress ia = InetAddress.getByName(fqdns.get(0));
-            if(ia==null) {
-              return Result.err(Result.ERR_Denied, "Request not made from matching IP matching domain");
-            } else if(ia.getHostName().endsWith(domain)) {
-              primary = ia;
-            }
-                                       
-                                       } else {
-                                               for(String cn : req.value.fqdns) {
-                                                       try {
-                                                               InetAddress[] ias = InetAddress.getAllByName(cn);
-                                                               Set<String> potentialSanNames = new HashSet<>();
-                                                               for(InetAddress ia1 : ias) {
-                                                                       InetAddress ia2 = InetAddress.getByAddress(ia1.getAddress());
-                                                                       if(primary==null && ias.length==1 && trans.ip().equals(ia1.getHostAddress())) {
-                                                                               primary = ia1;
-                                                                       } else if(!cn.equals(ia1.getHostName()) && !ia2.getHostName().equals(ia2.getHostAddress())) {
-                                                                               potentialSanNames.add(ia1.getHostName());
+                                               if (fqdns.isEmpty()) {
+                                                       return Result.err(Result.ERR_Denied, "Requests using domain require machine declaration");
+                                               }
+
+                                               if (!ignoreIPs) {
+                                                       InetAddress ia = InetAddress.getByName(fqdns.get(0));
+                                                       if (ia == null) {
+                                                               return Result.err(Result.ERR_Denied,
+                                                                               "Request not made from matching IP matching domain");
+                                                       } else if (ia.getHostName().endsWith(domain)) {
+                                                               primary = ia;
+                                                       }
+                                               }
+
+                                       } else {
+                                               for (String cn : req.value.fqdns) {
+                                                       if(ignoreIPs) {
+                                                               potentialSanNames.add(cn);
+                                                       } else {
+                                                               try {
+                                                                       InetAddress[] ias = InetAddress.getAllByName(cn);
+                                                                       Set<String> potentialSanNames = new HashSet<>();
+                                                                       for (InetAddress ia1 : ias) {
+                                                                               InetAddress ia2 = InetAddress.getByAddress(ia1.getAddress());
+                                                                               if (primary == null && ias.length == 1 && trans.ip().equals(ia1.getHostAddress())) {
+                                                                                       primary = ia1;
+                                                                               } else if (!cn.equals(ia1.getHostName())
+                                                                                               && !ia2.getHostName().equals(ia2.getHostAddress())) {
+                                                                                       potentialSanNames.add(ia1.getHostName());
+                                                                               }
                                                                        }
+                                                               } catch (UnknownHostException e1) {
+                                                                       return Result.err(Result.ERR_BadData, "There is no DNS lookup for %s", cn);
                                                                }
-                                                       } catch (UnknownHostException e1) {
-                                                               return Result.err(Result.ERR_BadData,"There is no DNS lookup for %s",cn);
                                                        }
-                                               
                                                }
                                        }
                                }
-                               
-                               if(primary==null) {
-                                       return Result.err(Result.ERR_Denied, "Request not made from matching IP (%s)",trans.ip());
+
+                               final String host;
+                               if(ignoreIPs) {
+                                       host = req.value.fqdns.get(0);
+                               } else if (primary == null) {
+                                       return Result.err(Result.ERR_Denied, "Request not made from matching IP (%s)", trans.ip());
+                               } else {
+                                       host = primary.getHostAddress();
                                }
-                               
+
                                ArtiDAO.Data add = null;
-                               Result<List<ArtiDAO.Data>> ra = artiDAO.read(trans, req.value.mechid,primary.getHostAddress());
-                               if(ra.isOKhasData()) {
-                                       if(add==null) {
+                               Result<List<ArtiDAO.Data>> ra = artiDAO.read(trans, req.value.mechid, host);
+                               if (ra.isOKhasData()) {
+                                       if (add == null) {
                                                add = ra.value.get(0); // single key
                                        }
                                } else {
-                                        ra = artiDAO.read(trans, req.value.mechid,key);
-                                        if(ra.isOKhasData()) { // is the Template available?
-                                                add = ra.value.get(0);
-                                                add.machine=primary.getHostName();
-                                                for(String s : fqdns) {
-                                                         if(!s.equals(add.machine)) {
-                                                                 add.sans(true).add(s);
-                                                         }
-                                                }
-                                                Result<ArtiDAO.Data> rc = artiDAO.create(trans, add); // Create new Artifact from Template
-                                                if(rc.notOK()) {
-                                                        return Result.err(rc);
-                                                }
-                                        } else {
-                                                add = ra.value.get(0);
-                                        }
+                                       ra = artiDAO.read(trans, req.value.mechid, key);
+                                       if (ra.isOKhasData()) { // is the Template available?
+                                               add = ra.value.get(0);
+                                               add.machine = host;
+                                               for (String s : fqdns) {
+                                                       if (!s.equals(add.machine)) {
+                                                               add.sans(true).add(s);
+                                                       }
+                                               }
+                                               Result<ArtiDAO.Data> rc = artiDAO.create(trans, add); // Create new Artifact from Template
+                                               if (rc.notOK()) {
+                                                       return Result.err(rc);
+                                               }
+                                       } else {
+                                               add = ra.value.get(0);
+                                       }
                                }
-                               
+
                                // Add Artifact listed FQDNs
-                               if(add.sans!=null) {
-                                       for(String s : add.sans) {
-                                               if(!fqdns.contains(s)) {
+                               if (add.sans != null) {
+                                       for (String s : add.sans) {
+                                               if (!fqdns.contains(s)) {
                                                        fqdns.add(s);
                                                }
                                        }
@@ -215,134 +232,142 @@ public class CMService {
 
                                // Policy 2: If Config marked as Expired, do not create or renew
                                Date now = new Date();
-                               if(add.expires!=null && now.after(add.expires)) {
-                                       return Result.err(Result.ERR_Policy,"Configuration for %s %s is expired %s",add.mechid,add.machine,Chrono.dateFmt.format(add.expires));
+                               if (add.expires != null && now.after(add.expires)) {
+                                       return Result.err(Result.ERR_Policy, "Configuration for %s %s is expired %s", add.mechid,
+                                                       add.machine, Chrono.dateFmt.format(add.expires));
                                }
-                               
+
                                // Policy 3: MechID must be current
                                Identity muser = org.getIdentity(trans, add.mechid);
-                               if(muser == null) {
-                                       return Result.err(Result.ERR_Policy,"MechID must exist in %s",org.getName());
+                               if (muser == null) {
+                                       return Result.err(Result.ERR_Policy, "MechID must exist in %s", org.getName());
                                }
-                               
+
                                // Policy 4: Sponsor must be current
                                Identity ouser = muser.responsibleTo();
-                               if(ouser==null) {
-                                       return Result.err(Result.ERR_Policy,"%s does not have a current sponsor at %s",add.mechid,org.getName());
-                               } else if(!ouser.isFound() || ouser.mayOwn()!=null) {
-                                       return Result.err(Result.ERR_Policy,"%s reports that %s cannot be responsible for %s",org.getName(),trans.user());
+                               if (ouser == null) {
+                                       return Result.err(Result.ERR_Policy, "%s does not have a current sponsor at %s", add.mechid,
+                                                       org.getName());
+                               } else if (!ouser.isFound() || ouser.mayOwn() != null) {
+                                       return Result.err(Result.ERR_Policy, "%s reports that %s cannot be responsible for %s",
+                                                       org.getName(), trans.user());
                                }
-                               
+
                                // Set Email from most current Sponsor
                                email = ouser.email();
-                               
+
                                // Policy 5: keep Artifact data current
-                               if(!ouser.fullID().equals(add.sponsor)) {
+                               if (!ouser.fullID().equals(add.sponsor)) {
                                        add.sponsor = ouser.fullID();
                                        artiDAO.update(trans, add);
                                }
-               
-                               // Policy 7: Caller must be the MechID or have specifically delegated permissions
-        if(!(trans.user().equals(req.value.mechid) || trans.fish(new AAFPermission(mechNS + CERTMAN, ca.getName() , REQUEST)))) {
-                                       return Result.err(Status.ERR_Denied, "%s must have access to modify x509 certs in NS %s",trans.user(),mechNS);
+
+                               // Policy 7: Caller must be the MechID or have specifically delegated
+                               // permissions
+                               if (!(trans.user().equals(req.value.mechid)
+                                               || trans.fish(new AAFPermission(mechNS,CERTMAN, ca.getName(), REQUEST)))) {
+                                       return Result.err(Status.ERR_Denied, "%s must have access to modify x509 certs in NS %s",
+                                                       trans.user(), mechNS);
                                }
-                               
+
                                // Make sure Primary is the first in fqdns
-                               if(fqdns.size()>1) {
-                                       for(int i=0;i<fqdns.size();++i) {
-                                               if(fqdns.get(i).equals(primary.getHostName())) {
-                                                       if(i!=0) {
-                                                               String tmp = fqdns.get(0);
-                                                               fqdns.set(0, primary.getHostName());
-                                                               fqdns.set(i, tmp);
+                               if (fqdns.size() > 1) {
+                                       for (int i = 0; i < fqdns.size(); ++i) {
+                                               if(primary==null) {
+                                                       trans.error().log("CMService var primary is null");
+                                               } else {
+                                                       String fg = fqdns.get(i);
+                                                       if (fg!=null && fg.equals(primary.getHostName())) {
+                                                               if (i != 0) {
+                                                                       String tmp = fqdns.get(0);
+                                                                       fqdns.set(0, primary.getHostName());
+                                                                       fqdns.set(i, tmp);
+                                                               }
                                                        }
                                                }
                                        }
                                }
                        } catch (Exception e) {
+                               e.printStackTrace();
                                trans.error().log(e);
-                               return Result.err(Status.ERR_Denied,"MechID Sponsorship cannot be determined at this time.  Try later");
+                               return Result.err(Status.ERR_Denied,
+                                               "AppID Sponsorship cannot be determined at this time.  Try later.");
                        }
-                       
+
                        CSRMeta csrMeta;
                        try {
-                               csrMeta = BCFactory.createCSRMeta(
-                                               ca, 
-                                               req.value.mechid, 
-                                               email, 
-                                               fqdns);
+                               csrMeta = BCFactory.createCSRMeta(ca, req.value.mechid, email, fqdns);
                                X509andChain x509ac = ca.sign(trans, csrMeta);
-                               if(x509ac==null) {
-                                       return Result.err(Result.ERR_ActionNotCompleted,"x509 Certificate not signed by CA");
+                               if (x509ac == null) {
+                                       return Result.err(Result.ERR_ActionNotCompleted, "x509 Certificate not signed by CA");
                                }
                                trans.info().printf("X509 Subject: %s", x509ac.getX509().getSubjectDN());
-                               
+
                                X509Certificate x509 = x509ac.getX509();
                                CertDAO.Data cdd = new CertDAO.Data();
-                               cdd.ca=ca.getName();
-                               cdd.serial=x509.getSerialNumber();
-                               cdd.id=req.value.mechid;
-                               cdd.x500=x509.getSubjectDN().getName();
-                               cdd.x509=Factory.toString(trans, x509);
+                               cdd.ca = ca.getName();
+                               cdd.serial = x509.getSerialNumber();
+                               cdd.id = req.value.mechid;
+                               cdd.x500 = x509.getSubjectDN().getName();
+                               cdd.x509 = Factory.toString(trans, x509);
                                certDAO.create(trans, cdd);
-                               
+
                                CredDAO.Data crdd = new CredDAO.Data();
                                crdd.other = Question.random.nextInt();
-                               crdd.cred=getChallenge256SaltedHash(csrMeta.challenge(),crdd.other);
+                               crdd.cred = getChallenge256SaltedHash(csrMeta.challenge(), crdd.other);
                                crdd.expires = x509.getNotAfter();
                                crdd.id = req.value.mechid;
                                crdd.ns = Question.domain2ns(crdd.id);
                                crdd.type = CredDAO.CERT_SHA256_RSA;
                                credDAO.create(trans, crdd);
-                               
-                               CertResp cr = new CertResp(trans, ca, x509, csrMeta, x509ac.getTrustChain(),compileNotes(notes));
+
+                               CertResp cr = new CertResp(trans, ca, x509, csrMeta, x509ac.getTrustChain(), compileNotes(notes));
                                return Result.ok(cr);
                        } catch (Exception e) {
                                trans.error().log(e);
-                               return Result.err(Result.ERR_ActionNotCompleted,e.getMessage());
+                               return Result.err(Result.ERR_ActionNotCompleted, e.getMessage());
                        }
                } else {
                        return Result.err(req);
                }
        }
 
-    public Result<CertResp> renewCert(AuthzTrans trans, Result<CertRenew> renew) {
-               if(renew.isOK()) {
-                       return Result.err(Result.ERR_NotImplemented,"Not implemented yet");
+       public Result<CertResp> renewCert(AuthzTrans trans, Result<CertRenew> renew) {
+               if (renew.isOK()) {
+                       return Result.err(Result.ERR_NotImplemented, "Not implemented yet");
                } else {
                        return Result.err(renew);
-               }       
+               }
        }
 
        public Result<Void> dropCert(AuthzTrans trans, Result<CertDrop> drop) {
-               if(drop.isOK()) {
-                       return Result.err(Result.ERR_NotImplemented,"Not implemented yet");
+               if (drop.isOK()) {
+                       return Result.err(Result.ERR_NotImplemented, "Not implemented yet");
                } else {
                        return Result.err(drop);
-               }       
+               }
        }
 
        public Result<List<Data>> readCertsByMechID(AuthzTrans trans, String mechID) {
                // Policy 1: To Read, must have NS Read or is Sponsor
                String ns = Question.domain2ns(mechID);
                try {
-                       if( trans.user().equals(mechID)
-          || trans.fish(new AAFPermission(ns + ACCESS, "*", "read"))
-                                       || (trans.org().validate(trans,Organization.Policy.OWNS_MECHID,null,mechID))==null) {
+                       if (trans.user().equals(mechID) || trans.fish(new AAFPermission(ns,ACCESS, "*", "read"))
+                                       || (trans.org().validate(trans, Organization.Policy.OWNS_MECHID, null, mechID)) == null) {
                                return certDAO.readID(trans, mechID);
                        } else {
-                               return Result.err(Result.ERR_Denied,"%s is not the ID, Sponsor or NS Owner/Admin for %s at %s",
-                                               trans.user(),mechID,trans.org().getName());
+                               return Result.err(Result.ERR_Denied, "%s is not the ID, Sponsor or NS Owner/Admin for %s at %s",
+                                               trans.user(), mechID, trans.org().getName());
                        }
-               } catch(OrganizationException e) {
+               } catch (OrganizationException e) {
                        return Result.err(e);
                }
        }
 
        public Result<CertResp> requestPersonalCert(AuthzTrans trans, CA ca) {
-               if(ca.inPersonalDomains(trans.getUserPrincipal())) {
+               if (ca.inPersonalDomains(trans.getUserPrincipal())) {
                        Organization org = trans.org();
-                               
+
                        // Policy 1: MechID must be current
                        Identity ouser;
                        try {
@@ -351,39 +376,36 @@ public class CMService {
                                trans.error().log(e1);
                                ouser = null;
                        }
-                       if(ouser == null) {
-                               return Result.err(Result.ERR_Policy,"Requesting User must exist in %s",org.getName());
+                       if (ouser == null) {
+                               return Result.err(Result.ERR_Policy, "Requesting User must exist in %s", org.getName());
                        }
-                               
+
                        // Set Email from most current Sponsor
-                               
+
                        CSRMeta csrMeta;
                        try {
-                               csrMeta = BCFactory.createPersonalCSRMeta(
-                                               ca, 
-                                               trans.user(), 
-                                               ouser.email());
+                               csrMeta = BCFactory.createPersonalCSRMeta(ca, trans.user(), ouser.email());
                                X509andChain x509ac = ca.sign(trans, csrMeta);
-                               if(x509ac==null) {
-                                       return Result.err(Result.ERR_ActionNotCompleted,"x509 Certificate not signed by CA");
+                               if (x509ac == null) {
+                                       return Result.err(Result.ERR_ActionNotCompleted, "x509 Certificate not signed by CA");
                                }
                                X509Certificate x509 = x509ac.getX509();
                                CertDAO.Data cdd = new CertDAO.Data();
-                               cdd.ca=ca.getName();
-                               cdd.serial=x509.getSerialNumber();
-                               cdd.id=trans.user();
-                               cdd.x500=x509.getSubjectDN().getName();
-                               cdd.x509=Factory.toString(trans, x509);
+                               cdd.ca = ca.getName();
+                               cdd.serial = x509.getSerialNumber();
+                               cdd.id = trans.user();
+                               cdd.x500 = x509.getSubjectDN().getName();
+                               cdd.x509 = Factory.toString(trans, x509);
                                certDAO.create(trans, cdd);
-                               
+
                                CertResp cr = new CertResp(trans, ca, x509, csrMeta, x509ac.getTrustChain(), compileNotes(null));
                                return Result.ok(cr);
                        } catch (Exception e) {
                                trans.error().log(e);
-                               return Result.err(Result.ERR_ActionNotCompleted,e.getMessage());
+                               return Result.err(Result.ERR_ActionNotCompleted, e.getMessage());
                        }
                } else {
-                       return Result.err(Result.ERR_Denied,trans.user()," not supported for CA",ca.getName());
+                       return Result.err(Result.ERR_Denied, trans.user(), " not supported for CA", ca.getName());
                }
        }
 
@@ -392,71 +414,69 @@ public class CMService {
        //////////////
        public Result<Void> createArtifact(AuthzTrans trans, List<ArtiDAO.Data> list) {
                CertmanValidator v = new CertmanValidator().artisRequired(list, 1);
-               if(v.err()) {
-                       return Result.err(Result.ERR_BadData,v.errs());
+               if (v.err()) {
+                       return Result.err(Result.ERR_BadData, v.errs());
                }
-               for(ArtiDAO.Data add : list) {
+               for (ArtiDAO.Data add : list) {
                        try {
                                // Policy 1: MechID must exist in Org
                                Identity muser = trans.org().getIdentity(trans, add.mechid);
-                               if(muser == null) {
-                                       return Result.err(Result.ERR_Denied,"%s is not valid for %s", add.mechid,trans.org().getName());
+                               if (muser == null) {
+                                       return Result.err(Result.ERR_Denied, "%s is not valid for %s", add.mechid, trans.org().getName());
                                }
-                               
+
                                // Policy 2: MechID must have valid Organization Owner
                                Identity emailUser;
-                               if(muser.isPerson()) {
+                               if (muser.isPerson()) {
                                        emailUser = muser;
                                } else {
                                        Identity ouser = muser.responsibleTo();
-                                       if(ouser == null) {
-                                               return Result.err(Result.ERR_Denied,"%s is not a valid Sponsor for %s at %s",
-                                                               trans.user(),add.mechid,trans.org().getName());
+                                       if (ouser == null) {
+                                               return Result.err(Result.ERR_Denied, "%s is not a valid Sponsor for %s at %s", trans.user(),
+                                                               add.mechid, trans.org().getName());
                                        }
 
                                        // Policy 3: Calling ID must be MechID Owner
-                                       if(!trans.user().equals(ouser.fullID())) {
-                                               return Result.err(Result.ERR_Denied,"%s is not the Sponsor for %s at %s",
-                                                               trans.user(),add.mechid,trans.org().getName());
+                                       if (!trans.user().startsWith(ouser.id())) {
+                                               return Result.err(Result.ERR_Denied, "%s is not the Sponsor for %s at %s", trans.user(),
+                                                               add.mechid, trans.org().getName());
                                        }
                                        emailUser = ouser;
                                }
-                               
 
-                               // Policy 4: Renewal Days are between 10 and 60 (constants, may be parameterized)
-                               if(add.renewDays<MIN_RENEWAL) {
+                               // Policy 4: Renewal Days are between 10 and 60 (constants, may be
+                               // parameterized)
+                               if (add.renewDays < MIN_RENEWAL) {
                                        add.renewDays = STD_RENEWAL;
-                               } else if(add.renewDays>MAX_RENEWAL) {
+                               } else if (add.renewDays > MAX_RENEWAL) {
                                        add.renewDays = MAX_RENEWAL;
                                }
-                               
+
                                // Policy 5: If Notify is blank, set to Owner's Email
-                               if(add.notify==null || add.notify.length()==0) {
-                                       add.notify = "mailto:"+emailUser.email();
+                               if (add.notify == null || add.notify.length() == 0) {
+                                       add.notify = "mailto:" + emailUser.email();
                                }
-                               
+
                                // Policy 6: Only do Domain by Exception
-                               if(add.machine.startsWith("*")) { // Domain set
+                               if (add.machine.startsWith("*")) { // Domain set
                                        CA ca = certman.getCA(add.ca);
 
-
-                                       if(!trans.fish(new AAFPermission(ca.getPermType(), add.ca, DOMAIN))) {
-                                               return Result.err(Result.ERR_Denied,"Domain Artifacts (%s) requires specific Permission",
-                                                       add.machine);
+                                       if (!trans.fish(new AAFPermission(ca.getPermNS(),ca.getPermType(), add.ca, DOMAIN))) {
+                                               return Result.err(Result.ERR_Denied, "Domain Artifacts (%s) requires specific Permission",
+                                                               add.machine);
                                        }
                                }
 
                                // Set Sponsor from Golden Source
                                add.sponsor = emailUser.fullID();
-                               
-                               
+
                        } catch (OrganizationException e) {
                                return Result.err(e);
                        }
                        // Add to DB
                        Result<ArtiDAO.Data> rv = artiDAO.create(trans, add);
                        // TODO come up with Partial Reporting Scheme, or allow only one at a time.
-                       if(rv.notOK()) {
+                       if (rv.notOK()) {
                                return Result.err(rv);
                        }
                }
@@ -465,40 +485,45 @@ public class CMService {
 
        public Result<List<ArtiDAO.Data>> readArtifacts(AuthzTrans trans, ArtiDAO.Data add) throws OrganizationException {
                CertmanValidator v = new CertmanValidator().keys(add);
-               if(v.err()) {
-                       return Result.err(Result.ERR_BadData,v.errs());
+               if (v.err()) {
+                       return Result.err(Result.ERR_BadData, v.errs());
                }
                Result<List<ArtiDAO.Data>> data = artiDAO.read(trans, add);
-               if(data.notOKorIsEmpty()) {
+               if (data.notOKorIsEmpty()) {
                        return data;
                }
                add = data.value.get(0);
-               if( trans.user().equals(add.mechid)
-      || trans.fish(new AAFPermission(add.ns + ACCESS, "*", "read"))
-      || trans.fish(new AAFPermission(add.ns+CERTMAN,add.ca,"read"))
-      || trans.fish(new AAFPermission(add.ns+CERTMAN,add.ca,"request"))
-                       || (trans.org().validate(trans,Organization.Policy.OWNS_MECHID,null,add.mechid))==null) {
+               if (trans.user().equals(add.mechid) 
+                               || trans.fish(root_read_permission,
+                                                         new AAFPermission(add.ns,ACCESS, "*", "read"),
+                                                     new AAFPermission(add.ns,CERTMAN, add.ca, "read"),
+                                                     new AAFPermission(add.ns,CERTMAN, add.ca, "request"))
+                               || (trans.org().validate(trans, Organization.Policy.OWNS_MECHID, null, add.mechid)) == null) {
                        return data;
                } else {
-                       return Result.err(Result.ERR_Denied,"%s is not %s, is not the sponsor, and doesn't have delegated permission.",trans.user(),add.mechid,add.ns+".certman|"+add.ca+"|read or ...|request"); // note: reason is set by 2nd case, if 1st case misses
+                       return Result.err(Result.ERR_Denied,
+                                       "%s is not %s, is not the sponsor, and doesn't have delegated permission.", trans.user(),
+                                       add.mechid, add.ns + ".certman|" + add.ca + "|read or ...|request"); // note: reason is set by 2nd
+                                                                                                                                                                                       // case, if 1st case misses
                }
 
        }
 
-       public Result<List<ArtiDAO.Data>> readArtifactsByMechID(AuthzTrans trans, String mechid) throws OrganizationException {
+       public Result<List<ArtiDAO.Data>> readArtifactsByMechID(AuthzTrans trans, String mechid)
+                       throws OrganizationException {
                CertmanValidator v = new CertmanValidator();
                v.nullOrBlank("mechid", mechid);
-               if(v.err()) {
-                       return Result.err(Result.ERR_BadData,v.errs());
+               if (v.err()) {
+                       return Result.err(Result.ERR_BadData, v.errs());
                }
                String ns = FQI.reverseDomain(mechid);
-               
+
                String reason;
-    if(trans.fish(new AAFPermission(ns + ACCESS, "*", "read"))
-                       || (reason=trans.org().validate(trans,Organization.Policy.OWNS_MECHID,null,mechid))==null) {
+               if (trans.fish(new AAFPermission(ns, ACCESS, "*", "read"))
+                               || (reason = trans.org().validate(trans, Organization.Policy.OWNS_MECHID, null, mechid)) == null) {
                        return artiDAO.readByMechID(trans, mechid);
                } else {
-                       return Result.err(Result.ERR_Denied,reason); // note: reason is set by 2nd case, if 1st case misses
+                       return Result.err(Result.ERR_Denied, reason); // note: reason is set by 2nd case, if 1st case misses
                }
 
        }
@@ -506,10 +531,10 @@ public class CMService {
        public Result<List<ArtiDAO.Data>> readArtifactsByMachine(AuthzTrans trans, String machine) {
                CertmanValidator v = new CertmanValidator();
                v.nullOrBlank("machine", machine);
-               if(v.err()) {
-                       return Result.err(Result.ERR_BadData,v.errs());
+               if (v.err()) {
+                       return Result.err(Result.ERR_BadData, v.errs());
                }
-               
+
                // TODO do some checks?
 
                Result<List<ArtiDAO.Data>> rv = artiDAO.readByMachine(trans, machine);
@@ -519,43 +544,43 @@ public class CMService {
        public Result<List<ArtiDAO.Data>> readArtifactsByNs(AuthzTrans trans, String ns) {
                CertmanValidator v = new CertmanValidator();
                v.nullOrBlank("ns", ns);
-               if(v.err()) {
-                       return Result.err(Result.ERR_BadData,v.errs());
+               if (v.err()) {
+                       return Result.err(Result.ERR_BadData, v.errs());
                }
-               
+
                // TODO do some checks?
 
-    return artiDAO.readByNs(trans, ns);
+               return artiDAO.readByNs(trans, ns);
        }
 
-
        public Result<Void> updateArtifact(AuthzTrans trans, List<ArtiDAO.Data> list) throws OrganizationException {
                CertmanValidator v = new CertmanValidator();
                v.artisRequired(list, 1);
-               if(v.err()) {
-                       return Result.err(Result.ERR_BadData,v.errs());
+               if (v.err()) {
+                       return Result.err(Result.ERR_BadData, v.errs());
                }
-               
+
                // Check if requesting User is Sponsor
-               //TODO - Shall we do one, or multiples?
-               for(ArtiDAO.Data add : list) {
+               // TODO - Shall we do one, or multiples?
+               for (ArtiDAO.Data add : list) {
                        // Policy 1: MechID must exist in Org
                        Identity muser = trans.org().getIdentity(trans, add.mechid);
-                       if(muser == null) {
-                               return Result.err(Result.ERR_Denied,"%s is not valid for %s", add.mechid,trans.org().getName());
+                       if (muser == null) {
+                               return Result.err(Result.ERR_Denied, "%s is not valid for %s", add.mechid, trans.org().getName());
                        }
-                       
+
                        // Policy 2: MechID must have valid Organization Owner
                        Identity ouser = muser.responsibleTo();
-                       if(ouser == null) {
-                               return Result.err(Result.ERR_Denied,"%s is not a valid Sponsor for %s at %s",
-                                               trans.user(),add.mechid,trans.org().getName());
+                       if (ouser == null) {
+                               return Result.err(Result.ERR_Denied, "%s is not a valid Sponsor for %s at %s", trans.user(), add.mechid,
+                                               trans.org().getName());
                        }
 
-                       // Policy 3: Renewal Days are between 10 and 60 (constants, may be parameterized)
-                       if(add.renewDays<MIN_RENEWAL) {
+                       // Policy 3: Renewal Days are between 10 and 60 (constants, may be
+                       // parameterized)
+                       if (add.renewDays < MIN_RENEWAL) {
                                add.renewDays = STD_RENEWAL;
-                       } else if(add.renewDays>MAX_RENEWAL) {
+                       } else if (add.renewDays > MAX_RENEWAL) {
                                add.renewDays = MAX_RENEWAL;
                        }
 
@@ -564,101 +589,99 @@ public class CMService {
                        add.sponsor = ouser.fullID();
 
                        // Policy 5: If Notify is blank, set to Owner's Email
-                       if(add.notify==null || add.notify.length()==0) {
-                               add.notify = "mailto:"+ouser.email();
+                       if (add.notify == null || add.notify.length() == 0) {
+                               add.notify = "mailto:" + ouser.email();
                        }
                        // Policy 6: Only do Domain by Exception
-                       if(add.machine.startsWith("*")) { // Domain set
+                       if (add.machine.startsWith("*")) { // Domain set
                                CA ca = certman.getCA(add.ca);
-                               if(ca==null) {
+                               if (ca == null) {
                                        return Result.err(Result.ERR_BadData, "CA is required in Artifact");
                                }
-                               if(!trans.fish(new AAFPermission(ca.getPermType(), add.ca, DOMAIN))) {
-                                       return Result.err(Result.ERR_Denied,"Domain Artifacts (%s) requires specific Permission",
-                                               add.machine);
+                               if (!trans.fish(new AAFPermission(null,ca.getPermType(), add.ca, DOMAIN))) {
+                                       return Result.err(Result.ERR_Denied, "Domain Artifacts (%s) requires specific Permission",
+                                                       add.machine);
                                }
                        }
 
                        // Policy 7: only Owner may update info
-                       if(trans.user().equals(add.sponsor)) {
+                       if (trans.user().startsWith(ouser.id())) {
                                return artiDAO.update(trans, add);
                        } else {
-                               return Result.err(Result.ERR_Denied,"%s may not update info for %s",trans.user(),muser.fullID());
+                               return Result.err(Result.ERR_Denied, "%s may not update info for %s", trans.user(), muser.fullID());
                        }
                }
-               return Result.err(Result.ERR_BadData,"No Artifacts to update");
+               return Result.err(Result.ERR_BadData, "No Artifacts to update");
        }
-       
+
        public Result<Void> deleteArtifact(AuthzTrans trans, String mechid, String machine) throws OrganizationException {
                CertmanValidator v = new CertmanValidator();
-               v.nullOrBlank("mechid", mechid)
-                .nullOrBlank("machine", machine);
-               if(v.err()) {
-                       return Result.err(Result.ERR_BadData,v.errs());
+               v.nullOrBlank("mechid", mechid).nullOrBlank("machine", machine);
+               if (v.err()) {
+                       return Result.err(Result.ERR_BadData, v.errs());
                }
 
                Result<List<ArtiDAO.Data>> rlad = artiDAO.read(trans, mechid, machine);
-               if(rlad.notOKorIsEmpty()) {
-                       return Result.err(Result.ERR_NotFound,"Artifact for %s %s does not exist.",mechid,machine);
+               if (rlad.notOKorIsEmpty()) {
+                       return Result.err(Result.ERR_NotFound, "Artifact for %s %s does not exist.", mechid, machine);
                }
-               
-               return deleteArtifact(trans,rlad.value.get(0));
+
+               return deleteArtifact(trans, rlad.value.get(0));
        }
-               
+
        private Result<Void> deleteArtifact(AuthzTrans trans, ArtiDAO.Data add) throws OrganizationException {
-               // Policy 1: Record should be delete able only by Existing Sponsor.  
-               String sponsor=null;
+               // Policy 1: Record should be delete able only by Existing Sponsor.
+               String sponsor = null;
                Identity muser = trans.org().getIdentity(trans, add.mechid);
-               if(muser != null) {
+               if (muser != null) {
                        Identity ouser = muser.responsibleTo();
-                       if(ouser!=null) {
+                       if (ouser != null) {
                                sponsor = ouser.fullID();
                        }
                }
-               // Policy 1.a: If Sponsorship is deleted in system of Record, then 
+               // Policy 1.a: If Sponsorship is deleted in system of Record, then
                // accept deletion by sponsor in Artifact Table
-               if(sponsor==null) {
+               if (sponsor == null) {
                        sponsor = add.sponsor;
                }
-               
+
                String ns = FQI.reverseDomain(add.mechid);
 
-    if(trans.fish(new AAFPermission(ns + ACCESS, "*", "write"))
-                               || trans.user().equals(sponsor)) {
+               if (trans.fish(new AAFPermission(ns,ACCESS, "*", "write")) || trans.user().equals(sponsor)) {
                        return artiDAO.delete(trans, add, false);
                }
-               return Result.err(Result.ERR_Denied, "%1 is not allowed to delete this item",trans.user());
+               return Result.err(Result.ERR_Denied, "%1 is not allowed to delete this item", trans.user());
        }
 
        public Result<Void> deleteArtifact(AuthzTrans trans, List<ArtiDAO.Data> list) {
                CertmanValidator v = new CertmanValidator().artisRequired(list, 1);
-               if(v.err()) {
-                       return Result.err(Result.ERR_BadData,v.errs());
+               if (v.err()) {
+                       return Result.err(Result.ERR_BadData, v.errs());
                }
 
                try {
                        boolean partial = false;
-                       Result<Void> result=null;
-                       for(ArtiDAO.Data add : list) {
+                       Result<Void> result = null;
+                       for (ArtiDAO.Data add : list) {
                                result = deleteArtifact(trans, add);
-                               if(result.notOK()) {
+                               if (result.notOK()) {
                                        partial = true;
                                }
                        }
-                       if(result == null) {
-                               result = Result.err(Result.ERR_BadData,"No Artifacts to delete"); 
-                       } else if(partial) {
+                       if (result == null) {
+                               result = Result.err(Result.ERR_BadData, "No Artifacts to delete");
+                       } else if (partial) {
                                result.partialContent(true);
                        }
                        return result;
-               } catch(Exception e) {
+               } catch (Exception e) {
                        return Result.err(e);
                }
        }
 
        private String[] compileNotes(List<String> notes) {
                String[] rv;
-               if(notes==null) {
+               if (notes == null) {
                        rv = NO_NOTES;
                } else {
                        rv = new String[notes.size()];
index dbfaaee..27ac04e 100644 (file)
@@ -21,7 +21,7 @@
  ******************************************************************************/
 package org.onap.aaf.auth.cm.facade;
 
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertNotNull;
 import static org.mockito.Mockito.CALLS_REAL_METHODS;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -31,31 +31,23 @@ import java.io.IOException;
 import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import javax.xml.namespace.QName;
-import javax.xml.validation.Schema;
 
 import org.junit.Before;
-import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mockito;
 import org.mockito.runners.MockitoJUnitRunner;
 import org.onap.aaf.auth.cm.AAF_CM;
-import org.onap.aaf.auth.cm.facade.FacadeImpl;
 import org.onap.aaf.auth.cm.mapper.Mapper;
 import org.onap.aaf.auth.cm.service.CMService;
 import org.onap.aaf.auth.env.AuthzEnv;
 import org.onap.aaf.auth.env.AuthzTrans;
 import org.onap.aaf.auth.layer.Result;
 import org.onap.aaf.cadi.aaf.AAFPermission;
-import org.onap.aaf.cadi.aaf.v2_0.AAFLurPerm;
 import org.onap.aaf.misc.env.APIException;
 import org.onap.aaf.misc.env.Data;
 import org.onap.aaf.misc.env.LogTarget;
 import org.onap.aaf.misc.env.TimeTaken;
-import org.onap.aaf.misc.env.Trans;
-import org.onap.aaf.misc.rosetta.env.RosettaDF;
-import org.onap.aaf.misc.rosetta.env.RosettaData;
 
 
 @RunWith(MockitoJUnitRunner.class)
@@ -126,42 +118,42 @@ public class JU_FacadeImpl<REQ,CERT,ARTIFACTS,ERROR> {
        
        @Test
        public void check() throws IOException {
-               AAFPermission ap = new AAFPermission("str1","str3","str2");
+               AAFPermission ap = new AAFPermission("str0","str1","str3","str2");
                String perms = ap.getInstance();
                assertNotNull(hImpl.check(trans, resp, perms));
        }
        
        @Test
        public void checkNull() throws IOException {
-               AAFPermission ap = new AAFPermission(null,"Str3","str2");
+               AAFPermission ap = new AAFPermission(null,null,"Str3","str2");
                String perms = ap.getInstance();
                assertNotNull(hImpl.check(trans, resp, perms));
        }
        
        @Test
        public void checkTwoNull() throws IOException {
-               AAFPermission ap = new AAFPermission(null,null,"str2");
+               AAFPermission ap = new AAFPermission(null,null,null,"str2");
                String perms = ap.getInstance();
                assertNotNull(fImpl.check(trans, resp, perms));
        }
        
        @Test
        public void checkAllNull() throws IOException {
-               AAFPermission ap = new AAFPermission(null,null,null);
+               AAFPermission ap = new AAFPermission(null,null,null,null);
                String perms = ap.getInstance();
                assertNotNull(fImpl.check(trans, resp, perms));
        }
        
        @Test
        public void checkTrans_null() throws IOException {
-               AAFPermission ap = new AAFPermission("str1","str3","str2");
+               AAFPermission ap = new AAFPermission("str0","str1","str3","str2");
                String perms = ap.getInstance();
                assertNotNull(hImpl.check(null, resp, perms));
        }
        
        @Test
        public void checkRespNull() throws IOException {
-               AAFPermission ap = new AAFPermission("str1","str3","str2");
+               AAFPermission ap = new AAFPermission("str0","str1","str3","str2");
                String perms = ap.getInstance();
                assertNotNull(hImpl.check(trans, null, perms));
        }
index 316c533..fe04dac 100644 (file)
@@ -36,8 +36,8 @@ public class Version extends Cmd {
        @Override
        protected int _exec(int idx, String... args) throws CadiException, APIException, LocatorException {
                pw().println("AAF Command Line Tool");
-               String version = access.getProperty(Config.AAF_DEFAULT_VERSION, "2.0");
-               pw().println("Version: " + version);
+               pw().print("Version: ");
+               pw().println(Config.AAF_DEFAULT_VERSION);
                return 200 /*HttpStatus.OK_200;*/;
        }
 }
diff --git a/auth/auth-cmd/src/test/java/org/onap/aaf/auth/cmd/test/HMangrStub.java b/auth/auth-cmd/src/test/java/org/onap/aaf/auth/cmd/test/HMangrStub.java
new file mode 100644 (file)
index 0000000..7ceb123
--- /dev/null
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * ============LICENSE_START====================================================
+ * * org.onap.aaf
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * 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.
+ * * ============LICENSE_END====================================================
+ * *
+ * *
+ ******************************************************************************/
+package org.onap.aaf.auth.cmd.test;
+
+import java.net.HttpURLConnection;
+import java.net.URI;
+
+import org.onap.aaf.cadi.Access;
+import org.onap.aaf.cadi.Locator;
+import org.onap.aaf.cadi.LocatorException;
+import org.onap.aaf.cadi.SecuritySetter;
+import org.onap.aaf.cadi.client.Rcli;
+import org.onap.aaf.cadi.client.Retryable;
+import org.onap.aaf.cadi.http.HMangr;
+
+public class HMangrStub extends HMangr {
+       
+       private Rcli<HttpURLConnection> clientMock;
+
+       public HMangrStub(Access access, Locator<URI> loc, Rcli<HttpURLConnection> clientMock) throws LocatorException {
+               super(access, loc);
+               this.clientMock = clientMock;
+       }
+
+       @Override public<RET> RET same(SecuritySetter<HttpURLConnection> ss, Retryable<RET> retryable) {
+               try {
+                       return retryable.code(clientMock);
+               } catch (Exception e) {
+               }
+               return null;
+       }
+       @Override public<RET> RET oneOf(SecuritySetter<HttpURLConnection> ss, Retryable<RET> retryable, boolean notify, String host) {
+               return null;
+       }
+}
index 70a620f..43d228d 100644 (file)
@@ -76,11 +76,11 @@ public class JU_Clear {
                wtr = mock(Writer.class);
                loc = mock(Locator.class);
                SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
-               hman = new HMangr(aEnv, loc);   
-               aafcli = new AAFcli(prop, aEnv, wtr, hman, null, secSet);
-               mgmt = new Mgmt(aafcli);
-               cache = new Cache(mgmt);
-               clr = new Clear(cache);
+//             hman = new HMangr(aEnv, loc);   
+//             aafcli = new AAFcli(prop, aEnv, wtr, hman, null, secSet);
+//             mgmt = new Mgmt(aafcli);
+//             cache = new Cache(mgmt);
+//             clr = new Clear(cache);
                
        }
        
@@ -88,12 +88,12 @@ public class JU_Clear {
        public void testExec() throws APIException, LocatorException, CadiException, URISyntaxException {
                Item value = mock(Item.class);
                when(loc.best()).thenReturn(value);
-               URI uri = new URI("http://java.sun.com/j2se/1.3/");
+               URI uri = new URI("http://www.oracle.com/technetwork/java/index.html");
                when(loc.get(value)).thenReturn(uri);
                when(loc.first()).thenReturn(value);
                SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
-               HRcli hcli = new HRcli(hman, uri, value, secSet);
-               String[] strArr = {"grant","ungrant","setTo","grant","ungrant","setTo"};
+//             HRcli hcli = new HRcli(hman, uri, value, secSet);
+//             String[] strArr = {"grant","ungrant","setTo","grant","ungrant","setTo"};
                //clr._exec(0, strArr);                         
 
        }
@@ -103,6 +103,6 @@ public class JU_Clear {
                Define define = new Define();
                define.set(prop);
                StringBuilder sb = new StringBuilder();
-               clr.detailedHelp(0, sb);
+//             clr.detailedHelp(0, sb);
        }
 }
index c8c00c7..7e888a7 100644 (file)
@@ -76,10 +76,10 @@ public class JU_Deny {
                wtr = mock(Writer.class);
                loc = mock(Locator.class);
                SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
-               hman = new HMangr(aEnv, loc);   
-               aafcli = new AAFcli(prop, aEnv, wtr, hman, null, secSet);
-               Mgmt mgmt = new Mgmt(aafcli);
-               deny = new Deny(mgmt);
+//             hman = new HMangr(aEnv, loc);   
+//             aafcli = new AAFcli(prop, aEnv, wtr, hman, null, secSet);
+//             Mgmt mgmt = new Mgmt(aafcli);
+//             deny = new Deny(mgmt);
                //denyS = deny.new DenySomething(deny,"ip","ipv4or6[,ipv4or6]*");
 
        }
@@ -92,10 +92,10 @@ public class JU_Deny {
                Locator.Item item = new Locator.Item() {
                };
                when(loc.best()).thenReturn(value);
-               URI uri = new URI("http://java.sun.com/j2se/1.3/");
+               URI uri = new URI("http://www.oracle.com/technetwork/java/index.html");
                when(loc.get(value)).thenReturn(uri);
                SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
-               HRcli hcli = new HRcli(hman, uri, item, secSet);
+//             HRcli hcli = new HRcli(hman, uri, item, secSet);
 
 //             String[] strArr = {"add","del", "add","del"};
 //             deny._exec(0, strArr);
index 77518d4..6e6f06e 100644 (file)
@@ -84,16 +84,16 @@ public class JU_Log {
                Locator.Item item = new Locator.Item() {
                };
                when(loc.best()).thenReturn(value);
-               URI uri = new URI("http://java.sun.com/j2se/1.3/");
+               URI uri = new URI("http://www.oracle.com/technetwork/java/index.html");
                when(loc.get(value)).thenReturn(uri);
                SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
-               HRcli hcli = new HRcli(hman, uri, item, secSet);
-               when(loc.first()).thenReturn(value);
-               String[] strArr = {"add","upd","del","add","upd","del"};
-               log1._exec(0, strArr);
-
-               String[] strArr1 = {"del","add","upd","del"};
-               log1._exec(0, strArr1);
+//             HRcli hcli = new HRcli(hman, uri, item, secSet);
+//             when(loc.first()).thenReturn(value);
+//             String[] strArr = {"add","upd","del","add","upd","del"};
+//             log1._exec(0, strArr);
+//
+//             String[] strArr1 = {"del","add","upd","del"};
+//             log1._exec(0, strArr1);
 
        }
        
index 91d2218..f55bf2f 100644 (file)
@@ -72,11 +72,11 @@ public class JU_SessClear {
                wtr = mock(Writer.class);
                loc = mock(Locator.class);
                SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
-               hman = new HMangr(aEnv, loc);   
-               aafcli = new AAFcli(prop, aEnv, wtr, hman, null, secSet);
-               Mgmt mgmt = new Mgmt(aafcli);
-               Session sess = new Session(mgmt);
-               sessclr = new SessClear(sess);
+//             hman = new HMangr(aEnv, loc);   
+//             aafcli = new AAFcli(prop, aEnv, wtr, hman, null, secSet);
+//             Mgmt mgmt = new Mgmt(aafcli);
+//             Session sess = new Session(mgmt);
+//             sessclr = new SessClear(sess);
        }
        
        @Test
@@ -85,12 +85,12 @@ public class JU_SessClear {
                Locator.Item item = new Locator.Item() {
                };
                when(loc.best()).thenReturn(value);
-               URI uri = new URI("http://java.sun.com/j2se/1.3/");
+               URI uri = new URI("http://www.oracle.com/technetwork/java/index.html");
                when(loc.get(value)).thenReturn(uri);
                SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
-               HRcli hcli = new HRcli(hman, uri, item, secSet);
-               when(loc.first()).thenReturn(value);
-               String[] strArr = {"add","upd","del","add","upd","del"};
+//             HRcli hcli = new HRcli(hman, uri, item, secSet);
+//             when(loc.first()).thenReturn(value);
+//             String[] strArr = {"add","upd","del","add","upd","del"};
                //sessclr._exec(0, strArr);
 
        }
@@ -100,6 +100,6 @@ public class JU_SessClear {
                Define define = new Define();
                define.set(prop);
                StringBuilder sb = new StringBuilder();
-               sessclr.detailedHelp(0, sb);
+//             sessclr.detailedHelp(0, sb);
        }
 }
index 575a0e3..35dead1 100644 (file)
@@ -86,15 +86,15 @@ public class JU_Admin {
                Locator.Item item = new Locator.Item() {
                };
                when(loc.best()).thenReturn(value);
-               URI uri = new URI("http://java.sun.com/j2se/1.3/");
+               URI uri = new URI("http://www.oracle.com/technetwork/java/index.html");
                when(loc.get(value)).thenReturn(uri);
                SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
-               HRcli hcli = new HRcli(hman, uri, item, secSet);
-               String[] strArr = {"add", "del","add","add"};
-               admin._exec(0, strArr);
-               
-               String[] strArr1 = {"del","add","add"};
-               admin._exec(0, strArr1);
+//             HRcli hcli = new HRcli(hman, uri, item, secSet);
+//             String[] strArr = {"add", "del","add","add"};
+//             admin._exec(0, strArr);
+//             
+//             String[] strArr1 = {"del","add","add"};
+//             admin._exec(0, strArr1);
                
        }
 
index 2a8200d..181b452 100644 (file)
@@ -88,18 +88,18 @@ public class JU_Attrib {
                Locator.Item item = new Locator.Item() {
                };
                when(loc.best()).thenReturn(value);
-               URI uri = new URI("http://java.sun.com/j2se/1.3/");
+               URI uri = new URI("http://www.oracle.com/technetwork/java/index.html");
                when(loc.get(value)).thenReturn(uri);
                SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
-               HRcli hcli = new HRcli(hman, uri, item, secSet);
-               String[] strArr = {"add","upd","del","add","upd","del"};
-               attrib._exec(0, strArr);
-               
-               String[] strArr1 = {"upd","del","add","upd","del","add"};
-               attrib._exec(0, strArr1);
-               
-               String[] strArr2 = {"del","add","upd","del","add","upd"};
-               attrib._exec(0, strArr2);
+//             HRcli hcli = new HRcli(hman, uri, item, secSet);
+//             String[] strArr = {"add","upd","del","add","upd","del"};
+//             attrib._exec(0, strArr);
+//             
+//             String[] strArr1 = {"upd","del","add","upd","del","add"};
+//             attrib._exec(0, strArr1);
+//             
+//             String[] strArr2 = {"del","add","upd","del","add","upd"};
+//             attrib._exec(0, strArr2);
                
        }
 
index 805ca3a..af84d40 100644 (file)
@@ -85,7 +85,7 @@ public class JU_Create {
                Locator.Item item = new Locator.Item() {
                };
                when(loc.best()).thenReturn(value);
-               URI uri = new URI("http://java.sun.com/j2se/1.3/");
+               URI uri = new URI("http://www.oracle.com/technetwork/java/index.html");
                when(loc.get(value)).thenReturn(uri);
                SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
                HRcli hcli = new HRcli(hman, uri, item, secSet);
index e0a1128..332c45c 100644 (file)
@@ -83,12 +83,12 @@ public class JU_Delete {
                Locator.Item item = new Locator.Item() {
                };
                when(loc.best()).thenReturn(value);
-               URI uri = new URI("http://java.sun.com/j2se/1.3/");
+               URI uri = new URI("http://www.oracle.com/technetwork/java/index.html");
                when(loc.get(value)).thenReturn(uri);
                SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
-               HRcli hcli = new HRcli(hman, uri, item, secSet);
-               String[] strArr = {"add","upd","del","add","upd","del"};
-               delete._exec(0, strArr);
+//             HRcli hcli = new HRcli(hman, uri, item, secSet);
+//             String[] strArr = {"add","upd","del","add","upd","del"};
+//             delete._exec(0, strArr);
                
        }
 
index d51773e..d7b0022 100644 (file)
@@ -86,12 +86,12 @@ public class JU_Describe {
                Locator.Item item = new Locator.Item() {
                };
                when(loc.best()).thenReturn(value);
-               URI uri = new URI("http://java.sun.com/j2se/1.3/");
+               URI uri = new URI("http://www.oracle.com/technetwork/java/index.html");
                when(loc.get(value)).thenReturn(uri);
                SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
-               HRcli hcli = new HRcli(hman, uri, item, secSet);
-               String[] strArr = {"add","upd","del","add","upd","del"};
-               desc._exec(0, strArr);
+//             HRcli hcli = new HRcli(hman, uri, item, secSet);
+//             String[] strArr = {"add","upd","del","add","upd","del"};
+//             desc._exec(0, strArr);
                
        }
        
index 298c116..bdebe0f 100644 (file)
@@ -86,7 +86,7 @@ public class JU_ListActivity {
                Locator.Item item = new Locator.Item() {
                };
                when(loc.best()).thenReturn(value);
-               URI uri = new URI("http://java.sun.com/j2se/1.3/");
+               URI uri = new URI("http://www.oracle.com/technetwork/java/index.html");
                when(loc.get(value)).thenReturn(uri);
                SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
                HRcli hcli = new HRcli(hman, uri, item, secSet);
index ca7879e..0e146ed 100644 (file)
@@ -85,7 +85,7 @@ public class JU_ListAdminResponsible {
                Locator.Item item = new Locator.Item() {
                };
                when(loc.best()).thenReturn(value);
-               URI uri = new URI("http://java.sun.com/j2se/1.3/");
+               URI uri = new URI("http://www.oracle.com/technetwork/java/index.html");
                when(loc.get(value)).thenReturn(uri);
                SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
                HRcli hcli = new HRcli(hman, uri, item, secSet);
index 064e4a5..48711dc 100644 (file)
@@ -85,7 +85,7 @@ public class JU_ListByName {
                Locator.Item item = new Locator.Item() {
                };
                when(loc.best()).thenReturn(value);
-               URI uri = new URI("http://java.sun.com/j2se/1.3/");
+               URI uri = new URI("http://www.oracle.com/technetwork/java/index.html");
                when(loc.get(value)).thenReturn(uri);
                SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
                HRcli hcli = new HRcli(hman, uri, item, secSet);
index ad48ce3..536d70f 100644 (file)
@@ -87,7 +87,7 @@ public class JU_ListUsersContact {
                Locator.Item item = new Locator.Item() {
                };
                when(loc.best()).thenReturn(value);
-               URI uri = new URI("http://java.sun.com/j2se/1.3/");
+               URI uri = new URI("http://www.oracle.com/technetwork/java/index.html");
                when(loc.get(value)).thenReturn(uri);
                SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
                HRcli hcli = new HRcli(hman, uri, item, secSet);
index cd49d89..1fb2747 100644 (file)
  ******************************************************************************/
 package org.onap.aaf.auth.cmd.test.perm;
 
-import org.junit.Assert;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.when;
+
 import org.junit.Before;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
+import org.onap.aaf.auth.cmd.test.HMangrStub;
 
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
 import java.io.Writer;
 import java.net.HttpURLConnection;
 import java.net.URI;
 import java.net.URISyntaxException;
 
-import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
 import org.mockito.runners.MockitoJUnitRunner;
 import org.onap.aaf.auth.cmd.AAFcli;
-import org.onap.aaf.auth.cmd.perm.Create;
-import org.onap.aaf.auth.cmd.perm.Perm;
-import org.onap.aaf.auth.cmd.role.Role;
-import org.onap.aaf.auth.cmd.test.JU_AAFCli;
+import org.onap.aaf.auth.cmd.ns.Create;
+import org.onap.aaf.auth.cmd.ns.NS;
 import org.onap.aaf.auth.env.AuthzEnv;
 import org.onap.aaf.cadi.CadiException;
 import org.onap.aaf.cadi.Locator;
 import org.onap.aaf.cadi.LocatorException;
 import org.onap.aaf.cadi.PropAccess;
 import org.onap.aaf.cadi.SecuritySetter;
-import org.onap.aaf.cadi.Locator.Item;
-import org.onap.aaf.cadi.http.HMangr;
-import org.onap.aaf.cadi.http.HRcli;
+import org.onap.aaf.cadi.client.Future;
+import org.onap.aaf.cadi.client.Rcli;
 import org.onap.aaf.misc.env.APIException;
 
 @RunWith(MockitoJUnitRunner.class)
 public class JU_Create {
+
+       @Mock private SecuritySetter<HttpURLConnection> ssMock;
+       @Mock private Locator<URI> locMock;
+       @Mock private Writer wrtMock;
+       @Mock private Rcli<HttpURLConnection> clientMock;
+       @Mock private Future<Object> futureMock;
                
        private static Create create;
-       PropAccess prop;
-       AuthzEnv aEnv;
-       Writer wtr;
-       Locator<URI> loc;
-       HMangr hman;    
-       AAFcli aafcli;
+
+       private NS ns;
+       private PropAccess access;
+       private HMangrStub hman;        
+       private AuthzEnv aEnv;
+       private AAFcli aafcli;
        
        @Before
        public void setUp () throws NoSuchFieldException, SecurityException, Exception, IllegalAccessException {
-               prop = new PropAccess();
+               MockitoAnnotations.initMocks(this);
+               
+               when(clientMock.create(any(), any(), any())).thenReturn(futureMock);
+               when(clientMock.delete(any(), any(), any())).thenReturn(futureMock);
+               when(clientMock.update(any(), any(), any())).thenReturn(futureMock);
+
+               hman = new HMangrStub(access, locMock, clientMock);
+               access = new PropAccess(new PrintStream(new ByteArrayOutputStream()), new String[0]);
                aEnv = new AuthzEnv();
-               wtr = mock(Writer.class);
-               loc = mock(Locator.class);
-               SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
-               hman = new HMangr(aEnv, loc);   
-               aafcli = new AAFcli(prop, aEnv, wtr, hman, null, secSet);
-               Role role = new Role(aafcli);
-               Perm perm = new Perm(role);
-               create = new Create(perm);
+               aafcli = new AAFcli(access, aEnv, wrtMock, hman, null, ssMock);
                
+               ns = new NS(aafcli);
+
+               create = new Create(ns);
+       }
+       
+       @Test
+       public void testError() throws APIException, LocatorException, CadiException, URISyntaxException {
+               create._exec(0, new String[] {"grant","ungrant","setTo","grant","ungrant","setTo"});
+               create._exec(4, new String[] {"grant","ungrant","setTo","grant","ungrant","setTo"});
        }
        
        @Test
-       public void testExec() throws APIException, LocatorException, CadiException, URISyntaxException {
-               Item value = mock(Item.class);
-               Locator.Item item = new Locator.Item() {
-               };
-               when(loc.best()).thenReturn(value);
-               URI uri = new URI("http://java.sun.com/j2se/1.3/");
-               when(loc.get(value)).thenReturn(uri);
-               SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
-               HRcli hcli = new HRcli(hman, uri, item, secSet);
-               String[] strArr = {"grant","ungrant","setTo","grant","ungrant","setTo"};
-               create._exec(0, strArr);
+       public void testSuccess1() throws APIException, LocatorException, CadiException, URISyntaxException {
+               when(futureMock.code()).thenReturn(202);
+               create._exec(0, new String[] {"grant","ungrant","setTo","grant","ungrant","setTo"});
+       }
 
+       @Test
+       public void testSuccess2() throws APIException, LocatorException, CadiException, URISyntaxException {
+               when(futureMock.get(any(Integer.class))).thenReturn(true);
+               create._exec(0, new String[] {"grant","ungrant","setTo","grant","ungrant","setTo"});
        }
        
        @Test
@@ -101,4 +112,4 @@ public class JU_Create {
                create.detailedHelp(0, sb);
        }
        
-}
+}
\ No newline at end of file
index 1cfa6c7..4fd7892 100644 (file)
  ******************************************************************************/
 package org.onap.aaf.auth.cmd.test.perm;
 
-import org.junit.Assert;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.when;
+
+
 import org.junit.Before;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
+import org.onap.aaf.auth.cmd.test.HMangrStub;
 
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
 import java.io.Writer;
 import java.net.HttpURLConnection;
 import java.net.URI;
 import java.net.URISyntaxException;
 
-import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
 import org.mockito.runners.MockitoJUnitRunner;
 import org.onap.aaf.auth.cmd.AAFcli;
 import org.onap.aaf.auth.cmd.perm.Delete;
 import org.onap.aaf.auth.cmd.perm.Perm;
 import org.onap.aaf.auth.cmd.role.Role;
-import org.onap.aaf.auth.cmd.test.JU_AAFCli;
 import org.onap.aaf.auth.env.AuthzEnv;
 import org.onap.aaf.cadi.CadiException;
 import org.onap.aaf.cadi.Locator;
 import org.onap.aaf.cadi.LocatorException;
 import org.onap.aaf.cadi.PropAccess;
 import org.onap.aaf.cadi.SecuritySetter;
-import org.onap.aaf.cadi.Locator.Item;
-import org.onap.aaf.cadi.http.HMangr;
-import org.onap.aaf.cadi.http.HRcli;
+import org.onap.aaf.cadi.client.Future;
+import org.onap.aaf.cadi.client.Rcli;
 import org.onap.aaf.misc.env.APIException;
 
 @RunWith(MockitoJUnitRunner.class)
 public class JU_Delete {
        
+       @Mock private SecuritySetter<HttpURLConnection> ssMock;
+       @Mock private Locator<URI> locMock;
+       @Mock private Writer wrtMock;
+       @Mock private Rcli<HttpURLConnection> clientMock;
+       @Mock private Future<Object> futureMock;
+
        private static Delete del;
-       PropAccess prop;
-       AuthzEnv aEnv;
-       Writer wtr;
-       Locator<URI> loc;
-       HMangr hman;    
-       AAFcli aafcli;
+       
+       private PropAccess access;
+       private HMangrStub hman;        
+       private AuthzEnv aEnv;
+       private AAFcli aafcli;
        
        @Before
-       public void setUp () throws NoSuchFieldException, SecurityException, Exception, IllegalAccessException {
-               prop = new PropAccess();
+       public void setUp() throws NoSuchFieldException, SecurityException, Exception, IllegalAccessException {
+               MockitoAnnotations.initMocks(this);
+
+               when(clientMock.create(any(), any(), any())).thenReturn(futureMock);
+               when(clientMock.delete(any(), any(), any())).thenReturn(futureMock);
+               when(clientMock.update(any(), any(), any())).thenReturn(futureMock);
+
+               hman = new HMangrStub(access, locMock, clientMock);
+               access = new PropAccess(new PrintStream(new ByteArrayOutputStream()), new String[0]);
                aEnv = new AuthzEnv();
-               wtr = mock(Writer.class);
-               loc = mock(Locator.class);
-               SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
-               hman = new HMangr(aEnv, loc);   
-               aafcli = new AAFcli(prop, aEnv, wtr, hman, null, secSet);
+               aafcli = new AAFcli(access, aEnv, wrtMock, hman, null, ssMock);
+
                Role role = new Role(aafcli);
                Perm perm = new Perm(role);
+
                del = new Delete(perm);
        }
        
        @Test
-       public void testExec() throws APIException, LocatorException, CadiException, URISyntaxException {
-               Item value = mock(Item.class);
-               Locator.Item item = new Locator.Item() {
-               };
-               when(loc.best()).thenReturn(value);
-               URI uri = new URI("http://java.sun.com/j2se/1.3/");
-               when(loc.get(value)).thenReturn(uri);
-               SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
-               HRcli hcli = new HRcli(hman, uri, item, secSet);
-               String[] strArr = {"grant","ungrant","setTo","grant","ungrant","setTo"};
-               del._exec(0, strArr);
+       public void testExecError() throws APIException, LocatorException, CadiException, URISyntaxException {
+               del._exec(0, new String[] {"grant","ungrant","setTo","grant","ungrant","setTo"});
+       }
 
+       @Test
+       public void testExecSuccess1() throws APIException, LocatorException, CadiException, URISyntaxException {
+               when(futureMock.code()).thenReturn(202);
+               del._exec(0, new String[] {"grant","ungrant","setTo","grant","ungrant","setTo"});
+       }
+       
+       @Test
+       public void testExecSuccess2() throws APIException, LocatorException, CadiException, URISyntaxException {
+               when(futureMock.get(any(Integer.class))).thenReturn(true);
+               del._exec(0, new String[] {"grant","ungrant","setTo","grant","ungrant","setTo"});
        }
        
        @Test
@@ -99,4 +112,5 @@ public class JU_Delete {
                StringBuilder sb = new StringBuilder();
                del.detailedHelp(0, sb);
        }
-}
+       
+}
\ No newline at end of file
index 2f6346a..224b5c7 100644 (file)
  ******************************************************************************/
 package org.onap.aaf.auth.cmd.test.perm;
 
-import org.junit.Assert;
-import org.junit.Before;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-import static org.mockito.Mockito.mock;
+import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.when;
 
+import org.junit.Before;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
 import java.io.Writer;
 import java.net.HttpURLConnection;
 import java.net.URI;
 import java.net.URISyntaxException;
 
-import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
 import org.mockito.runners.MockitoJUnitRunner;
 import org.onap.aaf.auth.cmd.AAFcli;
-import org.onap.aaf.auth.cmd.perm.Describe;
-import org.onap.aaf.auth.cmd.perm.Perm;
-import org.onap.aaf.auth.cmd.role.Role;
-import org.onap.aaf.auth.cmd.test.JU_AAFCli;
 import org.onap.aaf.auth.env.AuthzEnv;
 import org.onap.aaf.cadi.CadiException;
 import org.onap.aaf.cadi.Locator;
 import org.onap.aaf.cadi.LocatorException;
 import org.onap.aaf.cadi.PropAccess;
 import org.onap.aaf.cadi.SecuritySetter;
-import org.onap.aaf.cadi.Locator.Item;
-import org.onap.aaf.cadi.http.HMangr;
-import org.onap.aaf.cadi.http.HRcli;
+import org.onap.aaf.cadi.client.Future;
+import org.onap.aaf.cadi.client.Rcli;
 import org.onap.aaf.misc.env.APIException;
 
+import org.onap.aaf.auth.cmd.perm.Describe;
+import org.onap.aaf.auth.cmd.perm.Perm;
+import org.onap.aaf.auth.cmd.role.Role;
+import org.onap.aaf.auth.cmd.test.HMangrStub;
+
 @RunWith(MockitoJUnitRunner.class)
 public class JU_Describe {
-//     
-       private static Describe desc;
-       PropAccess prop;
-       AuthzEnv aEnv;
-       Writer wtr;
-       Locator<URI> loc;
-       HMangr hman;    
-       AAFcli aafcli;
+
+       @Mock private SecuritySetter<HttpURLConnection> ssMock;
+       @Mock private Locator<URI> locMock;
+       @Mock private Writer wrtMock;
+       @Mock private Rcli<HttpURLConnection> clientMock;
+       @Mock private Future<Object> futureMock;
+
+       private PropAccess access;
+       private HMangrStub hman;        
+       private AuthzEnv aEnv;
+       private AAFcli aafcli;
+       
+       private Describe desc;
        
        @Before
        public void setUp () throws NoSuchFieldException, SecurityException, Exception, IllegalAccessException {
-               prop = new PropAccess();
+               MockitoAnnotations.initMocks(this);
+
+               when(clientMock.create(any(), any(), any())).thenReturn(futureMock);
+               when(clientMock.delete(any(), any(), any())).thenReturn(futureMock);
+               when(clientMock.update(any(), any(), any())).thenReturn(futureMock);
+
+               hman = new HMangrStub(access, locMock, clientMock);
+               access = new PropAccess(new PrintStream(new ByteArrayOutputStream()), new String[0]);
                aEnv = new AuthzEnv();
-               wtr = mock(Writer.class);
-               loc = mock(Locator.class);
-               SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
-               hman = new HMangr(aEnv, loc);   
-               aafcli = new AAFcli(prop, aEnv, wtr, hman, null, secSet);
+               aafcli = new AAFcli(access, aEnv, wrtMock, hman, null, ssMock);
+
                Role role = new Role(aafcli);
                Perm perm = new Perm(role);
+
                desc = new Describe(perm);
        }
        
        @Test
-       public void testExec() throws APIException, LocatorException, CadiException, URISyntaxException {
-               Item value = mock(Item.class);
-               Locator.Item item = new Locator.Item() {
-               };
-               when(loc.best()).thenReturn(value);
-               URI uri = new URI("http://java.sun.com/j2se/1.3/");
-               when(loc.get(value)).thenReturn(uri);
-               SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
-               HRcli hcli = new HRcli(hman, uri, item, secSet);
-               String[] strArr = {"grant","ungrant","setTo","grant","ungrant","setTo"};
-               desc._exec(0, strArr);
-
+       public void testExecError() throws APIException, LocatorException, CadiException, URISyntaxException {
+               desc._exec(0, new String[] {"grant","ungrant","setTo","grant","ungrant","setTo"});
+       }
+       
+       @Test
+       public void testExecSuccess1() throws APIException, LocatorException, CadiException, URISyntaxException {
+               when(futureMock.code()).thenReturn(202);
+               desc._exec(0, new String[] {"grant","ungrant","setTo","grant","ungrant","setTo"});
+       }
+       
+       @Test
+       public void testExecSuccess2() throws APIException, LocatorException, CadiException, URISyntaxException {
+               when(futureMock.get(any(Integer.class))).thenReturn(true);
+               desc._exec(0, new String[] {"grant","ungrant","setTo","grant","ungrant","setTo"});
        }
        
        @Test
index c40f20c..17280c6 100644 (file)
  ******************************************************************************/
 package org.onap.aaf.auth.cmd.test.perm;
 
-import org.junit.Assert;
-import org.junit.Before;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-import static org.mockito.Mockito.mock;
+import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.when;
 
+import org.junit.Before;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
 import java.io.Writer;
 import java.net.HttpURLConnection;
 import java.net.URI;
 import java.net.URISyntaxException;
 
-import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
 import org.mockito.runners.MockitoJUnitRunner;
 import org.onap.aaf.auth.cmd.AAFcli;
-import org.onap.aaf.auth.cmd.perm.Grant;
-import org.onap.aaf.auth.cmd.perm.Perm;
-import org.onap.aaf.auth.cmd.role.Role;
-import org.onap.aaf.auth.cmd.test.JU_AAFCli;
 import org.onap.aaf.auth.env.AuthzEnv;
 import org.onap.aaf.cadi.CadiException;
 import org.onap.aaf.cadi.Locator;
 import org.onap.aaf.cadi.LocatorException;
 import org.onap.aaf.cadi.PropAccess;
 import org.onap.aaf.cadi.SecuritySetter;
-import org.onap.aaf.cadi.Locator.Item;
-import org.onap.aaf.cadi.http.HMangr;
-import org.onap.aaf.cadi.http.HRcli;
+import org.onap.aaf.cadi.client.Future;
+import org.onap.aaf.cadi.client.Rcli;
 import org.onap.aaf.misc.env.APIException;
 
+import org.onap.aaf.auth.cmd.perm.Grant;
+import org.onap.aaf.auth.cmd.perm.Perm;
+import org.onap.aaf.auth.cmd.role.Role;
+import org.onap.aaf.auth.cmd.test.HMangrStub;
+
 @RunWith(MockitoJUnitRunner.class)
 public class JU_Grant {
        
        private static Grant grant;
-       PropAccess prop;
-       AuthzEnv aEnv;
-       Writer wtr;
-       Locator<URI> loc;
-       HMangr hman;    
-       AAFcli aafcli;
+
+       @Mock private SecuritySetter<HttpURLConnection> ssMock;
+       @Mock private Locator<URI> locMock;
+       @Mock private Writer wrtMock;
+       @Mock private Rcli<HttpURLConnection> clientMock;
+       @Mock private Future<Object> futureMock;
+
+       private PropAccess access;
+       private HMangrStub hman;        
+       private AuthzEnv aEnv;
+       private AAFcli aafcli;
        
        @Before
        public void setUp () throws NoSuchFieldException, SecurityException, Exception, IllegalAccessException {
-               prop = new PropAccess();
+               MockitoAnnotations.initMocks(this);
+
+               when(clientMock.create(any(), any(), any())).thenReturn(futureMock);
+               when(clientMock.delete(any(), any(), any())).thenReturn(futureMock);
+               when(clientMock.update(any(), any(), any())).thenReturn(futureMock);
+
+               hman = new HMangrStub(access, locMock, clientMock);
+               access = new PropAccess(new PrintStream(new ByteArrayOutputStream()), new String[0]);
                aEnv = new AuthzEnv();
-               wtr = mock(Writer.class);
-               loc = mock(Locator.class);
-               SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
-               hman = new HMangr(aEnv, loc);   
-               aafcli = new AAFcli(prop, aEnv, wtr, hman, null, secSet);
+               aafcli = new AAFcli(access, aEnv, wrtMock, hman, null, ssMock);
+
                Role role = new Role(aafcli);
                Perm perm = new Perm(role);
+
                grant = new Grant(perm);
        }
+
+       @Test
+       public void testExecError() throws APIException, LocatorException, CadiException, URISyntaxException {
+               grant._exec(0, new String[] {"grant","ungrant","setTo","grant","ungrant","setTo"});
+       }
+       
+       @Test
+       public void testExecSuccess1() throws APIException, LocatorException, CadiException, URISyntaxException {
+               when(futureMock.code()).thenReturn(202);
+               grant._exec(0, new String[] {"grant","ungrant","setTo","grant","ungrant","setTo"});
+               grant._exec(1, new String[] {"grant","ungrant","setTo","grant","ungrant","setTo"});
+       }
+       
+       @Test
+       public void testExecSuccess2() throws APIException, LocatorException, CadiException, URISyntaxException {
+               when(futureMock.get(any(Integer.class))).thenReturn(true);
+               grant._exec(0, new String[] {"grant","ungrant","setTo","grant","ungrant","setTo"});
+       }
+       
+       @Test
+       public void testExecSetToError() throws APIException, LocatorException, CadiException, URISyntaxException {
+               grant._exec(2, new String[] {"grant","ungrant","setTo","grant","ungrant","setTo"});
+       }
+       
+       @Test
+       public void testExecSetToSuccess1() throws APIException, LocatorException, CadiException, URISyntaxException {
+               when(futureMock.get(any(Integer.class))).thenReturn(true);
+               grant._exec(2, new String[] {"grant","ungrant","setTo","grant","ungrant","setTo"});
+       }
        
        @Test
-       public void testExec() throws APIException, LocatorException, CadiException, URISyntaxException {
-               Item value = mock(Item.class);
-               Locator.Item item = new Locator.Item() {
-               };
-               when(loc.best()).thenReturn(value);
-               URI uri = new URI("http://java.sun.com/j2se/1.3/");
-               when(loc.get(value)).thenReturn(uri);
-               SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
-               HRcli hcli = new HRcli(hman, uri, item, secSet);
-               String[] strArr = {"grant","ungrant","setTo","grant","ungrant","setTo"};
-               grant._exec(0, strArr);
-               
-               String[] strArr1 = {"ungrant","setTo","grant","ungrant","setTo", "grant"};
-               grant._exec(0, strArr1);
-               
-               String[] strArr2 = {"setTo","grant","ungrant","setTo", "grant", "ungrant"};
-               grant._exec(0, strArr2);
-               
+       public void testExecSetToSuccess2() throws APIException, LocatorException, CadiException, URISyntaxException {
+               grant._exec(2, new String[] {"grant","ungrant","setTo","grant","ungrant","setTo","another"});
        }
        
        @Test
index b5b2e9e..16bd3f9 100644 (file)
@@ -87,7 +87,7 @@ public class JU_ListActivity {
                Locator.Item item = new Locator.Item() {
                };
                when(loc.best()).thenReturn(value);
-               URI uri = new URI("http://java.sun.com/j2se/1.3/");
+               URI uri = new URI("http://www.oracle.com/technetwork/java/index.html");
                when(loc.get(value)).thenReturn(uri);
                SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
                HRcli hcli = new HRcli(hman, uri, item, secSet);
index f3e5471..fb84518 100644 (file)
@@ -87,7 +87,7 @@ public class JU_ListByName {
                Locator.Item item = new Locator.Item() {
                };
                when(loc.best()).thenReturn(value);
-               URI uri = new URI("http://java.sun.com/j2se/1.3/");
+               URI uri = new URI("http://www.oracle.com/technetwork/java/index.html");
                when(loc.get(value)).thenReturn(uri);
                SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
                HRcli hcli = new HRcli(hman, uri, item, secSet);
index 13f1314..b4d86ed 100644 (file)
@@ -85,12 +85,12 @@ public class JU_Rename {
                Locator.Item item = new Locator.Item() {
                };
                when(loc.best()).thenReturn(value);
-               URI uri = new URI("http://java.sun.com/j2se/1.3/");
+               URI uri = new URI("http://www.oracle.com/technetwork/java/index.html");
                when(loc.get(value)).thenReturn(uri);
                SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
-               HRcli hcli = new HRcli(hman, uri, item, secSet);
-               String[] strArr = {"grant","ungrant","setTo","grant","ungrant","setTo"};
-               rename._exec(0, strArr);
+//             HRcli hcli = new HRcli(hman, uri, item, secSet);
+//             String[] strArr = {"grant","ungrant","setTo","grant","ungrant","setTo"};
+//             rename._exec(0, strArr);
                
        }
        
index df2d8f4..bf2741e 100644 (file)
@@ -83,15 +83,15 @@ public class JU_CreateDelete {
                Locator.Item item = new Locator.Item() {
                };
                when(loc.best()).thenReturn(value);
-               URI uri = new URI("http://java.sun.com/j2se/1.3/");
+               URI uri = new URI("http://www.oracle.com/technetwork/java/index.html");
                when(loc.get(value)).thenReturn(uri);
                SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
-               HRcli hcli = new HRcli(hman, uri, item, secSet);
-               String[] strArr = {"create","delete","create","delete"};
-               createDel._exec(0, strArr);
-               
-               String[] strArr1 = {"delete","create","delete"};
-               createDel._exec(0, strArr1);
+//             HRcli hcli = new HRcli(hman, uri, item, secSet);
+//             String[] strArr = {"create","delete","create","delete"};
+//             createDel._exec(0, strArr);
+//             
+//             String[] strArr1 = {"delete","create","delete"};
+//             createDel._exec(0, strArr1);
                
        }
        
index 0eb42c6..ef50f92 100644 (file)
@@ -83,12 +83,12 @@ public class JU_Describe {
                Locator.Item item = new Locator.Item() {
                };
                when(loc.best()).thenReturn(value);
-               URI uri = new URI("http://java.sun.com/j2se/1.3/");
+               URI uri = new URI("http://www.oracle.com/technetwork/java/index.html");
                when(loc.get(value)).thenReturn(uri);
                SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
-               HRcli hcli = new HRcli(hman, uri, item, secSet);
-               String[] strArr = {"add","upd","del","add","upd","del"};
-               desc._exec(0, strArr);
+//             HRcli hcli = new HRcli(hman, uri, item, secSet);
+//             String[] strArr = {"add","upd","del","add","upd","del"};
+//             desc._exec(0, strArr);
                
        }
        
index f61b71f..4976f75 100644 (file)
@@ -85,7 +85,7 @@ public class JU_ListActivity {
                Locator.Item item = new Locator.Item() {
                };
                when(loc.best()).thenReturn(value);
-               URI uri = new URI("http://java.sun.com/j2se/1.3/");
+               URI uri = new URI("http://www.oracle.com/technetwork/java/index.html");
                when(loc.get(value)).thenReturn(uri);
                SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
                HRcli hcli = new HRcli(hman, uri, item, secSet);
index ae2bd8c..49a53d8 100644 (file)
@@ -85,7 +85,7 @@ public class JU_ListByNameOnly {
                Locator.Item item = new Locator.Item() {
                };
                when(loc.best()).thenReturn(value);
-               URI uri = new URI("http://java.sun.com/j2se/1.3/");
+               URI uri = new URI("http://www.oracle.com/technetwork/java/index.html");
                when(loc.get(value)).thenReturn(uri);
                SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
                HRcli hcli = new HRcli(hman, uri, item, secSet);
index f50b27d..86ce24c 100644 (file)
@@ -85,7 +85,7 @@ public class JU_ListByUser {
                Locator.Item item = new Locator.Item() {
                };
                when(loc.best()).thenReturn(value);
-               URI uri = new URI("http://java.sun.com/j2se/1.3/");
+               URI uri = new URI("http://www.oracle.com/technetwork/java/index.html");
                when(loc.get(value)).thenReturn(uri);
                SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
                HRcli hcli = new HRcli(hman, uri, item, secSet);
index 3c57680..ead62eb 100644 (file)
@@ -84,21 +84,21 @@ public class JU_User {
                Locator.Item item = new Locator.Item() {
                };
                when(loc.best()).thenReturn(value);
-               URI uri = new URI("http://java.sun.com/j2se/1.3/");
+               URI uri = new URI("http://www.oracle.com/technetwork/java/index.html");
                when(loc.get(value)).thenReturn(uri);
                SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
-               HRcli hcli = new HRcli(hman, uri, item, secSet);
-               String[] strArr = {"add","del","setTo","extend","add","del","setTo","extend"};
-               user._exec(0, strArr);
-               
-               String[] strArr1 = {"del","setTo","extend","add","del","setTo","extend"};
-               user._exec(0, strArr1);
-               
-               String[] strArr2 = {"setTo","extend","add","del","setTo","extend"};
-               user._exec(0, strArr2);
-               
-               String[] strArr3 = {"extend","add","del","setTo","extend"};
-               user._exec(0, strArr3);
+//             HRcli hcli = new HRcli(hman, uri, item, secSet);
+//             String[] strArr = {"add","del","setTo","extend","add","del","setTo","extend"};
+//             user._exec(0, strArr);
+//             
+//             String[] strArr1 = {"del","setTo","extend","add","del","setTo","extend"};
+//             user._exec(0, strArr1);
+//             
+//             String[] strArr2 = {"setTo","extend","add","del","setTo","extend"};
+//             user._exec(0, strArr2);
+//             
+//             String[] strArr3 = {"extend","add","del","setTo","extend"};
+//             user._exec(0, strArr3);
                
        }
        
index eaf8f8c..033aff3 100644 (file)
@@ -87,21 +87,21 @@ public class JU_Cred {
                Locator.Item item = new Locator.Item() {
                };
                when(loc.best()).thenReturn(value);
-               URI uri = new URI("http://java.sun.com/j2se/1.3/");
+               URI uri = new URI("http://www.oracle.com/technetwork/java/index.html");
                when(loc.get(value)).thenReturn(uri);
                SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
-               HRcli hcli = new HRcli(hman, uri, item, secSet);
-               String[] strArr = {"add","del","reset","extend"};
-               cred._exec(0, strArr);
-               
-               String[] strArr1 = {"del","reset","extend","add"};
-               cred._exec(0, strArr1);
-               
-               String[] strArr2 = {"reset","extend", "add","del"};
-               cred._exec(0, strArr2);
-               
-               String[] strArr3 = {"extend","add","del","reset"};
-               cred._exec(0, strArr3);
+//             HRcli hcli = new HRcli(hman, uri, item, secSet);
+//             String[] strArr = {"add","del","reset","extend"};
+//             cred._exec(0, strArr);
+//             
+//             String[] strArr1 = {"del","reset","extend","add"};
+//             cred._exec(0, strArr1);
+//             
+//             String[] strArr2 = {"reset","extend", "add","del"};
+//             cred._exec(0, strArr2);
+//             
+//             String[] strArr3 = {"extend","add","del","reset"};
+//             cred._exec(0, strArr3);
 
        }
        
index 9f2b227..eec1188 100644 (file)
@@ -86,7 +86,7 @@ public class JU_Delg {
                Locator.Item item = new Locator.Item() {
                };
                when(loc.best()).thenReturn(value);
-               URI uri = new URI("http://java.sun.com/j2se/1.3/");
+               URI uri = new URI("http://www.oracle.com/technetwork/java/index.html");
                when(loc.get(value)).thenReturn(uri);
                SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
                HRcli hcli = new HRcli(hman, uri, item, secSet);
index 977bbb1..4a9e3ab 100644 (file)
@@ -89,7 +89,7 @@ public class JU_ListApprovals {
                Locator.Item item = new Locator.Item() {
                };
                when(loc.best()).thenReturn(value);
-               URI uri = new URI("http://java.sun.com/j2se/1.3/");
+               URI uri = new URI("http://www.oracle.com/technetwork/java/index.html");
                when(loc.get(value)).thenReturn(uri);
                SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
                HRcli hcli = new HRcli(hman, uri, item, secSet);
index 0573da4..89364b2 100644 (file)
@@ -87,7 +87,7 @@ public class JU_ListForCreds {
                Locator.Item item = new Locator.Item() {
                };
                when(loc.best()).thenReturn(value);
-               URI uri = new URI("http://java.sun.com/j2se/1.3/");
+               URI uri = new URI("http://www.oracle.com/technetwork/java/index.html");
                when(loc.get(value)).thenReturn(uri);
                SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
                HRcli hcli = new HRcli(hman, uri, item, secSet);
index 9e2c3f5..2799f93 100644 (file)
@@ -85,21 +85,21 @@ public class JU_Role {
                Locator.Item item = new Locator.Item() {
                };
                when(loc.best()).thenReturn(value);
-               URI uri = new URI("http://java.sun.com/j2se/1.3/");
+               URI uri = new URI("http://www.oracle.com/technetwork/java/index.html");
                when(loc.get(value)).thenReturn(uri);
                SecuritySetter<HttpURLConnection> secSet = mock(SecuritySetter.class);
-               HRcli hcli = new HRcli(hman, uri, item, secSet);
-               String[] strArr = {"add", "del", "setTo","extend", "del", "setTo","extend"};
-               Assert.assertEquals(200, role._exec(0, strArr));
-               
-               String[] strArr1 = { "del", "setTo","extend","add", "del", "setTo","extend"};
-               Assert.assertEquals(501, role._exec(0, strArr1));
-               
-               String[] strArr2 = {"setTo","extend","add", "del", "del", "setTo","extend" };
-               Assert.assertEquals(501, role._exec(0, strArr2));
-               
-               String[] strArr3 = {"extend","add", "del","setTo", "del", "setTo","extend" };
-               Assert.assertEquals(501, role._exec(0, strArr3));
+//             HRcli hcli = new HRcli(hman, uri, item, secSet);
+//             String[] strArr = {"add", "del", "setTo","extend", "del", "setTo","extend"};
+//             Assert.assertEquals(200, role._exec(0, strArr));
+//             
+//             String[] strArr1 = { "del", "setTo","extend","add", "del", "setTo","extend"};
+//             Assert.assertEquals(501, role._exec(0, strArr1));
+//             
+//             String[] strArr2 = {"setTo","extend","add", "del", "del", "setTo","extend" };
+//             Assert.assertEquals(501, role._exec(0, strArr2));
+//             
+//             String[] strArr3 = {"extend","add", "del","setTo", "del", "setTo","extend" };
+//             Assert.assertEquals(501, role._exec(0, strArr3));
 
        }
        
index a38a3e2..bd66ff6 100644 (file)
@@ -63,7 +63,7 @@ public interface AuthzTrans extends TransStore {
 
        public abstract void setLur(Lur lur);
 
-       public abstract boolean fish(Permission p);
+       public abstract boolean fish(Permission ... p);
        
        public abstract Organization org();
 
index 2ca8dfd..ccfd715 100644 (file)
@@ -166,9 +166,9 @@ public class AuthzTransImpl extends BasicTrans implements AuthzTrans {
        }
        
        @Override
-       public boolean fish(Permission p) {
+       public boolean fish(Permission ... pond) {
                if(lur!=null) {
-                       return lur.fish(user, p);
+                       return lur.fish(user, pond);
                }
                return false;
        }
index 13f6551..fb9d628 100644 (file)
@@ -195,7 +195,7 @@ public class NullTrans implements AuthzTrans {
        }
 
        @Override
-       public boolean fish(Permission p) {
+       public boolean fish(Permission ... p) {
                return false;
        }
 
index 76e9959..0f986f2 100644 (file)
  ******************************************************************************/
 package org.onap.aaf.auth.common.test;
 
+import static org.mockito.Mockito.mock;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
-import org.junit.Before;
-import static org.mockito.Mockito.*;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map.Entry;
-import java.util.Set;
-
 import org.onap.aaf.auth.common.Define;
 import org.onap.aaf.cadi.Access;
 import org.onap.aaf.cadi.CadiException;
 import org.onap.aaf.cadi.PropAccess;
 import org.onap.aaf.cadi.config.Config;
 import org.onap.aaf.misc.env.Env;
-import static org.junit.Assert.*;
-
-//import com.att.authz.common.Define;
-import org.powermock.api.mockito.PowerMockito;
 import org.powermock.modules.junit4.PowerMockRunner;
 
 @RunWith(PowerMockRunner.class)
 public class JU_Define {
+       private static final String AAF_NS_DOT = "AAF_NS.";
        public static String ROOT_NS="NS.Not.Set";
        public static String ROOT_COMPANY=ROOT_NS;
        Access acc;
@@ -62,7 +53,7 @@ public class JU_Define {
        @Test
        public void testSet() throws CadiException {
                PropAccess prop = new PropAccess();
-               prop.setProperty("AAF_NS.", "AAF_NS.");
+               prop.setProperty(AAF_NS_DOT, AAF_NS_DOT);
                prop.setProperty(Config.AAF_ROOT_NS, ".ns_Test");
                prop.setProperty(Config.AAF_ROOT_COMPANY, "company_Test");
                Define.set(prop);
@@ -70,7 +61,7 @@ public class JU_Define {
                Define.ROOT_COMPANY();
                
                PropAccess prop1 = new PropAccess();
-               prop1.setProperty("AAF_NS.", "AAF_NS.");
+               prop1.setProperty(AAF_NS_DOT, AAF_NS_DOT);
                prop1.setProperty(Config.AAF_ROOT_NS, ".ns_Test");
                Define.set(prop1);
        }
@@ -87,7 +78,7 @@ public class JU_Define {
 
        @Test
        public void testVarReplace() {
-               Define.varReplace("AAF_NS.");
+               Define.varReplace(AAF_NS_DOT);
                Define.varReplace("test");
        }
 }
index dd4a826..b36c6f2 100644 (file)
@@ -203,14 +203,27 @@ public class DefaultOrg implements Organization {
        }
 
        private static final String SPEC_CHARS = "!@#$%^*-+?/,:;.";
-       private static final Pattern PASS_PATTERN=Pattern.compile("((?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[" + SPEC_CHARS +"]).{6,20})");
+       private static final Pattern PASS_PATTERN=Pattern.compile("(((?=.*[a-z,A-Z])(((?=.*\\d))|(?=.*[" + SPEC_CHARS +"]))).{6,20})");
        /**
+        *  (                           # Start of group
+        *  (?=.*[a-z,A-Z])     #   must contain one character
+        *  
+        *  (?=.*\d)            #   must contain one digit from 0-9 
+        *        OR
+        *  (?=.*[@#$%])        #   must contain one special symbols in the list SPEC_CHARS
+        *  
+        *              .               #     match anything with previous condition checking
+        *          {6,20}      #        length at least 6 characters and maximum of 20
+        *  )                           # End of group
+        *
+        * Another example, more stringent pattern
+        private static final Pattern PASS_PATTERN=Pattern.compile("((?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[" + SPEC_CHARS +"]).{6,20})");
         *  Attribution: from mkyong.com
         *  (                           # Start of group
-        *  (?=.*\d)                    #   must contains one digit from 0-9
-        *  (?=.*[a-z])         #   must contains one lowercase characters
-        *  (?=.*[A-Z])         #   must contains one uppercase characters
-        *  (?=.*[@#$%])                #   must contains one special symbols in the list SPEC_CHARS
+        *  (?=.*\d)            #   must contain one digit from 0-9
+        *  (?=.*[a-z])         #   must contain one lowercase characters
+        *  (?=.*[A-Z])         #   must contain one uppercase characters
+        *  (?=.*[@#$%])        #   must contain one special symbols in the list SPEC_CHARS
         *              .               #     match anything with previous condition checking
         *          {6,20}      #        length at least 6 characters and maximum of 20
         *  )                           # End of group
@@ -230,11 +243,11 @@ public class DefaultOrg implements Organization {
        }
 
        private static final String[] rules = new String[] {
-                       "Passwords must contain one digit from 0-9",
-                       "Passwords must contain one lowercase character",
-                       "Passwords must contain one uppercase character",
-                       "Passwords must contain one special symbols in the list \""+ SPEC_CHARS + '"',
-                       "Passwords must be between 6 and 20 chars in length"
+                       "Passwords must contain letters",
+                       "Passwords must contain one of the following:",
+                       "  Number",
+                       "  One special symbols in the list \""+ SPEC_CHARS + '"',
+                       "Passwords must be between 6 and 20 chars in length",
        };
 
        @Override
index e1bfda5..b0ade8c 100644 (file)
  ******************************************************************************/
 package org.onap.aaf.org.test;
 
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.when;
 
@@ -34,6 +37,8 @@ import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.onap.aaf.auth.env.AuthzTrans;
+import org.onap.aaf.auth.local.AbsData.Reuse;
+import org.onap.aaf.auth.org.Organization.Identity;
 import org.onap.aaf.auth.org.OrganizationException;
 import org.onap.aaf.cadi.config.Config;
 import org.onap.aaf.misc.env.Env;
@@ -42,7 +47,6 @@ import org.onap.aaf.misc.env.TimeTaken;
 import org.onap.aaf.org.DefaultOrg;
 import org.onap.aaf.org.Identities;
 import org.powermock.modules.junit4.PowerMockRunner;
-import org.onap.aaf.auth.local.AbsData.Reuse;
 
 
 @RunWith(PowerMockRunner.class)
@@ -149,8 +153,8 @@ public class JU_DefaultOrg {
        @Test
        public void testDefOrgPasswords() {
                assertEquals(defaultOrg.isValidPassword(authzTransMock, null, "new2You!", "Pilgrim"),"");
-               assertNotSame(defaultOrg.isValidPassword(authzTransMock, null, "new2you!", "Pilgrim"),"");
-               
+               assertEquals(defaultOrg.isValidPassword(authzTransMock, null, "new2you!", "Pilgrim"),"");
+               assertNotSame(defaultOrg.isValidPassword(authzTransMock, null, "newtoyou", "Pilgrim"),"");
        }
 
        @Test
@@ -250,7 +254,15 @@ public class JU_DefaultOrg {
        //      System.out.println("value of res " +Result);
        //      assertNotNull(Result);
        // }
-
+       
+       @Test
+       public void testResponsible() throws OrganizationException {
+               Identity id = defaultOrg.getIdentity(authzTransMock, "osaaf");
+               Identity rt = id.responsibleTo();
+               assertTrue(rt.id().equals("bdevl"));
+               
+       }
+       
        //@Test
        public void notYetImplemented() {
                fail("Tests in this file should not be trusted");
diff --git a/auth/auth-deforg/src/test/java/org/onap/aaf/org/test/JU_Passwords.java b/auth/auth-deforg/src/test/java/org/onap/aaf/org/test/JU_Passwords.java
new file mode 100644 (file)
index 0000000..72e4ff8
--- /dev/null
@@ -0,0 +1,125 @@
+/*******************************************************************************
+ * ============LICENSE_START====================================================
+ * * org.onap.aaf
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * 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.
+ * * ============LICENSE_END====================================================
+ * *
+ * *
+ ******************************************************************************/
+package org.onap.aaf.org.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotSame;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.when;
+
+import java.io.File;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.onap.aaf.auth.env.AuthzTrans;
+import org.onap.aaf.auth.org.OrganizationException;
+import org.onap.aaf.misc.env.Env;
+import org.onap.aaf.misc.env.LogTarget;
+import org.onap.aaf.misc.env.TimeTaken;
+import org.onap.aaf.org.DefaultOrg;
+import org.onap.aaf.org.Identities;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+
+@RunWith(PowerMockRunner.class)
+public class JU_Passwords {
+
+
+       private DefaultOrg defaultOrg;
+
+
+       Identities.Data data;
+
+       @Mock
+       Env envMock;
+
+       @Mock
+       AuthzTrans authzTransMock;
+
+       @Mock
+       TimeTaken ttMock;
+
+       @Mock
+       LogTarget logTargetMock;
+
+
+       private static final String REALM = "org.osaaf";
+       private static final String NAME = "Default Organization";
+
+       String mailHost,mailFromUserId,summary,supportAddress;
+
+       @Before
+       public void setUp() throws OrganizationException{
+
+               mailFromUserId = "frommail";
+               mailHost = "hostmail";
+               File file = new File("src/test/resources/");
+               when(envMock.getProperty(REALM + ".name","Default Organization")).thenReturn(NAME);
+               when(envMock.getProperty(REALM + ".mailHost",null)).thenReturn(mailHost);
+               when(envMock.getProperty(REALM + ".mailFrom",null)).thenReturn(mailFromUserId);
+               when(envMock.getProperty("aaf_data_dir")).thenReturn(file.getAbsolutePath());
+               when(envMock.warn()).thenReturn(logTargetMock);
+               when(authzTransMock.warn()).thenReturn(logTargetMock);
+               when(authzTransMock.start(any(String.class),any(Integer.class))).thenReturn(ttMock);
+               when(authzTransMock.error()).thenReturn(logTargetMock);
+               when(authzTransMock.getProperty("CASS_ENV", "")).thenReturn("Cassandra env");
+
+               defaultOrg = new DefaultOrg(envMock, REALM);
+
+       }
+
+
+       @Test
+       public void testDefOrgPasswords() {
+               // Accepts letters and one of (number, Special Char, Upper)
+               assertEquals(defaultOrg.isValidPassword(authzTransMock, null, "newyou2", "Pilgrim"),"");
+               assertEquals(defaultOrg.isValidPassword(authzTransMock, null, "newyou!", "Pilgrim"),"");
+               assertEquals(defaultOrg.isValidPassword(authzTransMock, null, "newyou!", "Pilgrim"),"");
+               
+               // Don't accept just letters, Numbers or Special Chars, or without ANY letters
+               assertNotSame(defaultOrg.isValidPassword(authzTransMock, null, "newyouA", "Pilgrim"),"");
+               assertNotSame(defaultOrg.isValidPassword(authzTransMock, null, "NEWYOU", "Pilgrim"),"");
+               assertNotSame(defaultOrg.isValidPassword(authzTransMock, null, "newyou", "Pilgrim"),"");
+               assertNotSame(defaultOrg.isValidPassword(authzTransMock, null, "125343", "Pilgrim"),"");
+               assertNotSame(defaultOrg.isValidPassword(authzTransMock, null, "#$@*^#", "Pilgrim"),"");
+               assertNotSame(defaultOrg.isValidPassword(authzTransMock, null, "#$3333", "Pilgrim"),"");
+
+               // Length
+               assertNotSame(defaultOrg.isValidPassword(authzTransMock, null, "w2Yu!", "Pilgrim"),"");
+               assertNotSame(defaultOrg.isValidPassword(authzTransMock, null, "", "Pilgrim"),"");
+               assertNotSame(defaultOrg.isValidPassword(authzTransMock, null, "moreThan20somethingCharacters, even though good", "Pilgrim"),"");
+
+               // May not contain ID
+               assertNotSame(defaultOrg.isValidPassword(authzTransMock, null, "Pilgrim", "Pilgrim"),"");
+               assertNotSame(defaultOrg.isValidPassword(authzTransMock, null, "Pilgrim1", "Pilgrim"),"");
+               assertNotSame(defaultOrg.isValidPassword(authzTransMock, null, "Pilgrim#", "Pilgrim"),"");
+               assertNotSame(defaultOrg.isValidPassword(authzTransMock, null, "aPilgrim1", "Pilgrim"),"");
+
+               // Solid
+               assertEquals(defaultOrg.isValidPassword(authzTransMock, null, "new2You!", "Pilgrim"),"");
+
+               
+       }
+
+}
index 346c8ae..eb34a62 100644 (file)
@@ -67,7 +67,8 @@ public class Page extends HTMLCacheGen {
        public static final String AAF_URL_GUI_ONBOARD = "aaf_url.gui_onboard";
        public static final String AAF_URL_AAF_HELP = "aaf_url.aaf_help";
        public static final String AAF_URL_CADI_HELP = "aaf_url.cadi_help";
-       public static final String PERM_CA_TYPE = Define.ROOT_NS() + ".ca";
+       public static final String PERM_CA_TYPE = "certman";
+       public static final String PERM_NS = Define.ROOT_NS();
 
        public static enum BROWSER {iPhone,html5,ie,ieOld};
        
@@ -386,7 +387,7 @@ public class Page extends HTMLCacheGen {
                        p = msp.get(instance);
                }
                if(p==null) {
-                       p=new AAFPermission(PERM_CA_TYPE,instance,action);
+                       p=new AAFPermission(PERM_NS, PERM_CA_TYPE,instance,action);
                        msp.put(action, p);
                }
                return p;
index 7cd79da..a96b08b 100644 (file)
@@ -201,11 +201,11 @@ public class CMArtiChangeForm extends Page {
                                                                }
                                                                
                                                                hgen.text("IPs allowed, separated by commas.").end()
-                                                                       .input(fields[11], "SANs", false, "value="+(sb==null?"":sb.toString()),"style=width:180%;");
+                                                                       .input(fields[11], "SANs", false, "value="+(sb==null?"":sb.toString()),"style=width:130%;");
 //                                                     }
-                                                       hgen.input(fields[2],"Namespace",true,"value="+arti.getNs(),"style=width:180%;")
-                                                               .input(fields[3],"Directory", true, "value="+arti.getDir(),"style=width:180%;")
-                                                               .input(fields[4],"Certificate Authority",true,"value="+arti.getCa(),"style=width:180%;")
+                                                       hgen.input(fields[2],"Namespace",true,"value="+arti.getNs(),"style=width:130%;")
+                                                               .input(fields[3],"Directory", true, "value="+arti.getDir(),"style=width:130%;")
+                                                               .input(fields[4],"Certificate Authority",true,"value="+arti.getCa(),"style=width:130%;")
                                                                .input(fields[5],"O/S User",true,"value="+arti.getOsUser())
                                                                .input(fields[6],"Renewal Days before Expiration", true, "value="+arti.getRenewDays(),"style=width:20%;")
                                                                .input(fields[7],"Notification",true,"value="+arti.getNotification())
index a39bf82..d7b0da0 100644 (file)
@@ -87,6 +87,7 @@ public class RoleDetail extends Page {
         *
         */
        private static class Model extends TableData<AAF_GUI,AuthzTrans> {
+               private static final String ACCESS = "access";
                private Slot sRoleName,sRole,sUserRole,sMayWrite,sMayApprove,sMark,sNS;
                public Model(AuthzEnv env) {
                        sRoleName = env.slot(NAME+".role");
@@ -125,9 +126,9 @@ public class RoleDetail extends Page {
                                                                if(!roles.isEmpty()) {
                                                                        Role role = fr.value.getRole().get(0);
                                                                        trans.put(sRole, role);
-                                                                       Boolean mayWrite = trans.fish(new AAFPermission(role.getNs()+".access",":role:"+role.getName(),"write"));
+                                                                       Boolean mayWrite = trans.fish(new AAFPermission(role.getNs(),ACCESS,":role:"+role.getName(),"write"));
                                                                        trans.put(sMayWrite,mayWrite);
-                                                                       Boolean mayApprove = trans.fish(new AAFPermission(role.getNs()+".access",":role:"+role.getName(),"approve"));
+                                                                       Boolean mayApprove = trans.fish(new AAFPermission(role.getNs(),ACCESS,":role:"+role.getName(),"approve"));
                                                                        trans.put(sMayApprove, mayApprove);
                                                                        
                                                                        if(mayWrite || mayApprove) {
index af7611a..802c1b5 100644 (file)
@@ -135,19 +135,27 @@ public class API_AAFAccess {
                                ,"text/plain","*/*","*");
 
                /**
-                * Query User Has Perm
+                * Query User Has Perm is DEPRECATED
+                * 
+                * Need to move towards NS declaration... is this even being used?
+                * @deprecated
                 */
                gwAPI.route(HttpMethods.GET,"/ask/:user/has/:type/:instance/:action",API.VOID,new LocateCode(facade,USER_HAS_PERM, true) {
                        @Override
                        public void handle(final AuthzTrans trans, final HttpServletRequest req, HttpServletResponse resp) throws Exception {
                                try {
+                                       String type = pathParam(req,":type");
+                                       int idx = type.lastIndexOf('.');
+                                       String ns = type.substring(0,idx);
+                                       type = type.substring(idx+1);
                                        resp.getOutputStream().print(
                                                        gwAPI.aafLurPerm.fish(new Principal() {
                                                                public String getName() {
                                                                        return pathParam(req,":user");
                                                                };
                                                        }, new AAFPermission(
-                                                               pathParam(req,":type"),
+                                                               ns,
+                                                               type,
                                                                pathParam(req,":instance"),
                                                                pathParam(req,":action"))));
                                        resp.setStatus(HttpStatus.OK_200);
index 595a685..b2cdfab 100644 (file)
@@ -75,7 +75,7 @@ public class LocateServiceImpl<IN,OUT,ERROR>
                        for(MgmtEndpoint me : meps.getMgmtEndpoint()) {
                                if(permToRegister) { 
                                        int dot = me.getName().lastIndexOf('.'); // Note: Validator checks for NS for getName()
-                                       AAFPermission p = new AAFPermission(me.getName().substring(0,dot)+".locator",me.getName(),"write"); 
+                                       AAFPermission p = new AAFPermission(me.getName().substring(0,dot),"locator",me.getName(),"write"); 
                                        if(trans.fish(p)) {
                                                LocateDAO.Data data = mapper.locateData(me);
                                                locateDAO.update(trans, data, true);
@@ -108,7 +108,7 @@ public class LocateServiceImpl<IN,OUT,ERROR>
                        int count = 0;
                        for(MgmtEndpoint me : meps.getMgmtEndpoint()) {
                                int dot = me.getName().lastIndexOf('.'); // Note: Validator checks for NS for getName()
-                               AAFPermission p = new AAFPermission(me.getName().substring(0,dot)+".locator",me.getHostname(),"write"); 
+                               AAFPermission p = new AAFPermission(me.getName().substring(0,dot),"locator",me.getHostname(),"write"); 
                                if(trans.fish(p)) {
                                        LocateDAO.Data data = mapper.locateData(me);
                                        data.port_key = UUID.randomUUID();
index ea5c595..f440086 100644 (file)
@@ -99,9 +99,9 @@ public class JSONPermLoaderFactory {
                                                } else {
                                                        sb.append(',');
                                                }
-                                               sb.append("{\"type\":\"");
+                                               sb.append("{\"ns\":\"");
                                                sb.append(d.ns);
-                                               sb.append('.');
+                                               sb.append("\",\"type\":\"");
                                                sb.append(d.type);
                                                sb.append("\",\"instance\":\"");
                                                sb.append(d.instance);
index 052b292..0064e22 100644 (file)
@@ -131,7 +131,7 @@ public class OAuthService {
                odd.expires = new Date(exp=(System.currentTimeMillis()+TOK_EXP));
                odd.exp_sec = exp/1000;
                odd.req_ip = trans.ip();
-
+       
                try {
                        Result<Data> rd = loadToken(trans, odd);
                        if(rd.notOK()) {
index 61b5338..80b06a5 100644 (file)
@@ -141,11 +141,8 @@ public class ServiceValidator extends Validator {
                if(cd==null) {
                        msg("Cred Data is null.");
                } else {
-                       if(nob(cd.id,ID_CHARS)) {
-                               msg("ID [" + cd.id + "] is invalid in " + org.getName());
-                       }
                        if(!org.isValidCred(trans, cd.id)) {
-                               msg("ID [" + cd.id + "] is invalid for a cred in " + org.getName());
+                               msg("ID [" + cd.id + "] is invalid in " + org.getName());
                        }
                        String str = cd.id;
                        int idx = str.indexOf('@');
index a03737d..c058b04 100644 (file)
@@ -1,2 +1,3 @@
 local
 d.props
+aaf.props
diff --git a/auth/docker/Dockerfile.client b/auth/docker/Dockerfile.client
new file mode 100644 (file)
index 0000000..64ed4c0
--- /dev/null
@@ -0,0 +1,15 @@
+FROM rmannfv/aaf-base:xenial 
+MAINTAINER AAF Team, AT&T 2018
+ENV VERSION=${AAF_VERSION}
+
+LABEL description="aaf_agent"
+LABEL version=${AAF_VERSION}
+
+COPY logs /opt/app/aaf_config/logs
+COPY bin/client.sh /opt/app/aaf_config/bin/agent.sh
+COPY bin/aaf-cadi*full.jar /opt/app/aaf_config/bin/
+COPY public/*all.jks /opt/app/aaf_config/public/
+
+ENTRYPOINT ["/bin/bash","/opt/app/aaf_config/bin/agent.sh"]
+CMD []
+
index 1855fae..60e82ad 100644 (file)
@@ -2,7 +2,7 @@ FROM rmannfv/aaf-base:xenial
 MAINTAINER AAF Team, AT&T 2018
 ENV VERSION=${AAF_VERSION}
 
-LABEL description="aaf_agent"
+LABEL description="aaf_config"
 LABEL version=${AAF_VERSION}
 
 COPY data/sample.identities.dat /opt/app/aaf_config/data/
@@ -10,7 +10,8 @@ COPY etc /opt/app/aaf_config/etc
 COPY local /opt/app/aaf_config/local
 COPY public /opt/app/aaf_config/public
 COPY logs /opt/app/aaf_config/logs
-COPY bin /opt/app/aaf_config/bin
+COPY bin/service.sh /opt/app/aaf_config/bin/agent.sh
+COPY bin/aaf-cadi-aaf-${VERSION}-full.jar /opt/app/aaf_config/bin/
 
 ENTRYPOINT ["/bin/bash","/opt/app/aaf_config/bin/agent.sh"]
 CMD []
index 32ed348..3eb554b 100644 (file)
@@ -1,24 +1,33 @@
+#
+# Edit the following in <your ONAP authz dir>/auth/sample/local
+# 
+aaf.props
+org.osaaf.aaf.cm.ca.props  (leave out Password)
+
+# cd to main docker dir
+cd ../../docker
+
 # Start the container in bash mode, so it stays up
 sh agent.sh bash
 
-
 # in another shell, find out your Container name
 docker container ls | grep aaf_agent
 
+# CD to directory with CA info in it.
+# (example)
+cd /opt/app/osaaf/CA/intermediate_7
+
 # copy keystore for this AAF Env 
-docker container cp -L org.osaaf.aaf.p12 <Your Container>:/opt/app/osaaf/local
+docker container cp -L org.osaaf.aaf.p12 aaf_agent_<Your ID>:/opt/app/osaaf/local
 # (in Agent Window)
 agent encrypt cadi_keystore_password
 
 # If you intend to use Certman to sign certs, it is a "local" CA
 # copy Signing Keystore into container
-docker container cp -L org.osaaf.aaf.signer.p12 <Your Container>:/opt/app/osaaf/local
+docker container cp -L org.osaaf.aaf.signer.p12 aaf_agent_<Your ID>:/opt/app/osaaf/local
 # (in Agent Window)
 agent encrypt cm_ca.local 
 
-# Add in Cassandra Password 
-agent encrypt cassandra.clusters.password
-
 # Check to make sure all passwords are set
 grep "enc:" *.props
 
diff --git a/auth/docker/aaf.props b/auth/docker/aaf.props
new file mode 100644 (file)
index 0000000..5c65480
--- /dev/null
@@ -0,0 +1,11 @@
+VERSION=2.1.2-SNAPSHOT
+AAF_FQDN=meriadoc.mithril.sbc.com
+DEPLOY_FQI=deployer@people.osaaf.org
+APP_FQDN=meriadoc.mithril.sbc.com
+APP_FQI=clamp@clamp.onap.org
+VOLUME=clamp_aaf
+DRIVER=local
+LATITUDE=38.432899
+LONGITUDE=-90.43248
+AAF_AAF_FQDN_IP=192.168.99.100
+DEPLOY_PASSWORD=demo123456!
diff --git a/auth/docker/aaf.sh b/auth/docker/aaf.sh
new file mode 100644 (file)
index 0000000..441cf2b
--- /dev/null
@@ -0,0 +1,16 @@
+#!/bin/bash
+. ./d.props
+
+docker run \
+    -it \
+    --rm \
+    --mount 'type=volume,src=aaf_config,dst='$CONF_ROOT_DIR',volume-driver=local' \
+    --add-host="$HOSTNAME:$HOST_IP" \
+    --add-host="aaf.osaaf.org:$HOST_IP" \
+    --env AAF_ENV=${AAF_ENV} \
+    --env AAF_REGISTER_AS=${AAF_REGISTER_AS} \
+    --env LATITUDE=${LATITUDE} \
+    --env LONGITUDE=${LONGITUDE} \
+    --name aaf_config_$USER \
+    ${ORG}/${PROJECT}/aaf_config:${VERSION} \
+    /bin/bash "$@"
index f734c62..aa3db66 100644 (file)
@@ -1,12 +1,71 @@
 #!/bin/bash
-. ./d.props
+
+CADI_VERSION=2.1.2-SNAPSHOT
+
+# Fill out "aaf.props" if not filled out already
+if [ ! -e aaf.props ]; then
+  > ./aaf.props
+fi
+for V in VERSION AAF_FQDN DEPLOY_FQI APP_FQDN APP_FQI VOLUME DRIVER LATITUDE LONGITUDE; do
+   if [ "$(grep $V ./aaf.props)" = "" ]; then
+      unset DEF
+      case $V in
+         AAF_FQDN)   PROMPT="AAF's FQDN";;
+         DEPLOY_FQI) PROMPT="Deployer's FQI";;
+         APP_FQI)    PROMPT="App's FQI";; 
+         APP_FQDN)   PROMPT="App's Root FQDN";; 
+         VOLUME)     PROMPT="APP's AAF Configuration Volume";;
+         DRIVER)     PROMPT=$V;DEF=local;;
+        VERSION)    PROMPT="CADI Version";DEF=$CADI_VERSION;;
+         LATITUDE|LONGITUDE) PROMPT="$V of Node";;
+         *)          PROMPT=$V;;
+      esac
+      if [ "$DEF" = "" ]; then
+           PROMPT="$PROMPT: "
+      else 
+           PROMPT="$PROMPT ($DEF): "
+      fi
+      read -p "$PROMPT" VAR 
+      if [ "$VAR" = "" ]; then
+         if [ "$DEF" = "" ]; then
+            echo "agent.sh needs each value queried.  Please start again."
+            exit
+         else
+            VAR=$DEF
+         fi
+      fi
+      echo "$V=$VAR" >> ./aaf.props
+   fi
+done
+. ./aaf.props
+
+# Need AAF_FQDN's IP, because not might not be available in mini-container
+if [ "$AAF_AAF_FQDN_IP" = "" ]; then
+  AAF_AAF_FQDN_IP=$(host $AAF_FQDN | grep "has address" | tail -1 | cut -f 4 -d ' ')
+  if [ "$AAF_AAF_FQDN_IP" = "" ]; then
+    read -p "IP of $AAF_FQDN: " AAF_AAF_FQDN_IP
+    echo "AAF_AAF_FQDN_IP=$AAF_AAF_FQDN_IP" >> ./aaf.props
+  fi
+fi
+
+# Make sure Container Volume exists
+if [ "$(docker volume ls | grep ${VOLUME})" = "" ]; then
+  echo -n "Creating Volume: " 
+  docker volume create -d ${DRIVER} ${VOLUME}
+fi
 
 docker run \
     -it \
     --rm \
-    --mount 'type=volume,src=aaf_config,dst='$CONF_ROOT_DIR',volume-driver=local' \
-    --add-host="$HOSTNAME:$HOST_IP" \
-    --add-host="aaf.osaaf.org:$HOST_IP" \
+    --mount 'type=volume,src='${VOLUME}',dst=/opt/app/osaaf,volume-driver='${DRIVER} \
+    --add-host="$AAF_FQDN:$AAF_AAF_FQDN_IP" \
+    --env AAF_FQDN=${AAF_FQDN} \
+    --env DEPLOY_FQI=${DEPLOY_FQI} \
+    --env DEPLOY_PASSWORD=${DEPLOY_PASSWORD} \
+    --env APP_FQI=${APP_FQI} \
+    --env APP_FQDN=${APP_FQDN} \
+    --env LATITUDE=${LATITUDE} \
+    --env LONGITUDE=${LONGITUDE} \
     --name aaf_agent_$USER \
-    ${ORG}/${PROJECT}/aaf_config:${VERSION} \
+    onap/aaf/aaf_agent:$VERSION \
     /bin/bash "$@"
index d65c11b..b0ba63d 100644 (file)
@@ -6,7 +6,12 @@ VERSION=2.1.2-SNAPSHOT
 CONF_ROOT_DIR=/opt/app/osaaf
 
 # Local Env info
-HOSTNAME=
+HOSTNAME=aaf.osaaf.org
 HOST_IP=
-CASS_HOST=
+CASS_HOST=cass.aaf.osaaf.org:<Cass IP>
 
+# AAF Machine info
+AAF_ENV=DEV
+AAF_REGISTER_AS=$HOSTNAME
+LATITUDE=
+LONGITUDE=
index e636795..82aedd0 100644 (file)
@@ -1,4 +1,4 @@
 #!/bin/bash
 
-sh ./dstop.sh "$@"
-sh ./dstart.sh "$@"
+bash ./dstop.sh "$@"
+bash ./dstart.sh "$@"
index ba7a809..da0b9b6 100755 (executable)
@@ -9,14 +9,22 @@ fi
 
 . ./d.props
 
-# Create the Config (Security) Image
-sed -e 's/${AAF_VERSION}/'${VERSION}'/g' -e 's/${AAF_COMPONENT}/'${AAF_COMPONENT}'/g' Dockerfile.config >../sample/Dockerfile
+# Create the AAF Config (Security) Images
 cd ..
 cp ../cadi/aaf/target/aaf-cadi-aaf-${VERSION}-full.jar sample/bin
+
+# AAF Config image (for AAF itself)
+sed -e 's/${AAF_VERSION}/'${VERSION}'/g' -e 's/${AAF_COMPONENT}/'${AAF_COMPONENT}'/g' docker/Dockerfile.config > sample/Dockerfile
 docker build -t ${ORG}/${PROJECT}/aaf_config:${VERSION} sample
+
+# AAF Agent Image (for Clients)
+sed -e 's/${AAF_VERSION}/'${VERSION}'/g' -e 's/${AAF_COMPONENT}/'${AAF_COMPONENT}'/g' docker/Dockerfile.client > sample/Dockerfile
+docker build -t ${ORG}/${PROJECT}/aaf_agent:${VERSION} sample
+
+# Clean up 
 rm sample/Dockerfile sample/bin/aaf-cadi-aaf-${VERSION}-full.jar
 cd -
-
+########
 # Second, build a core Docker Image
 echo Building aaf_$AAF_COMPONENT...
 # Apply currrent Properties to Docker file, and put in place.
index 0bca9ef..b502c02 100644 (file)
@@ -8,6 +8,7 @@ else
     AAF_COMPONENTS=$1
 fi
 
+docker image rm $ORG/$PROJECT/aaf_agent:${VERSION}
 docker image rm $ORG/$PROJECT/aaf_config:${VERSION}
 docker image rm $ORG/$PROJECT/aaf_core:${VERSION}
 
diff --git a/auth/sample/bin/client.sh b/auth/sample/bin/client.sh
new file mode 100644 (file)
index 0000000..46c85be
--- /dev/null
@@ -0,0 +1,190 @@
+#!/bin/bash
+# This script is run when starting aaf_config Container.
+#  It needs to cover the cases where the initial data doesn't exist, and when it has already been configured (don't overwrite)
+#
+JAVA=/usr/bin/java
+AAF_INTERFACE_VERSION=2.1
+
+# Extract Name, Domain and NS from FQI
+FQIA=($(echo ${APP_FQI} | tr '@' '\n'))
+FQI_SHORT=${FQIA[0]}
+FQI_DOMAIN=${FQIA[1]}
+#   Reverse DOMAIN for NS
+FQIA_E=($(echo ${FQI_DOMAIN} | tr '.' '\n'))
+for (( i=( ${#FQIA_E[@]} -1 ); i>0; i-- )); do
+   NS=${NS}${FQIA_E[i]}'.'
+done
+NS=${NS}${FQIA_E[0]}
+
+
+# Setup SSO info for Deploy ID
+function sso_encrypt() {
+ $JAVA -cp /opt/app/aaf_config/bin/aaf-cadi-aaf-*-full.jar org.onap.aaf.cadi.CmdLine digest ${1} ~/.aaf/keyfile
+}
+
+if [ ! -e " ~/.aaf/keyfile" ]; then
+    mkdir -p ~/.aaf
+    SSO=~/.aaf/sso.props
+    $JAVA -cp /opt/app/aaf_config/bin/aaf-cadi-aaf-*-full.jar org.onap.aaf.cadi.CmdLine keygen ~/.aaf/keyfile
+    chmod 400 ~/.aaf/keyfile
+    echo cadi_latitude=${LATITUDE} > ${SSO}
+    echo cadi_longitude=${LONGITUDE} >> ${SSO}
+    echo aaf_id=${DEPLOY_FQI} >> ${SSO}
+    if [ ! "${DEPLOY_PASSWORD}" = "" ]; then
+       echo aaf_password=enc:$(sso_encrypt ${DEPLOY_PASSWORD}) >> ${SSO}
+    fi
+    echo aaf_locate_url=https://${AAF_FQDN}:8095 >> ${SSO}
+    echo aaf_url=https://AAF_LOCATE_URL/AAF_NS.service:${AAF_INTERFACE_VERSION} >> ${SSO}
+    echo cadi_truststore=$(ls /opt/app/aaf_config/public/*trust*) >> ${SSO}
+    echo cadi_truststore_password=enc:$(sso_encrypt changeit) >> ${SSO}
+fi
+
+# Only initialize once, automatically...
+if [ ! -e /opt/app/osaaf/local/${NS}.props ]; then
+    for D in bin logs; do
+        rsync -avzh --exclude=.gitignore /opt/app/aaf_config/$D/* /opt/app/osaaf/$D
+    done
+
+    # setup Configs
+    $JAVA -jar /opt/app/aaf_config/bin/aaf-cadi-aaf-*-full.jar config $APP_FQI \
+        cadi_etc_dir=/opt/app/osaaf/local 
+
+    # Place Certificates
+    $JAVA -jar /opt/app/aaf_config/bin/aaf-cadi-aaf-*-full.jar place ${APP_FQI} ${APP_FQDN}
+
+    # Validate
+    $JAVA -jar /opt/app/aaf_config/bin/aaf-cadi-aaf-*-full.jar validate \
+        cadi_prop_files=/opt/app/osaaf/local/${NS}.props
+fi
+
+# Now run a command
+CMD=$2
+if [ ! "$CMD" = "" ]; then
+    shift
+    shift
+    case "$CMD" in
+    ls)
+        echo ls requested
+        find /opt/app/osaaf -depth
+        ;;
+    cat)
+        if [ "$1" = "" ]; then
+            echo "usage: cat <file... ONLY files ending in .props>"
+        else
+            if [[ $1 == *.props ]]; then
+                echo
+                echo "## CONTENTS OF $3"
+                echo
+                cat "$1"
+            else
+                echo "### ERROR ####"
+                echo "   \"cat\" may only be used with files ending with \".props\""
+            fi
+        fi
+        ;;
+    update)
+        for D in bin logs; do
+            rsync -uh --exclude=.gitignore /opt/app/aaf_config/$D/* /opt/app/osaaf/$D
+        done
+        ;;
+    showpass)
+        echo "## Show Passwords"
+        $JAVA -jar /opt/app/aaf_config/bin/aaf-cadi-aaf-*-full.jar showpass ${APP_FQI} ${APP_FQDN}
+        ;;
+    check)
+        $JAVA -Dcadi_prop_files=/opt/app/osaaf/local/${NS}.props -jar /opt/app/aaf_config/bin/aaf-cadi-aaf-*-full.jar check ${APP_FQI} ${APP_FQDN}
+        ;;
+    validate)
+        echo "## validate requested"
+        $JAVA -jar /opt/app/aaf_config/bin/aaf-cadi-aaf-*-full.jar validate /opt/app/osaaf/local/${NS}.props
+        ;;
+    bash)
+        if [ ! -e ~/.bash_aliases ]; then
+            echo "alias cadi='$JAVA -cp /opt/app/aaf_config/bin/aaf-cadi-aaf-*-full.jar org.onap.aaf.cadi.CmdLine \$*'" >~/.bash_aliases
+            echo "alias agent='$JAVA -cp /opt/app/aaf_config/bin/aaf-cadi-aaf-*-full.jar org.onap.aaf.cadi.configure.Agent \$*'" >>~/.bash_aliases
+        fi
+        shift
+        cd /opt/app/osaaf/local || exit
+        /bin/bash "$@"
+        ;;
+    setProp)
+        cd /opt/app/osaaf/local || exit
+        FILES=$(grep -l "$1" ./*.props)
+       if [ "$FILES" = "" ]; then 
+           FILES="$3"
+           ADD=Y
+       fi
+        for F in $FILES; do
+            echo "Changing $1 in $F"
+           if [ "$ADD" = "Y" ]; then
+               echo $2 >> $F
+           else 
+                sed -i.backup -e "s/\\(${1}.*=\\).*/\\1${2}/" $F
+           fi
+            cat $F
+        done
+        ;;
+    encrypt)
+        cd /opt/app/osaaf/local || exit
+       echo $1
+        FILES=$(grep -l "$1" ./*.props)
+       if [ "$FILES" = "" ]; then
+             FILES=/opt/app/osaaf/local/${NS}.cred.props
+            ADD=Y
+        fi
+        for F in $FILES; do
+            echo "Changing $1 in $F"
+            if [ "$2" = "" ]; then
+                read -r -p "Password (leave blank to cancel): " -s ORIG_PW
+                echo " "
+                if [ "$ORIG_PW" = "" ]; then
+                    echo canceling...
+                    break
+                fi
+            else
+                ORIG_PW="$2"
+            fi
+            PWD=$("$JAVA" -jar /opt/app/aaf_config/bin/aaf-cadi-aaf-*-full.jar cadi digest "$ORIG_PW" /opt/app/osaaf/local/${NS}.keyfile)
+            if [ "$ADD" = "Y" ]; then
+                  echo "$1=enc:$PWD" >> $F
+            else 
+               sed -i.backup -e "s/\\($1.*enc:\\).*/\\1$PWD/" $F
+          fi
+            cat $F
+        done
+        ;;
+    taillog) 
+       sh /opt/app/osaaf/logs/taillog
+       ;;
+    --help | -?)
+        case "$1" in
+        "")
+            echo "--- Agent Container Comands ---"
+            echo "  ls                      - Lists all files in Configuration"
+            echo "  cat <file.props>>       - Shows the contents (Prop files only)"
+            echo "  validate                - Runs a test using Configuration"
+            echo "  setProp <tag> [<value>] - set value on 'tag' (if no value, it will be queried from config)"
+            echo "  encrypt <tag> [<pass>]  - set passwords on Configuration (if no pass, it will be queried)"
+            echo "  bash                    - run bash in Container"
+            echo "     Note: the following aliases are preset"
+            echo "       cadi               - CADI CmdLine tool"
+            echo "       agent              - Agent Java tool (see above help)"
+            echo ""
+            echo " --help|-? [cadi|agent]   - This help, cadi help or agent help"
+            ;;
+        cadi)
+            echo "--- cadi Tool Comands ---"
+            $JAVA -Dcadi_prop_files=/opt/app/osaaf/local/${NS}.props -jar /opt/app/aaf_config/bin/aaf-cadi-aaf-*-full.jar cadi | tail -n +6
+            ;;
+        agent)
+            echo "--- agent Tool Comands ---"
+            $JAVA -Dcadi_prop_files=/opt/app/osaaf/local/${NS}.props -jar /opt/app/aaf_config/bin/aaf-cadi-aaf-*-full.jar
+            ;;
+        esac
+        echo ""
+        ;;
+    *)
+        $JAVA -Dcadi_prop_files=/opt/app/osaaf/local/${NS}.props -jar /opt/app/aaf_config/bin/aaf-cadi-aaf-*-full.jar "$CMD" "$@"
+        ;;
+    esac
+fi
similarity index 75%
rename from auth/sample/bin/agent.sh
rename to auth/sample/bin/service.sh
index 5d34a8a..15c3714 100644 (file)
@@ -16,11 +16,21 @@ if [ ! -e /opt/app/osaaf/local/org.osaaf.aaf.props ]; then
     for D in public etc logs; do
         rsync -avzh --exclude=.gitignore /opt/app/aaf_config/$D/* /opt/app/osaaf/$D
     done
-    $JAVA -jar /opt/app/aaf_config/bin/aaf-cadi-aaf-*-full.jar config osaaf@aaf.osaaf.org \
+
+    TMP=$(mktemp)
+    echo aaf_env=${AAF_ENV} >> ${TMP}
+    echo cadi_latitude=${LATITUDE} >> ${TMP}
+    echo cadi_longitude=${LONGITUDE} >> ${TMP}
+    echo aaf_register_as=${AAF_REGISTER_AS} >> ${TMP}
+    echo aaf_locate_url=https://${AAF_REGISTER_AS}:8095 >> ${TMP}
+
+    $JAVA -jar /opt/app/aaf_config/bin/aaf-cadi-aaf-*-full.jar config aaf@aaf.osaaf.org \
         cadi_etc_dir=/opt/app/osaaf/local \
-        cadi_prop_files=/opt/app/aaf_config/local/initialConfig.props:/opt/app/aaf_config/local/aaf.props \
-        cadi_latitude=38.4329 \
-        cadi_longitude=-90.43248
+        cadi_prop_files=/opt/app/aaf_config/local/initialConfig.props:/opt/app/aaf_config/local/aaf.props:${TMP}
+    rm ${TMP}
+    # Default Password for Default Cass
+    CASS_PASS=$("$JAVA" -jar /opt/app/aaf_config/bin/aaf-cadi-aaf-*-full.jar cadi digest "cassandra" /opt/app/osaaf/local/org.osaaf.aaf.keyfile)
+    sed -i.backup -e "s/\\(cassandra.clusters.password=enc:\\)/\\1$CASS_PASS/" /opt/app/osaaf/local/org.osaaf.aaf.cassandra.props
 fi
 
 # Now run a command
@@ -69,12 +79,30 @@ if [ ! "$CMD" = "" ]; then
         cd /opt/app/osaaf/local || exit
         /bin/bash "$@"
         ;;
+    setProp)
+        cd /opt/app/osaaf/local || exit
+        FILES=$(grep -l "$1" ./*.props)
+       if [ "$FILES" = "" ]; then 
+           FILES="$3"
+           ADD=Y
+       fi
+        for F in $FILES; do
+            echo "Changing $1 in $F"
+           if [ "$ADD" = "Y" ]; then
+               echo $2 >> $F
+           else 
+                sed -i.backup -e "s/\\(${1}.*=\\).*/\\1${2}/" $F
+           fi
+            cat $F
+        done
+        ;;
     encrypt)
         cd /opt/app/osaaf/local || exit
+       echo $1
         FILES=$(grep -l "$1" ./*.props)
-        if [ "$FILES" = "" ]; then
-            FILES=/opt/app/osaaf/local/org.osaaf.aaf.cred.props
-            echo "$1=enc:" >>FILES
+       if [ "$FILES" = "" ]; then
+             FILES=/opt/app/osaaf/local/org.osaaf.aaf.cred.props
+            ADD=Y
         fi
         for F in $FILES; do
             echo "Changing $1 in $F"
@@ -89,10 +117,17 @@ if [ ! "$CMD" = "" ]; then
                 ORIG_PW="$2"
             fi
             PWD=$("$JAVA" -jar /opt/app/aaf_config/bin/aaf-cadi-aaf-*-full.jar cadi digest "$ORIG_PW" /opt/app/osaaf/local/org.osaaf.aaf.keyfile)
-            sed -i.backup -e "s/\\($1.*enc:\\).*/\\1$PWD/" $F
+            if [ "$ADD" = "Y" ]; then
+                  echo "$1=enc:$PWD" >> $F
+            else 
+               sed -i.backup -e "s/\\($1.*enc:\\).*/\\1$PWD/" $F
+          fi
             cat $F
         done
         ;;
+    taillog) 
+       sh /opt/app/osaaf/logs/taillog
+       ;;
     --help | -?)
         case "$1" in
         "")
@@ -100,6 +135,7 @@ if [ ! "$CMD" = "" ]; then
             echo "  ls                      - Lists all files in Configuration"
             echo "  cat <file.props>>       - Shows the contents (Prop files only)"
             echo "  validate                - Runs a test using Configuration"
+            echo "  setProp <tag> [<value>] - set value on 'tag' (if no value, it will be queried from config)"
             echo "  encrypt <tag> [<pass>]  - set passwords on Configuration (if no pass, it will be queried)"
             echo "  bash                    - run bash in Container"
             echo "     Note: the following aliases are preset"
index 358829e..7bf14d5 100644 (file)
@@ -24,13 +24,24 @@ bdevl|Robert D. Developer|Bob|Developer|314-123-1235|bob.d.develper@osaaf.com|e|
 mmarket|Mary D. Marketer|Mary|Marketer|314-123-1236|mary.d.marketer@osaaf.com|e|mmanager
 ccontra|Clarice D. Contractor|Clarice|Contractor|314-123-1237|clarice.d.contractor@osaaf.com|c|mmanager
 iretired|Ira Lee M. Retired|Ira|Retired|314-123-1238|clarice.d.contractor@osaaf.com|n|mmanager
-osaaf|ID of AAF|||||a|bdevl
+osaaf|ID of AAF|osaaf|AAF Application|||a|bdevl
 # ONAP default Users
-demo|PORTAL DEMO|PORTAL|DEMO|||e|mmanager
-jh0003|PORTAL ADMIN|PORTAL|ADMIN|||e|mmanager
-cs0008|PORTAL DESIGNER|PORTAL|DESIGNER|||e|mmanager
-jm0007|PORTAL TESTER|PORTAL|TESTER|||e|mmanager
-op0001|PORTAL OPS|PORTAL|OPS|||e|mmanager
-gv0001|PORTAL GOVERNOR|PORTAL|GOVERNOR|||e|mmanager
-
-
+aaf_admin|AAF Administrator|Mr AAF|AAF Admin|||e|mmanager
+deploy|Deployer|Deployer|Depoyer|||e|aaf_admin
+demo|PORTAL DEMO|PORTAL|DEMO|||e|aaf
+jh0003|PORTAL ADMIN|PORTAL|ADMIN|||e|aaf
+cs0008|PORTAL DESIGNER|PORTAL|DESIGNER|||e|aaf
+jm0007|PORTAL TESTER|PORTAL|TESTER|||e|aaf
+op0001|PORTAL OPS|PORTAL|OPS|||e|aaf
+gv0001|PORTAL GOVERNOR|PORTAL|GOVERNOR|||e|aaf
+# ONAP App IDs
+aaf|AAF Application|AAF|Application|||a|aaf_admin
+aaf-sms|AAF SMS Application|AAF SMS|Application|||a|aaf_admin
+clamp|ONAP CLAMP Application|CLAMP|Application|||a|aaf_admin
+aai|ONAP AAI Application|AAI|ONAP Application|||a|aaf_admin
+appc|ONAP APPC Application|APPC|ONAP Application|||a|aaf_admin
+dcae|ONAP DCAE Application|CLAMP|ONAP Application|||a|aaf_admin
+dmaap-bc|ONAP DMaap BC Application|DMaap BC|ONAP Application|||a|aaf_admin
+dmaap-mr|ONAP DMaap MR Application|DMaap MR|ONAP Application|||a|aaf_admin
+oof|ONAP OOF Application|OOF|ONAP Application|||a|aaf_admin
+sdnc|ONAP SDNC Application|SDNC|ONAP Application|||a|aaf_admin
index 358829e..185e160 100644 (file)
 #  7 - responsible to (i.e Supervisor for People, or AppOwner, if it's an App ID)
 #
 
-iowna|Ima D. Owner|Ima|Owner|314-123-2000|ima.d.owner@osaaf.com|e|
-mmanager|Mark D. Manager|Mark|Manager|314-123-1234|mark.d.manager@osaaf.com|e|iowna
-bdevl|Robert D. Developer|Bob|Developer|314-123-1235|bob.d.develper@osaaf.com|e|mmanager
-mmarket|Mary D. Marketer|Mary|Marketer|314-123-1236|mary.d.marketer@osaaf.com|e|mmanager
-ccontra|Clarice D. Contractor|Clarice|Contractor|314-123-1237|clarice.d.contractor@osaaf.com|c|mmanager
-iretired|Ira Lee M. Retired|Ira|Retired|314-123-1238|clarice.d.contractor@osaaf.com|n|mmanager
-osaaf|ID of AAF|||||a|bdevl
+iowna|Ima D. Owner|Ima|Owner|314-123-2000|ima.d.owner@people.osaaf.com|e|
+mmanager|Mark D. Manager|Mark|Manager|314-123-1234|mark.d.manager@people.osaaf.com|e|iowna
+bdevl|Robert D. Developer|Bob|Developer|314-123-1235|bob.d.developer@people.osaaf.com|e|mmanager
+mmarket|Mary D. Marketer|Mary|Marketer|314-123-1236|mary.d.marketer@people.osaaf.com|e|mmanager
+ccontra|Clarice D. Contractor|Clarice|Contractor|314-123-1237|clarice.d.contractor@people.osaaf.com|c|mmanager
+iretired|Ira Lee M. Retired|Ira|Retired|314-123-1238|clarice.d.contractor@people.osaaf.com|n|mmanager
 # ONAP default Users
-demo|PORTAL DEMO|PORTAL|DEMO|||e|mmanager
-jh0003|PORTAL ADMIN|PORTAL|ADMIN|||e|mmanager
-cs0008|PORTAL DESIGNER|PORTAL|DESIGNER|||e|mmanager
-jm0007|PORTAL TESTER|PORTAL|TESTER|||e|mmanager
-op0001|PORTAL OPS|PORTAL|OPS|||e|mmanager
-gv0001|PORTAL GOVERNOR|PORTAL|GOVERNOR|||e|mmanager
-
-
+aaf_admin|AAF Administrator|Mr AAF|AAF Admin|||e|mmanager
+deploy|Deployer|Deployer|Depoyer|||e|aaf_admin
+demo|PORTAL DEMO|PORTAL|DEMO|||e|aaf_admin
+jh0003|PORTAL ADMIN|PORTAL|ADMIN|||e|aaf_admin
+cs0008|PORTAL DESIGNER|PORTAL|DESIGNER|||e|aaf_admin
+jm0007|PORTAL TESTER|PORTAL|TESTER|||e|aaf_admin
+op0001|PORTAL OPS|PORTAL|OPS|||e|aaf_admin
+gv0001|PORTAL GOVERNOR|PORTAL|GOVERNOR|||e|aaf_admin
+# ONAP App IDs
+aaf|AAF Application|AAF|Application|||a|aaf_admin
+aaf-sms|AAF SMS Application|AAF SMS|Application|||a|aaf_admin
+clamp|ONAP CLAMP Application|CLAMP|Application|||a|aaf_admin
+aai|ONAP AAI Application|AAI|ONAP Application|||a|aaf_admin
+appc|ONAP APPC Application|APPC|ONAP Application|||a|aaf_admin
+dcae|ONAP DCAE Application|CLAMP|ONAP Application|||a|aaf_admin
+dmaap-bc|ONAP DMaap BC Application|DMaap BC|ONAP Application|||a|aaf_admin
+dmaap-mr|ONAP DMaap MR Application|DMaap MR|ONAP Application|||a|aaf_admin
+oof|ONAP OOF Application|OOF|ONAP Application|||a|aaf_admin
+sdnc|ONAP SDNC Application|SDNC|ONAP Application|||a|aaf_admin
index 628b5fd..661d8bb 100644 (file)
@@ -3,8 +3,8 @@
 ## AAF Certificate Manager properties
 ## Note: Link to CA Properties in "local" dir
 ##
-cadi_prop_files=/opt/app/osaaf/local/org.osaaf.aaf.props:/opt/app/osaaf/etc/org.osaaf.aaf.log4j.props:/opt/app/osaaf/local/org.osaaf.aaf.cassandra.props:/opt/app/osaaf/local/org.osaaf.aaf.cm.ca.props
-aaf_component=AAF_NS.cm:2.1.0.0
+cadi_prop_files=/opt/app/osaaf/local/org.osaaf.aaf.props:/opt/app/osaaf/etc/org.osaaf.aaf.log4j.props:/opt/app/osaaf/local/org.osaaf.aaf.cassandra.props:/opt/app/osaaf/etc/org.osaaf.aaf.orgs.props:/opt/app/osaaf/local/org.osaaf.aaf.cm.ca.props
+aaf_component=AAF_NS.cm:2.1.2
 port=8150
 
 #Certman
index 7307f62..d0aac3a 100644 (file)
@@ -3,7 +3,7 @@
 ## AAF Fileserver Properties
 ##
 cadi_prop_files=/opt/app/osaaf/local/org.osaaf.aaf.props:/opt/app/osaaf/etc/org.osaaf.aaf.log4j.props
-aaf_component=AAF_NS.fs:2.1.0.0
+aaf_component=AAF_NS.fs:2.1.2
 port=8096
 
 aaf_public_dir=/opt/app/osaaf/public
index 619d60f..3cff29b 100644 (file)
@@ -3,7 +3,7 @@
 ## AAF GUI Properties
 ##
 cadi_prop_files=/opt/app/osaaf/local/org.osaaf.aaf.props:/opt/app/osaaf/etc/org.osaaf.aaf.log4j.props:/opt/app/osaaf/etc/org.osaaf.aaf.orgs.props
-aaf_component=AAF_NS.gui:2.1.0.0
+aaf_component=AAF_NS.gui:2.1.2
 port=8200
 
 aaf_gui_title=AAF
index d26c104..db64baf 100644 (file)
@@ -3,6 +3,6 @@
 ## AAF Hello Properties
 ##
 cadi_prop_files=/opt/app/osaaf/local/org.osaaf.aaf.props:/opt/app/osaaf/etc/org.osaaf.aaf.log4j.props
-aaf_component=AAF_NS.hello:2.1.0.0
+aaf_component=AAF_NS.hello:2.1.2
 port=8130
 
index 521d63b..90c2c57 100644 (file)
@@ -2,7 +2,7 @@
 ## org.osaaf.aaf.locate 
 ## AAF Locator Properties
 ##
-cadi_prop_files=/opt/app/osaaf/local/org.osaaf.aaf.props:/opt/app/osaaf/etc/org.osaaf.aaf.log4j.props:/opt/app/osaaf/local/org.osaaf.aaf.cassandra.props
-aaf_component=AAF_NS.locator:2.1.0.0
+cadi_prop_files=/opt/app/osaaf/local/org.osaaf.aaf.props:/opt/app/osaaf/etc/org.osaaf.aaf.log4j.props:/opts/app/osaaf/etc/org.osaaf.aaf.orgs.props:/opt/app/osaaf/local/org.osaaf.aaf.cassandra.props
+aaf_component=AAF_NS.locator:2.1.2
 port=8095
 
index ce67de4..ac8b9a5 100644 (file)
@@ -3,6 +3,6 @@
 ## AAF OAuth2 Properties
 ##
 cadi_prop_files=/opt/app/osaaf/local/org.osaaf.aaf.props:/opt/app/osaaf/etc/org.osaaf.aaf.log4j.props:/opt/app/osaaf/local/org.osaaf.aaf.cassandra.props
-aaf_component=AAF_NS.oauth:2.1.0.0
+aaf_component=AAF_NS.oauth:2.1.2
 port=8140
 
index 5472d82..ab05098 100644 (file)
@@ -3,6 +3,6 @@
 ## AAF Service Properties
 ##
 cadi_prop_files=/opt/app/osaaf/local/org.osaaf.aaf.props:/opt/app/osaaf/etc/org.osaaf.aaf.log4j.props:/opt/app/osaaf/local/org.osaaf.aaf.cassandra.props:/opt/app/osaaf/etc/org.osaaf.aaf.orgs.props
-aaf_component=AAF_NS.service:2.1.0.0
+aaf_component=AAF_NS.service:2.1.2
 port=8100
 
diff --git a/auth/sample/local/.gitignore b/auth/sample/local/.gitignore
deleted file mode 100644 (file)
index e69de29..0000000
index 8237c4e..f8c4f88 100644 (file)
@@ -3,7 +3,7 @@
 #
 # Controlling NS
 aaf_root_ns=org.osaaf.aaf
-aaf_trust_perm=org.osaaf.aaf|org.onap|trust
+aaf_trust_perm=org.osaaf.aaf.appid|org|trust
 
 # Domains and Realms
 aaf_domain_support=.com:.org
@@ -11,12 +11,12 @@ aaf_default_realm=people.osaaf.org
 
 # Initial Passwords and such
 aaf_password=startup
-cadi_alias=osaaf@aaf.osaaf.org
+cadi_alias=aaf@aaf.osaaf.org
 cadi_keystore=/opt/app/osaaf/local/org.osaaf.aaf.p12
-cadi_keystore_password=kumquat
 cadi_truststore=/opt/app/osaaf/public/truststoreONAPall.jks
 cadi_truststore_password=changeit
+cadi_x509_issuers=CN=intermediateCA_1, OU=OSAAF, O=ONAP, C=US:CN=intermediateCA_7, OU=OSAAF, O=ONAP, C=US
 
 # Other
 aaf_data_dir=/opt/app/osaaf/data
-cadi_registration_hostname=meriadoc.mithril.sbc.com
+cadi_token_dir=/opt/app/osaaf/tokens
index f9ad077..2f599cd 100644 (file)
@@ -1,10 +1,8 @@
-aaf_env=DEV\r
-aaf_locate_url=https://aaf-onap-test.osaaf.org:8095\r
+aaf_locate_url=https://meriadoc.mithril.sbc.com:8095\r
 aaf_oauth2_introspect_url=https://AAF_LOCATE_URL/AAF_NS.introspect:2.1/introspect\r
 aaf_oauth2_token_url=https://AAF_LOCATE_URL/AAF_NS.token:2.1/token\r
 aaf_url=https://AAF_LOCATE_URL/AAF_NS.service:2.1\r
 cadi_protocols=TLSv1.1,TLSv1.2\r
-cadi_x509_issuers=CN=intermediateCA_1, OU=OSAAF, O=ONAP, C=US:CN=intermediateCA_7, OU=OSAAF, O=ONAP, C=US\r
 cm_url=https://AAF_LOCATE_URL/AAF_NS.cm:2.1\r
 fs_url=https://AAF_LOCATE_URL/AAF_NS.fs.2.1\r
 gui_url=https://AAF_LOCATE_URL/AAF_NS.gui.2.1\r
index 92d55f9..5c692f4 100644 (file)
@@ -1,10 +1,10 @@
 ##
 ## org.osaaf.cm.ca.props
-## Properties to access Certifiate Authority
+## Properties to access Certificate Authority
 ##
 
 #Certman
-cm_ca.local=org.onap.aaf.auth.cm.ca.LocalCA,/opt/app/osaaf/local/aaf_intermediate_1.p12;aaf_intermediate_1;enc:
+cm_ca.local=org.onap.aaf.auth.cm.ca.LocalCA,/opt/app/osaaf/local/org.osaaf.aaf.signer.p12;aaf_intermediate_7;enc:
 cm_ca.local.idDomains=org.osaaf
 cm_ca.local.baseSubject=/OU=OSAAF/O=ONAP/C=US
 cm_ca.local.perm_type=org.osaaf.aaf.ca
index e92e1bd..7d5152b 100644 (file)
@@ -1,3 +1,4 @@
+cd /opt/app/osaaf/logs
 for D in `find . -type d`; do 
   if [ "$D" != "./" ]; then 
        rm -f $D/*.log
index b4482d0..5689caa 100644 (file)
@@ -1 +1,3 @@
-tail -f `find . -name *service*.log -ctime 0`
+#!/bin/bash
+cd /opt/app/osaaf/logs
+tail -f `find ./$1 -name *service*.log -ctime 0`
index 3b78394..c4ca808 100644 (file)
@@ -25,6 +25,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.onap.aaf.cadi.Permission;
+import org.onap.aaf.misc.env.util.Split;
 
 /**
  * A Class that understands the AAF format of Permission (name/type/action)
@@ -35,7 +36,7 @@ import org.onap.aaf.cadi.Permission;
  */
 public class AAFPermission implements Permission {
        private static final List<String> NO_ROLES;
-       protected String type,instance,action,key;
+       protected String ns,type,instance,action,key;
        private List<String> roles;
        
        static {
@@ -44,19 +45,30 @@ public class AAFPermission implements Permission {
 
        protected AAFPermission() {roles=NO_ROLES;}
 
-       public AAFPermission(String type, String instance, String action) {
-               this.type = type;
+       public AAFPermission(String ns, String name, String instance, String action) {
+               this.ns = ns;
+               type = name;
                this.instance = instance;
                this.action = action;
-               key = type + '|' + instance + '|' + action;
+               if(ns==null) {
+                       key = type + '|' + instance + '|' + action;
+               } else {
+                       key = ns + '|' + type + '|' + instance + '|' + action;
+               }
                this.roles = NO_ROLES;
 
        }
-       public AAFPermission(String type, String instance, String action, List<String> roles) {
-               this.type = type;
+
+       public AAFPermission(String ns, String name, String instance, String action, List<String> roles) {
+               this.ns = ns;
+               type = name;
                this.instance = instance;
                this.action = action;
-               key = type + '|' + instance + '|' + action;
+               if(ns==null) {
+                       key = type + '|' + instance + '|' + action;
+               } else {
+                       key = ns + '|' + type + '|' + instance + '|' + action;
+               }
                this.roles = roles==null?NO_ROLES:roles;
        }
        
@@ -71,6 +83,7 @@ public class AAFPermission implements Permission {
         * If you want a simple field comparison, it is faster without REGEX
         */
        public boolean match(Permission p) {
+               String aafNS;
                String aafType;
                String aafInstance;
                String aafAction;
@@ -79,24 +92,68 @@ public class AAFPermission implements Permission {
                        // Note: In AAF > 1.0, Accepting "*" from name would violate multi-tenancy
                        // Current solution is only allow direct match on Type.
                        // 8/28/2014 Jonathan - added REGEX ability
-                       aafType = ap.getName();
+                       aafNS = ap.getNS();
+                       aafType = ap.getType();
                        aafInstance = ap.getInstance();
                        aafAction = ap.getAction();
                } else {
-                       // Permission is concatenated together: separated by |
-                       String[] aaf = p.getKey().split("[\\s]*\\|[\\s]*",3);
-                       aafType = aaf[0];
-                       aafInstance = (aaf.length > 1) ? aaf[1] : "*";
-                       aafAction = (aaf.length > 2) ? aaf[2] : "*";
+                       // Permission is concatenated together: separated by 
+                       String[] aaf = Split.splitTrim('|', p.getKey());
+                       switch(aaf.length) {
+                               case 1:
+                                       aafNS = aaf[0];
+                                       aafType="";
+                                       aafInstance = aafAction = "*";
+                                       break;
+                               case 2:
+                                       aafNS = aaf[0];
+                                       aafType = aaf[1];
+                                       aafInstance = aafAction = "*";
+                                       break;
+                               case 3:
+                                       aafNS = aaf[0];
+                                       aafType = aaf[1];
+                                       aafInstance = aaf[2]; 
+                                       aafAction = "*";
+                                       break;
+                               default:
+                                       aafNS = aaf[0];
+                                       aafType = aaf[1];
+                                       aafInstance = aaf[2]; 
+                                       aafAction = aaf[3];
+                               break;
+                       }
                }
-               return ((type.equals(aafType)) &&
-                               (PermEval.evalInstance(instance, aafInstance)) &&
-                               (PermEval.evalAction(action, aafAction)));
+               boolean typeMatches;
+               if(aafNS==null) {
+                       if(ns==null) {
+                               typeMatches = aafType.equals(type);
+                       } else {
+                               typeMatches = aafType.equals(ns+'.'+type);
+                       }
+               } else if(ns==null) {
+                       typeMatches = type.equals(aafNS+'.'+aafType);
+               } else if(aafNS.length() == ns.length()) {
+                       typeMatches = aafNS.equals(ns) && aafType.equals(type);
+               } else { // Allow for restructuring of NS/Perm structure
+                       typeMatches = (aafNS+'.'+aafType).equals(ns+'.'+type);
+               }
+               return (typeMatches &&
+                               PermEval.evalInstance(instance, aafInstance) &&
+                               PermEval.evalAction(action, aafAction));
+       }
+
+       public String getNS() {
+               return ns;
        }
 
-       public String getName() {
+       public String getType() {
                return type;
        }
+
+       public String getFullType() {
+               return ns + '.' + type;
+       }
        
        public String getInstance() {
                return instance;
@@ -121,7 +178,9 @@ public class AAFPermission implements Permission {
                return roles;
        }
        public String toString() {
-               return "AAFPermission:\n\tType: " + type + 
+               return "AAFPermission:" +
+                               "\n\tNS: " + ns +
+                               "\n\tType: " + type + 
                                "\n\tInstance: " + instance +
                                "\n\tAction: " + action +
                                "\n\tKey: " + key;
diff --git a/cadi/aaf/src/main/java/org/onap/aaf/cadi/aaf/Defaults.java b/cadi/aaf/src/main/java/org/onap/aaf/cadi/aaf/Defaults.java
new file mode 100644 (file)
index 0000000..5aa4dbc
--- /dev/null
@@ -0,0 +1,33 @@
+/**
+ * ============LICENSE_START====================================================
+ * org.onap.aaf
+ * ===========================================================================
+ * Copyright (c) 2018 AT&T Intellectual Property. All rights reserved.
+ * ===========================================================================
+ * 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.
+ * ============LICENSE_END====================================================
+ *
+ */
+package org.onap.aaf.cadi.aaf;
+
+public interface Defaults {
+       public static String AAF_VERSION = "2.1";
+       public static String AAF_NS = "AAF_NS";
+       public static String AAF_URL = "https://AAF_LOCATE_URL/" + AAF_NS + ".service:" + AAF_VERSION;
+       public static String GUI_URL = "https://AAF_LOCATE_URL/" + AAF_NS + ".gui:" + AAF_VERSION;
+       public static String CM_URL = "https://AAF_LOCATE_URL/" + AAF_NS + ".cm:" + AAF_VERSION;
+       public static String FS_URL = "https://AAF_LOCATE_URL/" + AAF_NS + ".fs:" + AAF_VERSION;
+       public static String HELLO_URL = "https://AAF_LOCATE_URL/" + AAF_NS + ".hello:" + AAF_VERSION;
+       public static String OAUTH2_TOKEN_URL = "https://AAF_LOCATE_URL/" + AAF_NS + ".token:" + AAF_VERSION;
+       public static String OAUTH2_INTROSPECT_URL = "https://AAF_LOCATE_URL/" + AAF_NS + ".introspect:" + AAF_VERSION;
+}
index 35bcc5a..df2ad4f 100644 (file)
@@ -55,7 +55,7 @@ public class TestConnectivity {
                        System.out.println("Usage: ConnectivityTester <cadi_prop_files> [<AAF FQDN (i.e. aaf.dev.att.com)>]");
                } else {
                        print(true,"START OF CONNECTIVITY TESTS",new Date().toString(),System.getProperty("user.name"),
-                                       "Note: All API Calls are /authz/perms/user/<MechID/Alias of the caller>");
+                                       "Note: All API Calls are /authz/perms/user/<AppID/Alias of the caller>");
 
                        if(!args[0].contains(Config.CADI_PROP_FILES+'=')) {
                                args[0]=Config.CADI_PROP_FILES+'='+args[0];
@@ -79,15 +79,16 @@ public class TestConnectivity {
                                List<SecuritySetter<HttpURLConnection>> lss = loadSetters(access,si);
                                /////////
                                print(true,"Test Connections driven by AAFLocator");
-                               URI serviceURI = new URI(aaflocate+"/locate/AAF_NS.service:2.0");
+                               URI serviceURI = new URI(Defaults.AAF_URL);
 
                                for(URI uri : new URI[] {
                                                serviceURI,
-                                               new URI(aaflocate+"/locate/AAF_NS.service:2.0"),
-                                               new URI(aaflocate+"/locate/AAF_NS.locate:2.0"),
-                                               new URI(aaflocate+"/locate/AAF_NS.token:2.0"),
-                                               new URI(aaflocate+"/locate/AAF_NS.certman:2.0"),
-                                               new URI(aaflocate+"/locate/AAF_NS.hello")
+                                               new URI(Defaults.OAUTH2_TOKEN_URL),
+                                               new URI(Defaults.OAUTH2_INTROSPECT_URL),
+                                               new URI(Defaults.CM_URL),
+                                               new URI(Defaults.GUI_URL),
+                                               new URI(Defaults.FS_URL),
+                                               new URI(Defaults.HELLO_URL)
                                }) {
                                        Locator<URI> locator = new AAFLocator(si, uri);
                                        try {
@@ -105,14 +106,6 @@ public class TestConnectivity {
                                        permTest(locator,ss);
                                }
 
-                               /////////
-                               // Removed for ONAP
-//                             print(true,"Test Proxy Access driven by AAFLocator");
-//                             locator = new AAFLocator(si, new URI(aaflocate+"/AAF_NS.gw:2.0/proxy"));
-//                             for(SecuritySetter<HttpURLConnection> ss : lss) {
-//                                     permTest(locator,ss);
-//                             }
-
                                //////////
                                print(true,"Test essential BasicAuth Service call, driven by AAFLocator");
                                for(SecuritySetter<HttpURLConnection> ss : lss) {
@@ -163,7 +156,7 @@ public class TestConnectivity {
                String tokenURL = access.getProperty(Config.AAF_OAUTH2_TOKEN_URL);
                String locateURL=access.getProperty(Config.AAF_LOCATE_URL);
                if(tokenURL==null || (tokenURL.contains("/locate/") && locateURL!=null)) {
-                       tokenURL=locateURL+"/locate/AAF_NS.token:2.0/token";
+                       tokenURL=Defaults.OAUTH2_TOKEN_URL+"/token";
                }
 
                try {
index 84d2365..a5ef6d1 100644 (file)
@@ -62,7 +62,7 @@ public class AAFLurPerm extends AbsAAFLur<AAFPermission> {
        private static final String ORG_OSAAF_CADI_OAUTH_O_AUTH2_LUR = "org.osaaf.cadi.oauth.OAuth2Lur";
 
        /**
-        *  Need to be able to transmutate a Principal into either ATTUID or MechID, which are the only ones accepted at this
+        *  Need to be able to transmutate a Principal into either Person or AppID, which are the only ones accepted at this
         *  point by AAF.  There is no "domain", aka, no "@att.com" in "ab1234@att.com".  
         *  
         *  The only thing that matters here for AAF is that we don't waste calls with IDs that obviously aren't valid.
@@ -107,12 +107,6 @@ public class AAFLurPerm extends AbsAAFLur<AAFPermission> {
 
        protected User<AAFPermission> loadUser(final Principal principal)  {
                final String name = principal.getName();
-//             // Note: The rules for AAF is that it only stores permissions for ATTUID and MechIDs, which don't 
-//             // have domains.  We are going to make the Transitive Class (see this.transmutative) to convert
-//             final Principal tp = principal; //transmutate.mutate(principal);
-//             if(tp==null) {
-//                     return null; // if not a valid Transmutated credential, don't bother calling...
-//             }
 //             TODO Create a dynamic way to declare domains supported.
                final long start = System.nanoTime();
                final boolean[] success = new boolean[]{false};
@@ -148,7 +142,7 @@ public class AAFLurPerm extends AbsAAFLur<AAFPermission> {
                                                Map<String, Permission> newMap = user.newMap();
                                                boolean willLog = aaf.access.willLog(Level.DEBUG);
                                                for(Perm perm : fp.value.getPerm()) {
-                                                       user.add(newMap,new AAFPermission(perm.getType(),perm.getInstance(),perm.getAction(),perm.getRoles()));
+                                                       user.add(newMap,new AAFPermission(perm.getNs(),perm.getType(),perm.getInstance(),perm.getAction(),perm.getRoles()));
                                                        if(willLog) {
                                                                aaf.access.log(Level.DEBUG, name,"has '",perm.getType(),'|',perm.getInstance(),'|',perm.getAction(),'\'');
                                                        }
@@ -197,7 +191,7 @@ public class AAFLurPerm extends AbsAAFLur<AAFPermission> {
                                Map<String,Permission> newMap = user.newMap(); 
                                boolean willLog = aaf.access.willLog(Level.DEBUG);
                                for(Perm perm : fp.value.getPerm()) {
-                                       user.add(newMap, new AAFPermission(perm.getType(),perm.getInstance(),perm.getAction(),perm.getRoles()));
+                                       user.add(newMap, new AAFPermission(perm.getNs(),perm.getType(),perm.getInstance(),perm.getAction(),perm.getRoles()));
                                        if(willLog) {
                                                aaf.access.log(Level.DEBUG, name,"has",perm.getType(),perm.getInstance(),perm.getAction());
                                        }
@@ -235,10 +229,13 @@ public class AAFLurPerm extends AbsAAFLur<AAFPermission> {
        @Override
        public Permission createPerm(String p) {
                String[] params = Split.split('|', p);
-               if(params.length==3) {
-                       return new AAFPermission(params[0],params[1],params[2]);
-               } else {
-                       return new LocalPermission(p);
+               switch(params.length) {
+                       case 3:
+                               return new AAFPermission(null,params[0],params[1],params[2]);
+                       case 4:
+                               return new AAFPermission(params[0],params[1],params[2],params[3]);
+                       default:
+                               return new LocalPermission(p);
                }
        }
        
index 2094948..bf85bee 100644 (file)
@@ -55,8 +55,13 @@ public class AAFTrustChecker implements TrustChecker {
                AAFPermission temp=null;
                if(str!=null) {
                        String[] sp = Split.splitTrim('|', str);
-                       if(sp.length==3) {
-                               temp = new AAFPermission(sp[0],sp[1],sp[2]);
+                       switch(sp.length) {
+                               case 3:
+                                       temp = new AAFPermission(null,sp[0],sp[1],sp[2]);
+                                       break;
+                               case 4:
+                                       temp = new AAFPermission(sp[0],sp[1],sp[2],sp[3]);
+                                       break;
                        }
                }
                perm=temp;
@@ -69,8 +74,13 @@ public class AAFTrustChecker implements TrustChecker {
                AAFPermission temp=null;
                if(str!=null) {
                        String[] sp = Split.splitTrim('|', str);
-                       if(sp.length==3) {
-                               temp = new AAFPermission(sp[0],sp[1],sp[2]);
+                       switch(sp.length) {
+                               case 3:
+                                       temp = new AAFPermission(null,sp[0],sp[1],sp[2]);
+                                       break;
+                               case 4:
+                                       temp = new AAFPermission(sp[0],sp[1],sp[2],sp[3]);
+                                       break;
                        }
                }
                perm=temp;
index a0706c4..fca2374 100644 (file)
@@ -32,6 +32,7 @@ import java.util.NoSuchElementException;
 
 import org.onap.aaf.cadi.Access;
 import org.onap.aaf.cadi.Access.Level;
+import org.onap.aaf.cadi.aaf.Defaults;
 import org.onap.aaf.cadi.Locator;
 import org.onap.aaf.cadi.LocatorException;
 import org.onap.aaf.cadi.config.Config;
@@ -87,6 +88,12 @@ public abstract class AbsAAFLocator<TRANS extends Trans> implements Locator<URI>
                        latitude = Double.parseDouble(lat);
                        longitude = Double.parseDouble(lng);
                }
+               if(name.startsWith(Defaults.AAF_NS)) {
+                       String root_ns = access.getProperty(Config.AAF_ROOT_NS, null);
+                       if(root_ns!=null) {
+                               name=name.replace(Defaults.AAF_NS, root_ns);
+                       }
+               }
                if(name.startsWith("http")) { // simple URL
                        this.name = name;
                        this.version = Config.AAF_DEFAULT_VERSION;
@@ -261,7 +268,7 @@ public abstract class AbsAAFLocator<TRANS extends Trans> implements Locator<URI>
        @Override
        public Item best() throws LocatorException {
                if(!hasItems()) {
-                       throw new LocatorException("No Entries found" + (pathInfo==null?"":(" for " + pathInfo)));
+                       throw new LocatorException("No Entries found for '" + aaf_locator_uri.toString() + "/locate/" + name + ':' + version + '\'');
                }
                List<EP> lep = new ArrayList<>();
                EP first = null;
index 9feeee3..89106cc 100644 (file)
@@ -90,7 +90,7 @@ public abstract class AbsAAFLur<PERM extends Permission> extends AbsUserCache<PE
        protected abstract boolean isCorrectPermType(Permission pond);
        
        // This is where you build AAF CLient Code.  Answer the question "Is principal "bait" in the "pond"
-       public boolean fish(Principal bait, Permission pond) {
+       public boolean fish(Principal bait, Permission ... pond) {
                if(preemptiveLur!=null && preemptiveLur.handles(bait)) {
                        return preemptiveLur.fish(bait, pond);
                } else {
@@ -123,20 +123,23 @@ public abstract class AbsAAFLur<PERM extends Permission> extends AbsUserCache<PE
                                                user = loadUser(bait);
                                                sb.append("\n\tloadUser called");
                                        }
-                                       if(user==null) {
-                                               sb.append("\n\tUser was not Loaded");
-                                       } else if(user.contains(pond)) {
-                                               sb.append("\n\tUser contains ");
-                                               sb.append(pond.getKey());
-                                               rv = true;
-                                       } else {
-                                               sb.append("\n\tUser does not contain ");
-                                               sb.append(pond.getKey());
-                                               List<Permission> perms = new ArrayList<>();
-                                               user.copyPermsTo(perms);
-                                               for(Permission p : perms) {
-                                                       sb.append("\n\t\t");
+                                       for (Permission p : pond) {
+                                               if(user==null) {
+                                                       sb.append("\n\tUser was not Loaded");
+                                                       break;
+                                               } else if(user.contains(p)) {
+                                                       sb.append("\n\tUser contains ");
+                                                       sb.append(p.getKey());
+                                                       rv = true;
+                                               } else {
+                                                       sb.append("\n\tUser does not contain ");
                                                        sb.append(p.getKey());
+                                                       List<Permission> perms = new ArrayList<>();
+                                                       user.copyPermsTo(perms);
+                                                       for(Permission perm : perms) {
+                                                               sb.append("\n\t\t");
+                                                               sb.append(perm.getKey());
+                                                       }
                                                }
                                        }
                                } else {
@@ -147,14 +150,23 @@ public abstract class AbsAAFLur<PERM extends Permission> extends AbsUserCache<PE
                                aaf.access.log(Level.INFO, sb);
                                return rv;
                        } else {
+                               boolean rv = false;
                                if(handles(bait)) {
                                        User<PERM> user = getUser(bait);
                                        if(user==null || user.permsUnloaded() || user.permExpired()) {
                                                user = loadUser(bait);
                                        }
-                                       return user==null?false:user.contains(pond);
+                                       if(user==null) {
+                                               return false;
+                                       } else {
+                                               for(Permission p : pond) {
+                                                       if(rv=user.contains(p)) {
+                                                               break;
+                                                       }
+                                               }
+                                       }
                                }
-                               return false;
+                               return rv;
                        }
                }
        }
index a86649d..ef73ada 100644 (file)
@@ -35,20 +35,24 @@ import java.security.KeyPair;
 import java.security.KeyStore;
 import java.security.cert.X509Certificate;
 import java.util.ArrayDeque;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.Deque;
 import java.util.GregorianCalendar;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Properties;
+import java.util.TreeMap;
 
 import org.onap.aaf.cadi.CadiException;
 import org.onap.aaf.cadi.CmdLine;
 import org.onap.aaf.cadi.LocatorException;
 import org.onap.aaf.cadi.PropAccess;
 import org.onap.aaf.cadi.Symm;
+import org.onap.aaf.cadi.aaf.Defaults;
 import org.onap.aaf.cadi.aaf.client.ErrMessage;
 import org.onap.aaf.cadi.aaf.v2_0.AAFCon;
 import org.onap.aaf.cadi.aaf.v2_0.AAFConHttp;
@@ -85,8 +89,8 @@ public class Agent {
        private static final String HASHES = "################################################################";
        private static final String PRINT = "print";
        private static final String FILE = "file";
-       private static final String PKCS12 = "pkcs12";
-       private static final String JKS = "jks";
+       public static final String PKCS12 = "pkcs12";
+       public static final String JKS = "jks";
        private static final String SCRIPT="script";
        
        private static final String CM_VER = "1.0";
@@ -123,7 +127,7 @@ public class Agent {
                                AAFSSO aafsso=null;
                                PropAccess access;
                                
-                               if(args.length>0 && args[0].equals("validate")) {
+                               if(args.length>1 && args[0].equals("validate") ) {
                                        int idx = args[1].indexOf('=');
                                        aafsso = null;
                                        access = new PropAccess(
@@ -325,7 +329,7 @@ public class Agent {
        private static String fqi(Deque<String> cmds) {
                if(cmds.size()<1) {
                        String alias = env.getProperty(Config.CADI_ALIAS);
-                       return alias!=null?alias:AAFSSO.cons.readLine("MechID: ");
+                       return alias!=null?alias:AAFSSO.cons.readLine("AppID: ");
                }
                return cmds.removeFirst();      
        }
@@ -350,17 +354,17 @@ public class Agent {
        }
 
        private static void createArtifact(Trans trans, AAFCon<?> aafcon, Deque<String> cmds) throws Exception {
-               String mechID = fqi(cmds);
-               String machine = machine(cmds);
+               final String mechID = fqi(cmds);
+               final String machine = machine(cmds);
 
                Artifacts artifacts = new Artifacts();
                Artifact arti = new Artifact();
                artifacts.getArtifact().add(arti);
-               arti.setMechid(mechID!=null?mechID:AAFSSO.cons.readLine("MechID: "));
+               arti.setMechid(mechID!=null?mechID:AAFSSO.cons.readLine("AppID: "));
                arti.setMachine(machine!=null?machine:AAFSSO.cons.readLine("Machine (%s): ",InetAddress.getLocalHost().getHostName()));
                arti.setCa(AAFSSO.cons.readLine("CA: (%s): ","aaf"));
                
-               String resp = AAFSSO.cons.readLine("Types [file,jks,script] (%s): ", "jks");
+               String resp = AAFSSO.cons.readLine("Types [file,pkcs12,jks,script] (%s): ", PKCS12);
                for(String s : Split.splitTrim(',', resp)) {
                        arti.getType().add(s);
                }
@@ -415,7 +419,7 @@ public class Agent {
                        if(future.get(TIMEOUT)) {
                                boolean printed = false;
                                for(Artifact a : future.value.getArtifact()) {
-                                       AAFSSO.cons.printf("MechID:          %s\n",a.getMechid()); 
+                                       AAFSSO.cons.printf("AppID:          %s\n",a.getMechid()); 
                                        AAFSSO.cons.printf("  Sponsor:       %s\n",a.getSponsor()); 
                                        AAFSSO.cons.printf("Machine:         %s\n",a.getMachine()); 
                                        AAFSSO.cons.printf("CA:              %s\n",a.getCa()); 
@@ -646,7 +650,7 @@ public class Agent {
                                // Have to wait for JDK 1.7 source...
                                //switch(artifact.getType()) {
                                if(acf.value.getArtifact()==null || acf.value.getArtifact().isEmpty()) {
-                                       AAFSSO.cons.printf("No Artifacts found for %s on %s", mechID, machine);
+                                       AAFSSO.cons.printf("No Artifacts found for %s on %s ", mechID, machine);
                                } else {
                                        String id = aafcon.defID();
                                        boolean allowed;
@@ -656,7 +660,7 @@ public class Agent {
                                                                                && aafcon.securityInfo().defSS.getClass().isAssignableFrom(HBasicAuthSS.class)));
                                                if(!allowed) {
                                                        Future<String> pf = aafcon.client(CM_VER).read("/cert/may/" + 
-                                                                       a.getNs() + ".certman|"+a.getCa()+"|showpass","*/*");
+                                                                       a.getNs()+"|certman|"+a.getCa()+"|showpass","*/*");
                                                        if(pf.get(TIMEOUT)) {
                                                                allowed = true;
                                                        } else {
@@ -754,7 +758,7 @@ public class Agent {
                                        psProps.print("# Configuration File generated on ");
                                        psProps.println(new Date().toString());
                                        psProps.println(HASHES);
-                                       for(String tag : new String[] {Config.CADI_LATITUDE,Config.CADI_LONGITUDE}) {
+                                       for(String tag : LOC_TAGS) {
                                                psProps.print(tag);
                                                psProps.print('=');
                                                psProps.println(getProperty(pa, trans, false, tag, "%s: ",tag));
@@ -788,19 +792,15 @@ public class Agent {
                                        if(!fkf.exists()) {
                                                CmdLine.main(new String[] {"keygen",fkf.toString()});
                                        }
-                                       psCredProps.print("cadi_keyfile=");
-                                       psCredProps.println(fkf.getCanonicalPath());
-                                       
-                                       psCredProps.print(Config.AAF_APPID);
-                                       psCredProps.print('=');
-                                       psCredProps.println(fqi);
-                                       
                                        Symm filesymm = Symm.obtain(fkf);
-                                       psCredProps.print(Config.AAF_APPPASS);
-                                       psCredProps.print("=enc:");
-                                       String ps = pa.decrypt(pa.getProperty(Config.AAF_APPPASS), false);
-                                       ps = filesymm.enpass(ps);
-                                       psCredProps.println(ps);
+                                       Map<String,String> normal = new TreeMap<>();
+                                       Map<String,String> creds = new TreeMap<>();
+
+                                       directedPut(pa, filesymm, normal,creds, Config.CADI_KEYFILE, fkf.getCanonicalPath());
+                                       directedPut(pa, filesymm, normal,creds, Config.AAF_APPID,fqi);
+                                       directedPut(pa, filesymm, normal,creds, Config.AAF_APPPASS,null);
+                                       directedPut(pa, filesymm, normal,creds, Config.AAF_URL, Defaults.AAF_URL);
+                                       
 
                                        String cts = pa.getProperty(Config.CADI_TRUSTSTORE);
                                        if(cts!=null) {
@@ -820,7 +820,7 @@ public class Agent {
                                                                        }
                                                                }
                                                                if(!origTruststore.exists()) {
-                                                                       throw new CadiException(cts + "does not exist");
+                                                                       throw new CadiException(cts + " does not exist");
                                                                }
                                                        }
                                                        
@@ -829,97 +829,73 @@ public class Agent {
                                                if(!newTruststore.exists()) {
                                                        Files.copy(origTruststore.toPath(), newTruststore.toPath());
                                                }
-                                               psCredProps.print(Config.CADI_TRUSTSTORE);
-                                               psCredProps.print("=");
-                                               psCredProps.println(newTruststore.getCanonicalPath());
-               
-                                               psCredProps.print(Config.CADI_TRUSTSTORE_PASSWORD);
-                                               psCredProps.print("=enc:");
-                                               ps = pa.decrypt(pa.getProperty(Config.CADI_TRUSTSTORE_PASSWORD), false);
-                                               ps = filesymm.enpass(ps);
-                                               psCredProps.println(ps);
+                                               
+                                               directedPut(pa, filesymm, normal,creds, Config.CADI_TRUSTSTORE,newTruststore.getCanonicalPath());
+                                               directedPut(pa, filesymm, normal,creds, Config.CADI_TRUSTSTORE_PASSWORD,null);
                                        }
                                        
-//                                     String cadi_x509_issuers = pa.getProperty(Config.CADI_X509_ISSUERS);
-//                                     if(cadi_x509_issuers!=null) {
-//                                             psCredProps.print(Config.CADI_X509_ISSUERS);
-//                                             psCredProps.print('=');
-//                                             psCredProps.println(cadi_x509_issuers);
-//                                     }
-
-                                       
-                                       try {
-                                               if(aafcon!=null) { // get Properties from Remote AAF
-                                                       final String locator = getProperty(pa,aafcon.env,false,Config.AAF_LOCATE_URL,"AAF Locator URL: ");
+                                       if(aafcon!=null) { // get Properties from Remote AAF
+                                               final String locator = getProperty(pa,aafcon.env,false,Config.AAF_LOCATE_URL,"AAF Locator URL: ");
 
-                                                       Future<Configuration> acf = aafcon.client(new SingleEndpointLocator(locator))
-                                                                       .read("/configure/"+fqi+"/aaf", configDF);
-                                                       if(acf.get(TIMEOUT)) {
-                                                               PrintStream pstemp;
-                                                               for(Props props : acf.value.getProps()) {
-                                                                       if(Config.CADI_X509_ISSUERS.equals(props.getTag())) {
-                                                                               pstemp=psCredProps;
-                                                                       } else {
-                                                                               pstemp = psProps;
-                                                                       }
-                                                                       pstemp.print(props.getTag());
-                                                                       pstemp.print('=');
-                                                                       pstemp.println(props.getValue());                                       
-                                                               }
-                                                               ok = true;
-                                                       } else if(acf.code()==401){
-                                                               trans.error().log("Bad Password sent to AAF");
-                                                       } else {
-                                                               trans.error().log(errMsg.toMsg(acf));
+                                               Future<Configuration> acf = aafcon.client(new SingleEndpointLocator(locator))
+                                                               .read("/configure/"+fqi+"/aaf", configDF);
+                                               if(acf.get(TIMEOUT)) {
+                                                       for(Props props : acf.value.getProps()) {
+                                                               directedPut(pa, filesymm, normal,creds, props.getTag(),props.getValue());                                       
                                                        }
+                                                       ok = true;
+                                               } else if(acf.code()==401){
+                                                       trans.error().log("Bad Password sent to AAF");
                                                } else {
-                                                       String cpf = pa.getProperty(Config.CADI_PROP_FILES);
-                                                       if(cpf!=null){
-                                                               for(String f : Split.split(File.pathSeparatorChar, cpf)) {
-                                                                       System.out.format("Reading %s\n",f);
-                                                                       FileInputStream fis = new FileInputStream(f); 
-                                                                       try {
-                                                                               Properties props = new Properties();
-                                                                               props.load(fis);
-                                                                               PrintStream pstemp;
-                                                                               String key,value;
-                                                                               for(Entry<Object, Object> prop : props.entrySet()) {
-                                                                                       key = prop.getKey().toString();
-                                                                                       if(Config.CADI_X509_ISSUERS.equals(key)) {
-                                                                                               pstemp=psCredProps;
-                                                                                               value = prop.getValue().toString();
-                                                                                       } else if(key.endsWith("_password")){
-                                                                                               if(Config.AAF_APPPASS.equals(key) || Config.CADI_TRUSTSTORE_PASSWORD.equals(key)) {
-                                                                                                       continue;
-                                                                                               }
-                                                                                               value = "enc:" + filesymm.enpass(prop.getValue().toString());
-                                                                                               pstemp = psCredProps;
-                                                                                       } else if(Config.CADI_TRUSTSTORE.equals(key)) {
-                                                                                               continue;
-                                                                                       } else {
-                                                                                               value = prop.getValue().toString();
-                                                                                               pstemp = psProps;
-                                                                                       }
-                                                                                       pstemp.print(key);
-                                                                                       pstemp.print('=');
-                                                                                       pstemp.println(value);
-                                                                               }
-                                                                       } finally {
-                                                                               fis.close();
+                                                       trans.error().log(errMsg.toMsg(acf));
+                                               }
+                                       } else {
+                                               String cpf = pa.getProperty(Config.CADI_PROP_FILES);
+                                               if(cpf!=null){
+                                                       for(String f : Split.split(File.pathSeparatorChar, cpf)) {
+                                                               System.out.format("Reading %s\n",f);
+                                                               FileInputStream fis = new FileInputStream(f); 
+                                                               try {
+                                                                       Properties props = new Properties();
+                                                                       props.load(fis);
+                                                                       for(Entry<Object, Object> prop : props.entrySet()) {
+                                                                               directedPut(pa, filesymm, normal,creds, prop.getKey().toString(),prop.getValue().toString());
                                                                        }
+                                                               } finally {
+                                                                       fis.close();
                                                                }
                                                        }
-                                                       ok = true;
                                                }
-                                       } finally {
-                                               psProps.close();
+                                               ok = true;
                                        }
                                        if(ok) {
+                                               for(Entry<String, String> es : normal.entrySet()) {
+                                                       psProps.print(es.getKey());
+                                                       psProps.print('=');
+                                                       psProps.println(es.getValue());
+                                               }
+                                               
+                                               for(Entry<String, String> es : creds.entrySet()) {
+                                                       psCredProps.print(es.getKey());
+                                                       psCredProps.print('=');
+                                                       psCredProps.println(es.getValue());
+                                               }
+                                               
                                                File newFile = new File(dir,rootFile+".props");
+                                               if(newFile.exists()) {
+                                                       File backup = new File(dir,rootFile+".props.backup");
+                                                       newFile.renameTo(backup);
+                                                       System.out.println("Backed up to " + backup.getCanonicalPath());
+                                               }
                                                fProps.renameTo(newFile);
                                                System.out.println("Created " + newFile.getCanonicalPath());
                                                fProps = newFile;
                                                
+                                               if(fSecureProps.exists()) {
+                                                       File backup = new File(dir,fSecureProps.getName()+".backup");
+                                                       fSecureProps.renameTo(backup);
+                                                       System.out.println("Backed up to " + backup.getCanonicalPath());
+                                               }
                                                fSecureTempProps.renameTo(fSecureProps);
                                                System.out.println("Created " + fSecureProps.getCanonicalPath());
                                                fProps = newFile;
@@ -937,7 +913,36 @@ public class Agent {
                        tt.done();
                }
        }
+
+       private static List<String> CRED_TAGS = Arrays.asList(new String[] {
+                       Config.CADI_KEYFILE,
+                       Config.AAF_APPID, Config.AAF_APPPASS,
+                       Config.CADI_KEYSTORE, Config.CADI_KEYSTORE_PASSWORD, Config.CADI_KEY_PASSWORD,
+                       Config.CADI_TRUSTSTORE,Config.CADI_TRUSTSTORE_PASSWORD,
+                       Config.CADI_ALIAS, Config.CADI_X509_ISSUERS
+                       });
+
+       private static List<String> LOC_TAGS = Arrays.asList(new String[] {Config.CADI_LATITUDE, Config.CADI_LONGITUDE});
        
+       private static void directedPut(final PropAccess orig, final Symm symm, final Map<String,String> main, final Map<String,String> secured, final String tag, final String value) throws IOException {
+               if(!LOC_TAGS.contains(tag)) { // Location already covered
+                       String val = value==null?orig.getProperty(tag):value;
+                       if(tag.endsWith("_password")) {
+                               if(val.length()>4) {
+                                       if(val.startsWith("enc:")) {
+                                               val = orig.decrypt(val, true);
+                                       }
+                                       val = "enc:" + symm.enpass(val);
+                               }
+                       }
+                       if(CRED_TAGS.contains(tag)) {
+                               secured.put(tag, val);
+                       } else {
+                               main.put(tag, val);
+                       }
+               }
+       }
+
        private static void validate(final PropAccess pa) throws LocatorException, CadiException, APIException {
                System.out.println("Validating Configuration...");
                final AAFCon<?> aafcon = new AAFConHttp(pa,Config.AAF_URL,new SecurityInfoC<HttpURLConnection>(pa));
@@ -1012,13 +1017,13 @@ public class Agent {
                                                        String prop;                                            
                                                        File f;
        
-                                                       if((prop=props.getProperty(Config.CADI_KEYFILE))==null ||
+                                                       if((prop=trans.getProperty(Config.CADI_KEYFILE))==null ||
                                                                !(f=new File(prop)).exists()) {
                                                                        trans.error().printf("Keyfile must exist to check Certificates for %s on %s",
                                                                                a.getMechid(), a.getMachine());
                                                        } else {
-                                                               String ksf = props.getProperty(Config.CADI_KEYSTORE);
-                                                               String ksps = props.getProperty(Config.CADI_KEYSTORE_PASSWORD);
+                                                               String ksf = trans.getProperty(Config.CADI_KEYSTORE);
+                                                               String ksps = trans.getProperty(Config.CADI_KEYSTORE_PASSWORD);
                                                                if(ksf==null || ksps == null) {
                                                                        trans.error().printf("Properties %s and %s must exist to check Certificates for %s on %s",
                                                                                        Config.CADI_KEYSTORE, Config.CADI_KEYSTORE_PASSWORD,a.getMechid(), a.getMachine());
index cb28260..c541391 100644 (file)
@@ -28,7 +28,6 @@ import java.security.cert.Certificate;
 import java.security.cert.X509Certificate;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -51,7 +50,7 @@ public class PlaceArtifactInKeystore extends ArtifactDir {
 
        @Override
        public boolean _place(Trans trans, CertInfo certInfo, Artifact arti) throws CadiException {
-               File fks = new File(dir,arti.getNs()+'.'+kst);
+               File fks = new File(dir,arti.getNs()+'.'+(kst==Agent.PKCS12?"p12":kst));
                try {
                        KeyStore jks = KeyStore.getInstance(kst);
                        if(fks.exists()) {
@@ -118,13 +117,14 @@ public class PlaceArtifactInKeystore extends ArtifactDir {
                        write(fks,Chmod.to400,jks,keystorePassArray);
                        
                        // Change out to TrustStore
-                       fks = new File(dir,arti.getNs()+".trust."+kst);
+                       // NOTE: PKCS12 does NOT support Trusted Entries.  Put in JKS Always
+                       fks = new File(dir,arti.getNs()+".trust.jks");
                        if(fks.exists()) {
                                File backup = File.createTempFile(fks.getName()+'.', ".backup",dir);
                                fks.renameTo(backup);
                        }       
 
-                       jks = KeyStore.getInstance(kst);
+                       jks = KeyStore.getInstance(Agent.JKS);
                        
                        // Set Truststore Password
                        addProperty(Config.CADI_TRUSTSTORE,fks.getAbsolutePath());
index b6aeafe..9230803 100644 (file)
@@ -37,11 +37,13 @@ public class PlaceArtifactOnStream implements PlaceArtifact {
 
        @Override
        public boolean place(Trans trans, CertInfo capi, Artifact a, String machine) {
+               String lineSeparator = System.lineSeparator();
+
                if(capi.getNotes()!=null && capi.getNotes().length()>0) {
-                       trans.info().printf("Warning:    %s\n",capi.getNotes());
+                       trans.info().printf("Warning:    %s" + lineSeparator, capi.getNotes());
                }
-               out.printf("Challenge:  %s\n",capi.getChallenge());
-               out.printf("PrivateKey:\n%s\n",capi.getPrivatekey());
+               out.printf("Challenge:  %s" + lineSeparator, capi.getChallenge());
+               out.printf("PrivateKey:" + lineSeparator + "%s" + lineSeparator, capi.getPrivatekey());
                out.println("Certificate Chain:");
                for(String c : capi.getCerts()) {
                        out.println(c);
index 89816a2..b3fe294 100644 (file)
@@ -41,34 +41,37 @@ public class OAuth2Lur implements Lur {
        @Override
        public Permission createPerm(String p) {
                String[] params = Split.split('|', p);
-               if(params.length==3) {
-                       return new AAFPermission(params[0],params[1],params[2]);
-               } else {
-                       return new LocalPermission(p);
+               switch(params.length) {
+                       case 3:
+                               return new AAFPermission(null,params[0],params[1],params[2]);
+                       case 4:
+                               return new AAFPermission(params[0],params[1],params[2],params[3]);
+                       default:
+                               return new LocalPermission(p);
                }
        }
 
        @Override
-       public boolean fish(Principal bait, Permission pond) {
-               AAFPermission apond = (AAFPermission)pond;
-               OAuth2Principal oap;
+       public boolean fish(Principal bait, Permission ... pond) {
+               boolean rv = false;
+               
                if(bait instanceof OAuth2Principal) {
-                       oap = (OAuth2Principal)bait; 
-               } else {
-                       // Here is the spot to put in Principal Conversions
-                       return false;
-               }
-
-               TokenPerm tp = oap.tokenPerm();
-               if(tp==null) {
-               } else {
-                       for(Permission p : tp.perms()) {
-                               if(p.match(apond)) {
-                                       return true;
+                       OAuth2Principal oap = (OAuth2Principal)bait; 
+                       for (Permission p : pond ) {
+                               AAFPermission apond = (AAFPermission)p;
+               
+                               TokenPerm tp = oap.tokenPerm();
+                               if(tp==null) {
+                               } else {
+                                       for(Permission perm : tp.perms()) {
+                                               if(perm.match(apond)) {
+                                                       return true;
+                                               }
+                                       }
                                }
                        }
                }
-               return false;
+               return rv;
        }
 
        @Override
@@ -87,7 +90,7 @@ public class OAuth2Lur implements Lur {
        }
 
        @Override
-       public boolean handlesExclusively(Permission pond) {
+       public boolean handlesExclusively(Permission ... pond) {
                return false;
        }
 
index 2ebd7dc..e0d6bf0 100644 (file)
@@ -443,6 +443,11 @@ public class TokenClient {
                                                throw new APIException("Error Decrypting Password",e);
                                        }
                                }
+                               
+                               if(username!=null) {
+                                       params.add("username="+username);
+                               }
+
                                break;
                        case refresh_token:
                                if(client_id!=null) {
index 28bf659..e235b68 100644 (file)
@@ -38,6 +38,7 @@ import org.onap.aaf.cadi.Hash;
 import org.onap.aaf.cadi.Locator;
 import org.onap.aaf.cadi.LocatorException;
 import org.onap.aaf.cadi.Symm;
+import org.onap.aaf.cadi.aaf.Defaults;
 import org.onap.aaf.cadi.aaf.v2_0.AAFConHttp;
 import org.onap.aaf.cadi.aaf.v2_0.AAFLocator;
 import org.onap.aaf.cadi.config.Config;
@@ -63,10 +64,10 @@ public class TokenClientFactory extends Persist<Token,TimedToken> {
                super(pa, new RosettaEnv(pa.getProperties()),Token.class,"outgoing");
                
                if(access.getProperty(Config.AAF_OAUTH2_TOKEN_URL,null)==null) {
-                       access.getProperties().put(Config.AAF_OAUTH2_TOKEN_URL, "https://AAF_LOCATE_URL/AAF_NS.token:2.0"); // Default to AAF
+                       access.getProperties().put(Config.AAF_OAUTH2_TOKEN_URL, Defaults.OAUTH2_TOKEN_URL); // Default to AAF
                }
                if(access.getProperty(Config.AAF_OAUTH2_INTROSPECT_URL,null)==null) {
-                       access.getProperties().put(Config.AAF_OAUTH2_INTROSPECT_URL, "https://AAF_LOCATE_URL/AAF_NS.introspect:2.0"); // Default to AAF);
+                       access.getProperties().put(Config.AAF_OAUTH2_INTROSPECT_URL, Defaults.OAUTH2_INTROSPECT_URL); // Default to AAF);
                }
 
                symm = Symm.encrypt.obtain();
index 5c77fda..bb33bc7 100644 (file)
@@ -141,13 +141,16 @@ public class TokenPerm extends Persisting<Introspect>{
        
        // Gathering object for parsing objects, then creating AAF Permission
        private static class PermInfo {
-               public String type,instance,action;
+               public String ns,type,instance,action;
                public void clear() {
-                       type=instance=action=null;
+                       ns=type=instance=action=null;
                }
                public void eval(Parsed<State> pd) {
                        if(pd.hasName()) {
                                switch(pd.name) {
+                                       case "ns":
+                                               ns=pd.sb.toString();
+                                               break;
                                        case "type":
                                                type=pd.sb.toString();
                                                break;
@@ -162,7 +165,7 @@ public class TokenPerm extends Persisting<Introspect>{
                }
                public AAFPermission create() {
                        if(type!=null && instance!=null && action !=null) {
-                               return new AAFPermission(type, instance, action);
+                               return new AAFPermission(ns,type, instance, action);
                        } else {
                                return null;
                        }
index 74d88fc..95dd9a3 100644 (file)
 package org.onap.aaf.cadi.olur;
 
 import java.security.Principal;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
+import org.onap.aaf.cadi.Access.Level;
 import org.onap.aaf.cadi.CadiException;
 import org.onap.aaf.cadi.LocatorException;
 import org.onap.aaf.cadi.Lur;
 import org.onap.aaf.cadi.Permission;
 import org.onap.aaf.cadi.PropAccess;
-import org.onap.aaf.cadi.Access.Level;
 import org.onap.aaf.cadi.aaf.AAFPermission;
 import org.onap.aaf.cadi.client.Result;
+import org.onap.aaf.cadi.lur.LocalPermission;
 import org.onap.aaf.cadi.oauth.AbsOTafLur;
 import org.onap.aaf.cadi.oauth.OAuth2Principal;
 import org.onap.aaf.cadi.oauth.TimedToken;
@@ -39,8 +42,8 @@ import org.onap.aaf.cadi.oauth.TokenClient;
 import org.onap.aaf.cadi.oauth.TokenPerm;
 import org.onap.aaf.cadi.principal.Kind;
 import org.onap.aaf.misc.env.APIException;
-import org.onap.aaf.misc.env.util.Split;
 import org.onap.aaf.misc.env.util.Pool.Pooled;
+import org.onap.aaf.misc.env.util.Split;
 
 public class OLur extends AbsOTafLur implements Lur {
        public OLur(PropAccess access, final String token_url, final String introspect_url) throws APIException, CadiException {
@@ -51,7 +54,7 @@ public class OLur extends AbsOTafLur implements Lur {
         * @see org.onap.aaf.cadi.Lur#fish(java.security.Principal, org.onap.aaf.cadi.Permission)
         */
        @Override
-       public boolean fish(Principal bait, Permission pond) {
+       public boolean fish(Principal bait, Permission ... pond) {
                TokenPerm tp;
                if(bait instanceof OAuth2Principal) {
                        OAuth2Principal oa2p = (OAuth2Principal)bait;
@@ -66,7 +69,17 @@ public class OLur extends AbsOTafLur implements Lur {
                                try {
                                        TokenClient tc = tcp.content;
                                        tc.username(bait.getName());
-                                       Result<TimedToken> rtt = tc.getToken(Kind.getKind(bait),tc.defaultScope());
+                                       Set<String> scopeSet = new HashSet<>();
+                                       scopeSet.add(tc.defaultScope());
+                                       AAFPermission ap;
+                                       for (Permission p : pond) {
+                                               ap = (AAFPermission)p;
+                                               scopeSet.add(ap.getNS());
+                                       }
+                                       String[] scopes = new String[scopeSet.size()];
+                                       scopeSet.toArray(scopes);
+                                       
+                                       Result<TimedToken> rtt = tc.getToken(Kind.getKind(bait),scopes);
                                        if(rtt.isOK()) {
                                                Result<TokenPerm> rtp = tkMgr.get(rtt.value.getAccessToken(), bait.getName().getBytes());
                                                if(rtp.isOK()) {
@@ -77,9 +90,11 @@ public class OLur extends AbsOTafLur implements Lur {
                                        tcp.done();
                                }
                        } catch (APIException | LocatorException | CadiException e) {
-                               access.log(Level.ERROR, "Unable to Get a Token: " + e.getMessage());
+                               access.log(e, "Unable to Get a Token");
                        }
                }
+               
+               boolean rv = false;
                if(tp!=null) {
                        if(tkMgr.access.willLog(Level.DEBUG)) {
                                StringBuilder sb = new StringBuilder("AAF Permissions for user ");
@@ -87,8 +102,10 @@ public class OLur extends AbsOTafLur implements Lur {
                                sb.append(", from token ");                     
                                sb.append(tp.get().getAccessToken());
                                for (AAFPermission p : tp.perms()) {
-                                       sb.append("\n\t");
-                                       sb.append(p.getName());
+                                       sb.append("\n\t[");
+                                       sb.append(p.getNS());
+                                       sb.append(']');                                 
+                                       sb.append(p.getType());
                                        sb.append('|');
                                        sb.append(p.getInstance());
                                        sb.append('|');
@@ -97,13 +114,18 @@ public class OLur extends AbsOTafLur implements Lur {
                                sb.append('\n');
                                access.log(Level.DEBUG, sb);
                        }
-                       for (AAFPermission p : tp.perms()) {
-                               if (p.match(pond)) {
-                                       return true;
+                       for (Permission p : pond) {
+                               if(rv) {
+                                       break;
+                               }
+                               for (AAFPermission perm : tp.perms()) {
+                                       if (rv=perm.match(p)) {
+                                               break;
+                                       }
                                }
                        }
                }
-               return false;
+               return rv;
        }
 
        /* (non-Javadoc)
@@ -122,7 +144,7 @@ public class OLur extends AbsOTafLur implements Lur {
         * @see org.onap.aaf.cadi.Lur#handlesExclusively(org.onap.aaf.cadi.Permission)
         */
        @Override
-       public boolean handlesExclusively(Permission pond) {
+       public boolean handlesExclusively(Permission ... pond) {
                return false;
        }
 
@@ -140,10 +162,13 @@ public class OLur extends AbsOTafLur implements Lur {
        @Override
        public Permission createPerm(final String p) {
                String[] s = Split.split('|',p);
-               if(s!=null && s.length==3) {
-                       return new AAFPermission(s[0],s[1],s[2]);
-               } else {
-                       return null;
+               switch(s.length) {
+                       case 3:
+                               return new AAFPermission(null, s[0],s[1],s[2]);
+                       case 4:
+                               return new AAFPermission(s[0],s[1],s[2],s[3]);
+                       default:
+                               return new LocalPermission(p);
                }
        }
 
index bed201a..b21f897 100644 (file)
@@ -87,7 +87,7 @@ public class RemoteRegistrant<ENV extends BasicEnv> implements Registrant<ENV> {
                mep.setPort(port);
 
                try {
-                       String hostnameToRegister = access.getProperty(Config.CADI_REGISTRATION_HOSTNAME, null);
+                       String hostnameToRegister = access.getProperty(Config.AAF_REGISTER_AS, null);
                        if(hostnameToRegister==null) {
                                hostnameToRegister = access.getProperty(Config.HOSTNAME, null);
                        }
index 28103b5..4193197 100644 (file)
@@ -38,6 +38,7 @@ import org.onap.aaf.cadi.Access.Level;
 import org.onap.aaf.cadi.CadiException;
 import org.onap.aaf.cadi.PropAccess;
 import org.onap.aaf.cadi.Symm;
+import org.onap.aaf.cadi.aaf.Defaults;
 import org.onap.aaf.cadi.config.Config;
 import org.onap.aaf.cadi.util.MyConsole;
 import org.onap.aaf.cadi.util.SubStandardConsole;
@@ -311,9 +312,8 @@ public class AAFSSO {
                                addProp(Config.AAF_LOCATE_URL, locateUrl);
                        }
                        
-                       String aafUrl = "https://AAF_LOCATE_URL/AAF_NS.service:2.0";
-                       access.setProperty(Config.AAF_URL, aafUrl);
-                       access.setProperty(Config.CM_URL, "https://AAF_LOCATE_URL/AAF_NS.cm:2.0");
+                       access.setProperty(Config.AAF_URL, Defaults.AAF_URL);
+                       access.setProperty(Config.CM_URL, Defaults.CM_URL);
                        String cadiLatitude = access.getProperty(Config.CADI_LATITUDE);
                        if(cadiLatitude==null) {
                                System.out.println("# If you do not know your Global Coordinates, we suggest bing.com/maps");
index 4836e4e..939e9b1 100644 (file)
@@ -33,11 +33,11 @@ import org.onap.aaf.cadi.Permission;
 import org.onap.aaf.cadi.aaf.AAFPermission;
 
 public class JU_AAFPermission {
-
+       private final static String ns = "ns";
        private final static String type = "type";
        private final static String instance = "instance";
        private final static String action = "action";
-       private final static String key = type + '|' + instance + '|' + action;
+       private final static String key = ns + '|' + type + '|' + instance + '|' + action;
        private final static String role = "role";
 
        private static List<String> roles;
@@ -50,14 +50,17 @@ public class JU_AAFPermission {
 
        @Test
        public void constructor1Test() {
-               AAFPermission perm = new AAFPermission(type, instance, action);
-               assertThat(perm.getName(), is(type));
+               AAFPermission perm = new AAFPermission(ns, type, instance, action);
+               assertThat(perm.getNS(), is(ns));
+               assertThat(perm.getType(), is(type));
                assertThat(perm.getInstance(), is(instance));
                assertThat(perm.getAction(), is(action));
                assertThat(perm.getKey(), is(key));
                assertThat(perm.permType(), is("AAF"));
                assertThat(perm.roles().size(), is(0));
-               assertThat(perm.toString(), is("AAFPermission:\n\tType: " + type +
+               assertThat(perm.toString(), is("AAFPermission:" +
+                                                                               "\n\tNS: " + ns +
+                                                                               "\n\tType: " + type +
                                                                                "\n\tInstance: " + instance +
                                                                                "\n\tAction: " + action +
                                                                                "\n\tKey: " + key));
@@ -67,39 +70,45 @@ public class JU_AAFPermission {
        public void constructor2Test() {
                AAFPermission perm;
 
-               perm = new AAFPermission(type, instance, action, null);
-               assertThat(perm.getName(), is(type));
+               perm = new AAFPermission(ns, type, instance, action, null);
+               assertThat(perm.getNS(), is(ns));
+               assertThat(perm.getType(), is(type));
                assertThat(perm.getInstance(), is(instance));
                assertThat(perm.getAction(), is(action));
                assertThat(perm.getKey(), is(key));
                assertThat(perm.permType(), is("AAF"));
                assertThat(perm.roles().size(), is(0));
-               assertThat(perm.toString(), is("AAFPermission:\n\tType: " + type +
+               assertThat(perm.toString(), is("AAFPermission:" +
+                                                                               "\n\tNS: " + ns +
+                                                                               "\n\tType: " + type +
                                                                                "\n\tInstance: " + instance +
                                                                                "\n\tAction: " + action +
                                                                                "\n\tKey: " + key));
 
-               perm = new AAFPermission(type, instance, action, roles);
-               assertThat(perm.getName(), is(type));
+               perm = new AAFPermission(ns, type, instance, action, roles);
+               assertThat(perm.getNS(), is(ns));
+               assertThat(perm.getType(), is(type));
                assertThat(perm.getInstance(), is(instance));
                assertThat(perm.getAction(), is(action));
                assertThat(perm.getKey(), is(key));
                assertThat(perm.permType(), is("AAF"));
                assertThat(perm.roles().size(), is(1));
                assertThat(perm.roles().get(0), is(role));
-               assertThat(perm.toString(), is("AAFPermission:\n\tType: " + type +
-                                                                               "\n\tInstance: " + instance +
-                                                                               "\n\tAction: " + action +
-                                                                               "\n\tKey: " + key));
+               assertThat(perm.toString(), is("AAFPermission:" +
+                               "\n\tNS: " + ns +
+                               "\n\tType: " + type +
+                               "\n\tInstance: " + instance +
+                               "\n\tAction: " + action +
+                               "\n\tKey: " + key));
        }
 
        @Test
        public void matchTest() {
-               final AAFPermission controlPermission = new AAFPermission(type, instance, action);
+               final AAFPermission controlPermission = new AAFPermission(ns,type, instance, action);
                PermissionStub perm;
                AAFPermission aafperm;
 
-               aafperm = new AAFPermission(type, instance, action);
+               aafperm = new AAFPermission(ns, type, instance, action);
                assertThat(controlPermission.match(aafperm), is(true));
 
                perm = new PermissionStub(key);
@@ -117,7 +126,8 @@ public class JU_AAFPermission {
        @Test
        public void coverageTest() {
                AAFPermissionStub aafps = new AAFPermissionStub();
-               assertThat(aafps.getName(), is(nullValue()));
+               assertThat(aafps.getNS(), is(nullValue()));
+               assertThat(aafps.getType(), is(nullValue()));
                assertThat(aafps.getInstance(), is(nullValue()));
                assertThat(aafps.getAction(), is(nullValue()));
                assertThat(aafps.getKey(), is(nullValue()));
index ecadb6e..d50b87a 100644 (file)
@@ -42,6 +42,7 @@ import org.junit.Test;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.onap.aaf.cadi.CadiException;
+import org.onap.aaf.cadi.configure.Agent;
 import org.onap.aaf.cadi.configure.ArtifactDir;
 import org.onap.aaf.cadi.util.Chmod;
 import org.onap.aaf.misc.env.Trans;
@@ -112,7 +113,7 @@ public class JU_ArtifactDir {
                } catch(NullPointerException e) {
                }
                
-               KeyStore ks = KeyStore.getInstance("pkcs12");
+               KeyStore ks = KeyStore.getInstance(Agent.PKCS12);
                try {
                        ArtifactDir.write(writableFile, Chmod.to755, ks, luggagePassword.toCharArray());
                        fail("Should've thrown an exception");
index 0b086f1..d61ac49 100644 (file)
 
 package org.onap.aaf.cadi.cm.test;
 
-import static org.junit.Assert.*;
-import static org.hamcrest.CoreMatchers.*;
-import static org.mockito.Mockito.*;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.fail;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 import java.io.BufferedReader;
 import java.io.ByteArrayOutputStream;
@@ -31,14 +33,17 @@ import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.FileReader;
 import java.io.IOException;
+import java.security.cert.CertificateException;
 import java.util.ArrayList;
 import java.util.List;
 
-import java.security.cert.CertificateException;
-
-import org.junit.*;
-import org.mockito.*;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
 import org.onap.aaf.cadi.CadiException;
+import org.onap.aaf.cadi.configure.Agent;
 import org.onap.aaf.cadi.configure.PlaceArtifactInKeystore;
 import org.onap.aaf.misc.env.Env;
 import org.onap.aaf.misc.env.TimeTaken;
@@ -97,12 +102,12 @@ public class JU_PlaceArtifactInKeystore {
        @Test
        public void test() throws CadiException {
                // Note: PKCS12 can't be tested in JDK 7 and earlier.  Can't handle Trusting Certificates.
-               PlaceArtifactInKeystore placer = new PlaceArtifactInKeystore("jks");
+               PlaceArtifactInKeystore placer = new PlaceArtifactInKeystore(Agent.JKS);
 
                certs.add(x509String);
                certs.add(x509Chain);
                assertThat(placer.place(transMock, certInfoMock, artiMock, "machine"), is(true));
-               for (String ext : new String[] {"chal", "keyfile", "jks", "trust.jks", "cred.props"}) {
+               for (String ext : new String[] {"chal", "keyfile", Agent.JKS, "trust.jks", "cred.props"}) {
                        File f = new File(dirName + '/' + nsName + '.' + ext);
                        assertThat(f.exists(), is(true));
                }
index 6bbed0e..356c12d 100644 (file)
@@ -98,28 +98,28 @@ public class JU_TokenPerm {
                String json;
                LoadPermissions lp;
                Permission p;
-
+               
                json = "{\"perm\":[" +
-                       "  {\"type\":\"com.access\",\"instance\":\"*\",\"action\":\"read,approve\"}," +
+                       "  {\"ns\":\"com\",\"type\":\"access\",\"instance\":\"*\",\"action\":\"read,approve\"}," +
                        "]}";
 
                lp = new LoadPermissions(new StringReader(json));
                assertThat(lp.perms.size(), is(1));
 
                p = lp.perms.get(0);
-               assertThat(p.getKey(), is("com.access|*|read,approve"));
+               assertThat(p.getKey(), is("com|access|*|read,approve"));
                assertThat(p.permType(), is("AAF"));
 
                // Extra closing braces for coverage
                json = "{\"perm\":[" +
-                       "  {\"type\":\"com.access\",\"instance\":\"*\",\"action\":\"read,approve\"}}," +
+                       "  {\"ns\":\"com\",\"type\":\"access\",\"instance\":\"*\",\"action\":\"read,approve\"}}," +
                        "]]}";
 
                lp = new LoadPermissions(new StringReader(json));
                assertThat(lp.perms.size(), is(1));
 
                p = lp.perms.get(0);
-               assertThat(p.getKey(), is("com.access|*|read,approve"));
+               assertThat(p.getKey(), is("com|access|*|read,approve"));
                assertThat(p.permType(), is("AAF"));
 
                // Test without a type
index 45a7d34..6c3c611 100644 (file)
@@ -147,7 +147,7 @@ public class Sample {
                                String permS = myAccess.getProperty("perm","org.osaaf.aaf.access|*|read");
                                String[] permA = Split.splitTrim('|', permS);
                                if(permA.length>2) {
-                                       final Permission perm = new AAFPermission(permA[0],permA[1],permA[2]);
+                                       final Permission perm = new AAFPermission(null, permA[0],permA[1],permA[2]);
                                        // See the CODE for Java Methods used
                                        if(singleton().oneAuthorization(fqi, perm)) {
                                                System.out.printf("Success: %s has %s\n",fqi.getName(),permS);
index d14e747..024deff 100644 (file)
@@ -81,6 +81,7 @@ public class JU_PropertyLocator {
                assertThat(pl.hasItems(), is(false));
                assertThat(countItems(pl), is(0));
 
+               Thread.sleep(20L); // PL checks same milli...
                pl.refresh();
 
                assertThat(pl.hasItems(), is(true));
index 1d01a3e..3963189 100644 (file)
@@ -246,7 +246,7 @@ public abstract class AbsUserCache<PERM extends Permission> {
        /**
         * The default behavior of a LUR is to not handle something exclusively.
         */
-       public boolean handlesExclusively(Permission pond) {
+       public boolean handlesExclusively(Permission ... pond) {
                return false;
        }
        
index fd73d00..0beb485 100644 (file)
@@ -52,7 +52,7 @@ public interface Lur {
         * @param principalName
         * @return
         */
-       public boolean fish(Principal bait, Permission pond);
+       public boolean fish(Principal bait, Permission ... pond);
 
        /** 
         * Fish all the Principals out a Pond
@@ -77,7 +77,7 @@ public interface Lur {
         * @param pond
         * @return
         */
-       public boolean handlesExclusively(Permission pond);  
+       public boolean handlesExclusively(Permission ... pond);  
        
        /**
         *  Does the LUR support a particular kind of Principal
index 4067f16..afc1d97 100644 (file)
@@ -483,7 +483,8 @@ public class Symm {
                   switch(read) {
                           case -1: 
                           case '=':
-                          case '\n': 
+                                case '\n':
+                                case '\r':
                                   return -1;
                   }
                   for(int i=0;i<codec.length;++i) {
@@ -662,6 +663,9 @@ public class Symm {
    * @throws IOException
    */
   public void enpass(final String password, final OutputStream os) throws IOException {
+           if(password==null) {
+               throw new IOException("Invalid password passed");
+           }
                final ByteArrayOutputStream baos = new ByteArrayOutputStream();
                DataOutputStream dos = new DataOutputStream(baos);
                byte[] bytes = password.getBytes();
index b4e31f2..efe5503 100644 (file)
@@ -74,14 +74,12 @@ public class Config {
        private static final String OAUTH_TOKEN_MGR = OAUTH+".TokenMgr";
        private static final String OAUTH_HTTP_TAF = OAUTH+".OAuth2HttpTaf";
        private static final String OAUTH_DIRECT_TAF = OAUTH+".OAuthDirectTAF";
-
        public static final String UTF_8 = "UTF-8";
 
        // Property Names associated with configurations.
        // As of 1.0.2, these have had the dots removed so as to be compatible with JavaBean style
        // configurations as well as property list style.
        public static final String HOSTNAME = "hostname";
-       public static final String CADI_REGISTRATION_HOSTNAME = "cadi_registration_hostname";
        public static final String CADI_PROP_FILES = "cadi_prop_files"; // Additional Properties files (separate with ;)
        public static final String CADI_LOGLEVEL = "cadi_loglevel";
        public static final String CADI_LOGDIR = "cadi_log_dir";
@@ -136,12 +134,22 @@ public class Config {
        public static final String OAUTH_CLIENT_SECRET="client_secret";
        
        public static final String AAF_ENV = "aaf_env";
-       public static final String AAF_URL = "aaf_url"; //URL for AAF... Use to trigger AAF configuration
        public static final String AAF_ROOT_NS = "aaf_root_ns";
        public static final String AAF_ROOT_NS_DEF = "org.osaaf.aaf";
        public static final String AAF_ROOT_COMPANY = "aaf_root_company";
        public static final String AAF_LOCATE_URL = "aaf_locate_url"; //URL for AAF locator
        private static final String AAF_LOCATE_URL_TAG = "AAF_LOCATE_URL"; // Name of Above for use in Config Variables.
+       public static final String AAF_DEFAULT_VERSION = "2.1";
+       public static final String AAF_URL = "aaf_url"; //URL for AAF... Use to trigger AAF configuration
+       public static final String AAF_URL_DEF = "https://AAF_LOCATE_URL/AAF_NS.service:" + AAF_DEFAULT_VERSION;
+       public static final String GUI_URL_DEF = "https://AAF_LOCATE_URL/AAF_NS.gui:" + AAF_DEFAULT_VERSION;
+       public static final String CM_URL_DEF = "https://AAF_LOCATE_URL/AAF_NS.cm:" + AAF_DEFAULT_VERSION;
+       public static final String FS_URL_DEF = "https://AAF_LOCATE_URL/AAF_NS.fs:" + AAF_DEFAULT_VERSION;
+       public static final String HELLO_URL_DEF = "https://AAF_LOCATE_URL/AAF_NS.hello:" + AAF_DEFAULT_VERSION;
+       public static final String OAUTH2_TOKEN_URL = "https://AAF_LOCATE_URL/AAF_NS.token:" + AAF_DEFAULT_VERSION;
+       public static final String OAUTH2_INTROSPECT_URL = "https://AAF_LOCATE_URL/AAF_NS.introspect:" + AAF_DEFAULT_VERSION;
+
+       public static final String AAF_REGISTER_AS = "aaf_register_as";
        public static final String AAF_APPID = "aaf_id";
        public static final String AAF_APPPASS = "aaf_password";
        public static final String AAF_LUR_CLASS = "aaf_lur_class";
@@ -175,7 +183,6 @@ public class Config {
        public static final String AAF_COMPONENT = "aaf_component";
        public static final String AAF_CERT_IDS = "aaf_cert_ids";
        public static final String AAF_DEBUG_IDS = "aaf_debug_ids"; // comma delimited
-       public static final String AAF_DEFAULT_VERSION = "2.0";
        public static final String AAF_DATA_DIR = "aaf_data_dir"; // AAF processes and Components only.
 
 
index 2813dca..b442c7d 100644 (file)
@@ -60,7 +60,7 @@ public final class EpiLur implements Lur {
                if(lurs.length==0) throw new CadiException("Need at least one Lur implementation in constructor");
        }
 
-       public boolean fish(Principal bait, Permission pond) {
+       public boolean fish(Principal bait, Permission ... pond) {
                if(pond==null) {
                        return false;
                }
@@ -99,7 +99,7 @@ public final class EpiLur implements Lur {
        }
 
        // Never needed... Only EpiLur uses...
-       public boolean handlesExclusively(Permission pond) {
+       public boolean handlesExclusively(Permission ... pond) {
                return false;
        }
        
index 0f9adb9..e177a22 100644 (file)
@@ -94,14 +94,16 @@ public final class LocalLur extends AbsUserCache<LocalPermission> implements Lur
        }
 
        //      @Override
-       public boolean fish(Principal bait, Permission pond) {
+       public boolean fish(Principal bait, Permission ... pond) {
                if (pond == null) {
                        return false;
                }
-               if (handles(bait) && pond instanceof LocalPermission) { // local Users only have LocalPermissions
-                       User<LocalPermission> user = getUser(bait);
-                       if (user != null) {
-                               return user.contains((LocalPermission)pond);
+               for(Permission p : pond) {
+                       if (handles(bait) && p instanceof LocalPermission) { // local Users only have LocalPermissions
+                               User<LocalPermission> user = getUser(bait);
+                               if (user != null) {
+                                       return user.contains((LocalPermission)p);
+                               }
                        }
                }
                return false;
@@ -128,8 +130,15 @@ public final class LocalLur extends AbsUserCache<LocalPermission> implements Lur
                return principal.getName().endsWith(supportedRealm);
        }
 
-       public boolean handlesExclusively(Permission pond) {
-               return supportingGroups.contains(pond.getKey());
+       @Override
+       public boolean handlesExclusively(Permission ... pond) {
+               boolean rv = false;
+               for (Permission p : pond) {
+                       if(rv=supportingGroups.contains(p.getKey())) {
+                               break;
+                       }
+               }
+               return rv;
        }
 
        /* (non-Javadoc)
index 1e44726..b314f20 100644 (file)
@@ -44,7 +44,7 @@ public class NullLur implements Lur {
                        return false;
                }};
 
-       public boolean fish(Principal bait, Permission pond) {
+       public boolean fish(Principal bait, Permission ... pond) {
                // Well, for Jenkins, this is ok... It finds out it can't do J2EE Security, and then looks at it's own
 //             System.err.println("CADI's LUR has not been configured, but is still being called.  Access is being denied");
                return false;
@@ -56,7 +56,7 @@ public class NullLur implements Lur {
        public void destroy() {
        }
 
-       public boolean handlesExclusively(Permission pond) {
+       public boolean handlesExclusively(Permission ... pond) {
                return false;
        }
 
index f7c3a0a..b99030e 100644 (file)
@@ -117,10 +117,10 @@ public class JU_EpiLur {
        private class CredValStub implements Lur, CredVal {
                @Override public boolean validate(String user, Type type, byte[] cred, Object state) { return false; }
                @Override public Permission createPerm(String p) { return null; }
-               @Override public boolean fish(Principal bait, Permission pond) { return false; }
+               @Override public boolean fish(Principal bait, Permission ... pond) { return false; }
                @Override public void fishAll(Principal bait, List<Permission> permissions) { }
                @Override public void destroy() { }
-               @Override public boolean handlesExclusively(Permission pond) { return false; }
+               @Override public boolean handlesExclusively(Permission ... pond) { return false; }
                @Override public boolean handles(Principal principal) { return false; }
                @Override public void clear(Principal p, StringBuilder report) { }
        }
index 1737710..b34e90a 100644 (file)
@@ -350,7 +350,7 @@ public class JU_AbsUserCache {
        class AbsUserCacheCLStub<PERM extends Permission> extends AbsUserCache<PERM> implements CachingLur<PERM> {
                public AbsUserCacheCLStub(AbsUserCache<PERM> cache) { super(cache); }
                @Override public Permission createPerm(String p) { return null; }
-               @Override public boolean fish(Principal bait, Permission pond) { return false; }
+               @Override public boolean fish(Principal bait, Permission ... pond) { return false; }
                @Override public void fishAll(Principal bait, List<Permission> permissions) { }
                @Override public boolean handles(Principal principal) { return false; }
                @Override public Resp reload(User<PERM> user) { return null; }
index d9a4437..850dd22 100644 (file)
@@ -122,10 +122,10 @@ public class JU_CadiWrap {
                // Anonymous object for testing purposes
                CachingLur<Permission> lur1 = new CachingLur<Permission>() {
                        @Override public Permission createPerm(String p) { return null; }
-                       @Override public boolean fish(Principal bait, Permission pond) { return true; }
+                       @Override public boolean fish(Principal bait, Permission ... pond) { return true; }
                        @Override public void fishAll(Principal bait, List<Permission> permissions) { }
                        @Override public void destroy() { }
-                       @Override public boolean handlesExclusively(Permission pond) { return false; }
+                       @Override public boolean handlesExclusively(Permission ... pond) { return false; }
                        @Override public boolean handles(Principal principal) { return false; }
                        @Override public void remove(String user) { }
                        @Override public Resp reload(User<Permission> user) { return null; }
index 835e699..ae9c93e 100644 (file)
@@ -31,6 +31,7 @@ import org.onap.aaf.cadi.Access.Level;
 import org.onap.aaf.cadi.CadiException;
 import org.onap.aaf.cadi.LocatorException;
 import org.onap.aaf.cadi.PropAccess;
+import org.onap.aaf.cadi.aaf.Defaults;
 import org.onap.aaf.cadi.client.Future;
 import org.onap.aaf.cadi.client.Rcli;
 import org.onap.aaf.cadi.client.Result;
@@ -72,13 +73,10 @@ public class OAuthExample {
                
                
                // Obtain Endpoints for OAuth2 from Properties.  Expected is "cadi.properties" file, pointed to by "cadi_prop_files"
-               String tokenServiceURL = access.getProperty(Config.AAF_OAUTH2_TOKEN_URL,
-                               "https://AAF_LOCATE_URL/AAF_NS.token:2.0"); // Default to AAF
-               String tokenIntrospectURL = access.getProperty(Config.AAF_OAUTH2_INTROSPECT_URL,
-                               "https://AAF_LOCATE_URL/AAF_NS.introspect:2.0"); // Default to AAF);
+               String tokenServiceURL = access.getProperty(Config.AAF_OAUTH2_TOKEN_URL,Defaults.OAUTH2_TOKEN_URL); // Default to AAF
+               String tokenIntrospectURL = access.getProperty(Config.AAF_OAUTH2_INTROSPECT_URL,Defaults.OAUTH2_INTROSPECT_URL); // Default to AAF);
                // Get Hello Service
-               final String endServicesURL = access.getProperty(Config.AAF_OAUTH2_HELLO_URL, 
-                               "https://AAF_LOCATE_URL/AAF_NS.hello:2.0");
+               final String endServicesURL = access.getProperty(Config.AAF_OAUTH2_HELLO_URL,Defaults.HELLO_URL);
 
                final int CALL_TIMEOUT = Integer.parseInt(access.getProperty(Config.AAF_CALL_TIMEOUT,Config.AAF_CALL_TIMEOUT_DEF));
                
index 4b29518..c82a7c5 100644 (file)
@@ -31,6 +31,7 @@ import org.onap.aaf.cadi.Access.Level;
 import org.onap.aaf.cadi.CadiException;
 import org.onap.aaf.cadi.LocatorException;
 import org.onap.aaf.cadi.PropAccess;
+import org.onap.aaf.cadi.aaf.Defaults;
 import org.onap.aaf.cadi.client.Future;
 import org.onap.aaf.cadi.client.Rcli;
 import org.onap.aaf.cadi.client.Result;
@@ -103,8 +104,7 @@ public class OnapClientExample {
                                // Use this Token in your client calls with "Tokenized Client" (TzClient)
                                // These should NOT be used cross thread.
                                // Get Hello Service URL... roll your own in your own world.
-                               final String endServicesURL = access.getProperty(Config.AAF_OAUTH2_HELLO_URL, 
-                                               "https://AAF_LOCATE_URL/AAF_NS.hello:2.0");
+                               final String endServicesURL = access.getProperty(Config.AAF_OAUTH2_HELLO_URL,Defaults.HELLO_URL);
 
 
                                TzClient helloClient = tcf.newTzClient(endServicesURL);
diff --git a/docs/sections/installation/client_vol.rst b/docs/sections/installation/client_vol.rst
new file mode 100644 (file)
index 0000000..ea98e5f
--- /dev/null
@@ -0,0 +1,70 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International License.
+.. http://creativecommons.org/licenses/by/4.0
+.. Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+
+========================================
+Setting up Certs and CADI Configurations
+========================================
+
+*Note: this document assumes UNIX Bash Shell.  Being Java, AAF works in Windows, but you will have to create your own script/instruction conversions.*
+
+------------------
+Strategy
+------------------
+
+ONAP is deployed in Docker Containers or Kubernetes managed Docker Containers.  Therefore, this instruction utilizes a Docker Container as a standalone Utility... (This means that this container will stop as soon as it is done with its work... it is not a long running daemon)
+
+Given that all ONAP entities are also in Docker Containers, they all can access Persistent Volumes.
+
+This tool creates all the Configurations, including Certificates, onto a declared Volume on the directories starting with "/opt/app/osaaf"
+
+------------------
+Prerequisites
+------------------
+  * Docker
+    * Note: it does NOT have to be the SAME Docker that AAF is deployed on...
+    | but it DOES have be accessible to the AAF Instance.  
+  * For ONAP, this means
+    
+       * Windriver VPN
+       * include "10.12.6.214 aaf-onap-test.osaaf.org" in your /etc/hosts or DNS
+
+-----------------------
+Obtain the Agent Script
+-----------------------
+Choose the directory you wish to start in... 
+
+If you don't want to clone all of AAF, just get the "agent.sh" from a Browser:
+
+  https://gerrit.onap.org/r/gitweb?p=aaf/authz.git;a=blob_plain;f=auth/docker/agent.sh;hb=HEAD
+
+  Note: curl/wget get html, instead of text
+  | You might have to mv, and rename it to "agent.sh", but avoids full clone
+
+-------------------------
+Run Script
+-------------------------
+
+In your chosen directory ::
+  $ bash agent.sh
+
+The Agent will look for "aaf.props", and if it doesn't exist, or is missing information, it will ask for it
+
+
+--------------- ---------------
+Tag             Value
+--------------- ---------------
+CADI Version    Defaults to CADI version of this
+AAF's FQDN      PUBLIC Name for AAF. For ONAP Test, it is 'aaf-onap-test.osaaf.org'
+Deployer's FQI  deployer@people.osaaf.org.  In a REAL system, this would be a person or process 
+App's Root FQDN This will show up in the Cert Subject, and should be the name given by Docker. i.e. clamp.onap
+App's FQI       Fully Qualified ID given by Organization and with AAF NS/domain.  ex: clamp@clamp.onap.org 
+App's Volume    Volume to put the data, see above. ex: clamp_aaf
+DRIVER         Docker Volume type... See Docker Volume documentation
+LATITUDE       Global latitude coordinate of Node (best guess for Kubernetes)
+LONGITUDE      Global longitude coordinate of Node (best guess for Kubernetes)
+--------------- ---------------
+
+
+
diff --git a/docs/sections/installation/install_from_source.rst b/docs/sections/installation/install_from_source.rst
new file mode 100644 (file)
index 0000000..761069c
--- /dev/null
@@ -0,0 +1,219 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International License.
+.. http://creativecommons.org/licenses/by/4.0
+.. Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+
+============================
+Installing from Source Code
+============================
+
+*Note: this document assumes UNIX Bash Shell.  Being Java, AAF works in Windows, but you will have to create your own script/instruction conversions.*
+
+------------------
+Modes
+------------------
+
+AAF can be run in various ways
+  * Standalone (on your O/S)
+  * Docker (localized)
+  * Kubernetes
+  * ONAP Styles
+    * HEAT (Docker Container Based Initilization)
+    * OOM  (a Helm Chart based Kubernetes Environment)
+
+------------------
+Prerequisites
+------------------
+
+You need the following tools to build and run AAF
+  * git
+  * maven
+  * Java (JDK 1.8+, openjdk is fine)
+  * Cassandra
+     * a separate installation is fine
+     * these instructions will start off with a Docker based Cassandra instance
+  * Machine - one of the following
+     * Standalone Java Processes - no additional running environments necessary
+     * docker - typically available via packages for O/S
+     * kubernetes - ditto
+     
+
+------------------
+Build from Source
+------------------
+Choose the directory you wish to start in... This process will create an "authz" subdirectory::
+
+  $ mkdir -p ~/src
+  $ cd ~/src
+
+Use 'git' to 'clone' the master code::
+  $ git clone https://gerrit.onap.org/r/aaf/authz
+
+Change to that directory::
+
+  $ cd authz
+
+Use Maven to build::
+
+  << TODO, get ONAP Settings.xml>>
+  $ mvn install
+
+.. -----------------
+.. Standalone
+.. -----------------
+
+-----------------
+Docker Mode
+-----------------
+
+After you have successfully run maven, you will need a Cassandra.  If you don't have one, here are instructions for a Docker Standalone Cassandra.  For a *serious* endeavor, you need a multi-node Cassandra.
+
+From "authz"::
+
+  $ cd auth/auth-cass/src/main/cql
+  $ vi config.dat
+
+===================
+Existing Cassandra
+===================
+
+AAF Casablanca has added a table.  If you have an existing AAF Cassandra, do the following::
+
+  ### If Container Cassandra, add these steps, otherwise, skip
+  $ docker container cp init2_1.cql aaf_cass:/tmp
+  $ docker exec -it aaf_cass bash
+  (docker) $ cd /tmp
+  ###
+  $ cqlsh -f 'init2_1.cql'
+
+=====================
+New Docker Cassandra
+=====================
+
+Assuming you are in your src/authz directory::
+
+  $ cd auth/auth-cass/docker
+  $ sh dinstall.sh
+
+---------------------
+AAF Itself
+---------------------
+
+Assuming you are in your src/authz directory::
+
+  $ cd auth/docker
+  ### If you have not done so before (don't overwrite your work!)
+  $ cp d.props.init d.props
+
+You will need to edit and fill out the information in your d.props file.  Here is info to help
+
+**Local Env info** - These are used to load the /etc/hosts file in the Containers, so AAF is available internally and externally
+
+  =============== =============
+  Variable        Explanation
+  =============== =============
+  HOSTNAME        This must be the EXTERNAL FQDN of your host.  Must be in DNS or /etc/hosts
+  HOST_IP         This must be the EXTERNAL IP of your host. Must be accessible from "anywhere"
+  CASS_HOST       If Docker Cass, this is the INTERNAL FQDN/IP.  If external Cass, then DNS|/etc/hosts entry
+  aaf_env         This shows up in GUI and certs, to differentiate environments
+  aaf_register_as As pre-set, it is the same external hostname.
+  cadi_latitude   Use "https://bing.com/maps", if needed, to locate your current Global Coords
+  cadi_longitude  ditto
+  =============== =============
+
+==============================
+"Bleeding Edge" Source install
+==============================
+
+AAF can be built, and local Docker Images built with the following::
+
+  $ sh dbuild.sh
+
+Otherwise, just let it pull from Nexus
+
+==============================
+Configure AAF Volume
+==============================
+
+AAF uses a Persistent Volume to store data longer term, such as CADI configs, Organization info, etc, so that data is not lost when changing out a container.
+
+This volume is created automatically, as necessary, and linked into the container when starting. ::
+
+  ## Be sure to have your 'd.props' file filled out before running.
+  $ sh aaf.sh
+
+==============================
+Bootstrapping with Keystores
+==============================
+
+Start the container in bash mode, so it stays up. ::
+
+  $ bash aaf.sh bash
+  id@77777: 
+
+In another shell, find out your Container name. ::
+  
+  $ docker container ls | grep aaf_config
+
+CD to directory with CA p12 files 
+  
+  * org.osaaf.aaf.p12
+  * org.osaaf.aaf.signer.p12    (if using Certman to sign certificates)
+
+Copy keystores for this AAF Env ::
+
+  $ docker container cp -L org.osaaf.aaf.p12 aaf_agent_<Your ID>:/opt/app/osaaf/local
+  ### IF using local CA Signer 
+  $ docker container cp -L org.osaaf.aaf.signer.p12 aaf_agent_<Your ID>:/opt/app/osaaf/local
+
+In Agent Window ::
+
+  id@77777: agent encrypt cadi_keystore_password
+  ### IF using local CA Signer 
+  id@77777: agent encrypt cm_ca.local 
+
+Check to make sure all passwords are set ::
+
+  id@77777: grep "enc:" *.props
+
+When good, exit from Container Shell and run AAF ::
+
+  id@77777: exit
+  $ bash drun.sh
+
+Check the Container logs for correct Keystore passwords, other issues ::
+
+  $ docker container logs aaf_<service>
+
+Watch logs ::
+
+  $ sh aaf.sh taillog
+
+Notes:
+
+You can find an ONAP Root certificate, and pre-built trustores  for ONAP Test systems at:
+  | authz/auth/sample/public/AAF_RootCA.cert
+  | authz/auth/sample/public/truststoreONAPall.jks
+
+Good Tests to run ::
+
+  ## From "docker" dir
+  ##
+  ## assumes you have DNS or /etc/hosts entry for aaf-onap-test.osaaf.org
+  ##
+  $ curl --cacert ../sample/public/AAF_RootCA.cer -u demo@people.osaaf.org:demo123456! https://aaf-onap-test.osaaf.org:8100/authz/perms/user/demo@people.osaaf.org
+  $ openssl s_client -connect aaf-onap-test.osaaf.org:8100
+
+
+
+
+
+
+
+
+
+
+
+
+
+