* org.onap.aaf
* ===========================================================================
* Copyright (c) 2018 AT&T Intellectual Property. All rights reserved.
+ *
+ * Modification Copyright (c) 2019 IBM
* ===========================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
public class Cached<TRANS extends Trans, DATA extends Cacheable> extends Cache<TRANS,DATA> {
// Java does not allow creation of Arrays with Generics in them...
- // private Map<String,Dated> cache[];
protected final CIDAO<TRANS> info;
private static Timer infoTimer;
protected final String name;
private final long expireIn;
-
- // Taken from String Hash, but coded, to ensure consistent across Java versions. Also covers negative case;
- public int cacheIdx(String key) {
- int h = 0;
- for (int i = 0; i < key.length(); i++) {
- h = 31*h + key.charAt(i);
- }
- if (h<0)h*=-1;
- return h%segSize;
- }
-
public Cached(CIDAO<TRANS> info, String name, int segSize, long expireIn) {
this.name =name;
this.segSize = segSize;
cache[i]=obtain(name+i);
}
}
+
+ // Taken from String Hash, but coded, to ensure consistent across Java versions. Also covers negative case;
+ public int cacheIdx(String key) {
+ int h = 0;
+ for (int i = 0; i < key.length(); i++) {
+ h = 31*h + key.charAt(i);
+ }
+ if (h<0) {
+ h*=-1;
+ }
+ return h%segSize;
+ }
public void add(String key, List<DATA> data) {
@SuppressWarnings("unchecked")
int cacheIdx = cacheIdx(key);
@SuppressWarnings("unchecked")
Map<String,Dated> map = ((Map<String,Dated>)cache[cacheIdx]);
-// if (map.remove(key)!=null) // Not seeming to remove all the time
if (map!=null)map.clear();
-// System.err.println("Remove " + name + " " + key);
return cacheIdx;
}
public Result<Void> invalidate(int segment) {
- if (segment<0 || segment>=cache.length) return Result.err(Status.ERR_BadData,"Cache Segment %s is out of range",Integer.toString(segment));
+ if (segment<0 || segment>=cache.length) {
+ return Result.err(Status.ERR_BadData,"Cache Segment %s is out of range",Integer.toString(segment));
+ }
@SuppressWarnings("unchecked")
Map<String,Dated> map = ((Map<String,Dated>)cache[segment]);
if (map!=null) {
return Result.ok();
}
+ @FunctionalInterface
public interface Getter<D> {
public abstract Result<List<D>> get();
};
rld = getter.get();
if (rld.isOK()) { // only store valid lists
map.put(key, new Dated(rld.value,expireIn)); // successful item found gets put in cache
-// } else if (rld.status == Result.ERR_Backend){
-// map.remove(key);
}
}
return rld;
}
}
- private final static class Refresh extends TimerTask {
- private static final int maxRefresh = 2*60*10000; // 20 mins
+ private static final class Refresh extends TimerTask {
+ private static final int MAXREFRESH = 2*60*10000; // 20 mins
private AuthzEnv env;
private CIDAO<AuthzTrans> cidao;
private int minRefresh;
this.env = env;
this.cidao = cidao;
this.minRefresh = minRefresh;
- lastRun = System.currentTimeMillis()-maxRefresh-1000;
+ lastRun = System.currentTimeMillis()-MAXREFRESH-1000;
}
@Override
long now = System.currentTimeMillis();
long interval = now-lastRun;
- if (interval < minRefresh || interval < Math.min(env.transRate(),maxRefresh)) return;
+ if (interval < minRefresh || interval < Math.min(env.transRate(),MAXREFRESH)) {
+ return;
+ }
lastRun = now;
AuthzTrans trans = env.newTransNoAvg();
Result<Void> rv = cidao.check(trans);
public void replace(CRUD crud, PSInfo psInfo) {
switch(crud) {
- case create: createPS = psInfo; break;
- case read: readPS = psInfo; break;
- case update: updatePS = psInfo; break;
- case delete: deletePS = psInfo; break;
+ case create: createPS = psInfo;
+ break;
+ case read: readPS = psInfo;
+ break;
+ case update: updatePS = psInfo;
+ break;
+ case delete: deletePS = psInfo;
+ break;
}
}
public void disable(CRUD crud) {
switch(crud) {
- case create: createPS = null; break;
- case read: readPS = null; break;
- case update: updatePS = null; break;
- case delete: deletePS = null; break;
+ case create: createPS = null;
+ break;
+ case read: readPS = null;
+ break;
+ case update: updatePS = null;
+ break;
+ case delete: deletePS = null;
+ break;
}
}
* org.onap.aaf
* ===========================================================================
* Copyright (c) 2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 IBM.
* ===========================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
// Certs in keystore versus Truststore. Separate in Version 2_0
if (cin.trustCAs()!=null) {
for (String c : cin.trustCAs()) {
- if (c!=null) {
- if (!cout.getCerts().contains(c)) {
- cout.getCerts().add(c);
- }
- }
+ if ((c!=null)&&(!cout.getCerts().contains(c))) {
+ cout.getCerts().add(c);
+ }
}
}
if (cin.notes()!=null) {
static final String AUTHZ_DELG = "/authz/delegate";
private static final String[] options = {"add","upd","del"};
- public Delg(User user) throws APIException {
+ public Delg(User user){
super(user,"delegate",
new Param(optionsToString(options),true),
new Param("from",true),
public class CUI extends HttpCode<AuthzTrans, Void> {
private final AAF_GUI gui;
- private final static Pattern userPerm = Pattern.compile("perm (create|delete).*@.*:id.*aaf.gui.*");
+ private static final Pattern userPerm = Pattern.compile("perm (create|delete).*@.*:id.*aaf.gui.*");
public CUI(AAF_GUI gui) {
if(userPerm.matcher(cmdStr).matches()) {
trans.clearCache();
Cookie cookie = new Cookie(Page.AAF_THEME,trans.getProperty(Page.AAF_THEME));
+ cookie.setSecure(true);
cookie.setMaxAge(-1);
cookie.setComment("Remove AAF GUI Theme");
trans.hresp().addCookie(cookie);
*
*/
private static class Model extends TableData<AAF_GUI,AuthzTrans> {
- final long NUM_100NS_INTERVALS_SINCE_UUID_EPOCH = 0x01b21dd213814000L;
+ static final long NUM_100NS_INTERVALS_SINCE_UUID_EPOCH = 0x01b21dd213814000L;
private Slot sTicket;
public Model(AuthzEnv env) {
sTicket = env.slot(NAME+".ticket");
AAF can support models of either side. In the meantime, enjoy the use of your mind to comtemplate things beyond tickets and this will help drive what you need to ask for in terms of Identities for your Apps.
+Components
+==========
+
+The running components of AAF include the following:
+ - "service" - RESTful HTTP/S - The main API Service for Authentication, Authorization and Management
+ - "locate" - RESTful HTTP/S - Provides Scaleble, Cross-Deployment Global location, inside or outside a container, of Registered Components (at minimum, AAF Components). Locate also provide Configuration information for Generated Configurations.
+ - "oauth" - RESTful HTTP/S - OAuth 2 implementation. Provides "token" and "introspection" methods, where Authorization data is included.
+ - "gui" - Browser HTTP/S - Management GUI, where user interactions occur, including a Web-based CMD-Line interface, API Docs, Approval pages, etc.
+ - "cm" - RESTful HTTP/S - Certificate Manager API, see more details below.
+ - "fs" - HTTP ONLY - File Server. This Component MUST NOT be HTTP/S, because it Provides HTTP Accessed RCLs as part of the TLS process. Other public information may be presented as well (such as Certificates, which are by definition Public)
+
Certificate Manager
===================
Encryption is provided by HTTP/S with the TLS 1.2+ protocol. Lesser protocols can also be added, but it is highly recommended that the protocol go no lower than TLS 1.1
+ALL components of AAF are accessible only by HTTP/S (service, locate, oauth, gui, certman), EXCEPT the component "FS".
+
+FS *must* be HTTP, because it is responsible for being accessible DURING the TLS process for recent RCLs. (Revocation lists). Since it is part of the TLS process, it cannot be TLS itself.
+
.. image:: images/SecurityArchBasic_TLS.svg
:width: 70%
:align: center
Release Notes
=============
-Version: 2.1.15 (El Alto, Early Drop, 5.0.0)
+Version: 2.1.15 (El Alto, 5.0.1)
---------------------------------------------
:Release Date: 2019-08-12