1 /*******************************************************************************
\r
2 * ============LICENSE_START====================================================
\r
4 * * ===========================================================================
\r
5 * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
\r
6 * * Copyright © 2017 Amdocs
\r
7 * * ===========================================================================
\r
8 * * Licensed under the Apache License, Version 2.0 (the "License");
\r
9 * * you may not use this file except in compliance with the License.
\r
10 * * You may obtain a copy of the License at
\r
12 * * http://www.apache.org/licenses/LICENSE-2.0
\r
14 * * Unless required by applicable law or agreed to in writing, software
\r
15 * * distributed under the License is distributed on an "AS IS" BASIS,
\r
16 * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
17 * * See the License for the specific language governing permissions and
\r
18 * * limitations under the License.
\r
19 * * ============LICENSE_END====================================================
\r
21 * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
\r
23 ******************************************************************************/
\r
24 package com.att.cadi.cm;
\r
26 import java.io.File;
\r
27 import java.io.FileOutputStream;
\r
28 import java.io.FileWriter;
\r
29 import java.io.IOException;
\r
30 import java.io.PrintStream;
\r
31 import java.io.PrintWriter;
\r
32 import java.security.KeyStore;
\r
33 import java.util.ArrayList;
\r
34 import java.util.HashMap;
\r
35 import java.util.List;
\r
36 import java.util.Map;
\r
38 import com.att.cadi.CadiException;
\r
39 import com.att.cadi.Symm;
\r
40 import com.att.cadi.config.Config;
\r
41 import com.att.cadi.util.Chmod;
\r
42 import com.att.inno.env.Trans;
\r
43 import com.att.inno.env.util.Chrono;
\r
45 import certman.v1_0.Artifacts.Artifact;
\r
46 import certman.v1_0.CertInfo;
\r
48 public abstract class ArtifactDir implements PlaceArtifact {
\r
50 protected static final String C_R = "\n";
\r
52 private List<String> encodeds = new ArrayList<String>();
\r
55 // This checks for multiple passes of Dir on the same objects. Run clear after done.
\r
56 protected static Map<String,Object> processed = new HashMap<String,Object>();
\r
60 * Note: Derived Classes should ALWAYS call "super.place(cert,arti)" first, and
\r
61 * then "placeProperties(arti)" just after they implement
\r
64 public final boolean place(Trans trans, CertInfo certInfo, Artifact arti) throws CadiException {
\r
68 // Obtain/setup directory as required
\r
69 dir = new File(arti.getDir());
\r
70 if(processed.get("dir")==null) {
\r
72 Chmod.to755.chmod(dir);
\r
74 throw new CadiException("Could not create " + dir);
\r
78 // Also place cm_url and Host Name
\r
79 addProperty(Config.CM_URL,trans.getProperty(Config.CM_URL));
\r
80 addProperty(Config.HOSTNAME,arti.getMachine());
\r
82 symm = (Symm)processed.get("symm");
\r
85 File f = new File(dir,arti.getAppName() + ".keyfile");
\r
87 write(f,Chmod.to400,Symm.baseCrypt().keygen());
\r
89 symm = Symm.obtain(f);
\r
91 addEncProperty("ChallengePassword", certInfo.getChallenge());
\r
93 processed.put("symm",symm);
\r
96 _place(trans, certInfo,arti);
\r
98 placeProperties(arti);
\r
100 processed.put("dir",dir);
\r
102 } catch (Exception e) {
\r
103 throw new CadiException(e);
\r
109 * Derived Classes implement this instead, so Dir can process first, and write any Properties last
\r
113 * @throws CadiException
\r
115 protected abstract boolean _place(Trans trans, CertInfo certInfo, Artifact arti) throws CadiException;
\r
117 protected void addProperty(String tag, String value) throws IOException {
\r
118 StringBuilder sb = new StringBuilder();
\r
122 encodeds.add(sb.toString());
\r
125 protected void addEncProperty(String tag, String value) throws IOException {
\r
126 StringBuilder sb = new StringBuilder();
\r
129 sb.append("enc:???");
\r
130 sb.append(symm.enpass(value));
\r
131 encodeds.add(sb.toString());
\r
134 protected void write(File f, Chmod c, String ... data) throws IOException {
\r
135 f.setWritable(true,true);
\r
137 FileOutputStream fos = new FileOutputStream(f);
\r
138 PrintStream ps = new PrintStream(fos);
\r
140 for(String s : data) {
\r
149 protected void write(File f, Chmod c, byte[] bytes) throws IOException {
\r
150 f.setWritable(true,true);
\r
152 FileOutputStream fos = new FileOutputStream(f);
\r
161 protected void write(File f, Chmod c, KeyStore ks, char[] pass ) throws IOException, CadiException {
\r
162 f.setWritable(true,true);
\r
164 FileOutputStream fos = new FileOutputStream(f);
\r
166 ks.store(fos, pass);
\r
167 } catch (Exception e) {
\r
168 throw new CadiException(e);
\r
176 private void validate(Artifact a) throws CadiException {
\r
177 StringBuilder sb = new StringBuilder();
\r
178 if(a.getDir()==null) {
\r
179 sb.append("File Artifacts require a path");
\r
182 if(a.getAppName()==null) {
\r
183 if(sb.length()>0) {
\r
186 sb.append("File Artifacts require an appName");
\r
189 if(sb.length()>0) {
\r
190 throw new CadiException(sb.toString());
\r
194 private boolean placeProperties(Artifact arti) throws CadiException {
\r
195 if(encodeds.size()==0) {
\r
198 boolean first=processed.get("dir")==null;
\r
200 File f = new File(dir,arti.getAppName()+".props");
\r
205 f.setWritable(true);
\r
208 // Append if not first
\r
209 PrintWriter pw = new PrintWriter(new FileWriter(f,!first));
\r
213 for(int i=0;i<60;++i) {
\r
217 pw.println("# Properties Generated by AT&T Certificate Manager");
\r
219 pw.println(System.getProperty("user.name"));
\r
221 pw.println(Chrono.dateStamp());
\r
222 pw.println("# @copyright 2016, AT&T");
\r
223 for(int i=0;i<60;++i) {
\r
227 for(String prop : encodeds) {
\r
228 if(prop.startsWith("cm_") || prop.startsWith(Config.HOSTNAME)) {
\r
235 for(String prop : encodeds) {
\r
236 if(prop.startsWith("cadi")) {
\r
243 Chmod.to400.chmod(f);
\r
247 f = new File(dir,arti.getAppName()+".chal");
\r
251 pw = new PrintWriter(new FileWriter(f));
\r
253 for(String prop : encodeds) {
\r
254 if(prop.startsWith("Challenge")) {
\r
261 Chmod.to400.chmod(f);
\r
263 } catch(Exception e) {
\r
264 throw new CadiException(e);
\r
269 public static void clear() {
\r