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.cadi.aaf.v2_0;
24 import java.io.IOException;
26 import org.onap.aaf.cadi.AbsUserCache;
27 import org.onap.aaf.cadi.CachedPrincipal;
28 import org.onap.aaf.cadi.CadiException;
29 import org.onap.aaf.cadi.User;
30 import org.onap.aaf.cadi.aaf.AAFPermission;
31 import org.onap.aaf.cadi.client.Future;
32 import org.onap.aaf.cadi.client.Rcli;
33 import org.onap.aaf.cadi.lur.ConfigPrincipal;
35 public class AAFAuthn<CLIENT> extends AbsUserCache<AAFPermission> {
36 private AAFCon<CLIENT> con;
40 * Configure with Standard AAF properties, Stand alone
42 * @throws Exception ..
45 AAFAuthn(AAFCon<CLIENT> con) {
46 super(con.access,con.cleanInterval,con.highCount,con.usageRefreshTriggerCount);
51 * Configure with Standard AAF properties, but share the Cache (with AAF Lur)
56 AAFAuthn(AAFCon<CLIENT> con, AbsUserCache<AAFPermission> cache) {
62 * Return Native Realm of AAF Instance.
66 public String getRealm() {
71 * Returns null if ok, or an Error String;
73 * Convenience function. Passes "null" for State object
75 public String validate(String user, String password) throws IOException {
76 return validate(user,password,null);
80 * Returns null if ok, or an Error String;
82 * For State Object, you may put in HTTPServletRequest or AuthzTrans, if available. Otherwise,
89 * @throws CadiException
92 public String validate(String user, String password, Object state) throws IOException {
93 password = access.decrypt(password, false);
94 byte[] bytes = password.getBytes();
95 User<AAFPermission> usr = getUser(user,bytes);
97 if (usr != null && !usr.permExpired()) {
98 if (usr.principal==null) {
99 return "User already denied";
105 AAFCachedPrincipal cp = new AAFCachedPrincipal(user, bytes, con.cleanInterval);
106 // Since I've relocated the Validation piece in the Principal, just revalidate, then do Switch
108 switch(cp.revalidate(state)) {
113 addUser(new User<AAFPermission>(cp,con.timeout));
117 return "AAF Inaccessible";
119 addUser(new User<AAFPermission>(user,bytes,con.timeout));
120 return "User/Pass combo invalid for " + user;
122 return "AAF denies API for " + user;
124 return "AAFAuthn doesn't handle Principal " + user;
128 private class AAFCachedPrincipal extends ConfigPrincipal implements CachedPrincipal {
129 private long expires;
130 private long timeToLive;
132 private AAFCachedPrincipal(String name, byte[] pass, int timeToLive) {
134 this.timeToLive = timeToLive;
135 expires = timeToLive + System.currentTimeMillis();
138 public Resp revalidate(Object state) {
140 Miss missed = missed(getName(),getCred());
141 if (missed==null || missed.mayContinue()) {
142 Rcli<CLIENT> client = con.client().forUser(con.basicAuth(getName(), new String(getCred())));
143 Future<String> fp = client.read(
147 if (fp.get(con.timeout)) {
148 expires = System.currentTimeMillis() + timeToLive;
149 addUser(new User<AAFPermission>(this, expires));
150 return Resp.REVALIDATED;
152 addMiss(getName(), getCred());
153 return Resp.UNVALIDATED;
156 return Resp.UNVALIDATED;
158 } catch (Exception e) {
160 return Resp.INACCESSIBLE;
164 public long expires() {