2 * ============LICENSE_START====================================================
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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====================================================
22 package org.onap.aaf.auth.gui;
24 import static org.onap.aaf.auth.rserv.HttpMethods.GET;
25 import static org.onap.aaf.auth.rserv.HttpMethods.POST;
26 import static org.onap.aaf.auth.rserv.HttpMethods.PUT;
28 import javax.servlet.Filter;
30 import org.onap.aaf.auth.cmd.Cmd;
31 import org.onap.aaf.auth.cui.CUI;
32 import org.onap.aaf.auth.env.AuthzEnv;
33 import org.onap.aaf.auth.env.AuthzTrans;
34 import org.onap.aaf.auth.env.AuthzTransFilter;
35 import org.onap.aaf.auth.gui.pages.ApiDocs;
36 import org.onap.aaf.auth.gui.pages.ApiExample;
37 import org.onap.aaf.auth.gui.pages.ApprovalAction;
38 import org.onap.aaf.auth.gui.pages.ApprovalForm;
39 import org.onap.aaf.auth.gui.pages.CMArtiChangeAction;
40 import org.onap.aaf.auth.gui.pages.CMArtiChangeForm;
41 import org.onap.aaf.auth.gui.pages.CMArtifactShow;
42 import org.onap.aaf.auth.gui.pages.CredDetail;
43 import org.onap.aaf.auth.gui.pages.Home;
44 import org.onap.aaf.auth.gui.pages.LoginLanding;
45 import org.onap.aaf.auth.gui.pages.LoginLandingAction;
46 import org.onap.aaf.auth.gui.pages.NsDetail;
47 import org.onap.aaf.auth.gui.pages.NsHistory;
48 import org.onap.aaf.auth.gui.pages.NsInfoAction;
49 import org.onap.aaf.auth.gui.pages.NsInfoForm;
50 import org.onap.aaf.auth.gui.pages.NssShow;
51 import org.onap.aaf.auth.gui.pages.PassChangeAction;
52 import org.onap.aaf.auth.gui.pages.PassChangeForm;
53 import org.onap.aaf.auth.gui.pages.PassDeleteAction;
54 import org.onap.aaf.auth.gui.pages.PendingRequestsShow;
55 import org.onap.aaf.auth.gui.pages.PermDetail;
56 import org.onap.aaf.auth.gui.pages.PermGrantAction;
57 import org.onap.aaf.auth.gui.pages.PermGrantForm;
58 import org.onap.aaf.auth.gui.pages.PermHistory;
59 import org.onap.aaf.auth.gui.pages.PermsShow;
60 import org.onap.aaf.auth.gui.pages.RequestDetail;
61 import org.onap.aaf.auth.gui.pages.RoleDetail;
62 import org.onap.aaf.auth.gui.pages.RoleDetailAction;
63 import org.onap.aaf.auth.gui.pages.RoleHistory;
64 import org.onap.aaf.auth.gui.pages.RolesShow;
65 import org.onap.aaf.auth.gui.pages.UserRoleExtend;
66 import org.onap.aaf.auth.gui.pages.UserRoleRemove;
67 import org.onap.aaf.auth.gui.pages.WebCommand;
68 import org.onap.aaf.auth.rserv.CachingFileAccess;
69 import org.onap.aaf.auth.server.AbsService;
70 import org.onap.aaf.auth.server.JettyServiceStarter;
71 import org.onap.aaf.auth.server.Log4JLogIt;
72 import org.onap.aaf.cadi.CadiException;
73 import org.onap.aaf.cadi.LocatorException;
74 import org.onap.aaf.cadi.PropAccess;
75 import org.onap.aaf.cadi.aaf.v2_0.AAFConHttp;
76 import org.onap.aaf.cadi.aaf.v2_0.AAFLurPerm;
77 import org.onap.aaf.cadi.aaf.v2_0.AAFTrustChecker;
78 import org.onap.aaf.cadi.client.Future;
79 import org.onap.aaf.cadi.client.Retryable;
80 import org.onap.aaf.cadi.config.Config;
81 import org.onap.aaf.cadi.http.HTransferSS;
82 import org.onap.aaf.cadi.principal.TaggedPrincipal;
83 import org.onap.aaf.cadi.register.Registrant;
84 import org.onap.aaf.cadi.register.RemoteRegistrant;
85 import org.onap.aaf.misc.env.APIException;
86 import org.onap.aaf.misc.env.Env;
87 import org.onap.aaf.misc.env.Slot;
88 import org.onap.aaf.misc.env.StaticSlot;
89 import org.onap.aaf.misc.rosetta.env.RosettaDF;
90 import org.onap.aaf.misc.xgen.html.HTMLGen;
91 import org.onap.aaf.misc.xgen.html.State;
93 import certman.v1_0.Artifacts;
94 import certman.v1_0.CertInfo;
96 public class AAF_GUI extends AbsService<AuthzEnv, AuthzTrans> implements State<Env>{
97 public static final String AAF_GUI_THEME = "aaf_gui_theme";
98 public static final String AAF_GUI_COPYRIGHT = "aaf_gui_copyright";
99 public static final String HTTP_SERVLET_REQUEST = "HTTP_SERVLET_REQUEST";
100 public static final int TIMEOUT = 60000;
101 public static final String app = "AAF GUI";
105 // Certificate manager API
106 public RosettaDF<Artifacts> artifactsDF;
107 public RosettaDF<CertInfo> certInfoDF;
109 private final AAFConHttp cmCon;
110 public final AAFConHttp aafCon;
111 public final AAFLurPerm lur;
113 public final Slot slot_httpServletRequest;
114 protected final String deployedVersion;
115 private StaticSlot sThemeWebPath;
116 private StaticSlot sDefaultTheme;
117 // public final String theme;
120 public AAF_GUI(final AuthzEnv env) throws Exception {
121 super(env.access(), env);
122 sDefaultTheme = env.staticSlot(AAF_GUI_THEME);
123 env.put(sDefaultTheme, env.getProperty(AAF_GUI_THEME,"onap"));
125 sThemeWebPath = env.staticSlot(CachingFileAccess.CFA_WEB_PATH);
126 if(env.get(sThemeWebPath)==null) {
127 env.put(sThemeWebPath,"theme");
130 slot_httpServletRequest = env.slot(HTTP_SERVLET_REQUEST);
131 deployedVersion = access.getProperty(Config.AAF_RELEASE, "N/A:2.x");
133 // Certificate Manager
134 String aaf_url_cm = env.getProperty(Config.AAF_URL_CM,Config.AAF_URL_CM_DEF);
135 cmCon = new AAFConHttp(env.access(),aaf_url_cm);
136 artifactsDF = env.newDataFactory(Artifacts.class);
137 certInfoDF = env.newDataFactory(CertInfo.class);
140 /////////////////////////
142 /////////////////////////
144 final Page start = new Display(this, GET, new Home(this)).page();
147 final Page myPerms = new Display(this, GET, new PermsShow(this, start)).page();
148 Page permDetail = new Display(this, GET, new PermDetail(this, start, myPerms)).page();
149 new Display(this, GET, new PermHistory(this,start,myPerms,permDetail));
152 final Page myRoles = new Display(this, GET, new RolesShow(this, start)).page();
153 Page roleDetail = new Display(this, GET, new RoleDetail(this, start, myRoles)).page();
154 new Display(this, POST, new RoleDetailAction(this,start,myRoles,roleDetail));
155 new Display(this, GET, new RoleHistory(this,start,myRoles,roleDetail));
158 final Page myNamespaces = new Display(this, GET, new NssShow(this, start)).page();
159 Page nsDetail = new Display(this, GET, new NsDetail(this, start, myNamespaces)).page();
160 new Display(this, GET, new NsHistory(this, start,myNamespaces,nsDetail));
161 Page crdDetail = new Display(this, GET, new CredDetail(this, start, myNamespaces, nsDetail)).page();
162 Page artiShow = new Display(this, GET, new CMArtifactShow(this, start, myNamespaces, nsDetail, crdDetail)).page();
163 Page artiCForm = new Display(this, GET, new CMArtiChangeForm(this, start, myNamespaces, nsDetail, crdDetail,artiShow)).page();
164 new Display(this, POST, new CMArtiChangeAction(this, start,artiShow,artiCForm));
166 // Password Change Screens
167 final Page pwc = new Display(this, GET, new PassChangeForm(this, start,crdDetail)).page();
168 new Display(this, POST, new PassChangeAction(this, start, pwc));
170 // Password Delete Screen
171 new Display(this, GET, new PassDeleteAction(this, start,crdDetail));
173 // Validation Change Screens
174 final Page validate = new Display(this, GET, new ApprovalForm(this, start)).page();
175 new Display(this, POST, new ApprovalAction(this, start, validate));
177 // Onboard, Detailed Edit Screens
178 final Page onb = new Display(this, GET, new NsInfoForm(this, start)).page();
179 new Display(this, POST, new NsInfoAction(this, start, onb));
181 // Web Command Screens
182 /* final Page webCommand =*/ new Display(this, GET, new WebCommand(this, start)).page();
185 final Page apidocs = new Display(this, GET, new ApiDocs(this, start)).page();
186 new Display(this, GET, new ApiExample(this,start, apidocs)).page();
188 // Permission Grant Page
189 final Page permGrant = new Display(this, GET, new PermGrantForm(this, start)).page();
190 new Display(this, POST, new PermGrantAction(this, start, permGrant)).page();
192 // Login Landing if no credentials detected
193 final Page loginLanding = new Display(this, GET, new LoginLanding(this, start)).page();
194 new Display(this, POST, new LoginLandingAction(this, start, loginLanding));
196 // User Role Request Extend and Remove
197 new Display(this, GET, new UserRoleExtend(this, start,myRoles)).page();
198 new Display(this, GET, new UserRoleRemove(this, start,myRoles)).page();
200 // See my Pending Requests
201 final Page requestsShow = new Display(this, GET, new PendingRequestsShow(this, start)).page();
202 new Display(this, GET, new RequestDetail(this, start, requestsShow));
204 // Command line Mechanism
205 route(env, PUT, "/gui/cui", new CUI(this),"text/plain;charset=utf-8","*/*");
207 ///////////////////////
208 // WebContent Handler
209 ///////////////////////
210 CachingFileAccess<AuthzTrans> cfa = new CachingFileAccess<AuthzTrans>(env);
211 //route(env,GET,"/"+env.get(sThemeWebPath)+"/:key*", cfa);
212 route(env,GET,"/theme/:key*", cfa);
213 ///////////////////////
215 lur = aafCon.newLur();
218 public<T> RosettaDF<T> getDF(Class<T> cls) throws APIException {
219 return Cmd.getDF(env,cls);
222 public void writeError(AuthzTrans trans, Future<?> fp, HTMLGen hgen, int indent) {
224 String msg = aafCon.readableErrMsg(fp);
225 hgen.incr(HTMLGen.P,"style=text-indent:"+indent*10+"px")
226 .text("<font color=\"red\"><i>Error</i>:</font> ")
229 trans.checkpoint(msg);
233 public<RET> RET cmClientAsUser(TaggedPrincipal p,Retryable<RET> retryable) throws APIException, LocatorException, CadiException {
234 return cmCon.hman().best(new HTransferSS(p,app, aafCon.securityInfo()), retryable);
238 public Filter[] _filters(Object ... additionalTafLurs) throws CadiException, LocatorException {
240 return new Filter[] {
241 new XFrameFilter(XFrameFilter.TYPE.none),
242 new AuthzTransFilter(env,aafCon(),
243 new AAFTrustChecker((Env)env),
245 new OrgLookupFilter()
247 } catch (NumberFormatException e) {
248 throw new CadiException("Invalid Property information", e);
252 @SuppressWarnings("unchecked")
254 public Registrant<AuthzEnv>[] registrants(final int port) throws CadiException, LocatorException {
255 return new Registrant[] {
256 new RemoteRegistrant<AuthzEnv>(aafCon(),port)
260 public static void main(final String[] args) {
262 Log4JLogIt logIt = new Log4JLogIt(args, "gui");
263 PropAccess propAccess = new PropAccess(logIt,args);
265 AAF_GUI service = new AAF_GUI(new AuthzEnv(propAccess));
266 JettyServiceStarter<AuthzEnv,AuthzTrans> jss = new JettyServiceStarter<AuthzEnv,AuthzTrans>(service);
268 } catch (Exception e) {