Add Certs, Docker Build
[aaf/authz.git] / auth / auth-certman / src / main / java / org / onap / aaf / auth / cm / AAF_CM.java
1 /**
2  * ============LICENSE_START====================================================
3  * org.onap.aaf
4  * ===========================================================================
5  * Copyright (c) 2018 AT&T Intellectual Property. All rights reserved.
6  * ===========================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END====================================================
19  *
20  */
21
22
23 package org.onap.aaf.auth.cm;
24
25 import java.lang.reflect.Constructor;
26 import java.util.Map;
27 import java.util.Map.Entry;
28 import java.util.TreeMap;
29
30 import javax.servlet.Filter;
31
32 import org.onap.aaf.auth.cache.Cache;
33 import org.onap.aaf.auth.cache.Cache.Dated;
34 import org.onap.aaf.auth.cm.api.API_Artifact;
35 import org.onap.aaf.auth.cm.api.API_Cert;
36 import org.onap.aaf.auth.cm.ca.CA;
37 import org.onap.aaf.auth.cm.facade.Facade1_0;
38 import org.onap.aaf.auth.cm.facade.FacadeFactory;
39 import org.onap.aaf.auth.cm.mapper.Mapper.API;
40 import org.onap.aaf.auth.cm.service.CMService;
41 import org.onap.aaf.auth.cm.service.Code;
42 import org.onap.aaf.auth.dao.CassAccess;
43 import org.onap.aaf.auth.dao.cass.LocateDAO;
44 import org.onap.aaf.auth.direct.DirectLocatorCreator;
45 import org.onap.aaf.auth.direct.DirectRegistrar;
46 import org.onap.aaf.auth.env.AuthzEnv;
47 import org.onap.aaf.auth.env.AuthzTrans;
48 import org.onap.aaf.auth.env.AuthzTransFilter;
49 import org.onap.aaf.auth.rserv.HttpMethods;
50 import org.onap.aaf.auth.server.AbsService;
51 import org.onap.aaf.auth.server.JettyServiceStarter;
52 import org.onap.aaf.auth.server.Log4JLogIt;
53 import org.onap.aaf.cadi.Access;
54 import org.onap.aaf.cadi.Access.Level;
55 import org.onap.aaf.cadi.CadiException;
56 import org.onap.aaf.cadi.LocatorException;
57 import org.onap.aaf.cadi.PropAccess;
58 import org.onap.aaf.cadi.aaf.v2_0.AAFAuthn;
59 import org.onap.aaf.cadi.aaf.v2_0.AAFLurPerm;
60 import org.onap.aaf.cadi.aaf.v2_0.AAFTrustChecker;
61 import org.onap.aaf.cadi.aaf.v2_0.AbsAAFLocator;
62 import org.onap.aaf.cadi.config.Config;
63 import org.onap.aaf.cadi.register.Registrant;
64 import org.onap.aaf.misc.env.APIException;
65 import org.onap.aaf.misc.env.Data;
66 import org.onap.aaf.misc.env.Env;
67 import org.onap.aaf.misc.env.util.Split;
68
69 import com.datastax.driver.core.Cluster;
70
71 public class AAF_CM extends AbsService<AuthzEnv, AuthzTrans> {
72
73         private static final String USER_PERMS = "userPerms";
74         private static final Map<String,CA> certAuths = new TreeMap<String,CA>();
75         public Facade1_0 facade1_0; // this is the default Facade
76         public Facade1_0 facade1_0_XML; // this is the XML Facade
77         public Map<String, Dated> cacheUser;
78         public AAFAuthn<?> aafAuthn;
79         public AAFLurPerm aafLurPerm;
80         final public Cluster cluster;
81         public final LocateDAO locateDAO;
82
83
84         /**
85          * Construct AuthzAPI with all the Context Supporting Routes that Authz needs
86          * 
87          * @param env
88          * @param si 
89          * @param dm 
90          * @param decryptor 
91          * @throws APIException 
92          */
93         public AAF_CM(AuthzEnv env) throws Exception {
94                 super(env.access(),env);
95                 aafLurPerm = aafCon().newLur();
96                 // Note: If you need both Authn and Authz construct the following:
97                 aafAuthn = aafCon().newAuthn(aafLurPerm);
98
99                 String aaf_env = env.getProperty(Config.AAF_ENV);
100                 if(aaf_env==null) {
101                         throw new APIException("aaf_env needs to be set");
102                 }
103
104                 // Initialize Facade for all uses
105                 AuthzTrans trans = env.newTrans();
106
107                 cluster = org.onap.aaf.auth.dao.CassAccess.cluster(env,null);
108                 locateDAO = new LocateDAO(trans,cluster,CassAccess.KEYSPACE);
109
110                 // Have AAFLocator object Create DirectLocators for Location needs
111                 AbsAAFLocator.setCreator(new DirectLocatorCreator(env, locateDAO));
112
113                 // Load Supported Certificate Authorities by property
114                 // Note: Some will be dynamic Properties, so we need to look through all
115                 for(Entry<Object, Object> es : env.access().getProperties().entrySet()) {
116                         String key = es.getKey().toString();
117                         if(key.startsWith(CA.CM_CA_PREFIX)) {
118                                 int idx = key.indexOf('.');
119                                 if(idx==key.lastIndexOf('.')) { // else it's a regular property 
120         
121                                         env.log(Level.INIT, "Loading Certificate Authority Module: " + key.substring(idx+1));
122                                         String[] segs = Split.split(',', env.getProperty(key));
123                                         if(segs.length>0) {
124                                                 String[][] multiParams = new String[segs.length-1][];
125                                                 for(int i=0;i<multiParams.length;++i) {
126                                                         multiParams[i]=Split.split(';',segs[1+i]);
127                                                 }
128                                                 @SuppressWarnings("unchecked")
129                                                 Class<CA> cac = (Class<CA>)Class.forName(segs[0]);
130                                                 Constructor<CA> cons = cac.getConstructor(new Class<?>[] {
131                                                         Access.class,String.class,String.class,String[][].class
132                                                 });
133                                                 Object pinst[] = new Object[4];
134                                                 pinst[0]=env;
135                                                 pinst[1]= key.substring(idx+1);
136                                                 pinst[2]= aaf_env;
137                                                 pinst[3] = multiParams; 
138                                                 CA ca = cons.newInstance(pinst);
139                                                 certAuths.put(ca.getName(),ca);
140                                         }
141                                 }
142                         }
143                 }
144                 if(certAuths.size()==0) {
145                         throw new APIException("No Certificate Authorities have been configured in CertMan");
146                 }
147
148                 CMService service = new CMService(trans, this);
149                 // note: Service knows how to shutdown Cluster on Shutdown, etc.  See Constructor
150                 facade1_0 = FacadeFactory.v1_0(this,trans, service,Data.TYPE.JSON);   // Default Facade
151                 facade1_0_XML = FacadeFactory.v1_0(this,trans,service,Data.TYPE.XML); 
152
153
154                 synchronized(env) {
155                         if(cacheUser == null) {
156                                 cacheUser = Cache.obtain(USER_PERMS);
157                                 Cache.startCleansing(env, USER_PERMS);
158                         }
159                 }
160
161                 ////////////////////////////////////////////////////////////////////////////
162                 // APIs
163                 ////////////////////////////////////////////////////////////////////////
164                 API_Cert.init(this);
165                 API_Artifact.init(this);
166
167                 StringBuilder sb = new StringBuilder();
168                 trans.auditTrail(2, sb);
169                 trans.init().log(sb);
170         }
171
172         public CA getCA(String key) {
173                 return certAuths.get(key);
174         }
175
176         /**
177          * Setup XML and JSON implementations for each supported Version type
178          * 
179          * We do this by taking the Code passed in and creating clones of these with the appropriate Facades and properties
180          * to do Versions and Content switches
181          * 
182          */
183         public void route(HttpMethods meth, String path, API api, Code code) throws Exception {
184                 String version = "1.0";
185                 // Get Correct API Class from Mapper
186                 Class<?> respCls = facade1_0.mapper().getClass(api); 
187                 if(respCls==null) throw new Exception("Unknown class associated with " + api.getClass().getName() + ' ' + api.name());
188                 // setup Application API HTML ContentTypes for JSON and Route
189                 String application = applicationJSON(respCls, version);
190                 route(env,meth,path,code,application,"application/json;version="+version,"*/*");
191
192                 // setup Application API HTML ContentTypes for XML and Route
193                 application = applicationXML(respCls, version);
194                 route(env,meth,path,code.clone(facade1_0_XML),application,"application/xml;version="+version);
195
196                 // Add other Supported APIs here as created
197         }
198
199         public void routeAll(HttpMethods meth, String path, API api, Code code) throws Exception {
200                 route(env,meth,path,code,""); // this will always match
201         }
202
203         @Override
204         public Filter[] filters() throws CadiException, LocatorException {
205                 try {
206                         return new Filter[] {
207                                         new AuthzTransFilter(env,aafCon(),
208                                                 new AAFTrustChecker((Env)env))
209                                 };
210                 } catch (NumberFormatException e) {
211                         throw new CadiException("Invalid Property information", e);
212                 }
213         }
214
215         @SuppressWarnings("unchecked")
216         @Override
217         public Registrant<AuthzEnv>[] registrants(final int port) throws CadiException, LocatorException {
218                 return new Registrant[] {
219                         new DirectRegistrar(access,locateDAO,app_name,app_version,port)
220                 };
221         }
222
223         public void destroy() {
224                 Cache.stopTimer();
225                 locateDAO.close(env.newTransNoAvg());
226                 cluster.close();
227         }
228
229         public static void main(final String[] args) {
230                 try {
231                         Log4JLogIt logIt = new Log4JLogIt(args, "cm");
232                         PropAccess propAccess = new PropAccess(logIt,args);
233
234                         AAF_CM service = new AAF_CM(new AuthzEnv(propAccess));
235                         JettyServiceStarter<AuthzEnv,AuthzTrans> jss = new JettyServiceStarter<AuthzEnv,AuthzTrans>(service);
236                         jss.start();
237                 } catch (Exception e) {
238                         e.printStackTrace();
239                 }
240         }
241 }