summaryrefslogtreecommitdiffstats
path: root/install/html
diff options
context:
space:
mode:
authorPetr Vobornik <pvoborni@redhat.com>2012-10-01 17:36:42 +0200
committerRob Crittenden <rcritten@redhat.com>2012-10-04 18:08:26 -0400
commit696fce5c8d4e480c6a731686c8952a4e7ace575f (patch)
tree50c9de739c9eafe8dd68af102ea74f6210ae404f /install/html
parent247a3a43b7fb9eac9af9497e61cdc9c964bee4ff (diff)
downloadfreeipa-696fce5c8d4e480c6a731686c8952a4e7ace575f.tar.gz
freeipa-696fce5c8d4e480c6a731686c8952a4e7ace575f.tar.xz
freeipa-696fce5c8d4e480c6a731686c8952a4e7ace575f.zip
Configuration pages changed to use new FF extension
browserconfig.html was changed to use new FF extension. The page is completely Firefox specific therefore the title was changed from 'Configure browser' to 'Firefox configuration'. Instruction to import CA cert in unauthorized.html are FF specific too, so they were moved to browserconfig.html. Unauthorized.html text was changed to distinguish FF config and other browsers. Now the page shows link for FF (browserconfig.html) and other browsers (ssbrowser.html). Ssbrowser.html should be enhanced by more configurations and browsers later [1]. Old configuration method was moved to ssbrowser.html. Unauthorized dialog in Web UI now links to http://../unauthorized.html instead of https. This change is done because of FF strange handling of extension installations from https sites [2]. Firefox allows ext. installation from https sites only when the certificate is signed by some build-in CA. To allow custom CAs an option in about:config has to be changed which don't help us at all because we wants to avoid manual changes in about:config. The design of browserconfig is inspired by Kyle Baker's design (2.1 Enhancements_v2.odt). It is not exactly the same. Highlighting of the steps wasn't used because in some cases we can switch some steps. Ticket: https://fedorahosted.org/freeipa/ticket/3094 [1] https://fedorahosted.org/freeipa/ticket/823 [2] https://bugzilla.mozilla.org/show_bug.cgi?id=688383
Diffstat (limited to 'install/html')
-rw-r--r--install/html/Makefile.am2
-rw-r--r--install/html/browserconfig.html84
-rw-r--r--install/html/ffconfig.js116
-rw-r--r--install/html/ffconfig_page.js148
-rw-r--r--install/html/ipa_error.css6
-rw-r--r--install/html/jsl.conf131
-rw-r--r--install/html/ssbrowser.html27
-rw-r--r--install/html/unauthorized.html31
8 files changed, 504 insertions, 41 deletions
diff --git a/install/html/Makefile.am b/install/html/Makefile.am
index 46e8683c8..0377ce755 100644
--- a/install/html/Makefile.am
+++ b/install/html/Makefile.am
@@ -2,6 +2,8 @@ NULL =
appdir = $(IPA_SYSCONF_DIR)/html
app_DATA = \
+ ffconfig.js \
+ ffconfig_page.js \
ssbrowser.html \
browserconfig.html \
unauthorized.html \
diff --git a/install/html/browserconfig.html b/install/html/browserconfig.html
index aa978f040..046a82490 100644
--- a/install/html/browserconfig.html
+++ b/install/html/browserconfig.html
@@ -4,19 +4,15 @@
<meta charset="utf-8">
<title>IPA: Identity Policy Audit</title>
- <script type="text/javascript" src="../ui/jquery.js"></script>
<link rel="stylesheet" type="text/css" href="../ui/jquery-ui.css" />
<link rel="stylesheet" type="text/css" href="../ui/ipa.css" />
<link rel="stylesheet" type="text/css" href="ipa_error.css" />
- <script type="text/javascript">
- $(document).ready(function() {
- if (navigator.userAgent.indexOf("Firefox") != -1 ||
- navigator.userAgent.indexOf("SeaMonkey") != -1) {
- $('.textblockkrb').css('display', 'block');
- }
- });
- </script>
+ <script type="text/javascript" src="../ui/jquery.js"></script>
+ <script type="text/javascript" src="../ui/jquery-ui.js"></script>
+ <script type="text/javascript" src="krb.js"></script>
+ <script type="text/javascript" src="ffconfig.js"></script>
+ <script type="text/javascript" src="ffconfig_page.js"></script>
</head>
<body class="info-page">
@@ -27,11 +23,71 @@
<img src="../ui/images/ipa-logo.png" /><img src="../ui/images/ipa-banner.png" />
</div>
- <div class="textblockkrb" style="display: none;">
- <h1>Configure Browser</h1>
- <p> Click the below button to configure your browser </p>
- <object data="jar:/ipa/errors/configure.jar!/preferences.html"
- type="text/html" class="browser-config"></object>
+ <div class="textblockkrb browser-config">
+ <h1>Firefox configuration</h1>
+
+ <div id="wrongbrowser" style="display:none">
+ <h2>Wrong Browser!</h2>
+ <p>
+ <a href="ssbrowser.html" id="notfirefox-link">Proceed to configuration for other browsers</a>
+ </p>
+ <p>
+ You are not using Firefox. Please use configuration page for other browsers.
+ </p>
+ </div>
+
+ <div id="step1">
+ <h2>Step 1</h2>
+ <p>
+ <a href="ca.crt" id="ca-link">Import Certificate Authority certificate</a>
+ </p>
+ <p>
+ Make sure you select <b>all three</b> checkboxes.
+ </p>
+ </div>
+
+ <div id="step2a" style="display:none">
+ <h2>Step 2a</h2>
+ <p>
+ <a href="ssbrowser.html#oldfirefox" id="oldfirefox-link">Proceed to configuration page for older versions of Firefox</a>
+ </p>
+ <!--<p id="older-compatible">
+ Your version of Firefox can be configured by an older method. You don't have to use the Kerberos Configuration extension.
+ </p>-->
+ <p id="older-required">
+ Your version of Firefox is not compatible with configuration method on this page. Please use configuration page for older versions of Firefox.
+ <p>
+ </div>
+
+ <div id="step2">
+ <h2>Step 2</h2>
+ <div id="ext-installed">
+ <p>
+ <a href="kerberosauth.xpi" id="reinstall-link">Re-install extension</a>
+ </p>
+ <p>
+ Extension installed. You can proceed to Step 3.
+ </p>
+ </div>
+ <div id="ext-missing">
+ <p><a href="kerberosauth.xpi" id="install-link">Install Kerberos Configuration Firefox extension</a></p>
+ <p>Kerberos Configuration extension is required for Step 3</p>
+ </div>
+ </div>
+
+ <div id="step3">
+ <h2>Step 3</h2>
+ <p><a href="#configure-browser" id="configure-link">Configure browser</a></p>
+ <p id="config-success" style="display:none">Browser successfully configured</p>
+ <p id="config-aborted" style="display:none">Configuration aborted</p>
+ <p id="config-noext" style="display:none">Configuration was not successful, extension isn't installed or is disabled. Please proceed to step 2.</p>
+ <p id="config-error" style="display:none">Configuration was not successful, unknown error uccured.</p>
+ </div>
+
+ <div id="step4">
+ <h2>Step 4</h2>
+ <p><a href="../ui/index.html" id="return-link">Return to Web UI</a></p>
+ </div>
</div>
</div>
diff --git a/install/html/ffconfig.js b/install/html/ffconfig.js
new file mode 100644
index 000000000..3c9f34c77
--- /dev/null
+++ b/install/html/ffconfig.js
@@ -0,0 +1,116 @@
+/* Authors:
+ * Petr Vobornik <pvoborni@redhat.com>
+ *
+ * Copyright (C) 2012 Red Hat
+ * see file 'COPYING' for use and warranty information
+ *
+ * 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, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+var IPA = IPA || {};
+
+IPA.browser_config = {
+
+ configure_firefox: function(domain) {
+
+ var self = this;
+
+ domain = domain || self.get_domain();
+
+ self.send_message({
+ method: 'configure',
+ predefined: 'ipa',
+ trusted_uris: domain
+ });
+ },
+
+
+ get_configure_result: function() {
+
+ var self = this;
+
+ var el = self.get_data_element();
+
+ var answer = el.getAttribute('answer');
+
+ return answer;
+ },
+
+ get_domain: function() {
+ return "."+IPA_DOMAIN;
+ },
+
+ send_message: function(options) {
+
+ options = options || {};
+
+ var self = this;
+
+ self.clear_data_element();
+ var opt_element = self.get_data_element();
+
+ for (var opt in options) {
+ opt_element.setAttribute(opt, options[opt]);
+ }
+
+ var msg_evt = document.createEvent('HTMLEvents');
+ msg_evt.initEvent('kerberos-auth-config', true, false);
+ opt_element.dispatchEvent(msg_evt);
+ },
+
+ get_data_element: function() {
+
+ var els = document.getElementsByTagName('kerberosauthdataelement');
+ var element;
+
+ if (els.length === 0) {
+ element = document.createElement('kerberosauthdataelement');
+ document.documentElement.appendChild(element);
+ } else {
+ element = els[0];
+ }
+
+ return element;
+ },
+
+ clear_data_element: function() {
+
+ var self = this;
+
+ var el = self.get_data_element();
+ var to_remove = [];
+
+ for (var i=0; i<el.attributes.length; i++) {
+ to_remove.push(el.attributes[i].name);
+ }
+
+ for (i=0; i<to_remove.length; i++) {
+ el.removeAttribute(to_remove[i]);
+ }
+ },
+
+ extension_installed: function() {
+
+ var self = this;
+
+ self.send_message({
+ method: 'can_configure'
+ });
+
+ var element = self.get_data_element();
+ var ext_installed = element.getAttribute('answer') === 'true';
+ return ext_installed;
+ }
+
+}; \ No newline at end of file
diff --git a/install/html/ffconfig_page.js b/install/html/ffconfig_page.js
new file mode 100644
index 000000000..1c8386c5a
--- /dev/null
+++ b/install/html/ffconfig_page.js
@@ -0,0 +1,148 @@
+/* Authors:
+ * Petr Vobornik <pvoborni@redhat.com>
+ *
+ * Copyright (C) 2012 Red Hat
+ * see file 'COPYING' for use and warranty information
+ *
+ * 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, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+ $(document).ready(function() {
+
+ var set_enabled = function(steps, enabled) {
+
+ var method;
+
+ if (enabled) method = function(el) { el.removeClass('ui-state-disabled'); };
+ else method = function(el) { el.addClass('ui-state-disabled'); };
+
+ for (var i=0; i<steps.length; i++) {
+ method($(steps[i]));
+ }
+ };
+
+ var show_installed = function(installed) {
+
+ if (installed) {
+ $('#ext-installed').show();
+ $('#ext-missing').hide();
+ } else {
+ $('#ext-installed').hide();
+ $('#ext-missing').show();
+ }
+ set_enabled(['#step3'], installed);
+ };
+
+ var install = function(event) {
+
+ window.location = $(event.target).parent().attr('href');
+ check_until_installed();
+ return false;
+ };
+
+ var check_until_installed = function() {
+
+ var installed = IPA.browser_config.extension_installed();
+ show_installed(installed);
+
+ if (!installed) {
+ window.setTimeout(function() {
+ check_until_installed();
+ }, 300);
+ }
+ };
+
+ var configure = function() {
+ IPA.browser_config.configure_firefox();
+ var result = IPA.browser_config.get_configure_result();
+ var installed = IPA.browser_config.extension_installed();
+
+ $('#config-success').hide();
+ $('#config-aborted').hide();
+ $('#config-noext').hide();
+ $('#config-error').hide();
+
+ if (result === 'configured') {
+ $('#config-success').show();
+ } else if (result == 'aborted') {
+ $('#config-aborted').show();
+ } else if (!installed) {
+ $('#config-noext').show();
+ } else {
+ $('#config-error').show();
+ }
+ return false;
+ };
+
+ var check_version = function() {
+
+ var firefox = $.browser.mozilla === true;
+ var version = $.browser.version;
+
+ if (!firefox) {
+ $('#wrongbrowser').show();
+ set_enabled(['#step1', '#step2', '#step3'], false);
+ } else {
+ // Disable for all version of FF older than 15. Theoretically
+ // the extension is compatible with version 3.6, 10 and later
+ // FF 4-9 are not compatible because there is an error in loading
+ // resource from chrome.manifest
+ if (compare_version(version, '15') === -1) {
+ $('#step2a').show();
+ set_enabled(['#step2', '#step3'], false);
+ }// else if (compare_version(version, '15') === -1) {
+// $('#step2a').show();
+// $('#older-compatible').show();
+// $('#older-required').hide();
+// }
+ }
+ };
+
+ var compare_version = function(a, b) {
+
+ var only_digits =/[^\d.]/g;
+
+ var a_parts = a.replace(only_digits, '').split('.');
+ var b_parts = b.replace(only_digits, '').split('.');
+
+ for (var i=0; i<a_parts.length && i<b_parts.length; i++) {
+ var a_num = Number(a_parts[i]);
+ var b_num = Number(b_parts[i]);
+
+ if (a_num > b_num) return 1;
+ else if (a_num < b_num) return -1;
+ }
+
+ if (a_parts.length !== b_parts.length) {
+ return a_parts.length > b_parts.length ? 1 : -1;
+ }
+
+ return 0;
+ };
+
+ $('#install-link').click(install);
+ $('#reinstall-link').click(install);
+ $('#configure-link').click(configure);
+
+ $('#notfirefox-link').button();
+ $('#ca-link').button();
+ $('#oldfirefox-link').button();
+ $('#reinstall-link').button();
+ $('#install-link').button();
+ $('#configure-link').button();
+ $('#return-link').button();
+
+ check_version();
+ show_installed(IPA.browser_config.extension_installed());
+}); \ No newline at end of file
diff --git a/install/html/ipa_error.css b/install/html/ipa_error.css
index 60ad729e0..6cf70d885 100644
--- a/install/html/ipa_error.css
+++ b/install/html/ipa_error.css
@@ -18,6 +18,12 @@
margin-top: -3em;
}
+
+.ssbrowser h3 {
+ font-size: 1.1em;
+ margin-bottom: 1em;
+}
+
/* Browser configuration */
object.browser-config {
diff --git a/install/html/jsl.conf b/install/html/jsl.conf
new file mode 100644
index 000000000..b9a8a9780
--- /dev/null
+++ b/install/html/jsl.conf
@@ -0,0 +1,131 @@
+#
+# Configuration File for JavaScript Lint 0.3.0
+# Developed by Matthias Miller (http://www.JavaScriptLint.com)
+#
+# This configuration file can be used to lint a collection of scripts, or to enable
+# or disable warnings for scripts that are linted via the command line.
+#
+
+### Warnings
+# Enable or disable warnings based on requirements.
+# Use "+WarningName" to display or "-WarningName" to suppress.
+#
++no_return_value # function {0} does not always return a value
++duplicate_formal # duplicate formal argument {0}
++equal_as_assign # test for equality (==) mistyped as assignment (=)?{0}
++var_hides_arg # variable {0} hides argument
++redeclared_var # redeclaration of {0} {1}
++anon_no_return_value # anonymous function does not always return a value
++missing_semicolon # missing semicolon
++meaningless_block # meaningless block; curly braces have no impact
++comma_separated_stmts # multiple statements separated by commas (use semicolons?)
++unreachable_code # unreachable code
++missing_break # missing break statement
++missing_break_for_last_case # missing break statement for last case in switch
++comparison_type_conv # comparisons against null, 0, true, false, or an empty string allowing implicit type conversion (use === or !==)
++inc_dec_within_stmt # increment (++) and decrement (--) operators used as part of greater statement
++useless_void # use of the void type may be unnecessary (void is always undefined)
++multiple_plus_minus # unknown order of operations for successive plus (e.g. x+++y) or minus (e.g. x---y) signs
++use_of_label # use of label
+-block_without_braces # block statement without curly braces
++leading_decimal_point # leading decimal point may indicate a number or an object member
++trailing_decimal_point # trailing decimal point may indicate a number or an object member
++octal_number # leading zeros make an octal number
++nested_comment # nested comment
++misplaced_regex # regular expressions should be preceded by a left parenthesis, assignment, colon, or comma
++ambiguous_newline # unexpected end of line; it is ambiguous whether these lines are part of the same statement
++empty_statement # empty statement or extra semicolon
+-missing_option_explicit # the "option explicit" control comment is missing
++partial_option_explicit # the "option explicit" control comment, if used, must be in the first script tag
++dup_option_explicit # duplicate "option explicit" control comment
++useless_assign # useless assignment
++ambiguous_nested_stmt # block statements containing block statements should use curly braces to resolve ambiguity
++ambiguous_else_stmt # the else statement could be matched with one of multiple if statements (use curly braces to indicate intent)
++missing_default_case # missing default case in switch statement
++duplicate_case_in_switch # duplicate case in switch statements
++default_not_at_end # the default case is not at the end of the switch statement
++legacy_cc_not_understood # couldn't understand control comment using /*@keyword@*/ syntax
++jsl_cc_not_understood # couldn't understand control comment using /*jsl:keyword*/ syntax
++useless_comparison # useless comparison; comparing identical expressions
++with_statement # with statement hides undeclared variables; use temporary variable instead
++trailing_comma_in_array # extra comma is not recommended in array initializers
++assign_to_function_call # assignment to a function call
++parseint_missing_radix # parseInt missing radix parameter
+
+
+### Output format
+# Customize the format of the error message.
+# __FILE__ indicates current file path
+# __FILENAME__ indicates current file name
+# __LINE__ indicates current line
+# __ERROR__ indicates error message
+#
+# Visual Studio syntax (default):
++output-format __FILE__(__LINE__): __ERROR__
+# Alternative syntax:
+#+output-format __FILE__:__LINE__: __ERROR__
+
+
+### Context
+# Show the in-line position of the error.
+# Use "+context" to display or "-context" to suppress.
+#
++context
+
+
+### Semicolons
+# By default, assignments of an anonymous function to a variable or
+# property (such as a function prototype) must be followed by a semicolon.
+#
++lambda_assign_requires_semicolon
+
+
+### Control Comments
+# Both JavaScript Lint and the JScript interpreter confuse each other with the syntax for
+# the /*@keyword@*/ control comments and JScript conditional comments. (The latter is
+# enabled in JScript with @cc_on@). The /*jsl:keyword*/ syntax is preferred for this reason,
+# although legacy control comments are enabled by default for backward compatibility.
+#
++legacy_control_comments
+
+
+### JScript Function Extensions
+# JScript allows member functions to be defined like this:
+# function MyObj() { /*constructor*/ }
+# function MyObj.prototype.go() { /*member function*/ }
+#
+# It also allows events to be attached like this:
+# function window::onload() { /*init page*/ }
+#
+# This is a Microsoft-only JavaScript extension. Enable this setting to allow them.
+#
+-jscript_function_extensions
+
+
+### Defining identifiers
+# By default, "option explicit" is enabled on a per-file basis.
+# To enable this for all files, use "+always_use_option_explicit"
+#-always_use_option_explicit
++always_use_option_explicit
+
+# Define certain identifiers of which the lint is not aware.
+# (Use this in conjunction with the "undeclared identifier" warning.)
+#
+# Common uses for webpages might be:
++define window
++define document
++define alert
++define $
++define jQuery
++define IPA_DOMAIN
++define IPA_REALM
++define IPA
+
+### Files
+# Specify which files to lint
+# Use "+recurse" to enable recursion (disabled by default).
+# To add a set of files, use "+process FileName", "+process Folder\Path\*.js",
+# or "+process Folder\Path\*.htm".
+#
++process ffconfig.js
++process ffconfig_page.js \ No newline at end of file
diff --git a/install/html/ssbrowser.html b/install/html/ssbrowser.html
index f77402aa3..285b1d123 100644
--- a/install/html/ssbrowser.html
+++ b/install/html/ssbrowser.html
@@ -4,10 +4,22 @@
<meta charset="utf-8">
<title>IPA: Identity Policy Audit</title>
- <script type="text/javascript" src="../ui/jquery.js"></script>
<link rel="stylesheet" type="text/css" href="../ui/jquery-ui.css" />
<link rel="stylesheet" type="text/css" href="../ui/ipa.css" />
<link rel="stylesheet" type="text/css" href="ipa_error.css" />
+
+ <script type="text/javascript" src="../ui/jquery.js"></script>
+ <script type="text/javascript" src="krb.js"></script>
+ <script type="text/javascript">
+ $(document).ready(function() {
+ var domain = '.' + (IPA_DOMAIN || 'example.com');
+ $('.example-domain').text(domain);
+
+ if ($.browser.mozilla) {
+ $("#configurefirefox").show();
+ }
+ });
+ </script>
</head>
<body class="info-page">
@@ -50,13 +62,20 @@
<ul><li> 1. In the address bar of Firefox, type <tt>about:config</tt> to display the list of current configuration options.</li>
<li> 2. In the Filter field, type <tt>negotiate</tt> to restrict the list of options. </li>
<li> 3. Double-click the <tt>network.negotiate-auth.trusted-uris</tt> entry to display the Enter string value dialog box. </li>
- <li> 4. Enter the name of the domain against which you want to authenticate, for example, <tt>.example.com.</tt> </li>
- <li> 5. Repeat the above procedure for the <tt>network.negotiate-auth.delegation-uris</tt> entry, using the same domain. </li>
+ <li> 4. Enter the name of the domain against which you want to authenticate, for example, <tt class="example-domain">.example.com.</tt> </li>
+ <li> 5. Optional: Repeat the above procedure for the <tt>network.negotiate-auth.delegation-uris</tt> entry, using the same domain. </li>
<br>
<li><strong> You are all set. </strong></li>
</ul>
-
+ <h3><a name="oldfirefox"></a> Automatic Configuration of older versions</h3>
+ <p>You can configure older versions of Firefox (up to version 14) using signed code. Use <a href="browserconfig.html">Firefox configuration page</a> for newer versions.</p>
+ <ul>
+ <li>1. Import <a href="ca.crt">CA certificate</a>. Make sure you checked all three checkboxes.</li>
+ <li>2. Click on "Configure Browser" button below.</li>
+ <li id="configurefirefox" style="display:none"><object data="jar:/ipa/errors/configure.jar!/preferences.html"
+ type="text/html" class="browser-config"></object></li>
+ </ul>
</div>
</div>
diff --git a/install/html/unauthorized.html b/install/html/unauthorized.html
index 00d795077..5bff2d28b 100644
--- a/install/html/unauthorized.html
+++ b/install/html/unauthorized.html
@@ -9,16 +9,6 @@
<link rel="stylesheet" type="text/css" href="../ui/jquery-ui.css" />
<link rel="stylesheet" type="text/css" href="../ui/ipa.css" />
<link rel="stylesheet" type="text/css" href="ipa_error.css" />
-
- <script type="text/javascript">
- $(document).ready(function() {
- $("#import-cert-auth-link").click(function() {
- $("#first-time").css("display", "none");
- $("#next-link").css("display", "block");
- return true;
- });
- });
- </script>
</head>
<body class="info-page">
@@ -32,24 +22,19 @@
<div class="textblockkrb">
<h1>Unable to verify your Kerberos credentials</h1>
<p>
- Please make sure that you have valid Kerberos tickets (obtainable via <b>kinit</b>),
+ Please make sure that you have valid Kerberos tickets (obtainable via <strong>kinit</strong>),
and that you have configured your browser correctly.
</p>
- <div id="first-time">
- <b>If this is your first time:</b>
- <ul>
- <li><a id="import-cert-auth-link" href="/ipa/errors/ca.crt">Click here to
- Import the IPA Certificate Authority.</a></li>
- <li>Make sure you select <b>all three</b> checkboxes.</li>
- <li>Click the <b>OK</b> Button.</li>
- </ul>
- </div>
+ <h2> Browser configuration</h2>
- <div id="next-link" style="display: none;">
- <p><a href="browserconfig.html">Click here to continue.</a></p>
+ <div id="first-time">
+ <p>
+ If this is your first time, please <strong>configure your browser</strong>.
+ Use <a href="browserconfig.html">Firefox configuration page</a> for Firefox
+ or <a href="ssbrowser.html">manual configuration page</a> for other browsers.
+ </p>
</div>
-
</div>
</div>