sufia 7.4.0 → 7.4.1

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: 021661f3b93bbd570debcb9a59ee80d99ec25fbe
4
- data.tar.gz: 5d6f072cc58068f6536d91110c1f884706424ac6
3
+ metadata.gz: 6c8f5591add2605e15e1672bc6667a31ddfe5b8f
4
+ data.tar.gz: 63262f7ca069a856cc3aff1f8b5572e067d2f45b
5
5
  SHA512:
6
- metadata.gz: 977dde46e20ed18f04b5c49742df41f1b305bacb9539b2f7b00c2489809ccdcfaada9754d5163dfffb63e33363c8c5f49edca80bca72c8fd095e0bb26528b550
7
- data.tar.gz: 629cc054b61b16d450731260b3e764db87f63a348242dc7761987252946b0bccee118a25bc043523c136a397f88cf08e7b4c21aa385749f9fadd2e9442db561b
6
+ metadata.gz: 5bb4673648eca734f7a73ce87ad6bd5431020f7e941996cdfc1a8d753411fd8d46c39db23e65b39466f6b1a9738a0ef63aeb073cb555802ae2d596794da63195
7
+ data.tar.gz: e028b8e41dcedbd32274d2b3eb3f54f8c0bf3407a936da99ba4d429053624b79dc27506e629439cd4b00de0a11ff6660db2bc15e20f0a5baa4b6a0c09d3c3398
data/README.md CHANGED
@@ -12,7 +12,7 @@ Docs: [![Documentation Status](https://inch-ci.org/github/samvera/sufia.svg?bran
12
12
  [![Contribution Guidelines](http://img.shields.io/badge/CONTRIBUTING-Guidelines-blue.svg)](./.github/CONTRIBUTING.md)
13
13
  [![Apache 2.0 License](http://img.shields.io/badge/APACHE2-license-blue.svg)](./LICENSE)
14
14
 
15
- Jump in: [![Slack Status](http://slack.projecthydra.org/badge.svg)](http://slack.projecthydra.org/)
15
+ Jump in: [![Slack Status](http://slack.samvera.org/badge.svg)](http://slack.samvera.org/)
16
16
  [![Ready Tickets](https://badge.waffle.io/samvera/sufia.png?label=ready&title=Ready)](https://waffle.io/samvera/sufia)
17
17
 
18
18
  # Table of Contents
@@ -41,7 +41,7 @@ Jump in: [![Slack Status](http://slack.projecthydra.org/badge.svg)](http://slack
41
41
 
42
42
  # What is Sufia?
43
43
 
44
- Sufia uses the full power of [Hydra](http://projecthydra.org/) and extends it to provide a user interface around common repository features and social features (see below). Sufia offers self-deposit and proxy deposit workflows, and mediated deposit workflows are being developed in a community sprint running from September-December 2016. Sufia delivers its rich and growing set of features via a modern, responsive user interface. It is implemented as a Rails engine, so it is meant to be added to existing Rails apps.
44
+ Sufia uses the full power of [Samvera](http://samvera.org/) and extends it to provide a user interface around common repository features and social features (see below). Sufia offers self-deposit and proxy deposit workflows, and mediated deposit workflows are being developed in a community sprint running from September-December 2016. Sufia delivers its rich and growing set of features via a modern, responsive user interface. It is implemented as a Rails engine, so it is meant to be added to existing Rails apps.
45
45
 
46
46
  ## Feature list
47
47
 
@@ -51,12 +51,12 @@ For non-technical documentation about Sufia, see its [documentation site](http:/
51
51
 
52
52
  # Help
53
53
 
54
- If you have questions or need help, please email [the Hydra community tech list](mailto:hydra-tech@googlegroups.com) or stop by the #dev channel in [the Hydra community Slack team](https://wiki.duraspace.org/pages/viewpage.action?pageId=43910187#Getintouch!-Slack).
54
+ If you have questions or need help, please email [the Samvera community tech list](mailto:samvera-tech@googlegroups.com) or stop by the #dev channel in [the Samvera community Slack team](https://wiki.duraspace.org/pages/viewpage.action?pageId=43910187#Getintouch!-Slack).
55
55
 
56
56
  # Getting started
57
57
 
58
58
  This document contains instructions specific to setting up an app with __Sufia
59
- v7.4.0__. If you are looking for instructions on installing a different
59
+ v7.4.1__. If you are looking for instructions on installing a different
60
60
  version, be sure to select the appropriate branch or tag from the drop-down
61
61
  menu above.
62
62
 
@@ -211,9 +211,9 @@ See the [release management process](https://github.com/samvera/sufia/wiki/Relea
211
211
 
212
212
  # Acknowledgments
213
213
 
214
- This software has been developed by and is brought to you by the Hydra community. Learn more at the
215
- [Project Hydra website](http://projecthydra.org/).
214
+ This software has been developed by and is brought to you by the Samvera community. Learn more at the
215
+ [Samvera website](http://samvera.org/).
216
216
 
217
- ![Project Hydra Logo](http://sufia.io/assets/images/hydra_logo.png)
217
+ ![Samvera Logo](http://sufia.io/assets/images/samvera_logo.png)
218
218
 
219
219
  The Sufia logo uses the Hong Kong Hustle font, thanks to [Iconian's](http://www.iconian.com/) non-commercial use policy.
@@ -19,6 +19,10 @@ module Sufia
19
19
  return true unless remote_files
20
20
  remote_files.each do |file_info|
21
21
  next if file_info.blank? || file_info[:url].blank?
22
+ unless validate_remote_url(file_info[:url])
23
+ Rails.logger.error "User #{user.user_key} attempted to ingest file from url #{file_info[:url]}, which doesn't pass validation"
24
+ return false
25
+ end
22
26
  create_file_from_url(file_info[:url], file_info[:file_name])
23
27
  end
24
28
  true
@@ -44,5 +48,23 @@ module Sufia
44
48
  CurationConcerns::Operation.create!(user: user,
45
49
  operation_type: "Attach Remote File")
46
50
  end
51
+
52
+ def validate_remote_url(url)
53
+ uri = URI.parse(URI.encode(url))
54
+ if uri.scheme == 'file'
55
+ path = File.absolute_path(URI.decode(uri.path))
56
+ whitelisted_ingest_dirs.any? do |dir|
57
+ path.start_with?(dir) && path.length > dir.length
58
+ end
59
+ else
60
+ # TODO: It might be a good idea to validate other URLs as well.
61
+ # The server can probably access URLs the user can't.
62
+ true
63
+ end
64
+ end
65
+
66
+ def whitelisted_ingest_dirs
67
+ Sufia.config.whitelisted_ingest_dirs
68
+ end
47
69
  end
48
70
  end
@@ -101,6 +101,22 @@ Sufia.config do |config|
101
101
  # If you use a multi-server architecture, this MUST be a shared volume.
102
102
  # config.derivatives_path = File.join(Rails.root, 'tmp', 'derivatives')
103
103
 
104
+ ## Whitelist all directories which can be used to ingest from the local file
105
+ # system.
106
+ #
107
+ # Any file, and only those, that is anywhere under one of the specified
108
+ # directories can be used by CreateWithRemoteFilesActor to add local files
109
+ # to works. Files uploaded by the user are handled separately and the
110
+ # temporary directory for those need not be included here.
111
+ #
112
+ # Default value includes BrowseEverything.config['file_system'][:home] if it
113
+ # is set, otherwise default is an empty list. You should only need to change
114
+ # this if you have custom ingestions using CreateWithRemoteFilesActor to
115
+ # ingest files from the file system that are not part of the BrowseEverything
116
+ # mount point.
117
+ #
118
+ # config.whitelisted_ingest_dirs = []
119
+
104
120
  # If browse-everything has been configured, load the configs. Otherwise, set to nil.
105
121
  begin
106
122
  if defined? BrowseEverything
@@ -155,5 +155,16 @@ module Sufia
155
155
  def model_to_create
156
156
  @model_to_create ||= ->(_attributes) { Sufia.primary_work_type.model_name.name }
157
157
  end
158
+
159
+ attr_writer :whitelisted_ingest_dirs
160
+ # List of directories which can be used for local file system ingestion.
161
+ def whitelisted_ingest_dirs
162
+ @whitelisted_ingest_dirs ||= \
163
+ if defined? BrowseEverything
164
+ Array.wrap(BrowseEverything.config['file_system'].try(:[], :home)).compact
165
+ else
166
+ []
167
+ end
168
+ end
158
169
  end
159
170
  end
@@ -1,3 +1,3 @@
1
1
  module Sufia
2
- VERSION = '7.4.0'.freeze
2
+ VERSION = '7.4.1'.freeze
3
3
  end
@@ -51,11 +51,27 @@ describe Sufia::CreateWithRemoteFilesActor do
51
51
  file_name: "here.txt" }]
52
52
  end
53
53
 
54
+ before do
55
+ allow(Sufia.config).to receive(:whitelisted_ingest_dirs).and_return(["/local/file/"])
56
+ end
57
+
54
58
  it "attaches files" do
55
59
  expect(IngestLocalFileJob).to receive(:perform_later).with(FileSet, "/local/file/here.txt", user)
56
60
  expect(actor.create(attributes)).to be true
57
61
  end
58
62
 
63
+ context "with files from non-whitelisted directories" do
64
+ let(:file) { "file:///local/otherdir/test.txt" }
65
+
66
+ # rubocop:disable RSpec/AnyInstance
67
+ it "doesn't attach files" do
68
+ expect_any_instance_of(described_class).to receive(:validate_remote_url).and_call_original
69
+ expect(IngestLocalFileJob).not_to receive(:perform_later)
70
+ expect(actor.create(attributes)).to be false
71
+ end
72
+ # rubocop:enable RSpec/AnyInstance
73
+ end
74
+
59
75
  context "with spaces" do
60
76
  let(:file) { "file:///local/file/ pigs .txt" }
61
77
  it "attaches files" do
@@ -64,4 +80,26 @@ describe Sufia::CreateWithRemoteFilesActor do
64
80
  end
65
81
  end
66
82
  end
83
+
84
+ describe "#validate_remote_url" do
85
+ before do
86
+ allow(Sufia.config).to receive(:whitelisted_ingest_dirs).and_return(['/test/', '/local/file/'])
87
+ end
88
+
89
+ it "accepts file: urls in whitelisted directories" do
90
+ expect(actor.actor.send(:validate_remote_url, "file:///local/file/test.txt")).to be true
91
+ expect(actor.actor.send(:validate_remote_url, "file:///local/file/subdirectory/test.txt")).to be true
92
+ expect(actor.actor.send(:validate_remote_url, "file:///test/test.txt")).to be true
93
+ end
94
+
95
+ it "rejects file: urls outside whitelisted directories" do
96
+ expect(actor.actor.send(:validate_remote_url, "file:///tmp/test.txt")).to be false
97
+ expect(actor.actor.send(:validate_remote_url, "file:///test/../tmp/test.txt")).to be false
98
+ expect(actor.actor.send(:validate_remote_url, "file:///test/")).to be false
99
+ end
100
+
101
+ it "accepts other types of urls" do
102
+ expect(actor.actor.send(:validate_remote_url, "https://example.com/test.txt")).to be true
103
+ end
104
+ end
67
105
  end
@@ -28,4 +28,5 @@ describe Sufia::Configuration do
28
28
  it { is_expected.to respond_to(:contact_email) }
29
29
  it { is_expected.to respond_to(:subject_prefix) }
30
30
  it { is_expected.to respond_to(:model_to_create) }
31
+ it { is_expected.to respond_to(:whitelisted_ingest_dirs) }
31
32
  end
@@ -1,4 +1,4 @@
1
- gem 'sufia', '7.4.0'
1
+ gem 'sufia', '7.4.1'
2
2
 
3
3
  run 'bundle install'
4
4
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sufia
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.4.0
4
+ version: 7.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Coyne
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2017-09-07 00:00:00.000000000 Z
15
+ date: 2017-10-10 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: hydra-works
@@ -1769,7 +1769,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1769
1769
  version: '0'
1770
1770
  requirements: []
1771
1771
  rubyforge_project:
1772
- rubygems_version: 2.5.2
1772
+ rubygems_version: 2.6.10
1773
1773
  signing_key:
1774
1774
  specification_version: 4
1775
1775
  summary: Sufia was originally extracted from ScholarSphere developed by Penn State