drillbit 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/LICENSE.txt +19 -0
  5. data/README.md +2 -0
  6. data/Rakefile +2 -0
  7. data/lib/drillbit.rb +19 -0
  8. data/lib/drillbit/accept_header.rb +50 -0
  9. data/lib/drillbit/authorizable_resource.rb +160 -0
  10. data/lib/drillbit/authorizers/parameters.rb +24 -0
  11. data/lib/drillbit/authorizers/parameters/filtering.rb +50 -0
  12. data/lib/drillbit/authorizers/parameters/resource.rb +11 -0
  13. data/lib/drillbit/authorizers/query.rb +40 -0
  14. data/lib/drillbit/authorizers/scope.rb +30 -0
  15. data/lib/drillbit/configuration.rb +36 -0
  16. data/lib/drillbit/errors/invalid_api_request.rb +29 -0
  17. data/lib/drillbit/errors/invalid_subdomain.rb +29 -0
  18. data/lib/drillbit/errors/invalid_token.rb +22 -0
  19. data/lib/drillbit/matchers/accept_header.rb +16 -0
  20. data/lib/drillbit/matchers/generic.rb +30 -0
  21. data/lib/drillbit/matchers/subdomain.rb +31 -0
  22. data/lib/drillbit/matchers/version.rb +30 -0
  23. data/lib/drillbit/middleware/api_request.rb +49 -0
  24. data/lib/drillbit/parameters.rb +22 -0
  25. data/lib/drillbit/parameters/filter.rb +57 -0
  26. data/lib/drillbit/parameters/index.rb +31 -0
  27. data/lib/drillbit/parameters/page.rb +28 -0
  28. data/lib/drillbit/parameters/sort.rb +32 -0
  29. data/lib/drillbit/requests/base.rb +114 -0
  30. data/lib/drillbit/requests/rack.rb +50 -0
  31. data/lib/drillbit/requests/rails.rb +44 -0
  32. data/lib/drillbit/resource.rb +14 -0
  33. data/lib/drillbit/resource/model.rb +41 -0
  34. data/lib/drillbit/resource/naming.rb +33 -0
  35. data/lib/drillbit/resource/processors/filtering.rb +66 -0
  36. data/lib/drillbit/resource/processors/indexing.rb +40 -0
  37. data/lib/drillbit/resource/processors/paging.rb +46 -0
  38. data/lib/drillbit/resource/processors/sorting.rb +42 -0
  39. data/lib/drillbit/responses/invalid_api_request.rb +18 -0
  40. data/lib/drillbit/responses/invalid_subdomain.rb +18 -0
  41. data/lib/drillbit/responses/invalid_token.rb +20 -0
  42. data/lib/drillbit/serializers/json_api.rb +10 -0
  43. data/lib/drillbit/tokens/base64.rb +45 -0
  44. data/lib/drillbit/tokens/base64s/invalid.rb +14 -0
  45. data/lib/drillbit/tokens/base64s/null.rb +14 -0
  46. data/lib/drillbit/tokens/invalid.rb +26 -0
  47. data/lib/drillbit/tokens/json_web_token.rb +112 -0
  48. data/lib/drillbit/tokens/json_web_tokens/invalid.rb +14 -0
  49. data/lib/drillbit/tokens/json_web_tokens/null.rb +14 -0
  50. data/lib/drillbit/tokens/null.rb +26 -0
  51. data/lib/drillbit/version.rb +4 -0
  52. data/spec/drillbit/accept_header_spec.rb +112 -0
  53. data/spec/drillbit/authorizers/parameters/filtering_spec.rb +71 -0
  54. data/spec/drillbit/authorizers/parameters/resource_spec.rb +12 -0
  55. data/spec/drillbit/authorizers/parameters_spec.rb +17 -0
  56. data/spec/drillbit/authorizers/query_spec.rb +21 -0
  57. data/spec/drillbit/authorizers/scope_spec.rb +20 -0
  58. data/spec/drillbit/errors/invalid_api_request_spec.rb +31 -0
  59. data/spec/drillbit/errors/invalid_subdomain_spec.rb +31 -0
  60. data/spec/drillbit/errors/invalid_token_spec.rb +24 -0
  61. data/spec/drillbit/invalid_subdomain_spec.rb +46 -0
  62. data/spec/drillbit/invalid_token_spec.rb +44 -0
  63. data/spec/drillbit/matchers/accept_header_spec.rb +114 -0
  64. data/spec/drillbit/matchers/subdomain_spec.rb +78 -0
  65. data/spec/drillbit/matchers/version_spec.rb +86 -0
  66. data/spec/drillbit/middleware/api_request_spec.rb +220 -0
  67. data/spec/drillbit/parameters_spec.rb +49 -0
  68. data/spec/drillbit/requests/base_spec.rb +37 -0
  69. data/spec/drillbit/requests/rack_spec.rb +253 -0
  70. data/spec/drillbit/requests/rails_spec.rb +264 -0
  71. data/spec/drillbit/resource/model_spec.rb +64 -0
  72. data/spec/drillbit/resource/processors/filtering_spec.rb +106 -0
  73. data/spec/drillbit/resource/processors/indexing_spec.rb +46 -0
  74. data/spec/drillbit/resource/processors/paging_spec.rb +74 -0
  75. data/spec/drillbit/resource/processors/sorting_spec.rb +66 -0
  76. data/spec/drillbit/tokens/base64_spec.rb +44 -0
  77. data/spec/drillbit/tokens/json_web_token_spec.rb +135 -0
  78. data/spec/fixtures/test_rsa_key +27 -0
  79. data/spec/fixtures/test_rsa_key.pub +9 -0
  80. data/spec/spec_helper.rb +4 -0
  81. data/spec/support/private_keys.rb +42 -0
  82. metadata +244 -0
  83. metadata.gz.sig +0 -0
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+ require 'spec_helper'
3
+ require 'drillbit/resource/processors/paging'
4
+
5
+ module Drillbit
6
+ module Resource
7
+ module Processors
8
+ RSpec.describe Paging do
9
+ let(:paging_resource) { double }
10
+ let(:processed_resource) { double }
11
+
12
+ it 'can return a default page' do
13
+ paging = Paging.new(paging_resource,
14
+ 'page' => {
15
+ 'size' => 10,
16
+ })
17
+
18
+ allow(paging_resource).to receive(:total_pages).and_return 10
19
+ allow(paging_resource).to receive(:current_page).and_return 1
20
+ allow(paging_resource).to receive(:prev_page).and_return nil
21
+ allow(paging_resource).to receive(:next_page).and_return nil
22
+
23
+ allow(paging_resource).to receive(:page).
24
+ with(1).
25
+ and_return paging_resource
26
+ allow(paging_resource).to receive(:per).
27
+ with(10).
28
+ and_return processed_resource
29
+
30
+ expect(paging.processed).to eql processed_resource
31
+ expect(paging.meta).to eql(
32
+ 'total-pages' => 10,
33
+ 'current-page' => 1,
34
+ 'previous-page' => nil,
35
+ 'next-page' => nil,
36
+ )
37
+ end
38
+
39
+ it 'can return a pageed resource' do
40
+ paging = Paging.new(paging_resource,
41
+ 'page' => {
42
+ 'number' => 5,
43
+ 'size' => 10,
44
+ })
45
+
46
+ allow(paging_resource).to receive(:page).
47
+ with(5).
48
+ and_return paging_resource
49
+ allow(paging_resource).to receive(:per).
50
+ with(10).
51
+ and_return processed_resource
52
+
53
+ expect(paging.processed).to eql processed_resource
54
+ end
55
+
56
+ it 'does not consider non-ideomatic page params as valid' do
57
+ paging = Paging.new(paging_resource,
58
+ 'page' => {
59
+ 'nombre' => 5,
60
+ 'tamano' => 10,
61
+ })
62
+
63
+ expect(paging.processed).to eql paging_resource
64
+ end
65
+
66
+ it 'does not do anything if page params are not passed in' do
67
+ paging = Paging.new(paging_resource)
68
+
69
+ expect(paging.processed).to eql paging_resource
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+ require 'spec_helper'
3
+ require 'drillbit/resource/processors/sorting'
4
+
5
+ module Drillbit
6
+ module Resource
7
+ module Processors
8
+ RSpec.describe Sorting do
9
+ let(:sorting_resource) { double }
10
+
11
+ it 'can return an ascending sort' do
12
+ sorting = Sorting.new(sorting_resource, 'sort' => 'my_attribute')
13
+
14
+ allow(sorting_resource).to receive(:order).
15
+ with('my_attribute' => 'asc').
16
+ and_return('sorted')
17
+
18
+ expect(sorting.processed).to eql 'sorted'
19
+ expect(sorting.meta).to eql(
20
+ 'sort' => {
21
+ 'my_attribute' => 'asc',
22
+ },
23
+ )
24
+ end
25
+
26
+ it 'can return a descending sort' do
27
+ sorting = Sorting.new(sorting_resource, 'sort' => '-my_attribute')
28
+
29
+ allow(sorting_resource).to receive(:order).
30
+ with('my_attribute' => 'desc').
31
+ and_return('sorted')
32
+
33
+ expect(sorting.processed).to eql 'sorted'
34
+ expect(sorting.meta).to eql(
35
+ 'sort' => {
36
+ 'my_attribute' => 'desc',
37
+ },
38
+ )
39
+ end
40
+
41
+ it 'can return multiple sorts' do
42
+ sorting = Sorting.new(sorting_resource, 'sort' => '-my_attribute,my_other_attribute')
43
+
44
+ allow(sorting_resource).to receive(:order).
45
+ with('my_attribute' => 'desc',
46
+ 'my_other_attribute' => 'asc').
47
+ and_return('sorted')
48
+
49
+ expect(sorting.processed).to eql 'sorted'
50
+ expect(sorting.meta).to eql(
51
+ 'sort' => {
52
+ 'my_attribute' => 'desc',
53
+ 'my_other_attribute' => 'asc',
54
+ },
55
+ )
56
+ end
57
+
58
+ it 'does not do anything if sorting params are not passed in' do
59
+ sorting = Sorting.new(sorting_resource)
60
+
61
+ expect(sorting.processed).to eql sorting_resource
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+ require 'spec_helper'
3
+ require 'drillbit/tokens/base64'
4
+
5
+ module Drillbit
6
+ module Tokens
7
+ RSpec.describe Base64 do
8
+ it 'is valid' do
9
+ expect(Base64.new(token: 'foo')).to be_valid
10
+ end
11
+
12
+ it 'is not blank' do
13
+ expect(Base64.new(token: 'foo')).not_to be_blank
14
+ end
15
+
16
+ it 'can convert itself into a hash' do
17
+ token = Base64.new(token: 'foo')
18
+
19
+ expect(token.to_h).to eql([
20
+ {
21
+ 'token' => 'foo',
22
+ },
23
+ {
24
+ 'typ' => 'base64',
25
+ },
26
+ ])
27
+ end
28
+
29
+ it 'can convert itself into a null token' do
30
+ token = Base64.convert(raw_token: nil)
31
+
32
+ expect(token).to be_valid
33
+ expect(token).to be_blank
34
+ end
35
+
36
+ it 'can convert itself into an invalid token' do
37
+ token = Base64.convert(raw_token: 'bla.h')
38
+
39
+ expect(token).not_to be_valid
40
+ expect(token).not_to be_blank
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,135 @@
1
+ # frozen_string_literal: true
2
+ require 'spec_helper'
3
+ require 'drillbit/tokens/json_web_token'
4
+
5
+ module Drillbit
6
+ module Tokens
7
+ RSpec.describe JsonWebToken do
8
+ it 'can convert an empty encrypted token' do
9
+ token = JsonWebToken.from_jwe(nil,
10
+ private_key: test_private_key)
11
+
12
+ expect(token).to be_a JsonWebTokens::Null
13
+ end
14
+
15
+ it 'can convert an invalid encrypted token' do
16
+ token = JsonWebToken.from_jwe(invalid_jwe_token,
17
+ private_key: test_private_key)
18
+
19
+ expect(token).to be_a JsonWebTokens::Invalid
20
+ end
21
+
22
+ it 'can verify an expired encrypted token' do
23
+ expired_jwe = valid_jwe_token('exp' => 1.day.ago.to_i,
24
+ 'baz' => 'bar')
25
+ token = JsonWebToken.from_jwe(expired_jwe,
26
+ private_key: test_private_key)
27
+
28
+ expect(token).to be_a JsonWebTokens::Invalid
29
+ end
30
+
31
+ it 'can convert an invalidly signed encrypted token' do
32
+ other_private_key = OpenSSL::PKey::RSA.new(2048)
33
+ token = JsonWebToken.from_jwe(valid_jwe_token,
34
+ private_key: other_private_key)
35
+
36
+ expect(token).to be_a JsonWebTokens::Invalid
37
+ end
38
+
39
+ it 'can convert a valid encrypted token' do
40
+ token = JsonWebToken.from_jwe(valid_jwe_token,
41
+ private_key: test_private_key)
42
+
43
+ expect(token).to be_a JsonWebToken
44
+ expect(token.to_h).to eql([{ 'bar' => 'baz' }, { 'typ' => 'JWT', 'alg' => 'RS256' }])
45
+ end
46
+
47
+ it 'can convert an empty signed token' do
48
+ token = JsonWebToken.from_jws(nil,
49
+ private_key: test_private_key)
50
+
51
+ expect(token).to be_a JsonWebTokens::Null
52
+ end
53
+
54
+ it 'can verify an expired signed token' do
55
+ expired_jws = valid_jws_token('exp' => 1.day.ago.to_i,
56
+ 'baz' => 'bar')
57
+ token = JsonWebToken.from_jws(expired_jws,
58
+ private_key: test_private_key)
59
+
60
+ expect(token).to be_a JsonWebTokens::Invalid
61
+ end
62
+
63
+ it 'can convert an invalidly signed token' do
64
+ other_private_key = OpenSSL::PKey::RSA.new(2048)
65
+ token_signed_with_another_key = JsonWebToken.from_jws(valid_jws_token,
66
+ private_key: other_private_key)
67
+ invalid_token = JsonWebToken.from_jws(invalid_jws_token,
68
+ private_key: test_private_key)
69
+
70
+ expect(token_signed_with_another_key).to be_a JsonWebTokens::Invalid
71
+ expect(invalid_token).to be_a JsonWebTokens::Invalid
72
+ end
73
+
74
+ it 'can convert a valid signed token' do
75
+ token = JsonWebToken.from_jws(valid_jws_token,
76
+ private_key: test_private_key)
77
+
78
+ expect(token).to be_a JsonWebToken
79
+ expect(token.to_h).to eql([{ 'bar' => 'baz' }, { 'typ' => 'JWT', 'alg' => 'RS256' }])
80
+ end
81
+
82
+ it 'can transform into a JWT' do
83
+ token = JsonWebToken.new(data: { 'foo' => 'bar' },
84
+ private_key: test_private_key)
85
+
86
+ jwt = token.to_jwt
87
+ jwt_s = token.to_jwt_s
88
+
89
+ expect(jwt.to_h).to eql('foo' => 'bar')
90
+ expect(jwt_s).to eql('eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJmb28iOiJiYXIifQ.')
91
+ end
92
+
93
+ # rubocop:disable Metrics/LineLength
94
+ it 'can transform into a JWS and back' do
95
+ token = JsonWebToken.new(data: { 'foo' => 'bar' },
96
+ private_key: test_private_key)
97
+
98
+ jws = token.to_jws
99
+ jws_s = token.to_jws_s
100
+
101
+ expect(jws.to_h).to eql('foo' => 'bar')
102
+ expect(jws_s).to eql('eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJmb28iOiJiYXIifQ.DhPBu9Bfha08hSoy1a8Ps5YGxv2_KJCoNALH8dzd8b_VgKCPRQlIaHZwQfS5N1yfZczc2EqXIhPma4I2i-L92oDxyugZYfhMH6XUXSgB6F7SU5WtiglQ8gfgxC_u_K5htD_6zpRaHi6UTNbG8NF3RFBYK9za4GFPPWQawRQpdH2CxjyZP6pilmkynLuKx0OeQbJf1yzdgn1cDt60M8uoZZTzPgoU598ilDjYEETwyGyCi79S3A3ix8oDaJLhM8stPOHLUeglKrkwxOFglzVs7bULjzxZlygZujsHfWu16cjp_P3b4TIH_hiH0-Cjin-EVt4va2TnfGJ8HDxHxzWn7g')
103
+
104
+ converted_token = JsonWebToken.from_jws(jws_s,
105
+ private_key: test_private_key)
106
+
107
+ expect(converted_token.to_h).to eql [
108
+ { 'foo' => 'bar' },
109
+ { 'typ' => 'JWT', 'alg' => 'RS256' },
110
+ ]
111
+ end
112
+ # rubocop:enable Metrics/LineLength
113
+
114
+ # rubocop:disable Metrics/LineLength
115
+ it 'can transform into a JWE and back' do
116
+ token = JsonWebToken.new(data: { 'foo' => 'bar' },
117
+ private_key: test_private_key)
118
+
119
+ jwe = token.to_jwe
120
+ jwe_s = token.to_jwe_s
121
+
122
+ expect(jwe.plain_text).to eql('eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJmb28iOiJiYXIifQ.DhPBu9Bfha08hSoy1a8Ps5YGxv2_KJCoNALH8dzd8b_VgKCPRQlIaHZwQfS5N1yfZczc2EqXIhPma4I2i-L92oDxyugZYfhMH6XUXSgB6F7SU5WtiglQ8gfgxC_u_K5htD_6zpRaHi6UTNbG8NF3RFBYK9za4GFPPWQawRQpdH2CxjyZP6pilmkynLuKx0OeQbJf1yzdgn1cDt60M8uoZZTzPgoU598ilDjYEETwyGyCi79S3A3ix8oDaJLhM8stPOHLUeglKrkwxOFglzVs7bULjzxZlygZujsHfWu16cjp_P3b4TIH_hiH0-Cjin-EVt4va2TnfGJ8HDxHxzWn7g')
123
+
124
+ converted_token = JsonWebToken.from_jwe(jwe_s,
125
+ private_key: test_private_key)
126
+
127
+ expect(converted_token.to_h).to eql [
128
+ { 'foo' => 'bar' },
129
+ { 'typ' => 'JWT', 'alg' => 'RS256' },
130
+ ]
131
+ end
132
+ # rubocop:enable Metrics/LineLength
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,27 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIIEpQIBAAKCAQEAzQNhPtJl68EAoLBh92nBpDlif2M61dS+HBoRinfWT5sD3CeJ
3
+ eMPmlj9vqOdmBzBfMuoHkr3QPVjTAvsTMthoVFKVUEA28eglFABZYP99+VDIKJtr
4
+ rpXMkwjKBXaXP58QZ1bkQfMdNHuKC9xY7w4tpZP3q3PcW7xqI2bR/APQPfW3xfhU
5
+ 8gDAVWkv0+LM76wcGdqfqXd/Z7P9ZtXb74qI575KZR6l+4v22ZYOn0yYL3wc0g3l
6
+ jskF5qeTD4nuSqSzIanYAIo+0jy/BLY9gzFUQPS1Z4INtkEVwX9TO1IpwJvYpqYU
7
+ 0KpJSo5G5eyxM37iQWTTCbmq2byanRLlinXstQIDAQABAoIBAQChO+VBGQubTCEI
8
+ P2/suznVxGPYt9vPzA7v3vioo/LijJGOlXGijr9MrvtMJSCyyrI0QqZOHAYoGTFr
9
+ CLdip5v1pTVU9gvAWMjAYD3q8UTLzWJ9vS4FEj7f7GulvEzbdmfaPhYqX986JWa+
10
+ ST+QUuBHdoW0S9ykMRxwVy8SOpWOA8YqfRbb9J4IYwbYXIDv7yJNE039x3cVqp1Q
11
+ oSoOjW0rka0NObjjEJuJTZKpshze08B6gL1Vi7lcUWyeCXuDbMh18dSGEYU2YN2f
12
+ 9eMLXI981zgBP8BnnR6UuSR2PpsLRSkqC7ZPGZZXC/xP3Ln+I8YPmqMlUDtXeaMf
13
+ zLmBGCoJAoGBAPl1sMFne3E4kFscjyYQytqED2h0DUF4zT4tefUL7wTwsTm6WTgW
14
+ 8xYlegW5kvdFsVq7PM1hLTNKK74QRoHFn+uwyCw9w9/fmU2FJ3BIB4MhFyQRu0MM
15
+ J/3qJHHjILFz+gHYMtxsWEnAviWPPznxR0ocP+6eSE9HerZqOyBnpoP3AoGBANJj
16
+ YDH1K8RneSTYDSqJ93yM2wE+Y0YutOeteJOyOtpA8Xdi7V81BcHo4aemjZ6kyjIF
17
+ KydYbWh/9dekY89QrUOjQOwfFon7Gf3RHZAklgy4Kibkyt29fakP3m+CCdQJhPrM
18
+ y/c5HpCG1M/pyizAg8O3l6bmn4QfNgH+DmOCTdGzAoGAEsvFV60+ZdeHOPY76vhU
19
+ 8IYGyy4DWa2KeWbfy5Dsn4irMdhSpKFGC6MjQI8s/aiopld5S1hJGZY7GYUMavbD
20
+ B/U3/+1fdtzYJjkkMZebyUuS/MrBO1oNIVqlCFe+vOAqND1gB6+6L0Rwj0/tyaXe
21
+ Yz0hrA8ND7wpCNmUPurQZx0CgYEAi3VYJIVx16UHRob4Y0RFCwiLe42RXMpFHHV+
22
+ wdiY7meyKAMpeby57kmimvDqW0i8xt9qNZCGJYj8u0664oeF8pnaxSnuVNRf7EGb
23
+ qRq3ZAMH3fQ3DTk4fMKKHbxDK4yL23u5kE0Kl57onlFItNWAAlJGclnZT0kpEbUI
24
+ cKnFT8UCgYEApdfJ7GCA3vz45AWV9ya16BwfwTcmLnL2YsfbF+d1Rb3Frzl1G+kj
25
+ UG8TuiRAF2oTQSlXaU1118Fty9DN5goC+N8NQuz6neVPD47on8J7BkjtfTVY7Jbi
26
+ hDxOp9E0EpC5EfHarYyfst1/iWQqRbqJZe7414EhAlfL2T5a6Y05j/g=
27
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,9 @@
1
+ -----BEGIN PUBLIC KEY-----
2
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzQNhPtJl68EAoLBh92nB
3
+ pDlif2M61dS+HBoRinfWT5sD3CeJeMPmlj9vqOdmBzBfMuoHkr3QPVjTAvsTMtho
4
+ VFKVUEA28eglFABZYP99+VDIKJtrrpXMkwjKBXaXP58QZ1bkQfMdNHuKC9xY7w4t
5
+ pZP3q3PcW7xqI2bR/APQPfW3xfhU8gDAVWkv0+LM76wcGdqfqXd/Z7P9ZtXb74qI
6
+ 575KZR6l+4v22ZYOn0yYL3wc0g3ljskF5qeTD4nuSqSzIanYAIo+0jy/BLY9gzFU
7
+ QPS1Z4INtkEVwX9TO1IpwJvYpqYU0KpJSo5G5eyxM37iQWTTCbmq2byanRLlinXs
8
+ tQIDAQAB
9
+ -----END PUBLIC KEY-----
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+ require 'rspeckled'
3
+
4
+ Dir[File.expand_path('support/**/*.rb', __dir__)].each { |f| require f }
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+ require 'json/jwt'
3
+ require 'base64'
4
+
5
+ def test_private_key
6
+ OpenSSL::PKey::RSA.new File.read(File.expand_path('../fixtures/test_rsa_key', __dir__))
7
+ end
8
+
9
+ def valid_jws_token(payload = { 'bar' => 'baz' })
10
+ @valid_jws_token ||= begin
11
+ jwt = JSON::JWT.new(payload)
12
+ jws = jwt.sign(test_private_key, :RS256)
13
+
14
+ jws.to_s
15
+ end
16
+ end
17
+
18
+ def valid_jwe_token(payload = { 'bar' => 'baz' })
19
+ @valid_jwe_token ||= begin
20
+ jwt = JSON::JWT.new(payload)
21
+ jws = jwt.sign(test_private_key, :RS256)
22
+ jwe = jws.encrypt(test_private_key, :'RSA-OAEP', :A256GCM)
23
+
24
+ jwe.to_s
25
+ end
26
+ end
27
+
28
+ def invalid_jws_token
29
+ @invalid_jws_token ||= valid_jws_token.tr('a', 'f')
30
+ end
31
+
32
+ def invalid_jwe_token
33
+ @invalid_jwe_token ||= valid_jwe_token.tr('a', 'f')
34
+ end
35
+
36
+ def valid_b64_token(payload = 'hereisacoollittlestring')
37
+ @valid_b64_token ||= Base64.encode64(payload).chomp
38
+ end
39
+
40
+ def invalid_b64_token
41
+ @invalid_b64_token ||= valid_b64_token.tr('abcdefghijklmnop', '$o#m$k#i$g#e$c#a')
42
+ end
metadata ADDED
@@ -0,0 +1,244 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: drillbit
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - thegranddesign
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIDqjCCApKgAwIBAgIBATANBgkqhkiG9w0BAQUFADBNMREwDwYDVQQDDAhydWJ5
14
+ Z2VtczEjMCEGCgmSJomT8ixkARkWE2xpdmluZ2hpZ2hvbnRoZWJsb2cxEzARBgoJ
15
+ kiaJk/IsZAEZFgNjb20wHhcNMTYwNTAxMDIzMDIzWhcNMTcwNTAxMDIzMDIzWjBN
16
+ MREwDwYDVQQDDAhydWJ5Z2VtczEjMCEGCgmSJomT8ixkARkWE2xpdmluZ2hpZ2hv
17
+ bnRoZWJsb2cxEzARBgoJkiaJk/IsZAEZFgNjb20wggEiMA0GCSqGSIb3DQEBAQUA
18
+ A4IBDwAwggEKAoIBAQC/Oxo4PMAOCC3dfzGt7DZJwoDY9MGBXoWkbWIEP91yyKIB
19
+ mWheQ1epDXkj1R6SM1+iclwgUKJQvFrSeD5i1NS9+3qRrD6gPCf3RDAbWNdUpyei
20
+ F/W4+G7eCxGC6FHv7WsBjrGWQVTjZtKYOiQCxwwkPlZSX8aBXViO8D9bZJAURocY
21
+ CbsMGeS0sPISRb0GCnI8VOIoab7GM8tdmIj4Uv0lzp4uOlKRJBss5/Sjp1mjgCvI
22
+ vuXy0X+r1l2xiXL3/uTT/Tch3lPWctEEDw9rUzNz0N5oTGK4vooq4m4AIzU1pa1Z
23
+ ZneO33rn3QVWVpOsK6NQVpBNhSism+Ju1mlvdmKFAgMBAAGjgZQwgZEwCQYDVR0T
24
+ BAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFLpr4AqEQwV9hUch3fxKvCkHUw3i
25
+ MCsGA1UdEQQkMCKBIHJ1YnlnZW1zQGxpdmluZ2hpZ2hvbnRoZWJsb2cuY29tMCsG
26
+ A1UdEgQkMCKBIHJ1YnlnZW1zQGxpdmluZ2hpZ2hvbnRoZWJsb2cuY29tMA0GCSqG
27
+ SIb3DQEBBQUAA4IBAQB5lDS+51DxC1GMpILDt++z5Isx2gSybmGKhNFFWWWo5iVW
28
+ 6jLsj7H1T934Bn31sVET2cvrFGMVLKoitGgZuZPxjzkmm2+TDPbt02ThsLqjsh7W
29
+ 000RFl0u7xJE8dg9y3Kmntar83Mr/Uf1F88/4mQsvGNnxGa39QP9IY4p6FkyEO3L
30
+ RRz+3xE8j0OBl1FNALFtP74/A3zmBRbCizr8En/jbQe/DISJG2o8QOyqm/64uNoy
31
+ zRIv8lqQM8QFT76rzP5SBCERwN+ltKAFbQ5/FwmZNGWYnmCP3RZMQiRnbh+9H9lh
32
+ mlbwaYZTjgsXq6cy8N38EecewgBbZYS1IYJraE/M
33
+ -----END CERTIFICATE-----
34
+ date: 2016-05-01 00:00:00.000000000 Z
35
+ dependencies:
36
+ - !ruby/object:Gem::Dependency
37
+ name: erratum
38
+ requirement: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: '0.0'
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '0.0'
50
+ - !ruby/object:Gem::Dependency
51
+ name: json-jwt
52
+ requirement: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - "~>"
55
+ - !ruby/object:Gem::Version
56
+ version: '1.5'
57
+ type: :runtime
58
+ prerelease: false
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - "~>"
62
+ - !ruby/object:Gem::Version
63
+ version: '1.5'
64
+ - !ruby/object:Gem::Dependency
65
+ name: jwt
66
+ requirement: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - "~>"
69
+ - !ruby/object:Gem::Version
70
+ version: '1.5'
71
+ type: :runtime
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - "~>"
76
+ - !ruby/object:Gem::Version
77
+ version: '1.5'
78
+ - !ruby/object:Gem::Dependency
79
+ name: rspec
80
+ requirement: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - "~>"
83
+ - !ruby/object:Gem::Version
84
+ version: '3.4'
85
+ type: :development
86
+ prerelease: false
87
+ version_requirements: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - "~>"
90
+ - !ruby/object:Gem::Version
91
+ version: '3.4'
92
+ - !ruby/object:Gem::Dependency
93
+ name: rspeckled
94
+ requirement: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - "~>"
97
+ - !ruby/object:Gem::Version
98
+ version: '0.0'
99
+ type: :development
100
+ prerelease: false
101
+ version_requirements: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - "~>"
104
+ - !ruby/object:Gem::Version
105
+ version: '0.0'
106
+ description: ''
107
+ email: rubygems@livinghighontheblog.com
108
+ executables: []
109
+ extensions: []
110
+ extra_rdoc_files: []
111
+ files:
112
+ - LICENSE.txt
113
+ - README.md
114
+ - Rakefile
115
+ - lib/drillbit.rb
116
+ - lib/drillbit/accept_header.rb
117
+ - lib/drillbit/authorizable_resource.rb
118
+ - lib/drillbit/authorizers/parameters.rb
119
+ - lib/drillbit/authorizers/parameters/filtering.rb
120
+ - lib/drillbit/authorizers/parameters/resource.rb
121
+ - lib/drillbit/authorizers/query.rb
122
+ - lib/drillbit/authorizers/scope.rb
123
+ - lib/drillbit/configuration.rb
124
+ - lib/drillbit/errors/invalid_api_request.rb
125
+ - lib/drillbit/errors/invalid_subdomain.rb
126
+ - lib/drillbit/errors/invalid_token.rb
127
+ - lib/drillbit/matchers/accept_header.rb
128
+ - lib/drillbit/matchers/generic.rb
129
+ - lib/drillbit/matchers/subdomain.rb
130
+ - lib/drillbit/matchers/version.rb
131
+ - lib/drillbit/middleware/api_request.rb
132
+ - lib/drillbit/parameters.rb
133
+ - lib/drillbit/parameters/filter.rb
134
+ - lib/drillbit/parameters/index.rb
135
+ - lib/drillbit/parameters/page.rb
136
+ - lib/drillbit/parameters/sort.rb
137
+ - lib/drillbit/requests/base.rb
138
+ - lib/drillbit/requests/rack.rb
139
+ - lib/drillbit/requests/rails.rb
140
+ - lib/drillbit/resource.rb
141
+ - lib/drillbit/resource/model.rb
142
+ - lib/drillbit/resource/naming.rb
143
+ - lib/drillbit/resource/processors/filtering.rb
144
+ - lib/drillbit/resource/processors/indexing.rb
145
+ - lib/drillbit/resource/processors/paging.rb
146
+ - lib/drillbit/resource/processors/sorting.rb
147
+ - lib/drillbit/responses/invalid_api_request.rb
148
+ - lib/drillbit/responses/invalid_subdomain.rb
149
+ - lib/drillbit/responses/invalid_token.rb
150
+ - lib/drillbit/serializers/json_api.rb
151
+ - lib/drillbit/tokens/base64.rb
152
+ - lib/drillbit/tokens/base64s/invalid.rb
153
+ - lib/drillbit/tokens/base64s/null.rb
154
+ - lib/drillbit/tokens/invalid.rb
155
+ - lib/drillbit/tokens/json_web_token.rb
156
+ - lib/drillbit/tokens/json_web_tokens/invalid.rb
157
+ - lib/drillbit/tokens/json_web_tokens/null.rb
158
+ - lib/drillbit/tokens/null.rb
159
+ - lib/drillbit/version.rb
160
+ - spec/drillbit/accept_header_spec.rb
161
+ - spec/drillbit/authorizers/parameters/filtering_spec.rb
162
+ - spec/drillbit/authorizers/parameters/resource_spec.rb
163
+ - spec/drillbit/authorizers/parameters_spec.rb
164
+ - spec/drillbit/authorizers/query_spec.rb
165
+ - spec/drillbit/authorizers/scope_spec.rb
166
+ - spec/drillbit/errors/invalid_api_request_spec.rb
167
+ - spec/drillbit/errors/invalid_subdomain_spec.rb
168
+ - spec/drillbit/errors/invalid_token_spec.rb
169
+ - spec/drillbit/invalid_subdomain_spec.rb
170
+ - spec/drillbit/invalid_token_spec.rb
171
+ - spec/drillbit/matchers/accept_header_spec.rb
172
+ - spec/drillbit/matchers/subdomain_spec.rb
173
+ - spec/drillbit/matchers/version_spec.rb
174
+ - spec/drillbit/middleware/api_request_spec.rb
175
+ - spec/drillbit/parameters_spec.rb
176
+ - spec/drillbit/requests/base_spec.rb
177
+ - spec/drillbit/requests/rack_spec.rb
178
+ - spec/drillbit/requests/rails_spec.rb
179
+ - spec/drillbit/resource/model_spec.rb
180
+ - spec/drillbit/resource/processors/filtering_spec.rb
181
+ - spec/drillbit/resource/processors/indexing_spec.rb
182
+ - spec/drillbit/resource/processors/paging_spec.rb
183
+ - spec/drillbit/resource/processors/sorting_spec.rb
184
+ - spec/drillbit/tokens/base64_spec.rb
185
+ - spec/drillbit/tokens/json_web_token_spec.rb
186
+ - spec/fixtures/test_rsa_key
187
+ - spec/fixtures/test_rsa_key.pub
188
+ - spec/spec_helper.rb
189
+ - spec/support/private_keys.rb
190
+ homepage:
191
+ licenses:
192
+ - MIT
193
+ metadata: {}
194
+ post_install_message:
195
+ rdoc_options: []
196
+ require_paths:
197
+ - lib
198
+ required_ruby_version: !ruby/object:Gem::Requirement
199
+ requirements:
200
+ - - ">="
201
+ - !ruby/object:Gem::Version
202
+ version: '0'
203
+ required_rubygems_version: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - ">="
206
+ - !ruby/object:Gem::Version
207
+ version: '0'
208
+ requirements: []
209
+ rubyforge_project:
210
+ rubygems_version: 2.5.1
211
+ signing_key:
212
+ specification_version: 4
213
+ summary: APIs Need Love Too
214
+ test_files:
215
+ - spec/drillbit/accept_header_spec.rb
216
+ - spec/drillbit/authorizers/parameters/filtering_spec.rb
217
+ - spec/drillbit/authorizers/parameters/resource_spec.rb
218
+ - spec/drillbit/authorizers/parameters_spec.rb
219
+ - spec/drillbit/authorizers/query_spec.rb
220
+ - spec/drillbit/authorizers/scope_spec.rb
221
+ - spec/drillbit/errors/invalid_api_request_spec.rb
222
+ - spec/drillbit/errors/invalid_subdomain_spec.rb
223
+ - spec/drillbit/errors/invalid_token_spec.rb
224
+ - spec/drillbit/invalid_subdomain_spec.rb
225
+ - spec/drillbit/invalid_token_spec.rb
226
+ - spec/drillbit/matchers/accept_header_spec.rb
227
+ - spec/drillbit/matchers/subdomain_spec.rb
228
+ - spec/drillbit/matchers/version_spec.rb
229
+ - spec/drillbit/middleware/api_request_spec.rb
230
+ - spec/drillbit/parameters_spec.rb
231
+ - spec/drillbit/requests/base_spec.rb
232
+ - spec/drillbit/requests/rack_spec.rb
233
+ - spec/drillbit/requests/rails_spec.rb
234
+ - spec/drillbit/resource/model_spec.rb
235
+ - spec/drillbit/resource/processors/filtering_spec.rb
236
+ - spec/drillbit/resource/processors/indexing_spec.rb
237
+ - spec/drillbit/resource/processors/paging_spec.rb
238
+ - spec/drillbit/resource/processors/sorting_spec.rb
239
+ - spec/drillbit/tokens/base64_spec.rb
240
+ - spec/drillbit/tokens/json_web_token_spec.rb
241
+ - spec/fixtures/test_rsa_key
242
+ - spec/fixtures/test_rsa_key.pub
243
+ - spec/spec_helper.rb
244
+ - spec/support/private_keys.rb