mediawiki-gateway 0.3.5 → 0.3.6

Sign up to get free protection for your applications and to get access to all the features.
data/doc/created.rid CHANGED
@@ -1 +1 @@
1
- Mon, 07 Feb 2011 12:14:29 +1100
1
+ Mon, 28 Mar 2011 12:16:13 +1100
@@ -56,7 +56,7 @@
56
56
  </tr>
57
57
  <tr class="top-aligned-row">
58
58
  <td><strong>Last Update:</strong></td>
59
- <td>Mon Feb 07 12:13:27 +1100 2011</td>
59
+ <td>Mon Feb 07 14:36:34 +1100 2011</td>
60
60
  </tr>
61
61
  </table>
62
62
  </div>
@@ -56,7 +56,7 @@
56
56
  </tr>
57
57
  <tr class="top-aligned-row">
58
58
  <td><strong>Last Update:</strong></td>
59
- <td>Tue Jan 25 13:42:08 +1100 2011</td>
59
+ <td>Mon Mar 28 12:14:25 +1100 2011</td>
60
60
  </tr>
61
61
  </table>
62
62
  </div>
@@ -20,39 +20,41 @@
20
20
  <div id="index">
21
21
  <h1 class="section-bar">Methods</h1>
22
22
  <div id="index-entries">
23
- <a href="classes/MediaWiki/Config.html#M000034">abort (MediaWiki::Config)</a><br />
24
- <a href="classes/MediaWiki/Gateway.html#M000016">backlinks (MediaWiki::Gateway)</a><br />
25
- <a href="classes/MediaWiki/Gateway.html#M000011">create (MediaWiki::Gateway)</a><br />
26
- <a href="classes/MediaWiki/Gateway.html#M000013">delete (MediaWiki::Gateway)</a><br />
27
- <a href="classes/MediaWiki/Gateway.html#M000021">download (MediaWiki::Gateway)</a><br />
28
- <a href="classes/MediaWiki/Gateway.html#M000023">export (MediaWiki::Gateway)</a><br />
29
- <a href="classes/MediaWiki/Gateway.html#M000025">extensions (MediaWiki::Gateway)</a><br />
30
- <a href="classes/MediaWiki/Gateway.html#M000009">get (MediaWiki::Gateway)</a><br />
23
+ <a href="classes/MediaWiki/Config.html#M000036">abort (MediaWiki::Config)</a><br />
24
+ <a href="classes/MediaWiki/Gateway.html#M000018">backlinks (MediaWiki::Gateway)</a><br />
25
+ <a href="classes/MediaWiki/Gateway.html#M000012">create (MediaWiki::Gateway)</a><br />
26
+ <a href="classes/MediaWiki/Gateway.html#M000015">delete (MediaWiki::Gateway)</a><br />
27
+ <a href="classes/MediaWiki/Gateway.html#M000023">download (MediaWiki::Gateway)</a><br />
28
+ <a href="classes/MediaWiki/Gateway.html#M000013">edit (MediaWiki::Gateway)</a><br />
29
+ <a href="classes/MediaWiki/Gateway.html#M000025">export (MediaWiki::Gateway)</a><br />
30
+ <a href="classes/MediaWiki/Gateway.html#M000027">extensions (MediaWiki::Gateway)</a><br />
31
+ <a href="classes/MediaWiki/Gateway.html#M000010">get (MediaWiki::Gateway)</a><br />
31
32
  <a href="classes/MediaWiki.html#M000001">get_base_name (MediaWiki)</a><br />
32
33
  <a href="classes/MediaWiki.html#M000002">get_path_to_subpage (MediaWiki)</a><br />
33
- <a href="classes/MediaWiki/Gateway.html#M000030">get_response (MediaWiki::Gateway)</a><br />
34
+ <a href="classes/MediaWiki/Gateway.html#M000032">get_response (MediaWiki::Gateway)</a><br />
34
35
  <a href="classes/MediaWiki.html#M000003">get_subpage (MediaWiki)</a><br />
35
- <a href="classes/MediaWiki/Gateway.html#M000027">get_token (MediaWiki::Gateway)</a><br />
36
- <a href="classes/MediaWiki/Gateway.html#M000028">get_undelete_token (MediaWiki::Gateway)</a><br />
37
- <a href="classes/MediaWiki/Gateway.html#M000020">image_info (MediaWiki::Gateway)</a><br />
38
- <a href="classes/MediaWiki/Gateway.html#M000022">import (MediaWiki::Gateway)</a><br />
39
- <a href="classes/MediaWiki/Gateway.html#M000015">list (MediaWiki::Gateway)</a><br />
40
- <a href="classes/MediaWiki/Gateway.html#M000008">login (MediaWiki::Gateway)</a><br />
41
- <a href="classes/MediaWiki/Gateway.html#M000029">make_api_request (MediaWiki::Gateway)</a><br />
42
- <a href="classes/MediaWiki/Gateway.html#M000012">move (MediaWiki::Gateway)</a><br />
43
- <a href="classes/MediaWiki/Gateway.html#M000024">namespaces_by_prefix (MediaWiki::Gateway)</a><br />
44
- <a href="classes/MediaWiki/Config.html#M000033">new (MediaWiki::Config)</a><br />
45
- <a href="classes/MediaWiki/Gateway.html#M000007">new (MediaWiki::Gateway)</a><br />
46
- <a href="classes/MediaWiki/Gateway.html#M000019">redirect? (MediaWiki::Gateway)</a><br />
47
- <a href="classes/MediaWiki/Gateway.html#M000010">render (MediaWiki::Gateway)</a><br />
48
- <a href="classes/MediaWiki/Gateway.html#M000017">search (MediaWiki::Gateway)</a><br />
49
- <a href="classes/MediaWiki/Gateway.html#M000026">semantic_query (MediaWiki::Gateway)</a><br />
50
- <a href="classes/MediaWiki/Gateway.html#M000014">undelete (MediaWiki::Gateway)</a><br />
51
- <a href="classes/MediaWiki/Gateway.html#M000018">upload (MediaWiki::Gateway)</a><br />
36
+ <a href="classes/MediaWiki/Gateway.html#M000029">get_token (MediaWiki::Gateway)</a><br />
37
+ <a href="classes/MediaWiki/Gateway.html#M000030">get_undelete_token (MediaWiki::Gateway)</a><br />
38
+ <a href="classes/MediaWiki/Gateway.html#M000022">image_info (MediaWiki::Gateway)</a><br />
39
+ <a href="classes/MediaWiki/Gateway.html#M000024">import (MediaWiki::Gateway)</a><br />
40
+ <a href="classes/MediaWiki/Gateway.html#M000017">list (MediaWiki::Gateway)</a><br />
41
+ <a href="classes/MediaWiki/Gateway.html#M000009">login (MediaWiki::Gateway)</a><br />
42
+ <a href="classes/MediaWiki/Gateway.html#M000031">make_api_request (MediaWiki::Gateway)</a><br />
43
+ <a href="classes/MediaWiki/Gateway.html#M000014">move (MediaWiki::Gateway)</a><br />
44
+ <a href="classes/MediaWiki/Gateway.html#M000026">namespaces_by_prefix (MediaWiki::Gateway)</a><br />
45
+ <a href="classes/MediaWiki/Gateway.html#M000008">new (MediaWiki::Gateway)</a><br />
46
+ <a href="classes/MediaWiki/Config.html#M000035">new (MediaWiki::Config)</a><br />
47
+ <a href="classes/MediaWiki/Gateway.html#M000021">redirect? (MediaWiki::Gateway)</a><br />
48
+ <a href="classes/MediaWiki/Gateway.html#M000011">render (MediaWiki::Gateway)</a><br />
49
+ <a href="classes/MediaWiki/Gateway.html#M000019">search (MediaWiki::Gateway)</a><br />
50
+ <a href="classes/MediaWiki/Gateway.html#M000028">semantic_query (MediaWiki::Gateway)</a><br />
51
+ <a href="classes/MediaWiki/Gateway.html#M000016">undelete (MediaWiki::Gateway)</a><br />
52
+ <a href="classes/MediaWiki.html#M000007">upcase_first_char (MediaWiki)</a><br />
53
+ <a href="classes/MediaWiki/Gateway.html#M000020">upload (MediaWiki::Gateway)</a><br />
52
54
  <a href="classes/MediaWiki.html#M000004">uri_to_wiki (MediaWiki)</a><br />
53
- <a href="classes/MediaWiki/Gateway.html#M000031">valid_page? (MediaWiki::Gateway)</a><br />
55
+ <a href="classes/MediaWiki/Gateway.html#M000033">valid_page? (MediaWiki::Gateway)</a><br />
54
56
  <a href="classes/MediaWiki.html#M000006">version (MediaWiki)</a><br />
55
- <a href="classes/MediaWiki/Gateway.html#M000032">warning (MediaWiki::Gateway)</a><br />
57
+ <a href="classes/MediaWiki/Gateway.html#M000034">warning (MediaWiki::Gateway)</a><br />
56
58
  <a href="classes/MediaWiki.html#M000005">wiki_to_uri (MediaWiki)</a><br />
57
59
  </div>
58
60
  </div>
data/lib/media_wiki.rb CHANGED
@@ -3,5 +3,5 @@ require File.dirname(__FILE__) + '/media_wiki/utils'
3
3
  require File.dirname(__FILE__) + '/media_wiki/gateway'
4
4
 
5
5
  module MediaWiki
6
- VERSION = "0.3.5"
6
+ VERSION = "0.3.6"
7
7
  end
@@ -37,7 +37,7 @@ module MediaWiki
37
37
  @cookies = {}
38
38
  end
39
39
 
40
- attr_reader :base_url
40
+ attr_reader :base_url, :cookies
41
41
 
42
42
  # Login to MediaWiki
43
43
  #
@@ -459,6 +459,16 @@ module MediaWiki
459
459
  xml, dummy = make_api_request(form_data)
460
460
  return xml.elements["parse/text"].text
461
461
  end
462
+
463
+ # Set groups for a user
464
+ #
465
+ # [user] Username of user to modify
466
+ # [groups_to_add] Groups to add user to, as an array or a string if a single group (optional)
467
+ # [groups_to_remove] Groups to remove user from, as an array or a string if a single group (optional)
468
+ def set_groups(user, groups_to_add = [], groups_to_remove = [], comment = '')
469
+ token = get_userrights_token(user)
470
+ userrights(user, token, groups_to_add, groups_to_remove, comment)
471
+ end
462
472
 
463
473
  private
464
474
 
@@ -483,6 +493,42 @@ module MediaWiki
483
493
  end
484
494
  end
485
495
 
496
+ # User rights management (aka group assignment)
497
+ def get_userrights_token(user)
498
+ form_data = {'action' => 'query', 'list' => 'users', 'ustoken' => 'userrights', 'ususers' => user}
499
+ res, dummy = make_api_request(form_data)
500
+ token = res.elements["query/users/user"].attributes["userrightstoken"]
501
+
502
+ @log.debug("RESPONSE: #{res.to_s}")
503
+ if token.nil?
504
+ if res.elements["query/users/user"].attributes["missing"]
505
+ raise "User '#{user}' was not found (get_userrights_token)"
506
+ else
507
+ raise "User '#{@username}' is not permitted to perform this operation: get_userrights_token"
508
+ end
509
+ end
510
+
511
+ token
512
+ end
513
+
514
+ def userrights(user, token, groups_to_add, groups_to_remove, reason)
515
+ # groups_to_add and groups_to_remove can be a string or an array. Turn them into MediaWiki's pipe-delimited list format.
516
+ if groups_to_add.is_a? Array
517
+ groups_to_add = groups_to_add.join('|')
518
+ end
519
+ if groups_to_remove.is_a? Array
520
+ groups_to_remove = groups_to_remove.join('|')
521
+ end
522
+
523
+ form_data = {'action' => 'userrights', 'user' => user, 'token' => token,
524
+ 'add' => groups_to_add,
525
+ 'remove' => groups_to_remove,
526
+ 'reason' => reason
527
+ }
528
+ res, dummy = make_api_request(form_data)
529
+ res
530
+ end
531
+
486
532
  # Make generic request to API
487
533
  #
488
534
  # [form_data] hash or string of attributes to post
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{mediawiki-gateway}
8
- s.version = "0.3.5"
8
+ s.version = "0.3.6"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Jani Patokallio"]
12
- s.date = %q{2011-03-28}
12
+ s.date = %q{2011-03-30}
13
13
  s.description = %q{}
14
14
  s.email = %q{jpatokal@iki.fi}
15
15
  s.extra_rdoc_files = [
@@ -108,6 +108,7 @@ module FakeMediaWiki
108
108
  end
109
109
  alias_method :deletetoken, :importtoken
110
110
  alias_method :undeletetoken, :importtoken
111
+ alias_method :userrightstoken, :importtoken
111
112
 
112
113
  def edittoken
113
114
  if @user
@@ -252,6 +252,27 @@ module FakeMediaWiki
252
252
  end
253
253
  end
254
254
 
255
+ def get_userrights_token(username)
256
+ @token.set_type 'userrights'
257
+ token_str = @token.request(user)
258
+
259
+ user_to_manage = @users[username]
260
+
261
+ if user_to_manage
262
+ api_response do |_|
263
+ _.query do
264
+ _.users do
265
+ _.user(nil, { :name => user_to_manage[:username], :userrightstoken => token_str })
266
+ end
267
+ end
268
+ end
269
+ else
270
+ api_response do |_|
271
+ _.error(nil, { :code => 'nosuchuser', :info => "The user '#{params[:ususer].to_s}' does not exist"} )
272
+ end
273
+ end
274
+ end
275
+
255
276
  def login
256
277
  user = @users[params[:lgname]]
257
278
  if user and user[:domain] == params[:lgdomain]
@@ -271,6 +292,23 @@ module FakeMediaWiki
271
292
  end
272
293
  end
273
294
 
295
+ def userrights
296
+ api_response do |_|
297
+ _.userrights({:user => params[:user]}) do
298
+ _.removed do
299
+ params[:remove].split('|').each do |removed_group|
300
+ _.group(removed_group)
301
+ end
302
+ end
303
+ _.added do
304
+ params[:add].split('|').each do |added_group|
305
+ _.group(added_group)
306
+ end
307
+ end
308
+ end
309
+ end
310
+ end
311
+
274
312
  end
275
313
 
276
314
  class WikiPage
@@ -3,6 +3,13 @@ module FakeMediaWiki
3
3
 
4
4
  module QueryHandling
5
5
 
6
+ def action
7
+ [:userrights].each do |action_type|
8
+ return send(action_type)
9
+ end
10
+ halt(404, "Page not found")
11
+ end
12
+
6
13
  def query
7
14
  [:prop, :export, :list, :meta].each do |query_type|
8
15
  return send(query_type) if params[query_type]
@@ -37,6 +44,14 @@ module FakeMediaWiki
37
44
 
38
45
  def list
39
46
  list_type = params[:list].to_sym
47
+
48
+ # api.php?action=query&list=users&ususers=Bob&ustoken=userrights
49
+ if list_type == :users && params[:ustoken] && params[:ususers]
50
+ # This "list" is actually a request for a user rights token
51
+ return get_userrights_token(params[:ususers])
52
+ end
53
+
54
+ # This is a real list
40
55
  return send(list_type) if respond_to?(list_type)
41
56
  halt(404, "Page not found")
42
57
  end
@@ -108,6 +123,7 @@ module FakeMediaWiki
108
123
  end
109
124
  end
110
125
  end
126
+
111
127
  end
112
128
 
113
129
  end
data/spec/gateway_spec.rb CHANGED
@@ -144,7 +144,7 @@ describe MediaWiki::Gateway do
144
144
  end
145
145
 
146
146
  end
147
-
147
+
148
148
  end
149
149
 
150
150
  end
@@ -733,5 +733,64 @@ describe MediaWiki::Gateway do
733
733
  form_data['createonly'] = "" unless options[:overwrite]
734
734
  @gateway.send(:make_api_request, form_data)
735
735
  end
736
+
737
+ describe "#user_rights" do
738
+
739
+ describe "when logged in as admin" do
740
+ before do
741
+ @gateway.login("atlasmw", "wombat")
742
+ end
743
+
744
+ describe "requesting a userrights token for an existing user" do
745
+
746
+ before do
747
+ @token = @gateway.send(:get_userrights_token, 'nonadmin')
748
+ end
749
+
750
+ it "should return a token" do
751
+ @token.should_not == nil
752
+ @token.should_not == "+\\"
753
+ end
754
+ end
755
+
756
+ describe "requesting a userrights token for an nonexistant user" do
757
+
758
+ it "should raise an error" do
759
+ lambda do
760
+ @gateway.send(:get_userrights_token, 'nosuchuser')
761
+ end.should raise_error(StandardError)
762
+ end
763
+ end
764
+
765
+ describe "changing a user's groups with a valid token" do
766
+
767
+ def userrights_response
768
+ <<-XML
769
+ <api>
770
+ <userrights user="nonadmin">
771
+ <removed>
772
+ <group>oldgroup</group>
773
+ </removed>
774
+ <added>
775
+ <group>newgroup</group>
776
+ </added>
777
+ </userrights>
778
+ </api>
779
+ XML
780
+ end
781
+
782
+ before do
783
+ @token = @gateway.send(:get_userrights_token, 'nonadmin')
784
+ @result = @gateway.send(:userrights, 'nonadmin', @token, 'newgroup', 'oldgroup', 'because I can')
785
+ end
786
+
787
+ it "should return a result matching the input" do
788
+ Hash.from_xml(@result.to_s).should == Hash.from_xml(userrights_response)
789
+ end
790
+
791
+ end
792
+
793
+ end
794
+ end
736
795
 
737
796
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mediawiki-gateway
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
4
+ hash: 31
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 3
9
- - 5
10
- version: 0.3.5
9
+ - 6
10
+ version: 0.3.6
11
11
  platform: ruby
12
12
  authors:
13
13
  - Jani Patokallio
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-03-28 00:00:00 +11:00
18
+ date: 2011-03-30 00:00:00 +11:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency