Merge "Unit test base"
[dmaap/datarouter.git] / datarouter-node / src / main / java / org / onap / dmaap / datarouter / node / NodeUtils.java
1 /*******************************************************************************
2  * ============LICENSE_START==================================================
3  * * org.onap.dmaap
4  * * ===========================================================================
5  * * Copyright © 2017 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  * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
21  * *
22  ******************************************************************************/
23
24
25 package org.onap.dmaap.datarouter.node;
26
27 import static com.att.eelf.configuration.Configuration.MDC_SERVER_FQDN;
28 import static com.att.eelf.configuration.Configuration.MDC_SERVER_IP_ADDRESS;
29 import static com.att.eelf.configuration.Configuration.MDC_SERVICE_NAME;
30
31 import java.security.*;
32 import java.io.*;
33 import java.util.*;
34 import java.security.cert.*;
35 import java.net.*;
36 import java.text.*;
37
38 import org.apache.commons.codec.binary.Base64;
39 import org.apache.log4j.Logger;
40 import org.onap.dmaap.datarouter.node.eelf.EelfMsgs;
41 import org.slf4j.MDC;
42
43 import com.att.eelf.configuration.EELFLogger;
44 import com.att.eelf.configuration.EELFManager;
45
46 /**
47  * Utility functions for the data router node
48  */
49 public class NodeUtils {
50     private static EELFLogger eelflogger = EELFManager.getInstance().getLogger("org.onap.dmaap.datarouter.node.NodeUtils");
51     private static Logger logger = Logger.getLogger("org.onap.dmaap.datarouter.node.NodeUtils");
52     private static SimpleDateFormat logdate;
53
54     static {
55         logdate = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
56         logdate.setTimeZone(TimeZone.getTimeZone("GMT"));
57     }
58
59     private NodeUtils() {
60     }
61
62     /**
63      * Base64 encode a byte array
64      *
65      * @param raw The bytes to be encoded
66      * @return The encoded string
67      */
68     public static String base64Encode(byte[] raw) {
69         return (Base64.encodeBase64String(raw));
70     }
71
72     /**
73      * Given a user and password, generate the credentials
74      *
75      * @param user     User name
76      * @param password User password
77      * @return Authorization header value
78      */
79     public static String getAuthHdr(String user, String password) {
80         if (user == null || password == null) {
81             return (null);
82         }
83         return ("Basic " + base64Encode((user + ":" + password).getBytes()));
84     }
85
86     /**
87      * Given a node name, generate the credentials
88      *
89      * @param node Node name
90      */
91     public static String getNodeAuthHdr(String node, String key) {
92         try {
93             MessageDigest md = MessageDigest.getInstance("SHA");
94             md.update(key.getBytes());
95             md.update(node.getBytes());
96             md.update(key.getBytes());
97             return (getAuthHdr(node, base64Encode(md.digest())));
98         } catch (Exception e) {
99             return (null);
100         }
101     }
102
103     /**
104      * Given a keystore file and its password, return the value of the CN of the first private key entry with a certificate.
105      *
106      * @param kstype The type of keystore
107      * @param ksfile The file name of the keystore
108      * @param kspass The password of the keystore
109      * @return CN of the certificate subject or null
110      */
111     public static String getCanonicalName(String kstype, String ksfile, String kspass) {
112         try {
113             KeyStore ks = KeyStore.getInstance(kstype);
114             ks.load(new FileInputStream(ksfile), kspass.toCharArray());
115             return (getCanonicalName(ks));
116         } catch (Exception e) {
117             setIpAndFqdnForEelf("getCanonicalName");
118             eelflogger.error(EelfMsgs.MESSAGE_KEYSTORE_LOAD_ERROR, ksfile, e.toString());
119             logger.error("NODE0401 Error loading my keystore file + " + ksfile + " " + e.toString(), e);
120             return (null);
121         }
122     }
123
124     /**
125      * Given a keystore, return the value of the CN of the first private key entry with a certificate.
126      *
127      * @param ks The KeyStore
128      * @return CN of the certificate subject or null
129      */
130     public static String getCanonicalName(KeyStore ks) {
131         try {
132             Enumeration<String> aliases = ks.aliases();
133             while (aliases.hasMoreElements()) {
134                 String s = aliases.nextElement();
135                 if (ks.entryInstanceOf(s, KeyStore.PrivateKeyEntry.class)) {
136                     X509Certificate c = (X509Certificate) ks.getCertificate(s);
137                     if (c != null) {
138                         String subject = c.getSubjectX500Principal().getName();
139                         String[] parts = subject.split(",");
140                         if (parts.length < 1) {
141                             return (null);
142                         }
143                         subject = parts[0].trim();
144                         if (!subject.startsWith("CN=")) {
145                             return (null);
146
147                         }
148                         return (subject.substring(3));
149                     }
150                 }
151             }
152         } catch (Exception e) {
153             logger.error("NODE0402 Error extracting my name from my keystore file " + e.toString(), e);
154         }
155         return (null);
156     }
157
158     /**
159      * Given a string representation of an IP address, get the corresponding byte array
160      *
161      * @param ip The IP address as a string
162      * @return The IP address as a byte array or null if the address is invalid
163      */
164     public static byte[] getInetAddress(String ip) {
165         try {
166             return (InetAddress.getByName(ip).getAddress());
167         } catch (Exception e) {
168         }
169         return (null);
170     }
171
172     /**
173      * Given a uri with parameters, split out the feed ID and file ID
174      */
175     public static String[] getFeedAndFileID(String uriandparams) {
176         int end = uriandparams.length();
177         int i = uriandparams.indexOf('#');
178         if (i != -1 && i < end) {
179             end = i;
180         }
181         i = uriandparams.indexOf('?');
182         if (i != -1 && i < end) {
183             end = i;
184         }
185         end = uriandparams.lastIndexOf('/', end);
186         if (end < 2) {
187             return (null);
188         }
189         i = uriandparams.lastIndexOf('/', end - 1);
190         if (i == -1) {
191             return (null);
192         }
193         return (new String[]{uriandparams.substring(i + 1, end - 1), uriandparams.substring(end + 1)});
194     }
195
196     /**
197      * Escape fields that might contain vertical bar, backslash, or newline by replacing them with backslash p, backslash e and backslash n.
198      */
199     public static String loge(String s) {
200         if (s == null) {
201             return (s);
202         }
203         return (s.replaceAll("\\\\", "\\\\e").replaceAll("\\|", "\\\\p").replaceAll("\n", "\\\\n"));
204     }
205
206     /**
207      * Undo what loge does.
208      */
209     public static String unloge(String s) {
210         if (s == null) {
211             return (s);
212         }
213         return (s.replaceAll("\\\\p", "\\|").replaceAll("\\\\n", "\n").replaceAll("\\\\e", "\\\\"));
214     }
215
216     /**
217      * Format a logging timestamp as yyyy-mm-ddThh:mm:ss.mmmZ
218      */
219     public static String logts(long when) {
220         return (logts(new Date(when)));
221     }
222
223     /**
224      * Format a logging timestamp as yyyy-mm-ddThh:mm:ss.mmmZ
225      */
226     public static synchronized String logts(Date when) {
227         return (logdate.format(when));
228     }
229
230     /* Method prints method name, server FQDN and IP Address of the machine in EELF logs
231      * @Method - setIpAndFqdnForEelf - Rally:US664892
232      * @Params - method, prints method name in EELF log.
233      */
234     public static void setIpAndFqdnForEelf(String method) {
235         MDC.clear();
236         MDC.put(MDC_SERVICE_NAME, method);
237         try {
238             MDC.put(MDC_SERVER_FQDN, InetAddress.getLocalHost().getHostName());
239             MDC.put(MDC_SERVER_IP_ADDRESS, InetAddress.getLocalHost().getHostAddress());
240         } catch (Exception e) {
241             e.printStackTrace();
242         }
243
244     }
245
246
247 }