[DMAAP-BC] Consolidate bus controller repos
[dmaap/buscontroller.git] / dmaap-bc / src / main / java / org / onap / dmaap / dbcapi / service / ApiService.java
diff --git a/dmaap-bc/src/main/java/org/onap/dmaap/dbcapi/service/ApiService.java b/dmaap-bc/src/main/java/org/onap/dmaap/dbcapi/service/ApiService.java
new file mode 100644 (file)
index 0000000..ef1e6f4
--- /dev/null
@@ -0,0 +1,159 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dmaap
+ * ================================================================================
+ * Copyright (C) 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.dmaap.dbcapi.service;
+
+import static com.att.eelf.configuration.Configuration.MDC_KEY_REQUEST_ID;
+import static com.att.eelf.configuration.Configuration.MDC_SERVICE_NAME;
+
+import org.onap.dmaap.dbcapi.aaf.DmaapPerm;
+import org.onap.dmaap.dbcapi.authentication.ApiPolicy;
+import org.onap.dmaap.dbcapi.authentication.AuthenticationErrorException;
+import org.onap.dmaap.dbcapi.logging.BaseLoggingClass;
+import org.onap.dmaap.dbcapi.model.ApiError;
+import org.onap.dmaap.dbcapi.model.Dmaap;
+import org.onap.dmaap.dbcapi.util.DmaapConfig;
+import org.onap.dmaap.dbcapi.util.RandomString;
+import org.slf4j.MDC;
+
+public class ApiService extends BaseLoggingClass {
+
+    private String apiNamespace;
+    private String uri;
+    private String uriPath;
+    private String method;
+    private String authorization;
+    private String requestId;
+    private ApiError err;
+    private ApiPolicy apiPolicy;
+    private CredentialsParser credentialsParser = new CredentialsParser();
+
+    public ApiService() {
+
+        err = new ApiError();
+        requestId = (new RandomString(10)).nextString();
+
+        if (apiNamespace == null) {
+            DmaapConfig p = (DmaapConfig) DmaapConfig.getConfig();
+            apiNamespace = p.getProperty("ApiNamespace", "org.openecomp.dmaapBC.api");
+            logger.info("config param usePE has been deprecated.  Use ApiPermission.Class property instead.");
+        }
+        apiPolicy = new ApiPolicy();
+
+        logger.info("apiNamespace=" + apiNamespace);
+    }
+
+    public ApiService setAuth(String auth) {
+        this.authorization = auth;
+        logger.info("setAuth:  authorization={} ", authorization);
+        return this;
+    }
+
+    private void setServiceName() {
+        String svcRequest = new String(this.method + " " + this.uriPath);
+        MDC.put(MDC_SERVICE_NAME, svcRequest);
+    }
+
+    public ApiService setHttpMethod(String httpMethod) {
+        this.method = httpMethod;
+        logger.info("setHttpMethod: method={} ", method);
+        setServiceName();
+        return this;
+    }
+
+    public ApiService setUriPath(String uriPath) {
+        this.uriPath = uriPath;
+        this.uri = setUriFromPath(uriPath);
+        logger.info("setUriPath: uriPath={} uri={}", uriPath, uri);
+        setServiceName();
+        return this;
+    }
+
+    private String setUriFromPath(String uriPath) {
+        int ch = uriPath.indexOf("/");
+        if (ch > 0) {
+            return ((String) uriPath.subSequence(0, ch));
+        } else {
+            return uriPath;
+        }
+    }
+
+    public ApiError getErr() {
+        return err;
+    }
+
+    public void checkAuthorization() throws Exception {
+
+        MDC.put(MDC_KEY_REQUEST_ID, requestId);
+
+        logger.info("request: uri={} method={} auth={}", uri, method, authorization);
+
+        if (uri == null || uri.isEmpty()) {
+            String errmsg = "No URI value provided ";
+            err.setMessage(errmsg);
+            logger.info(errmsg);
+            throw new AuthenticationErrorException();
+        }
+        if (method == null || method.isEmpty()) {
+            String errmsg = "No method value provided ";
+            err.setMessage(errmsg);
+            logger.info(errmsg);
+            throw new AuthenticationErrorException();
+        }
+        DmaapService dmaapService = new DmaapService();
+        Dmaap dmaap = dmaapService.getDmaap();
+        String env = dmaap.getDmaapName();
+
+        // special case during bootstrap of app when DMaaP environment may not be set.
+        // this allows us to authorize certain APIs used for initialization during this window.
+        if (env == null || env.isEmpty()) {
+            env = "boot";
+        }
+        if (!apiPolicy.isPermissionClassSet()) {
+            return;  // skip authorization if not enabled
+        }
+
+        Credentials credentials = credentialsParser.parse(authorization);
+        try {
+            DmaapPerm p = new DmaapPerm(apiNamespace + "." + uri, env, method);
+            apiPolicy.check(credentials.getId(), credentials.getPwd(), p);
+        } catch (AuthenticationErrorException ae) {
+            String errmsg =
+                "User " + credentials.getId() + " failed authentication/authorization for " + apiNamespace + "." + uriPath + " " + env
+                    + " " + method;
+            logger.info(errmsg);
+            err.setMessage(errmsg);
+            throw ae;
+
+        }
+    }
+
+    public ApiService setRequestId(String requestId) {
+        if (requestId == null || requestId.isEmpty()) {
+            this.requestId = (new RandomString(10)).nextString();
+            logger.warn("X-ECOMP-RequestID not set in HTTP Header.  Setting RequestId value to: " + this.requestId);
+        } else {
+            this.requestId = requestId;
+        }
+        MDC.put(MDC_KEY_REQUEST_ID, this.requestId);
+        return this;
+    }
+}
+