openfire_admin 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/.travis.yml +9 -0
- data/Gemfile +3 -1
- data/README.md +20 -0
- data/lib/openfire_admin/html_parser.rb +41 -0
- data/lib/openfire_admin/plugin.rb +16 -16
- data/lib/openfire_admin/property_map.rb +6 -6
- data/lib/openfire_admin/response_exception.rb +3 -3
- data/lib/openfire_admin/system_cache.rb +5 -5
- data/lib/openfire_admin/version.rb +1 -1
- data/openfire_admin.gemspec +5 -3
- data/spec/fixtures/login-fail.jsp +147 -0
- data/spec/openfire_admin_spec.rb +14 -0
- data/spec/spec_helper.rb +12 -2
- data/spec/uri_backport.rb +131 -0
- metadata +71 -51
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: cc939e2a210154f50c37e6598c1ee5f1fe5898f4
|
4
|
+
data.tar.gz: bc6e3246f02c30635b34f8c6d63f85fbfcab4015
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ffd281131ccd00c1900757a10aad788c797593a26ab177b0edfa366d376e297644c5ba46f8c4089d4ad190f049cc16e3da6fc8053e893f142617a6325a0034c0
|
7
|
+
data.tar.gz: 8b0901b1585e54922e446114a83299dde6a75ee90ceb5c07950f30b69ce691d4ead24a3d72d554ee1cf512c6119d73f186ae5535ec9eae3d584beb82f49c1a68
|
data/.gitignore
CHANGED
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
# OpenfireAdmin
|
2
2
|
|
3
|
+
[](http://badge.fury.io/rb/openfire_admin)
|
4
|
+
[](https://travis-ci.org/nazoking/openfire_admin)
|
5
|
+
[](https://coveralls.io/r/nazoking/openfire_admin)
|
6
|
+
[](https://codeclimate.com/github/nazoking/openfire_admin)
|
7
|
+
[](https://gemnasium.com/nazoking/openfire_admin)
|
8
|
+
|
3
9
|
Controll Openfire Admin by ruby. (by web scraping,
|
4
10
|
no need openfire plugins)
|
5
11
|
|
@@ -25,6 +31,20 @@ Or install it yourself as:
|
|
25
31
|
|
26
32
|
$ gem install openfire_admin
|
27
33
|
|
34
|
+
## API Document
|
35
|
+
|
36
|
+
http://rubydoc.info/gems/openfire_admin/frames/file/README.md
|
37
|
+
|
38
|
+
## make develop directory
|
39
|
+
|
40
|
+
```
|
41
|
+
bundle install --path .bundle/gems --binstubs bin/
|
42
|
+
```
|
43
|
+
|
44
|
+
### run test
|
45
|
+
|
46
|
+
./bin/rspec
|
47
|
+
|
28
48
|
## TODO
|
29
49
|
|
30
50
|
1. write comment, and document.
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'rexml/document'
|
2
|
+
require 'rehtml'
|
3
|
+
module OpenfireAdmin
|
4
|
+
module ElementHelper
|
5
|
+
def at(xpath)
|
6
|
+
xpath = ".#{xpath}" if !self.is_a?(REXML::Document) and xpath =~ /^\//
|
7
|
+
elm = REXML::XPath.first(self,xpath)
|
8
|
+
elm.extend(ElementHelper)
|
9
|
+
elm
|
10
|
+
end
|
11
|
+
def search(xpath)
|
12
|
+
xpath = ".#{xpath}" if !self.is_a?(REXML::Document) and xpath =~ /^\//
|
13
|
+
ret = REXML::XPath.match(self,xpath).map{|elm|
|
14
|
+
elm.extend(ElementHelper)
|
15
|
+
elm
|
16
|
+
block_given? ? (yield elm) : elm
|
17
|
+
}
|
18
|
+
end
|
19
|
+
def [](arg, name=nil)
|
20
|
+
if arg.is_a?(Symbol)
|
21
|
+
self.attributes[arg.to_s]
|
22
|
+
else
|
23
|
+
super
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
# html parser wrapper
|
28
|
+
class HtmlParser
|
29
|
+
def initialize(html)
|
30
|
+
@doc = REHTML.to_rexml(html)
|
31
|
+
@doc.extend(ElementHelper)
|
32
|
+
end
|
33
|
+
def search(xpath, &proc)
|
34
|
+
@doc.search(xpath, &proc)
|
35
|
+
end
|
36
|
+
def at(xpath)
|
37
|
+
@doc.at(xpath)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
@@ -1,22 +1,22 @@
|
|
1
|
-
require '
|
1
|
+
require 'openfire_admin/html_parser'
|
2
2
|
require 'openfire_admin/admin_client'
|
3
3
|
|
4
4
|
module OpenfireAdmin
|
5
5
|
class AdminClient
|
6
6
|
def get_installed_plugins
|
7
7
|
get("/plugin-admin.jsp") do |res|
|
8
|
-
doc =
|
9
|
-
doc.
|
10
|
-
img = tr.at('a[href
|
8
|
+
doc = HtmlParser.new(res.body)
|
9
|
+
doc.search("//h1/parent::*//table/tbody/tr[@valign='top']"){|tr|
|
10
|
+
img = tr.at('//a[contains(@href,"reloadplugin=")]')
|
11
11
|
if img
|
12
12
|
{
|
13
13
|
:key => img[:href].match(/\?reloadplugin=([^"'&>]*)/)[1],
|
14
|
-
:name => tr.search('td')[1].
|
15
|
-
:description => tr.search('td')[3].
|
16
|
-
:version => tr.search('td')[4].
|
14
|
+
:name => tr.search('td')[1].text.strip,
|
15
|
+
:description => tr.search('td')[3].text.strip,
|
16
|
+
:version => tr.search('td')[4].text.strip
|
17
17
|
}
|
18
18
|
end
|
19
|
-
|
19
|
+
}.collect
|
20
20
|
end
|
21
21
|
end
|
22
22
|
def install_plugin(url)
|
@@ -117,14 +117,14 @@ module OpenfireAdmin
|
|
117
117
|
def self.availables(client, xml=nil)
|
118
118
|
xml = open(PLUGIN_LIST_URL).read unless xml
|
119
119
|
ret = PluginList.new
|
120
|
-
doc =
|
121
|
-
doc.search('plugin')
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
ret <<
|
120
|
+
doc = HtmlParser.new(xml)
|
121
|
+
doc.search('//plugin') do |tr|
|
122
|
+
ap = AvailablePlugin.new(client, tr[:url].match(/\/([^\.\/]+)\.[^\/.]+$/)[1])
|
123
|
+
ap.name = tr[:name]
|
124
|
+
ap.description = tr[:description]
|
125
|
+
ap.version = tr[:latest]
|
126
|
+
ap.url = tr[:url]
|
127
|
+
ret << ap
|
128
128
|
end
|
129
129
|
ret
|
130
130
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'openfire_admin/html_parser'
|
2
2
|
require 'openfire_admin/admin_client'
|
3
3
|
|
4
4
|
module OpenfireAdmin
|
@@ -15,20 +15,20 @@ module OpenfireAdmin
|
|
15
15
|
end
|
16
16
|
def get_property(name)
|
17
17
|
post("/server-properties.jsp", "edit"=>"true", "propName"=>name) do |res|
|
18
|
-
ta =
|
18
|
+
ta = HtmlParser.new(res.body).at('//textarea[@name="propValue"]')
|
19
19
|
raise ResponceException.new("not found textarea",res) unless ta
|
20
|
-
ta.
|
20
|
+
ta.text.to_s
|
21
21
|
end
|
22
22
|
end
|
23
23
|
def get_properties
|
24
24
|
ret = {}
|
25
25
|
get("/server-properties.jsp") do |res|
|
26
26
|
raise ResponceException.new("can't read",res) unless res.code== "200"
|
27
|
-
doc =
|
27
|
+
doc = HtmlParser.new(res.body)
|
28
28
|
doc.search('//h1/parent::node()//table/tbody/tr[@class=""]').each do |tr|
|
29
|
-
v = tr.at('td[2]
|
29
|
+
v = tr.at('//td[2]//span')[:title]
|
30
30
|
v = "" if v == NBSP
|
31
|
-
ret[tr.at('td
|
31
|
+
ret[tr.at('//td//span')[:title]]= v
|
32
32
|
end
|
33
33
|
end
|
34
34
|
ret
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'openfire_admin/html_parser'
|
2
2
|
require 'net/http'
|
3
3
|
# openfire admin operator
|
4
4
|
module OpenfireAdmin
|
@@ -8,8 +8,8 @@ module OpenfireAdmin
|
|
8
8
|
def initialize(message,res)
|
9
9
|
case res
|
10
10
|
when Net::HTTPSuccess
|
11
|
-
doc =
|
12
|
-
msgs = ( doc.search('
|
11
|
+
doc = HtmlParser.new(res.body)
|
12
|
+
msgs = ( doc.search('//*[contains(@class,"jive-error-text") or contains(@class , "error")]') || [] ).map{|c| c.text.strip}
|
13
13
|
if msgs.empty?
|
14
14
|
super(message)
|
15
15
|
else
|
@@ -1,22 +1,22 @@
|
|
1
|
-
require '
|
2
|
-
require 'openfire_admin/admin_client
|
1
|
+
require 'openfire_admin/html_parser'
|
2
|
+
require 'openfire_admin/admin_client'
|
3
3
|
|
4
4
|
module OpenfireAdmin
|
5
5
|
# extend for system cache
|
6
6
|
class AdminClient
|
7
7
|
def system_cache
|
8
8
|
get("/system-cache.jsp") do |res|
|
9
|
-
|
9
|
+
HtmlParser.new(res.body).search('//input[@type="checkbox"][@name="cacheID"]'){|i|
|
10
10
|
{
|
11
11
|
:cacheID => i[:value],
|
12
|
-
:name => i.
|
12
|
+
:name => i.at("ancestor::tr[1]//table[1]//td[2]").text.strip
|
13
13
|
}
|
14
14
|
}
|
15
15
|
end
|
16
16
|
end
|
17
17
|
def system_cache_clear(cacheID)
|
18
18
|
post("/system-cache.jsp","cacheID"=>cacheID, "clear"=>"Clear") do |res|
|
19
|
-
!
|
19
|
+
! HtmlParser.new(res.body).at("//div[@class='jive-success']").nil?
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|
data/openfire_admin.gemspec
CHANGED
@@ -4,9 +4,9 @@ require File.expand_path('../lib/openfire_admin/version', __FILE__)
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
5
|
gem.authors = ["nazoking"]
|
6
6
|
gem.email = ["nazoking@gmai.com"]
|
7
|
-
gem.description = %q{
|
8
|
-
gem.summary = %q{}
|
9
|
-
gem.homepage = ""
|
7
|
+
gem.description = %q{Control for Openfire admin console}
|
8
|
+
gem.summary = %q{Control for Openfire admin console}
|
9
|
+
gem.homepage = "https://github.com/nazoking/openfire_admin"
|
10
10
|
|
11
11
|
gem.files = `git ls-files`.split($\)
|
12
12
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
@@ -15,6 +15,8 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.require_paths = ["lib"]
|
16
16
|
gem.version = OpenfireAdmin::VERSION
|
17
17
|
|
18
|
+
gem.add_dependency "rehtml"
|
19
|
+
|
18
20
|
gem.add_development_dependency "rspec"
|
19
21
|
gem.add_development_dependency "fakeweb"
|
20
22
|
end
|
@@ -0,0 +1,147 @@
|
|
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
|
+
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
29
|
+
|
30
|
+
<html>
|
31
|
+
<head>
|
32
|
+
<title>Openfire Admin Console</title>
|
33
|
+
<script language="JavaScript" type="text/javascript">
|
34
|
+
<!--
|
35
|
+
// break out of frames
|
36
|
+
if (self.parent.frames.length != 0) {
|
37
|
+
self.parent.location=document.location;
|
38
|
+
}
|
39
|
+
function updateFields(el) {
|
40
|
+
if (el.checked) {
|
41
|
+
document.loginForm.username.disabled = true;
|
42
|
+
document.loginForm.password.disabled = true;
|
43
|
+
}
|
44
|
+
else {
|
45
|
+
document.loginForm.username.disabled = false;
|
46
|
+
document.loginForm.password.disabled = false;
|
47
|
+
document.loginForm.username.focus();
|
48
|
+
}
|
49
|
+
}
|
50
|
+
//-->
|
51
|
+
</script>
|
52
|
+
<link rel="stylesheet" href="style/global.css" type="text/css">
|
53
|
+
<link rel="stylesheet" href="style/login.css" type="text/css">
|
54
|
+
</head>
|
55
|
+
|
56
|
+
<body>
|
57
|
+
|
58
|
+
<form action="login.jsp" name="loginForm" method="post">
|
59
|
+
|
60
|
+
|
61
|
+
|
62
|
+
<input type="hidden" name="login" value="true">
|
63
|
+
|
64
|
+
<div align="center">
|
65
|
+
<!-- BEGIN login box -->
|
66
|
+
<div id="jive-loginBox">
|
67
|
+
|
68
|
+
<div align="center" id="jive-loginTable">
|
69
|
+
|
70
|
+
<span id="jive-login-header" style="background: transparent url(images/login_logo.gif) no-repeat left; padding: 29px 0 10px 205px;">
|
71
|
+
Administration Console
|
72
|
+
</span>
|
73
|
+
|
74
|
+
<div style="text-align: center; width: 380px;">
|
75
|
+
<table cellpadding="0" cellspacing="0" border="0" align="center">
|
76
|
+
<tr>
|
77
|
+
<td align="right" class="loginFormTable">
|
78
|
+
|
79
|
+
<table cellpadding="2" cellspacing="0" border="0">
|
80
|
+
<noscript>
|
81
|
+
<tr>
|
82
|
+
<td colspan="3">
|
83
|
+
<table cellpadding="0" cellspacing="0" border="0">
|
84
|
+
<tr valign="top">
|
85
|
+
<td><img src="images/error-16x16.gif" width="16" height="16" border="0" alt="" vspace="2"></td>
|
86
|
+
<td><div class="jive-error-text" style="padding-left:5px; color:#cc0000;">Error: You don't have JavaScript enabled. This tool uses JavaScript and much of it will not work correctly without it enabled. Please turn JavaScript back on and reload this page.</div></td>
|
87
|
+
</tr>
|
88
|
+
</table>
|
89
|
+
</td>
|
90
|
+
</tr>
|
91
|
+
</noscript>
|
92
|
+
|
93
|
+
<tr>
|
94
|
+
<td colspan="3">
|
95
|
+
<table cellpadding="0" cellspacing="0" border="0">
|
96
|
+
|
97
|
+
<tr valign="top">
|
98
|
+
<td><img src="images/error-16x16.gif" width="16" height="16" border="0" alt="" vspace="2"></td>
|
99
|
+
<td><div class="jive-error-text" style="padding-left:5px; color:#cc0000;">Login failed: make sure your username and password are correct and that you're an admin or moderator.</div></td>
|
100
|
+
</tr>
|
101
|
+
|
102
|
+
</table>
|
103
|
+
</td>
|
104
|
+
</tr>
|
105
|
+
|
106
|
+
<tr>
|
107
|
+
<td><input type="text" name="username" size="15" maxlength="50" id="u01" value="badusername"></td>
|
108
|
+
<td><input type="password" name="password" size="15" maxlength="50" id="p01"></td>
|
109
|
+
<td align="center"><input type="submit" value=" Login "></td>
|
110
|
+
</tr>
|
111
|
+
<tr valign="top">
|
112
|
+
<td class="jive-login-label"><label for="u01">username</label></td>
|
113
|
+
<td class="jive-login-label"><label for="p01">password</label></td>
|
114
|
+
<td> </td>
|
115
|
+
</tr>
|
116
|
+
</table>
|
117
|
+
</td>
|
118
|
+
</tr>
|
119
|
+
<tr>
|
120
|
+
<td align="right">
|
121
|
+
<div align="right" id="jive-loginVersion">
|
122
|
+
Openfire, Version: 3.8.2
|
123
|
+
</div>
|
124
|
+
</td>
|
125
|
+
</tr>
|
126
|
+
</table>
|
127
|
+
</div>
|
128
|
+
</div>
|
129
|
+
|
130
|
+
</div>
|
131
|
+
<!-- END login box -->
|
132
|
+
</div>
|
133
|
+
|
134
|
+
</form>
|
135
|
+
|
136
|
+
<script language="JavaScript" type="text/javascript">
|
137
|
+
<!--
|
138
|
+
if (document.loginForm.username.value == '') {
|
139
|
+
document.loginForm.username.focus();
|
140
|
+
} else {
|
141
|
+
document.loginForm.password.focus();
|
142
|
+
}
|
143
|
+
//-->
|
144
|
+
</script>
|
145
|
+
|
146
|
+
</body>
|
147
|
+
</html>
|
data/spec/openfire_admin_spec.rb
CHANGED
@@ -59,6 +59,20 @@ describe OpenfireAdmin::Client do
|
|
59
59
|
}
|
60
60
|
client.logined?.should be_true
|
61
61
|
end
|
62
|
+
it "login fail" do
|
63
|
+
client = OpenfireAdmin.new
|
64
|
+
client.logined?.should be_false
|
65
|
+
proc {
|
66
|
+
expect_post( "/login.jsp",{
|
67
|
+
"login"=>"true",
|
68
|
+
"password"=>"bbb",
|
69
|
+
"username"=>"aaa"},
|
70
|
+
"/login-fail.jsp"){
|
71
|
+
client.login("aaa","bbb")
|
72
|
+
}
|
73
|
+
}.should raise_error( OpenfireAdmin::ResponceException, /Login failed/ )
|
74
|
+
client.logined?.should be_false
|
75
|
+
end
|
62
76
|
it "can operate setup mode" do
|
63
77
|
client = OpenfireAdmin.new
|
64
78
|
expect_get( "/login.jsp", :body=>"hoge"){
|
data/spec/spec_helper.rb
CHANGED
@@ -1,9 +1,19 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
|
2
|
+
begin
|
3
|
+
require 'coveralls'
|
4
|
+
Coveralls.wear!
|
5
|
+
rescue LoadError
|
6
|
+
end
|
3
7
|
|
8
|
+
require 'bundler/setup'
|
4
9
|
require 'openfire_admin'
|
5
10
|
require 'fakeweb'
|
6
11
|
|
12
|
+
unless URI.respond_to?(:decode_www_form) # for ruby 1.8
|
13
|
+
require File.dirname(__FILE__)+"/uri_backport"
|
14
|
+
end
|
15
|
+
|
16
|
+
|
7
17
|
module FakeWebHelper
|
8
18
|
def path_of(url)
|
9
19
|
"http://localhost:9090#{url}"
|
@@ -59,6 +69,7 @@ module FakeWebHelper
|
|
59
69
|
FakeWeb.allow_net_connect = false
|
60
70
|
ret = yield
|
61
71
|
FakeWeb.clean_registry
|
72
|
+
FakeWeb.allow_net_connect = true
|
62
73
|
ret
|
63
74
|
end
|
64
75
|
def expect_get(path,option)
|
@@ -87,5 +98,4 @@ end
|
|
87
98
|
|
88
99
|
RSpec.configure do |config|
|
89
100
|
config.include FakeWebHelper
|
90
|
-
# some (optional) config here
|
91
101
|
end
|
@@ -0,0 +1,131 @@
|
|
1
|
+
# Taken from Ruby 1.9's uri/common.rb
|
2
|
+
# By Akira Yamada <akira@ruby-lang.org>
|
3
|
+
# License:
|
4
|
+
# You can redistribute it and/or modify it under the same term as Ruby.
|
5
|
+
|
6
|
+
require 'uri'
|
7
|
+
|
8
|
+
# Backport Ruby 1.9's form encoding/decoding functionality
|
9
|
+
module URI
|
10
|
+
TBLENCWWWCOMP_ = {} # :nodoc:
|
11
|
+
256.times do |i|
|
12
|
+
TBLENCWWWCOMP_[i.chr] = '%%%02X' % i
|
13
|
+
end
|
14
|
+
TBLENCWWWCOMP_[' '] = '+'
|
15
|
+
TBLENCWWWCOMP_.freeze
|
16
|
+
TBLDECWWWCOMP_ = {} # :nodoc:
|
17
|
+
256.times do |i|
|
18
|
+
h, l = i>>4, i&15
|
19
|
+
TBLDECWWWCOMP_['%%%X%X' % [h, l]] = i.chr
|
20
|
+
TBLDECWWWCOMP_['%%%x%X' % [h, l]] = i.chr
|
21
|
+
TBLDECWWWCOMP_['%%%X%x' % [h, l]] = i.chr
|
22
|
+
TBLDECWWWCOMP_['%%%x%x' % [h, l]] = i.chr
|
23
|
+
end
|
24
|
+
TBLDECWWWCOMP_['+'] = ' '
|
25
|
+
TBLDECWWWCOMP_.freeze
|
26
|
+
|
27
|
+
# Encode given +str+ to URL-encoded form data.
|
28
|
+
#
|
29
|
+
# This method doesn't convert *, -, ., 0-9, A-Z, _, a-z, but does convert SP
|
30
|
+
# (ASCII space) to + and converts others to %XX.
|
31
|
+
#
|
32
|
+
# This is an implementation of
|
33
|
+
# http://www.w3.org/TR/html5/association-of-controls-and-forms.html#url-encoded-form-data
|
34
|
+
#
|
35
|
+
# See URI.decode_www_form_component, URI.encode_www_form
|
36
|
+
def self.encode_www_form_component(str)
|
37
|
+
str.to_s.gsub(/[^*\-.0-9A-Z_a-z]/) { |chr| TBLENCWWWCOMP_[chr] }
|
38
|
+
end
|
39
|
+
|
40
|
+
# Decode given +str+ of URL-encoded form data.
|
41
|
+
#
|
42
|
+
# This decods + to SP.
|
43
|
+
#
|
44
|
+
# See URI.encode_www_form_component, URI.decode_www_form
|
45
|
+
def self.decode_www_form_component(str)
|
46
|
+
raise ArgumentError, "invalid %-encoding (#{str})" unless /\A[^%]*(?:%[a-fA-F0-9][a-fA-F0-9][^%]*)*\z/ =~ str
|
47
|
+
str.gsub(/\+|%[a-fA-F0-9][a-fA-F0-9]/) { |chr| TBLDECWWWCOMP_[chr] }
|
48
|
+
end
|
49
|
+
|
50
|
+
# Generate URL-encoded form data from given +enum+.
|
51
|
+
#
|
52
|
+
# This generates application/x-www-form-urlencoded data defined in HTML5
|
53
|
+
# from given an Enumerable object.
|
54
|
+
#
|
55
|
+
# This internally uses URI.encode_www_form_component(str).
|
56
|
+
#
|
57
|
+
# This method doesn't convert the encoding of given items, so convert them
|
58
|
+
# before call this method if you want to send data as other than original
|
59
|
+
# encoding or mixed encoding data. (Strings which are encoded in an HTML5
|
60
|
+
# ASCII incompatible encoding are converted to UTF-8.)
|
61
|
+
#
|
62
|
+
# This method doesn't handle files. When you send a file, use
|
63
|
+
# multipart/form-data.
|
64
|
+
#
|
65
|
+
# This is an implementation of
|
66
|
+
# http://www.w3.org/TR/html5/forms.html#url-encoded-form-data
|
67
|
+
#
|
68
|
+
# URI.encode_www_form([["q", "ruby"], ["lang", "en"]])
|
69
|
+
# #=> "q=ruby&lang=en"
|
70
|
+
# URI.encode_www_form("q" => "ruby", "lang" => "en")
|
71
|
+
# #=> "q=ruby&lang=en"
|
72
|
+
# URI.encode_www_form("q" => ["ruby", "perl"], "lang" => "en")
|
73
|
+
# #=> "q=ruby&q=perl&lang=en"
|
74
|
+
# URI.encode_www_form([["q", "ruby"], ["q", "perl"], ["lang", "en"]])
|
75
|
+
# #=> "q=ruby&q=perl&lang=en"
|
76
|
+
#
|
77
|
+
# See URI.encode_www_form_component, URI.decode_www_form
|
78
|
+
def self.encode_www_form(enum)
|
79
|
+
enum.map do |k,v|
|
80
|
+
if v.nil?
|
81
|
+
encode_www_form_component(k)
|
82
|
+
elsif v.respond_to?(:to_ary)
|
83
|
+
v.to_ary.map do |w|
|
84
|
+
str = encode_www_form_component(k)
|
85
|
+
unless w.nil?
|
86
|
+
str << '='
|
87
|
+
str << encode_www_form_component(w)
|
88
|
+
end
|
89
|
+
end.join('&')
|
90
|
+
else
|
91
|
+
str = encode_www_form_component(k)
|
92
|
+
str << '='
|
93
|
+
str << encode_www_form_component(v)
|
94
|
+
end
|
95
|
+
end.join('&')
|
96
|
+
end
|
97
|
+
|
98
|
+
WFKV_ = '(?:[^%#=;&]*(?:%[a-fA-F0-9][a-fA-F0-9][^%#=;&]*)*)' # :nodoc:
|
99
|
+
|
100
|
+
# Decode URL-encoded form data from given +str+.
|
101
|
+
#
|
102
|
+
# This decodes application/x-www-form-urlencoded data
|
103
|
+
# and returns array of key-value array.
|
104
|
+
# This internally uses URI.decode_www_form_component.
|
105
|
+
#
|
106
|
+
# _charset_ hack is not supported now because the mapping from given charset
|
107
|
+
# to Ruby's encoding is not clear yet.
|
108
|
+
# see also http://www.w3.org/TR/html5/syntax.html#character-encodings-0
|
109
|
+
#
|
110
|
+
# This refers http://www.w3.org/TR/html5/forms.html#url-encoded-form-data
|
111
|
+
#
|
112
|
+
# ary = URI.decode_www_form("a=1&a=2&b=3")
|
113
|
+
# p ary #=> [['a', '1'], ['a', '2'], ['b', '3']]
|
114
|
+
# p ary.assoc('a').last #=> '1'
|
115
|
+
# p ary.assoc('b').last #=> '3'
|
116
|
+
# p ary.rassoc('a').last #=> '2'
|
117
|
+
# p Hash[ary] # => {"a"=>"2", "b"=>"3"}
|
118
|
+
#
|
119
|
+
# See URI.decode_www_form_component, URI.encode_www_form
|
120
|
+
def self.decode_www_form(str)
|
121
|
+
return [] if str.empty?
|
122
|
+
unless /\A#{WFKV_}=#{WFKV_}(?:[;&]#{WFKV_}=#{WFKV_})*\z/o =~ str
|
123
|
+
raise ArgumentError, "invalid data of application/x-www-form-urlencoded (#{str})"
|
124
|
+
end
|
125
|
+
ary = []
|
126
|
+
$&.scan(/([^=;&]+)=([^;&]*)/) do
|
127
|
+
ary << [decode_www_form_component($1), decode_www_form_component($2)]
|
128
|
+
end
|
129
|
+
ary
|
130
|
+
end
|
131
|
+
end
|
metadata
CHANGED
@@ -1,48 +1,66 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: openfire_admin
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
|
-
authors:
|
6
|
+
authors:
|
7
7
|
- nazoking
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
date: 2014-05-28 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rehtml
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
16
28
|
name: rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
17
34
|
type: :development
|
18
|
-
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
20
|
-
requirements:
|
21
|
-
- -
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version:
|
24
|
-
|
25
|
-
- !ruby/object:Gem::Dependency
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
26
42
|
name: fakeweb
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
27
48
|
type: :development
|
28
|
-
|
29
|
-
version_requirements: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- -
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version:
|
34
|
-
|
35
|
-
|
36
|
-
email:
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description: Control for Openfire admin console
|
56
|
+
email:
|
37
57
|
- nazoking@gmai.com
|
38
58
|
executables: []
|
39
|
-
|
40
59
|
extensions: []
|
41
|
-
|
42
60
|
extra_rdoc_files: []
|
43
|
-
|
44
|
-
files:
|
61
|
+
files:
|
45
62
|
- .gitignore
|
63
|
+
- .travis.yml
|
46
64
|
- Gemfile
|
47
65
|
- LICENSE
|
48
66
|
- README.md
|
@@ -50,6 +68,7 @@ files:
|
|
50
68
|
- lib/openfire_admin.rb
|
51
69
|
- lib/openfire_admin/admin_client.rb
|
52
70
|
- lib/openfire_admin/client.rb
|
71
|
+
- lib/openfire_admin/html_parser.rb
|
53
72
|
- lib/openfire_admin/http_client.rb
|
54
73
|
- lib/openfire_admin/plugin.rb
|
55
74
|
- lib/openfire_admin/property_map.rb
|
@@ -59,6 +78,7 @@ files:
|
|
59
78
|
- lib/openfire_admin/user_admin.rb
|
60
79
|
- lib/openfire_admin/version.rb
|
61
80
|
- openfire_admin.gemspec
|
81
|
+
- spec/fixtures/login-fail.jsp
|
62
82
|
- spec/fixtures/plugin-admin.jsp
|
63
83
|
- spec/fixtures/server-properties.jsp
|
64
84
|
- spec/fixtures/server-properties_password.jsp
|
@@ -67,33 +87,32 @@ files:
|
|
67
87
|
- spec/fixtures/versions.xml
|
68
88
|
- spec/openfire_admin_spec.rb
|
69
89
|
- spec/spec_helper.rb
|
70
|
-
|
71
|
-
homepage:
|
90
|
+
- spec/uri_backport.rb
|
91
|
+
homepage: https://github.com/nazoking/openfire_admin
|
92
|
+
licenses: []
|
93
|
+
metadata: {}
|
72
94
|
post_install_message:
|
73
95
|
rdoc_options: []
|
74
|
-
|
75
|
-
require_paths:
|
96
|
+
require_paths:
|
76
97
|
- lib
|
77
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
78
|
-
requirements:
|
79
|
-
- -
|
80
|
-
- !ruby/object:Gem::Version
|
81
|
-
version:
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
version: "0"
|
88
|
-
version:
|
98
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - '>='
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
104
|
+
requirements:
|
105
|
+
- - '>='
|
106
|
+
- !ruby/object:Gem::Version
|
107
|
+
version: '0'
|
89
108
|
requirements: []
|
90
|
-
|
91
109
|
rubyforge_project:
|
92
|
-
rubygems_version:
|
110
|
+
rubygems_version: 2.2.2
|
93
111
|
signing_key:
|
94
|
-
specification_version:
|
95
|
-
summary:
|
96
|
-
test_files:
|
112
|
+
specification_version: 4
|
113
|
+
summary: Control for Openfire admin console
|
114
|
+
test_files:
|
115
|
+
- spec/fixtures/login-fail.jsp
|
97
116
|
- spec/fixtures/plugin-admin.jsp
|
98
117
|
- spec/fixtures/server-properties.jsp
|
99
118
|
- spec/fixtures/server-properties_password.jsp
|
@@ -102,3 +121,4 @@ test_files:
|
|
102
121
|
- spec/fixtures/versions.xml
|
103
122
|
- spec/openfire_admin_spec.rb
|
104
123
|
- spec/spec_helper.rb
|
124
|
+
- spec/uri_backport.rb
|