libgss 0.2.0 → 0.3.0
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 +8 -8
- data/lib/libgss/http_client_with_signature_key.rb +132 -0
- data/lib/libgss/network.rb +24 -12
- data/lib/libgss/version.rb +1 -1
- data/lib/libgss.rb +7 -0
- data/libgss.gemspec +1 -0
- data/spec/libgss/action_request_spec.rb +1 -2
- data/spec/libgss/actions/dictionary_spec.rb +1 -5
- data/spec/libgss/actions/friendship_spec.rb +1 -2
- data/spec/libgss/actions/game_data_spec.rb +1 -1
- data/spec/libgss/actions/int_range_spec.rb +1 -5
- data/spec/libgss/actions/log_spec.rb +1 -5
- data/spec/libgss/actions/master_spec.rb +1 -5
- data/spec/libgss/actions/probability_spec.rb +1 -5
- data/spec/libgss/actions/ruby_stored_script_spec.rb +1 -2
- data/spec/libgss/actions/schedule_spec.rb +1 -5
- data/spec/libgss/asset_request_spec.rb +1 -2
- data/spec/libgss/network_spec.rb +1 -12
- data/spec/spec_helper.rb +8 -0
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
OTdkNjg4OGZmYTAzNDNjN2VjNTM4Mjg0NzIzOGU4MTMzODdjYzgxZQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
OWY0MWFkMDNmMDEzZTlmMzY0NWI5NzJmMzRhZjU1ZmU3NWFkNDE2OQ==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ZDcyMzY2YWI4NDVmZWJjZTIzZTE2MTEzMWQyZDBmZTU2Mjk1OWQyZWJiYTdl
|
10
|
+
Yjc1MDljNzhmODkzYjUxYmVlYTlmMjFmOGI3MjIxYmFkZDQwNzI2MTQwZmFi
|
11
|
+
Zjk2MmM4NGQyZTk4MGE3NWZkNjVlNjU4OTlhMDlhMWJkYTE2YzI=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NTA5M2U4NWQ2ZDlhODI4ZTUyZjQyNzgyZGNmNzYyMGQ0ZWE1NmNhNzU5OTk5
|
14
|
+
M2M2MjM1MTljZmY2MGFkYzJkNGY2ZGYxNTllNjUxZjMxOWJjNzIwMjhkZWYz
|
15
|
+
NTlhZmU3NThmNDIwYmY3ZWY5MDQ4MWRiNWFhZDFkMGFkZDA4MmM=
|
@@ -0,0 +1,132 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'libgss'
|
3
|
+
|
4
|
+
require 'oauth'
|
5
|
+
|
6
|
+
require 'digest/hmac'
|
7
|
+
|
8
|
+
module Libgss
|
9
|
+
class HttpClientWithSignatureKey
|
10
|
+
|
11
|
+
attr_reader :impl, :network
|
12
|
+
def initialize(impl, network)
|
13
|
+
@impl, @network = impl, network
|
14
|
+
end
|
15
|
+
|
16
|
+
def post(uri, body, original_headers = {}, &block)
|
17
|
+
headers = {
|
18
|
+
"oauth_consumer_key" => network.consumer_key || "",
|
19
|
+
"oauth_token" => network.auth_token,
|
20
|
+
}
|
21
|
+
oauth_params = {
|
22
|
+
"body" => body,
|
23
|
+
"oauth_signature_method" => "HMAC-SHA1"
|
24
|
+
}.update(headers)
|
25
|
+
|
26
|
+
req_hash = {
|
27
|
+
"method" => "POST",
|
28
|
+
"uri" => uri,
|
29
|
+
"parameters" => oauth_params
|
30
|
+
}
|
31
|
+
|
32
|
+
options = {
|
33
|
+
:consumer_secret => network.consumer_secret,
|
34
|
+
:token_secret => network.signature_key
|
35
|
+
}
|
36
|
+
|
37
|
+
signature_class = Libgss.use_oauth_gem ? ::OAuth::Signature : Signature
|
38
|
+
$stdout.puts("signature_class: #{signature_class.name}") if ENV["VERBOSE"]
|
39
|
+
|
40
|
+
headers["oauth_signature"] = signature_class.sign(req_hash, options)
|
41
|
+
|
42
|
+
res = @impl.post(uri, body, headers.update(original_headers))
|
43
|
+
end
|
44
|
+
|
45
|
+
class Signature
|
46
|
+
class << self
|
47
|
+
def sign(req_hash, options)
|
48
|
+
new(req_hash, options).sign
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def initialize(req_hash, options)
|
53
|
+
@request, @options = req_hash, options
|
54
|
+
end
|
55
|
+
|
56
|
+
def sign
|
57
|
+
s = digest # ダイジェストを計算
|
58
|
+
Base64.encode64(s). # BASE64でエンコード
|
59
|
+
chomp. # 末尾から改行コード(\r or \n)を取り除いた文字列を返す
|
60
|
+
gsub(/\n/,'') # 改行を全て取り除く
|
61
|
+
end
|
62
|
+
|
63
|
+
def digest
|
64
|
+
s = signature_base_string # base_stringを計算
|
65
|
+
digest_class = ::Digest::SHA1 # http://doc.ruby-lang.org/ja/1.9.3/class/Digest=3a=3aSHA1.html
|
66
|
+
|
67
|
+
# digest_class.digest(s) # Digestクラスを使って計算
|
68
|
+
|
69
|
+
# http://doc.ruby-lang.org/ja/1.9.3/library/digest=2fhmac.html
|
70
|
+
# http://doc.ruby-lang.org/ja/1.9.3/class/Digest=3a=3aHMAC.html
|
71
|
+
::Digest::HMAC.digest(s, secret, digest_class)
|
72
|
+
end
|
73
|
+
|
74
|
+
def signature_base_string
|
75
|
+
base = [
|
76
|
+
@request["method"],
|
77
|
+
normalized_uri,
|
78
|
+
normalized_parameters]
|
79
|
+
base.map { |v| escape(v) }.join("&")
|
80
|
+
end
|
81
|
+
|
82
|
+
def normalized_uri
|
83
|
+
u = URI.parse(@request["uri"])
|
84
|
+
"#{u.scheme.downcase}://#{u.host.downcase}#{(u.scheme.downcase == 'http' && u.port != 80) || (u.scheme.downcase == 'https' && u.port != 443) ? ":#{u.port}" : ""}#{(u.path && u.path != '') ? u.path : '/'}"
|
85
|
+
rescue
|
86
|
+
@request["uri"]
|
87
|
+
end
|
88
|
+
|
89
|
+
def normalized_parameters
|
90
|
+
normalize(parameters_for_signature)
|
91
|
+
end
|
92
|
+
|
93
|
+
def parameters_for_signature
|
94
|
+
parameters.reject { |k,v| k == "oauth_signature"}
|
95
|
+
end
|
96
|
+
|
97
|
+
def parameters
|
98
|
+
@request["parameters"]
|
99
|
+
end
|
100
|
+
|
101
|
+
|
102
|
+
def secret
|
103
|
+
"#{escape(@options[:consumer_secret])}&#{escape(@options[:token_secret])}"
|
104
|
+
end
|
105
|
+
|
106
|
+
|
107
|
+
RESERVED_CHARACTERS = /[^a-zA-Z0-9\-\.\_\~]/
|
108
|
+
|
109
|
+
def escape(value)
|
110
|
+
URI::escape(value.to_s, RESERVED_CHARACTERS)
|
111
|
+
rescue ArgumentError
|
112
|
+
URI::escape(value.to_s.force_encoding(Encoding::UTF_8), RESERVED_CHARACTERS)
|
113
|
+
end
|
114
|
+
|
115
|
+
def normalize(params)
|
116
|
+
params.sort.map do |k, values|
|
117
|
+
|
118
|
+
if values.is_a?(Array)
|
119
|
+
# multiple values were provided for a single key
|
120
|
+
values.sort.collect do |v|
|
121
|
+
[escape(k),escape(v)] * "="
|
122
|
+
end
|
123
|
+
else
|
124
|
+
[escape(k),escape(values)] * "="
|
125
|
+
end
|
126
|
+
end * "&"
|
127
|
+
end
|
128
|
+
|
129
|
+
end
|
130
|
+
|
131
|
+
end
|
132
|
+
end
|
data/lib/libgss/network.rb
CHANGED
@@ -17,6 +17,9 @@ module Libgss
|
|
17
17
|
|
18
18
|
attr_reader :auth_token, :signature_key
|
19
19
|
|
20
|
+
attr_accessor :consumer_secret
|
21
|
+
attr_accessor :consumer_key
|
22
|
+
|
20
23
|
attr_accessor :api_version
|
21
24
|
attr_accessor :platform
|
22
25
|
attr_accessor :player_id
|
@@ -43,6 +46,10 @@ module Libgss
|
|
43
46
|
end
|
44
47
|
@ssl_base_url = @base_url if @ssl_disabled
|
45
48
|
@platform = "fontana"
|
49
|
+
|
50
|
+
@consumer_secret = options[:consumer_secret] || ENV["CONSUMER_SECRET"]
|
51
|
+
@ignore_signature_key = !!options[:ignore_signature_key]
|
52
|
+
|
46
53
|
@httpclient = HTTPClient.new
|
47
54
|
@httpclient.ssl_config.verify_mode = nil # 自己署名の証明書をOKにする
|
48
55
|
end
|
@@ -53,16 +60,10 @@ module Libgss
|
|
53
60
|
r << fields.join(", ") << ">"
|
54
61
|
end
|
55
62
|
|
56
|
-
def
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
!!self.player_id
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
def login
|
65
|
-
res = @httpclient.post(login_url, "player[id]" => player_id)
|
63
|
+
def login(extra = {})
|
64
|
+
attrs = { "player[id]" => player_id }
|
65
|
+
extra.each{|k, v| attrs[ "player[#{k}]" ] = v }
|
66
|
+
res = @httpclient.post(login_url, attrs)
|
66
67
|
process_json_response(res) do |obj|
|
67
68
|
@player_id ||= obj["player_id"]
|
68
69
|
@auth_token = obj["auth_token"]
|
@@ -71,12 +72,17 @@ module Libgss
|
|
71
72
|
end
|
72
73
|
end
|
73
74
|
|
75
|
+
def ignore_signature_key?
|
76
|
+
@ignore_signature_key
|
77
|
+
end
|
78
|
+
|
74
79
|
def setup
|
75
|
-
|
80
|
+
load_player_id
|
81
|
+
login
|
76
82
|
end
|
77
83
|
|
78
84
|
def new_action_request
|
79
|
-
ActionRequest.new(
|
85
|
+
ActionRequest.new(httpclient_for_action, action_url)
|
80
86
|
end
|
81
87
|
|
82
88
|
def new_public_asset_request(asset_path)
|
@@ -87,6 +93,12 @@ module Libgss
|
|
87
93
|
AssetRequest.new(@httpclient, protected_asset_url(asset_path))
|
88
94
|
end
|
89
95
|
|
96
|
+
def httpclient_for_action
|
97
|
+
@httpclient_for_action ||=
|
98
|
+
@ignore_signature_key ? @httpclient :
|
99
|
+
HttpClientWithSignatureKey.new(@httpclient, self)
|
100
|
+
end
|
101
|
+
|
90
102
|
private
|
91
103
|
|
92
104
|
# ストレージからplayer_idをロードします
|
data/lib/libgss/version.rb
CHANGED
data/lib/libgss.rb
CHANGED
@@ -6,6 +6,13 @@ module Libgss
|
|
6
6
|
autoload :Action , "libgss/action"
|
7
7
|
autoload :ActionRequest, "libgss/action_request"
|
8
8
|
autoload :Outputs , "libgss/outputs"
|
9
|
+
autoload :HttpClientWithSignatureKey, "libgss/http_client_with_signature_key"
|
9
10
|
|
10
11
|
autoload :AssetRequest , "libgss/asset_request"
|
12
|
+
|
13
|
+
class << self
|
14
|
+
attr_accessor :use_oauth_gem
|
15
|
+
end
|
16
|
+
|
17
|
+
self.use_oauth_gem = (ENV["USE_OAUTH_GEM"] =~ /\Atrue\Z|\Aon\Z/i)
|
11
18
|
end
|
data/libgss.gemspec
CHANGED
@@ -7,8 +7,7 @@ describe "Libgss::AssetRequest" do
|
|
7
7
|
end
|
8
8
|
|
9
9
|
let(:network) do
|
10
|
-
network =
|
11
|
-
network.player_id = "1000001"
|
10
|
+
network = new_network
|
12
11
|
network.public_asset_url_prefix = "http://localhost:3000/a/"
|
13
12
|
network.login
|
14
13
|
network
|
data/spec/libgss/network_spec.rb
CHANGED
@@ -6,17 +6,6 @@ describe Libgss::Network do
|
|
6
6
|
Libgss::Network.new("http://localhost:3000")
|
7
7
|
end
|
8
8
|
|
9
|
-
describe "#registration" do
|
10
|
-
context "valid" do
|
11
|
-
it do
|
12
|
-
network.player_id.should == nil
|
13
|
-
network.register
|
14
|
-
network.player_id.should_not == nil
|
15
|
-
network.player_id.should_not =~ /^fontana:/
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
9
|
describe "#setup" do
|
21
10
|
context "valid" do
|
22
11
|
it do
|
@@ -25,7 +14,7 @@ describe Libgss::Network do
|
|
25
14
|
network.signature_key.should == nil
|
26
15
|
res = network.setup
|
27
16
|
network.player_id.should_not == nil
|
28
|
-
network.player_id.
|
17
|
+
network.player_id.should =~ /^fontana:/
|
29
18
|
network.auth_token.should_not == nil
|
30
19
|
network.signature_key.should_not == nil
|
31
20
|
res.should == true
|
data/spec/spec_helper.rb
CHANGED
@@ -7,3 +7,11 @@ def request_fixture_load(fixture_name)
|
|
7
7
|
c = HTTPClient.new
|
8
8
|
c.post("http://localhost:3000/libgss_test/fixture_loadings/#{fixture_name}.json", "_method" => "put")
|
9
9
|
end
|
10
|
+
|
11
|
+
|
12
|
+
def new_network(url = "http://localhost:3000", player_id = "1000001")
|
13
|
+
network = Libgss::Network.new(url)
|
14
|
+
network.player_id = player_id
|
15
|
+
network.consumer_secret = "cpqomf5gs4ob6prd5w5zd52yg9du7150"
|
16
|
+
network
|
17
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: libgss
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- akima
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-06-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - ! '>='
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: oauth
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ! '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ! '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
83
97
|
description: network library for Groovenauts GSS
|
84
98
|
email:
|
85
99
|
- t-akima@groovenauts.jp
|
@@ -100,6 +114,7 @@ files:
|
|
100
114
|
- lib/libgss/action.rb
|
101
115
|
- lib/libgss/action_request.rb
|
102
116
|
- lib/libgss/asset_request.rb
|
117
|
+
- lib/libgss/http_client_with_signature_key.rb
|
103
118
|
- lib/libgss/network.rb
|
104
119
|
- lib/libgss/outputs.rb
|
105
120
|
- lib/libgss/version.rb
|