File: 0015-wuth03-HTTP_Basic_Authentication.patch

package info (click to toggle)
libwww-mediawiki-client-perl 0.31-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,132 kB
  • sloc: perl: 1,672; makefile: 14
file content (182 lines) | stat: -rw-r--r-- 6,358 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
Author: Brett Wuth <wuth@castrov.cuug.ab.ca>
Last-Update: 2013-07-09
Bug-Debian: https://bugs.debian.org/715420
Description: support login with Basic HTTP Authentication

--- a/lib/WWW/Mediawiki/Client.pm
+++ b/lib/WWW/Mediawiki/Client.pm
@@ -271,6 +271,10 @@ use constant REMEMBER_NAME      => 'wpRe
 use constant LOGIN_SUBMIT_NAME  => 'wpLoginattempt';
 use constant LOGIN_SUBMIT_VALUE => 'Log In';
 use constant LOGIN_TOKEN        => 'wpLoginToken';
+use constant HTTP_AUTHORIZATION_NAME    => 'Authorization';
+use constant HTTP_AUTHORIZATION_NONE    => 'none';
+use constant HTTP_AUTHORIZATION_BASIC   => 'Basic';
+use constant HTTP_AUTHORIZATION_DEFAULT => HTTP_AUTHORIZATION_NONE;
 
 =head2 Files
 
@@ -292,7 +296,7 @@ use constant CONFIG_FILE => './.mediawik
 use constant COOKIE_FILE => '.mediawiki_cookies.dat';
 use constant SAVED_ATTRIBUTES => (
     qw(site_url host protocol language_code space_substitute username
-       password wiki_path watch encoding minor_edit escape_filenames)
+       password http_authorization_method wiki_path watch encoding minor_edit escape_filenames)
 );  # It's important that host goes first since it has side effects
 
 
@@ -314,12 +318,12 @@ sub new {
     my $pkg = shift;
     my %init = @_;
     my $self = bless {};
+    $self->{ua} = LWP::UserAgent->new();
     $self->load_state;
     foreach my $attr (SAVED_ATTRIBUTES) {
         next unless $init{$attr};
         $self->$attr($init{$attr});
     }
-    $self->{ua} = LWP::UserAgent->new();
     push @{ $self->{ua}->requests_redirectable }, 'POST';
     my $agent = 'WWW::Mediawiki::Client/' . $VERSION;
     $self->{ua}->agent($agent);
@@ -554,7 +558,10 @@ user.
 
 sub username {
     my ($self, $username) = @_;
-    $self->{username} = $username if $username;
+    if ($username) {
+      $self->{username} = $username;
+      $self->use_http_authorization_method;
+    }
     return $self->{username};
 }
 
@@ -570,10 +577,82 @@ good idea to use an important one.
 
 sub password {
     my ($self, $password) = @_;
-    $self->{password} = $password if $password;
+    if ($password) {
+      $self->{password} = $password;
+      $self->use_http_authorization_method;
+    }
     return $self->{password};
 }
 
+
+=head2 http_authorization_method
+
+  my $method = $mvs->http_authorization_method($method);
+
+The method used for HTTP access to the web server.
+
+= over
+= item 'none'
+
+(Default) Indicates that the server does not use HTTP Authorization.
+Most mediawiki's web servers use this value, which is to say that
+access to the mediawiki software is available to any client, even if
+the mediawiki software itself may further limit privileges.
+
+= item 'Basic'
+
+Use Basic HTTP Authorization.  A mediawiki web server which is set up
+to use this option, will not allow the client to talk to the mediawiki
+software unless the username and password is included in the request.
+The mediawiki software might require an additional log in using the
+same information, or it might take the credentials from the web server
+using, e.g. http://www.mediawiki.org/wiki/Extension:AutomaticREMOTE_USER
+
+Basic HTTP Authorization is considered insecure unless used over a
+secure channel such as https.
+
+=back
+
+B<Throws:>
+
+=over
+
+=item WWW::Mediawiki::Client::URLConstructionException
+
+=back
+
+=cut
+
+sub http_authorization_method {
+  my ($self, $method) = @_;
+  if ($method) {
+    WWW::Mediawiki::Client::AuthException->throw( "Unsupported method: $method" )
+	unless $method eq HTTP_AUTHORIZATION_NONE or $method eq HTTP_AUTHORIZATION_BASIC;
+    $self->{http_authorization_method} = $method;
+    $self->use_http_authorization_method;
+  }
+  $self->{http_authorization_method} = HTTP_AUTHORIZATION_DEFAULT
+    unless $self->{http_authorization_method};
+  return $self->{http_authorization_method};
+}
+
+sub use_http_authorization_method {
+  require MIME::Base64;
+  my $self = shift;
+
+  my $headers = $self->{ua}->default_headers;
+  my $header_name = HTTP_AUTHORIZATION_NAME;
+  my $method = $self->http_authorization_method;
+  if ($method eq HTTP_AUTHORIZATION_NONE) {
+    $headers->remove_header( $header_name );
+  } else {
+    $headers->header( $header_name =>
+		      "$method " .
+		      MIME::Base64::encode($self->username . ':' . $self->password, '') );
+  }
+}
+
+
 =head2 commit_message
 
   my $msg = $mvs->commit_message($msg);
--- a/bin/mvs
+++ b/bin/mvs
@@ -13,7 +13,7 @@ use Data::Dumper;
 # Options:
 our (
 	$opt_help, $opt_verbose, $opt_defaults,
-	$opt_host, $opt_lang, $opt_username, $opt_password, 
+	$opt_host, $opt_lang, $opt_username, $opt_password, $opt_basic_http_authorization,
         $opt_version, $opt_wiki_path, $opt_space_sub,
 	$opt_message, $opt_watch, $opt_minor, $opt_tls
 );
@@ -67,6 +67,7 @@ sub main {
     $wmc->language_code($opt_lang) if $opt_lang;
     $wmc->username($opt_username) if $opt_username;
     $wmc->password($opt_password) if $opt_password;
+    $wmc->http_authorization_method( 'Basic' ) if $opt_basic_http_authorization;
     $wmc->space_substitute($opt_space_sub) if $opt_space_sub;
     $wmc->wiki_path($opt_wiki_path) if $opt_wiki_path;
     $wmc->minor_edit($opt_minor) if defined($opt_minor);
@@ -190,6 +191,7 @@ sub parse_options {
 		'lang|l=s'	=> \$opt_lang,
 		'username|u=s'	=> \$opt_username,
 		'password|p=s'	=> \$opt_password,
+		'basic_http_authorization|b' => \$opt_basic_http_authorization,
 		'wikipath|w=s'	=> \$opt_wiki_path,
 		'spaces|S=s'	=> \$opt_space_sub,
 	) if $command eq 'login';
@@ -239,7 +241,7 @@ mvs - A command line Mediawiki client
   mkdir wikistuff
   cd wikistuff
 
-  mvs login [-q|-v] [-T] [-d <wikihost>] [-l language_code ] [-u <username>] [-p <password> ] [-w <wiki_path>] 
+  mvs login [-q|-v] [-T] [-d <wikihost>] [-l language_code ] [-u <username>] [-p <password> ] [-b] [-w <wiki_path>]
 
   mvs update [-q|-v] [<file> ..]
   mvs up [[-q|-v] <file> ..]
@@ -319,6 +321,8 @@ specify a C<language_code>:
 The code must match the one which your wiki host uses for a given language,
 and of course the language version must exist for the given host.
 
+If the wiki requires Basic HTTP Authentication, use -b.
+
 If your Mediawiki install uses a nonstandard path to the wiki script you
 can specify it on login.  The path to the wiki script is the part of the
 URL after the host name, and before the '?':