From 0a5e6007da97ee74ad935f184302c5755b02e64c Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Thu, 30 Jun 2011 23:10:08 +0000
Subject: [PATCH] - Proxy error pages and CSS. Needs a little help still.

---
 build.xml                                     |   4 +++
 res/drawable/itoopie_sm.png                   | Bin 0 -> 4866 bytes
 res/raw/ahelper_conflict_header_ht            |  27 ++++++++++++++++
 res/raw/ahelper_new_header_ht                 |  24 +++++++++++++++
 res/raw/android_css                           |  13 ++++++++
 res/raw/auth_header_ht                        |  24 +++++++++++++++
 res/raw/denied_header_ht                      |  19 ++++++++++++
 res/raw/dnf_header_ht                         |  22 +++++++++++++
 res/raw/dnfb_header_ht                        |  23 ++++++++++++++
 res/raw/dnfh_header_ht                        |  26 ++++++++++++++++
 res/raw/dnfp_header_ht                        |  25 +++++++++++++++
 res/raw/localhost_header_ht                   |  18 +++++++++++
 res/raw/noproxy_header_ht                     |  20 ++++++++++++
 res/raw/protocol_header_ht                    |  20 ++++++++++++
 src/net/i2p/android/apps/EepGetFetcher.java   |   2 +-
 .../router/activity/I2PWebViewClient.java     |   2 +-
 src/net/i2p/android/router/service/Init.java  |  29 ++++++++++++++++++
 17 files changed, 296 insertions(+), 2 deletions(-)
 create mode 100644 res/drawable/itoopie_sm.png
 create mode 100644 res/raw/ahelper_conflict_header_ht
 create mode 100644 res/raw/ahelper_new_header_ht
 create mode 100644 res/raw/android_css
 create mode 100644 res/raw/auth_header_ht
 create mode 100644 res/raw/denied_header_ht
 create mode 100644 res/raw/dnf_header_ht
 create mode 100644 res/raw/dnfb_header_ht
 create mode 100644 res/raw/dnfh_header_ht
 create mode 100644 res/raw/dnfp_header_ht
 create mode 100644 res/raw/localhost_header_ht
 create mode 100644 res/raw/noproxy_header_ht
 create mode 100644 res/raw/protocol_header_ht

diff --git a/build.xml b/build.xml
index 70b77d953..639fe1989 100644
--- a/build.xml
+++ b/build.xml
@@ -156,6 +156,8 @@
     <target name="copy-i2p-resources" depends="findI2PSource, -dirs" >
         <copy file="LICENSE.txt" tofile="res/raw/license_app_txt" />
         <copy file="${i2pbase}/installer/resources/themes/console/images/i2plogo.png" todir="res/drawable/" />
+        <copy file="${i2pbase}/installer/resources/themes/console/light/images/header.png" todir="res/drawable/" />
+        <copy file="${i2pbase}/installer/resources/themes/console/light/console.css" tofile="res/raw/console_css" />
         <copy file="${i2pbase}/installer/resources/blocklist.txt" tofile="res/raw/blocklist_txt" />
         <copy file="${i2pbase}/installer/resources/hosts.txt" tofile="res/raw/hosts_txt" />
         <copy file="${i2pbase}/licenses/LICENSE-ElGamalDSA.txt" tofile="res/raw/license_elgamaldsa_txt" />
@@ -199,6 +201,8 @@
     <target name="distclean" depends="clean">
         <delete dir="${jar.libs.dir}" verbose="${verbose}" />
         <delete file="res/drawable/i2plogo.png" verbose="${verbose}"/>
+        <delete file="res/drawable/header.png" verbose="${verbose}"/>
+        <delete file="res/raw/console_css" verbose="${verbose}"/>
         <delete file="res/raw/blocklist_txt" verbose="${verbose}" />
         <delete file="res/raw/hosts_txt" verbose="${verbose}" />
         <delete file="res/raw/license_app_txt" />
diff --git a/res/drawable/itoopie_sm.png b/res/drawable/itoopie_sm.png
new file mode 100644
index 0000000000000000000000000000000000000000..3c9b87d573bdff9a98db1fb8da68ffec4140d2e6
GIT binary patch
literal 4866
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

literal 0
HcmV?d00001

diff --git a/res/raw/ahelper_conflict_header_ht b/res/raw/ahelper_conflict_header_ht
new file mode 100644
index 000000000..75738da36
--- /dev/null
+++ b/res/raw/ahelper_conflict_header_ht
@@ -0,0 +1,27 @@
+HTTP/1.1 409 Conflict
+Content-Type: text/html; charset=UTF-8
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html><head>
+<title>I2P Warning: Destination key conflict</title>
+<link href="file:///data/data/net.i2p.android.router/files/docs/themes/console/light/console.css" rel="stylesheet" type="text/css" >
+<link href="file:///data/data/net.i2p.android.router/files/docs/themes/console/light/android.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+<div class=logo>
+ <img src="file:///data/data/net.i2p.android.router/files/docs/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0">
+</div>
+<div class=warning id=warning>
+<h3>Warning: Destination Key Conflict</h3>
+The addresshelper link you followed specifies a different destination key
+than a host entry in your host database.
+Someone could be trying to impersonate another eepsite,
+or people have given two eepsites identical names.
+<p>
+You can resolve the conflict by considering which key you trust,
+and either discarding the addresshelper link,
+discarding the host entry from your host database,
+or naming one of them differently.
+<p>
diff --git a/res/raw/ahelper_new_header_ht b/res/raw/ahelper_new_header_ht
new file mode 100644
index 000000000..96d512e89
--- /dev/null
+++ b/res/raw/ahelper_new_header_ht
@@ -0,0 +1,24 @@
+HTTP/1.1 409 New Address
+Content-Type: text/html; charset=UTF-8
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html><head>
+<title>I2P Information: New Host Name</title>
+<link href="file:///data/data/net.i2p.android.router/files/docs/themes/console/light/console.css" rel="stylesheet" type="text/css" >
+<link href="file:///data/data/net.i2p.android.router/files/docs/themes/console/light/android.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+<div class=logo>
+ <img src="file:///data/data/net.i2p.android.router/files/docs/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0">
+</div>
+<div class=warning id=warning>
+<h3>Information: New Host Name with Address Helper</h3>
+<p>
+The address helper link you followed is for a new host name that is not in your address book.
+You may save this host name to your local address book.
+If you save it to your address book, you will not see this message again.
+If you do not save it, the host name will be forgotten after the next router restart.
+If you do not wish to visit this host, click the "back" button on your browser.
+</p>
diff --git a/res/raw/android_css b/res/raw/android_css
new file mode 100644
index 000000000..a20a8ba6f
--- /dev/null
+++ b/res/raw/android_css
@@ -0,0 +1,13 @@
+/* overrides of console.css */
+
+div.logo {
+     margin: 0 auto;
+     float: none;
+}
+
+/* proxy error messages */
+
+div.warning {
+     margin: 20px;
+     min-width: 360px;
+}
diff --git a/res/raw/auth_header_ht b/res/raw/auth_header_ht
new file mode 100644
index 000000000..220863462
--- /dev/null
+++ b/res/raw/auth_header_ht
@@ -0,0 +1,24 @@
+HTTP/1.1 407 Proxy Authorization Required
+Content-Type: text/html; charset=UTF-8
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.5
+Proxy-Authenticate: Basic realm="I2P HTTP Proxy"
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html><head>
+<title>Proxy Authorization Required</title>
+<link href="file:///data/data/net.i2p.android.router/files/docs/themes/console/light/console.css" rel="stylesheet" type="text/css" >
+<link href="file:///data/data/net.i2p.android.router/files/docs/themes/console/light/android.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+<div class=warning id=warning>
+<h3>I2P HTTP Proxy Authorization Required</h3>
+This proxy is configured to require a username and password for access.
+Please enter your username and password, or check your
+router configuration
+or
+I2PTunnel configuration.
+To disable authorization, remove the configuration
+<code>i2ptunnel.proxy.auth=basic</code>, then stop and restart the HTTP Proxy tunnel.
+</div>
diff --git a/res/raw/denied_header_ht b/res/raw/denied_header_ht
new file mode 100644
index 000000000..3c5e454cb
--- /dev/null
+++ b/res/raw/denied_header_ht
@@ -0,0 +1,19 @@
+HTTP/1.1 403 Request Denied
+Content-Type: text/html; charset=UTF-8
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html><head>
+<title>I2P Warning: Request Denied</title>
+<link href="file:///data/data/net.i2p.android.router/files/docs/themes/console/light/console.css" rel="stylesheet" type="text/css" >
+<link href="file:///data/data/net.i2p.android.router/files/docs/themes/console/light/android.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+<div class=logo>
+ <img src="file:///data/data/net.i2p.android.router/files/docs/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0">
+</div>
+<div class=warning id=warning>
+<h3>Warning: Request Denied</h3>
+You attempted to connect to a non-I2P website or location.
+</div>
diff --git a/res/raw/dnf_header_ht b/res/raw/dnf_header_ht
new file mode 100644
index 000000000..109d47418
--- /dev/null
+++ b/res/raw/dnf_header_ht
@@ -0,0 +1,22 @@
+HTTP/1.1 504 Gateway Timeout
+Content-Type: text/html; charset=UTF-8
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html><head>
+<title>I2P Warning: Eepsite not reachable</title>
+<link href="file:///data/data/net.i2p.android.router/files/docs/themes/console/light/console.css" rel="stylesheet" type="text/css" >
+<link href="file:///data/data/net.i2p.android.router/files/docs/themes/console/light/android.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+<div class=logo>
+ <img src="file:///data/data/net.i2p.android.router/files/docs/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0">
+</div>
+<div class=warning id=warning>
+<h3>Warning: Eepsite Unreachable</h3>
+The eepsite was not reachable.
+The eepsite is offline, there is network congestion,
+or your router is not yet well-integrated with peers.
+You may want to retry.
+<hr><b>Could not find the following destination:</b><BR><BR>
diff --git a/res/raw/dnfb_header_ht b/res/raw/dnfb_header_ht
new file mode 100644
index 000000000..cb094b9a3
--- /dev/null
+++ b/res/raw/dnfb_header_ht
@@ -0,0 +1,23 @@
+HTTP/1.1 400 Destination Not Found
+Content-Type: text/html; charset=UTF-8
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html><head>
+<title>I2P Warning: Invalid eepsite destination</title>
+<link href="file:///data/data/net.i2p.android.router/files/docs/themes/console/light/console.css" rel="stylesheet" type="text/css" >
+<link href="file:///data/data/net.i2p.android.router/files/docs/themes/console/light/android.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+<div class=logo>
+ <img src="file:///data/data/net.i2p.android.router/files/docs/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0">
+</div>
+<div class=warning id=warning>
+<h3>Warning: Invalid Destination</h3>
+The eepsite destination specified was not valid, or was
+otherwise unreachable.  Perhaps you pasted in the 
+wrong BASE64 string or the link you are following is 
+bad. The I2P host could also 
+be offline.  You may want to retry.
+<hr><b>Could not find the following destination:</b><BR><BR>
diff --git a/res/raw/dnfh_header_ht b/res/raw/dnfh_header_ht
new file mode 100644
index 000000000..659dcc200
--- /dev/null
+++ b/res/raw/dnfh_header_ht
@@ -0,0 +1,26 @@
+HTTP/1.1 404 Domain Not Found
+Content-Type: text/html; charset=UTF-8
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html><head>
+<title>I2P Warning: Eepsite unknown</title>
+<link href="file:///data/data/net.i2p.android.router/files/docs/themes/console/light/console.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+<div class=logo>
+ <img src="file:///data/data/net.i2p.android.router/files/docs/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0">
+<link href="file:///data/data/net.i2p.android.router/files/docs/themes/console/light/android.css" rel="stylesheet" type="text/css" >
+</div>
+<div class=warning id=warning>
+<h3>Warning: Eepsite Not Found in Addressbook</h3>
+The eepsite was not found in your router's addressbook.
+Check the link or find a BASE64 address.
+If you have the BASE64 address,  paste it into your userhosts.txt in
+your address book,
+use a BASE64 address helper, or use a jump service link below.<br><br>
+Seeing this page often? See <a href="http://www.i2p2.i2p/faq.html#subscriptions">the FAQ</a>
+for help in adding some subscriptions
+to your addressbook.<hr>
+<b>Could not find the following destination:</b><BR><BR>
diff --git a/res/raw/dnfp_header_ht b/res/raw/dnfp_header_ht
new file mode 100644
index 000000000..d97fe272e
--- /dev/null
+++ b/res/raw/dnfp_header_ht
@@ -0,0 +1,25 @@
+HTTP/1.1 504 Gateway Timeout
+Content-Type: text/html; charset=UTF-8
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html><head>
+<title>I2P Warning: Outproxy Not Found</title>
+<link href="file:///data/data/net.i2p.android.router/files/docs/themes/console/light/console.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+<div class=logo>
+ <img src="file:///data/data/net.i2p.android.router/files/docs/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0">
+<link href="file:///data/data/net.i2p.android.router/files/docs/themes/console/light/android.css" rel="stylesheet" type="text/css" >
+</div>
+<div class=warning id=warning>
+<h3>Warning: I2P Proxy Not Found</h3>
+The WWW Outproxy was not found. 
+It is offline, there is network congestion,
+or your router is not yet well-integrated with peers.
+You may want to retry
+as this will randomly reselect an outproxy from the pool you have defined
+(if you have more than one configured). 
+If you continue to have trouble you may want to edit your outproxy list.
+<hr><b>Could not find the following destination:</b><BR><BR>
diff --git a/res/raw/localhost_header_ht b/res/raw/localhost_header_ht
new file mode 100644
index 000000000..9865fa377
--- /dev/null
+++ b/res/raw/localhost_header_ht
@@ -0,0 +1,18 @@
+HTTP/1.1 403 Access Denied
+Content-Type: text/html; charset=UTF-8
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html><head>
+<title>I2P Error: Request Denied</title>
+<link href="file:///data/data/net.i2p.android.router/files/docs/themes/console/light/console.css" rel="stylesheet" type="text/css" >
+<link href="file:///data/data/net.i2p.android.router/files/docs/themes/console/light/android.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+
+<div class=warning id=warning>
+<h3>Error: Local Access</h3>
+Your browser is misconfigured. Do not use the proxy to access the router console,
+localhost, or local LAN destinations.
+</div>
diff --git a/res/raw/noproxy_header_ht b/res/raw/noproxy_header_ht
new file mode 100644
index 000000000..f14524230
--- /dev/null
+++ b/res/raw/noproxy_header_ht
@@ -0,0 +1,20 @@
+HTTP/1.1 503 Service Unavailable
+Content-Type: text/html; charset=UTF-8
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html><head>
+<title>I2P Warning: No outproxy configured</title>
+<link href="file:///data/data/net.i2p.android.router/files/docs/themes/console/light/console.css" rel="stylesheet" type="text/css" >
+<link href="file:///data/data/net.i2p.android.router/files/docs/themes/console/light/android.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+<div class=logo>
+ <img src="file:///data/data/net.i2p.android.router/files/docs/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0">
+</div>
+<div class=warning id=warning>
+<h3>Warning: No Outproxy Configured</h3>
+Your request was for a site outside of I2P, but you have no
+HTTP outproxy configured.  Please configure an outproxy in I2PTunnel.
+</div>
diff --git a/res/raw/protocol_header_ht b/res/raw/protocol_header_ht
new file mode 100644
index 000000000..299cc69a5
--- /dev/null
+++ b/res/raw/protocol_header_ht
@@ -0,0 +1,20 @@
+HTTP/1.1 403 Bad Protocol
+Content-Type: text/html; charset=UTF-8
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html><head>
+<title>I2P Warning: Non-HTTP Protocol</title>
+<link href="file:///data/data/net.i2p.android.router/files/docs/themes/console/light/console.css" rel="stylesheet" type="text/css" >
+<link href="file:///data/data/net.i2p.android.router/files/docs/themes/console/light/android.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+<div class=logo>
+ <img src="file:///data/data/net.i2p.android.router/files/docs/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0">
+</div>
+<div class=warning id=warning>
+<h3>Warning: Non-HTTP Protocol</h3>
+The request uses a bad protocol.
+The I2P HTTP Proxy supports http:// requests ONLY. Other protocols such as https:// and ftp:// are not allowed.
+</div>
diff --git a/src/net/i2p/android/apps/EepGetFetcher.java b/src/net/i2p/android/apps/EepGetFetcher.java
index 6c8ee6a33..983bf400d 100644
--- a/src/net/i2p/android/apps/EepGetFetcher.java
+++ b/src/net/i2p/android/apps/EepGetFetcher.java
@@ -27,7 +27,7 @@ public class EepGetFetcher implements EepGet.StatusListener {
 
     private static final String ERROR_HEADER = "<html><head><title>Not Found</title></head><body>";
     private static final String ERROR_URL = "<p>Unable to load URL: ";
-    private static final String ERROR_ROUTER = "<p>Your router does not appear to be up.</p>";
+    private static final String ERROR_ROUTER = "<p>Your router (or the HTTP proxy) does not appear to be running.</p>";
     private static final String ERROR_FOOTER = "</body></html>";
 
     /**
diff --git a/src/net/i2p/android/router/activity/I2PWebViewClient.java b/src/net/i2p/android/router/activity/I2PWebViewClient.java
index d2def71be..8c9ecc15f 100644
--- a/src/net/i2p/android/router/activity/I2PWebViewClient.java
+++ b/src/net/i2p/android/router/activity/I2PWebViewClient.java
@@ -38,7 +38,7 @@ class I2PWebViewClient extends WebViewClient {
     private static final String HEADER = "<html><head></head><body>";
     private static final String FOOTER = "</body></html>";
     private static final String ERROR_URL = "<p>Unable to load URL: ";
-    private static final String ERROR_ROUTER = "<p>Your router does not appear to be up.</p>";
+    private static final String ERROR_ROUTER = "<p>Your router (or the HTTP proxy) does not appear to be running.</p>";
 
     public I2PWebViewClient(Context ctx) {
         super();
diff --git a/src/net/i2p/android/router/service/Init.java b/src/net/i2p/android/router/service/Init.java
index 01434538e..6e9f76d24 100644
--- a/src/net/i2p/android/router/service/Init.java
+++ b/src/net/i2p/android/router/service/Init.java
@@ -72,10 +72,39 @@ class Init {
             mergeResourceToFile(R.raw.hosts_txt, "hosts.txt", null);
             mergeResourceToFile(R.raw.more_hosts_txt, "hosts.txt", null);
             copyResourceToFile(R.raw.blocklist_txt, "blocklist.txt");
+
             File abDir = new File(myDir, "addressbook");
             abDir.mkdir();
             copyResourceToFile(R.raw.subscriptions_txt, "addressbook/subscriptions.txt");
             mergeResourceToFile(R.raw.addressbook_config_txt, "addressbook/config.txt", null);
+
+            File docsDir = new File(myDir, "docs");
+            docsDir.mkdir();
+            copyResourceToFile(R.raw.ahelper_conflict_header_ht, "docs/ahelper-conflict-header.ht");
+            copyResourceToFile(R.raw.ahelper_new_header_ht, "docs/ahelper-new-header.ht");
+            copyResourceToFile(R.raw.auth_header_ht, "docs/auth-header.ht");
+            copyResourceToFile(R.raw.denied_header_ht, "docs/denied-header.ht");
+            copyResourceToFile(R.raw.dnf_header_ht, "docs/dnf-header.ht");
+            copyResourceToFile(R.raw.dnfb_header_ht, "docs/dnfb-header.ht");
+            copyResourceToFile(R.raw.dnfh_header_ht, "docs/dnfh-header.ht");
+            copyResourceToFile(R.raw.dnfp_header_ht, "docs/dnfp-header.ht");
+            copyResourceToFile(R.raw.localhost_header_ht, "docs/localhost-header.ht");
+            copyResourceToFile(R.raw.noproxy_header_ht, "docs/noproxy-header.ht");
+            copyResourceToFile(R.raw.protocol_header_ht, "docs/protocol-header.ht");
+
+            File cssDir = new File(docsDir, "themes/console/light");
+            cssDir.mkdirs();
+            copyResourceToFile(R.raw.console_css, "docs/themes/console/light/console.css");
+            copyResourceToFile(R.raw.android_css, "docs/themes/console/light/android.css");
+
+            File imgDir = new File(docsDir, "themes/console/images");
+            imgDir.mkdir();
+            copyResourceToFile(R.drawable.i2plogo, "docs/themes/console/images/i2plogo.png");
+            copyResourceToFile(R.drawable.itoopie_sm, "docs/themes/console/images/itoopie_sm.png");
+
+            File img2Dir = new File(cssDir, "images");
+            img2Dir.mkdir();
+            copyResourceToFile(R.drawable.header, "docs/themes/console/light/images/header.png");
         }
 
         deleteOldFiles();
-- 
GitLab