// --- BEGIN COPYRIGHT BLOCK --- // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; version 2 of the License. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License along // with this program; if not, write to the Free Software Foundation, Inc., // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. // // (C) 2007 Red Hat, Inc. // All rights reserved. // --- END COPYRIGHT BLOCK --- package com.netscape.admin.certsrv.security; /** * * Parse the response that was sent back by the cgi * */ import java.util.*; import java.io.*; import com.netscape.management.client.util.Debug; //this class need some optimization.... class Response { String _response; String _cert = ""; Vector _messages = new Vector(); Vector _certList = null; CertInfo _certInfo = null; Hashtable _certInstInfo = null; Hashtable _ssl2Preference = null; Hashtable _ssl3Preference = null; String startCert = "-----BEGIN NEW CERTIFICATE REQUEST-----"; String endCert = "-----END NEW CERTIFICATE REQUEST-----"; String startCertList = "-----BEGIN CERT LIST-----"; String endCertList = "-----END CERT LIST-----"; String startCertInfo = "-----BEGIN CERTIFICATE INFO-----"; String endCertInfo = "-----END CERTIFICATE INFO-----"; String startCRLCertInfo = "-----BEGIN CRL INFO-----"; String endCRLCertInfo = "-----END CRL INFO-----"; String startCertInstInfo = "-----BEGIN CERTIFICATE INSTALL INFO-----"; String endCertInstInfo = "-----END CERTIFICATE INSTALL INFO-----"; String startCRLCertInstInfo = "-----BEGIN CRL INSTALL INFO-----"; String endCRLCertInstInfo = "-----END CRL INSTALL INFO-----"; boolean _fCert = false, _fCertList = false, _fCertInfo = false, _fCertInstInfo = false; boolean _fsecurityDomestic = false, _fsecurityFortezza = false; void parseCertificate(String response) { if (response.indexOf(startCert) != -1) { _cert = response.substring(response.indexOf(startCert), response.indexOf(endCert) + endCert.length()); _fCert = true; } } void parseCertificateList(String response) { if (response.indexOf(startCertList) != -1) { _certList = new Vector(); try { BufferedReader stream = new BufferedReader(new StringReader(response)); while (!(stream.readLine().equals(startCertList))) { } String line; while (!((line = stream.readLine()).equals(endCertList))) { //need to hack the string that return by the NS secutiry code. //it assumes we are working with html line = urlDecode(line); StringTokenizer token = new StringTokenizer(line, "=;\n", false); Debug.print(line); String certName = "", certType = "", certExpire = ""; try { certName = token.nextToken(); certType = token.nextToken(); certExpire = token.nextToken(); } catch (NoSuchElementException noToken) { } _certList.addElement( new CertBasicInfo(certName, certType, certExpire)); } } catch (IOException e) { Debug.println(e.getMessage()); } _fCertList = true; } } void parseCertificateInfo(String response) { if ((response.indexOf(startCertInfo) != -1) || (response.indexOf(startCRLCertInfo) != -1)) { try { BufferedReader stream = new BufferedReader(new StringReader(response)); String line; while (! (((line = stream.readLine()).equals(startCertInfo)) || (line.equals(startCRLCertInfo)))) { } String issuer = "", subject = "", serialNumber = "", version = "", validFrom = "", validTo = ""; String fingerPrint = "", trustCert = "", certName = "", certDeleted = "0", certTitle = ""; while (!((line = stream.readLine()).equals(endCertInfo)) && !(line.equals(endCRLCertInfo))) { //need to hack the string that was returned by the NS secutiry code. //it assumes we are working with html line = urlDecode(line); StringTokenizer token = new StringTokenizer(line, "=\n", false); Debug.print(line); try { String keyWord = token.nextToken(); if (keyWord.equals("ISSUER")) { //have to hack again because of the stupid html in the data issuer = KeyCertUtility.replace( token.nextToken(), "
", "\n"); ; } else if (keyWord.equals("SUBJECT")) { subject = KeyCertUtility.replace( token.nextToken(), "
", "\n"); ; } else if (keyWord.equals("SERIALNUMBER")) { serialNumber = token.nextToken(); } else if (keyWord.equals("VERSION")) { version = token.nextToken(); } else if (keyWord.equals("NOTBEFORE")) { validFrom = token.nextToken(); } else if (keyWord.equals("NOTAFTER")) { validTo = token.nextToken(); } else if (keyWord.equals("FINGERPRINT")) { fingerPrint = token.nextToken(); } else if (keyWord.equals("TRUSTED")) { trustCert = token.nextToken(); } else if (keyWord.equals("CERTNAME")) { certName = token.nextToken(); } else if (keyWord.equals("CERTDELETED")) { certDeleted = token.nextToken(); } else if (keyWord.equals("CERTTITLE")) { certTitle = token.nextToken(); } } catch (NoSuchElementException noToken) { Debug.print(noToken.getMessage()); } } _certInfo = new CertInfo(certName, issuer, subject, serialNumber, version, validFrom, validTo, fingerPrint, trustCert, certDeleted, certTitle); } catch (IOException e) { Debug.println(e.getMessage()); } _fCertInfo = true; } } void parseCertificateInstInfo(String response) { if ((response.indexOf(startCertInstInfo) != -1) || (response.indexOf(startCRLCertInstInfo) != -1)) { _certInstInfo = new Hashtable(); try { BufferedReader stream = new BufferedReader(new StringReader(response)); String line; while (! (((line = stream.readLine()).equals(startCertInstInfo)) || (line.equals(startCRLCertInstInfo)))) { } while (! ((line = stream.readLine()).equals(endCertInstInfo)) && !(line.equals(endCRLCertInstInfo))) { StringTokenizer token = new StringTokenizer(line, "=\n", false); Debug.print(line); try { String key = token.nextToken(); String val = token.nextToken(); _certInstInfo.put(key, val); } catch (NoSuchElementException noToken) { Debug.print(noToken.getMessage()); } } } catch (IOException e) { Debug.println(e.getMessage()); } _fCertInstInfo = true; } } public static String urlDecode(String urlString) { ByteArrayOutputStream out = new ByteArrayOutputStream(urlString.length()); for (int i = 0; i < urlString.length(); i++) { int c = (int) urlString.charAt(i); if (c == '+') { out.write(' '); } else if (c == '%') { int c1 = Character.digit(urlString.charAt(++i), 16); int c2 = Character.digit(urlString.charAt(++i), 16); out.write((char)(c1 * 16 + c2)); } else { out.write(c); } } return out.toString(); } Vector familyList; public Vector parseFamilyList(String response) { familyList = new Vector(); _fsecurityFortezza = false; _fsecurityDomestic = false; try { BufferedReader stream = new BufferedReader(new StringReader(response)); String line = null; while (!(((line = stream.readLine()).startsWith("NULL")))) { String cipherName = line.substring(0, line.indexOf("=")); StringTokenizer st = new StringTokenizer( line.substring(line.indexOf("=") + 1, line.length()), ",\n", false); Vector tokenList = new Vector(); Hashtable tokenCertList = new Hashtable(); while (st.hasMoreTokens()) { String token = st.nextToken(); tokenList.addElement(token); tokenCertList.put(token, ""); } Enumeration e = tokenList.elements(); while (e.hasMoreElements()) { String token = (String)(e.nextElement()); line = stream.readLine(); String certListString = line.substring( (token + "-certs=").length(), line.length()); StringTokenizer certNames = new StringTokenizer(certListString, ",\n", false); Vector certList = new Vector(); while (certNames.hasMoreTokens()) { certList.addElement(certNames.nextToken()); } tokenCertList.put(token, certList); } familyList.addElement( new CipherEntry(cipherName, tokenCertList)); } if ((line = stream.readLine()).startsWith("security")) { if (line.endsWith("fortezza")) { _fsecurityFortezza = true; _fsecurityDomestic = true; } if (line.endsWith("domestic")) { _fsecurityDomestic = true; } } } catch (Exception e) { Debug.println("com.netscape.admin.certsrv.security.response:"+ e.toString()); } return familyList; } Vector moduleList; public Vector parseModuleList(String response) { moduleList = new Vector(); try { BufferedReader stream = new BufferedReader(new StringReader(response)); String line = stream.readLine(); StringTokenizer st = new StringTokenizer( line.substring(line.indexOf("=") + 1, line.length()), ",\n", false); while (st.hasMoreTokens()) moduleList.addElement(st.nextToken()); } catch (Exception e) {/*System.out.println(e);*/ } return moduleList; } public Response(String response) { //Debug.print(response); if (response == null) { return; } _response = response; int beginIndex = 0, endIndex = 0; while (true) { beginIndex = response.indexOf(Message.NMC_STATUS, endIndex); endIndex = response.indexOf(Message.NMC_STATUS, beginIndex + Message.NMC_STATUS.length()); if ((endIndex == -1) && (beginIndex == -1)) { break; } if (endIndex != -1) { _messages.addElement( new Message( KeyCertUtility.replace( response.substring(beginIndex, endIndex), "\r", ""))); } else { _messages.addElement( new Message( KeyCertUtility.replace( response.substring(beginIndex, response.length()), "\r", ""))); break; } } } public Vector getFamilyList() { return parseFamilyList(_response); } public Vector getModuleList() { return parseModuleList(_response); } public boolean isSecurityDomestic() { return _fsecurityDomestic; } public boolean isSecurityFortezza() { return _fsecurityFortezza; } public boolean hasCert() { parseCertificate(_response); return _fCert; } public boolean hasMessage() { return (_messages.size() > 0); } public boolean hasCertList() { parseCertificateList(_response); return _fCertList; } public boolean hasCertInfo() { parseCertificateInfo(_response); return _fCertInfo; } public boolean hasCertInstInfo() { parseCertificateInstInfo(_response); return _fCertInstInfo; } public String getCert() { return _fCert ? _cert : ""; } public Vector getMessages() { return _messages; } public Vector getCertList() { return _fCertList ? _certList : (new Vector()); } public CertInfo getCertInfo() { return _certInfo; } public Hashtable getCertInstInfo() { return _certInstInfo; } public String getServerResponse() { return _response; } }