riiif 0.2.4 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d27a0256321086b2506eff19730afe79b72e198f
4
- data.tar.gz: 7e4673c9759001f4176228c80d91c40f9afed2ca
3
+ metadata.gz: ba70ff2bc96642dfaef0a13aa368721e64d819b9
4
+ data.tar.gz: f2211f18a7da732e70f6151b907c6cbf66d2a88a
5
5
  SHA512:
6
- metadata.gz: 5c38c62c7772d793ddc74250b89d98b8d694a09f871f77e848d7d26da24b02e3d34305cb9543f6c03b02facf11249229414ba28f359b01cef3972bc73c74587f
7
- data.tar.gz: c1a52a6d8ace9585c4d4d267c175d7ab2a8ba227762860e627dc6ecd4cd2db047de4612a5f90b5d1696139a93bbec97276a1d5b5b9c807a3fa3b864415a7a5df
6
+ metadata.gz: a593880f25ace996a90457cf99aaba644fc4c4410622e4203f3e968609d598ffd1080b33698e45d9de3b9f63be76b836b89b12a236c49e5bfb9c231e2b8dcaeb
7
+ data.tar.gz: b560c0e4f6bb82d44c671f1c32a0ddf24eb6aeac633357aa9e0885886e247a6e987055c629b2ef618499c486f9c1c80d5c285bda00ee972a81a6070e66d1cdc5
data/README.md CHANGED
@@ -101,6 +101,25 @@ You can do this to create a default Riiif::Image to use (useful for passing "mis
101
101
  Riiif::Image.new('no_image', Riiif::File.new(Riiif.not_found_image))
102
102
  ```
103
103
 
104
+ ## Authorization
105
+
106
+ The controller will call an authorization service with the controller context. This service must have a method `can?(action, image)` which returns a boolean. The default service is the `RIIIF::NilAuthrorizationService` which permits all requests.
107
+
108
+ In this example we've dissallowed all requests:
109
+
110
+ ```ruby
111
+ class NoService
112
+ def initalize(controller)
113
+ end
114
+
115
+ def can?(action, image)
116
+ false
117
+ end
118
+ end
119
+
120
+ Riiif::Image.authorization_service = NoService
121
+ ```
122
+
104
123
  ## Integration with Hydra/Fedora
105
124
 
106
125
  Create an initializer like this in `config/initializers/riiif_initializer.rb`
@@ -9,15 +9,17 @@ module Riiif
9
9
  def show
10
10
  begin
11
11
  image = model.new(image_id)
12
- status = :ok
12
+ status = if authorization_service.can?(:show, image)
13
+ :ok
14
+ else
15
+ :unauthorized
16
+ end
13
17
  rescue ImageNotFoundError
14
- if Riiif.not_found_image.present?
15
- image = model.new(image_id, Riiif::File.new(Riiif.not_found_image))
16
- status = :not_found
17
- else
18
- raise
19
- end
18
+ status = :not_found
20
19
  end
20
+
21
+ image = not_found_image unless status == :ok
22
+
21
23
  data = image.render(params.permit(:region, :size, :rotation, :quality, :format))
22
24
  headers['Access-Control-Allow-Origin'] = '*'
23
25
  send_data data,
@@ -28,8 +30,12 @@ module Riiif
28
30
 
29
31
  def info
30
32
  image = model.new(image_id)
31
- headers['Access-Control-Allow-Origin'] = '*'
32
- render json: image.info.merge(server_info), content_type: 'application/ld+json'
33
+ if authorization_service.can?(:info, image)
34
+ headers['Access-Control-Allow-Origin'] = '*'
35
+ render json: image.info.merge(server_info), content_type: 'application/ld+json'
36
+ else
37
+ render json: { error: 'unauthorized' }, status: :unauthorized
38
+ end
33
39
  end
34
40
 
35
41
  # this is a workaround for https://github.com/rails/rails/issues/25087
@@ -50,10 +56,19 @@ module Riiif
50
56
  params[:id]
51
57
  end
52
58
 
59
+ def authorization_service
60
+ model.authorization_service.new(self)
61
+ end
62
+
53
63
  def link_header
54
64
  response.headers["Link"] = "<#{LEVEL1}>;rel=\"profile\""
55
65
  end
56
66
 
67
+ def not_found_image
68
+ raise "Not found image doesn't exist" unless Riiif.not_found_image
69
+ model.new(image_id, Riiif::File.new(Riiif.not_found_image))
70
+ end
71
+
57
72
  CONTEXT = '@context'
58
73
  CONTEXT_URI = 'http://iiif.io/api/image/2/context.json'
59
74
  ID = '@id'
@@ -2,8 +2,9 @@ require 'digest/md5'
2
2
  module Riiif
3
3
  class Image
4
4
 
5
- class_attribute :file_resolver, :info_service
5
+ class_attribute :file_resolver, :info_service, :authorization_service
6
6
  self.file_resolver = FileSystemFileResolver.new
7
+ self.authorization_service = NilAuthorizationService
7
8
 
8
9
  # this is the default info service
9
10
  # returns a hash with the original image dimensions.
@@ -0,0 +1,10 @@
1
+ module Riiif
2
+ class NilAuthorizationService
3
+ def initialize(_controller)
4
+ end
5
+
6
+ def can?(_action, _object)
7
+ true
8
+ end
9
+ end
10
+ end
data/lib/riiif/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Riiif
2
- VERSION = "0.2.4"
2
+ VERSION = "0.3.0"
3
3
  end
data/lib/riiif.rb CHANGED
@@ -8,6 +8,7 @@ module Riiif
8
8
  autoload :HTTPFileResolver
9
9
  autoload :Routes
10
10
  autoload :AkubraSystemFileResolver
11
+ autoload :NilAuthorizationService
11
12
 
12
13
  class Error < RuntimeError; end
13
14
  class InvalidAttributeError < Error; end
@@ -6,7 +6,7 @@ describe Riiif::ImagesController do
6
6
  routes { Riiif::Engine.routes }
7
7
 
8
8
  describe "#show" do
9
- it "should send images to the service" do
9
+ it "sends images to the service" do
10
10
  image = double
11
11
  expect(Riiif::Image).to receive(:new).with('abcd1234').and_return(image)
12
12
  expect(image).to receive(:render).with("region" => 'full', "size" => 'full',
@@ -20,6 +20,21 @@ describe Riiif::ImagesController do
20
20
  expect(response.headers['Access-Control-Allow-Origin']).to eq '*'
21
21
  end
22
22
 
23
+ context "with an unauthorized image" do
24
+ let(:auth) { double("no auth service", can?: false) }
25
+ let(:not_found_image) { double("not_found_image", render: 'test data') }
26
+ before do
27
+ allow(controller).to receive(:authorization_service).and_return(auth)
28
+ allow(controller).to receive(:not_found_image).and_return(not_found_image)
29
+ end
30
+ it "renders 401" do
31
+ get :show, id: 'abcd1234', action: "show", region: 'full', size: 'full',
32
+ rotation: '0', quality: 'default', format: 'jpg'
33
+ expect(response.body).to eq "test data"
34
+ expect(response.code).to eq "401"
35
+ end
36
+ end
37
+
23
38
  context "with a invalid region" do
24
39
  it "renders 400" do
25
40
  image = double("an image")
@@ -89,21 +104,35 @@ describe Riiif::ImagesController do
89
104
  end
90
105
  end
91
106
 
92
- it "returns info" do
93
- image = double
94
- expect(Riiif::Image).to receive(:new).with('abcd1234').and_return(image)
95
- expect(image).to receive(:info).and_return({width: 6000, height: 4000 })
96
- get :info, id: 'abcd1234', format: 'json'
97
- expect(response).to be_successful
98
- json = JSON.parse(response.body)
99
- expect(json).to eq "@context" => "http://iiif.io/api/image/2/context.json",
100
- "@id" =>"http://test.host/images/abcd1234",
101
- "width" =>6000,
102
- "height" =>4000,
103
- "profile" => ["http://iiif.io/api/image/2/level1.json", "formats" => ["jpg", "png"]],
104
- 'protocol' => 'http://iiif.io/api/image'
105
- expect(response.headers['Link']).to eq '<http://iiif.io/api/image/2/level1.json>;rel="profile"'
106
- expect(response.headers['Content-Type']).to eq 'application/ld+json; charset=utf-8'
107
- expect(response.headers['Access-Control-Allow-Origin']).to eq '*'
107
+ describe "info" do
108
+ it "returns info" do
109
+ image = double
110
+ expect(Riiif::Image).to receive(:new).with('abcd1234').and_return(image)
111
+ expect(image).to receive(:info).and_return({width: 6000, height: 4000 })
112
+ get :info, id: 'abcd1234', format: 'json'
113
+ expect(response).to be_successful
114
+ json = JSON.parse(response.body)
115
+ expect(json).to eq "@context" => "http://iiif.io/api/image/2/context.json",
116
+ "@id" =>"http://test.host/images/abcd1234",
117
+ "width" =>6000,
118
+ "height" =>4000,
119
+ "profile" => ["http://iiif.io/api/image/2/level1.json", "formats" => ["jpg", "png"]],
120
+ 'protocol' => 'http://iiif.io/api/image'
121
+ expect(response.headers['Link']).to eq '<http://iiif.io/api/image/2/level1.json>;rel="profile"'
122
+ expect(response.headers['Content-Type']).to eq 'application/ld+json; charset=utf-8'
123
+ expect(response.headers['Access-Control-Allow-Origin']).to eq '*'
124
+ end
125
+
126
+ context "with an unauthorized image" do
127
+ let(:auth) { double("no auth service", can?: false) }
128
+ before do
129
+ allow(controller).to receive(:authorization_service).and_return(auth)
130
+ end
131
+ it "renders 401" do
132
+ get :info, id: 'abcd1234', format: 'json'
133
+ expect(response.body).to eq "{\"error\":\"unauthorized\"}"
134
+ expect(response.code).to eq "401"
135
+ end
136
+ end
108
137
  end
109
138
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: riiif
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Coyne
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-20 00:00:00.000000000 Z
11
+ date: 2016-06-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -118,6 +118,7 @@ files:
118
118
  - lib/riiif/engine.rb
119
119
  - lib/riiif/file_system_file_resolver.rb
120
120
  - lib/riiif/http_file_resolver.rb
121
+ - lib/riiif/nil_authorization_service.rb
121
122
  - lib/riiif/rails/routes.rb
122
123
  - lib/riiif/routes.rb
123
124
  - lib/riiif/version.rb