generated
[privoxy.git] / doc / webserver / actions / step2.php
index 635f1d1..bdc08cd 100644 (file)
@@ -8,15 +8,51 @@
               This file belongs in
               ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/
 
-  $Id: step2.php,v 1.1 2002/03/30 03:20:30 oes Exp $
+  $Id: step2.php,v 1.13 2002/04/09 13:08:21 oes Exp $
 
   $Log: step2.php,v $
+  Revision 1.13  2002/04/09 13:08:21  oes
+  declare script type
+
+  Revision 1.12  2002/04/08 17:04:05  oes
+  Adapt to unified stylesheet
+
+  Revision 1.11  2002/04/07 15:00:20  oes
+  Descand into framesets to harvest all image URLs
+
+  Revision 1.10  2002/04/06 15:19:35  oes
+  Cosmetics   Clean-up, smarter handling of unreachable URLs
+
+  Revision 1.9  2002/04/06 11:34:44  oes
+  Reactivating the scripts ,-)   Cosmetics
+
+  Revision 1.7  2002/04/03 19:36:04  swa
+  consistent look
+
+  Revision 1.6  2002/04/02 07:22:19  oes
+  Elimnating duplicate images; using relative link for step3
+
+  Revision 1.5  2002/04/02 06:14:47  oes
+  Follow redirects  
+
+  Revision 1.4  2002/04/01 19:13:47  oes (based on 1.2)
+  Extended, fixed bugs, beefed up design, made IE-safe
+
+  Revision 1.3  2002/03/30 20:44:46  swa
+  have consistent look and feel. part 2.
+  use correct urls. 
+
+  Revision 1.2  2002/03/30 19:49:34  swa
+  have consistent look and feel
+
   Revision 1.1  2002/03/30 03:20:30  oes
   Added Feedback mechanism for actions file
 
 
-  Written by and Copyright (C) 2002 the SourceForge
-  Privoxy team. http://www.privoxy.org/
+  Copyright (C) 2002 the SourceForge Privoxy team.
+  http://www.privoxy.org/
+
+  Written by Andreas Oesterhelt
 
   This program is free software; you can redistribute it
   and/or modify it under the terms of the GNU General
  -->
 
  <head>
-  <style type="text/css">
-   body, div, p, h1, h2, ul, ol, li, td, th, dl, dt, dd { font-family:helvetica,helv,arial,sans-serif; font-size:10px }
-   body { background-color: #ffffff }
-   div.title    { background-color:#dddddd; border:solid black 1px; margin:20px; min-width: 80%; padding:20px; font-size:15px; font-weight:bold }
-   div.box      { background-color:#eeeeee; border:solid black 1px; margin:20px; min-width: 80%; padding:20px; font-size:10px }
-   div.infobox  { background-color:#ccccff; border:solid black 1px; margin:20px; min-width: 60%; max-width: 60%; padding:20px; font-size:10px; }
-   div.errorbox { background-color:#ffdddd; border:solid black 1px; margin:20px; min-width: 60%; max-width: 60%; padding:20px; font-size:10px; }
-  </style>
-
-  <script language="javascript">
+  <meta http-equiv="Content-Style-Type" content="text/css">
+  <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+  <meta http-equiv="Content-Script-Type" content="text/javascript">
+  <link rel="stylesheet" type="text/css" href="../privoxy.css">
+  <link rel="stylesheet" type="text/css" href="../p_feedback.css">
+
+  <script language="javascript" type="text/javascript">
+  <!--
    //
    // Could be as easy as style="max-wdith: 300px; max-height..." inside the
-   // <img> tag, but IE doesn't do that. Setting the values directly also
+   // <img> tag, but IE doesn't understand that. Setting the values directly also
    // screws IE for some weird reason. All praise MS.
    //
 
          image.height = newheight
       }
    }
+  //-->
   </script>
 
-
 <?php
 
 /*
  * For testing: 
  */
-$base_url = "http://www.oesterhelt.org/actions";
-//$base_url = "http://privoxy.org/actions";
-//$base_url = "http://localhost/actions";
 //phpinfo();
-//error_reporting(E_NONE);
-error_reporting(E_ALL);
+//error_reporting(E_ALL);
+error_reporting(E_NONE);
 
+/*
+ * Function: link_to_absolute
+ * Purpose:  Make $link from $base absolute
+ */
+function link_to_absolute($base, $link)
+{
+   /*
+    * If $link already is absolute, we're done:
+    */
+   if (!strncmp("http://", $link, 7) || !strncmp("https://", $link, 8))
+   {
+      return $link;
+   }
 
-/* 
- * Cannot start with step 2:
+   /*
+    * Cut the base to it's proto://host/ or to its proto://host/dir/,
+    * depending whether $link is host-relative or path-relative.
+    */
+   if ($link{0} == "/")
+   {
+      /*
+       * host-relative:
+       */
+       preg_match('|^(https?://[^/]+)|i', $base, $results);
+       $base = $results[1];
+   }
+   else
+   {
+      /*
+       * path-relative:
+       */
+      if (strpos($base, '/') != strlen($base))
+      {
+         preg_match('|(.*/)|i', $base, $results);
+         $base = $results[1];
+      }
+   }
+   return $base.$link;
+}
+
+
+/*
+ * Function: slurp_page
+ *
+ * Purpose:  Retrieve a URL with curl, and return the contents
+ *           or "FAILED" if it fails.
  */
-if (!isset($referrer_url))
+
+function slurp_page($url)
+{
+   $ch = curl_init ($url);
+
+   curl_setopt ($ch, CURLOPT_HEADER, 0);
+   curl_setopt ($ch, CURLOPT_FAILONERROR, 1);
+   curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
+   curl_setopt ($ch, CURLOPT_TIMEOUT, 20);            
+
+   ob_start();
+   $success = curl_exec ($ch);
+   $page = ob_get_contents();
+   ob_end_clean();
+
+   curl_close ($ch);
+
+   return $success ? $page : "FAILED";
+}
+
+/*
+ * Function: get_image_urls_sp
+ * 
+ * Purpose:  Return the image URLs from a single page
+ */
+function get_image_urls_sp($page, $url)
+{
+   preg_match_all('|<img\s+[^>]*?src=[\'"]?(.*?)[\'" >]|i', $page, $matches);
+   
+   foreach (array_unique($matches[1]) as $image_link)
+   {
+      $result[] = link_to_absolute($url, $image_link); 
+   }
+
+   return count($result) ? $result : 0;
+}
+
+/*
+ * Function: get_image_urls
+ * 
+ * Purpose:  If the page is a frameset, rerurn the image URLs from all
+ *           its frame SRCes, else from the page itself.
+ */
+function get_image_urls($page, $url)
+{
+
+   preg_match_all('|<frame\s+[^>]*?src=[\'"]?(.*?)[\'" >]|i', $page, $matches);
+
+   if (count($matches[1]))
+   {
+      foreach(array_unique($matches[1]) as $frame_link)
+      {
+         $framebuf = slurp_page(link_to_absolute($url, $frame_link));
+         $result = array_merge($result, get_image_urls_sp($framebuf, link_to_absolute($url, $frame_link)));
+      }
+   }
+   else
+   {
+      $result = get_image_urls_sp($page, $url);
+   }
+
+   return array_values(array_unique($result));
+}
+
+
+/*
+ * Function: error_abort
+ * Purpose:  Return an error page with $title and $message
+ */
+function error_abort($title, $message)
 {
-   echo ("  <title>Invalid Feedback Submission</title>
+   if ($title == "invalid") /* shortcut */
+   {
+      $title = "Invalid Feedback Submission";
+   }
+
+   echo ("  <title>Privoxy: $title</title>
            </head>
            <body>
-            <div class=\"title\">Invalid Feedback Submission</div>
-            <div align=\"center\">
-             <div class=\"errorbox\" align=\"left\">When submitting your feedback please start with
-              <a href=\"index.php\">step 1</a>.
+            <div class=\"title\">
+             <h1>
+              <a href=\"http://www.privoxy.org/\">Privoxy</a>: $title
+              </h1>
+             </div>
+            <center>
+             <div class=\"warning\">
+              $message
              </div>
-            </div>
+            </center>
+            <p>Valid <a href=\"http://validator.w3.org/\">HTML 4.01 Transitional</a></p>
            </body>
           </html>\n");
    exit; 
 }
 
+/* 
+ * Cannot start with step 2:
+ */
+if (!isset($referrer_url))
+{
+   error_abort("invalid", "When submitting your feedback please start with
+                <a href=\"index.php\">step 1</a>.");
+}
+
 
 /* 
  * Cannot work on unknown problem:
  */
 if (!isset($problem) || $problem == "INVALID")
 {
-   echo ("  <title>Invalid Feedback Submission</title>
-           </head>
-           <body>
-            <div class=\"title\">Invalid Feedback Submission</div>
-            <div align=\"center\">
-             <div class=\"errorbox\" align=\"left\">You need to select the nature of the problem in
-              <a href=\"javascript:history.back();\">step 1</a>.
-             </div>
-            </div>
-           </body>
-          </html>\n");
-   exit; 
+   error_abort("invalid", "You need to select the nature of the problem in
+                <a href=\"javascript:history.back();\">step 1</a>.");
 }
 
 
 /*
- * Check if URL really exists and buffer its contents:
- *
- * FIXME: Curl is not installed on SF; Filed as Alexandria
- *        Feature Request #537014. 
- *        PHP's fopen() supports URLs, but it seems that
- *        curls options for Timeouts and HTTP error handling
- *        are not supported by fopen().
+ * If the protocol is missing from $referrer_url, prepend "http://"
  */
-$ch = curl_init ($referrer_url);
-
-curl_setopt ($ch, CURLOPT_HEADER, 0);
-curl_setopt ($ch, CURLOPT_FAILONERROR, 1);
-curl_setopt ($ch, CURLOPT_TIMEOUT, 15);
-
-ob_start();
-$success = curl_exec ($ch);
-$page = ob_get_contents();
-ob_end_clean();
+if (!preg_match('|^https?://|i', $referrer_url, $dummy))
+{
+   $referrer_url = "http://" . $referrer_url;
+}
 
-curl_close ($ch);
 
-if (!$success)
+/*
+ * Check if URL really exists and buffer its contents:
+ */
+if (($page = slurp_page($referrer_url)) == "FAILED")
 {
-   echo ("  <title>Invalid Feedback Submission</title>
-           </head>
-           <body>
-            <div class=\"title\">Invalid Feedback Submission</div>
-            <div align=\"center\">
-             <div class=\"errorbox\" align=\"left\">
-              <p>The URL that you entered (<a href=\"$referrer_url\">$referrer_url</a>)
-               <br>could not be retrieved.
-              </p>
-              <p>Make sure the URL is correct and publicly accessible.</p>
-              <p><a href=\"javascript:history.back();\">Back to step 1</a></p>
-             </div>
-            </div>
-           </body>
-          </html>\n");
-   exit; 
+   $url_confirm = "
+     <dt>
+      <p><b>Confirm the URL:</b></p>
+     </dt>
+     <dd>
+      <p>
+       The URL that you entered could not be retrieved. Please make sure that
+      </p>
+      <p class=\"important\">
+       <a href=\"$referrer_url\">$referrer_url</a>
+      </p>
+      <p>
+       is correct and publicly accssible.
+      </p>
+      <p>
+       <input type=\"checkbox\" name=\"url_confirmed\" value=\"user\"> Yes, I'm sure.
+      </p>
+     </dd>";
+}
+else
+{
+   $url_confirm = "<input type=\"hidden\" name=\"url_confirmed\" value=\"automatic\">";
 }
-
 
 /* 
  * Create description from problem code:
@@ -208,7 +355,11 @@ switch($problem)
  </head>
  <body>
 
-  <div class="title"><a href="http://www.privoxy.org" target="_blank">Privoxy</a> Action List Feedback - Step 2 of 2</div>
+  <div class="title">
+   <h1>
+     <a href="http://www.privoxy.org" target="_blank">Privoxy</a> Action List Feedback - Step 2 of 2
+   </h1>
+  </div>
 
   <div class="box">
    <b>You are about to report that <?php echo ($problem_description) ?> on
@@ -216,7 +367,7 @@ switch($problem)
   </div>
 
   <div class="box">
-   <form action="<?php echo($base_url); ?>/step3.php" method="post">
+   <form action="step3.php" method="post">
     <p>
      <input type="hidden" name="problem" value="<?php echo ($problem) ?>">
      <input type="hidden" name="referrer_url" value="<?php echo ($referrer_url) ?>">
@@ -227,7 +378,13 @@ switch($problem)
 <?php
 
 /*
- * Create / suppress for elements depending on type of
+ * Include the confirmation for an unretrievable URL if
+ * necessary
+ */
+echo ($url_confirm);
+
+/*
+ * Create / suppress form elements depending on type of
  * problem
  */
 if ($problem != "P1")
@@ -236,36 +393,11 @@ if ($problem != "P1")
 }
 else
 {
-   /*
-    * Extract all image links from page, make them
-    * absolute, and present them (scaled to reasonable size)
-    * in a table for the user to select
-    */
-   preg_match_all('|<img\s+[^>]*?src=[\'"]?(.*?)[\'" >]|i', $page, $matches);
-   $count = count($matches[0]);
+   $image_urls = get_image_urls($page, $referrer_url);
+   $count = count($image_urls);
+
    if ($count > 0)
    {
-      /* 
-       * Base URL ends in slash: don't touch.
-       */
-      if (strpos(strrev($referrer_url), '/') == 0)
-      {
-         $referrer_base = $referrer_url;
-      }
-      /* 
-       * Else grab URL up to last slash as base.
-       */
-      else
-      {
-         $referrer_base = substr($referrer_url, 0, -strpos(strrev($referrer_url), '/'));
-      }
-
-      /* 
-       * Get the protocol + host info for relative links
-       * that start with slash. FIXME: Cut trailing slash off!
-       */
-      $referrer_host = "http://".strrev(strrchr(strrev(substr($referrer_url, 7)), "/"));
-
       /*
        * Open section in <dl>; Open table:
        */
@@ -279,28 +411,13 @@ else
        */
       for ($i=0; $i< $count; $i++)
       {
-         $image_url = $matches[1][$i];
-         /*
-          * Make image URLs absolute:
-          */
-         if (strncmp("http://", $image_url, 7))
-         {
-            if ($image_url{0} == "/")
-            {
-               $image_url = $referrer_host.$image_url;
-            }
-            else
-            {
-               $image_url = $referrer_base.$image_url;
-            }
-         }
+         $image_url = link_to_absolute($referrer_url, $image_urls[$i]);
 
          /*
           * Print the row(s):
           */
          echo ("       <tr>
-                        <td rowspan=2>
+                        <td rowspan=\"2\">
                          <input type=\"checkbox\" name=\"block_image[$i]\" value=\"off\">
                         </td>
                         <td>
@@ -378,7 +495,7 @@ else
      </dd>
 
      <dt>
-      <b>Your Name:</b> <i>(optional)</i>
+      <b>Your Name:</b> <i>(optional, public)</i>
      </dt>
      <dd>
       <p>
@@ -388,12 +505,14 @@ else
 
      <dt>&nbsp;</dt>
      <dd>
-      <input type=submit value="Submit">
+      <input type="submit" value="Submit">
      </dd>
 
     </dl>
    </form>
   </div>
 
+  <p>Valid <a href="http://validator.w3.org/">HTML 4.01 Transitional</a></p>
+
  </body>
 </html>