diff options
Diffstat (limited to 'base/console/src/com/netscape/admin/certsrv/task/CMSRequestCert.java')
-rw-r--r-- | base/console/src/com/netscape/admin/certsrv/task/CMSRequestCert.java | 421 |
1 files changed, 421 insertions, 0 deletions
diff --git a/base/console/src/com/netscape/admin/certsrv/task/CMSRequestCert.java b/base/console/src/com/netscape/admin/certsrv/task/CMSRequestCert.java new file mode 100644 index 000000000..8b3cfef6b --- /dev/null +++ b/base/console/src/com/netscape/admin/certsrv/task/CMSRequestCert.java @@ -0,0 +1,421 @@ +// --- 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.task; + +import java.util.*; +import javax.swing.*; +import com.netscape.management.client.*; +import com.netscape.admin.certsrv.*; +import com.netscape.admin.certsrv.config.install.*; +import com.netscape.certsrv.common.*; +import com.netscape.management.client.util.*; +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; +import javax.swing.event.*; +import com.netscape.management.client.console.*; +import com.netscape.management.client.topology.*; +import com.netscape.management.client.comm.*; +import java.net.*; +import java.io.*; +import netscape.ldap.*; +import netscape.ldap.util.*; + +/** + * Perform certificate request. + * + * @author Michelle Zhao + * @version $Revision$, $Date$ + */ +public class CMSRequestCert extends CGITask { + + /*========================================================== + * variables + *==========================================================*/ + private static final String PREFIX = "CGITASK"; + private String mCgiTask = null; // CGI task to call + private InstallWizardInfo mWizardInfo; + private String mPolicyMsg = null; + + /*========================================================== + * constructors + *==========================================================*/ + public CMSRequestCert() { + super(); + } + + /*========================================================== + * public methods + *==========================================================*/ + public void initialize(InstallWizardInfo info) { + Debug.println("CMSRequestCert: initialize()"); + _consoleInfo = info.getAdminConsoleInfo(); + + // the results coming back from the daemon will be added to the + // wizard information. + mWizardInfo = info; + } + + /** + * Collect the data in name value pairs format and then send them to the + * cgi process. + */ + public boolean requestCert(Hashtable data) { + boolean status = false; // return value + + try { + status = run(data); + } catch (Exception e) { + Debug.println("Unexpected Error"+e.toString()); + status = false; + } + Debug.println("CMSRequestCert: requestCert() after run status=" + + status + " mSuccess=" + mSuccess); + + return mSuccess; + } + + /** + * the operation is finished after we receive the http stream + */ + public void replyHandler(InputStream response, CommRecord cr) { + mSuccess = false; + + try { + BufferedReader rspStream = + new BufferedReader(new InputStreamReader(response, "UTF8")); + String rspStr; + + Debug.println("CMSRequestCert: replyHandler() - start"); + mErrorMsg = mResource.getString("REQUESTRESULTWIZARD_TEXT_ERRORDESC_LABEL"); + while ((rspStr = rspStream.readLine()) != null && !mSuccess) + { + Debug.println("RequestCert: replyHandler() - read [" + rspStr + "]"); + // NMC_ messages are parsed, but not shown to the user + parse2(rspStr); + } + mErrorMsg = mErrorMsg + + mResource.getString("REQUESTRESULTWIZARD_TEXT_ERROREND_LABEL"); + String requestStatus =mWizardInfo.getRequestStatus(); + if ((mWizardInfo.getRequestError() != null) && + mWizardInfo.getRequestError().equals("true")) { + mWizardInfo.setRequestError(mErrorMsg); + mErrorMsg = null; + mSuccess = true; + } else if (requestStatus == null) { + // agent port, Unauthorizied access + mErrorMsg = mResource.getString("CGITASK_DIALOG_WRONGSERVER_MESSAGE"); + } else if (requestStatus.equals("5")) { + // rejected + if (mPolicyMsg == null) { + mWizardInfo.setRequestError(mResource.getString("REQUESTRESULTWIZARD_TEXT_NODETAIL_LABEL")); + } else { + mWizardInfo.setRequestError(mPolicyMsg); + mPolicyMsg = null; + } + mSuccess = true; + } + // Use the same format for other status:success,pending,svcPending + } catch (Exception e) { + Debug.println("RequestCert.Exception : " + e.toString()); + } + + Debug.println("RequestCert.replyHandler: finished, mSuccess=" + + mSuccess); + + finish(); + } + + + private void parse2(String s) + { + int iIndex; + Debug.println("Parse2 input: " + s); + if ((iIndex=s.indexOf("errorCode")) != (-1)) + { + String errorCode = s.substring(s.indexOf("\"") + 1, + s.lastIndexOf("\"")); + Debug.println("errorCode: " + errorCode); + if (errorCode.equals("2")) { // pending + mWizardInfo.setRequestError("false"); + mSuccess = true; + mWizardInfo.setRequestStatus("0"); + } else if (errorCode.equals("1")) { // error + mWizardInfo.setRequestError("true"); + mWizardInfo.setRequestStatus("5"); + mSuccess = false; + } else { + mWizardInfo.setRequestError("true"); + mWizardInfo.setRequestStatus("0"); + mSuccess = false; + } + } + else if ((iIndex=s.indexOf("requestList.requestId")) != (-1)) + { + String requestId = s.substring(s.indexOf("\"") + 1, + s.lastIndexOf("\"")); + Debug.println("requestId: " + requestId); + mWizardInfo.setRequestID(requestId); + } + else if ((iIndex=s.indexOf("errorReason")) != (-1)) + { + String errorReason = s.substring(s.indexOf("\"") + 1, + s.lastIndexOf("\"")); + Debug.println("errorReason: " + errorReason); + mErrorMsg = mErrorMsg + "\n " + errorReason; + } + } + + + + /** + * return the value for the given keyword in the reply + */ + private void parse(String s) { + String sName; + String sValue = null; + int iIndex; + + Debug.println("Parse input: " + s); + + if ((iIndex=s.indexOf("requestStatus = ")) != (-1)) + { + sName = s.substring(iIndex + 17).trim(); + if ((iIndex = sName.indexOf("\"")) != (-1)) + sValue = sName.substring(0,iIndex); + + Debug.println("Parse input: name=" + sName + " output=" + + sValue + " index=" + iIndex); + if (sValue != null && !sValue.equals("")) { + mWizardInfo.setRequestStatus(sValue); + if (sValue.equals("2") || sValue.equals("3") + || sValue.equals("4")){ + //mSuccess = true; + } + } + } + else if ((iIndex=s.indexOf("requestId = ")) != (-1)) + { + sName = s.substring(iIndex + 13).trim(); + if ((iIndex = sName.indexOf("\"")) != (-1)) + sValue = sName.substring(0,iIndex); + + Debug.println("Parse input: name=" + sName + " output=" + + sValue + " index=" + iIndex); + if (sValue != null && !sValue.equals("")) { + mWizardInfo.setRequestID(sValue); + //mSuccess = true; + } + } + else if ((iIndex=s.indexOf("unexpectedError = ")) != (-1)) + { + sName = s.substring(iIndex + 19).trim(); + if ((iIndex = sName.indexOf("\"")) != (-1)) + sValue = sName.substring(0,iIndex); + + Debug.println("Parse input: name=" + sName + " output=" + + sValue + " index=" + iIndex); + if (sValue != null && !sValue.equals("")) { + mErrorMsg = mErrorMsg + "\n " + sValue; + mWizardInfo.setRequestError("true"); + } + } + else if ((iIndex=s.indexOf("errorDetails = ")) != (-1)) + { + sName = s.substring(iIndex + 16).trim(); + if ((iIndex = sName.indexOf("\"")) != (-1)) + sValue = sName.substring(0,iIndex); + + Debug.println("Parse input: name=" + sName + " output=" + + sValue + " index=" + iIndex); + if (sValue != null && !sValue.equals("")) { + mErrorMsg = mErrorMsg + "\n " + sValue; + mWizardInfo.setRequestError("true"); + } + } + else if ((iIndex=s.indexOf("result.recordSet.length = ")) != (-1)) + { + sName = s.substring(iIndex + 27).trim(); + if ((iIndex = sName.indexOf("\"")) != (-1)) + sValue = sName.substring(0,iIndex); + + Debug.println("Parse input: name=" + sName + " output=" + + sValue + " index=" + iIndex); + if (sValue != null && !sValue.equals("") && !sValue.equals("0")) { + mErrorMsg = mErrorMsg + mResource.getString("REQUESTRESULTWIZARD_TEXT_DETAIL_LABEL");; + } + } + else if ((iIndex=s.indexOf("errorDescription = ")) != (-1)) + { + sName = s.substring(iIndex + 20).trim(); + if ((iIndex = sName.indexOf("\"")) != (-1)) + sValue = sName.substring(0,iIndex); + + Debug.println("Parse input: name=" + sName + " output=" + + sValue + " index=" + iIndex); + if (sValue != null && !sValue.equals("")) { + mErrorMsg = mErrorMsg + "\n " + sValue; + } + } + else if ((iIndex=s.indexOf("record.policyMessage=")) != (-1)) + { + sName = s.substring(iIndex + 22).trim(); + if ((iIndex = sName.indexOf("\"")) != (-1)) + sValue = sName.substring(0,iIndex); + + Debug.println("Parse input: name=" + sName + " output=" + + sValue + " index=" + iIndex); + if (sValue != null && !sValue.equals("")) { + if (mPolicyMsg == null) + mPolicyMsg = " " + sValue; + else + mPolicyMsg = mPolicyMsg + "\n " + sValue; + } + } + else if ((iIndex=s.indexOf("/HTML")) != (-1)) + mSuccess = true; // no need to parse further + + Debug.println("Parse finished"); + } + + /** + * Send an http request to the server. Return true if we're sure it + * succeeded, otherwise false. + */ + boolean run(Hashtable args) { + + String fullCmd = mWizardInfo.getCMEEType() + "://" + + mWizardInfo.getCMHost() + ":" + + mWizardInfo.getCMEEPort() + "/ca/ee/ca/profileSubmit"; + + HttpManager h = new HttpManager(); + // tell the http manager to use UTF8 encoding + h.setSendUTF8(true); + + try { + mSuccess = false; + mFinished = false; + + ByteArrayInputStream data = null; + if (args != null && !args.isEmpty()) + data = encode(args); + Debug.println( "Posting " + fullCmd ); + // tell the http manager to notify us immediately of replies + // if we're using async mode + int flags = 0; + CommRecord postResult = null; + if (data == null) + postResult = h.post(new URL(fullCmd), this, null, null, 0, + flags); + else + postResult = h.post(new URL(fullCmd), this, null, data, data.available(), + flags); + + /* + AdmTask admTask = new AdmTask(new URL(fullCmd),null,null); + admTask.setArguments(args); + admTask.exec(h); + */ + + awaitSuccess(); + + Object postStatus = postResult.getStatus(); + //Debug.println("status: " + postStatus); + if (postStatus != null && + postStatus.toString().equals(CommRecord.ERROR)) { + // If it happens to be it's not CMS server who is listening + // e.g. the cms agent port or yahoo server + // you may get here + mErrorMsg = mResource.getString("CGITASK_DIALOG_WRONGSERVER_MESSAGE"); + } + + Debug.println( "Command executed: " + fullCmd ); + } catch (Exception e) { + // This is very fragile. We have to handle it case by case. + // Handled the ones that I know of properly, but there may + // be other cases that I don't know, display the exception + // detail. + String detail = e.toString(); + if (detail == null || detail.trim().equals("")) + detail = "No detail of the exception provided."; + if ( e instanceof java.net.ConnectException ) { + mErrorMsg = mResource.getString("CGITASK_DIALOG_CMSDOWN_MESSAGE"); + //CMSAdminUtil.showMessageDialog(mResource, + // PREFIX, "CMSDOWN", CMSAdminUtil.ERROR_MESSAGE); + } else if ( e instanceof java.net.NoRouteToHostException ) { + // java.net.NoRouteToHostException: Connection timed out + // It takes 3-4 mins to time out, looks like hang to impatient + // ones. https://www.netscape.com:443 + mErrorMsg = + mResource.getString("CGITASK_DIALOG_CMSDOWN_MESSAGE") +; + } else if ( e instanceof java.net.SocketException ) { + if (detail.indexOf("Socket write failed") > -1){ + // retry + run(args); + } else if ((detail.indexOf("Connection shutdown") > -1) || + (detail.indexOf("Connection timed out") > -1) ) { + // java.net.NoRouteToHostException: Connection timed out + // double insurance + mErrorMsg = + mResource.getString("CGITASK_DIALOG_CMSDOWN_MESSAGE"); + } else { + // need to determine case by case + mErrorMsg = + mResource.getString("CGITASK_DIALOG_CMSDOWN_MESSAGE")+ " java.net.SocketException: " + detail; + } + + } else if ( e instanceof java.io.IOException ) { + if (e.toString().indexOf("Broken pipe") > -1){ + // broken pipe, retry + run(args); + } else if (detail.indexOf("Unknown public-key algorithm") +> -1) { + mErrorMsg = + mResource.getString("CGITASK_DIALOG_UNKNOWNALG_MESSAGE") +; + } else if (detail.indexOf("End of input") > -1) { + // http://www.netscape.com:80/enrollment + mErrorMsg = + mResource.getString("CGITASK_DIALOG_CMSDOWN_MESSAGE") +; + } else if (detail.indexOf("Certificate fingerprint =") > -1) { + // reject the cms certificate + mErrorMsg = + mResource.getString("CGITASK_DIALOG_REJECTCERT_MESSAGE"); + } else { + // need to determine case by case + mErrorMsg = + mResource.getString("CGITASK_DIALOG_CMSDOWN_MESSAGE" +) + " java.io.IOException: " + detail; + } + } else { + // need to determine case by case + mErrorMsg = + mResource.getString("CGITASK_DIALOG_CMSDOWN_MESSAGE") ++ " Exception: " + detail; + } + Debug.println( "Command " + fullCmd + " failed: " + e ); + } + return mSuccess; + } + +} + + + |