sharepoint_api 2.0.0 → 2.3.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 +4 -4
- data/CHANGELOG.md +10 -1
- data/Gemfile.lock +3 -3
- data/lib/sharepoint_api/file_info.rb +37 -1
- data/lib/sharepoint_api/file_system.rb +30 -24
- data/lib/sharepoint_api/permissions.rb +16 -0
- data/lib/sharepoint_api/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7a9fa238166ddb188042912a71988869b1b443fa55ebd214be69bc6a139f52b4
|
4
|
+
data.tar.gz: db2dd49b85094a1235363c6d0cc6960722d7c4b7400b82d02ce2e1a2f4b44b8b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 697f6dd8982e69879bf30fc086596803ee8198ae52f129286949cbcb728ca2d14491e9ec2416c77a44e380adf86dfbe9175d4c21973be4c1d5790d2324bd5b1c
|
7
|
+
data.tar.gz: e904aae5d3086713aec14cd31a486a1195822fa12d4e76a40e8a598dbf5468aa8d0a904d9469602354e62d2e345366998396fca3157a26cf17fe71d18bf19f92
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,13 @@
|
|
1
|
-
## [2.
|
1
|
+
## [2.3.1] - 2021-11-02
|
2
|
+
* Add ability to rename groups
|
3
|
+
|
4
|
+
## [2.2.0] - 2021-07-06
|
5
|
+
* Use $select queries to vastly speed up FileInfo#version lookup.
|
6
|
+
|
7
|
+
## [2.1.0] - 2021-07-06
|
8
|
+
* Drop feature of add_file creating a folder if one didn't exist as it introduced a security issue where a folder could be created that didn't have access restricted to routing participants.
|
9
|
+
|
10
|
+
## [2.0.0] - 2021-06-28
|
2
11
|
* Update proof-sharepoint-ruby to escape apostrophes.
|
3
12
|
* Change usage of apostrophe escaping.
|
4
13
|
|
data/Gemfile.lock
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
sharepoint_api (2.
|
4
|
+
sharepoint_api (2.3.1)
|
5
5
|
addressable (~> 2.7)
|
6
6
|
proof-sharepoint-ruby (~> 2.0)
|
7
7
|
|
8
8
|
GEM
|
9
9
|
remote: https://rubygems.org/
|
10
10
|
specs:
|
11
|
-
addressable (2.
|
11
|
+
addressable (2.8.0)
|
12
12
|
public_suffix (>= 2.0.2, < 5.0)
|
13
13
|
ast (2.4.1)
|
14
14
|
byebug (11.1.3)
|
@@ -120,4 +120,4 @@ DEPENDENCIES
|
|
120
120
|
sharepoint_api!
|
121
121
|
|
122
122
|
BUNDLED WITH
|
123
|
-
2.2.
|
123
|
+
2.2.29
|
@@ -4,6 +4,31 @@ class SharepointApi
|
|
4
4
|
class FileInfo
|
5
5
|
class FileInfoError < SharepointError; end
|
6
6
|
|
7
|
+
##
|
8
|
+
# Get all data required to build a FileInfo object without subsequent API calls.
|
9
|
+
FILE_SELECT_QUERY_WITH_VERSIONS = begin
|
10
|
+
sub_query = %w[
|
11
|
+
ModifiedBy/LoginName
|
12
|
+
ListItemAllFields/Id
|
13
|
+
Versions/Id
|
14
|
+
Versions/Created
|
15
|
+
Versions/IsCurrentVersion
|
16
|
+
Versions/CreatedBy/LoginName
|
17
|
+
Versions/Url
|
18
|
+
].join(',')
|
19
|
+
"$select=Name,UpdatedAt,MajorVersion,TimeLastModified,#{sub_query}&$expand=#{sub_query}"
|
20
|
+
end.freeze
|
21
|
+
|
22
|
+
##
|
23
|
+
# Get just enough data to build a FileInfo object that suports to_h
|
24
|
+
FILE_SELECT_QUERY = begin
|
25
|
+
sub_query = %w[
|
26
|
+
ModifiedBy/LoginName
|
27
|
+
ListItemAllFields/Id
|
28
|
+
].join(',')
|
29
|
+
"$select=Name,UpdatedAt,MajorVersion,TimeLastModified,Versions,#{sub_query}&$expand=#{sub_query}"
|
30
|
+
end.freeze
|
31
|
+
|
7
32
|
extend Forwardable
|
8
33
|
attr_reader :version, :version_id, :file, :updated_at
|
9
34
|
|
@@ -45,7 +70,7 @@ class SharepointApi
|
|
45
70
|
file_version.id,
|
46
71
|
created_at: Time.parse(file_version.created),
|
47
72
|
current: file_version.is_current_version,
|
48
|
-
creator_login: file_version
|
73
|
+
creator_login: safe_created_by(file_version)&.login_name
|
49
74
|
)
|
50
75
|
end
|
51
76
|
|
@@ -75,5 +100,16 @@ class SharepointApi
|
|
75
100
|
|
76
101
|
raise(FileInfoError, e.message)
|
77
102
|
end
|
103
|
+
|
104
|
+
def safe_created_by(file_version)
|
105
|
+
return file_version.creator if file_version.data['CreatedBy']['__deferred']
|
106
|
+
return file_version.created_by if file_version.data['CreatedBy']['__metadata']
|
107
|
+
|
108
|
+
nil
|
109
|
+
rescue Sharepoint::SPException => e
|
110
|
+
return nil if e.message =~ /User cannot be found/
|
111
|
+
|
112
|
+
raise(FileInfoError, e.message)
|
113
|
+
end
|
78
114
|
end
|
79
115
|
end
|
@@ -9,26 +9,19 @@ class SharepointApi
|
|
9
9
|
def add_file(path, content)
|
10
10
|
folder_path = File.dirname(path)
|
11
11
|
file_name = encode_path(File.basename(path))
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
"/Add(overwrite=true,url='#{file_name}')",
|
19
|
-
content
|
20
|
-
)
|
12
|
+
FileInfo.wrap(
|
13
|
+
site.query(
|
14
|
+
:post,
|
15
|
+
"GetFolderByServerRelativeUrl('#{site_relative_path(folder_path)}')/Files" \
|
16
|
+
"/Add(overwrite=true,url='#{file_name}')?#{FileInfo::FILE_SELECT_QUERY}",
|
17
|
+
content
|
21
18
|
)
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
retry if (retries += 1) < 2
|
29
|
-
log_as(__method__, e, level: :warn)
|
30
|
-
nil
|
31
|
-
end
|
19
|
+
)
|
20
|
+
rescue Sharepoint::SPException => e
|
21
|
+
reraise_if_lock_error(e)
|
22
|
+
|
23
|
+
log_as(__method__, e)
|
24
|
+
nil
|
32
25
|
end
|
33
26
|
|
34
27
|
def file_exists?(path)
|
@@ -39,11 +32,18 @@ class SharepointApi
|
|
39
32
|
false
|
40
33
|
end
|
41
34
|
|
35
|
+
##
|
36
|
+
# Querying a non-existent file will raise a 500 error so we check for existence first.
|
42
37
|
def find_file(path)
|
38
|
+
return nil unless file_exists?(path)
|
39
|
+
|
43
40
|
server_path = server_relative_path(path)
|
44
|
-
|
45
|
-
|
46
|
-
)
|
41
|
+
result = site.query(:get, "GetFileByServerRelativeUrl('#{server_path}')?#{FileInfo::FILE_SELECT_QUERY_WITH_VERSIONS}", nil, true)
|
42
|
+
result = JSON.parse(result)
|
43
|
+
result['d']['Versions'] = Sharepoint::Site.make_object_from_response(site, { 'd' => result['d']['Versions'] })
|
44
|
+
file = Sharepoint::Site.make_object_from_response(site, result)
|
45
|
+
|
46
|
+
FileInfo.wrap(file)
|
47
47
|
rescue Sharepoint::SPException => e
|
48
48
|
log_as(__method__, e)
|
49
49
|
nil
|
@@ -117,8 +117,14 @@ class SharepointApi
|
|
117
117
|
|
118
118
|
def files_in_folder(path)
|
119
119
|
server_path = server_relative_path(path)
|
120
|
-
site.query(:get, "GetFolderByServerRelativeUrl('#{server_path}')/Files")
|
121
|
-
|
120
|
+
result = site.query(:get, "GetFolderByServerRelativeUrl('#{server_path}')/Files?#{FileInfo::FILE_SELECT_QUERY_WITH_VERSIONS}", nil, true)
|
121
|
+
result = JSON.parse(result)
|
122
|
+
result.dig('d', 'results')&.map do |file_result|
|
123
|
+
file_result['Versions'] = Sharepoint::Site.make_object_from_response(site, { 'd' => file_result['Versions'] })
|
124
|
+
end
|
125
|
+
files = Sharepoint::Site.make_object_from_response(site, result)
|
126
|
+
|
127
|
+
files.map { |file| FileInfo.new(file) }
|
122
128
|
rescue Sharepoint::SPException => e
|
123
129
|
log_as(__method__, e)
|
124
130
|
nil
|
@@ -45,6 +45,22 @@ class SharepointApi
|
|
45
45
|
false
|
46
46
|
end
|
47
47
|
|
48
|
+
# to rename a sp group when the acronym changes
|
49
|
+
def rename_group(old_group_name, new_group_name)
|
50
|
+
escaped_group_name = encode_path(old_group_name)
|
51
|
+
site.query(:post, "SiteGroups/GetByName('#{escaped_group_name}')", {
|
52
|
+
'__metadata' => { 'type': 'SP.Group' },
|
53
|
+
'Title' => new_group_name,
|
54
|
+
'Description' => "Access Group for #{new_group_name}"
|
55
|
+
}.to_json) do |curl|
|
56
|
+
curl.headers['X-HTTP-Method'] = 'MERGE'
|
57
|
+
end
|
58
|
+
true
|
59
|
+
rescue Sharepoint::SPException => e
|
60
|
+
log_as(__method__, e)
|
61
|
+
false
|
62
|
+
end
|
63
|
+
|
48
64
|
##
|
49
65
|
# This also removes any role definitions the groups is using.
|
50
66
|
def remove_group(group_name)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sharepoint_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kalek
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2021-
|
13
|
+
date: 2021-11-03 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: addressable
|