distack-urlsign 0.1.0 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9802373c59138923f07b05c3dbabe7c2c37e8253
4
- data.tar.gz: 16ac31e6e57e31e10537d70ca3b7663581b39b82
3
+ metadata.gz: bde30f8bddc0975bcd335a8168978b2cb955b0d2
4
+ data.tar.gz: 6d4c08ccf86e571e7256b220d2dffd37179bc77c
5
5
  SHA512:
6
- metadata.gz: e0cf2095317d0584286fdb24a0b327e793ec133e18affc03471fdfa35aed5d1de341eead9c6abc9d51a6ab86c9f44bb3d0426e96f232341105de2ff98a9b753d
7
- data.tar.gz: 07e810377da2e0c1134ca9910813f02ae97c21d86aff4477b575bc0e09c47346689d0ab1a3f4a47466f99ec22a70e215f763c08b15f339454470733f22b9c40d
6
+ metadata.gz: c03f0fdefa293cc1754dc8bc122882e0f09d1009fb505d884fdb070de00602bb3250848390d9d557d774842aa67456192e53c3b9d71937778dd49570a07e7129
7
+ data.tar.gz: f0b417d94280566133290179ecfc7945edb9f8a0c7054e439f1998bc9302a3a76086ae66703c15873cc35b6caeb8e9f84c08f4c0b2a8211b42a6f92c77008248
@@ -5,7 +5,7 @@ require 'distack/urlsign/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "distack-urlsign"
8
- spec.version = Distack::Urlsign::VERSION
8
+ spec.version = Distack::URLSign::VERSION
9
9
  spec.authors = ["Rodrigo Kochenburger"]
10
10
  spec.email = ["divoxx@gmail.com"]
11
11
 
@@ -18,6 +18,8 @@ Gem::Specification.new do |spec|
18
18
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
19
  spec.require_paths = ["lib"]
20
20
 
21
+ spec.add_dependency "rack"
22
+
21
23
  spec.add_development_dependency "bundler", "~> 1.9"
22
24
  spec.add_development_dependency "rake", "~> 10.0"
23
25
  spec.add_development_dependency "pry", "~> 0.10.1"
@@ -2,6 +2,7 @@
2
2
  require "uri"
3
3
  require "openssl"
4
4
  require "base64"
5
+ require "rack"
5
6
 
6
7
  module Distack
7
8
  module URLSign
@@ -1,4 +1,6 @@
1
1
  module Distack::URLSign
2
+ InvalidSignatureError = Class.new(StandardError)
3
+
2
4
  class Signer
3
5
  KEY_REGEX = /^[0-9A-f]+$/
4
6
 
@@ -12,7 +14,7 @@ module Distack::URLSign
12
14
 
13
15
  def sign(url)
14
16
  if url.opaque
15
- raise "can't sign or verify opaque URL"
17
+ raise "can't sign opaque URL"
16
18
  end
17
19
 
18
20
  chunks = [url.scheme, "#{url.host}:#{url.port}", url.path, url.query, url.userinfo].compact
@@ -22,16 +24,43 @@ module Distack::URLSign
22
24
  signature = Base64.urlsafe_encode64(rawsig)
23
25
 
24
26
  if url.query
25
- q = URI.decode_www_form(url.query)
27
+ q = Rack::Utils.parse_nested_query(url.query)
26
28
  else
27
- q = []
29
+ q = {}
28
30
  end
29
31
 
30
- q << ["_signature", signature]
32
+ q ["_signature"] = signature
31
33
 
32
34
  new_url = url.dup
33
- new_url.query = URI.encode_www_form(q)
35
+ new_url.query = Rack::Utils.build_nested_query(q)
34
36
  new_url
35
37
  end
38
+
39
+ def verify(url)
40
+ if url.opaque
41
+ raise "can't verify opaque URL"
42
+ end
43
+
44
+ q = Rack::Utils.parse_nested_query(url.query)
45
+
46
+ original_q = q.dup
47
+ original_q.delete("_signature")
48
+
49
+ original_qs = Rack::Utils.build_nested_query(original_q)
50
+
51
+ chunks = [url.scheme, "#{url.host}:#{url.port}", url.path, original_qs, url.userinfo].compact
52
+ digest = OpenSSL::Digest.new("sha512")
53
+
54
+ rawsig = OpenSSL::HMAC.digest(digest, @key, chunks.join)
55
+ signature = Base64.urlsafe_encode64(rawsig)
56
+
57
+ if signature == q["_signature"]
58
+ new_url = url.dup
59
+ new_url.query = original_qs
60
+ new_url
61
+ else
62
+ raise InvalidSignatureError, "signature is invalid for #{url}"
63
+ end
64
+ end
36
65
  end
37
66
  end
@@ -1,5 +1,5 @@
1
1
  module Distack
2
- module Urlsign
3
- VERSION = "0.1.0"
2
+ module URLSign
3
+ VERSION = "0.2.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: distack-urlsign
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rodrigo Kochenburger
@@ -10,6 +10,20 @@ bindir: exe
10
10
  cert_chain: []
11
11
  date: 2016-02-19 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rack
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'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement