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/README +3 -1
- data/doc/classes/MediaWiki.html +32 -5
- data/doc/classes/MediaWiki/Config.html +12 -12
- data/doc/classes/MediaWiki/Gateway.html +512 -478
- data/doc/created.rid +1 -1
- data/doc/files/lib/media_wiki/gateway_rb.html +1 -1
- data/doc/files/lib/media_wiki/utils_rb.html +1 -1
- data/doc/fr_method_index.html +30 -28
- data/lib/media_wiki.rb +1 -1
- data/lib/media_wiki/gateway.rb +47 -1
- data/mediawiki-gateway.gemspec +2 -2
- data/spec/fake_media_wiki/api_pages.rb +1 -0
- data/spec/fake_media_wiki/app.rb +38 -0
- data/spec/fake_media_wiki/query_handling.rb +16 -0
- data/spec/gateway_spec.rb +60 -1
- metadata +4 -4
data/doc/created.rid
CHANGED
@@ -1 +1 @@
|
|
1
|
-
Mon,
|
1
|
+
Mon, 28 Mar 2011 12:16:13 +1100
|
data/doc/fr_method_index.html
CHANGED
@@ -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#
|
24
|
-
<a href="classes/MediaWiki/Gateway.html#
|
25
|
-
<a href="classes/MediaWiki/Gateway.html#
|
26
|
-
<a href="classes/MediaWiki/Gateway.html#
|
27
|
-
<a href="classes/MediaWiki/Gateway.html#
|
28
|
-
<a href="classes/MediaWiki/Gateway.html#
|
29
|
-
<a href="classes/MediaWiki/Gateway.html#M000025">
|
30
|
-
<a href="classes/MediaWiki/Gateway.html#
|
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#
|
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#
|
36
|
-
<a href="classes/MediaWiki/Gateway.html#
|
37
|
-
<a href="classes/MediaWiki/Gateway.html#
|
38
|
-
<a href="classes/MediaWiki/Gateway.html#
|
39
|
-
<a href="classes/MediaWiki/Gateway.html#
|
40
|
-
<a href="classes/MediaWiki/Gateway.html#
|
41
|
-
<a href="classes/MediaWiki/Gateway.html#
|
42
|
-
<a href="classes/MediaWiki/Gateway.html#
|
43
|
-
<a href="classes/MediaWiki/Gateway.html#
|
44
|
-
<a href="classes/MediaWiki/
|
45
|
-
<a href="classes/MediaWiki/
|
46
|
-
<a href="classes/MediaWiki/Gateway.html#
|
47
|
-
<a href="classes/MediaWiki/Gateway.html#
|
48
|
-
<a href="classes/MediaWiki/Gateway.html#
|
49
|
-
<a href="classes/MediaWiki/Gateway.html#
|
50
|
-
<a href="classes/MediaWiki/Gateway.html#
|
51
|
-
<a href="classes/MediaWiki
|
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#
|
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#
|
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
data/lib/media_wiki/gateway.rb
CHANGED
@@ -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
|
data/mediawiki-gateway.gemspec
CHANGED
@@ -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.
|
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-
|
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 = [
|
data/spec/fake_media_wiki/app.rb
CHANGED
@@ -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:
|
4
|
+
hash: 31
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 3
|
9
|
-
-
|
10
|
-
version: 0.3.
|
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-
|
18
|
+
date: 2011-03-30 00:00:00 +11:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|