sf-gdrive 0.1.5 → 0.1.12

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
- SHA1:
3
- metadata.gz: 2e4943733d57b672e338e22561fc187b4149aeee
4
- data.tar.gz: 8ba1765fb57a9cf43e13ec3ef52a007f17be5975
2
+ SHA256:
3
+ metadata.gz: bea772569dca67a5b5866ac45b026b36ba311db4ed71ef32f0e9c9c9eb5bf70c
4
+ data.tar.gz: cf7375758c11b092499ccc115702540f5e3cdcb6b77c94c839fba3c763d5f731
5
5
  SHA512:
6
- metadata.gz: 02ec85d72d0a0def81f77ed3cb09dbe775eaf5e981c740f062013d6c16a99f3f766e460d9d538a70d6da4871e6293e0ab1aa6e3dd2d21ab88e02597d5204707c
7
- data.tar.gz: 1fc1129844ecb70ab34ffd3681bce7ac1ad0f3e9f30effd1ea15369c5c28d7730477682ed0fedd25a266be47d728a7f4bf91985bb55cf26839d5e09ab8aeb44c
6
+ metadata.gz: 1046fdcfbdeb38aed95321e534b1db655cd58b39e21d164f0448f6381c56faefd12daf93ba2eb5c6418f3c3f207f13ec25af481244f34c6a3584617e47de3588
7
+ data.tar.gz: 8228caf3e1213690f96c9b93370e6f5284d0d1edce830c180551664de054c50ea72bf6b67f362586f4b4331e6792e6a5b54a5fbaea648adc6a895308cb8fd35d
@@ -14,19 +14,22 @@ module Gdrive
14
14
  )
15
15
 
16
16
  if request["code"] == nil
17
+ session["redirect_url"] = params[:redirect_url]
17
18
  @auth_uri = auth_client.authorization_uri.to_s
19
+ redirect_to @auth_uri
18
20
  else
19
21
  auth_code = params[:code]
20
22
  auth_client.code = auth_code
21
23
  begin
22
24
  auth_client.fetch_access_token!
23
25
  secret_hash = auth_client.as_json.slice("expiry", "refresh_token", "access_token")
24
- if secret_hash[:refresh_token] == nil
25
- @error = 'You have already authorized this application. In order to re-configure, go to https://myaccount.google.com/permissions and revoke access to "Standard File".'
26
+ if secret_hash["refresh_token"] == nil
27
+ @error = 'You have already authorized this application. In order to re-configure, go to <a href="https://myaccount.google.com/permissions">https://myaccount.google.com/permissions</a> and revoke access to "Standard File".'
26
28
  else
27
29
  secret_hash[:expires_at] = auth_client.expires_at
28
30
  secret = Base64.encode64(secret_hash.to_json)
29
- @secret_url = "#{Gdrive.mount_url}/sync?key=#{secret}"
31
+ @secret_url = CGI.escape("#{Gdrive.mount_url}/sync?key=#{secret}")
32
+ redirect_to "#{session["redirect_url"]}&gdrive_secret_url=#{@secret_url}"
30
33
  end
31
34
  rescue
32
35
  redirect_to(Gdrive.mount_url)
@@ -58,22 +61,17 @@ module Gdrive
58
61
  end
59
62
  end
60
63
 
61
- def sync
62
- client_secrets = Google::APIClient::ClientSecrets.load
63
- client_params = client_secrets.to_authorization.as_json
64
- secret_hash = JSON.parse(Base64.decode64(params[:key]))
65
- client_params.merge!(secret_hash)
66
- auth_client = Signet::OAuth2::Client.new(client_params)
67
- drive = Google::Apis::DriveV3::DriveService.new
68
- drive.authorization = auth_client
69
-
70
- folder_name = "Standard Notes"
64
+ def find_or_create_folder(drive, folder_name, parent_folder)
71
65
  folder_mime = "application/vnd.google-apps.folder"
72
-
73
66
  folder_search = nil
74
67
  begin
75
- folder_search = drive.list_files(q: "mimeType='#{folder_mime}' and name='#{folder_name}'")
76
- rescue
68
+ if parent_folder
69
+ folder_search = drive.list_files(q: "mimeType='#{folder_mime}' and name='#{folder_name}' and parents in '#{parent_folder.id}'")
70
+ else
71
+ folder_search = drive.list_files(q: "mimeType='#{folder_mime}' and name='#{folder_name}'")
72
+ end
73
+ rescue Exception => e
74
+ puts "\n\n find_or_create_folder exception: #{e}\n\n"
77
75
  return
78
76
  end
79
77
 
@@ -84,33 +82,73 @@ module Gdrive
84
82
  name: folder_name,
85
83
  mime_type: folder_mime
86
84
  }
85
+ if parent_folder
86
+ folder_data[:parents] = [parent_folder.id]
87
+ end
87
88
  folder = drive.create_file(folder_data, fields: 'id')
88
89
  end
89
90
 
90
- auth_params = params[:auth_params]
91
+ return folder
92
+ end
93
+
94
+ def sync
95
+ client_secrets = Google::APIClient::ClientSecrets.load
96
+ client_params = client_secrets.to_authorization.as_json
97
+ secret_hash = JSON.parse(Base64.decode64(params[:key]))
98
+ client_params.merge!(secret_hash)
99
+ auth_client = Signet::OAuth2::Client.new(client_params)
100
+ drive = Google::Apis::DriveV3::DriveService.new
101
+ drive.authorization = auth_client
102
+
103
+ parent = nil
104
+ folders = ["Standard Notes", "#{Time.current.year}", "#{DateTime.now.strftime("%B")}"]
105
+ resolved_folders = []
106
+ folders.each do |current_folder_name|
107
+ result = find_or_create_folder(drive, current_folder_name, parent)
108
+ resolved_folders.push(result)
109
+ parent = result
110
+ end
111
+
112
+ folder = resolved_folders.last
91
113
 
92
- self.sync_decrypt_file(drive, folder)
114
+ self.sync_decrypt_file(drive, resolved_folders.first)
93
115
 
116
+ auth_params = params[:auth_params]
94
117
  items = params[:items]
95
118
  if items && items.length > 0
96
- items.each do |item|
97
- tmp = Tempfile.new(item[:uuid])
98
- payload = { "items" => [item]}
99
- payload["auth_params"] = auth_params if auth_params != nil
100
- tmp.write("#{JSON.pretty_generate(payload.as_json)}")
101
- tmp.rewind
102
- file_name = "#{item[:content_type]}-#{item[:uuid]}.txt"
103
- existing = drive.list_files(q: "name = '#{file_name}'")
104
- if existing.files.length > 0
105
- file = existing.files[0]
106
- drive.update_file(file.id, upload_source: tmp.path)
107
- else
108
- file = drive.create_file({:name => file_name, :parents => [folder.id]}, upload_source: tmp.path, content_type: "text/plain")
109
- end
119
+ tmp = Tempfile.new(SecureRandom.hex)
120
+ payload = { "items" => items}
121
+ payload["auth_params"] = auth_params if auth_params != nil
122
+ tmp.write("#{JSON.pretty_generate(payload.as_json)}")
123
+ tmp.rewind
124
+
125
+ file_name = "#{DateTime.now.strftime("%B %-d, %Y").sub(',', '')}.txt"
126
+ existing = drive.list_files(q: "name = '#{file_name}'")
127
+ if existing.files.length > 0
128
+ file = existing.files[0]
129
+ drive.update_file(file.id, upload_source: tmp.path)
130
+ else
131
+ file = drive.create_file({:name => file_name, :parents => [folder.id]}, upload_source: tmp.path, content_type: "text/plain")
110
132
  end
111
133
  end
112
-
134
+ rescue Signet::AuthorizationError => _e
135
+ render(
136
+ json: {
137
+ error: {
138
+ message: 'Could not authorize with Google Drive. Please verify your integration.'
139
+ }
140
+ },
141
+ status: :bad_request
142
+ )
143
+ rescue Google::Apis::Error => _e
144
+ render(
145
+ json: {
146
+ error: {
147
+ message: 'Could not sync with Google Drive. Please verify your integration.'
148
+ }
149
+ },
150
+ status: :bad_request
151
+ )
113
152
  end
114
-
115
153
  end
116
154
  end
@@ -19,7 +19,7 @@
19
19
  <p>That's it! Now, whenever you make changes to a note or tag, it will automatically be synced to your Drive.<p>
20
20
 
21
21
  <% elsif @error %>
22
- <strong style="color: red;">Error:</strong> <%= @error %>
22
+ <strong style="color: red;">Error:</strong> <%= @error.html_safe %>
23
23
  <% else %>
24
24
  <a href="<%= @auth_uri %>">Link Google Drive</a>
25
25
  <% end %>
@@ -1,3 +1,3 @@
1
1
  module Gdrive
2
- VERSION = '0.1.5'
2
+ VERSION = '0.1.12'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sf-gdrive
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - "@StandardNotes"
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-05-02 00:00:00.000000000 Z
11
+ date: 2020-08-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -28,16 +28,16 @@ dependencies:
28
28
  name: google-api-client
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - '='
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: 0.25.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - '='
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: 0.25.0
41
41
  description: Google Drive Extension for Standard File/Standard Notes.
42
42
  email:
43
43
  - mo@standardnotes.org
@@ -69,7 +69,7 @@ files:
69
69
  - lib/tasks/gdrive_tasks.rake
70
70
  homepage: https://standardnotes.org
71
71
  licenses:
72
- - GPLv3
72
+ - GPL-3.0
73
73
  metadata: {}
74
74
  post_install_message:
75
75
  rdoc_options: []
@@ -86,8 +86,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
86
86
  - !ruby/object:Gem::Version
87
87
  version: '0'
88
88
  requirements: []
89
- rubyforge_project:
90
- rubygems_version: 2.4.8
89
+ rubygems_version: 3.0.3
91
90
  signing_key:
92
91
  specification_version: 4
93
92
  summary: Google Drive Extension for Standard File/Standard Notes.