| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416 | 
							- <?php
 
- //
 
- //Note about the include/exclude hooks.  As an example, this module includes /cart* which essentially secures ALL cart pages with SSL.  But it also implements an exclude which is called /cart Which you would think would negate the include but it DOES NOT.  Even though Excludes take presedence over includes, it still allows /cart/1 for example, to be secured.  Why? Because the exclude is not a wildcard match!  Thus the exclude would NOT match /cart/1 because it's defined as /cart.  Thus while /cart IS excluded (not secured with SSL),/cart/1 is STILL secured.
 
- //Implementation of hook_include_ssl_paths()
 
- //NOTE: Exclude takes presedence over Includes!!!  So if the same path is in both hooks, then the path will be EXCLUDED from secured pages.
 
- //Since base_url has a design flaw in D4/D5/D6/D7 that seemingly will never be fixed, we fix it here.
 
- function uc_ssl_boot()
 
- {
 
-    global $conf;
 
-    
 
-    //the $conf['https'] option MUST be enabled if mixed ssl mode is enabled.  We make sure its enabled here.  If it's not enabled then user
 
-    //sessions will not persist across the secure and non-secure domain names resulting in the user being prompted to log in whenever they are
 
-    //sent to a secure page.
 
-    if (uc_ssl_switch_to_non_ssl() && !isset($conf['https']) || (isset($conf['https']) && !$conf['https']))
 
-    {
 
-       $conf['https'] = TRUE;
 
-    }
 
-    if ($GLOBALS['base_url'])
 
-    {
 
-       //If base_url exists and is set to a non-secure protocol while the page being called is secure, allow base_url to be changed to
 
-       //the secure version of the website.  Drupal for some reason doesnt have this logic anywhere for $base_url.
 
-       if (uc_ssl_page_is_in_https_mode() && stristr($GLOBALS['base_url'], 'http://'))
 
-       {
 
-          $GLOBALS['base_url'] = str_ireplace('http://', 'https://', $GLOBALS['base_url']);
 
-       }
 
-    }
 
- }
 
- function uc_ssl_permission()
 
- {
 
-    $perms = array(
 
-     'administer uc_ssl' => array(
 
-       'title' => t('Administer Ubercart SSL settings'),
 
-     ),
 
-   );
 
-    return $perms;
 
- }
 
- function uc_ssl_page_is_in_https_mode()
 
- {
 
-    if (isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']))
 
-    {
 
-       return TRUE;
 
-    }
 
-    return FALSE;
 
- }
 
- function uc_ssl_disable_overlay_module()
 
- {
 
-    $modules = module_list();
 
-    $base_path = base_path();
 
-    if (variable_get('uc_ssl_switch_to_non_ssl', '') && in_array('overlay', $modules))
 
-    {
 
-       //Overlay is on, lets disable it.
 
-       module_disable(array(0 => 'overlay'));
 
-    }
 
- }
 
- function uc_ssl_init()
 
- {
 
-    //Drupals Overlay panel is not secure!  Fix that here by disable it all together.  We cannot allow this.  Drupal 7 is insecure by default, such a sad thing :/
 
-    uc_ssl_disable_overlay_module();
 
-    //menu_rebuild();
 
-    //First and foremost, make sure Clean URLs are on.
 
-    if (uc_ssl_clean_urls_enabled() && !drupal_is_cli())
 
-    {
 
-       //Setup a hook for ssl checking
 
-       uc_ssl_check();
 
-       //Run ssl check on every page load.
 
-       uc_ssl_run();
 
-   }
 
- }
 
- function uc_ssl_include_ssl_paths()
 
- {
 
-    global $user;
 
-    $paths = array(
 
-     'All Ubercart Cart pages' => '/cart*', //Secure ALL cart pages.
 
-     
 
-     //NOTE:  If you remove the /user definition here, you CAN NOT use Mixed SSL Mode with D7.  It HAS to exist because D7 http sessions are missing
 
-     //data that https sessions require.  But http sessions work with the https session variables.  Thus, you MUST login with https or your sessions
 
-     //will not carry between the http and https versions of your wesite.  This is a D7 bug only,  I believe its more of a feature than a bug.
 
-     'All User pages' => '/user*', //Secure ALL user pages.
 
-     
 
-     //Added support for Drupal commerce which is based upon Ubercart.
 
-     'All Drupal Commerce Checkout pages' => '/checkout*', //Secure ALL cart pages.  NOTE:  SEE EXCLUDES to see why the cart listing itself isnt secured!
 
-     
 
-     //This supports both UC and Commerce admins
 
-     'All Ubercart Cart Admin pages' => '/admin/store*', //Secure ALL UC admin pages.
 
-     #'example 1' => '/cart',  //Only secure the /cart and /cart/ page.
 
-     #'example 2' => 'cart',  //Only secure the /cart and /cart/ page.
 
-     #'example 3' => 'cart/',  //Only secure the /cart and /cart/ page.
 
-     #'example 4' => '/cart*/something',  //matches /cartThis/something and /cart/something but NOT thiscart/something etc.
 
-     #'example 5' => '/cart/*/something', //Matches /cart/123/something and cart/this/something, but NOT /cart/something
 
-     #'example 6' => '/cart/something',  //Only secure the /cart/something and /cart/something/ page.
 
-    );
 
-    return $paths;
 
- }
 
- //Implementation of hook_exclude_ssl_paths()
 
- function uc_ssl_exclude_ssl_paths()
 
- {
 
-    $paths = array(
 
-     //These excludes no longer seem to be required for the D7 version and thus they have been removed until issues come up again.
 
-     //'Exclude the cart page itself' => '/cart', //We dont need to secure the cart contents so we exclude that here
 
-     //'Exclude Autocomplete' => '*autocomplete*',
 
-     //'Exclude Ajax' => '*ajax*',
 
-     #'example 1' => '/cart',  //Only exclude the /cart and /cart/ page.
 
-     #'example 2' => 'cart',  //Only exclude the /cart and /cart/ page.
 
-     #'example 3' => 'cart/',  //Only secure the /cart and /cart/ page.
 
-     #'example 4' => '/cart*/something',  //matches /cartThis/something and /cart/something but NOT thiscart/something etc.
 
-     #'example 5' => '/cart/*/something', //Matches /cart/123/something and cart/this/something, but NOT /cart/something
 
-     #'example 6' => '/cart/something',  //Only exclude the /cart/something and /cart/something/ page.
 
-    );
 
-    return $paths;
 
- }
 
- //Implementation of hook_exclude_ssl_paths()
 
- //This function is so you can completely ignore ANY switching at all no matter what.
 
- function uc_ssl_exclude_ssl_switch_paths()
 
- {
 
-    $paths = array(
 
-     #'example 1' => '/*ajax*',  //Dont touch ajax paths whatsoever,  this is just an example.
 
-    );
 
-    return $paths;
 
- }
 
- function uc_ssl_menu()
 
- {
 
-    $items = array();
 
-    $items['admin/config/system/uc_ssl'] = array(
 
-    'title' => 'Ubercart SSL',
 
-    // 'title' => 'Ubercart SSL module settings',
 
-     'description' => 'Ubercart SSL module settings',
 
-     'page callback' => 'drupal_get_form',
 
-     'page arguments' => array('uc_ssl_admin'),
 
-     'access arguments' => array('administer uc_ssl'),
 
-     'type' => MENU_NORMAL_ITEM,
 
-     'file' => 'uc_ssl.admin.inc',
 
-    );
 
-    return $items;
 
- }
 
- function uc_ssl_enabled()
 
- {
 
-    return variable_get('uc_ssl_status', '');
 
- }
 
- function uc_ssl_is_configured()
 
- {
 
-    $query = "SELECT count(name) AS count from {variable} WHERE name = 'uc_ssl_status'";
 
-    $results = db_query($query);
 
-    $rows = $results->fetchAll();
 
-    $rows = $rows[0];
 
-    //If uc_ssl is not configured, warn the user and show a link to config it.
 
-    if (!$rows->count)
 
-    {
 
-       $admin_link = 'http://'.$_SERVER['HTTP_HOST'].url().'admin/config/system/uc_ssl';
 
-       drupal_set_message("Please configure Ubercart SSL for SSL enabled cart checkouts to work:  <a href = '$admin_link'>$admin_link</a>", 'warning');
 
-    }
 
-    return $rows->count;
 
- }
 
- function uc_ssl_switch_to_non_ssl()
 
- {
 
-    return variable_get('uc_ssl_switch_to_non_ssl', '');
 
- }
 
- function uc_ssl_path_match($path, $pages)
 
- {
 
-    $result = FALSE;  //This is here just to get rid of retarded php 'notice' messages.  I hate php notices.
 
-    if (!empty($pages))
 
-    {
 
-       //Trim off trailing / and then re-add it to avoid double /'s.  This allows cart and cart/ to match as the same thing or cart/1 and cart/1/ to be the same.
 
-       $path = trim($path, '/').'/';
 
-       $regexp = '/^(';
 
-       foreach ($pages AS $key => $regexp_path)
 
-       {
 
-          if ($regexp_path)
 
-          {
 
-             $regexp_path = trim($regexp_path, '/').'/';
 
-             $regexp_path1 = str_replace('/', '\/', $regexp_path); //replace / with a \/ 
 
-             $regexp_path2 = str_replace('*', '.*', $regexp_path1);//replace * with a .*
 
-             $regexp .= $regexp_path2.'|'; //Append a | to signify end of this expression
 
-          }
 
-       }
 
-       $regexp = trim($regexp, '|');
 
-       $regexp .= ')$/';
 
-       if (variable_get('uc_ssl_case_insensitive', 1))
 
-       {
 
-          $regexp .= 'i';
 
-       }
 
-       $result = preg_match($regexp, $path);
 
-    }
 
-    return $result;
 
- }
 
- function is_clean_url($path)
 
- {
 
-    //Skip ANY ?q= urls since these do NOT come from a web browser when clean URLs is on.  Doing this allows us to skip
 
-    //ajax and autocomplete type URLs that come from within drupal itself.  This is a major problem with Secure_Pages module
 
-    //and we dont want the same problems so we restrict people to using ONLY clean URLs.
 
-    if (!stristr($path, '?q='))
 
-    {
 
-       return TRUE;
 
-    }
 
-    return FALSE;
 
- }
 
- function uc_ssl_http_request($url)
 
- {
 
-    //Handle JS type urls in the background as they are likely to be ajax type posts.
 
-    if (arg(0) == 'js')
 
-    {
 
-       $js_response = drupal_http_request($url);
 
-       return;
 
-    }
 
-    //Handle post type URLs.  This should handle ajax POST urls such as the tax calculation/progress bars.
 
-    if ($_SERVER['REQUEST_METHOD'] == 'POST' && empty($_POST['uc_ssl_post']))
 
-    {
 
-       $_POST['uc_ssl_post'] = 1;
 
-       $options['headers'] = array('Content-Type' => 'application/x-www-form-urlencoded');
 
-       $options['method'] = 'POST';
 
-       $options['data'] = http_build_query($_POST, '', '&');
 
-       //Drupal 7 decided to completely recode drupal_http_request so I dont know if this will cause issues or not.  Report any bugs please.
 
-       //$response = drupal_http_request($url, $headers, 'POST', http_build_query($_POST, '', '&'));
 
-       $response = drupal_http_request($url, $options);
 
-       return;
 
-    }
 
-    //All other types of urls are handled normally.
 
-    // Reset destination variables or we'll get sent there instead of to $url
 
-    unset($_REQUEST['destination'], $_GET['destination']);
 
-    drupal_goto($url);
 
-    return;
 
- }
 
- function uc_ssl_run()
 
- {
 
-    //Set the current path without url() since it will mess up regex checks.  Using url() also supports languages, base_path does not.
 
-    //$current_path = trim($_SERVER['REQUEST_URI'], url());
 
-    $root = url();
 
-    $current_path = substr(trim($_SERVER['REQUEST_URI']),strlen($root)); 
 
-    $ssl_domain = variable_get('uc_ssl_ssl_domain', '');
 
-    $nonssl_domain = variable_get('uc_ssl_non_ssl_domain', '');
 
-    //If uc_ssl is configured, run it.
 
-    if (uc_ssl_is_configured() && is_clean_url($current_path))
 
-    {
 
-       if (uc_ssl_enabled())
 
-       {
 
-          //Get a list of all the URL links that should be included and excluded from SSL pages from other modules.
 
-          $items = array();
 
-          $exclude_secured_urls = array();
 
-          $exclude_secured_urls = module_invoke('uc_ssl', 'exclude_ssl_paths', $exclude_secured_urls);
 
-          foreach (module_implements('exclude_ssl_paths') as $module) 
 
-          {
 
-             $new = module_invoke($module, 'exclude_ssl_paths', $exclude_secured_urls);
 
-             if ($module != 'uc_ssl') //Skip uc_ssl since we already processed it above.  Allow external modules to change uc_ssl defaults.
 
-             {
 
-                if (is_array($new))
 
-                {
 
-                   $exclude_secured_urls = array_merge($exclude_secured_urls, $new);
 
-                }
 
-             }
 
-          }
 
-          $include_secured_urls = array();
 
-          $include_secured_urls = module_invoke('uc_ssl', 'include_ssl_paths', $include_secured_urls);
 
-          foreach (module_implements('include_ssl_paths') as $module) 
 
-          {
 
-             $new = module_invoke($module, 'include_ssl_paths', $include_secured_urls);
 
-             if ($module != 'uc_ssl') //Skip uc_ssl since we already processed it above.  Allow external modules to change uc_ssl defaults.
 
-             {
 
-                if (is_array($new))
 
-                {
 
-                   $include_secured_urls = array_merge($include_secured_urls, $new);
 
-                }
 
-             }
 
-          }
 
-          
 
-          // Get a list of all the URL links that should not switch between HTTP/HTTPS at all.
 
-          $exclude_switch_urls = array();
 
-          $exclude_switch_urls = module_invoke('uc_ssl', 'exclude_ssl_switch_paths', $exclude_switch_urls);
 
-          foreach (module_implements('exclude_ssl_switch_paths') as $module)
 
-          {
 
-            $new = module_invoke($module, 'exclude_ssl_switch_paths', $exclude_switch_urls);
 
-            if ($module != 'uc_ssl') //Skip uc_ssl since we already processed it above.  Allow external modules to change uc_ssl defaults.
 
-            {
 
-               if (is_array($new))
 
-               {
 
-                  $exclude_switch_urls = array_merge($exclude_switch_urls, $new);
 
-               }
 
-            }
 
-          }
 
-          // make sure we return an array
 
-          if (! is_array($include_secured_urls)) { $include_secured_urls = array(); }
 
-          if (! is_array($exclude_secured_urls)) { $exclude_secured_urls = array(); }
 
-          if (! is_array($exclude_switch_urls))  { $exclude_switch_urls  = array(); }
 
-          
 
-          //If the path is in the exclude switch hook, dont do ANYTHING at all.
 
-          if (uc_ssl_path_match($current_path, $exclude_switch_urls)) 
 
-          {
 
-               return;
 
-          }
 
-          
 
-          //Switch to SSL no matter what the link is if Switch isnt on.
 
-          if (!uc_ssl_switch_to_non_ssl())
 
-          {
 
-             if (!uc_ssl_page_is_in_https_mode() && !uc_ssl_path_match($current_path, $exclude_secured_urls))
 
-             {
 
-                uc_ssl_http_request($ssl_domain . $_SERVER['REQUEST_URI']);
 
-             }
 
-          }
 
-          else
 
-          {
 
-             //If uc_ssl_switch_to_non_ssl() is enabled then we switch back to non-ssl link for non-cart links.
 
-             if (uc_ssl_page_is_in_https_mode())
 
-             {
 
-                //The only exceptions are the links listed in the exclude list by other modules.
 
-                if (uc_ssl_path_match($current_path, $exclude_secured_urls))
 
-                {
 
-                   uc_ssl_http_request($nonssl_domain . $_SERVER['REQUEST_URI']);
 
-                }
 
-                if (!uc_ssl_path_match($current_path, $include_secured_urls) && uc_ssl_switch_to_non_ssl())
 
-                {
 
-                   uc_ssl_http_request($nonssl_domain . $_SERVER['REQUEST_URI']);
 
-                }
 
-             }
 
-          }
 
-          //If on a cart url, use HTTPS and re-post/re-direct to the SSL version of the url.
 
-          if (!uc_ssl_page_is_in_https_mode() && uc_ssl_path_match($current_path, $include_secured_urls) && !uc_ssl_path_match($current_path, $exclude_secured_urls))
 
-          {
 
-             uc_ssl_http_request($ssl_domain . $_SERVER['REQUEST_URI']);
 
-          }
 
-       }
 
-    }
 
- }
 
- function uc_ssl_clean_urls_enabled()
 
- {
 
-    $check = variable_get('clean_url', 0);
 
-    if ($check == 1)
 
-    {
 
-       return TRUE;
 
-    }
 
-    drupal_set_message('Ubercart SSL (uc_ssl):  The uc_ssl module REQUIRES that Clean URLs be enabled in order to work properly.  This allows the module to distinguish between an Ajax call and a Web browser call as the two are handled differently so we need a way to distinguish them and this is the quickest easiest way to do so.  This will also make your website URLs search engine friendly as well which is a good thing.  Please enable clean urls here: <a href="?q=admin/settings/clean-urls">Clean URLs</a>', 'warn');
 
-    return FALSE;
 
- }
 
- //This is a quickie hook to see if SSL works or not.  It's not fool proof but it works for me.
 
- function uc_ssl_check($site = '')
 
- {
 
-    error_reporting(E_ALL);
 
-    if (!$site)
 
-    {
 
-       if (isset($_GET['uc_ssl_check']) && $_GET['uc_ssl_check'])
 
-       {
 
-          if (uc_ssl_page_is_in_https_mode())
 
-          {
 
-             echo TRUE;
 
-          }
 
-          else
 
-          {
 
-             echo FALSE;
 
-          }
 
-          exit;
 
-       }
 
-    }
 
-    else
 
-    {
 
-       $check = drupal_http_request($site."?uc_ssl_check=1");
 
-       if (isset($check->data) && $check->data == '1')
 
-       {
 
-          return TRUE;
 
-       }
 
-       //IF we are here, then the request failed for some reason, so we try to use a different method.
 
-       if (ini_get('allow_url_fopen'))
 
-       {
 
-          if (file_get_contents($site."?uc_ssl_check=1") == '1')
 
-          {
 
-             return TRUE;
 
-          }
 
-       }
 
-       //If we are here, something went wrong.  Give the user some ideas on what they need to fix.
 
-       drupal_set_message("Ubercart SSL (uc_ssl):  The uc_ssl_check() function is returning FALSE because it was unable to contact the SSL (https) version of your website that you defined in the settings.  This can be caused by 3 things.  1. Your website is not setup properly for SSL,  2.  The OpenSSL extension is not enabled on in your PHP installation,  3.  allow_url_fopen is not enabled in php.ini.  If #2 fails, uc_ssl will try to use file_get_contents() which requires allow_url_fopen to be set to TRUE in php.ini.  Hopefully these hints will help you fix this issue so that you can use uc_ssl.  You can try to debug this by going to $site?uc_ssl_check=1", "error");
 
-    }
 
-    return FALSE;
 
- }
 
- if (!function_exists('printr'))
 
- {
 
-    function printr($arr)
 
-    {
 
-       echo "<pre>";
 
-       print_r($arr);
 
-       echo "</pre>";
 
-    }
 
- }
 
 
  |