summaryrefslogtreecommitdiffstats
path: root/base/kra/shared/webapps/kra/agent
diff options
context:
space:
mode:
Diffstat (limited to 'base/kra/shared/webapps/kra/agent')
-rw-r--r--base/kra/shared/webapps/kra/agent/GenError.template78
-rw-r--r--base/kra/shared/webapps/kra/agent/GenPending.template61
-rw-r--r--base/kra/shared/webapps/kra/agent/GenRejected.template82
-rw-r--r--base/kra/shared/webapps/kra/agent/GenSuccess.template44
-rw-r--r--base/kra/shared/webapps/kra/agent/GenSvcPending.template61
-rw-r--r--base/kra/shared/webapps/kra/agent/GenUnauthorized.template42
-rw-r--r--base/kra/shared/webapps/kra/agent/GenUnexpectedError.template68
-rw-r--r--base/kra/shared/webapps/kra/agent/cms-funcs.js538
-rw-r--r--base/kra/shared/webapps/kra/agent/funcs.js686
-rw-r--r--base/kra/shared/webapps/kra/agent/header.template82
-rw-r--r--base/kra/shared/webapps/kra/agent/helpfun.js35
-rw-r--r--base/kra/shared/webapps/kra/agent/index.html23
-rw-r--r--base/kra/shared/webapps/kra/agent/index.template140
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/GrantRecovery.html46
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/ListRequests.html96
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/SrchKey.html323
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/SrchRecoverKey.html328
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/blank.html10
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/confirmRecover.html6
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/confirmRecoverBySerial.template70
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/displayBySerial.template120
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/displayBySerial2.template132
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/displayBySerialForRecovery.template239
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/examineRecovery.template109
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/finishAsyncRecovery.template101
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/finishRecovery.template101
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/frameGrant.html18
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/frameRecover.html18
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/frameRequest.html18
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/frameSearch.html18
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/frameStats.html18
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/getApprovalStatus.template102
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/getStats.template124
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/grantAsyncRecovery.template45
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/grantRecovery.template44
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/index.html18
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/menuCheck.html33
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/menuGrant.html33
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/menuRecover.html33
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/menuRequest.html33
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/menuSearch.html33
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/menuStats.html37
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/monitor.template184
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/processReq.template281
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/queryKey.template208
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/queryKeyForRecovery.template220
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/queryReq.template385
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/recoverBySerial.template76
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/srchKey.template213
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/srchKeyForRecovery.template227
-rw-r--r--base/kra/shared/webapps/kra/agent/kra/top.html48
51 files changed, 6088 insertions, 0 deletions
diff --git a/base/kra/shared/webapps/kra/agent/GenError.template b/base/kra/shared/webapps/kra/agent/GenError.template
new file mode 100644
index 000000000..00fc21da0
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/GenError.template
@@ -0,0 +1,78 @@
+<!-- --- 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.
+
+ Copyright (C) 2007 Red Hat, Inc.
+ All rights reserved.
+ --- END COPYRIGHT BLOCK --- -->
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<HTML>
+<CMS_TEMPLATE>
+
+<TITLE>DRM Agent Processing Error!</TITLE>
+
+<BODY BGCOLOR="white">
+
+<font size="+1" face="PrimaSans BT, Verdana, Arial, Helvetica, sans-serif">
+Problem Processing Your Request
+</font>
+
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" BACKGROUND="/pki/images/hr.gif" >
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+</table>
+
+<font size="-1" face="PrimaSans BT, Verdana, Arial, Helvetica, sans-serif">
+
+<SCRIPT LANGUAGE="JavaScript">
+
+document.writeln('<P>');
+document.write('The '+result.fixed.authorityName+' ');
+document.writeln('encountered a problem while processing your request. ');
+document.writeln(
+ 'The following is a detailed message of the error that occurred.');
+
+document.writeln('<P>');
+document.writeln('<BLOCKQUOTE><B><PRE>');
+if (result.fixed.errorDetails != null) {
+ document.write(result.fixed.errorDetails);
+} else {
+ document.write('No further details provided.');
+}
+document.writeln('</PRE></B></BLOCKQUOTE>');
+
+if (result != null && result.recordSet != null && result.recordSet.length > 0){
+ document.writeln('<P>');
+ document.write('Additional Information:');
+ document.writeln('<P>');
+ document.write('<BLOCKQUOTE><B><PRE>');
+ document.writeln('<UL>');
+ for (var i = 0; i < result.recordSet.length; i++) {
+ if (result.recordSet[i].errorDescription != null) {
+ document.writeln(result.recordSet[i].errorDescription);
+ }
+ }
+ document.writeln('</UL>');
+ document.write('</PRE></B></BLOCKQUOTE>');
+}
+</SCRIPT>
+
+<P>
+Please consult your local administrator for further assistance.
+The Certificate System logs may provide further information.
+
+</font>
+</BODY>
+</HTML>
+
diff --git a/base/kra/shared/webapps/kra/agent/GenPending.template b/base/kra/shared/webapps/kra/agent/GenPending.template
new file mode 100644
index 000000000..62d4316b1
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/GenPending.template
@@ -0,0 +1,61 @@
+<!-- --- 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.
+
+ Copyright (C) 2007 Red Hat, Inc.
+ All rights reserved.
+ --- END COPYRIGHT BLOCK --- -->
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<HTML>
+<CMS_TEMPLATE>
+
+<TITLE>DRM Agent Request Pending</TITLE>
+
+<BODY bgcolor="white">
+
+
+<font size="+1" face="PrimaSans BT, Verdana, Arial, Helvetica, sans-serif">
+Request Successfully Submitted
+</font>
+
+<font size="-1" face="PrimaSans BT, Verdana, Arial, Helvetica, sans-serif">
+
+<SCRIPT LANGUAGE="JavaScript">
+var authority = 'Certificate Managment System';
+if (result.fixed.authorityName != null)
+ authority = result.fixed.authorityName;
+document.writeln('<P>');
+document.write('Congratulations, your request has been successfully ');
+document.write('submitted to the '+authority+'. ');
+document.write('Your request will be processed when an authorized agent ');
+document.writeln('verifies and validates the information in your request.');
+
+document.writeln('<P>');
+document.write('Your request ID is ');
+if (result.fixed.requestId != null) {
+ document.write('<B>'+result.fixed.requestId+'</B>.');
+ document.writeln('<P>');
+ document.write('Your can check on the status of your request with ');
+ document.write('an authorized agent or local administrator ');
+ document.writeln('by referring to this request ID.');
+} else {
+ document.write('<B>not provided.</B> ');
+ document.write('<P>');
+ document.writeln('Please consult your local administrator for assistance.');
+}
+</SCRIPT>
+
+</font>
+</BODY>
+</HTML>
+
diff --git a/base/kra/shared/webapps/kra/agent/GenRejected.template b/base/kra/shared/webapps/kra/agent/GenRejected.template
new file mode 100644
index 000000000..d6c67f2c4
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/GenRejected.template
@@ -0,0 +1,82 @@
+<!-- --- 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.
+
+ Copyright (C) 2007 Red Hat, Inc.
+ All rights reserved.
+ --- END COPYRIGHT BLOCK --- -->
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<HTML>
+<CMS_TEMPLATE>
+
+<TITLE>DRM Agent Request Rejected</TITLE>
+
+<BODY bgcolor="white">
+
+<font size="+1" face="PrimaSans BT, Verdana, Arial, Helvetica, sans-serif">
+Request Rejected
+</font>
+
+<font size="-1" face="PrimaSans BT, Verdana, Arial, Helvetica, sans-serif">
+
+<SCRIPT LANGUAGE="JavaScript">
+
+var authority = 'Certificate System';
+if (result.fixed.authorityName != null) {
+ authority = result.fixed.authorityName;
+}
+
+document.writeln('<P>');
+document.write('Your request has been rejected by the '+authority+'. ' );
+document.write('This may indicate that some attributes of the request ');
+document.write('violate the policies of this '+authority+'. ');
+
+document.writeln('<P>');
+document.writeln('Violation details: ');
+
+document.writeln('<P>');
+document.writeln('<BLOCKQUOTE><B><PRE>');
+if (result == null || result.recordSet == null || result.recordSet.length == 0){
+ document.writeln('No further details provided.');
+}
+else {
+ document.writeln('<UL>');
+ for (var i = 0; i < result.recordSet.length; i++) {
+ if (result.recordSet[i].policyMessage != null) {
+ document.writeln(result.recordSet[i].policyMessage);
+ }
+ }
+ document.writeln('</UL>');
+}
+document.writeln('</PRE></B></BLOCKQUOTE>');
+
+document.writeln('<P>');
+document.write('Your request ID is ');
+if (result.fixed.requestId == null) {
+ document.write('<B>not provided</B>.');
+ document.writeln('<P>');
+ document.write(
+ 'Please consult your local administrator for further assistance.');
+} else {
+ document.write('<B>'+result.fixed.requestId+'</B>. ');
+ document.writeln('<P>');
+ document.write(
+ 'You can contact an authorized agent or local administrator for ');
+ document.writeln('further assistance by referring to the request ID.');
+}
+</SCRIPT>
+
+</font>
+</BODY>
+</HTML>
+
diff --git a/base/kra/shared/webapps/kra/agent/GenSuccess.template b/base/kra/shared/webapps/kra/agent/GenSuccess.template
new file mode 100644
index 000000000..dc3a9775f
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/GenSuccess.template
@@ -0,0 +1,44 @@
+<!-- --- 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.
+
+ Copyright (C) 2007 Red Hat, Inc.
+ All rights reserved.
+ --- END COPYRIGHT BLOCK --- -->
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<HTML>
+<!-- This template is intended to be replaced by request specific results ! -->
+<CMS_TEMPLATE>
+
+<TITLE>DRM Agent Generic Request Success</TITLE>
+
+<BODY BGCOLOR=white>
+
+<font size="+1" face="PrimaSans BT, Verdana, Arial, Helvetica, sans-serif">
+Request Successfully Submited
+</font>
+
+<font size="-1" face="PrimaSans BT, Verdana, Arial, Helvetica, sans-serif">
+
+<SCRIPT LANGUAGE="Javascript">
+var authority = 'Certificate System';
+if (request.fixed.authorityName != null)
+ authority = request.fixed.authorityName;
+
+document.writeln('<P>');
+document.write('Congratulations, your request has been successfully ');
+document.write('submitted and processed by the '+authority+'.');
+</SCRIPT>
+
+</font>
+</body>
diff --git a/base/kra/shared/webapps/kra/agent/GenSvcPending.template b/base/kra/shared/webapps/kra/agent/GenSvcPending.template
new file mode 100644
index 000000000..66a524912
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/GenSvcPending.template
@@ -0,0 +1,61 @@
+<!-- --- 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.
+
+ Copyright (C) 2007 Red Hat, Inc.
+ All rights reserved.
+ --- END COPYRIGHT BLOCK --- -->
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<HTML>
+<CMS_TEMPLATE>
+
+<TITLE>DRM Agent Request Svc Pending</TITLE>
+
+<BODY bgcolor="white">
+
+<font size="+1" face="PrimaSans BT, Verdana, Arial, Helvetica, sans-serif">
+Request Successfully Submitted
+</font>
+
+<font size="-1" face="PrimaSans BT, Verdana, Arial, Helvetica, sans-serif">
+
+<SCRIPT LANGUAGE="JavaScript">
+document.writeln('<P>');
+document.write('Your request has been successfully submitted and processed ');
+document.writeln('by the '+result.fixed.authorityName+'.');
+document.write('The '+result.fixed.authorityName+' is waiting for a remote ');
+if (result.fixed.remoteAuthorityName != null)
+ document.write(result.fixed.remoteAuthorityName);
+else
+ document.write('Certificate Manager or Data Recovery manager');
+document.write(' to fill your request.');
+
+document.writeln('<P>');
+document.write('Your request ID is ');
+if (result.fixed.requestId != null) {
+ document.write('<B>'+result.fixed.requestId+'</B>.');
+ document.write('<P>');
+ document.write('Your can check on status of your request with an '+
+ 'authorized agent or local administrator by referring '+
+ 'to this request ID.');
+} else {
+ document.write('not provided. ');
+ document.writeln('Please consult your local administrator for assistance.');
+}
+</SCRIPT>
+
+
+</font>
+</BODY>
+</HTML>
+
diff --git a/base/kra/shared/webapps/kra/agent/GenUnauthorized.template b/base/kra/shared/webapps/kra/agent/GenUnauthorized.template
new file mode 100644
index 000000000..fc137d06b
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/GenUnauthorized.template
@@ -0,0 +1,42 @@
+<!-- --- 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.
+
+ Copyright (C) 2007 Red Hat, Inc.
+ All rights reserved.
+ --- END COPYRIGHT BLOCK --- -->
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<HTML>
+<!-- This template is intended to be replaced by request specific results ! -->
+<CMS_TEMPLATE>
+
+<TITLE>DRM Agent Generic Unauthorized</TITLE>
+
+<BODY BGCOLOR=white>
+
+<font size="+1" face="PrimaSans BT, Verdana, Arial, Helvetica, sans-serif">
+Unauthorized Access
+</font>
+
+<font size="-1" face="PrimaSans BT, Verdana, Arial, Helvetica, sans-serif">
+
+<SCRIPT LANGUAGE="Javascript">
+document.writeln('<P>');
+document.write('You are not authorized for this operation.');
+document.write('<BR>');
+document.write('If you think this is an error please contact your ');
+document.writeln('local administrator for further assistance.');
+</SCRIPT>
+
+</font>
+</body>
diff --git a/base/kra/shared/webapps/kra/agent/GenUnexpectedError.template b/base/kra/shared/webapps/kra/agent/GenUnexpectedError.template
new file mode 100644
index 000000000..2427a67b6
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/GenUnexpectedError.template
@@ -0,0 +1,68 @@
+<!-- --- 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.
+
+ Copyright (C) 2007 Red Hat, Inc.
+ All rights reserved.
+ --- END COPYRIGHT BLOCK --- -->
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<HTML>
+<CMS_TEMPLATE>
+
+<TITLE>DRM Agent Processing Error!</TITLE>
+
+<BODY BGCOLOR="white">
+
+<font size="+1" face="PrimaSans BT, Verdana, Arial, Helvetica, sans-serif">
+Problem Processing Your Request
+</font>
+
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" BACKGROUND="/pki/images/hr.gif" >
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+</table>
+
+<font size="-1" face="PrimaSans BT, Verdana, Arial, Helvetica, sans-serif">
+
+<SCRIPT LANGUAGE="JavaScript">
+var authority = 'Certificate System';
+if (result.fixed.authorityName != null) {
+ authority = result.fixed.authorityName;
+}
+
+document.writeln('<P>');
+document.write('The '+authority+' encountered an unexpected error ');
+document.writeln(' while processing your request.');
+document.writeln(
+ 'The following is a detailed message of the error that occurred.');
+
+document.writeln('<P>');
+document.writeln('<BLOCKQUOTE><B><PRE>');
+if (result.fixed.unexpectedError != null) {
+ document.write(result.fixed.unexpectedError);
+} else {
+ document.write('No further details provided.');
+}
+document.writeln('</PRE></B></BLOCKQUOTE>');
+
+document.writeln('<P>');
+document.writeln(
+ 'Please consult your local administrator for further assistance.');
+document.writeln('The Certificate System logs may provide further information.');
+</SCRIPT>
+
+</font>
+</BODY>
+</HTML>
+
diff --git a/base/kra/shared/webapps/kra/agent/cms-funcs.js b/base/kra/shared/webapps/kra/agent/cms-funcs.js
new file mode 100644
index 000000000..c8ffd51c7
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/cms-funcs.js
@@ -0,0 +1,538 @@
+// --- 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.
+//
+// Copyright (C) 2007 Red Hat, Inc.
+// All rights reserved.
+// --- END COPYRIGHT BLOCK ---
+
+//<!--
+
+
+function checkClientTime()
+{
+ var speed;
+ var server_date = new Date(serverdate);
+ var client_date = new Date();
+ var zone = client_date.getTimezoneOffset();
+ var timediff = 0;
+
+ var serverutc = server_date.getTime();
+ var clientutc = client_date.getTime();
+
+ var offset = clientutc - serverutc;
+ if (offset >0) {
+ speed = 'fast';
+ } else {
+ speed = 'slow';
+ }
+ timediff = Math.round(Math.abs(offset/1000/60));
+
+ if (timediff > 10) {
+ msg = 'Your computer\'s clock is '+ timediff+ ' minutes '+ speed +
+ '\n\nYou may encounter problems using your certificate\n' +
+ 'as your clock is set incorrectly.\n\n' +
+ 'According to the server, the time is:\n ' + server_date +
+ '\n\nPlease correct your clock before proceeding with enrollment'+
+ '\n\nYour timezone is set to ' + (-zone/60) +' hours relative to GMT.\n' +
+ 'If you change your timezone, you may need to restart your browser\n'+
+ 'before continuing.';
+ alert(msg);
+ return false;
+ }
+ return true;
+}
+
+
+
+
+function doubleQuotes(componentName)
+{
+ for (i=0; i < componentName.length; i++) {
+ if (componentName.charAt(i) == '"') {
+ return true;
+ }
+ }
+ return false;
+}
+
+function escapeDNComponent(str)
+{
+ var outStr = "";
+ var escapeValue = false;
+
+ // Do we need to escape any characters
+ for (i=0; i < str.length; i++) {
+ c = str.charAt(i);
+ if (c == ',' || c == '=' || c == '+' || c == '<' ||
+ c == '>' || c == '#' || c == ';' || c == '\r' ||
+ c == '\n') {
+ escapeValue = true;
+ break;
+ }
+ }
+
+ if (escapeValue == true) {
+ outStr += '"';
+ outStr += str;
+ outStr += '"';
+ } else {
+ outStr += str;
+ }
+ return outStr;
+}
+
+function formulateDN(form, distinguishedName)
+{
+ // Note: The alerts about double quotes are here to avoid
+ // problems with the code dealing with quoting and escaping in the
+ // Netscape Directory Server 1.0 implementation.
+ with (form) {
+ distinguishedName.value = '';
+ if (form.E != null) {
+ if (E.value != '') {
+ if (doubleQuotes(E.value) == true) {
+ alert('Double quotes are not allowed in the E-mail field');
+ E.value = '';
+ E.focus();
+ return;
+ }
+ if (distinguishedName.value != '') distinguishedName.value += ', ';
+ distinguishedName.value += 'E=' + escapeDNComponent(E.value);
+ }
+ }
+ if (form.CN!= null) {
+ if (CN.value != '') {
+ if (doubleQuotes(CN.value) == true) {
+ alert('Double quotes are not allowed in Common Name field');
+ CN.value = '';
+ CN.focus();
+ return;
+ }
+ if (distinguishedName.value != '') distinguishedName.value += ', ';
+ distinguishedName.value += 'CN=' + escapeDNComponent(CN.value);
+ }
+ }
+ if (form.UID1 != null) {
+ if (UID1.value != '') {
+ if (doubleQuotes(UID1.value) == true) {
+ alert('Double quotes are not allowed in the user id field');
+ UID1.value = '';
+ UID1.focus();
+ return;
+ }
+ if (distinguishedName.value != '') distinguishedName.value += ', ';
+ distinguishedName.value += 'UID=' + escapeDNComponent(UID1.value);
+ }
+ }
+ if (form.OU != null) {
+ if (OU.value != '') {
+ if (doubleQuotes(OU.value) == true) {
+ alert('Double quotes are not allowed in Org Unit field');
+ OU.value = '';
+ OU.focus();
+ return;
+ }
+ if (distinguishedName.value != '') distinguishedName.value += ', ';
+ distinguishedName.value += 'OU=' + escapeDNComponent(OU.value);
+ }
+ }
+ if (form.O != null) {
+ if (O.value != '') {
+ if (doubleQuotes(O.value) == true) {
+ alert('Double quotes are not allowed in Organization field.');
+ O.value = '';
+ O.focus();
+ return;
+ }
+ if (distinguishedName.value != '') distinguishedName.value += ', ';
+ distinguishedName.value += 'O=' + escapeDNComponent(O.value);
+ }
+ }
+ if (form.L != null) {
+ if (L.value != '') {
+ if (doubleQuotes(L.value) == true) {
+ alert('Double quotes are not allowed in Locality field.');
+ L.value = '';
+ L.focus();
+ return;
+ }
+ if (distinguishedName.value != '') distinguishedName.value += ', ';
+ distinguishedName.value += 'L=' + escapeDNComponent(L.value);
+ }
+ }
+ if (form.ST != null) {
+ if (ST.value != '') {
+ if (doubleQuotes(ST.value) == true) {
+ alert('Double quotes are not allowed in State field.');
+ ST.value = '';
+ ST.focus();
+ return;
+ }
+ if (distinguishedName.value != '') distinguishedName.value += ', ';
+ distinguishedName.value += 'ST=' + escapeDNComponent(ST.value);
+ }
+ }
+ if (form.C != null) {
+ if (C.value != '') {
+ if (doubleQuotes(C.value) == true) {
+ alert('Double quotes are not allowed in Country field.');
+ C.value = '';
+ C.focus();
+ return;
+ }
+ if (distinguishedName.value != '') distinguishedName.value += ', ';
+ distinguishedName.value += 'C=' + escapeDNComponent(C.value);
+ }
+ }
+ }
+}
+
+function isValidIssuerDN(form)
+{
+ // Note: The check here is to avoid a bug in Netscape Navigator 3.0 and 3.01
+ // that are triggered on formation of the nickname on import of a CA cert if
+ // that cert does not contain an OU or O component.
+ if ((form.OU.value == '') && (form.O.value == '')) {
+ alert("You must enter an Organization Unit or an Organization.");
+ return false;
+ } else {
+ return true;
+ }
+}
+
+function isValidAdminDN(form)
+{
+ // Note: The check here is to avoid a bug in Netscape Navigator 3.0 and 3.01
+ // that are triggered on formation of the nickname on import of a personal cert if
+ // that cert does not contain a common name.
+
+ if (form.CN.value == '') {
+ alert("You must enter a Common Name.");
+ return false;
+ } else {
+ return true;
+ }
+}
+
+function isValidCSR(form)
+{
+ // Note: the checks here are of mixed origin. Some are required for Navigator
+ // and Communicator. The CSR field checks are to avoid server side rejection of the
+ // submission. These checks can be split up to be different for different types of
+ // certificates.
+
+ formulateDN(form, form.subject);
+ // DEBUG
+ //alert(form.subject);
+
+ with (form) {
+ if (email != null) {
+ if (E.value == "" && email.checked) {
+ alert("E-mail certificates must include an E-mail address.");
+ return false;
+ }
+ }
+ if (CN.value == "") {
+ alert("You must supply your name for the certificate.");
+ return false;
+ }
+ return true;
+ }
+}
+
+function isNumber(string, radix) {
+ var i = 0;
+ var legalDigits;
+ if (radix == null || radix == 10) {
+ legalDigits = "0123456789";
+ } else if (radix == 16) {
+ legalDigits = "0123456789abcdefABCDEF:";
+ } else {
+ return false;
+ }
+ for(; i < string.length; ++i) {
+ if (string.charAt(i) != ' ')
+ break;
+ }
+ if (string.charAt(i) == '+' || string.charAt(i) == '-' ) {
+ ++i;
+ }
+ if (radix == 16 && i < string.length - 2 &&
+ string.charAt(i) == '0' &&
+ (string.charAt(i+1) == 'x' || string.charAt(i+1) == 'X') &&
+ legalDigits.indexOf(string.charAt(i+2)) != -1) {
+ i += 3;
+ }
+ for(; i < string.length; ++i) {
+ if (legalDigits.indexOf(string.charAt(i)) == -1)
+ break;
+ }
+ for(; i < string.length; ++i) {
+ if (string.charAt(i) != ' ')
+ return false;
+ }
+ return true;
+}
+
+function dateForm(name)
+{
+ var i;
+ document.write('<FORM NAME=\"'+ name +'\">');
+ document.write('<SELECT NAME=\"day\"><OPTION VALUE=0> ');
+ for (i=1; i <=31; ++i)
+ document.write('<OPTION VALUE='+i+'>'+i);
+ document.write('</SELECT>');
+ document.write('<SELECT NAME=\"month\">'+
+ '<OPTION VALUE=13> '+
+ '<OPTION VALUE=0>January'+
+ '<OPTION VALUE=1>February'+
+ '<OPTION VALUE=2>March'+
+ '<OPTION VALUE=3>April'+
+ '<OPTION VALUE=4>May'+
+ '<OPTION VALUE=5>June'+
+ '<OPTION VALUE=6>July'+
+ '<OPTION VALUE=7>August'+
+ '<OPTION VALUE=8>September'+
+ '<OPTION VALUE=9>October'+
+ '<OPTION VALUE=10>November'+
+ '<OPTION VALUE=11>December'+
+ '</SELECT>'
+ );
+
+ document.write('<SELECT NAME=\"year\"><OPTION VALUE=0> ');
+ for (i=1996; i <=2006; ++i)
+ document.write('<OPTION VALUE='+i+'>'+i);
+ document.write('</SELECT>');
+ document.write('</FORM>');
+}
+
+function dateIsEmpty(form)
+{
+ return form.day.selectedIndex == 0 &&
+ form.month.selectedIndex == 0 &&
+ form.year.selectedIndex == 0;
+}
+
+
+function convertDate(form, fieldName)
+{
+ var date;
+ var day = form.day.options[form.day.selectedIndex].value;
+ var month = form.month.options[form.month.selectedIndex].value;
+ var year = form.year.options[form.year.selectedIndex].value;
+ date = new Date(year,month,day);
+
+ // see if normalization was required
+ if (date.getMonth() != month || date.getDate() != day ) {
+ alert(fieldName + " is invalid");
+ return null;
+ }
+ else
+ return Math.round(date.getTime() / 1000);
+}
+
+function daysToSeconds(days){
+ return 3600 * 24 * days;
+}
+
+// encloses value in double quotes preceding all embedded double quotes with \
+function escapeValue(value)
+{
+ var result;
+ var fromIndex = 0, toIndex = 0;
+
+ // kludgy work-around for indexOf JavaScript bug on empty string
+ if (value == "")
+ return '\"\"';
+
+ result = '\"';
+ while ((toIndex = value.indexOf('\"',fromIndex)) != -1) {
+ result += value.substring(fromIndex,toIndex);
+ result += '\\"';
+ fromIndex = toIndex + 1;
+ }
+ result += value.substring(fromIndex,value.length);
+ result += '\"';
+ return result;
+}
+
+// encloses value in double quotes preceding all embedded double quotes and
+// backslashes with backslash
+function escapeValueJSString(value)
+{
+ var result = "";
+
+ // Do we need to escape any characters
+ for (i=0; i < value.length; i++) {
+ c = value.charAt(i);
+ if (c == '\\' | c == '"') {
+ result += '\\';
+ }
+ result += c;
+ }
+ return '\"' + result + '\"';
+}
+
+function escapeValueRfc1779(value)
+{
+ var result = "";
+
+ // Do we need to escape any characters
+ for (i=0; i < value.length; i++) {
+ c = value.charAt(i);
+ if (c == ',' || c == '=' || c == '+' || c == '<' ||
+ c == '>' || c == '#' || c == ';' || c == '\r' ||
+ c == '\n' || c == '\\' | c == '"') {
+ result += '\\';
+ }
+ result += c;
+ }
+ return result;
+}
+
+// helper function to construct name component(pattern)
+function makeComponent(list,tag,value,asPattern)
+{
+ var last = list.length;
+ if (asPattern) {
+ list[last] = (value == "") ? "*" : (tag+"="+escapeValueRfc1779(value));
+ }
+ else if (value != "")
+ list[last] = tag+"="+escapeValueRfc1779(value);
+}
+
+// If asPattern is false formulates the RFC 1779 format subject name
+// from the component parts skipping all components with blank values,
+// otherwise builds RFC 1779-like matching pattern from components
+function computeNameCriterion(form)
+{
+ var asPattern = form.match[1].checked;
+ var result = new Array;
+
+ with (form) {
+ // The order of clauses here determines how components are ordered
+ // in the name sent in the client's request. A site may wish to
+ // re-order the clauses here if their conventions produce names
+ // with components in a different order.
+ makeComponent(result,"E",E.value,asPattern);
+ makeComponent(result,"CN",CN.value,asPattern);
+ makeComponent(result,"UID",UID.value,asPattern);
+ makeComponent(result,"OU",OU.value,asPattern);
+ makeComponent(result,"O",O.value,asPattern);
+ makeComponent(result,"L",L.value,asPattern);
+ makeComponent(result,"ST",ST.value,asPattern);
+ makeComponent(result,"C",C.value,asPattern);
+ }
+ if (result.length == 0)
+ return asPattern ? "0 == 0" : "0 == 1";
+ else
+ return "subject" + ( asPattern ? " ~= " : " == ") +
+ escapeValue(result.join(', '));
+}
+
+function booleanCrit(crit,radioArg)
+{
+ for (var i = 0; i < radioArg.length; ++i ){
+ if( radioArg[i].checked ) {
+ if (radioArg[i].value.length != 0) {
+ crit[crit.length] = radioArg[i].name + " == " + radioArg[i].value;
+ }
+ return;
+ }
+ }
+}
+
+function isHTTPEscapeChar(c)
+{
+ if (c == '%' || c == '#' || c == '+' || c == '=' || c == '\n' ||
+ c == '\r' || c == '\t' || c == ';' || c == '&' ||
+ c == '>') {
+ return true;
+ }
+
+ return false;
+}
+
+function produceHTTPEscapedString(inString)
+{
+ table = new Object();
+ table["%"] = "25";
+ table["#"] = "23";
+ table["+"] = "2B";
+ table["="] = "3D";
+ table["\n"] = "0A";
+ table["\r"] = "0D";
+ table["\t"] = "09";
+ table[";"] = "3B";
+ table["&"] = "26";
+ table[">"] = "3E";
+
+ outString = "";
+
+ for (i=0; i < inString.length; i++) {
+ if (inString.charAt(i) == ' ') {
+ outString += '+';
+ } else {
+ if (isHTTPEscapeChar(inString.charAt(i))) {
+ outString += "%" + table[inString.substring(i, i+1)];
+ } else {
+ outString += inString.charAt(i);
+ }
+ }
+ }
+
+ return outString;
+}
+
+// strips (optional) spaces and 0[xX] prefix at the beginning of s
+function stripPrefix(s)
+{
+ var i;
+ for(i = 0; i < s.length - 1; ++i) {
+ if (s.charAt(i) != ' ' )
+ break;
+ }
+ if (s.charAt(i) == '0' && (s.charAt(i+1) == 'x' || s.charAt(i+1) == 'X')) {
+ return s.substring(i+2,s.length);
+ } else {
+ return s.substring(i,s.length);;
+ }
+}
+
+// removes colons from value and returns the result
+// used as helper to convert colon-separated hexadecimal numbers
+// to regular numbers
+function removeColons(value)
+{
+ var result = "";
+
+ for (i=0; i < value.length; i++) {
+ c = value.charAt(i);
+ if (c != ':' ){
+ result += c;
+ }
+ }
+ return result;
+}
+
+function navMajorVersion()
+{
+ return parseInt(navigator.appVersion.substring(0, navigator.appVersion.indexOf(".")));
+}
+//-->
+
+
+
+
+
diff --git a/base/kra/shared/webapps/kra/agent/funcs.js b/base/kra/shared/webapps/kra/agent/funcs.js
new file mode 100644
index 000000000..daef83d17
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/funcs.js
@@ -0,0 +1,686 @@
+// --- 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.
+//
+// Copyright (C) 2007 Red Hat, Inc.
+// All rights reserved.
+// --- END COPYRIGHT BLOCK ---
+
+//<!--
+function doubleQuotes(componentName)
+{
+ for (i=0; i < componentName.length; i++) {
+ if (componentName.charAt(i) == '"') {
+ return true;
+ }
+ }
+ return false;
+}
+
+function escapeDNComponent(str)
+{
+ var outStr = "";
+ var escapeValue = false;
+
+ // Do we need to escape any characters
+ for (i=0; i < str.length; i++) {
+ c = str.charAt(i);
+ if (c == ',' || c == '=' || c == '+' || c == '<' ||
+ c == '>' || c == '#' || c == ';' || c == '\r' ||
+ c == '\n') {
+ escapeValue = true;
+ break;
+ }
+ }
+
+ if (escapeValue == true) {
+ outStr += '"';
+ outStr += str;
+ outStr += '"';
+ } else {
+ outStr += str;
+ }
+ return outStr;
+}
+
+function formulateDN(form, distinguishedName)
+{
+ // Note: The alerts about double quotes are here to avoid
+ // problems with the code dealing with quoting and escaping in the
+ // Netscape Directory Server 1.0 implementation.
+ with (form) {
+ distinguishedName.value = '';
+ if (form.eMail != null) {
+ if (eMail.value != '') {
+ if (doubleQuotes(eMail.value) == true) {
+ alert('Double quotes are not allowed in the E-mail field');
+ eMail.value = '';
+ eMail.focus();
+ return;
+ }
+ if (distinguishedName.value != '') distinguishedName.value += ', ';
+ distinguishedName.value += 'E=' + escapeDNComponent(eMail.value);
+ }
+ }
+ if (form.commonName != null) {
+ if (commonName.value != '') {
+ if (doubleQuotes(commonName.value) == true) {
+ alert('Double quotes are not allowed in Common Name field');
+ commonName.value = '';
+ commonName.focus();
+ return;
+ }
+ if (distinguishedName.value != '') distinguishedName.value += ', ';
+ distinguishedName.value += 'CN=' + escapeDNComponent(commonName.value);
+ }
+ }
+ if (form.userID != null) {
+ if (userID.value != '') {
+ if (doubleQuotes(userID.value) == true) {
+ alert('Double quotes are not allowed in the user id field');
+ userID.value = '';
+ userID.focus();
+ return;
+ }
+ if (distinguishedName.value != '') distinguishedName.value += ', ';
+ distinguishedName.value += 'UID=' + escapeDNComponent(userID.value);
+ }
+ }
+ if (form.orgUnit != null) {
+ if (orgUnit.value != '') {
+ if (doubleQuotes(orgUnit.value) == true) {
+ alert('Double quotes are not allowed in Org Unit field');
+ orgUnit.value = '';
+ orgUnit.focus();
+ return;
+ }
+ if (distinguishedName.value != '') distinguishedName.value += ', ';
+ distinguishedName.value += 'OU=' + escapeDNComponent(orgUnit.value);
+ }
+ }
+ if (form.org != null) {
+ if (org.value != '') {
+ if (doubleQuotes(org.value) == true) {
+ alert('Double quotes are not allowed in Organization field.');
+ org.value = '';
+ org.focus();
+ return;
+ }
+ if (distinguishedName.value != '') distinguishedName.value += ', ';
+ distinguishedName.value += 'O=' + escapeDNComponent(org.value);
+ }
+ }
+ if (form.locality != null) {
+ if (locality.value != '') {
+ if (doubleQuotes(locality.value) == true) {
+ alert('Double quotes are not allowed in Locality field.');
+ locality.value = '';
+ locality.focus();
+ return;
+ }
+ if (distinguishedName.value != '') distinguishedName.value += ', ';
+ distinguishedName.value += 'L=' + escapeDNComponent(locality.value);
+ }
+ }
+ if (form.state != null) {
+ if (state.value != '') {
+ if (doubleQuotes(state.value) == true) {
+ alert('Double quotes are not allowed in State field.');
+ state.value = '';
+ state.focus();
+ return;
+ }
+ if (distinguishedName.value != '') distinguishedName.value += ', ';
+ distinguishedName.value += 'ST=' + escapeDNComponent(state.value);
+ }
+ }
+ if (form.country != null) {
+ if (country.value != '') {
+ if (doubleQuotes(country.value) == true) {
+ alert('Double quotes are not allowed in Country field.');
+ country.value = '';
+ country.focus();
+ return;
+ }
+ if (distinguishedName.value != '') distinguishedName.value += ', ';
+ distinguishedName.value += 'C=' + escapeDNComponent(country.value);
+ }
+ }
+ }
+}
+
+function isValidIssuerDN(form)
+{
+ // Note: The check here is to avoid a bug in Netscape Navigator 3.0 and 3.01
+ // that are triggered on formation of the nickname on import of a CA cert if
+ // that cert does not contain an OU or O component.
+ if ((form.orgUnit.value == '') && (form.org.value == '')) {
+ alert("You must enter an Organization Unit or an Organization.");
+ return false;
+ } else {
+ return true;
+ }
+}
+
+function isValidAdminDN(form)
+{
+ // Note: The check here is to avoid a bug in Netscape Navigator 3.0 and 3.01
+ // that are triggered on formation of the nickname on import of a personal cert if
+ // that cert does not contain a common name.
+
+ if (form.commonName.value == '') {
+ alert("You must enter a Common Name.");
+ return false;
+ } else {
+ return true;
+ }
+}
+
+function isValidCSR(form)
+{
+ // Note: the checks here are of mixed origin. Some are required for Navigator
+ // and Communicator. The CSR field checks are to avoid server side rejection of the
+ // submission. These checks can be split up to be different for different types of
+ // certificates.
+
+ formulateDN(form, form.subject);
+
+ with (form) {
+ if (isEmailCert != null) {
+ if (eMail.value == "" && isEmailCert.checked) {
+ alert("E-mail certificates must include an E-mail address.");
+ return false;
+ }
+ }
+ if (commonName.value == "") {
+ alert("You must supply your name for the certificate.");
+ return false;
+ }
+ if (csrRequestorName.value == "") {
+ csrRequestorName.value = commonName.value;
+ }
+ if (csrRequestorPhone.value == "" && csrRequestorEmail.value == "") {
+ alert("You must supply a contact phone number or e-mail address.");
+ return false;
+ }
+ return true;
+ }
+}
+
+function isNegative(string) {
+ if (string.charAt(0) == '-')
+ return true;
+ else
+ return false;
+}
+
+function isNumber(string, radix) {
+ var i = 0;
+ var legalDigits;
+ if (radix == null || radix == 10) {
+ legalDigits = "0123456789";
+ } else if (radix == 16) {
+ legalDigits = "0123456789abcdefABCDEF:";
+ } else {
+ return false;
+ }
+ for(; i < string.length; ++i) {
+ if (string.charAt(i) != ' ')
+ break;
+ }
+ if (string.charAt(i) == '+' || string.charAt(i) == '-' ) {
+ ++i;
+ }
+ if (radix == 16 && i < string.length - 2 &&
+ string.charAt(i) == '0' &&
+ (string.charAt(i+1) == 'x' || string.charAt(i+1) == 'X') &&
+ legalDigits.indexOf(string.charAt(i+2)) != -1) {
+ i += 3;
+ }
+ for(; i < string.length; ++i) {
+ if (legalDigits.indexOf(string.charAt(i)) == -1)
+ break;
+ }
+ for(; i < string.length; ++i) {
+ if (string.charAt(i) != ' ')
+ return false;
+ }
+ return true;
+}
+
+function isDecimalNumber(string) {
+ var i = 0;
+ var legalDigits = "0123456789";
+
+ for (; i < string.length; i++) {
+ if (string.charAt(i) != ' ')
+ break;
+ }
+ if (i < string.length &&
+ legalDigits.indexOf(string.charAt(i)) != -1) {
+ i++;
+ } else
+ return false;
+
+ for (; i < string.length; i++) {
+ if (legalDigits.indexOf(string.charAt(i)) == -1)
+ break;
+ }
+ for (; i < string.length; i++) {
+ if (string.charAt(i) != ' ')
+ return false;
+ }
+
+ return true;
+}
+
+function isHexNumber(string) {
+ var i = 0;
+ var legalDigits = "0123456789abcdefABCDEF";
+
+ for (; i < string.length; i++) {
+ if (string.charAt(i) != ' ')
+ break;
+ }
+ if (i < string.length - 2 &&
+ string.charAt(i) == '0' &&
+ (string.charAt(i+1) == 'x' || string.charAt(i+1) == 'X') &&
+ legalDigits.indexOf(string.charAt(i+2)) != -1) {
+ i += 3;
+ } else
+ return false;
+
+ for (; i < string.length; i++) {
+ if (legalDigits.indexOf(string.charAt(i)) == -1)
+ break;
+ }
+ for (; i < string.length; i++) {
+ if (string.charAt(i) != ' ')
+ return false;
+ }
+
+ return true;
+}
+
+function trim(string) {
+ var i, k, newString;
+
+ for (i = 0; i < string.length; i++) {
+ if (string.charAt(i) != ' ' )
+ break;
+ }
+ for (k = string.length - 1; k > i; k--) {
+ if (string.charAt(k) != ' ' )
+ break;
+ }
+ k++;
+
+ if (k > i)
+ newString = string.substring(i, k);
+ else
+ newString = null;
+
+ return newString;
+}
+
+
+function dateForm(name)
+{
+ var i;
+ document.write('<FORM NAME=\"'+ name +'\">');
+ document.write('<SELECT NAME=\"day\"><OPTION VALUE=0> ');
+ for (i=1; i <=31; ++i)
+ document.write('<OPTION VALUE='+i+'>'+i);
+ document.write('</SELECT>');
+ document.write('<SELECT NAME=\"month\">'+
+ '<OPTION VALUE=13> '+
+ '<OPTION VALUE=0>January'+
+ '<OPTION VALUE=1>February'+
+ '<OPTION VALUE=2>March'+
+ '<OPTION VALUE=3>April'+
+ '<OPTION VALUE=4>May'+
+ '<OPTION VALUE=5>June'+
+ '<OPTION VALUE=6>July'+
+ '<OPTION VALUE=7>August'+
+ '<OPTION VALUE=8>September'+
+ '<OPTION VALUE=9>October'+
+ '<OPTION VALUE=10>November'+
+ '<OPTION VALUE=11>December'+
+ '</SELECT>'
+ );
+
+ document.write('<SELECT NAME=\"year\"><OPTION VALUE=0> ');
+ for (i=1996; i <=2006; ++i)
+ document.write('<OPTION VALUE='+i+'>'+i);
+ document.write('</SELECT>');
+ document.write('</FORM>');
+}
+
+function dateIsEmpty(form)
+{
+ return form.day.selectedIndex == 0 &&
+ form.month.selectedIndex == 0 &&
+ form.year.selectedIndex == 0;
+}
+
+
+function convertDate(form, fieldName)
+{
+ var date;
+ var day = form.day.options[form.day.selectedIndex].value;
+ var month = form.month.options[form.month.selectedIndex].value;
+ var year = form.year.options[form.year.selectedIndex].value;
+ date = new Date(year,month,day);
+
+ // see if normalization was required
+ if (date.getMonth() != month || date.getDate() != day || year == 0) {
+ alert(fieldName + " is invalid");
+ return null;
+ }
+ else
+ return date.getTime();
+// return Math.round(date.getTime() / 1000);
+}
+
+function daysToSeconds(days){
+ return 3600 * 24 * days;
+}
+
+// encloses value in double quotes preceding all embedded double quotes with \
+function escapeValue(value)
+{
+ var result;
+ var fromIndex = 0, toIndex = 0;
+
+ // kludgy work-around for indexOf JavaScript bug on empty string
+ if (value == "")
+ return '\"\"';
+
+ result = '\"';
+ while ((toIndex = value.indexOf('\"',fromIndex)) != -1) {
+ result += value.substring(fromIndex,toIndex);
+ result += '\\"';
+ fromIndex = toIndex + 1;
+ }
+ result += value.substring(fromIndex,value.length);
+ result += '\"';
+ return result;
+}
+
+// encloses value in double quotes preceding all embedded double quotes and
+// backslashes with backslash
+function escapeValueJSString(value)
+{
+ var result = "";
+
+ // Do we need to escape any characters
+ for (i=0; i < value.length; i++) {
+ c = value.charAt(i);
+ if (c == '\\' | c == '"') {
+ result += '\\';
+ }
+ result += c;
+ }
+ return '\"' + result + '\"';
+}
+
+function escapeValueRfc1779(value)
+{
+ var result = "";
+
+ // Do we need to escape any characters
+ for (i=0; i < value.length; i++) {
+ c = value.charAt(i);
+ if (c == ',' || c == '=' || c == '+' || c == '<' ||
+ c == '>' || c == '#' || c == ';' || c == '\r' ||
+ c == '\n' || c == '\\' || c == '"') {
+ result += '\\';
+ }
+ result += c;
+ }
+ return result;
+}
+
+// helper function to construct name component(pattern)
+function makeComponent(list,tag,value,asPattern)
+{
+ var last = list.length;
+// if (asPattern) {
+// list[last] = (value == "") ? "*" : (tag+"="+escapeValueRfc1779(value));
+// }
+// else if (value != "")
+ if (value != "") {
+ list[last] = tag+"="+escapeValueRfc1779(value);
+// } else if (!asPattern) {
+// list[last] = tag+"=*";
+ }
+// alert("asPattern = " + asPattern);
+}
+
+// If asPattern is false formulates the RFC 1779 format subject name
+// from the component parts skipping all components with blank values,
+// otherwise builds RFC 1779-like matching pattern from components
+function computeNameCriterion(form)
+{
+ var asPattern = form.match[1].checked;
+ var result = new Array;
+
+ with (form) {
+ // The order of clauses here determines how components are ordered
+ // in the name sent in the client's request. A site may wish to
+ // re-order the clauses here if their conventions produce names
+ // with components in a different order.
+ makeComponent(result,"E",eMail.value,asPattern);
+ makeComponent(result,"CN",commonName.value,asPattern);
+ makeComponent(result,"UID",userID.value,asPattern);
+ makeComponent(result,"OU",orgUnit.value,asPattern);
+ makeComponent(result,"O",org.value,asPattern);
+ makeComponent(result,"L",locality.value,asPattern);
+ makeComponent(result,"ST",state.value,asPattern);
+ makeComponent(result,"C",country.value,asPattern);
+ }
+ if (result.length == 0)
+// return asPattern ? "0 == 0" : "0 == 1";
+ return "(x509Cert.subject=*)";
+ else {
+ return "(x509Cert.subject" + (asPattern ? "~=" : "=") + escapeValue(nsjoin(result,",")) + ")";
+ }
+// escapeValue(result.join(', '));
+}
+
+// helper function to construct name component(pattern)
+function makeComponentFilter(list,tag,value,asPattern)
+{
+ var last = list.length;
+ if (value != "") {
+ if (asPattern) {
+ list[last] = "(x509Cert.subject=*"+tag+"=*"+
+ escapeValueRfc1779(value)+"*)";
+ } else {
+ // exact match (either the end, or appended with ",")
+ list[last] = "(|(x509Cert.subject=*"+tag+"="+
+ escapeValueRfc1779(value)+",*)"
+ +"(x509Cert.subject=*"+tag+"="+
+ escapeValueRfc1779(value)+"))";
+ }
+ }
+}
+
+function computeNameFilter(form)
+{
+ var asPattern = form.match[1].checked;
+ var result = new Array;
+
+ with (form) {
+ // The order of clauses here determines how components are ordered
+ // in the name sent in the client's request. A site may wish to
+ // re-order the clauses here if their conventions produce names
+ // with components in a different order.
+ makeComponentFilter(result,"E",eMail.value,asPattern);
+ makeComponentFilter(result,"CN",commonName.value,asPattern);
+ makeComponentFilter(result,"UID",userID.value,asPattern);
+ makeComponentFilter(result,"OU",orgUnit.value,asPattern);
+ makeComponentFilter(result,"O",org.value,asPattern);
+ makeComponentFilter(result,"L",locality.value,asPattern);
+ makeComponentFilter(result,"ST",state.value,asPattern);
+ makeComponentFilter(result,"C",country.value,asPattern);
+ }
+ if (result.length == 0) {
+ return "(x509Cert.subject=*)";
+ } else {
+ if (asPattern) {
+ return "(|" + nsjoin(result,"") + ")";
+ } else {
+ return "(&" + nsjoin(result,"") + ")";
+ }
+ }
+}
+
+function booleanCrit(crit,radioArg)
+{
+ for (var i = 0; i < radioArg.length; ++i ){
+ if( radioArg[i].checked ) {
+ if (radioArg[i].value.length != 0) {
+ crit[crit.length] = radioArg[i].name + " == " + radioArg[i].value;
+ }
+ return;
+ }
+ }
+}
+
+function isHTTPEscapeChar(c)
+{
+ if (c == '%' || c == '#' || c == '+' || c == '=' || c == '\n' ||
+ c == '\r' || c == '\t' || c == ';' || c == '&' ||
+ c == '>') {
+ return true;
+ }
+
+ return false;
+}
+
+function produceHTTPEscapedString(inString)
+{
+ table = new Object();
+ table["%"] = "25";
+ table["#"] = "23";
+ table["+"] = "2B";
+ table["="] = "3D";
+ table["\n"] = "0A";
+ table["\r"] = "0D";
+ table["\t"] = "09";
+ table[";"] = "3B";
+ table["&"] = "26";
+ table[">"] = "3E";
+
+ outString = "";
+
+ for (i=0; i < inString.length; i++) {
+ if (inString.charAt(i) == ' ') {
+ outString += '+';
+ } else {
+ if (isHTTPEscapeChar(inString.charAt(i))) {
+ outString += "%" + table[inString.substring(i, i+1)];
+ } else {
+ outString += inString.charAt(i);
+ }
+ }
+ }
+
+ return outString;
+}
+
+function isHex(string)
+{
+ if (string.charAt(0) == '0' &&
+ (string.charAt(1) == 'x' || string.charAt(1) == 'X')) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+function writeError(errorDetails)
+{
+ document.write("<center><h2><b>" +
+ "Problem Processing Your Request" +
+ "</b></h2></center><p>" +
+ "The service encountered a problem " +
+ "when processing your request. This problem may " +
+ "indicate a flaw in the form used to submit your " +
+ "request or the values that were entered into the form." +
+ "The following message supplies more information " +
+ "about the error that occurred.<p>");
+ document.write("<blockquote><b><pre>");
+ if (errorDetails != null) {
+ document.write(errorDetails);
+ } else {
+ document.write("Unable to provide details. " +
+ "Contact Administrator.");
+ }
+ document.write("</pre></b></blockquote>");
+ if (result.header.errorDescription != null) {
+ document.write('<p>Additional Information:<p>');
+ document.write('<blockquote><b>');
+ document.write(result.header.errorDescription);
+ document.write('</b></blockquote>');
+ }
+ document.write("<p>");
+ document.write("Please consult your local administrator for " +
+ "further assistance.");
+ document.write("The certificate server's log may provide " +
+ "further information.");
+}
+
+// strips (optional) spaces and 0[xX] prefix at the beginning of s
+function stripPrefix(s)
+{
+ var i;
+ for(i = 0; i < s.length - 1; ++i) {
+ if (s.charAt(i) != ' ' )
+ break;
+ }
+ if (s.charAt(i) == '0' && (s.charAt(i+1) == 'x' || s.charAt(i+1) == 'X')) {
+ return s.substring(i+2,s.length);
+ } else {
+ return s.substring(i,s.length);;
+ }
+}
+
+// removes colons from value and returns the result
+// used as helper to convert colon-separated hexadecimal numbers
+// to regular numbers
+function removeColons(value)
+{
+ var result = "";
+
+ for (i=0; i < value.length; i++) {
+ c = value.charAt(i);
+ if (c != ':' ){
+ result += c;
+ }
+ }
+ return result;
+}
+
+// Replacement for the array.join() function which isn't in MSIE 3.0
+
+function nsjoin(array,str) {
+ val = "";
+ for (i=0; i<array.length; i++) {
+ val = val + array[i];
+ if (i < (array.length-1)) val = val+str;
+ }
+ return val;
+}
+//-->
diff --git a/base/kra/shared/webapps/kra/agent/header.template b/base/kra/shared/webapps/kra/agent/header.template
new file mode 100644
index 000000000..d1221b14b
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/header.template
@@ -0,0 +1,82 @@
+<!-- --- 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.
+
+ Copyright (C) 2007 Red Hat, Inc.
+ All rights reserved.
+ --- END COPYRIGHT BLOCK --- -->
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<CMS_TEMPLATE>
+<title>Header</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+</head>
+
+<body onResize=location.reload() bgcolor="#CCCCCC" link="#FFFFFF" vlink="#FFFFFF" alink="#CCCCFF">
+<table border="0" width="100%" cellspacing="0" cellpadding="0" bgcolor="#000080">
+ <tr>
+ <td>
+ <table border="0" cellspacing="12" cellpadding="0">
+ <tr>
+ <td><img src="/pki/images/logo_header.gif"></td>
+ <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
+ <td><font size="+1" face="PrimaSans BT, Verdana, sans-serif" color="white"><b>Dogtag<sup><font color="#999999" size="-2">&reg;</font></sup> Agent Services</b></font></td>
+ </tr>
+ </table>
+ <table border="0" cellspacing="0" cellpadding="0">
+ <tr>
+ <td><img src="/pki/images/spacer.gif" alt="" width="12" height="21"></td>
+<SCRIPT type="text/javascript">
+ for (var i = 0; i < result.recordSet.length; ++i) {
+ if (result.recordSet[i].id == header.selected) {
+ document.write('<td><img src="/pki/images/lgLeftTab.gif" width="13" height="21"><\/td>');
+ document.write('<td bgcolor="#cccccc" nowrap>');
+ } else {
+ document.write('<td><img src="/pki/images/dgLeftTab.gif" width="13" height="21"><\/td>');
+ document.write('<td bgcolor="#999999" nowrap>');
+ }
+ document.write('<font size="-1" face="PrimaSans BT, Verdana, sans-serif">');
+ if (result.recordSet[i].type == "CertificateAuthority") {
+ type = "Certificate Manager";
+ } else if (result.recordSet[i].type == "KeyRecoveryAuthority") {
+ type = "Data Recovery Manager";
+ } else if (result.recordSet[i].type == "OCSPAuthority") {
+ type = "Online Certificate Status Manager";
+ } else if (result.recordSet[i].type == "RegistrationAuthority") {
+ type = "Registration Manager";
+ }
+ if (result.recordSet[i].id == header.selected) {
+ document.write('<b>' + type + '<\/b>');
+ } else {
+ document.write('<a href="../' +
+ result.recordSet[i].id +
+ '/index.html" target="_top">' +
+ type + '<\/a>');
+ }
+ document.write('<\/font><\/td>');
+ if (result.recordSet[i].id == header.selected) {
+ document.write('<td><img src="/pki/images/lgRightTab.gif" width="16" height="21" alt=""><\/td>');
+ } else {
+ document.write('<td><img src="/pki/images/dgRightTab.gif" width="16" height="21" alt=""><\/td>');
+ }
+ }
+</SCRIPT>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+</body>
+</html>
+
diff --git a/base/kra/shared/webapps/kra/agent/helpfun.js b/base/kra/shared/webapps/kra/agent/helpfun.js
new file mode 100644
index 000000000..14a80bb95
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/helpfun.js
@@ -0,0 +1,35 @@
+// --- 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.
+//
+// Copyright (C) 2007 Red Hat, Inc.
+// All rights reserved.
+// --- END COPYRIGHT BLOCK ---
+
+function help(helptopic) {
+
+ var HelpWin=window.open("","MyWin", "toolbar=no,directories=no,menubar=no,status=no,scrollbars=yes,resizable=yes,width=500,height=500");
+
+ HelpWin.location = helptopic;
+ HelpWin.focus();
+
+}
+
+function helpstatus(helpline) {
+
+ window.status = helpline;
+
+ return true;
+
+}
+
diff --git a/base/kra/shared/webapps/kra/agent/index.html b/base/kra/shared/webapps/kra/agent/index.html
new file mode 100644
index 000000000..30662d47a
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/index.html
@@ -0,0 +1,23 @@
+<!-- --- 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.
+
+ Copyright (C) 2007 Red Hat, Inc.
+ All rights reserved.
+ --- END COPYRIGHT BLOCK --- -->
+<html>
+<script lang="javascript">
+ // redirect to 'ROOT'
+ window.location = "/";
+</script>
+</html>
diff --git a/base/kra/shared/webapps/kra/agent/index.template b/base/kra/shared/webapps/kra/agent/index.template
new file mode 100644
index 000000000..c3200bb9c
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/index.template
@@ -0,0 +1,140 @@
+<!-- --- 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.
+
+ Copyright (C) 2007 Red Hat, Inc.
+ All rights reserved.
+ --- END COPYRIGHT BLOCK --- -->
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<CMS_TEMPLATE>
+<title>DRM Agent</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+</head>
+
+<body bgcolor="#FFFFFF" link="#666699" vlink="#666699" alink="#333366">
+<table border="0" width="100%" cellspacing="0" cellpadding="6">
+ <tr bgcolor="#000080">
+ <td>
+ <table border="0" cellspacing="12" cellpadding="0">
+ <tr>
+ <td><img src="/pki/images/logo_header.gif"></td>
+ <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
+ <td><font size="+1" face="PrimaSans BT, Verdana, sans-serif" color="white"><b>Dogtag<sup><font color="#999999" size="-2">&reg;</font></sup> Agent Services</b></font></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr valign="TOP">
+ <td>&nbsp;</td>
+ <td>
+ <table border="0" cellspacing="0" cellpadding="0">
+ <tr valign="TOP">
+ <td>&nbsp;</td>
+ <td>&nbsp;</td>
+ </tr>
+<SCRIPT type="text/javascript">
+function displayError()
+{
+ document.write("<center><h2><b>" +
+ "Problem Processing Your Request" +
+ "</b></h2></center><p>" +
+ "The service encountered a problem " +
+ "when processing your request. This problem may " +
+ "indicate a flaw in the form used to submit your " +
+ "request or the values that were entered into the form." +
+ "The following message supplies more information " +
+ "about the error that occurred.<p>");
+ document.write("<blockquote><b><pre>");
+ if (result.header.errorDetails != null) {
+ document.write(result.header.errorDetails);
+ } else {
+ document.write("Unable to provide details. " +
+ "Contact Administrator.");
+ }
+ document.write("</pre></b></blockquote>");
+ if (result.header.errorDescription != null) {
+ document.write('<p>Additional Information:<p>');
+ document.write('<blockquote><b>');
+ document.write(result.header.errorDescription);
+ document.write('</b></blockquote>');
+ }
+ document.write("<p>");
+ document.write("Please consult your local administrator for " +
+ "further assistance.");
+ document.write("The certificate server's log may provide " +
+ "further information.");
+}
+
+if (result.header.errorDetails != null) {
+ displayError();
+} else {
+ var displayServices = 'true';
+ for (var i = 0; i < result.recordSet.length; ++i) {
+ document.write('<tr valign="TOP">');
+ document.write('<td>');
+ document.write('<img src="/pki/images/goto-tall.gif" width="10" height="15">&nbsp;</td>');
+ document.write('<td>');
+ document.write('<font face="PrimaSans BT, Verdana, sans-serif">');
+ document.write('<a href="');
+ document.write(result.recordSet[i].id + '/index.html');
+ if (result.recordSet[i].type == "RegistrationAuthority") {
+ document.write('">Registration Manager Agent Services</a></font>');
+ document.write('<font size="-1" face="PrimaSans BT, Verdana, sans-serif"><br>');
+ document.write('The operations available through this menu are used to process certificate requests, revoke certificates, and update information in the directory server.');
+ } else if (result.recordSet[i].type == "CertificateAuthority") {
+ document.write('">Certificate Manager Agent Services</a></font>');
+ document.write('<font size="-1" face="PrimaSans BT, Verdana, sans-serif"><br>');
+ document.write('The operations available through this menu are used to process certificate requests, revoke certificates, and update information in the directory server.');
+ } else if (result.recordSet[i].type == "OCSPAuthority") {
+ displayServices = 'false';
+ document.write('">Online Certificate Status Manager Agent Services</a></font>');
+ document.write('<font size="-1" face="PrimaSans BT, Verdana, sans-serif"><br>');
+ document.write('The operations available through this menu are used to check certificate status.');
+ } else if (result.recordSet[i].type == "KeyRecoveryAuthority") {
+ displayServices = 'false';
+ document.write('">Data Recovery Manager Agent Services</a></font>');
+ document.write('<font size="-1" face="PrimaSans BT, Verdana, sans-serif"><br>');
+ document.write('The operations available through this menu are used to process key requests, and recover keys.');
+ } else {
+ document.write('">Internal Error</a></font>');
+ }
+ document.write('</font></td></tr>');
+ }
+}
+document.write('<tr valign="TOP">');
+document.write('<td>&nbsp;</td>');
+document.write('<td>&nbsp;</td>');
+document.write('</tr>');
+if (displayServices== 'true')
+{
+ document.write('<tr valign="TOP">');
+ document.write('<TD><IMG src="/pki/images/goto-tall.gif" width="10" height="15"></TD>');
+ document.write('<TD><FONT face="PrimaSans BT, Verdana, sans-serif">');
+ document.write('<A href="ports">Services Summary</A></FONT></TD>');
+ document.write('</tr>');
+}
+document.write('<TR valign="TOP">');
+document.write('<TD> </TD>');
+document.write('<TD> </TD>');
+document.write('</tr>');
+document.write('</table>');
+document.write('</td>');
+document.write('<td>&nbsp;</td>');
+document.write('</tr>');
+</SCRIPT>
+
+</table>
+</body>
+</html>
diff --git a/base/kra/shared/webapps/kra/agent/kra/GrantRecovery.html b/base/kra/shared/webapps/kra/agent/kra/GrantRecovery.html
new file mode 100644
index 000000000..4a2cf018e
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/GrantRecovery.html
@@ -0,0 +1,46 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<HTML>
+<HEAD>
+<TITLE>Authorize Recovery (for Recovery Agents)</TITLE>
+<SCRIPT LANGUAGE="JavaScript"></SCRIPT>
+<SCRIPT LANGUAGE="JavaScript" SRC="../helpfun.js">
+</SCRIPT>
+</HEAD>
+
+<body bgcolor="#FFFFFF" link="#666699" vlink="#666699" alink="#333366">
+<font size="+1" face="PrimaSans BT, Verdana, sans-serif">Authorize Recovery (for Recovery Agents)<br></font>
+<font size="-1" face="PrimaSans BT, Verdana, sans-serif">
+Use this form to approve a key recovery.
+</font>
+<table border="0" cellspacing="0" cellpadding="0" background="/pki/images/hr.gif" width="100%">
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+</table>
+
+<FORM ACTION="examineRecovery" METHOD=POST>
+<INPUT TYPE="HIDDEN" NAME="op" VALUE="examineRecovery">
+
+<table border="0" cellspacing="2" cellpadding="2">
+ <tr>
+ <td valign="top" align="right">
+ <font size="-1" face="PrimaSans BT, Verdana, sans-serif">Recovery authorization reference number:<br></font>
+ </td>
+ <td><INPUT TYPE="TEXT" NAME="recoveryID" SIZE=10 MAXLENGTH=99"></td>
+ </tr>
+</table>
+
+<p>
+<br>
+<TABLE cellpadding="6" cellspacing="0" border="0" width="100%">
+ <TR>
+ <TD align="right" bgcolor="#e5e5e5">
+ <INPUT TYPE="submit" VALUE="Examine" width="72">&nbsp;
+ <!-- <INPUT TYPE="button" VALUE="Help" width="72"
+ onClick="help('/manual/agt_gide/kraagt.htm#1022642')"> -->
+ </TD>
+ </TR>
+</TABLE>
+</FORM>
+</BODY>
+</HTML>
diff --git a/base/kra/shared/webapps/kra/agent/kra/ListRequests.html b/base/kra/shared/webapps/kra/agent/kra/ListRequests.html
new file mode 100644
index 000000000..7150c5d60
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/ListRequests.html
@@ -0,0 +1,96 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<HTML>
+<HEAD>
+<TITLE>List Key Service Requests</TITLE>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<SCRIPT LANGUAGE="JavaScript"></SCRIPT>
+<SCRIPT LANGUAGE="JavaScript" SRC="../funcs.js"></SCRIPT>
+<SCRIPT LANGUAGE="JavaScript" SRC="../helpfun.js"></SCRIPT>
+<script LANGUAGE="JavaScript">
+<!--
+function doSubmit(form)
+{
+ if (form.lastEntryOnPage.value != "") {
+ if (isDecimalNumber(form.lastEntryOnPage.value) ||
+ isHexNumber(form.lastEntryOnPage.value)) {
+ form.lastEntryOnPage.value = trim(form.lastEntryOnPage.value);
+ } else {
+ alert("You must specify a hexadecimal or decimal number " +
+ "for the starting request identifier.");
+ return;
+ }
+ }
+ form.submit();
+}
+//-->
+</script>
+</HEAD>
+
+<body bgcolor="#FFFFFF" link="#666699" vlink="#666699" alink="#333366">
+<font size="+1" face="PrimaSans BT, Verdana, sans-serif">List Requests<br></font>
+<font size="-1" face="PrimaSans BT, Verdana, sans-serif">
+Use this form to show a list of key service requests.</font>
+<table border="0" cellspacing="0" cellpadding="0" background="/pki/images/hr.gif" width="100%">
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+</table>
+
+<FORM ACTION="queryReq" METHOD=POST>
+
+<table border="0" cellspacing="2" cellpadding="2">
+ <tr>
+ <td valign="top" align="right">
+ <font size="-1" face="PrimaSans BT, Verdana, sans-serif">Request type:</font>
+ </td>
+ <td valign="top">
+ <SELECT NAME="reqType">
+ <OPTION SELECTED VALUE="enrollment">Show archival requests</OPTION>
+ <OPTION VALUE="recovery">Show recovery requests</OPTION>
+ <OPTION VALUE="netkeyKeygen">Show token key requests</OPTION>
+ <OPTION VALUE="showAll">Show all requests</OPTION>
+ </SELECT>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" align="right">
+ <font size="-1" face="PrimaSans BT, Verdana, sans-serif">Request status:</font>
+ </td>
+ <td valign="top">
+ <SELECT NAME="reqState">
+ <OPTION SELECTED VALUE="showCompleted">Show completed requests</OPTION>
+ <OPTION VALUE="showPending">Show pending requests</OPTION>
+ <OPTION VALUE="showCancelled">Show canceled requests</OPTION>
+ <OPTION VALUE="showRejected">Show rejected requests</OPTION>
+ <OPTION VALUE="showAll">Show all requests</OPTION>
+ </SELECT>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" align="right">
+ <font size="-1" face="PrimaSans BT, Verdana, sans-serif">Starting request identifier:<br>(optional)</font>
+ </td>
+ <td><INPUT TYPE="TEXT" NAME="lastEntryOnPage" SIZE=10 MAXLENGTH=99></td>
+ </tr>
+</table>
+
+<p>
+<br>
+<TABLE cellpadding="6" cellspacing="0" border="0" width="100%" BACKGROUND="/pki/images/gray90.gif">
+ <TR>
+ <TD align="right" bgcolor="#e5e5e5">
+ <INPUT TYPE="button" VALUE="Find" width="72" onClick="doSubmit(this.form);">&nbsp;&nbsp;
+ <font size=-1 face="PrimaSans BT, Verdana, sans-serif">first</font>&nbsp;
+ <INPUT TYPE="hidden" NAME="direction" VALUE="first">
+ <INPUT TYPE="TEXT" NAME="maxCount" SIZE=7 MAXLENGTH=99 VALUE="20">
+ <font size=-1 face="PrimaSans BT, Verdana, sans-serif">records</font>&nbsp;&nbsp;&nbsp;
+ <!-- <INPUT TYPE="button" VALUE="Help" width="72"
+ onClick="help('http://www.redhat.com/docs/manuals/cert-system/8.0/agent/html/DRM_Recovering_Encrypted_Data.html#DRM_Recovering_Encrypted_Data-List_Requests')"> -->
+ </TD>
+ </TR>
+</TABLE>
+
+</FORM>
+</BODY>
+
+</HTML>
diff --git a/base/kra/shared/webapps/kra/agent/kra/SrchKey.html b/base/kra/shared/webapps/kra/agent/kra/SrchKey.html
new file mode 100644
index 000000000..ce2d88433
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/SrchKey.html
@@ -0,0 +1,323 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.5 [en]C-NSCP (WinNT; I) [Netscape]">
+ <title>Search for Keys</title>
+</head>
+
+<SCRIPT LANGUAGE="JavaScript"></SCRIPT>
+<script language="JavaScript" src="../funcs.js"></script>
+<script language="JavaScript" src="../helpfun.js"></script>
+<script language="JavaScript">
+//<!--
+function publicKeyCritInUse()
+{
+ return document.publicKeyCritForm.inUse.checked;
+}
+function publicKeyCrit()
+{
+ if (document.publicKeyCritForm.publicKeyData.value.length == 0) {
+ alert("No public key specified");
+ return null;
+ }
+ return "publicKey=x509cert#"+
+ escapeValue(document.publicKeyCritForm.publicKeyData.value);
+}
+function ownerNameCritInUse()
+{
+ return document.ownerNameCritForm.inUse.checked;
+}
+function ownerNameCrit()
+{
+ return "keyOwnerName=" + document.ownerNameCritForm.ownerName.value;
+}
+function serialNumberRangeCritInUse()
+{
+ return document.serialNumberRangeCritForm.inUse.checked;
+}
+
+function serialNumberRangeCrit()
+{
+ var crit = new Array;
+ var next = 0;
+
+ var canonicalFrom = "", canonicalTo = "";
+
+ if (document.serialNumberRangeCritForm.serialFrom.value != "") {
+ if (isHex(document.serialNumberRangeCritForm.serialFrom.value)) {
+ canonicalFrom = parseInt(stripPrefix(document.serialNumberRangeCritForm.serialFrom.value),16);
+ } else {
+ canonicalFrom = document.serialNumberRangeCritForm.serialFrom.value;
+ }
+ crit[next++] = "keySerialNumber >= " + canonicalFrom;
+ }
+ if (document.serialNumberRangeCritForm.serialTo.value != "") {
+ if (isHex(document.serialNumberRangeCritForm.serialTo.value)) {
+ canonicalTo = parseInt(stripPrefix(document.serialNumberRangeCritForm.serialTo.value),16);
+ } else {
+ canonicalTo = document.serialNumberRangeCritForm.serialTo.value;
+ }
+ crit[next++] = "keySerialNumber <= " +canonicalTo;
+ }
+
+ if (document.serialNumberRangeCritForm.serialFrom.value != "" &&
+ document.serialNumberRangeCritForm.serialTo.value != "") {
+ if (parseInt(canonicalFrom) > parseInt(canonicalTo)) {
+ alert("The low end of the range is larger than the high end.");
+ return null;
+ }
+ }
+
+ if (next == 0) {
+ return "keySerialNumber=*";
+ } else if (next == 1) {
+ return crit[0];
+ } else if (next == 2) {
+ return "&(" + crit[0] + ")(" + crit[1] + ")";
+ }
+ // return crit.join("&");
+}
+function archivedByCritInUse()
+{
+ return document.archivedByCritForm.inUse.checked;
+}
+
+function archivedByCrit()
+{
+ if (document.archivedByCritForm.archivedBy.value.length == 0) {
+ alert("User id in 'issued by' filter is empty");
+ return null;
+ }
+ return "keyArchivedBy = "+
+ document.archivedByCritForm.archivedBy.value;
+}
+
+function doSubmit(form)
+{
+ var andFilter = new Array;
+ var critCount = 0;
+
+ if (serialNumberRangeCritInUse()) {
+ if ((andFilter[critCount++] = serialNumberRangeCrit()) == null)
+ return;
+ }
+ if (ownerNameCritInUse()) {
+ if ((andFilter[critCount++] = ownerNameCrit()) == null)
+ return;
+ }
+ if (publicKeyCritInUse()) {
+ if ((andFilter[critCount++] = publicKeyCrit()) == null)
+ return;
+ }
+ if (archivedByCritInUse()) {
+ if ((andFilter[critCount++] = archivedByCrit()) == null)
+ return;
+ }
+
+ // At least one section must be selected
+ if (critCount == 0) {
+ alert("You must choose at least one section on this form.");
+ return;
+ } else if (critCount == 1) {
+ form.queryFilter.value = "(" + andFilter[0] + ")";
+ } else if (critCount == 2) {
+ form.queryFilter.value = "(&(" + andFilter[0] + ")(" +
+ andFilter[1] + "))";
+ } else if (critCount == 3) {
+ form.queryFilter.value = "(&(" + andFilter[0] + ")(" +
+ andFilter[1] + ")(" + andFilter[2] + "))";
+ } else if (critCount == 4) {
+ form.queryFilter.value = "(&(" + andFilter[0] + ")(" +
+ andFilter[1] + ")(" + andFilter[2] + ")(" +
+ andFilter[3] + "))";
+ }
+
+ // form.queryFilter.value = andFilter.join("&");
+
+ form.op.value = "srchKey";
+
+ keyQuery = "srchKey?op=" + form.op.value +
+ "&maxResults=" + form.maxResults.value +
+ "&maxCount=" + form.maxCount.value +
+ "&queryFilter=" +
+ produceHTTPEscapedString(form.queryFilter.value);
+
+ // Create two frames
+ window.location=keyQuery;
+}
+//-->
+</script>
+<body bgcolor="#FFFFFF">
+<font size=+1 face="PrimaSans BT, Verdana, sans-serif">Search for Keys
+</font>
+<br><font size=-1 face="PrimaSans BT, Verdana, sans-serif">Use this form
+to search for archived keys according to the criteria you specify.
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" BACKGROUND="/pki/images/hr.gif" >
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+</table>
+Each section lets you specify a key property. Select a property, then
+fill in any needed details in that section.
+You can combine search criteria to further narrow the search.
+<p>
+In the list of keys found by the search, you can click a button to display
+details about individual keys.
+</font>
+
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" BACKGROUND="/pki/images/hr.gif" >
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+</table>
+<b><font size=-1 face="PrimaSans BT, Verdana, sans-serif">Owner Name</font></b>
+<form name="ownerNameCritForm">
+<input type="CHECKBOX" name="inUse">
+<font size=-1 face="PrimaSans BT, Verdana, sans-serif">Show keys
+belonging to a particular owner</font>
+<blockquote>
+<table>
+<tr>
+<td>
+<font size=-1 face="PrimaSans BT, Verdana, sans-serif">Owner Name:</font>
+</td>
+<td>
+<input type="TEXT" name="ownerName" size=36>
+</td>
+</tr>
+</table>
+</blockquote>
+</form>
+
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" BACKGROUND="/pki/images/hr.gif" >
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+</table>
+<b><font size=-1 face="PrimaSans BT, Verdana, sans-serif">Key Identifiers</font></b>
+<form name="serialNumberRangeCritForm">
+<input type="CHECKBOX" name="inUse"><font size=-1 face="PrimaSans BT, Verdana, sans-serif">Show
+keys that fall within a particular range of key identifiers</font>
+<blockquote>
+<font size=-1 face="PrimaSans BT, Verdana, sans-serif">Enter
+a range of key identifiers in hexadecimal form (starting with 0x, as they appear in key displays) or in decimal form.</font>
+<p>
+<table>
+<tr>
+<td>
+<font size=-1 face="PrimaSans BT, Verdana, sans-serif">Lowest
+key identifier:</font>
+</td>
+<td>
+<input TYPE="TEXT" NAME="serialFrom" SIZE=10 MAXLENGTH=99">
+</td>
+<td>
+<font size=-1 face="PrimaSans BT, Verdana, sans-serif">
+(leave blank for no lower limit)
+</font>
+</td>
+</tr>
+<tr>
+<td>
+<font size=-1 face="PrimaSans BT, Verdana, sans-serif">Highest
+key identifier:</font>
+</td>
+<td>
+<input TYPE="TEXT" NAME="serialTo" SIZE=10 MAXLENGTH=99">
+</td>
+<td>
+<font size=-1 face="PrimaSans BT, Verdana, sans-serif">
+(leave blank for no upper limit)
+</font>
+</td>
+</tr>
+</table>
+</blockquote>
+</form>
+
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" BACKGROUND="/pki/images/hr.gif" >
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+</table>
+<b><font size=-1 face="PrimaSans BT, Verdana, sans-serif">Certificate</font></b>
+<form name="publicKeyCritForm">
+<input type="CHECKBOX" name="inUse"><font size=-1 face="PrimaSans BT, Verdana, sans-serif">Show
+the key that corresponds to the following certificate</font>
+<blockquote>
+<font size=-1 face="PrimaSans BT, Verdana, sans-serif">
+Copy the certificate, then paste it into this text area.</font>
+<p>
+<textarea name="publicKeyData" rows=10 cols=64></textarea></form>
+</blockquote>
+
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" BACKGROUND="/pki/images/hr.gif" >
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+</table>
+<b><font size=-1 face="PrimaSans BT, Verdana, sans-serif">Archiver</font></b>
+<form name="archivedByCritForm">
+<input type="CHECKBOX" name="inUse"><font size=-1 face="PrimaSans BT, Verdana, sans-serif">Show
+keys that have been archived by a particular server</font>
+<blockquote>
+<font size=-1 face="PrimaSans BT, Verdana, sans-serif">Enter
+the user ID of the Certificate Manager or Registration Manager that submitted the archival request to the Data Recovery Manager.</font>
+<p>
+<font size=-1 face="PrimaSans BT, Verdana, sans-serif">
+User ID:
+</font>
+<input TYPE="text" NAME="archivedBy" SIZE=10>
+<p>
+<font size=-1 face="PrimaSans BT, Verdana, sans-serif">
+Note: Archiver information is available only when the Certificate Manager or Registration Manager is remote from the Data Recovery Manager.
+</font>
+<p>
+</blockquote>
+</form>
+
+<br><form name="queryForm" action="srchKey" method=POST>
+<input type="HIDDEN" name="op" value="">
+<input type="HIDDEN" name="maxCount" VALUE="5">
+<input type="HIDDEN" name="queryFilter" VALUE="">
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" BACKGROUND="/pki/images/hr.gif" >
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+</table>
+
+<font size=-1 face="PrimaSans BT, Verdana, sans-serif"><b>Limits</b></font>
+<table border="0" cellspacing="2" cellpadding="2">
+ <tr>
+ <td align="right">
+ <font size=-1 face="PrimaSans BT, Verdana, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;
+ Maximum results:</font>
+ </td>
+ <td>
+ <INPUT TYPE="TEXT" NAME="maxResults" VALUE=10 SIZE=5 MAXLENGTH=10>
+ </td>
+ </tr>
+ <tr>
+ <td align="right">
+ <font size=-1 face="PrimaSans BT, Verdana, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;
+ Time limit (in seconds):</font>
+ </td>
+ <td>
+ <INPUT TYPE="TEXT" NAME="timeLimit" SIZE=5 MAXLENGTH=10>
+ </td>
+ </tr>
+</table>
+<br>
+<TABLE cellpadding="6" cellspacing="0" border="0" width="100%">
+<TR>
+<TD align="right" bgcolor="#eeeeee">
+<input type="button" value="Show Key" onClick='doSubmit(queryForm)'>
+<!-- <input type="button" value=Help
+onClick="help('/manual/agt_gide/kraagt.htm#1019227')"> -->
+</TD>
+</TR>
+</TABLE>
+</form>
+</body>
+</html>
diff --git a/base/kra/shared/webapps/kra/agent/kra/SrchRecoverKey.html b/base/kra/shared/webapps/kra/agent/kra/SrchRecoverKey.html
new file mode 100644
index 000000000..ccffb0775
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/SrchRecoverKey.html
@@ -0,0 +1,328 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.5 [en]C-NSCP (WinNT; I) [Netscape]">
+ <title>Recover Keys (for Administrators)</title>
+</head>
+
+<SCRIPT LANGUAGE="JavaScript"></SCRIPT>
+<script language="JavaScript" src="../funcs.js"></script>
+<script language="JavaScript" src="../helpfun.js"></script>
+<script language="JavaScript">
+//<!--
+function publicKeyCritInUse()
+{
+ return document.publicKeyCritForm.inUse.checked;
+}
+function publicKeyCrit()
+{
+ if (document.publicKeyCritForm.publicKeyData.value.length == 0) {
+ alert("No public key specified");
+ return null;
+ }
+ return "publicKey=x509cert#"+
+ escapeValue(document.publicKeyCritForm.publicKeyData.value);
+}
+function ownerNameCritInUse()
+{
+ return document.ownerNameCritForm.inUse.checked;
+}
+function ownerNameCrit()
+{
+ return "keyOwnerName=" + document.ownerNameCritForm.ownerName.value;
+}
+function serialNumberRangeCritInUse()
+{
+ return document.serialNumberRangeCritForm.inUse.checked;
+}
+
+function serialNumberRangeCrit()
+{
+ var crit = new Array;
+ var next = 0;
+
+ var canonicalFrom = "", canonicalTo = "";
+
+ if (document.serialNumberRangeCritForm.serialFrom.value != "") {
+ if (isHex(document.serialNumberRangeCritForm.serialFrom.value)) {
+ canonicalFrom = parseInt(stripPrefix(document.serialNumberRangeCritForm.serialFrom.value),16);
+ } else {
+ canonicalFrom = document.serialNumberRangeCritForm.serialFrom.value;
+ }
+ crit[next++] = "keySerialNumber >= " + canonicalFrom;
+ }
+ if (document.serialNumberRangeCritForm.serialTo.value != "") {
+ if (isHex(document.serialNumberRangeCritForm.serialTo.value)) {
+ canonicalTo = parseInt(stripPrefix(document.serialNumberRangeCritForm.serialTo.value),16);
+ } else {
+ canonicalTo = document.serialNumberRangeCritForm.serialTo.value;
+ }
+ crit[next++] = "keySerialNumber <= " +canonicalTo;
+ }
+
+ if (document.serialNumberRangeCritForm.serialFrom.value != "" &&
+ document.serialNumberRangeCritForm.serialTo.value != "") {
+ if (parseInt(canonicalFrom) > parseInt(canonicalTo)) {
+ alert("The low end of the range is larger than the high end.");
+ return null;
+ }
+ }
+
+ if (next == 0) {
+ return "keySerialNumber=*";
+ } else if (next == 1) {
+ return crit[0];
+ } else if (next == 2) {
+ return "&(" + crit[0] + ")(" + crit[1] + ")";
+ }
+ // return crit.join("&");
+}
+function archivedByCritInUse()
+{
+ return document.archivedByCritForm.inUse.checked;
+}
+
+function archivedByCrit()
+{
+ if (document.archivedByCritForm.archivedBy.value.length == 0) {
+ alert("User id in 'issued by' filter is empty");
+ return null;
+ }
+ return "keyArchivedBy = "+
+ document.archivedByCritForm.archivedBy.value;
+}
+
+function doSubmit(form)
+{
+ var andFilter = new Array;
+ var critCount = 0;
+
+ if (serialNumberRangeCritInUse()) {
+ if ((andFilter[critCount++] = serialNumberRangeCrit()) == null)
+ return;
+ }
+ if (ownerNameCritInUse()) {
+ if ((andFilter[critCount++] = ownerNameCrit()) == null)
+ return;
+ }
+ if (publicKeyCritInUse()) {
+ if ((andFilter[critCount++] = publicKeyCrit()) == null)
+ return;
+ form.publicKeyData.value = document.publicKeyCritForm.publicKeyData.value;
+ }
+ if (archivedByCritInUse()) {
+ if ((andFilter[critCount++] = archivedByCrit()) == null)
+ return;
+ }
+
+ // At least one section must be selected
+ if (critCount == 0) {
+ alert("You must choose at least one section on this form.");
+ return;
+ } else if (critCount == 1) {
+ form.queryFilter.value = "(" + andFilter[0] + ")";
+ } else if (critCount == 2) {
+ form.queryFilter.value = "(&(" + andFilter[0] + ")(" +
+ andFilter[1] + "))";
+ } else if (critCount == 3) {
+ form.queryFilter.value = "(&(" + andFilter[0] + ")(" +
+ andFilter[1] + ")(" + andFilter[2] + "))";
+ } else if (critCount == 4) {
+ form.queryFilter.value = "(&(" + andFilter[0] + ")(" +
+ andFilter[1] + ")(" + andFilter[2] + ")(" +
+ andFilter[3] + "))";
+ }
+
+ // form.queryFilter.value = andFilter.join("&");
+
+ form.op.value = "srchKeyForRecovery";
+
+ keyQuery = "srchKeyForRecovery?op=" + form.op.value +
+ "&maxResults=" + form.maxResults.value +
+ "&maxCount=" + form.maxCount.value +
+ "&queryFilter=" +
+ produceHTTPEscapedString(form.queryFilter.value);
+ if (form.publicKeyData.value != "") {
+ keyQuery = keyQuery + "&publicKeyData="+
+ produceHTTPEscapedString(form.publicKeyData.value);
+ }
+
+ // Create two frames
+ window.location=keyQuery;
+}
+//-->
+</script>
+<body bgcolor="#FFFFFF">
+<font size=+1 face="PrimaSans BT, Verdana, sans-serif">
+Recover Keys (for Administrators)</font>
+<br><font size=-1 face="PrimaSans BT, Verdana, sans-serif">Use this form
+to search for archived keys according to the criteria you specify.
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" BACKGROUND="/pki/images/hr.gif" >
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+</table>
+Each section
+lets you specify a key property. Select a property, then fill in any needed details in that section. You can combine search criteria to further narrow the search.
+<p>
+In the list of keys found by the search, you can click a button to recover individual keys.
+</font>
+
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" BACKGROUND="/pki/images/hr.gif" >
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+</table>
+<b><font size=-1 face="PrimaSans BT, Verdana, sans-serif">Owner Name</font></b>
+<form name="ownerNameCritForm">
+<input type="CHECKBOX" name="inUse">
+<font size=-1 face="PrimaSans BT, Verdana, sans-serif">Show
+keys belonging to a particular owner</font>
+<blockquote>
+<table>
+<tr>
+<td>
+<font size=-1 face="PrimaSans BT, Verdana, sans-serif">Owner Name:</font>
+</td>
+<td>
+<input type="TEXT" name="ownerName" size=36>
+</td>
+</tr>
+</table>
+</blockquote>
+</form>
+
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" BACKGROUND="/pki/images/hr.gif" >
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+</table>
+<b><font size=-1 face="PrimaSans BT, Verdana, sans-serif">Key Identifiers</font></b>
+<form name="serialNumberRangeCritForm">
+<input type="CHECKBOX" name="inUse"><font face="PrimaSans BT, Verdana, sans-serif"><font size=-1>Show
+keys that fall within a particular range of key identifiers</font></font>
+<blockquote>
+<font face="PrimaSans BT, Verdana, sans-serif"><font size=-1>Enter
+a range of key identifiers in hexadecimal form (starting with 0x, as they appear in key displays) or in decimal form.</font></font>
+<p>
+<table>
+<tr>
+<td>
+<font size=-1 face="PrimaSans BT, Verdana, sans-serif">Lowest
+key identifier:</font>
+</td>
+<td>
+<input TYPE="TEXT" NAME="serialFrom" SIZE=10 MAXLENGTH=99">
+</td>
+<td>
+<font size=-1 face="PrimaSans BT, Verdana, sans-serif">
+(leave blank for no lower limit)
+</font>
+</td>
+</tr>
+<tr>
+<td>
+<font size=-1 face="PrimaSans BT, Verdana, sans-serif">Highest
+key identifier:</font>
+</td>
+<td>
+<input TYPE="TEXT" NAME="serialTo" SIZE=10 MAXLENGTH=99">
+</td>
+<td>
+<font size=-1 face="PrimaSans BT, Verdana, sans-serif">
+(leave blank for no upper limit)
+</font>
+</td>
+</tr>
+</table>
+</blockquote>
+</form>
+
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" BACKGROUND="/pki/images/hr.gif" >
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+</table>
+<b><font size=-1 face="PrimaSans BT, Verdana, sans-serif">Certificate</font></b>
+<form name="publicKeyCritForm">
+<input type="CHECKBOX" name="inUse"><font size=-1 face="PrimaSans BT, Verdana, sans-serif">Show
+the key that corresponds to the following certificate</font>
+<blockquote>
+<font size=-1 face="PrimaSans BT, Verdana, sans-serif">
+Copy the certificate, then paste it into this text area.</font>
+<p>
+<textarea name="publicKeyData" rows=10 cols=64></textarea></form>
+</blockquote>
+
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" BACKGROUND="/pki/images/hr.gif" >
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+</table>
+<b><font size=-1 face="PrimaSans BT, Verdana, sans-serif">Archiver</font></b>
+<form name="archivedByCritForm">
+<input type="CHECKBOX" name="inUse"><font size=-1 face="PrimaSans BT, Verdana, sans-serif">Show
+keys that have been archived by</font> a particular server
+<blockquote>
+<font size=-1 face="PrimaSans BT, Verdana, sans-serif">
+Enter the user ID of the Certificate or Registration Manager that submitted the archival request to the Data Recovery Manager.
+</font>
+<p>
+<font size=-1 face="PrimaSans BT, Verdana, sans-serif">
+User ID:
+</font>
+<input TYPE="text" NAME="archivedBy" SIZE=10>
+<p>
+<font size=-1 face="PrimaSans BT, Verdana, sans-serif">
+Note: Archiver information is available only when the Certificate Manager or Registration Manager is remote from the Data Recovery Manager.
+</font>
+<p>
+</blockquote>
+</form>
+
+<br><form name="queryForm" action="srchKeyForRecovery" method=POST>
+<input type="HIDDEN" name="op" value="">
+<input type="HIDDEN" name="maxCount" VALUE="5">
+<input type="HIDDEN" name="queryFilter" VALUE="">
+<input type="HIDDEN" name="publicKeyData" VALUE="">
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" BACKGROUND="/pki/images/hr.gif" >
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+</table>
+
+<font size=-1 face="PrimaSans BT, Verdana, sans-serif"><b>Limits</b></font>
+<table border="0" cellspacing="2" cellpadding="2">
+ <tr>
+ <td align="right">
+ <font size=-1 face="PrimaSans BT, Verdana, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;
+ Maximum results:</font>
+ </td>
+ <td>
+ <INPUT TYPE="TEXT" NAME="maxResults" VALUE=10 SIZE=5 MAXLENGTH=10>
+ </td>
+ </tr>
+ <tr>
+ <td align="right">
+ <font size=-1 face="PrimaSans BT, Verdana, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;
+ Time limit (in seconds):</font>
+ </td>
+ <td>
+ <INPUT TYPE="TEXT" NAME="timeLimit" SIZE=5 MAXLENGTH=10>
+ </td>
+ </tr>
+</table>
+<br>
+<TABLE cellpadding="6" cellspacing="0" border="0" width="100%">
+<TR>
+<TD align="right" bgcolor="#eeeeee">
+<input type="button" value="Show Key" onClick='doSubmit(queryForm)'>
+<!-- <input type="button" value=Help
+onClick="help('/manual/agt_gide/kraagt.htm#1019227')"> -->
+</TD>
+</TR>
+</TABLE>
+</form>
+</body>
+</html>
diff --git a/base/kra/shared/webapps/kra/agent/kra/blank.html b/base/kra/shared/webapps/kra/agent/kra/blank.html
new file mode 100644
index 000000000..d2c04a676
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/blank.html
@@ -0,0 +1,10 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<title>Untitled Document</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#CCCCCC">
+</body>
+</html>
diff --git a/base/kra/shared/webapps/kra/agent/kra/confirmRecover.html b/base/kra/shared/webapps/kra/agent/kra/confirmRecover.html
new file mode 100644
index 000000000..94df8b7f7
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/confirmRecover.html
@@ -0,0 +1,6 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<HTML>
+<TITLE>Recover Key Confirm</TITLE>
+<HEAD>
+</BODY>
+</HTML>
diff --git a/base/kra/shared/webapps/kra/agent/kra/confirmRecoverBySerial.template b/base/kra/shared/webapps/kra/agent/kra/confirmRecoverBySerial.template
new file mode 100644
index 000000000..88a8d5c84
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/confirmRecoverBySerial.template
@@ -0,0 +1,70 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<HTML>
+<CMS_TEMPLATE>
+<TITLE>Recovering Key</TITLE>
+
+<HEAD>
+<BODY bgcolor="white">
+
+<SCRIPT LANGUAGE="JavaScript"></SCRIPT>
+<script language="JavaScript" src="../funcs.js"></script>
+<script language="JavaScript" src="../helpfun.js"></script>
+<SCRIPT LANGUAGE="JavaScript">
+function renderCredentialBoxes(m)
+{
+ var str = "";
+
+ for(var i = 0; i < m; ++i) {
+ str = str + "Agent ID#" + i +
+ ":<INPUT TYPE=text NAME=\"uid" + i +
+ "\" VALUE=\"\">" + "Password #" + i +
+ ":<INPUT TYPE=password NAME=\"pwd" + i +
+ "\" VALUE=\"\" AutoComplete=off >\n";
+ }
+ return str;
+}
+
+function renderRecoverButton(serialNumber, noOfAgents)
+{
+ return "<FORM METHOD=post "+
+ // "onSubmit=\"return recoverKey("+serialNumber+");\" "+
+ "ACTION=\""+ "/agent/kra/recoverBySerial" +"\">\n"+
+ renderCredentialBoxes(noOfAgents) +
+ "<INPUT TYPE=hidden NAME=\"op\" VALUE=\"recoverBySerial\">\n"+
+ "<INPUT TYPE=hidden NAME=\"serialNumber\" VALUE=\""+
+ serialNumber +"\">\n"+
+ "<h2><b>PKCS#12 Delivery:</b></h2>"+
+ "<p>"+
+ "<p><pre>"+
+ "PKCS#12 Password:<INPUT TYPE=password NAME=\"p12Password\" VALUE=\"\" AutoComplete=off >\n"+
+ "Receipient Email:<INPUT TYPE=text NAME=\"p12Delivery\" VALUE=\"\">\n"+
+ "</pre><p>"+
+ "<INPUT TYPE=hidden NAME=\"commit\" VALUE=\"yes\">"+
+ "<INPUT TYPE=submit VALUE=\"Recover\">"+
+ "</FORM>\n";
+}
+
+if (result.header.errorDetails != null) {
+ writeError(result.header.errorDetails);
+} else {
+ document.write("<h2><b>Warning:</b></h2>");
+ document.write("<p><pre>");
+ document.write("Microsoft's Internet Explorer does not support " +
+ "no-cache feature.");
+ document.write("There is a security risk where Administrator " +
+ "can use back button to steal the recovery agents' passwords.");
+ document.write("</pre>");
+ document.write("<h2><b>Key Content:</b></h2>");
+ document.write("<p><pre>");
+ document.write(result.header.publicKey);
+ document.write("</pre><p>");
+ document.write("<h2><b>Recovery Agent Credentials:</b></h2>");
+ document.write("<p><pre>");
+ document.write(renderRecoverButton(result.header.serialNumber,
+ result.header.noOfRequiredAgents));
+ document.write("</pre><p>");
+}
+</SCRIPT>
+<p>
+</BODY>
+</HTML>
diff --git a/base/kra/shared/webapps/kra/agent/kra/displayBySerial.template b/base/kra/shared/webapps/kra/agent/kra/displayBySerial.template
new file mode 100644
index 000000000..117535fa1
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/displayBySerial.template
@@ -0,0 +1,120 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+</head>
+<CMS_TEMPLATE>
+<title>Display Key</title>
+<head>
+</head>
+<body bgcolor="white">
+
+<SCRIPT LANGUAGE="JavaScript"></SCRIPT>
+<script language="JavaScript" src="../funcs.js"></script>
+<script language="JavaScript" src="../helpfun.js"></script>
+<script language="JavaScript">
+function toHex(number)
+{
+ var absValue = "", sign = "";
+ var digits = "0123456789abcdef";
+ if (number < 0) {
+ sign = "-";
+ number = -number;
+ }
+
+ for(; number >= 16 ; number = Math.floor(number/16)) {
+ absValue = digits.charAt(number % 16) + absValue;
+ }
+ absValue = digits.charAt(number % 16) + absValue;
+ return sign + absValue;
+}
+
+function renderHexNumber(number,width)
+{
+ var num = toHex(number);
+ while (num.length < width)
+ num = "0"+num;
+ return "0x"+num;
+}
+
+function renderDateFromSecs(secs)
+{
+ if (secs == null) return "";
+ var today = new Date();
+ var dateTmp = new Date();
+ dateTmp.setTime(secs * 1000);
+ var dateStr = dateTmp.toLocaleString();
+ return dateStr;
+}
+
+if (result.header.errorDetails != null) {
+ writeError(result.header.errorDetails);
+} else {
+ document.writeln(
+ '<font face="PrimaSans BT, Verdana, sans-serif"><font size=+1>'+
+ 'Key ' +
+ '<a href="' + '/kra/agent/kra/displayBySerial' +
+ '?op=displayBySerial&serialNumber=' + result.header.serialNumber + '"' +
+ 'onMouseOver=" return helpstatus(\'Click to redisplay this ' +
+ 'request \')" onMouseOut="return helpstatus(\'\')">' +
+ renderHexNumber(result.header.serialNumber,8) +
+ '</a></font></font>');
+ document.writeln('<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" BACKGROUND="/pki/images/hr.gif"><TR><TD>&nbsp;</TD></TR></TABLE>');
+
+ document.writeln('<table border="0" cellspacing="2" cellpadding="2" width="100%">');
+ document.writeln('<tr><td valign="top" align="left" colspan="3" bgcolor="#e5e5e5">');
+ document.writeln('<font size="-1" face="PrimaSans BT, Verdana, sans-serif">');
+ document.writeln('Key</font></td></tr>');
+ document.writeln('<tr>');
+ document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">State:</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + result.header.state + '</font></td>');
+ document.writeln('</tr>');
+
+ document.writeln('<tr>');
+ document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Created on:</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + renderDateFromSecs(result.header.archivedOn) + '</font></td>');
+ document.writeln('</tr>');
+
+ document.writeln('<tr>');
+ document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Updated on:</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + renderDateFromSecs(result.header.archivedOn) + '</font></td>');
+ document.writeln('</tr>');
+
+ document.writeln('<tr>');
+ document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Archiver:</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + result.header.archivedBy + '</font></td>');
+ document.writeln('</tr>');
+
+ document.writeln('<tr>');
+ document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Public key:</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + result.header.publicKey + '</font></td>');
+ document.writeln('</tr>');
+
+ document.writeln('<tr>');
+ document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Owner name:</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + result.header.ownerName + '</font></td>');
+ document.writeln('</tr>');
+
+ document.writeln('<tr>');
+ document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Key algorithm:</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + result.header.keyAlgorithm + '</font></td>');
+ document.writeln('</tr>');
+
+ if ((result.header.EllipticCurve != null)) {
+ document.writeln('<tr>');
+ document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Elliptic Key Curve:</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + result.header.EllipticCurve + '</font></td>');
+ document.writeln('</tr>');
+ } else {
+ document.writeln('<tr>');
+ document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Key length:</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + result.header.keyLength + '</font></td>');
+ document.writeln('</tr>');
+ }
+
+ document.write("</table>");
+ document.writeln('<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" BACKGROUND="/pki/images/hr.gif"><TR><TD>&nbsp;</TD></TR></TABLE>');
+}
+</script>
+</body>
+</html>
diff --git a/base/kra/shared/webapps/kra/agent/kra/displayBySerial2.template b/base/kra/shared/webapps/kra/agent/kra/displayBySerial2.template
new file mode 100644
index 000000000..30af980ec
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/displayBySerial2.template
@@ -0,0 +1,132 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+ <title>Display Certificate</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+</head>
+
+<CMS_TEMPLATE>
+
+
+<SCRIPT LANGUAGE="JavaScript">
+//<!--
+
+function navMajorVersion()
+{
+ return parseInt(navigator.appVersion.substring(0, navigator.appVersion.indexOf(".")));
+}
+
+function toHex(number)
+{
+ var absValue = "", sign = "";
+ var digits = "0123456789abcdef";
+ if (number < 0) {
+ sign = "-";
+ number = -number;
+ }
+
+ for(; number >= 16 ; number = Math.floor(number/16)) {
+ absValue = digits.charAt(number % 16) + absValue;
+ }
+ absValue = digits.charAt(number % 16) + absValue;
+
+ return sign + '0x' + '0' + absValue;
+}
+//-->
+</SCRIPT>
+
+<body bgcolor="#FFFFFF" link="#6666CC" vlink="#6666CC" alink="#333399">
+<font face="PrimaSans BT, Verdana, sans-serif" size="+1">Certificate
+<SCRIPT LANGUAGE="JavaScript">
+//<!--
+document.write('&nbsp;' + '0x0'+result.header.serialNumber);
+if (navigator.appName == 'Netscape' &&
+ navMajorVersion() > 3 &&
+ typeof(crypto.version) != "undefined") {
+ document.write(
+ '<input type=hidden name=cmmfResponse value=true>');
+}
+
+//-->
+</SCRIPT>
+</font><br>
+<table border="0" cellspacing="0" cellpadding="0" background="/pki/images/hr.gif" width="100%">
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+</table>
+
+<table border="0" cellspacing="2" cellpadding="2" width="100%">
+<tr align="left" bgcolor="#e5e5e5"><td align="left">
+<font face="PrimaSans BT, Verdana, sans-serif" size="-1">
+Certificate contents</font></td></tr></table>
+
+<pre>
+<SCRIPT LANGUAGE="JavaScript">
+document.write(result.header.certPrettyPrint);
+</SCRIPT>
+</pre>
+
+<p>
+<table border="0" cellspacing="2" cellpadding="2" width="100%">
+<tr align="left" bgcolor="#e5e5e5"><td align="left">
+<font face="PrimaSans BT, Verdana, sans-serif" size="-1">
+Certificate fingerprints</font></td></tr></table>
+
+<pre>
+<SCRIPT LANGUAGE="JavaScript">
+document.write(result.header.certFingerprint);
+</SCRIPT>
+</pre>
+
+<p>
+<table border="0" cellspacing="2" cellpadding="2" width="100%">
+<tr align="left" bgcolor="#e5e5e5"><td align="left">
+<font face="PrimaSans BT, Verdana, sans-serif" size="-1">
+Installing this certificate in a server</font></td></tr></table>
+
+<p>
+<font size=-1 face="PrimaSans BT, Verdana, sans-serif">
+The following format can be used to install this certificate into a server.
+<p>
+Base 64 encoded certificate
+</font>
+<p><pre>
+-----BEGIN CERTIFICATE-----
+<SCRIPT LANGUAUGE="JavaScript">
+document.write(result.header.certChainBase64);
+</SCRIPT>
+-----END CERTIFICATE-----
+</pre>
+
+<br><p>
+<table border="0" cellspacing="2" cellpadding="2" width="100%">
+<tr align="left" bgcolor="#e5e5e5"><td align="left">
+<font face="PrimaSans BT, Verdana, sans-serif" size="-1">
+Downloading this certificate</font></td></tr></table>
+<p>
+<font size=-1 face="PrimaSans BT, Verdana, sans-serif">
+To download the certificate into your system, click the following button.
+</font>
+<p>
+
+<SCRIPT LANGUAGE="JavaScript">
+document.write("<center>");
+var loc = '/agent/kra/getBySerial?serialNumber='+ result.header.serialNumber;
+if (navigator.appName == "Netscape") {
+ loc = loc + '&importCert=true';
+ if (navMajorVersion() > 3 && typeof(crypto.version) != "undefined") {
+ loc = loc + '&cmmfResponse=true';
+ }
+}
+document.write('<form>\n'+
+ '<INPUT TYPE=\"button\" VALUE=\"Download This Certificate\"'+
+ ' onClick=\"location.href=\''+ loc + '\'\">\n'+
+ '</form>\n');
+
+document.write("</center>");
+</SCRIPT>
+
+</font>
+</BODY>
+</HTML>
diff --git a/base/kra/shared/webapps/kra/agent/kra/displayBySerialForRecovery.template b/base/kra/shared/webapps/kra/agent/kra/displayBySerialForRecovery.template
new file mode 100644
index 000000000..125e02e4a
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/displayBySerialForRecovery.template
@@ -0,0 +1,239 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+</head>
+<CMS_TEMPLATE>
+<title>Display Key</title>
+<body bgcolor="white">
+
+<SCRIPT LANGUAGE="JavaScript">
+
+function PKCS12Password()
+{
+ if (document.forms[0].initAsyncRecovery.checked) {
+ document.forms[0].p12Password.disabled= true;
+ document.forms[0].p12PasswordAgain.disabled= true;
+ document.forms[0].nickname.disabled= true;
+ } else {
+ document.forms[0].p12Password.disabled= false;
+ document.forms[0].p12PasswordAgain.disabled= false;
+ document.forms[0].nickname.disabled= false;
+ }
+}
+</SCRIPT>
+<script language="JavaScript" src="../funcs.js"></script>
+<script language="JavaScript" src="../helpfun.js"></script>
+<script language="JavaScript">
+function toHex(number)
+{
+ var absValue = "", sign = "";
+ var digits = "0123456789abcdef";
+ if (number < 0) {
+ sign = "-";
+ number = -number;
+ }
+
+ for(; number >= 16 ; number = Math.floor(number/16)) {
+ absValue = digits.charAt(number % 16) + absValue;
+ }
+ absValue = digits.charAt(number % 16) + absValue;
+ return sign + absValue;
+}
+
+function renderHexNumber(number,width)
+{
+ var num = toHex(number);
+ while (num.length < width)
+ num = "0"+num;
+ return "0x"+num;
+}
+
+function renderDateFromSecs(secs)
+{
+ if (secs == null) return "";
+ var today = new Date();
+ var dateTmp = new Date();
+ dateTmp.setTime(secs * 1000);
+ var dateStr = dateTmp.toLocaleString();
+ return dateStr;
+}
+
+function renderCredentialBoxes(m)
+{
+ var str = "";
+
+ for(var i = 0; i < m; ++i) {
+ str = str +
+ "<tr>" +
+ "<td align=right><font size=-1 face=\"PrimaSans BT, Verdana, sans-serif\">" +
+ "Agent ID #" + i + ":" +
+ "</font></td>" +
+ "<td align=left><font size=-1 face=\"PrimaSans BT, Verdana, sans-serif\">" +
+ "<input type=text name=\"uid" + i +
+ "\" value=\"\">" +
+ "</font></td>" +
+ "</tr>" +
+ "<tr>" +
+ "<td align=right><font size=-1 face=\"PrimaSans BT, Verdana, sans-serif\">" +
+ "Password #" + i + ":" +
+ "</font></td>" +
+ "<td align=left><font size=-1 face=\"PrimaSans BT, Verdana, sans-serif\">" +
+ "<input type=password name=\"pwd" + i +
+ "\" value=\"\" AutoComplete=off >" +
+ "</font></td>" +
+ "</tr>";
+ }
+ return str;
+}
+
+if (result.header.errorDetails != null) {
+ writeError(result.header.errorDetails);
+} else {
+ document.writeln(
+ '<font face="PrimaSans BT, Verdana, sans-serif"><font size=+1>'+
+ 'Key ' +
+ '<a href="' + '/kra/agent/kra/displayBySerial?' +
+ 'op=displayBySerial&serialNumber=' + result.header.serialNumber + '"' +
+ 'onMouseOver=" return helpstatus(\'Click to redisplay this ' +
+ 'request \')" onMouseOut="return helpstatus(\'\')">' +
+ renderHexNumber(result.header.serialNumber,8) +
+ '</a></font></font>');
+
+ document.writeln('<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" BACKGROUND="/pki/images/hr.gif"><TR><TD>&nbsp;</TD></TR></TABLE>');
+
+ document.write('<form method=post ' +
+ 'action="' + '/kra/agent/kra/recoverBySerial' + '">\n');
+ document.writeln('<table border="0" cellspacing="2" cellpadding="2" width="100%">');
+ document.writeln('<tr><td valign="top" align="left" colspan="3" bgcolor="#e5e5e5">');
+ document.writeln('<font size="-1" face="PrimaSans BT, Verdana, sans-serif">');
+ document.writeln('Key</font></td></tr>');
+ document.writeln('<tr>');
+ document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">State:</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + result.header.state + '</font></td>');
+ document.writeln('</tr>');
+
+ document.writeln('<tr>');
+ document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Created on:</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + renderDateFromSecs(result.header.archivedOn) + '</font></td>');
+ document.writeln('</tr>');
+
+ document.writeln('<tr>');
+ document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Updated on:</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + renderDateFromSecs(result.header.archivedOn) + '</font></td>');
+ document.writeln('</tr>');
+
+ document.writeln('<tr>');
+ document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Archiver:</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + result.header.archivedBy + '</font></td>');
+ document.writeln('</tr>');
+
+ document.writeln('<tr>');
+ document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Public key:</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + result.header.publicKey + '</font></td>');
+ document.writeln('</tr>');
+
+ document.writeln('<tr>');
+ document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Owner name:</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + result.header.ownerName + '</font></td>');
+ document.writeln('</tr>');
+
+ document.writeln('<tr>');
+ document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Key algorithm:</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + result.header.keyAlgorithm + '</font></td>');
+ document.writeln('</tr>');
+
+ if (result.header.EllipticCurve != null) {
+ document.writeln('<tr>');
+ document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Elliptic Key Curve:</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + result.header.EllipticCurve + '</font></td>');
+ document.writeln('</tr>');
+ } else {
+ document.writeln('<tr>');
+ document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Key length:</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + result.header.keyLength + '</font></td>');
+ document.writeln('</tr>');
+ }
+
+ document.writeln('<tr>');
+ document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Async Recovery:</font></td>');
+ // initiate an asynchronous recovery or not
+ document.writeln('<td>');
+ document.write('<input type="checkbox" CHECKED onClick="PKCS12Password()" name="initAsyncRecovery" value="ON">');
+ document.writeln('</td>');
+ document.writeln('</tr>');
+
+ document.writeln('<tr>');
+ document.writeln('</tr>');
+
+ document.writeln('<tr>');
+ document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">PKCS #12 Password:</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif"><input type=password disabled name="p12Password" value="" AutoComplete=off ></font></td>');
+ document.writeln('</tr>');
+
+ document.writeln('<tr>');
+ document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">PKCS #12 Password again:</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif"><input type=password disabled name="p12PasswordAgain" value="" AutoComplete=off ></font></td>');
+ document.writeln('</tr>');
+
+ document.writeln('<tr>');
+ document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Nickname (Optional):</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif"><input type=text disabled name="nickname" value=""></font></td>');
+ document.writeln('</tr>');
+
+ // certificate
+ document.writeln('<tr>');
+ document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Certificate:</font></td>');
+ if (result.header.publicKeyData != null) {
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif"><textarea name=cert rows=10 cols=56>' + result.header.publicKeyData + '</textarea></font></td>');
+ } else {
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif"><textarea name=cert rows=10 cols=56></textarea></font></td>');
+ }
+ document.writeln('</tr>');
+
+ document.writeln('<tr>');
+ document.writeln('</tr>');
+
+ // use distributed-recovery mode or not
+ document.writeln('<tr>');
+ document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif"></font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">');
+ if (result.header.keySplitting == 'true') {
+ document.write('<input type="checkbox" CHECKED name="localAgents" Value="yes">');
+ } else {
+ document.write('<input type="hidden" name="localAgents" Value="yes">');
+ }
+ document.write('</font></td>');
+ document.writeln('</tr>');
+
+ // recovery ID
+/* recoery ID does not apply to async case
+ document.writeln('<tr>');
+ document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Recovery authorization reference number:</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + result.header.recoveryID + '</font></td>');
+ document.writeln('</tr>');
+ document.writeln('<input type=hidden name="op" value="recoverBySerial">');
+*/
+
+ if (result.header.keySplitting == 'true') {
+ document.write(renderCredentialBoxes(result.header.noOfRequiredAgents));
+ }
+
+ document.writeln('<input type=hidden name="recoveryID" VALUE="' +
+ result.header.recoveryID + '">\n');
+ document.writeln('<input type=hidden name="serialNumber" VALUE="' +
+ result.header.serialNumber + '">\n');
+ document.write('</table>');
+ document.writeln('<table cellpadding="6" cellspacing="0" border="0" width="100%">');
+ document.writeln('<tr>');
+ document.writeln('<td align="right" bgcolor="#e5e5e5">');
+ document.writeln('<input type=submit value="Recover">');
+ // document.writeln("<input type=button value=\"Help\" onClick=\"help('/manual/agt_gide/kraagt.htm#KeyRecoveryForm')\">");
+ document.writeln('</td>');
+ document.writeln('</tr>');
+ document.writeln('</table>');
+ document.writeln('</form>');
+}
+</script>
+</body>
+</html>
diff --git a/base/kra/shared/webapps/kra/agent/kra/examineRecovery.template b/base/kra/shared/webapps/kra/agent/kra/examineRecovery.template
new file mode 100644
index 000000000..f5a1f1f14
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/examineRecovery.template
@@ -0,0 +1,109 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<CMS_TEMPLATE>
+<title>Examine Recovery</title>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+</head>
+<body bgcolor="white">
+
+<SCRIPT LANGUAGE="JavaScript"></SCRIPT>
+<script language="JavaScript" src="../funcs.js"></script>
+<script language="JavaScript" src="../helpfun.js"></script>
+<script language="JavaScript">
+function toHex(number)
+{
+ var absValue = "", sign = "";
+ var digits = "0123456789abcdef";
+ if (number < 0) {
+ sign = "-";
+ number = -number;
+ }
+
+ for(; number >= 16 ; number = Math.floor(number/16)) {
+ absValue = digits.charAt(number % 16) + absValue;
+ }
+ absValue = digits.charAt(number % 16) + absValue;
+ return sign + absValue;
+}
+
+function renderHexNumber(number,width)
+{
+ var num = toHex(number);
+ while (num.length < width)
+ num = "0"+num;
+ return "0x"+num;
+}
+
+function renderDateFromSecs(secs)
+{
+ if (secs == null) return "";
+ var today = new Date();
+ var dateTmp = new Date();
+ dateTmp.setTime(secs * 1000);
+ var dateStr = dateTmp.toLocaleString();
+ return dateStr;
+}
+
+if (result.header.errorDetails != null) {
+ writeError(result.header.errorDetails);
+} else {
+ document.writeln(
+ '<font face="PrimaSans BT, Verdana, sans-serif"><font size=+1>'+
+ 'Recovery Operation ' + result.header.recoveryID +
+ '</font></font>');
+
+ document.writeln('<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" BACKGROUND="/pki/images/hr.gif"><TR><TD>&nbsp;</TD></TR></TABLE>');
+ document.write('<form method=post ' +
+ 'action="' + '/kra/agent/kra/grantRecovery' + '">\n');
+
+ document.writeln('<table border="0" cellspacing="2" cellpadding="2" width="100%">');
+ document.writeln('<tr><td valign="top" align="left" colspan="3" bgcolor="#e5e5e5">');
+ document.writeln('<font size="-1" face="PrimaSans BT, Verdana, sans-serif">');
+ document.writeln('Key</font></td></tr>');
+
+ document.writeln('<tr>');
+ document.write('<td><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Key Identifier:</font> <font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + result.header.serialNumber + '</font></td>');
+ document.writeln('</tr>');
+ document.writeln('<tr>');
+ document.write('<td><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Owner Name:</font> <font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + result.header.ownerName + '</font></td>');
+ document.writeln('</tr>');
+ document.writeln('<tr>');
+ document.write('<td><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Key Algorithm:</font> <font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + result.header.keyAlgorithm + '</font></td>');
+ document.writeln('</tr>');
+ document.writeln('<tr>');
+ document.write('<td><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Public Key:</font> <font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + result.header.publicKey + '</font></td>');
+ document.writeln('</tr>');
+
+ document.writeln('<tr>');
+ document.writeln('</tr>');
+
+ document.writeln('<tr>');
+ if (result.header.keySplitting == 'true') {
+ document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Agent Identifier:</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif"><input type=text name="agentID" value=""></font></td>');
+ document.writeln('</tr>'); document.writeln('<tr>'); document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Agent Password:</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif"><input type=password name="agentPWD" value="" AutoComplete=off ></font></td>');
+ document.writeln('</tr>');
+ document.writeln('<tr>');
+ }
+ document.writeln('</tr>');
+
+ document.writeln('<input type=hidden name="op" value="grantRecovery">');
+ document.writeln('<input type=hidden name="recoveryID" VALUE="' +
+ result.header.recoveryID + '">\n');
+ document.write('</table>');
+
+ document.writeln('<table cellpadding="6" cellspacing="0" border="0" width="100%">');
+ document.writeln('<tr>');
+ document.writeln('<td align="right" bgcolor="#e5e5e5">');
+ document.writeln('<input type=submit value="Grant">');
+ // document.writeln("<input type=button value=\"Help\" onClick=\"help('/manual/agt_gide/kraagt.htm#1022642')\">");
+ document.writeln('</td>');
+ document.writeln('</tr>');
+ document.writeln('</table>');
+ document.writeln('</form>');
+}
+</script>
+</body>
+</html>
diff --git a/base/kra/shared/webapps/kra/agent/kra/finishAsyncRecovery.template b/base/kra/shared/webapps/kra/agent/kra/finishAsyncRecovery.template
new file mode 100644
index 000000000..0d2caf676
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/finishAsyncRecovery.template
@@ -0,0 +1,101 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<title>Key Recovery Result</title>
+</head>
+<body bgcolor="white">
+<CMS_TEMPLATE>
+
+<SCRIPT LANGUAGE="JavaScript"></SCRIPT>
+<script language="JavaScript" src="../funcs.js"></script>
+<script language="JavaScript" src="../helpfun.js"></script>
+<script language="JavaScript">
+//<!--
+function displayApprovalRecord(agentNumber, agentName)
+{
+ document.writeln("Agent" + agentNumber + " (" + agentName +
+ ") has approved the request.");
+}
+function toHex(number)
+{
+ var absValue = "", sign = "";
+ var digits = "0123456789abcdef";
+ if (number < 0) {
+ sign = "-";
+ number = -number;
+ }
+
+ for(; number >= 16 ; number = Math.floor(number/16)) {
+ absValue = digits.charAt(number % 16) + absValue;
+ }
+ absValue = digits.charAt(number % 16) + absValue;
+ return sign + absValue;
+}
+
+function renderHexNumber(number,width)
+{
+ var num = toHex(number);
+ while (num.length < width)
+ num = "0"+num;
+ return "0x"+num;
+}
+
+if (result.header.errorDetails != null) {
+ writeError(result.header.errorDetails);
+} else {
+ document.write('<font face="PrimaSans BT, Verdana, sans-serif" size=+1>Key Recovery Status</font>');
+ document.write('<center><hr width="100%"></center>');
+
+
+ document.writeln('<table border="0" cellspacing="2" cellpadding="2" width="100%">');
+ document.write('<td><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Recovery Authorization Reference Number:</font> <font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + result.header.recoveryID + '</font></td>');
+ document.writeln('</tr>');
+
+ document.writeln('<tr>');
+ document.write('<td><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Key Identifier:</font> <font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + renderHexNumber(result.header.serialNumber,8) + '</font></td>');
+ document.writeln('</tr>');
+ document.write('</table>');
+
+ document.write("<pre>");
+ document.write('<font face="PrimaSans BT, Verdana, sans-serif">');
+ document.writeln('The request has been submitted.');
+ document.writeln(result.header.noOfRequiredAgents +
+ ' recovery agents are required for authorization.' );
+ document.writeln('<p>');
+ for(var i = 0; i < result.recordSet.length; ++i ) {
+ displayApprovalRecord(i+1, result.recordSet[i].agentName);
+ }
+ if (result.recordSet.length < result.header.noOfRequiredAgents) {
+ document.writeln('Waiting for the remaining approvals ...');
+ } else if (result.header.status != "complete") {
+ document.writeln('<p>');
+ document.writeln('The key is being recovered ...');
+ }
+ document.write('</font>');
+ document.write("</pre>");
+
+ document.write('<font size="-1" face="PrimaSans BT, Verdana, sans-serif">');
+ if (result.header.status == "complete") {
+ document.writeln("<p>");
+ document.writeln("The request is completed.");
+ document.writeln("<p>");
+
+ document.writeln(
+ 'If the key is not saved, you will need to go through the ' +
+ 'recovery process again. ' +
+ 'Click ' +
+ '<a href="/kra/agent/kra/getAsyncPk12?reqID=' +
+ result.header.requestID + '"' +
+ 'onMouseOver=" return helpstatus(\'Click to get key in PKCS12 ' +
+ '\')" onMouseOut="return helpstatus(\'\')">' +
+ "here" +
+ '</a>' + ' to save the recovered key in PKCS12 format.'
+);
+ }
+ document.write('</font>');
+}
+
+//-->
+</script>
+</BODY>
+</HTML>
diff --git a/base/kra/shared/webapps/kra/agent/kra/finishRecovery.template b/base/kra/shared/webapps/kra/agent/kra/finishRecovery.template
new file mode 100644
index 000000000..e73a26237
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/finishRecovery.template
@@ -0,0 +1,101 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<title>Key Recovery Result</title>
+</head>
+<body bgcolor="white">
+<CMS_TEMPLATE>
+
+<SCRIPT LANGUAGE="JavaScript"></SCRIPT>
+<script language="JavaScript" src="../funcs.js"></script>
+<script language="JavaScript" src="../helpfun.js"></script>
+<script language="JavaScript">
+//<!--
+function displayApprovalRecord(agentNumber, agentName)
+{
+ document.writeln("Agent" + agentNumber + " (" + agentName +
+ ") has approved the request.");
+}
+function toHex(number)
+{
+ var absValue = "", sign = "";
+ var digits = "0123456789abcdef";
+ if (number < 0) {
+ sign = "-";
+ number = -number;
+ }
+
+ for(; number >= 16 ; number = Math.floor(number/16)) {
+ absValue = digits.charAt(number % 16) + absValue;
+ }
+ absValue = digits.charAt(number % 16) + absValue;
+ return sign + absValue;
+}
+
+function renderHexNumber(number,width)
+{
+ var num = toHex(number);
+ while (num.length < width)
+ num = "0"+num;
+ return "0x"+num;
+}
+
+if (result.header.errorDetails != null) {
+ writeError(result.header.errorDetails);
+} else {
+ document.write('<font face="PrimaSans BT, Verdana, sans-serif" size=+1>Key Recovery Status</font>');
+ document.write('<center><hr width="100%"></center>');
+
+
+ document.writeln('<table border="0" cellspacing="2" cellpadding="2" width="100%">');
+ document.write('<td><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Recovery Authorization Reference Number:</font> <font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + result.header.recoveryID + '</font></td>');
+ document.writeln('</tr>');
+
+ document.writeln('<tr>');
+ document.write('<td><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Key Identifier:</font> <font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + renderHexNumber(result.header.serialNumber,8) + '</font></td>');
+ document.writeln('</tr>');
+ document.write('</table>');
+
+ document.write("<pre>");
+ document.write('<font face="PrimaSans BT, Verdana, sans-serif">');
+ document.writeln('The request has been submitted.');
+ document.writeln(result.header.noOfRequiredAgents +
+ ' recovery agents are required for authorization.' );
+ document.writeln('<p>');
+ for(var i = 0; i < result.recordSet.length; ++i ) {
+ displayApprovalRecord(i+1, result.recordSet[i].agentName);
+ }
+ if (result.recordSet.length < result.header.noOfRequiredAgents) {
+ document.writeln('Waiting for the remaining approvals ...');
+ } else if (result.header.status != "complete") {
+ document.writeln('<p>');
+ document.writeln('The key is being recovered ...');
+ }
+ document.write('</font>');
+ document.write("</pre>");
+
+ document.write('<font size="-1" face="PrimaSans BT, Verdana, sans-serif">');
+ if (result.header.status == "complete") {
+ document.writeln("<p>");
+ document.writeln("The request is completed.");
+ document.writeln("<p>");
+
+ document.writeln(
+ 'If the key is not saved, you will need to go through the ' +
+ 'recovery process again. ' +
+ 'Click ' +
+ '<a href="/kra/agent/kra/getPk12?recoveryID=' +
+ result.header.recoveryID + '"' +
+ 'onMouseOver=" return helpstatus(\'Click to get key in PKCS12 ' +
+ '\')" onMouseOut="return helpstatus(\'\')">' +
+ "here" +
+ '</a>' + ' to save the recovered key in PKCS12 format.'
+);
+ }
+ document.write('</font>');
+}
+
+//-->
+</script>
+</BODY>
+</HTML>
diff --git a/base/kra/shared/webapps/kra/agent/kra/frameGrant.html b/base/kra/shared/webapps/kra/agent/kra/frameGrant.html
new file mode 100644
index 000000000..14b3ced02
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/frameGrant.html
@@ -0,0 +1,18 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<title>Untitled Document</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<frameset cols="140,1*" border="0" frameborder="NO">
+ <frame src="menuGrant.html" NORESIZE scrolling="NO" frameborder="NO" marginwidth="0" marginheight="0" name="left">
+
+ <frame src="grantRecovery.html" marginwidth="16" marginheight="16" frameborder="NO" NORESIZE name="content">
+
+</frameset>
+<noframes><body bgcolor="#FFFFFF">
+
+</body></noframes>
+</html>
+
diff --git a/base/kra/shared/webapps/kra/agent/kra/frameRecover.html b/base/kra/shared/webapps/kra/agent/kra/frameRecover.html
new file mode 100644
index 000000000..60cd76f41
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/frameRecover.html
@@ -0,0 +1,18 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<title>Untitled Document</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<frameset cols="140,1*" border="0" frameborder="NO">
+ <frame src="menuRecover.html" NORESIZE scrolling="NO" frameborder="NO" marginwidth="0" marginheight="0" name="left">
+
+ <frame src="srchRecoverKey.html" marginwidth="16" marginheight="16" frameborder="NO" NORESIZE name="content">
+
+</frameset>
+<noframes><body bgcolor="#FFFFFF">
+
+</body></noframes>
+</html>
+
diff --git a/base/kra/shared/webapps/kra/agent/kra/frameRequest.html b/base/kra/shared/webapps/kra/agent/kra/frameRequest.html
new file mode 100644
index 000000000..ae544e34b
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/frameRequest.html
@@ -0,0 +1,18 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<title>Untitled Document</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<frameset cols="140,1*" border="0" frameborder="NO">
+ <frame src="menuRequest.html" NORESIZE scrolling="NO" frameborder="NO" marginwidth="0" marginheight="0" name="left">
+
+ <frame src="listRequests.html" marginwidth="16" marginheight="16" frameborder="NO" NORESIZE name="content">
+
+</frameset>
+<noframes><body bgcolor="#FFFFFF">
+
+</body></noframes>
+</html>
+
diff --git a/base/kra/shared/webapps/kra/agent/kra/frameSearch.html b/base/kra/shared/webapps/kra/agent/kra/frameSearch.html
new file mode 100644
index 000000000..a48fee2e6
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/frameSearch.html
@@ -0,0 +1,18 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<title>Untitled Document</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<frameset cols="140,1*" border="0" frameborder="NO">
+ <frame src="menuSearch.html" NORESIZE scrolling="NO" frameborder="NO" marginwidth="0" marginheight="0" name="left">
+
+ <frame src="srchKey.html" marginwidth="16" marginheight="16" frameborder="NO" NORESIZE name="content">
+
+</frameset>
+<noframes><body bgcolor="#FFFFFF">
+
+</body></noframes>
+</html>
+
diff --git a/base/kra/shared/webapps/kra/agent/kra/frameStats.html b/base/kra/shared/webapps/kra/agent/kra/frameStats.html
new file mode 100644
index 000000000..57a24de47
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/frameStats.html
@@ -0,0 +1,18 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<title>Untitled Document</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<frameset cols="140,1*" border="0" frameborder="NO">
+ <frame src="menuStats.html" NORESIZE scrolling="NO" frameborder="NO" marginwidth="0" marginheight="0" name="left">
+
+ <frame src="/getStats" marginwidth="16" marginheight="16" frameborder="NO" NORESIZE name="content">
+
+</frameset>
+<noframes><body bgcolor="#FFFFFF">
+
+</body></noframes>
+</html>
+
diff --git a/base/kra/shared/webapps/kra/agent/kra/getApprovalStatus.template b/base/kra/shared/webapps/kra/agent/kra/getApprovalStatus.template
new file mode 100644
index 000000000..5a6a1114a
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/getApprovalStatus.template
@@ -0,0 +1,102 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<META HTTP-EQUIV="Refresh" CONTENT="5">
+<title>Key Recovery Result</title>
+</head>
+<body bgcolor="white">
+<CMS_TEMPLATE>
+
+<SCRIPT LANGUAGE="JavaScript"></SCRIPT>
+<script language="JavaScript" src="../funcs.js"></script>
+<script language="JavaScript" src="../helpfun.js"></script>
+<script language="JavaScript">
+//<!--
+function displayApprovalRecord(agentNumber, agentName)
+{
+ document.writeln("Agent" + agentNumber + " (" + agentName +
+ ") has approved the request.");
+}
+function toHex(number)
+{
+ var absValue = "", sign = "";
+ var digits = "0123456789abcdef";
+ if (number < 0) {
+ sign = "-";
+ number = -number;
+ }
+
+ for(; number >= 16 ; number = Math.floor(number/16)) {
+ absValue = digits.charAt(number % 16) + absValue;
+ }
+ absValue = digits.charAt(number % 16) + absValue;
+ return sign + absValue;
+}
+
+function renderHexNumber(number,width)
+{
+ var num = toHex(number);
+ while (num.length < width)
+ num = "0"+num;
+ return "0x"+num;
+}
+
+if (result.header.errorDetails != null) {
+ writeError(result.header.errorDetails);
+} else {
+ document.write('<font face="PrimaSans BT, Verdana, sans-serif" size=+1>Key Recovery Status</font>');
+ document.write('<center><hr width="100%"></center>');
+
+
+ document.writeln('<table border="0" cellspacing="2" cellpadding="2" width="100%">');
+ document.write('<td><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Recovery Authorization Reference Number:</font> <font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + result.header.recoveryID + '</font></td>');
+ document.writeln('</tr>');
+
+ document.writeln('<tr>');
+ document.write('<td><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Key Identifier:</font> <font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + renderHexNumber(result.header.serialNumber,8) + '</font></td>');
+ document.writeln('</tr>');
+ document.write('</table>');
+
+ document.write("<pre>");
+ document.write('<font face="PrimaSans BT, Verdana, sans-serif">');
+ document.writeln('The request has been submitted.');
+ document.writeln(result.header.noOfRequiredAgents +
+ ' recovery agents are required for authorization.' );
+ document.writeln('<p>');
+ for(var i = 0; i < result.recordSet.length; ++i ) {
+ displayApprovalRecord(i+1, result.recordSet[i].agentName);
+ }
+ if (result.recordSet.length < result.header.noOfRequiredAgents) {
+ document.writeln('Waiting for the remaining approvals ...');
+ } else if (result.header.status != "complete") {
+ document.writeln('<p>');
+ document.writeln('The key is being recovered ...');
+ }
+ document.write('</font>');
+ document.write("</pre>");
+
+ document.write('<font size="-1" face="PrimaSans BT, Verdana, sans-serif">');
+ if (result.header.status == "complete") {
+ document.writeln("<p>");
+ document.writeln("The request is completed.");
+ document.writeln("<p>");
+
+ document.writeln(
+ 'If the key is not saved, you will need to go through the ' +
+ 'recovery process again. ' +
+ 'Click ' +
+ '<a href="/kra/agent/kra/getPk12?recoveryID=' +
+ result.header.recoveryID + '"' +
+ 'onMouseOver=" return helpstatus(\'Click to get key in PKCS12 ' +
+ '\')" onMouseOut="return helpstatus(\'\')">' +
+ "here" +
+ '</a>' + ' to save the recovered key in PKCS12 format.'
+);
+ }
+ document.write('</font>');
+}
+
+//-->
+</script>
+</BODY>
+</HTML>
diff --git a/base/kra/shared/webapps/kra/agent/kra/getStats.template b/base/kra/shared/webapps/kra/agent/kra/getStats.template
new file mode 100644
index 000000000..b2cb3415a
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/getStats.template
@@ -0,0 +1,124 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+ <title>Display CRL</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<SCRIPT LANGUAGE="JavaScript"></SCRIPT>
+<SCRIPT LANGUAGE="JavaScript" SRC="../helpfun.js"></SCRIPT>
+<SCRIPT LANGUAGE="JavaScript">
+<!--
+if (navigator.appName == "Microsoft Internet Explorer") {
+ document.writeln('<META HTTP-EQUIV="Pragma" CONTENT="no-cache">');
+}
+//-->
+</SCRIPT>
+</head>
+
+<CMS_TEMPLATE>
+
+<body bgcolor="#FFFFFF" link="#6666CC" vlink="#6666CC" alink="#333399">
+<font face="PrimaSans BT, Verdana, sans-serif" size="+1">
+Statistics
+</font><br>
+<table border="0" cellspacing="0" cellpadding="0" background="/pki/images/hr.gif" width="100%">
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+</table>
+<br>
+
+<SCRIPT LANGUAGE="JavaScript">
+<!--
+ document.writeln('<table border="0" cellspacing="0" cellpadding="0" width="100%">');
+ document.writeln('<tr align="left" bgcolor="#e5e5e5"><td align="left">');
+ document.writeln('<font face="PrimaSans BT, Verdana, sans-serif" size="-1">');
+ document.writeln('Detailed Information (Start Time <b>' + header.startTime + '</b>, Current Time: <b>' + header.curTime + '</b>)</font></td><td align=right><a href="getStats?op=clear">Clear Statistics</a></td></tr></table>');
+
+ document.writeln('<table border="0" cellspacing="2" cellpadding="2" width="100%">');
+ document.writeln('<tr>');
+ document.writeln('<td width="40%">');
+ document.writeln('<font size=-1 face="PrimaSans BT, Verdana, sans-serif">');
+ document.writeln('<b>Action</b></font></td>');
+ document.writeln('<td align="left">');
+ document.writeln('<font size=-1 face="PrimaSans BT, Verdana, sans-serif">');
+ document.writeln('<b># of operations</b></font></td>');
+ document.writeln('<td align="left">');
+ document.writeln('<font size=-1 face="PrimaSans BT, Verdana, sans-serif">');
+ document.writeln('<b>Time Taken (in msec)</b></font></td>');
+ document.writeln('<td align="left">');
+ document.writeln('<font size=-1 face="PrimaSans BT, Verdana, sans-serif">');
+ document.writeln('<b>Min</b></font></td>');
+ document.writeln('<td align="left">');
+ document.writeln('<font size=-1 face="PrimaSans BT, Verdana, sans-serif">');
+ document.writeln('<b>Max</b></font></td>');
+ document.writeln('<td align="left">');
+ document.writeln('<font size=-1 face="PrimaSans BT, Verdana, sans-serif">');
+ document.writeln('<b>Std Dev</b></font></td>');
+ document.writeln('<td align="left">');
+ document.writeln('<font size=-1 face="PrimaSans BT, Verdana, sans-serif">');
+ document.writeln('<b>Avg</b></font></td>');
+ document.writeln('<td align="left">');
+ document.writeln('<font size=-1 face="PrimaSans BT, Verdana, sans-serif">');
+ document.writeln('<b>Percentage</b></font></td>');
+ document.writeln('</tr>');
+ for (var i = 0; i <= recordCount; i++) {
+ if (result.recordSet[i].name.charAt(0) == '-') {
+ document.writeln('<tr><td>');
+ } else {
+ document.writeln('<tr bgcolor="#cccccc"><td>');
+ }
+ document.writeln('<font size=-1 face="PrimaSans BT, Verdana, sans-serif">');
+ document.writeln(result.recordSet[i].name + '</font></td>');
+ document.writeln('<td>');
+ document.writeln('<font size=-1 face="PrimaSans BT, Verdana, sans-serif">');
+ document.writeln(result.recordSet[i].noOfOp+'</font></td>');
+ document.writeln('<td>');
+ document.writeln('<font size=-1 face="PrimaSans BT, Verdana, sans-serif">');
+ document.writeln(result.recordSet[i].timeTaken+'</font></td>');
+ document.writeln('<td>');
+ document.writeln('<font size=-1 face="PrimaSans BT, Verdana, sans-serif">');
+ if (result.recordSet[i].max == -1) {
+ document.writeln('-</font></td>');
+ } else {
+ document.writeln(result.recordSet[i].min+'</font></td>');
+ }
+ document.writeln('<td>');
+ document.writeln('<font size=-1 face="PrimaSans BT, Verdana, sans-serif">');
+ if (result.recordSet[i].max == -1) {
+ document.writeln('-</font></td>');
+ } else {
+ document.writeln(result.recordSet[i].max+'</font></td>');
+ }
+ document.writeln('<td>');
+ document.writeln('<font size=-1 face="PrimaSans BT, Verdana, sans-serif">');
+ if (result.recordSet[i].stddev == -1) {
+ document.writeln('-</font></td>');
+ } else {
+ document.writeln(result.recordSet[i].stddev+'</font></td>');
+ }
+ document.writeln('<td>');
+ document.writeln('<font size=-1 face="PrimaSans BT, Verdana, sans-serif">');
+ if (result.recordSet[i].noOfOp == 0) {
+ document.writeln('-');
+ } else {
+ document.writeln(Math.round(100*(result.recordSet[i].avg))/100);
+ }
+ document.writeln('</font></td>');
+ document.writeln('<td>');
+ document.writeln('<font size=-1 face="PrimaSans BT, Verdana, sans-serif">');
+ if (result.recordSet[i].noOfOp == 0) {
+ document.writeln('-');
+ } else {
+ document.writeln(Math.round(100*(result.recordSet[i].percentage))/100 + '%');
+ }
+ document.writeln('</font></td>');
+ document.writeln('</tr>');
+ }
+ document.writeln('</table><br>');
+
+//-->
+</SCRIPT>
+
+</BODY>
+</HTML>
+
diff --git a/base/kra/shared/webapps/kra/agent/kra/grantAsyncRecovery.template b/base/kra/shared/webapps/kra/agent/kra/grantAsyncRecovery.template
new file mode 100644
index 000000000..c76e61ac4
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/grantAsyncRecovery.template
@@ -0,0 +1,45 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<CMS_TEMPLATE>
+<head><title>Key Recovery Grant Result</title></head>
+<body bgcolor="white">
+
+<SCRIPT LANGUAGE="JavaScript"></SCRIPT>
+<script language="JavaScript" src="../funcs.js"></script>
+<script language="JavaScript" src="../helpfun.js"></script>
+<script language="JavaScript">
+//<!--
+function toHex(number)
+{
+ var absValue = "", sign = "";
+ var digits = "0123456789abcdef";
+ if (number < 0) {
+ sign = "-";
+ number = -number;
+ }
+
+ for(; number >= 16 ; number = Math.floor(number/16)) {
+ absValue = digits.charAt(number % 16) + absValue;
+ }
+ absValue = digits.charAt(number % 16) + absValue;
+ return sign + absValue;
+}
+
+if (result.header.errorDetails != null) {
+ writeError(result.header.errorDetails);
+} else {
+ document.write('<font face="PrimaSans BT, Verdana, sans-serif" size=+1>Key Recovery Result</font>');
+ document.write('<center><hr width="100%"></center>');
+ document.write("<p>");
+ document.write('<font face="PrimaSans BT, Verdana, sans-serif" size=-1>');
+ document.write('Asynchronous Key recovery request' +
+'<a href="/kra/agent/kra/processReq?op=processReq&seqNum=' +
+ result.header.requestID+'"> ' + result.header.requestID + '</a>' +
+ ' has been granted by ' + result.header.agentID);
+ document.write('</font>');
+}
+
+//-->
+</script>
+</BODY>
+</HTML>
diff --git a/base/kra/shared/webapps/kra/agent/kra/grantRecovery.template b/base/kra/shared/webapps/kra/agent/kra/grantRecovery.template
new file mode 100644
index 000000000..906da8338
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/grantRecovery.template
@@ -0,0 +1,44 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<CMS_TEMPLATE>
+<head><title>Key Recovery Result</title></head>
+<body bgcolor="white">
+
+<SCRIPT LANGUAGE="JavaScript"></SCRIPT>
+<script language="JavaScript" src="../funcs.js"></script>
+<script language="JavaScript" src="../helpfun.js"></script>
+<script language="JavaScript">
+//<!--
+function toHex(number)
+{
+ var absValue = "", sign = "";
+ var digits = "0123456789abcdef";
+ if (number < 0) {
+ sign = "-";
+ number = -number;
+ }
+
+ for(; number >= 16 ; number = Math.floor(number/16)) {
+ absValue = digits.charAt(number % 16) + absValue;
+ }
+ absValue = digits.charAt(number % 16) + absValue;
+ return sign + absValue;
+}
+
+if (result.header.errorDetails != null) {
+ writeError(result.header.errorDetails);
+} else {
+ document.write('<font face="PrimaSans BT, Verdana, sans-serif" size=+1>Key Recovery Result</font>');
+ document.write('<center><hr width="100%"></center>');
+ document.write("<p>");
+ document.write('<font face="PrimaSans BT, Verdana, sans-serif" size=-1>');
+ document.write('Recovery of key with key identifier ' +
+ toHex(result.header.serialNumber) +
+ ' has been granted by ' + result.header.agentID);
+ document.write('</font>');
+}
+
+//-->
+</script>
+</BODY>
+</HTML>
diff --git a/base/kra/shared/webapps/kra/agent/kra/index.html b/base/kra/shared/webapps/kra/agent/kra/index.html
new file mode 100644
index 000000000..3caedfb99
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/index.html
@@ -0,0 +1,18 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<title>DRM Agent</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<link rel="shortcut icon" href="/pki/images/favicon.ico" />
+</head>
+
+<frameset rows="105,1*" frameborder="NO" border="0">
+ <frame src="/kra/agent/header?selected=kra" name="top" NORESIZE scrolling="NO" frameborder="NO" marginwidth="0" marginheight="0">
+
+ <frame src="frameRequest.html" scrolling="NO" name="middle" NORESIZE frameborder="NO" marginwidth="0" marginheight="0">
+</frameset>
+<noframes><body bgcolor="#FFFFFF">
+
+</body></noframes>
+</html>
+
diff --git a/base/kra/shared/webapps/kra/agent/kra/menuCheck.html b/base/kra/shared/webapps/kra/agent/kra/menuCheck.html
new file mode 100644
index 000000000..0787f104c
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/menuCheck.html
@@ -0,0 +1,33 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<title>Untitled Document</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#CCCCCC" link="#FFFFFF" vlink="#FFFFFF" alink="#333399">
+ <table border="0" cellspacing="4" cellpadding="4" width="100%">
+ <tr>
+ <td bgcolor="#999999"><font size="-1" face="PrimaSans BT, Verdana, sans-serif">
+ <a href="frameRequest.html" target="middle"><b>List Requests</b></a></font></td>
+ </tr>
+ <tr>
+ <td bgcolor="#999999"><font size="-1" face="PrimaSans BT, Verdana, sans-serif">
+ <a href="frameSearch.html" target="middle"><b>Search for Keys</b></font></td>
+ </tr>
+ <tr>
+ <td bgcolor="#999999"><font size="-1" face="PrimaSans BT, Verdana, sans-serif">
+ <a href="frameRecover.html" target="middle"><b>Recover Keys</b></font></td>
+ </tr>
+ <tr>
+ </tr>
+ <tr>
+ </tr>
+ <tr>
+ <td bgcolor="#999999"><font size="-1" face="PrimaSans BT, Verdana, sans-serif">
+ <a href="frameGrant.html" target="middle"><b>Authorize Recovery</b></font></td>
+ </tr>
+ </table>
+</body>
+</html>
+
diff --git a/base/kra/shared/webapps/kra/agent/kra/menuGrant.html b/base/kra/shared/webapps/kra/agent/kra/menuGrant.html
new file mode 100644
index 000000000..594dfaf06
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/menuGrant.html
@@ -0,0 +1,33 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<title>Untitled Document</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#CCCCCC" link="#FFFFFF" vlink="#FFFFFF" alink="#333399">
+ <table border="0" cellspacing="4" cellpadding="4" width="100%">
+ <tr>
+ <td bgcolor="#999999"><font size="-1" face="PrimaSans BT, Verdana, sans-serif">
+ <a href="frameRequest.html" target="middle"><b>List Requests</b></a></font></td>
+ </tr>
+ <tr>
+ <td bgcolor="#999999"><font size="-1" face="PrimaSans BT, Verdana, sans-serif">
+ <a href="frameSearch.html" target="middle"><b>Search for Keys</b></font></td>
+ </tr>
+ <tr>
+ <td bgcolor="#999999"><font size="-1" face="PrimaSans BT, Verdana, sans-serif">
+ <a href="frameRecover.html" target="middle"><b>Recover Keys</b></font></td>
+ </tr>
+ <tr>
+ </tr>
+ <tr>
+ </tr>
+ <tr>
+ <td bgcolor="white"><font size="-1" face="PrimaSans BT, Verdana, sans-serif">
+ <a href="frameGrant.html" target="middle"><b><font color=black>Authorize Recovery</font></b></font></td>
+ </tr>
+ </table>
+</body>
+</html>
+
diff --git a/base/kra/shared/webapps/kra/agent/kra/menuRecover.html b/base/kra/shared/webapps/kra/agent/kra/menuRecover.html
new file mode 100644
index 000000000..1439917d4
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/menuRecover.html
@@ -0,0 +1,33 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<title>Untitled Document</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#CCCCCC" link="#FFFFFF" vlink="#FFFFFF" alink="#333399">
+ <table border="0" cellspacing="4" cellpadding="4" width="100%">
+ <tr>
+ <td bgcolor="#999999"><font size="-1" face="PrimaSans BT, Verdana, sans-serif">
+ <a href="frameRequest.html" target="middle"><b>List Requests</b></font></td>
+ </tr>
+ <tr>
+ <td bgcolor="#999999"><font size="-1" face="PrimaSans BT, Verdana, sans-serif">
+ <a href="frameSearch.html" target="middle"><b>Search for Keys</b></a></font></td>
+ </tr>
+ <tr>
+ <td bgcolor="white"><font size="-1" face="PrimaSans BT, Verdana, sans-serif">
+ <a href="frameRecover.html" target="middle"><b><font color=black>Recover Keys</font></b></a></font></td>
+ </tr>
+ <tr>
+ </tr>
+ <tr>
+ </tr>
+ <tr>
+ <td bgcolor="#999999"><font size="-1" face="PrimaSans BT, Verdana, sans-serif">
+ <a href="frameGrant.html" target="middle"><b>Authorize Recovery</b></a></font></td>
+ </tr>
+ </table>
+</body>
+</html>
+
diff --git a/base/kra/shared/webapps/kra/agent/kra/menuRequest.html b/base/kra/shared/webapps/kra/agent/kra/menuRequest.html
new file mode 100644
index 000000000..69a5300a6
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/menuRequest.html
@@ -0,0 +1,33 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<title>Untitled Document</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#CCCCCC" link="#FFFFFF" vlink="#FFFFFF" alink="#333399">
+ <table border="0" cellspacing="4" cellpadding="4" width="100%">
+ <tr>
+ <td bgcolor="white"><font size="-1" face="PrimaSans BT, Verdana, sans-serif">
+ <a href="frameRequest.html" target="middle"><b><font color=black>List Requests</font></b></a></font></td>
+ </tr>
+ <tr>
+ <td bgcolor="#999999"><font size="-1" face="PrimaSans BT, Verdana, sans-serif">
+ <a href="frameSearch.html" target="middle"><b>Search for Keys</b></font></td>
+ </tr>
+ <tr>
+ <td bgcolor="#999999"><font size="-1" face="PrimaSans BT, Verdana, sans-serif">
+ <a href="frameRecover.html" target="middle"><b>Recover Keys</b></font></td>
+ </tr>
+ <tr>
+ </tr>
+ <tr>
+ </tr>
+ <tr>
+ <td bgcolor="#999999"><font size="-1" face="PrimaSans BT, Verdana, sans-serif">
+ <a href="frameGrant.html" target="middle"><b>Authorize Recovery</b></font></td>
+ </tr>
+ </table>
+</body>
+</html>
+
diff --git a/base/kra/shared/webapps/kra/agent/kra/menuSearch.html b/base/kra/shared/webapps/kra/agent/kra/menuSearch.html
new file mode 100644
index 000000000..e3f23d53f
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/menuSearch.html
@@ -0,0 +1,33 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<title>Untitled Document</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#CCCCCC" link="#FFFFFF" vlink="#FFFFFF" alink="#333399">
+ <table border="0" cellspacing="4" cellpadding="4" width="100%">
+ <tr>
+ <td bgcolor="#999999"><font size="-1" face="PrimaSans BT, Verdana, sans-serif">
+ <a href="frameRequest.html" target="middle"><b>List Requests</b></a></font></td>
+ </tr>
+ <tr>
+ <td bgcolor="white"><font size="-1" face="PrimaSans BT, Verdana, sans-serif">
+ <a href="frameSearch.html" target="middle"><b><font color=black>Search for Keys</font></b></font></td>
+ </tr>
+ <tr>
+ <td bgcolor="#999999"><font size="-1" face="PrimaSans BT, Verdana, sans-serif">
+ <a href="frameRecover.html" target="middle"><b>Recover Keys</b></font></td>
+ </tr>
+ <tr>
+ </tr>
+ <tr>
+ </tr>
+ <tr>
+ <td bgcolor="#999999"><font size="-1" face="PrimaSans BT, Verdana, sans-serif">
+ <a href="frameGrant.html" target="middle"><b>Authorize Recovery</b></font></td>
+ </tr>
+ </table>
+</body>
+</html>
+
diff --git a/base/kra/shared/webapps/kra/agent/kra/menuStats.html b/base/kra/shared/webapps/kra/agent/kra/menuStats.html
new file mode 100644
index 000000000..2d132b185
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/menuStats.html
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<title>Untitled Document</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#CCCCCC" link="#FFFFFF" vlink="#FFFFFF" alink="#333399">
+ <table border="0" cellspacing="4" cellpadding="4" width="100%">
+ <tr>
+ <td bgcolor="#999999"><font size="-1" face="PrimaSans BT, Verdana, sans-serif">
+ <a href="frameRequest.html" target="middle"><b>List Requests</b></a></font></td>
+ </tr>
+ <tr>
+ <td bgcolor="#999999"><font size="-1" face="PrimaSans BT, Verdana, sans-serif">
+ <a href="frameSearch.html" target="middle"><b>Search for Keys</b></font></td>
+ </tr>
+ <tr>
+ <td bgcolor="#999999"><font size="-1" face="PrimaSans BT, Verdana, sans-serif">
+ <a href="frameRecover.html" target="middle"><b>Recover Keys</b></font></td>
+ </tr>
+ <tr>
+ </tr>
+ <tr>
+ </tr>
+ <tr>
+ <td bgcolor="#999999"><font size="-1" face="PrimaSans BT, Verdana, sans-serif">
+ <a href="frameGrant.html" target="middle"><b>Authorize Recovery</b></font></td>
+ </tr>
+ <tr>
+ <td bgcolor="white"><font size="-1" face="PrimaSans BT, Verdana, sans-serif">
+ <a href="frameStats.html" target="middle"><b><font color="black">Statistics</font></b></font></td>
+ </tr>
+ </table>
+</body>
+</html>
+
diff --git a/base/kra/shared/webapps/kra/agent/kra/monitor.template b/base/kra/shared/webapps/kra/agent/kra/monitor.template
new file mode 100644
index 000000000..35896baf1
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/monitor.template
@@ -0,0 +1,184 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<HTML>
+<HEAD><TITLE>Monitor</TITLE>
+<SCRIPT LANGUAGE="JavaScript"></SCRIPT>
+</HEAD>
+<CMS_TEMPLATE>
+<BODY bgcolor="white">
+<font size="+1" face="PrimaSans BT, Verdana, Arial, Helvetica, sans-serif">
+Monitor
+</font>
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" BACKGROUND="/pki/images/hr.gif" >
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+</table>
+
+<SCRIPT LANGUAUGE="JavaScript">
+if (result.header.error != null) {
+ document.writeln('<font size="-1" face="PrimaSans BT, Verdana, Arial, Helvetica, sans-serif">');
+ document.writeln('CS monitor encountered the following error:'+result.header.error);
+ document.writeln('</font>');
+} else if (result.header.issuerName != null &&
+ result.header.startDate != null &&
+ result.header.interval != null &&
+ result.header.numberOfIntervals != null &&
+ result.header.totalNumberOfRequests != null &&
+ result.header.totalNumberOfCertificates != null) {
+ var timeRange = result.header.interval * result.header.numberOfIntervals;
+
+ document.writeln('<font size="-1" face="PrimaSans BT, Verdana, Arial, Helvetica, sans-serif">');
+
+ document.write('The following authority: '+result.header.issuerName+
+ ' during <b>'+timeRange+' seconds</b>, starting from '+
+ result.header.startDate+', processed <b>'+
+ result.header.totalNumberOfRequests+' requests</b>');
+ if (result.header.totalNumberOfCertificates > 0)
+ document.write(' and generated <b>'+result.header.totalNumberOfCertificates+
+ ' certificates</b>');
+ document.writeln('.<br>&nbsp;');
+ document.writeln('</font>');
+
+ if ((typeof(result.recordSet) != "undefined") && (result.recordSet.length > 0)) {
+ var addCerts = 0;
+ if (result.recordSet[0].numberOfCertificates != null)
+ addCerts = 1;
+
+ document.writeln('<table BORDER=1 CELLSPACING=0 CELLPADDING=4 align="center">');
+ document.writeln('<tr>');
+ document.writeln('<td align="center" BGCOLOR="#e5e5e5">');
+ document.writeln('<font size="-1" face="PrimaSans BT, Verdana, Arial, Helvetica, sans-serif">');
+ document.writeln('Interval number</font></td>');
+ document.writeln('<td align="center" BGCOLOR="#e5e5e5">');
+ document.writeln('<font size="-1" face="PrimaSans BT, Verdana, Arial, Helvetica, sans-serif">');
+ document.writeln('Number of requests</font></td>');
+ if (addCerts == 1) {
+ document.writeln('<td align="center" BGCOLOR="#e5e5e5">');
+ document.writeln('<font size="-1" face="PrimaSans BT, Verdana, Arial, Helvetica, sans-serif">');
+ document.writeln('Number of certificates</font></td>');
+ }
+ document.writeln('</tr>');
+
+ var maxCerts = 0;
+ var maxReqs = 0;
+ for (var i = 0; i < result.recordSet.length; i++) {
+ document.writeln('<tr>');
+ document.writeln('<td align="center">');
+ document.writeln('<font size="-1" face="PrimaSans BT, Verdana, Arial, Helvetica, sans-serif">');
+ document.writeln(' '+(i+1)+' </font></td>');
+ document.writeln('<td align="center">');
+ document.writeln('<font size="-1" face="PrimaSans BT, Verdana, Arial, Helvetica, sans-serif">');
+ if (result.recordSet[i].numberOfRequests != null &&
+ result.recordSet[i].numberOfRequests > 0 &&
+ result.recordSet[i].firstRequest != null) {
+ document.write('<a href="queryReq?seqNumFrom='+result.recordSet[i].firstRequest+
+ '&reqType=showAll&reqState=showAll&maxCount='+
+ result.recordSet[i].numberOfRequests+
+ '&totalRecordCount='+result.recordSet[i].numberOfRequests+'">'+
+ result.recordSet[i].numberOfRequests+'</a>');
+ } else if (result.recordSet[i].numberOfRequests != null) {
+ document.write(' '+result.recordSet[i].numberOfRequests);
+ } else {
+ document.write(' 0');
+ }
+ document.writeln('</font></td>');
+ if (result.recordSet[i].numberOfRequests > maxReqs)
+ maxReqs = result.recordSet[i].numberOfRequests;
+ if (addCerts == 1) {
+ document.writeln('<td align="center">');
+ document.writeln('<font size="-1" face="PrimaSans BT, Verdana, Arial, Helvetica, sans-serif">');
+ if (result.recordSet[i].numberOfCertificates != null &&
+ result.recordSet[i].numberOfCertificates > 0 &&
+ result.recordSet[i].startTime != null &&
+ result.recordSet[i].endTime != null) {
+ document.write('<a href="srchCerts?queryCertFilter=(%26(requestCreateTime%3e%3d'+
+ result.recordSet[i].startTime+
+ ')(requestCreateTime%3c%3d'+
+ result.recordSet[i].endTime+'))&maxResults='+
+ (result.recordSet[i].numberOfCertificates+1)+'">'+
+ result.recordSet[i].numberOfCertificates+'</a>');
+ if (result.recordSet[i].numberOfCertificates > maxCerts)
+ maxCerts = result.recordSet[i].numberOfCertificates;
+ } else if (result.recordSet[i].numberOfCertificates != null) {
+ document.write(' '+result.recordSet[i].numberOfCertificates);
+ } else {
+ document.write(' 0');
+ }
+ document.writeln('</font></td>');
+ }
+ document.writeln('</tr>');
+ }
+ if (result.header.totalNumberOfRequests != null) {
+ document.writeln('<tr>');
+ document.writeln('<td align="center" BGCOLOR="#eeeeee">');
+ document.writeln('<font size="-1" face="PrimaSans BT, Verdana, Arial, Helvetica, sans-serif">');
+ document.writeln('Total</font></td>');
+ document.writeln('<td align="center" BGCOLOR="#eeeeee">');
+ document.writeln('<font size="-1" face="PrimaSans BT, Verdana, Arial, Helvetica, sans-serif">');
+ document.writeln(' '+result.header.totalNumberOfRequests+' </font></td>');
+ if (addCerts == 1) {
+ document.writeln('<td align="center" BGCOLOR="#eeeeee">');
+ document.writeln('<font size="-1" face="PrimaSans BT, Verdana, Arial, Helvetica, sans-serif">');
+ if (result.header.totalNumberOfCertificates != null) {
+ document.write(' '+result.header.totalNumberOfCertificates);
+ } else {
+ document.write('0');
+ }
+ document.writeln('</font></td>');
+ }
+ document.writeln('</tr>');
+ }
+ if (result.recordSet.length > 0) {
+ document.writeln('<tr>');
+ document.writeln('<td align="center" BGCOLOR="#eeeeee">');
+ document.writeln('<font size="-1" face="PrimaSans BT, Verdana, Arial, Helvetica, sans-serif">');
+ document.writeln('Average</font></td>');
+ document.writeln('<td align="center" BGCOLOR="#eeeeee">');
+ document.writeln('<font size="-1" face="PrimaSans BT, Verdana, Arial, Helvetica, sans-serif">');
+ document.writeln(' '+result.header.totalNumberOfRequests+' / '+timeRange+'s = '+
+ (result.header.totalNumberOfRequests/timeRange)+'</font></td>');
+ if (addCerts == 1) {
+ document.writeln('<td align="center" BGCOLOR="#eeeeee">');
+ document.writeln('<font size="-1" face="PrimaSans BT, Verdana, Arial, Helvetica, sans-serif">');
+ document.write(' '+result.header.totalNumberOfCertificates+' / '+timeRange+'s = '+
+ (result.header.totalNumberOfCertificates/timeRange)+'</font></td>');
+ }
+ document.writeln('</tr>');
+
+ document.writeln('<tr>');
+ document.writeln('<td align="center" BGCOLOR="#eeeeee">');
+ document.writeln('<font size="-1" face="PrimaSans BT, Verdana, Arial, Helvetica, sans-serif">');
+ document.writeln('Max</font></td>');
+ document.writeln('<td align="center" BGCOLOR="#eeeeee">');
+ document.writeln('<font size="-1" face="PrimaSans BT, Verdana, Arial, Helvetica, sans-serif">');
+ document.writeln(' '+maxReqs+' / '+result.header.interval+'s = '+
+ (maxReqs/result.header.interval)+'</font></td>');
+ if (addCerts == 1) {
+ document.writeln('<td align="center" BGCOLOR="#eeeeee">');
+ document.writeln('<font size="-1" face="PrimaSans BT, Verdana, Arial, Helvetica, sans-serif">');
+ document.write(' '+maxCerts+' / '+result.header.interval+'s = '+
+ (maxCerts/result.header.interval)+'</font></td>');
+ }
+ document.writeln('</tr>');
+ }
+ document.writeln('</table><br>');
+
+ document.writeln('<DIV ALIGN="CENTER">');
+ document.writeln('<font size="-1" face="PrimaSans BT, Verdana, Arial, Helvetica, sans-serif">');
+ document.writeln('This table presents authority activity in the time range of '+
+ timeRange+' seconds divided into '+result.header.numberOfIntervals+
+ ' intervals ('+result.header.interval+' seconds each).');
+ document.writeln('</font>');
+ document.writeln('</DIV>');
+ }
+} else {
+ document.writeln('Error');
+}
+
+
+</SCRIPT>
+
+
+</BODY>
+</HTML>
+
diff --git a/base/kra/shared/webapps/kra/agent/kra/processReq.template b/base/kra/shared/webapps/kra/agent/kra/processReq.template
new file mode 100644
index 000000000..078764d98
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/processReq.template
@@ -0,0 +1,281 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<CMS_TEMPLATE>
+<SCRIPT LANGUAGE="JavaScript"></SCRIPT>
+<SCRIPT LANGUAGE="JavaScript" SRC="../helpfun.js"></SCRIPT>
+<SCRIPT LANGUAGE="JavaScript">
+//<!--
+
+function toHex(number)
+{
+ var absValue = "", sign = "";
+ var digits = "0123456789abcdef";
+ if (number < 0) {
+ sign = "-";
+ number = -number;
+ }
+
+ for(; number >= 16 ; number = Math.floor(number/16)) {
+ absValue = digits.charAt(number % 16) + absValue;
+ }
+ absValue = digits.charAt(number % 16) + absValue;
+ return sign + absValue;
+}
+
+function renderHexNumber(number,width)
+{
+ var num = toHex(number);
+ while (num.length < width)
+ num = "0"+num;
+ return "0x"+num;
+}
+
+function renderDateFromSecs(secs)
+{
+ if (secs == null) return "";
+ var today = new Date();
+ var dateTmp = new Date();
+ dateTmp.setTime(secs * 1000);
+ var dateStr = dateTmp.toLocaleString();
+ return dateStr;
+}
+
+function passwdValidate()
+{
+
+ if (document.forms[0].p12Password.value != document.forms[0].p12PasswordAgain.value) {
+ alert("Passwords do not match");
+ return false;
+ }
+ return true;
+}
+
+//
+// This form is a template that gets a preamble defining the contents
+// of the request form as a JavaScript object called 'result.header'.
+// whose properties are filled in by the server.
+//
+document.writeln('<body vlink="0000ff" alink="ff0000" link="0000ff" bgcolor="white">');
+document.writeln(
+ '<font face="PrimaSans BT, Verdana, sans-serif"><font size=+1>'+
+ 'Request ' +
+ '<a href="/kra/agent/kra/processReq?op=processReq&seqNum=' +
+ result.header.seqNum + '"' +
+ 'onMouseOver=" return helpstatus(\'Click to redisplay this ' +
+ 'request \')" onMouseOut="return helpstatus(\'\')">' +
+ result.header.seqNum +
+ '</a></font></font>');
+document.writeln('<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" BACKGROUND="/pki/images/hr.gif"><TR><TD></TD></TR></TABLE>');
+
+
+document.writeln('<form action="/kra/agent/kra/getAsyncPk12" method=post onSubmit="return passwdValidate()">');
+document.writeln('<table border="0" cellspacing="2" cellpadding="2" width="100%">');
+document.writeln('<tr><td valign="top" align="left" colspan="3" bgcolor="#e5e5e5">');
+document.writeln('<font size="-1" face="PrimaSans BT, Verdana, sans-serif">'
+);
+document.writeln('Request</font></td></tr>');
+document.writeln('<tr>');
+document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Status:</font></td>');
+document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + result.header.status + '</font></td>');
+document.writeln('</tr>');
+
+// Note these values are filtered for safety by the server.
+if (result.header.requestorName != null ||
+ result.header.requestorEmail != null ||
+ result.header.requestorPhone != null) {
+ document.writeln('<p><b> Requestor\'s Contact Information:</b><br>');
+ document.writeln('<blockquote>');
+ if (result.header.requestorName != null) {
+ document.writeln('<b> Name: </b>',
+ result.header.requestorName,
+ '<br>');
+ }
+ if (result.header.requestorEmail != null) {
+ document.writeln('<b> E-mail: </b>',
+ result.header.requestorEmail,
+ '<br>');
+ }
+ if (result.header.requestorPhone != null) {
+ document.writeln('<b> Phone: </b>',
+ result.header.requestorPhone,
+ '<br>');
+ }
+ document.writeln('</blockquote>');
+}
+
+// request type
+document.writeln('<tr>');
+document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Type:</font></td>');
+document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + result.header.requestType + '</font></td>');
+document.writeln('</tr>');
+
+// createdOn
+document.writeln('<tr>');
+document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Created on:</font></td>');
+document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + renderDateFromSecs(result.header.createdOn) + '</font></td>');
+document.writeln('</tr>');
+
+// updateBy
+document.writeln('<tr>');
+document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Updated by:</font></td>');
+document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + result.header.updatedBy + '</font></td>');
+document.writeln('</tr>');
+
+// updatedOn
+document.writeln('<tr>');
+document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Updated on:</font></td>');
+document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + renderDateFromSecs(result.header.updatedOn) + '</font></td>');
+document.writeln('</tr>');
+
+document.writeln('<INPUT TYPE="HIDDEN" NAME="seqNum" VALUE="' +
+ result.header.seqNum + '">');
+
+if (result.header.requestorName != null) {
+ document.writeln('<INPUT TYPE="HIDDEN" NAME="requestorName" VALUE="' +
+ result.header.requestorName + '">');
+}
+if (result.header.requestorEmail != null) {
+ document.writeln('<INPUT TYPE="HIDDEN" NAME="requestorEmail" VALUE="' +
+ result.header.requestorEmail + '">');
+}
+if (result.header.requestorPhone != null) {
+ document.writeln('<INPUT TYPE="HIDDEN" NAME="requestorPhone" VALUE="' +
+ result.header.requestorPhone + '">');
+}
+
+
+// Note: requestorComments are safely filtered by server
+if (result.header.requestorComments != null) {
+ document.writeln('<b> Comments Made When The Request Was Filed:</b><br>');
+ document.writeln('<blockquote>', result.header.requestorComments,
+ '</blockquote>');
+ document.writeln('<b> Additional Comments:</b><br>');
+ document.writeln('<blockquote>');
+ document.writeln('<INPUT TYPE="TEXT" NAME="moreComments" SIZE=72 VALUE="">');
+ document.writeln('</blockquote>');
+}
+
+if (result.header.requestType == "enrollment") {
+ document.writeln('<tr><td valign="top" align="left" colspan="3" bgcolor="#e5e5e5">');
+ document.writeln('<font size="-1" face="PrimaSans BT, Verdana, sans-serif">');
+ document.writeln('Archival Information</font></td></tr>');
+
+ // Archival-specific UI
+ document.writeln('<tr>');
+ document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Public key:</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + result.header.publicKey + '</font></td>');
+ document.writeln('</tr>');
+
+ document.writeln('<tr>');
+ document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Owner name:</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + result.header.ownerName + '</font></td>');
+ document.writeln('</tr>');
+
+ // key serial number
+ document.writeln('<tr>');
+ document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Key identifier:</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + result.header.serialNumber + '</font></td>');
+ document.writeln('</tr>');
+
+} else if (result.header.requestType == "recovery") {
+ document.writeln('<tr><td valign="top" align="left" colspan="3" bgcolor="#e5e5e5">');
+ document.writeln('<font size="-1" face="PrimaSans BT, Verdana, sans-serif">');
+ document.writeln('Recovery Information</font></td></tr>');
+
+ // Recovery-specific UI
+ // key serial number
+ document.writeln('<tr>');
+ document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Key identifier:</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + result.header.serialNumber + '</font></td>');
+ document.writeln('</tr>');
+
+ // Recovery agents who have approved the recovery request
+ var initAgent="";
+ var approveAgents="";
+ if (result.header.approvingAgents.indexOf(",")== -1) {
+ initAgent = result.header.approvingAgents;
+ } else {
+ initAgent = result.header.approvingAgents.substring(0,
+ result.header.approvingAgents.indexOf(","));
+ approveAgents = result.header.approvingAgents.substring(
+ result.header.approvingAgents.indexOf(",")+1);
+ }
+ document.writeln('<tr>');
+ document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Recovery Initiating Agent:</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + initAgent+ '</font></td>');
+ document.writeln('</tr>');
+ document.writeln('<tr>');
+ document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Recovery Approving Agents:</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + approveAgents
+ + '</font></td>');
+ document.writeln('</tr>');
+}
+
+
+if (result.header.status != "complete") {
+ document.writeln('<tr><td valign="top" align="left" colspan="3" bgcolor="#e5e5e5">');
+ document.writeln('<font size="-1" face="PrimaSans BT, Verdana, sans-serif">');
+ document.writeln('Action</font></td></tr>');
+ if (result.header.requestType == "recovery") {
+ if (result.header.status == "pending") {
+document.writeln('<tr>');
+document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">Asynchronous Key Recovery:</font></td>');
+ document.writeln('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif"><a href="/kra/agent/kra/grantAsyncRecovery?op=grantRecovery&reqID=' +
+ result.header.seqNum + '">' + ' Grant</a></font></td>');
+document.writeln('</tr>');
+
+ } else if (result.header.status == "approved") {
+ var initAgent = result.header.approvingAgents.substring(0,
+ result.header.approvingAgents.indexOf(","));
+
+ // get PKCS#12 password
+ document.writeln('<tr>');
+ document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">PKCS #12 Password:</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif"><input type=password name="p12Password" value="" AutoComplete=off ></font></td>');
+ document.writeln('</tr>');
+
+ document.writeln('<tr>');
+ document.write('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">PKCS #12 Password again:</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif"><input type=password name="p12PasswordAgain" value="" AutoComplete=off ></font></td>');
+ document.writeln('</tr>');
+
+ document.writeln('<tr>');
+ document.writeln('<input type=hidden name="op" VALUE="getAsyncPk12">');
+ document.writeln('<input type=hidden name="reqID" VALUE="' +
+ result.header.seqNum + '">\n');
+ document.writeln('<td align=right><font size="-1" face="PrimaSans BT, Verdana, sans-serif">(only allowed for initiating agent,' + initAgent+')</font></td>');
+ document.writeln('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif"><input type=submit value="Retrieve PKCS#12"></font></td>');
+ document.writeln('</tr>');
+ }
+ } else {
+ if (result.header.assignedTo != null) {
+ document.write('<b> Assigned To: </b>',result.header.assignedTo);
+ } else {
+ document.write('<b> Unassigned </b>');
+ }
+ if (result.header.assignedTo == null) {
+ document.write('<a href="/kra/agent/kra/processReq?op=processReq&doAssign=yes&seqNum=' +
+ result.header.seqNum + '"' +
+ 'onMouseOver=" return helpstatus(\'Click to assign the ' +
+ 'request to yourself\')" ' +
+ 'onMouseOut="return helpstatus(\'\')">',
+ ' Assign To Me','</a>');
+ } else if (result.header.assignedTo != result.header.callerName) {
+ document.write('<a href="/' +
+ '/kra/agent/kra/processReq?op=processReq&doAssign=yes&overrideAssignment=yes&seqNum=' + result.header.seqNum + '">',
+ ' Re-assign To Me', '</a>');
+ }
+ }
+}
+
+document.writeln('</table>');
+document.writeln('</form>');
+document.writeln('</body>');
+
+//-->
+</SCRIPT>
+
+</HTML>
diff --git a/base/kra/shared/webapps/kra/agent/kra/queryKey.template b/base/kra/shared/webapps/kra/agent/kra/queryKey.template
new file mode 100644
index 000000000..fd2348dc6
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/queryKey.template
@@ -0,0 +1,208 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<CMS_TEMPLATE>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+</head>
+
+<title>Key Query Result</title>
+<body bgcolor="white">
+
+<SCRIPT LANGUAGE="JavaScript"></SCRIPT>
+<script language="JavaScript" src="../funcs.js"></script>
+<script language="JavaScript" src="../helpfun.js"></script>
+<script language="JavaScript">
+//<!--
+
+function toHex(number)
+{
+ var absValue = "", sign = "";
+ var digits = "0123456789abcdef";
+ if (number < 0) {
+ sign = "-";
+ number = -number;
+ }
+
+ for(; number >= 16 ; number = Math.floor(number/16)) {
+ absValue = digits.charAt(number % 16) + absValue;
+ }
+ absValue = digits.charAt(number % 16) + absValue;
+ return sign + absValue;
+}
+
+function recoverKey(serialNumber)
+{
+ return confirm("WARNING!! You are about to do an irreversible operation.\nDo you really want to recover key # "+
+ renderHexNumber(serialNumber,8)+ " ?");
+}
+
+function renderOidName(oid)
+{
+ if (oid == "1.2.840.113549.1.1.1")
+ return "PKCS #1 RSA";
+ else if (oid == "1.2.840.113549.1.1.4")
+ return "PKCS #1 MD5 With RSA";
+ else
+ return "OID."+oid;
+}
+
+function renderHexNumber(number,width)
+{
+ var num = toHex(number);
+ while (num.length < width)
+ num = "0"+num;
+ return "0x"+num;
+}
+
+function renderDateFromSecs(secs)
+{
+ if (secs == null) return "";
+ var today = new Date();
+ var dateTmp = new Date();
+ dateTmp.setTime(secs * 1000);
+ var dateStr = dateTmp.toLocaleString();
+ return dateStr;
+}
+
+function renderDetailsButton(serialNumber)
+{
+ return '<form method=post '+
+ 'action="'+
+ '/kra/agent/kra/displayBySerial' +'">\n'+
+ '<input type=hidden name="op" value="displayBySerial">\n'+
+ '<input type=hidden name="serialNumber" value="'+
+ serialNumber +
+ '">\n'+
+ '<input type=submit value="Details"></form>\n';
+}
+
+function renderRecoverButton(serialNumber)
+{
+ return '<form method=post ' +
+ 'ACTION="'+
+ '/kra/agent/kra/confirmRecoverSerial' + '">\n'+
+ '<input type=hidden name="op" value="confirmRecoverBySerial">\n'+
+ '<input type=hidden name="serialNumber" VALUE="' +
+ serialNumber +
+ '">\n' +
+ '<input type=hidden name="commit" value="yes">' +
+ '<input type=hidden name="updateCRL" value="yes">' +
+ '<input type=submit value="Recover">' +
+ '</form>\n';
+}
+
+function displayKeyRecord(rec)
+{
+ document.write('<tr bgcolor=#e5e5e5>');
+ document.write('<td align=left>' +
+ '<font size=-1 face="PrimaSans BT, Verdana, sans-serif">Key identifier</font></td>');
+ document.write('<td align=left>' +
+ '<font size=-1 face="PrimaSans BT, Verdana, sans-serif">State</font></td>');
+ document.write('<td align=left>' +
+ '<font size=-1 face="PrimaSans BT, Verdana, sans-serif">Filed</font></td>');
+ document.write('<td align=left>' +
+ '<font size=-1 face="PrimaSans BT, Verdana, sans-serif">Updated</font></td>');
+ document.write('<td align=left>' +
+ '<font size=-1 face="PrimaSans BT, Verdana, sans-serif">Archiver</font></td>');
+ document.write('</tr>');
+
+ document.write('<tr>');
+ // document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif"><a href="' + '/kra/agent/kra/displayBySerial?' + 'op=displayBySerial&serialNumber=' + rec.serialNumber + '">' + renderHexNumber(rec.serialNumber,8) + '</a></font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + renderHexNumber(rec.serialNumber,8) + '</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + rec.state + '</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + renderDateFromSecs(rec.archivedOn) + '</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + renderDateFromSecs(rec.archivedOn) + '</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + rec.archivedBy + '</font></td>');
+ document.write('</tr>');
+
+ document.write('<tr bgcolor=#e5e5e5>');
+ document.write('<td>');
+ document.write('</td>');
+ document.write('<td align=left colspan=2>' +
+ '<font size=-1 face="PrimaSans BT, Verdana, sans-serif">Algorithm</font></td>');
+ document.write('<td align=left colspan=2>' +
+ '<font size=-1 face="PrimaSans BT, Verdana, sans-serif">Owner Name</font></td>');
+ document.write('</tr>');
+
+ document.write('<tr>');
+ document.write('<td>');
+ document.write(renderDetailsButton(rec.serialNumber));
+ document.write('</td>');
+ document.write('<td align=left colspan=2><font size="-1" face="PrimasSans BT, Verdana, sans-serif">' +
+ renderOidName(rec.keyAlgorithm) + (((rec.keyLength != null) && (rec.keyLength >= 0)) ?
+ " with "+ rec.keyLength + "-bit key" : ((rec.EllipticCurve != null)? " with " + rec.EllipticCurve:""))+ '</font></td>');
+ document.write('<td align=left colspan=2><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' +
+ rec.ownerName + '</font></td>');
+ document.write('</tr>');
+}
+
+function renderHidden(name,value)
+{
+ return '<INPUT TYPE="hidden" NAME="' + name + '" VALUE="">\n';
+}
+
+function doNext(form)
+{
+ form.action = '/kra/agent/kra/'+result.header.op;
+ form.op.value = result.header.op;
+ form.queryFilter.value = result.header.queryFilter;
+ form.querySentinel.value = result.header.querySentinel;
+ form.totalRecordCount.value = result.header.totalRecordCount;
+ form.submit();
+}
+
+function displayNextForm()
+{
+ document.write(
+ '<div align=center> \n'+
+ '<form name ="nextForm" method=POST ' +
+ 'onSubmit="doNext(nextForm);" '+
+ 'action="">\n'+
+ renderHidden("op")+
+ renderHidden("queryFilter")+
+ renderHidden("querySentinel")+
+ renderHidden("totalRecordCount"));
+ document.write(
+ '<input type=submit value=" Next "> '+
+ '<input type=text size=2 maxlength=99 name=maxCount value="'+
+ result.fixed.maxCount+
+ '"><font size="1" face="PrimasSans BT, Verdana, sans-serif"> record(s)</font>\n'+
+ '</FORM></DIV>\n');
+}
+
+if (result.header.errorDetails != null) {
+ writeError(result.header.errorDetails);
+} else if (result.header.totalRecordCount == 0) {
+ document.write('<font face="PrimaSans BT, Verdana, sans-serif" size=+1>Search Results</font>\n');
+ document.write('<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" BACKGROUND="/pki/images/hr.gif"><TR><TD>&nbsp;</TD></TR></TABLE>');
+ document.write('<div align=left><b><font face="PrimaSans BT, Verdana, sans-serif" size="+1">No Matching Key Found</font></b></div>\n');
+} else {
+ document.write('<font face="PrimaSans BT, Verdana, sans-serif" size=+1>Search Results</font>\n');
+ document.write('<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" BACKGROUND="/pki/images/hr.gif"><TR><TD>&nbsp;</TD></TR></TABLE>');
+ document.write('<font face="PrimaSans BT, Verdana, sans-serif" size=+1>');
+ document.write('Authority: ' +
+(result.header.archiverName != null ? result.header.archiverName : "UNKNOWN"));
+ document.write('</font><br>\n');
+ document.write('<font face="PrimaSans BT, Verdana, sans-serif" size=-1>');
+ document.write('Total Number of Records Found : ' +
+ result.header.totalRecordCount);
+ document.write('</font>\n');
+ document.write('<p>');
+
+ document.write('<table cellpadding=6 cellspacing=4 border=0 width=100%>');
+
+ for(var i = 0; i < result.recordSet.length; ++i ) {
+ displayKeyRecord(result.recordSet[i]);
+ }
+ document.write('</table>');
+ document.write('<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" BACKGROUND="/pki/images/hr.gif"><TR><TD>&nbsp;</TD></TR></TABLE>');
+
+ if (result.header.querySentinel != null) {
+ displayNextForm();
+ }
+}
+
+//-->
+</script>
+</body>
+</html>
diff --git a/base/kra/shared/webapps/kra/agent/kra/queryKeyForRecovery.template b/base/kra/shared/webapps/kra/agent/kra/queryKeyForRecovery.template
new file mode 100644
index 000000000..aec54464d
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/queryKeyForRecovery.template
@@ -0,0 +1,220 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<CMS_TEMPLATE>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+</head>
+<title>Key Query Result</title>
+<body bgcolor="white">
+<SCRIPT LANGUAGE="JavaScript"></SCRIPT>
+<script language="JavaScript" src="../funcs.js"></script>
+<script language="JavaScript" src="../helpfun.js"></script>
+<script language="JavaScript">
+//<!--
+
+function toHex(number)
+{
+ var absValue = "", sign = "";
+ var digits = "0123456789abcdef";
+ if (number < 0) {
+ sign = "-";
+ number = -number;
+ }
+
+ for(; number >= 16 ; number = Math.floor(number/16)) {
+ absValue = digits.charAt(number % 16) + absValue;
+ }
+ absValue = digits.charAt(number % 16) + absValue;
+ return sign + absValue;
+}
+
+function recoverKey(serialNumber)
+{
+ return confirm("WARNING!! You are about to do an irreversible operation.\nDo you really want to recover key # "+
+ renderHexNumber(serialNumber,8)+ " ?");
+}
+
+function renderOidName(oid)
+{
+ if (oid == "1.2.840.113549.1.1.1")
+ return "PKCS #1 RSA";
+ else if (oid == "1.2.840.113549.1.1.4")
+ return "PKCS #1 MD5 With RSA";
+ else
+ return "OID."+oid;
+}
+
+function renderHexNumber(number,width)
+{
+ var num = toHex(number);
+ while (num.length < width)
+ num = "0"+num;
+ return "0x"+num;
+}
+
+function renderDateFromSecs(secs)
+{
+ if (secs == null) return "";
+ var today = new Date();
+ var dateTmp = new Date();
+ dateTmp.setTime(secs * 1000);
+ var dateStr = dateTmp.toLocaleString();
+ return dateStr;
+}
+
+function renderDetailsButton(serialNumber,publicKeyData)
+{
+ if (publicKeyData != null) {
+ return '<form method=post '+
+ 'action="'+
+ '/kra/agent/kra/displayBySerialForRecovery' +'">\n'+
+ '<input type=hidden name="op" value="displayBySerialForRecovery">\n'+
+ '<input type=hidden name="serialNumber" value="'+
+ serialNumber +
+ '">\n'+
+ '<input type=hidden name="publicKeyData" value="'+
+ publicKeyData +
+ '">\n'+
+ '<input type=submit value="Recover"></form>\n';
+ } else {
+ return '<form method=post '+
+ 'action="'+
+ '/kra/agent/kra/displayBySerialForRecovery' +'">\n'+
+ '<input type=hidden name="op" value="displayBySerialForRecovery">\n'+
+ '<input type=hidden name="serialNumber" value="'+
+ serialNumber +
+ '">\n'+
+ '<input type=submit value="Recover"></form>\n';
+ }
+}
+
+function renderRecoverButton(serialNumber)
+{
+ return '<form method=post ' +
+ 'ACTION="'+
+ '/kra/agent/kra/confirmRecoverBySerialForRecovery' + '">\n'+
+ '<input type=hidden name="op" value="confirmRecoverBySerialForRecovery">\n'+
+ '<input type=hidden name="serialNumber" VALUE="' +
+ serialNumber +
+ '">\n' +
+ '<input type=hidden name="commit" value="yes">' +
+ '<input type=hidden name="updateCRL" value="yes">' +
+ '<input type=submit value="Recover">' +
+ '</form>\n';
+}
+
+function displayKeyRecord(rec)
+{
+ document.write('<tr bgcolor=#e5e5e5>');
+ document.write('<td align=left>' +
+ '<font size=-1 face="PrimaSans BT, Verdana, sans-serif">Key identifier<font></td>');
+ document.write('<td align=left>' +
+ '<font size=-1 face="PrimaSans BT, Verdana, sans-serif">State</font></td>');
+ document.write('<td align=left>' +
+ '<font size=-1 face="PrimaSans BT, Verdana, sans-serif">Filed</font></td>');
+ document.write('<td align=left>' +
+ '<font size=-1 face="PrimaSans BT, Verdana, sans-serif">Updated</font></td>');
+ document.write('<td align=left>' +
+ '<font size=-1 face="PrimaSans BT, Verdana, sans-serif">Archiver</font></td>');
+ document.write('</tr>');
+
+ document.write('<tr>');
+ // document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif"><a href="' + '/kra/agent/kra/displayBySerialForRecovery?' + 'op=displayBySerialForRecovery&serialNumber=' + rec.serialNumber + '">' + renderHexNumber(rec.serialNumber,8) + '</a></font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + renderHexNumber(rec.serialNumber,8) + '</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + rec.state + '</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + renderDateFromSecs(rec.archivedOn) + '</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + renderDateFromSecs(rec.archivedOn) + '</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + rec.archivedBy + '</font></td>');
+ document.write('</tr>');
+
+ document.write('<tr bgcolor=#e5e5e5>');
+ document.write('<td>');
+ document.write('</td>');
+ document.write('<td align=left colspan=2>' +
+ '<font size=-1 face="PrimaSans BT, Verdana, sans-serif">Algorithm</font></td>');
+ document.write('<td align=left colspan=2>' +
+ '<font size=-1 face="PrimaSans BT, Verdana, sans-serif">Owner Name</font></td>');
+ document.write('</tr>');
+
+ document.write('<tr>');
+ document.write('<td>');
+ document.write(renderDetailsButton(rec.serialNumber,result.header.publicKeyData));
+ document.write('</td>');
+ document.write('<td align=left colspan=2><font size="-1" face="PrimasSans BT, Verdana, sans-serif">' +
+ renderOidName(rec.keyAlgorithm) + (((rec.keyLength != null) && (rec.keyLength >= 0)) ?
+ " with "+ rec.keyLength + "-bit key" : ((rec.EllipticCurve != null)? " with " + rec.EllipticCurve:""))+ '</font></td>');
+ document.write('<td align=left colspan=2><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' +
+ rec.ownerName + '</font></td>');
+ document.write('</tr>');
+}
+
+function renderHidden(name,value)
+{
+ return '<INPUT TYPE="hidden" NAME="' + name + '" VALUE="">\n';
+}
+
+function doNext(form)
+{
+ form.action = '/kra/agent/kra/'+result.header.op;
+ form.op.value = result.header.op;
+ form.queryFilter.value = result.header.queryFilter;
+ form.querySentinel.value = result.header.querySentinel;
+ form.totalRecordCount.value = result.header.totalRecordCount;
+ form.submit();
+}
+
+function displayNextForm()
+{
+ document.write(
+ '<div align=center> \n'+
+ '<form name ="nextForm" method=POST ' +
+ 'onSubmit="doNext(nextForm);" '+
+ 'action="">\n'+
+ renderHidden("op")+
+ renderHidden("queryFilter")+
+ renderHidden("querySentinel")+
+ renderHidden("totalRecordCount"));
+ document.write(
+ '<input type=submit value=" Next "> '+
+ '<input type=text size=2 maxlength=99 name=maxCount value="'+
+ result.fixed.maxCount+
+ '"><font size="1" face="PrimasSans BT, Verdana, sans-serif"> record(s)</font>\n'+
+ '</FORM></DIV>\n');
+}
+
+if (result.header.errorDetails != null) {
+ writeError(result.header.errorDetails);
+} else if (result.header.totalRecordCount == 0) {
+ document.write('<font face="PrimaSans BT, Verdana, sans-serif" size=+1>Search Results</font>\n');
+ document.write('<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" BACKGROUND="/pki/images/hr.gif"><TR><TD>&nbsp;</TD></TR></TABLE>');
+ document.write('<div align=left><b><font face="PrimaSans BT, Verdana, sans-serif" size="+1">No Matching Key Found</font></b></div>\n');
+} else {
+ document.write('<font face="PrimaSans BT, Verdana, sans-serif" size=+1>Search Results</font>\n');
+ document.write('<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" BACKGROUND="/pki/images/hr.gif"><TR><TD>&nbsp;</TD></TR></TABLE>');
+ document.write('<font face="PrimaSans BT, Verdana, sans-serif" size=+1>');
+ document.write('Authority: ' +
+(result.header.archiverName != null ? result.header.archiverName : "UNKNOWN"));
+ document.write('</font><br>\n');
+ document.write('<font face="PrimaSans BT, Verdana, sans-serif" size=-1>');
+ document.write('Total Number of Records Found : ' +
+ result.header.totalRecordCount);
+ document.write('</font>\n');
+ document.write('<p>');
+
+ document.write('<table cellpadding=6 cellspacing=4 border=0 width=100%>');
+
+ for(var i = 0; i < result.recordSet.length; ++i ) {
+ displayKeyRecord(result.recordSet[i]);
+ }
+ document.write('</table>');
+ document.write('<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" BACKGROUND="/pki/images/hr.gif"><TR><TD>&nbsp;</TD></TR></TABLE>');
+
+ if (result.header.querySentinel != null) {
+ displayNextForm();
+ }
+}
+
+//-->
+</script>
+</body>
+</html>
diff --git a/base/kra/shared/webapps/kra/agent/kra/queryReq.template b/base/kra/shared/webapps/kra/agent/kra/queryReq.template
new file mode 100644
index 000000000..61a7bb0a2
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/queryReq.template
@@ -0,0 +1,385 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+ <title>Request Queue</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<style type="text/css">
+
+.floating {
+ position: absolute;
+ left: 300px;
+ top: 50px;
+ width: 400px;
+ padding: 3px;
+ border: solid;
+ border-width: 2px;
+ background: white;
+ display: none;
+ margin: 5px;
+}
+
+
+table#t td {
+ font-size: 0.8em;
+ padding: 0px;
+ margin: 0px;
+}
+
+.h {
+ background-color: #eeeeee;
+ font-color: #606060;
+ font-weight: bold;
+}
+
+</STYLE>
+</head>
+
+<body bgcolor="#FFFFFF" link="#000000" vlink="#000000" alink="#000000">
+<font size=+1 face="PrimaSans BT, Verdana, sans-serif">Request Queue</font>
+<br>
+
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" BACKGROUND="/pki/images/hr.gif" >
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+</table>
+
+<CMS_TEMPLATE>
+
+<SCRIPT LANGUAGE="JavaScript">
+//<!--
+
+function toHex(number)
+{
+ var absValue = "", sign = "";
+ var digits = "0123456789abcdef";
+ if (number < 0) {
+ sign = "-";
+ number = -number;
+ }
+
+ for(; number >= 16 ; number = Math.floor(number/16)) {
+ absValue = digits.charAt(number % 16) + absValue;
+ }
+ absValue = digits.charAt(number % 16) + absValue;
+ return sign + absValue;
+}
+
+function renderHexNumber(number,width)
+{
+ var num = toHex(number);
+ while (num.length < width)
+ num = "0"+num;
+ return "0x"+num;
+}
+
+function renderDateFromSecs(secs)
+{
+ if (secs == null) return "";
+ var dateTmp = new Date();
+ dateTmp.setTime(secs * 1000);
+ var year = dateTmp.getYear();
+ if (year < 100) {
+ year += 1900;
+ } else {
+ year %= 100;
+ year += 2000;
+ }
+ return (dateTmp.getMonth()+1)+"/"+dateTmp.getDate()+"/"+year+" ;"+
+ (dateTmp.getHours()<10?" ;":"")+
+ dateTmp.getHours()+":"+(dateTmp.getMinutes()<10?"0":"")+
+ dateTmp.getMinutes()+":"+(dateTmp.getSeconds()<10?"0":"")+
+ dateTmp.getSeconds();
+}
+
+function stateCodeToColor(code)
+{
+ if (code == "waiting")
+ return "darkgreen";
+ else if (code == "cancelled" || code == "rejected")
+ return "red";
+ else if (code == "complete")
+ return "black";
+ else
+ return "magenta";
+}
+
+function addSpaces(str)
+{
+ var outStr = "";
+ var i0 = 0;
+ var i1 = 0;
+
+ while (i1 < str.length) {
+ i1 = str.indexOf(',', i0);
+ if (i1 > -1) {
+ i1++;
+ outStr += str.substring(i0, i1);
+ outStr += " ";
+ i0 = i1;
+ } else {
+ outStr += str.substring(i0, str.length);
+ i1 = str.length;
+ }
+ }
+
+ return outStr;
+}
+
+function renderDetailsButton(serialNumber)
+{
+ return '<form method=post '+
+ 'action="'+
+ '/kra/agent/kra/processReq' +'">\n'+
+ '<input type=hidden name="seqNum" value="'+
+ serialNumber +
+ '">\n'+
+ '<input type=submit value="Details"></form>\n';
+}
+
+function setNode(table,desc,content,style)
+{
+ var row = table.insertRow(-1);
+ if (style) {
+ row.className = style;
+ }
+ var cell1 = row.insertCell(-1);
+ var desc_text = document.createTextNode(desc);
+ cell1.appendChild(desc_text);
+ var cell2 = row.insertCell(-1);
+ var content_text = document.createTextNode(content);
+ cell2.appendChild(content_text);
+}
+
+function mouseover(element,event)
+{
+ var x = event.clientX;
+ var y = event.clientY;
+
+ var index= element.getAttribute("index");
+ if (index == null) { return false; }
+ var req = recordSet[index];
+
+ element.parentNode.parentNode.parentNode.style.backgroundColor = "#EEEEFF";
+
+ var v;
+ var e = document.getElementById("reqMetaDatadiv");
+
+ var t = document.getElementById("t");
+
+ // delete all the rows in the table
+ var i=0;
+ while (i < t.rows.length) {
+ t.deleteRow(0);
+ }
+
+ setNode(t,"Request details for request #", req.seqNum,"h");
+ setNode(t,"Request Type:",req.requestType);
+ setNode(t,"Submitted On:", renderDateFromSecs(req.createdOn));
+ setNode(t,"Updated On:", renderDateFromSecs(req.updatedOn));
+ setNode(t,"Updated By:", req.updatedBy);
+ assumedheight = 180;
+ e.style.left = x+30; // x-offset of floating div
+
+ var offset = 20; // extra y-offset of floating div
+ var bottom = y + offset + assumedheight;
+ if (bottom > window.innerHeight) {
+ offset = 0 - (2*offset) - assumedheight;
+ }
+
+ e.style.top = y+ offset +document.body.scrollTop;
+
+ // unhide the window
+ e.style.display ="block";
+
+
+}
+
+function mouseout(element)
+{
+// window.setTimeout("hide",1);
+ var index= element.getAttribute("index");
+ element.parentNode.parentNode.parentNode.style.backgroundColor = "#FFFFFF";
+
+ hide();
+}
+
+function hide()
+{
+ document.getElementById("reqMetaDatadiv").style.display ="none";
+}
+
+function displayRequest(i, req)
+{
+ // request table items
+
+ // request number
+ document.write("<tr><td align=right>"+
+ "<font size=-1 face=\"PrimaSans BT, Verdana, sans-serif\">"+
+ "<a index='"+i+"' href='/kra/agent/kra/processReq?seqNum=" + req.seqNum +
+ "' onmouseover='mouseover(this,event);' "+
+ "onmouseout='mouseout(this);'>"+
+ req.seqNum +"</a></font></td>\n");
+
+ //State
+ document.write("<td>"+
+ "<font size=-1 face=\"PrimaSans BT, Verdana, sans-serif\" color=\""+
+ stateCodeToColor(req.status) +"\">"+req.status);
+ if (req.status == "complete" && req.Result != null && req.Result != "1") {
+ document.write("d with error");
+ }
+ document.write("</font></td>\n");
+
+ // Assigned to
+ document.write("<td><font size=-1 face=\"PrimaSans BT, Verdana, sans-serif\""+
+ (req.assignedTo == null? " color=\"magenta\"": "")+ ">\n"+
+ ((req.status != "pending")? "":
+ (req.assignedTo == null? "unassigned":req.assignedTo))+
+ "</font></td>");
+
+ //Subject
+ if (req.subject != null) {
+ document.write("<TD colspan=2>\n"+
+ "<font size=-1 face=\"PrimaSans BT, Verdana, sans-serif\">\n"+
+ addSpaces(req.subject) + "</font></td></tr>\n");
+ } else {
+ document.write("<TD></TD><TD></TD></tr>\n");
+ }
+
+// document.write("</table>\n");
+}
+
+function displayRequestList()
+{
+ document.write("<font size=-1 face=\"PrimaSans BT, Verdana, sans-serif\">\n");
+ if (result.header.error != null) {
+ document.write(result.header.error + "</font>\n");
+ } else if (result.recordSet.length == 0) {
+ document.write("No Matching Request Records Found</font>\n");
+ } else {
+ document.write("Total Number of Records Found : " +
+ result.header.totalRecordCount + "</font></br>\n");
+// result.header.totalRecordCount + "</font></br>&nbsp;\n");
+
+ document.write("<table BORDER=0 CELLSPACING=2 CELLPADDING=6 WIDTH='100%'>\n"+
+ "<tr align=center><td>\n");
+ displayNextForm();
+
+ document.write(
+ "<table border=\"0\" width=\"100%\" cellspacing=\"2\" cellpadding=\"2\">\n"+
+ "<tr><td width=10%>&nbsp;</td>"+
+ "<td width=10%>&nbsp;</td>"+
+ "<td width=20%>&nbsp;</td>"+
+ "<td width=60%>&nbsp;</td>"+
+ "</tr>\n");
+
+ document.write(
+// "<table border=\"0\" width=\"100%\" cellspacing=\"2\" cellpadding=\"2\">\n"+
+// "<tr><td width=5%>&nbsp;</td><td width=25%>&nbsp;</td><td width=25%>&nbsp;</td>\n"+
+// "<td width=25%>&nbsp;</td><td width=20%>&nbsp;</td></tr>\n"+
+ "<TR BGCOLOR=\"#E5E5E5\">\n"+
+ "<TD align=right width=10%>\n"+
+ "<font size=-1 face=\"PrimaSans BT, Verdana, sans-serif\">\n"+
+ "#</font></TD>\n"+
+ "<TD width=10%>\n"+
+ "<font size=-1 face=\"PrimaSans BT, Verdana, sans-serif\">\n"+
+ "Status</font></TD>\n"+
+ "<TD width=20%>\n"+
+ "<font size=-1 face=\"PrimaSans BT, Verdana, sans-serif\">\n"+
+ "Assigned to</font></TD>\n"+
+ "<TD width=60%>\n"+
+ "<font size=-1 face=\"PrimaSans BT, Verdana, sans-serif\">\n"+
+ "Key Owner</font></TD></TR>\n"
+ );
+
+ for(var i = 0; i < result.recordSet.length; ++i ) {
+ displayRequest(i, result.recordSet[i]);
+ }
+ document.write("</table>");
+ displayNextForm();
+}
+}
+
+
+function renderHidden(name,value)
+{
+ return "<INPUT TYPE='hidden' NAME='"+ name +"' VALUE=''>\n";
+}
+
+
+function doNext(element)
+{
+ var form = element.form;
+ form.action = "queryReq";
+ form.op.value = result.header.op;
+
+ form.direction.value = element.name;
+ form.firstEntryOnPage.value = result.header.firstEntryOnPage;
+ form.lastEntryOnPage.value = result.header.lastEntryOnPage;
+ form.totalRecordCount.value = result.header.totalRecordCount;
+
+ form.submit();
+}
+
+
+function displayNextForm(seqNum)
+{
+var seqNum=parseInt(result.recordSet[result.recordSet.length-1].seqNum) + 1;
+//alert("in displayNextForm seqNum="+seqNum);
+ document.write(
+//"<div align=center> \n"+
+"<FORM NAME='nextForm' METHOD='POST' ACTION=''>\n"+ renderHidden("op"));
+
+var disabledDown = ((result.fixed.maxCount > result.header.currentRecordCount) ||
+ (result.header.currentRecordCount == result.header.totalRecordCount)) ?
+ "disabled='true'" : "";
+var disabledUp = (result.header.firstEntryOnPage != null &&
+ result.header.firstEntryOnPage <= 1) ? "disabled='true'" : "";
+
+document.write(
+"<button NAME='begin' onClick='doNext(this)' VALUE='|<<' width='72'>|&lt;&lt;</button>\n"+
+"<button "+disabledUp+" NAME='previous' onClick='doNext(this)' VALUE='<' width='72'>&lt;</button>\n"+
+"<INPUT TYPE='hidden' NAME='totalRecordCount' VALUE='"+
+result.header.totalRecordCount+ "'>\n"+
+"<INPUT TYPE='hidden' NAME='op' VALUE='"+ "queryReq"+ "'>\n"+
+"<INPUT TYPE='hidden' NAME='querySentinelDown' VALUE='"+
+ result.header.querySentinelDown+ "'>\n"+
+"<INPUT TYPE='hidden' NAME='querySentinelUp' VALUE='"+
+ result.header.querySentinelUp+ "'>\n"+
+
+"<INPUT TYPE='hidden' NAME='firstEntryOnPage' VALUE='"+
+ result.header.querySentinelUp +"'>\n"+
+"<INPUT TYPE='hidden' NAME='lastEntryOnPage' VALUE='"+
+ result.header.querySentinelDown +"'>\n"+
+"<INPUT TYPE='hidden' NAME='direction' VALUE='"+
+ result.header.direction+ "'>\n");
+
+ if (result.fixed.reqType != null)
+ document.write("<INPUT TYPE='hidden' NAME='reqType' VALUE='" + result.fixed.reqType + "'>\n");
+
+ if (result.fixed.reqState != null)
+ document.write("<INPUT TYPE='hidden' NAME='reqState' VALUE='" + result.fixed.reqState + "'>\n");
+
+ document.write("<INPUT TYPE=\"hidden\" NAME=\"totalRecordCount\" VALUE=\"" +
+ result.header.totalRecordCount + "\">\n");
+
+ document.write("<INPUT style='padding-left: 2px;' TYPE=text SIZE=16 NAME=maxCount VALUE='"+
+result.fixed.maxCount+ "'>\n"+
+"<button "+disabledDown+" NAME='next' onClick='doNext(this)' VALUE='>' width='72'>&gt;</button>\n"+
+"<button NAME='end' onClick='doNext(this)' VALUE='>>|' width='72'>&gt;&gt;|</button>\n"+
+"</FORM>\n");
+}
+
+
+displayRequestList();
+
+//-->
+</SCRIPT>
+<div id="reqMetaDatadiv" class="floating">
+<table id="t" width="100%">
+<tr><td><td/></tr>
+</table>
+</div>
+
+</BODY>
+</HTML>
diff --git a/base/kra/shared/webapps/kra/agent/kra/recoverBySerial.template b/base/kra/shared/webapps/kra/agent/kra/recoverBySerial.template
new file mode 100644
index 000000000..a1209f32b
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/recoverBySerial.template
@@ -0,0 +1,76 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<title>Key Recovery Result</title>
+</head>
+<body bgcolor="white">
+
+<CMS_TEMPLATE>
+<SCRIPT LANGUAGE="JavaScript"></SCRIPT>
+<script language="JavaScript" src="../funcs.js"></script>
+<script language="JavaScript" src="../helpfun.js"></script>
+<script language="JavaScript">
+//<!--
+function toHex(number)
+{
+ var absValue = "", sign = "";
+ var digits = "0123456789abcdef";
+ if (number < 0) {
+ sign = "-";
+ number = -number;
+ }
+
+ for(; number >= 16 ; number = Math.floor(number/16)) {
+ absValue = digits.charAt(number % 16) + absValue;
+ }
+ absValue = digits.charAt(number % 16) + absValue;
+ return sign + absValue;
+}
+
+if (result.header.errorDetails != null) {
+ writeError(result.header.errorDetails);
+} else {
+ document.write('<font face="PrimaSans BT, Verdana, sans-serif" size=+1>Key Recovery Status</font>');
+ document.write('<center><hr width="100%"></center>');
+ document.write("<p>");
+ document.write('<font face="PrimaSans BT, Verdana, sans-serif" size=-1>');
+ document.write('Recovery request for Key with key identifier ' +
+ toHex(result.header.serialNumber) +
+ ' has been submitted.\n' +
+ 'Waiting for recovery agents\' approval...');
+
+ if (result.header.recoveryID == null) {
+ document.writeln('<p>');
+ document.writeln(result.header.noOfRequiredAgents +
+ ' recovery agents are required for authorization.' );
+ document.writeln('<p>');
+
+ document.writeln('This is an asynchronous key recovery request. You might want to notify authorized key recovery agents to grant this request by going to request' +
+ '<a href="/kra/agent/kra/processReq?op=processReq&seqNum=' +
+ result.header.requestID+'"> ' + result.header.requestID +'</a>.')
+ document.write('</font>');
+ }else {
+ document.write('</font>');
+ window.location = result.fixed.scheme + "://" + result.fixed.host +
+ ":" + result.fixed.port + "/kra/agent/kra/getApprovalStatus?recoveryID=" +
+ result.header.recoveryID;
+
+ if (result.header.status == "complete") {
+ document.writeln(
+ '<font face="PrimaSans BT, Verdana, sans-serif"><font size=+1>'+
+ 'Click ' +
+ '<a href="/kra/agent/kra/getPk12?recoveryID=' +
+ result.header.recoveryID + '"' +
+ 'onMouseOver=" return helpstatus(\'Click to get key in PKCS12 ' +
+ '\')" onMouseOut="return helpstatus(\'\')">' +
+ "here" +
+ '</a>' + ' to get the recovered key in PKCS12 format.</font></font>');
+ }
+ }
+
+}
+
+//-->
+</script>
+</BODY>
+</HTML>
diff --git a/base/kra/shared/webapps/kra/agent/kra/srchKey.template b/base/kra/shared/webapps/kra/agent/kra/srchKey.template
new file mode 100644
index 000000000..f9d39e194
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/srchKey.template
@@ -0,0 +1,213 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<CMS_TEMPLATE>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+</head>
+
+<title>Key Query Result</title>
+<body bgcolor="white">
+
+<SCRIPT LANGUAGE="JavaScript"></SCRIPT>
+<script language="JavaScript" src="../funcs.js"></script>
+<script language="JavaScript" src="../helpfun.js"></script>
+<script language="JavaScript">
+//<!--
+
+function toHex(number)
+{
+ var absValue = "", sign = "";
+ var digits = "0123456789abcdef";
+ if (number < 0) {
+ sign = "-";
+ number = -number;
+ }
+
+ for(; number >= 16 ; number = Math.floor(number/16)) {
+ absValue = digits.charAt(number % 16) + absValue;
+ }
+ absValue = digits.charAt(number % 16) + absValue;
+ return sign + absValue;
+}
+
+function recoverKey(serialNumber)
+{
+ return confirm("WARNING!! You are about to do an irreversible operation.\nDo you really want to recover key # "+
+ renderHexNumber(serialNumber,8)+ " ?");
+}
+
+function renderOidName(oid)
+{
+ if (oid == "1.2.840.113549.1.1.1")
+ return "PKCS #1 RSA";
+ else if (oid == "1.2.840.113549.1.1.4")
+ return "PKCS #1 MD5 With RSA";
+ else
+ return "OID."+oid;
+}
+
+function renderHexNumber(number,width)
+{
+ var num = toHex(number);
+ while (num.length < width)
+ num = "0"+num;
+ return "0x"+num;
+}
+
+function renderDateFromSecs(secs)
+{
+ if (secs == null) return "";
+ var today = new Date();
+ var dateTmp = new Date();
+ dateTmp.setTime(secs * 1000);
+ var dateStr = dateTmp.toLocaleString();
+ return dateStr;
+}
+
+function renderDetailsButton(serialNumber)
+{
+ return '<form method=post '+
+ 'action="'+
+ '/kra/agent/kra/displayBySerial' +'">\n'+
+ '<input type=hidden name="op" value="displayBySerial">\n'+
+ '<input type=hidden name="serialNumber" value="'+
+ serialNumber +
+ '">\n'+
+ '<input type=submit value="Details"></form>\n';
+}
+
+function renderRecoverButton(serialNumber)
+{
+ return '<form method=post ' +
+ 'ACTION="'+
+ '/kra/agent/kra/confirmRecoverSerial' + '">\n'+
+ '<input type=hidden name="op" value="confirmRecoverBySerial">\n'+
+ '<input type=hidden name="serialNumber" VALUE="' +
+ serialNumber +
+ '">\n' +
+ '<input type=hidden name="commit" value="yes">' +
+ '<input type=hidden name="updateCRL" value="yes">' +
+ '<input type=submit value="Recover">' +
+ '</form>\n';
+}
+
+function displayKeyRecord(rec)
+{
+ document.write('<tr bgcolor=#e5e5e5>');
+ document.write('<td align=left>' +
+ '<font size=-1 face="PrimaSans BT, Verdana, sans-serif">Key identifier</font></td>');
+ document.write('<td align=left>' +
+ '<font size=-1 face="PrimaSans BT, Verdana, sans-serif">State</font></td>');
+ document.write('<td align=left>' +
+ '<font size=-1 face="PrimaSans BT, Verdana, sans-serif">Filed</font></td>');
+ document.write('<td align=left>' +
+ '<font size=-1 face="PrimaSans BT, Verdana, sans-serif">Updated</font></td>');
+ document.write('<td align=left>' +
+ '<font size=-1 face="PrimaSans BT, Verdana, sans-serif">Archiver</font></td>');
+ document.write('</tr>');
+
+ document.write('<tr>');
+ // document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif"><a href="' + '/kra/agent/kra/displayBySerial?' + 'op=displayBySerial&serialNumber=' + rec.serialNumber + '">' + renderHexNumber(rec.serialNumber,8) + '</a></font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + renderHexNumber(rec.serialNumber,8) + '</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + rec.state + '</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + renderDateFromSecs(rec.archivedOn) + '</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + renderDateFromSecs(rec.archivedOn) + '</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + rec.archivedBy + '</font></td>');
+ document.write('</tr>');
+
+ document.write('<tr bgcolor=#e5e5e5>');
+ document.write('<td>');
+ document.write('</td>');
+ document.write('<td align=left colspan=2>' +
+ '<font size=-1 face="PrimaSans BT, Verdana, sans-serif">Algorithm</font></td>');
+ document.write('<td align=left colspan=2>' +
+ '<font size=-1 face="PrimaSans BT, Verdana, sans-serif">Owner Name</font></td>');
+ document.write('</tr>');
+
+ document.write('<tr>');
+ document.write('<td>');
+ document.write(renderDetailsButton(rec.serialNumber));
+ document.write('</td>');
+ document.write('<td align=left colspan=2><font size="-1" face="PrimasSans BT, Verdana, sans-serif">' +
+ renderOidName(rec.keyAlgorithm) + (((rec.keyLength != null) && (rec.keyLength >= 0)) ?
+ " with "+ rec.keyLength + "-bit key" : ((rec.EllipticCurve != null)? " with " + rec.EllipticCurve:""))+ '</font></td>');
+ document.write('<td align=left colspan=2><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' +
+ rec.ownerName + '</font></td>');
+ document.write('</tr>');
+}
+
+function renderHidden(name,value)
+{
+ return '<INPUT TYPE="hidden" NAME="' + name + '" VALUE="">\n';
+}
+
+function doNext(form)
+{
+ form.action = '/kra/agent/kra/'+result.header.op;
+ form.op.value = result.header.op;
+ form.queryFilter.value = result.header.queryFilter;
+ form.querySentinel.value = result.header.querySentinel;
+ form.totalRecordCount.value = result.header.totalRecordCount;
+ form.submit();
+}
+
+function displayNextForm()
+{
+ document.write(
+ '<div align=center> \n'+
+ '<form name ="nextForm" method=POST ' +
+ 'onSubmit="doNext(nextForm);" '+
+ 'action="">\n'+
+ renderHidden("op")+
+ renderHidden("queryFilter")+
+ renderHidden("querySentinel")+
+ renderHidden("totalRecordCount"));
+ document.write(
+ '<input type=submit value=" Next "> '+
+ '<input type=text size=2 maxlength=99 name=maxCount value="'+
+ result.fixed.maxCount+
+ '"><font size="1" face="PrimasSans BT, Verdana, sans-serif"> record(s)</font>\n'+
+ '</FORM></DIV>\n');
+}
+
+if (result.header.errorDetails != null) {
+ writeError(result.header.errorDetails);
+} else if (result.header.totalRecordCount == 0) {
+ document.write('<font face="PrimaSans BT, Verdana, sans-serif" size=+1>Search Results</font>\n');
+ document.write('<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" BACKGROUND="/pki/images/hr.gif"><TR><TD>&nbsp;</TD></TR></TABLE>');
+ document.write('<div align=left><b><font face="PrimaSans BT, Verdana, sans-serif" size="+1">No Matching Key Found</font></b></div>\n');
+} else {
+ document.write('<font face="PrimaSans BT, Verdana, sans-serif" size=+1>Search Results</font>\n');
+ document.write('<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" BACKGROUND="/pki/images/hr.gif"><TR><TD>&nbsp;</TD></TR></TABLE>');
+ document.write('<font face="PrimaSans BT, Verdana, sans-serif" size=+1>');
+ document.write('Authority: ' +
+(result.header.archiverName != null ? result.header.archiverName : "UNKNOWN"));
+ document.write('</font><br>\n');
+ document.write('<font face="PrimaSans BT, Verdana, sans-serif" size=-1>');
+ document.write('Total Number of Records Found : ' +
+ result.header.totalRecordCount);
+ document.write('</font>\n');
+
+ if (result.header.totalRecordCount == result.header.maxSize) {
+ document.write(
+"<font face=\"PrimaSans BT, Verdana, sans-serif\" size=\"-1\">\n"+
+"(Maximum size reached)"+
+"</font>\n"
+ );
+ }
+ document.write('<p>');
+
+ document.write('<table cellpadding=6 cellspacing=4 border=0 width=100%>');
+
+ for(var i = 0; i < result.recordSet.length; ++i ) {
+ displayKeyRecord(result.recordSet[i]);
+ }
+ document.write('</table>');
+ document.write('<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" BACKGROUND="/pki/images/hr.gif"><TR><TD>&nbsp;</TD></TR></TABLE>');
+
+}
+
+//-->
+</script>
+</body>
+</html>
diff --git a/base/kra/shared/webapps/kra/agent/kra/srchKeyForRecovery.template b/base/kra/shared/webapps/kra/agent/kra/srchKeyForRecovery.template
new file mode 100644
index 000000000..a4605ff9a
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/srchKeyForRecovery.template
@@ -0,0 +1,227 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<CMS_TEMPLATE>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+</head>
+
+<title>Key Query Result</title>
+<body bgcolor="white">
+<SCRIPT LANGUAGE="JavaScript"></SCRIPT>
+<script language="JavaScript" src="../funcs.js"></script>
+<script language="JavaScript" src="../helpfun.js"></script>
+<script language="JavaScript">
+//<!--
+
+function toHex(number)
+{
+ var absValue = "", sign = "";
+ var digits = "0123456789abcdef";
+ if (number < 0) {
+ sign = "-";
+ number = -number;
+ }
+
+ for(; number >= 16 ; number = Math.floor(number/16)) {
+ absValue = digits.charAt(number % 16) + absValue;
+ }
+ absValue = digits.charAt(number % 16) + absValue;
+ return sign + absValue;
+}
+
+function recoverKey(serialNumber)
+{
+ return confirm("WARNING!! You are about to do an irreversible operation.\nDo you really want to recover key # "+
+ renderHexNumber(serialNumber,8)+ " ?");
+}
+
+function renderOidName(oid)
+{
+ if (oid == "1.2.840.113549.1.1.1")
+ return "PKCS #1 RSA";
+ else if (oid == "1.2.840.113549.1.1.4")
+ return "PKCS #1 MD5 With RSA";
+ else
+ return "OID."+oid;
+}
+
+function renderHexNumber(number,width)
+{
+ var num = toHex(number);
+ while (num.length < width)
+ num = "0"+num;
+ return "0x"+num;
+}
+
+function renderDateFromSecs(secs)
+{
+ if (secs == null) return "";
+ var today = new Date();
+ var dateTmp = new Date();
+ dateTmp.setTime(secs * 1000);
+ var dateStr = dateTmp.toLocaleString();
+ return dateStr;
+}
+
+function renderDetailsButton(serialNumber,publicKeyData)
+{
+ if (publicKeyData != null) {
+ return '<form method=post '+
+ 'action="'+
+ '/kra/agent/kra/displayBySerialForRecovery' +'">\n'+
+ '<input type=hidden name="op" value="displayBySerialForRecovery">\n'+
+ '<input type=hidden name="serialNumber" value="'+
+ serialNumber +
+ '">\n'+
+ '<input type=hidden name="publicKeyData" value="'+
+ publicKeyData +
+ '">\n'+
+ '<input type=submit value="Recover"></form>\n';
+ } else {
+ return '<form method=post '+
+ 'action="'+
+ '/kra/agent/kra/displayBySerialForRecovery' +'">\n'+
+ '<input type=hidden name="op" value="displayBySerialForRecovery">\n'+
+ '<input type=hidden name="serialNumber" value="'+
+ serialNumber +
+ '">\n'+
+ '<input type=submit value="Recover"></form>\n';
+ }
+}
+
+function renderRecoverButton(serialNumber)
+{
+ return '<form method=post ' +
+ 'ACTION="'+
+ '/kra/agent/kra/confirmRecoverBySerialForRecovery' + '">\n'+
+ '<input type=hidden name="op" value="confirmRecoverBySerialForRecovery">\n'+
+ '<input type=hidden name="serialNumber" VALUE="' +
+ serialNumber +
+ '">\n' +
+ '<input type=hidden name="commit" value="yes">' +
+ '<input type=hidden name="updateCRL" value="yes">' +
+ '<input type=submit value="Recover">' +
+ '</form>\n';
+}
+
+function displayKeyRecord(rec)
+{
+ document.write('<tr bgcolor=#e5e5e5>');
+ document.write('<td align=left>' +
+ '<font size=-1 face="PrimaSans BT, Verdana, sans-serif">Key identifier<font></td>');
+ document.write('<td align=left>' +
+ '<font size=-1 face="PrimaSans BT, Verdana, sans-serif">State</font></td>');
+ document.write('<td align=left>' +
+ '<font size=-1 face="PrimaSans BT, Verdana, sans-serif">Filed</font></td>');
+ document.write('<td align=left>' +
+ '<font size=-1 face="PrimaSans BT, Verdana, sans-serif">Updated</font></td>');
+ document.write('<td align=left>' +
+ '<font size=-1 face="PrimaSans BT, Verdana, sans-serif">Archiver</font></td>');
+ document.write('</tr>');
+
+ document.write('<tr>');
+ // document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif"><a href="' + '/kra/agent/kra/displayBySerialForRecovery?' + 'op=displayBySerialForRecovery&serialNumber=' + rec.serialNumber + '">' + renderHexNumber(rec.serialNumber,8) + '</a></font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + renderHexNumber(rec.serialNumber,8) + '</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + rec.state + '</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + renderDateFromSecs(rec.archivedOn) + '</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + renderDateFromSecs(rec.archivedOn) + '</font></td>');
+ document.write('<td align=left><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' + rec.archivedBy + '</font></td>');
+ document.write('</tr>');
+
+ document.write('<tr bgcolor=#e5e5e5>');
+ document.write('<td>');
+ document.write('</td>');
+ document.write('<td align=left colspan=2>' +
+ '<font size=-1 face="PrimaSans BT, Verdana, sans-serif">Algorithm</font></td>');
+ document.write('<td align=left colspan=2>' +
+ '<font size=-1 face="PrimaSans BT, Verdana, sans-serif">Owner Name</font></td>');
+ document.write('</tr>');
+
+ document.write('<tr>');
+ document.write('<td>');
+ document.write(renderDetailsButton(rec.serialNumber,result.header.publicKeyData));
+ document.write('</td>');
+ document.write('<td align=left colspan=2><font size="-1" face="PrimasSans BT, Verdana, sans-serif">' +
+ renderOidName(rec.keyAlgorithm) + (((rec.keyLength != null) && (rec.keyLength >= 0)) ?
+ " with "+ rec.keyLength + "-bit key" : ((rec.EllipticCurve != null)? " with " + rec.EllipticCurve:""))+ '</font></td>');
+ document.write('<td align=left colspan=2><font size="-1" face="PrimaSans BT, Verdana, sans-serif">' +
+ rec.ownerName + '</font></td>');
+ document.write('</tr>');
+}
+
+function renderHidden(name,value)
+{
+ return '<INPUT TYPE="hidden" NAME="' + name + '" VALUE="">\n';
+}
+
+function doNext(form)
+{
+ form.action = '/kra/agent/kra/'+result.header.op;
+ form.op.value = result.header.op;
+ form.queryFilter.value = result.header.queryFilter;
+ form.querySentinel.value = result.header.querySentinel;
+ form.totalRecordCount.value = result.header.totalRecordCount;
+ form.submit();
+}
+
+function displayNextForm()
+{
+ document.write(
+ '<div align=center> \n'+
+ '<form name ="nextForm" method=POST ' +
+ 'onSubmit="doNext(nextForm);" '+
+ 'action="">\n'+
+ renderHidden("op")+
+ renderHidden("queryFilter")+
+ renderHidden("querySentinel")+
+ renderHidden("totalRecordCount"));
+ document.write(
+ '<input type=submit value=" Next "> '+
+ '<input type=text size=2 maxlength=99 name=maxCount value="'+
+ result.fixed.maxCount+
+ '"><font size="1" face="PrimasSans BT, Verdana, sans-serif"> record(s)</font>\n'+
+ '</FORM></DIV>\n');
+}
+
+if (result.header.errorDetails != null) {
+ writeError(result.header.errorDetails);
+} else if (result.header.totalRecordCount == 0) {
+ document.write('<font face="PrimaSans BT, Verdana, sans-serif" size=+1>Search Results</font>\n');
+ document.write('<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" BACKGROUND="/pki/images/hr.gif"><TR><TD>&nbsp;</TD></TR></TABLE>');
+ document.write('<div align=left><b><font face="PrimaSans BT, Verdana, sans-serif" size="+1">No Matching Key Found</font></b></div>\n');
+} else {
+ document.write('<font face="PrimaSans BT, Verdana, sans-serif" size=+1>Search Results</font>\n');
+ document.write('<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" BACKGROUND="/pki/images/hr.gif"><TR><TD>&nbsp;</TD></TR></TABLE>');
+ document.write('<font face="PrimaSans BT, Verdana, sans-serif" size=+1>');
+ document.write('Authority: ' +
+(result.header.archiverName != null ? result.header.archiverName : "UNKNOWN"));
+ document.write('</font><br>\n');
+ document.write('<font face="PrimaSans BT, Verdana, sans-serif" size=-1>');
+ document.write('Total Number of Records Found : ' +
+ result.header.totalRecordCount);
+ document.write('</font>\n');
+
+ if (result.header.totalRecordCount == result.header.maxSize) {
+ document.write(
+"<font face=\"PrimaSans BT, Verdana, sans-serif\" size=\"-1\">\n"+
+"(Maximum size reached)"+
+"</font>\n"
+ );
+ }
+
+ document.write('<p>');
+
+ document.write('<table cellpadding=6 cellspacing=4 border=0 width=100%>');
+
+ for(var i = 0; i < result.recordSet.length; ++i ) {
+ displayKeyRecord(result.recordSet[i]);
+ }
+ document.write('</table>');
+ document.write('<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" BACKGROUND="/pki/images/hr.gif"><TR><TD>&nbsp;</TD></TR></TABLE>');
+
+}
+
+//-->
+</script>
+</body>
+</html>
diff --git a/base/kra/shared/webapps/kra/agent/kra/top.html b/base/kra/shared/webapps/kra/agent/kra/top.html
new file mode 100644
index 000000000..f90ad1a3f
--- /dev/null
+++ b/base/kra/shared/webapps/kra/agent/kra/top.html
@@ -0,0 +1,48 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<title>Untitled Document</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#CCCCCC" link="#FFFFFF" vlink="#FFFFFF" alink="#CCCCFF">
+<table border="0" width="100%" cellspacing="0" cellpadding="0" bgcolor="#666699">
+ <tr>
+ <td>
+ <table border="0" cellspacing="0" cellpadding="0">
+ <tr>
+ <td>
+ <table border="0" cellspacing="12" cellpadding="0" width="100%">
+ <tr>
+ <td><font size="-1" face="PrimaSans BT, Verdana, sans-serif" color="white">Dogtag<font color="#999999" size="-2">&reg;</font><b><br>
+ Certificate System</b></font><font size="+1" face="PrimaSans BT, Verdana, sans-serif" color="white"><b></b></font></td>
+ <td></td>
+ <td><font size="+1" face="PrimaSans BT, Verdana, sans-serif" color="white">Privileged User Services</font> </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ <table border="0" cellspacing="0" cellpadding="0">
+ <tr>
+ <td><img src="/pki/images/spacer.gif" width="12" height="21"></td>
+ <td><img src="/pki/images/dgLeftTab.gif" width="13" height="21"></td>
+ <td bgcolor="#999999" nowrap><font size="-1" face="PrimaSans BT, Verdana, sans-serif"><a href="../kra/index.html" target="_top">Certificate
+ Service</a><b></b></font></td>
+ <td><img src="/pki/images/dgRightTab.gif" width="16" height="21"></td>
+ <td><img src="/pki/images/dgLeftTab.gif" width="13" height="21"></td>
+ <td bgcolor="#999999" nowrap><font size="-1" face="PrimaSans BT, Verdana, sans-serif"><a href="../kra/index.html" target="_top">Registration
+ Service </a></font></td>
+ <td><img src="/pki/images/dgRightTab.gif" width="16" height="21"></td>
+ <td><img src="/pki/images/lgLeftTab.gif" width="13" height="21"></td>
+ <td bgcolor="#cccccc" nowrap><font size="-1" face="PrimaSans BT, Verdana, sans-serif"><b>Key
+ Service </b></font></td>
+ <td><img src="/pki/images/lgRightTab.gif" width="16" height="21"></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+</body>
+</html>
+