]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Patch for bug 260682: Support redirecting to HTTPS always or for authenticated sessio...
authorjocuri%softhome.net <>
Sun, 16 Jan 2005 21:09:56 +0000 (21:09 +0000)
committerjocuri%softhome.net <>
Sun, 16 Jan 2005 21:09:56 +0000 (21:09 +0000)
Bugzilla/Auth/Login/WWW.pm
Bugzilla/Auth/Login/WWW/CGI.pm
Bugzilla/CGI.pm
defparams.pl

index 8b7724befc2446b9fc35a251a4caa008e26cfb84..cc3ae25e291caa494911e3cec26c81d3ac8cda03 100644 (file)
@@ -70,6 +70,11 @@ sub login {
     if ($userid) {
         $user = new Bugzilla::User($userid);
 
+        # Redirect to SSL if required
+        if (Param('sslbase') ne '' and Param('ssl') ne 'never') {
+            Bugzilla->cgi->require_https(Param('sslbase'));
+        }
+
         $user->set_flags('can_logout' => $class->can_logout);
 
         # Compat stuff
index a66ce7425b5bc6814bd353585e98ea27d755d2e1..10eb85f60ec901c8962fb6d63ceba4a926756deb 100644 (file)
@@ -135,6 +135,12 @@ sub login {
     # No login details were given, but we require a login if the
     # page does
     if ($authres == AUTH_NODATA && $type == LOGIN_REQUIRED) {
+
+        # Redirect to SSL if required
+        if (Param('sslbase') ne '' and Param('ssl') ne 'never') {
+            $cgi->require_https(Param('sslbase'));
+        }
+    
         # Throw up the login page
 
         print Bugzilla->cgi->header();
index e81cf5da8ce29007558f9cfdc71fbeeafb6d1c6e..ce0a8ab6c941d7a2fb83fc7bd5b0bb8287dd4532 100644 (file)
@@ -52,6 +52,11 @@ sub new {
     # Make sure that we don't send any charset headers
     $self->charset('');
 
+    # Redirect to SSL if required
+    if (Param('sslbase') ne '' and Param('ssl') eq 'always') {
+        $self->require_https(Param('sslbase'));
+    }
+
     # Check for errors
     # All of the Bugzilla code wants to do this, so do it here instead of
     # in each script
@@ -185,6 +190,21 @@ sub send_cookie {
     return;
 }
 
+# Redirect to https if required
+sub require_https {
+    my $self = shift;
+    if ($self->protocol ne 'https') {
+        my $url = shift;
+        if (defined $url) {
+            $url .= $self->url('-path_info' => 1, '-query' => 1, '-relative' => 1);
+        } else {
+            $url = $self->self_url;
+            $url =~ s/^http:/https:/i;
+        }
+        print $self->redirect(-location => $url);
+        exit;
+    }
+}
 
 1;
 
@@ -238,6 +258,14 @@ Bugzilla code (instead of C<cookie> or the C<-cookie> argument to C<header>),
 so that under mod_perl the headers can be sent correctly, using C<print> or
 the mod_perl APIs as appropriate.
 
+=item C<require_https($baseurl)>
+
+This routine checks if the current page is being served over https, and
+redirects to the https protocol if required, retaining QUERY_STRING.
+
+It takes an option argument which will be used as the base URL.  If $baseurl
+is not provided, the current URL is used.
+
 =back
 
 =head1 SEE ALSO
index 4fdf52a608e16e45bc1543c06597292e6c9c3f6e..d97a0908559778f24747e60f4e4afe7849feb612 100644 (file)
 use strict;
 use vars qw(@param_list);
 use File::Spec; # for find_languages
+use Socket;
 
 use Bugzilla::Config qw(:DEFAULT $templatedir $webdotdir);
+use Bugzilla::Util;
 
 # Checking functions for the various values
 # Some generic checking functions are included in Bugzilla::Config
 
+sub check_sslbase {
+    my $url = shift;
+    if ($url ne '') {
+        if ($url !~ m#^https://([^/]+).*/$#) {
+            return "must be a legal URL, that starts with https and ends with a slash.";
+        }
+        my $host = $1;
+        if ($host =~ /:\d+$/) {
+            return "must not contain a port.";
+        }
+        local *SOCK;
+        my $proto = getprotobyname('tcp');
+        socket(SOCK, PF_INET, SOCK_STREAM, $proto);
+        my $sin = sockaddr_in(443, inet_aton($host));
+        if (!connect(SOCK, $sin)) {
+            return "Failed to connect to " . html_quote($host) . 
+                   ":443, unable to enable SSL.";
+        }
+    }
+    return "";
+}
+
 sub check_priority {
     my ($value) = (@_);
     &::GetVersionTable();
@@ -292,6 +316,24 @@ sub find_languages {
    checker => \&check_urlbase
   },
 
+  {
+   name => 'sslbase',
+   desc => 'The URL that is the common initial leading part of all HTTPS ' .
+           '(SSL) Bugzilla URLs.',
+   type => 't',
+   default => '',
+   checker => \&check_sslbase
+  },
+
+  {
+   name => 'ssl',
+   desc => 'Controls when Bugzilla should enforce sessions to use HTTPS by ' .
+           'using <tt>sslbase</tt>.',
+   type => 's',
+   choices => ['never', 'authenticated sessions', 'always'],
+   default => 'never'
+  },
+
   {
    name => 'languages' ,
    desc => 'A comma-separated list of RFC 1766 language tags. These ' .