gpsoauth-rb 0.1.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9de53d5bf8e18fe471a98f7fa3169b35377bb720
4
+ data.tar.gz: 82d5416f6fe365b53f4b2c73116f46de3f225478
5
+ SHA512:
6
+ metadata.gz: b159bdffcba0ac4a50d677debe3a06df37cbcfafaf9df9a511d4835f3ba99c7c03309724b103afb3a1f1d6c43681e533cdf78937e004d5f5d9f3a5611fcfd1be
7
+ data.tar.gz: d3adb8502a542d224466d3efb29cac48c2d79dc19528da994310971abd5e7ad5fb06d2402411ec42e252baa44b4c0d920908b0c1784b644a7b3ab62912e8650c
data/lib/gpsoauth.rb ADDED
@@ -0,0 +1,62 @@
1
+ require "gpsoauth/version"
2
+ require "gpsoauth/google"
3
+ require "gpsoauth/utilities"
4
+ require "base64"
5
+ require "openssl"
6
+ require "httparty"
7
+
8
+ module Gpsoauth
9
+ class Auth
10
+ class << self
11
+ B64_KEY = ("AAAAgMom/1a/v0lblO2Ubrt60J2gcuXSljGFQXgcyZWveWLEwo6prwgi3iJIZdodyhKZQrNWp5nKJ3srRXcUW+F1BD3baEVGcmEgqaLZUNBjm057pKRI16kB0YppeGx5qIQ5QjKzsR8ETQbKLNWgRY0QRNVz34kMJR3P/LgHax/6rmf5AAAAAwEAAQ==")
12
+ ANDROID_KEY = Google.keyFromb64(B64_KEY)
13
+ AUTH_URL = 'https://android.clients.google.com/auth'
14
+ USER_AGENT = "gpsoauth/1.0.0"
15
+
16
+ @@cookie = ""
17
+
18
+ def performAuthRequest(data, cookie = @@cookie)
19
+ response = HTTParty.post(AUTH_URL, body: data, headers: {'User-Agent': USER_AGENT, 'Cookie': cookie})
20
+ @@cookies = response.headers['Set-Cookie'] if response.headers['Set-Cookie']
21
+ return Google.parseAuthResponse(response.body)
22
+ end
23
+
24
+ def performMasterLogin(email, password, android_id, service = 'ac2dm', device_country = 'us', operatorCountry = 'us', lang = 'en', sdk_version = 17)
25
+ data = {
26
+ 'accountType': 'HOSTED_OR_GOOGLE',
27
+ 'Email': email,
28
+ 'has_permission': 1,
29
+ 'add_account': 1,
30
+ 'EncryptedPasswd': Google.signature(email, password, ANDROID_KEY),
31
+ 'service': service,
32
+ 'source': 'android',
33
+ 'androidId': android_id,
34
+ 'device_country': device_country,
35
+ 'operatorCountry': device_country,
36
+ 'lang': lang,
37
+ 'sdk_version': sdk_version
38
+ }
39
+ return performAuthRequest(data, "")
40
+ end
41
+
42
+ def performOAuth(email, master_token, android_id, service, app, client_sig, device_country = 'us', operatorCountry = 'us', lang = 'en', sdk_version = 17)
43
+ data = {
44
+ 'accountType': 'HOSTED_OR_GOOGLE',
45
+ 'Email': email,
46
+ 'has_permission': 1,
47
+ 'EncryptedPasswd': master_token,
48
+ 'service': service,
49
+ 'source': 'android',
50
+ 'androidId': android_id,
51
+ 'app': app,
52
+ 'client_sig': client_sig,
53
+ 'device_country': device_country,
54
+ 'operatorCountry': device_country,
55
+ 'lang': lang,
56
+ 'sdk_version': sdk_version
57
+ }
58
+ return performAuthRequest(data)
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,47 @@
1
+ module Gpsoauth
2
+ class Google
3
+ class << self
4
+ def keyFromb64(key)
5
+ binaryKey = Base64.decode64(key)
6
+ i = Utils.bytesToLong(binaryKey[0..3])
7
+ mod = Utils.bytesToLong(binaryKey[4..3+i])
8
+
9
+ j = Utils.bytesToLong(binaryKey[i+4..i+7])
10
+ exponent = Utils.bytesToLong(binaryKey[i+8..i+7+j])
11
+
12
+ key = OpenSSL::PKey::RSA.new
13
+ key.e = OpenSSL::BN.new(exponent)
14
+ key.n = OpenSSL::BN.new(mod)
15
+
16
+ return key
17
+ end
18
+
19
+ def keyToStuct(key)
20
+ modulus = key.n
21
+ exponent = key.e
22
+ return Utils.serialize_number(modulus.num_bytes, 4) + Utils.serialize_number(modulus) + Utils.serialize_number(exponent.num_bytes, 4) + Utils.serialize_number(exponent)
23
+ end
24
+
25
+ def parseAuthResponse(text)
26
+ responseData = Hash.new
27
+ text.split("\n").each do |line|
28
+ if line == nil
29
+ next
30
+ end
31
+ key, _, val = line.partition('=')
32
+ responseData[key] = val
33
+ end
34
+ return responseData
35
+ end
36
+
37
+ def signature(email, password, key)
38
+ signature = "\x00"
39
+ struct = keyToStuct(key).pack('c*')
40
+ signature = signature + OpenSSL::Digest::SHA1.digest(struct)[0...4]
41
+ encryptedLogin = key.public_encrypt(email + "\x00" + password, OpenSSL::PKey::RSA::PKCS1_OAEP_PADDING)
42
+ signature = signature + encryptedLogin
43
+ return Base64.urlsafe_encode64(signature)
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,30 @@
1
+ module Gpsoauth
2
+ class Utils
3
+ class << self
4
+ def bytesToLong(s)
5
+ return s.bytes.inject {|a, b| (a << 8) + b }
6
+ end
7
+
8
+ def divmod(bn, v)
9
+ bn = bn.to_s.to_i if bn.is_a?(OpenSSL::BN)
10
+ return bn.divmod(v)
11
+ end
12
+
13
+ def serialize_number(n, min_size=nil)
14
+ res = []
15
+ n, mod = divmod(n, 256)
16
+ while mod > 0 || n > 0
17
+ res << mod
18
+ n, mod = divmod(n, 256)
19
+ end
20
+ res = res.reverse
21
+ if min_size
22
+ if res.size < min_size
23
+ res = Array.new(min_size - res.size, 0) + res
24
+ end
25
+ end
26
+ return res
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,3 @@
1
+ module Gpsoauth
2
+ VERSION = "0.1.1"
3
+ end
metadata ADDED
@@ -0,0 +1,90 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gpsoauth-rb
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Sawyer Charles
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-07-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.12'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.12'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: httparty
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.14'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.14'
55
+ description: Direct ruby port of the gpsoauth python library. (https://github.com/simon-weber/gpsoauth)
56
+ email:
57
+ - xssc@users.noreply.github.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - lib/gpsoauth.rb
63
+ - lib/gpsoauth/google.rb
64
+ - lib/gpsoauth/utilities.rb
65
+ - lib/gpsoauth/version.rb
66
+ homepage: https://github.com/xssc/gpsoauth
67
+ licenses:
68
+ - MIT
69
+ metadata: {}
70
+ post_install_message:
71
+ rdoc_options: []
72
+ require_paths:
73
+ - lib
74
+ required_ruby_version: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ required_rubygems_version: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ requirements: []
85
+ rubyforge_project:
86
+ rubygems_version: 2.5.1
87
+ signing_key:
88
+ specification_version: 4
89
+ summary: gpsoauth for ruby
90
+ test_files: []