Skip to content

Commit f34e2e3

Browse files
committed
Merge pull request 'chore/discourse-plugin' from chore/discourse-plugin into develop
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/onlyoffice-discourse/pulls/5
2 parents 9681350 + 2ac6d58 commit f34e2e3

File tree

9 files changed

+654
-567
lines changed

9 files changed

+654
-567
lines changed

app/controllers/onlyoffice_discourse/onlyoffice_controller.rb

Lines changed: 483 additions & 417 deletions
Large diffs are not rendered by default.
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# frozen_string_literal: true
22
module Onlyoffice
33
class Permission < ActiveRecord::Base
4-
self.table_name = 'onlyoffice_permissions'
4+
self.table_name = "onlyoffice_permissions"
55

66
belongs_to :upload
77
belongs_to :user
@@ -11,7 +11,7 @@ class Permission < ActiveRecord::Base
1111
validates :permission_type, inclusion: { in: %w[viewer editor] }
1212
validates :user_id, uniqueness: { scope: :upload_id }
1313

14-
VIEWER = 'viewer'
15-
EDITOR = 'editor'
14+
VIEWER = "viewer"
15+
EDITOR = "editor"
1616
end
1717
end

db/migrate/20250119160800_create_onlyoffice_permissions.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ def change
44
create_table :onlyoffice_permissions do |t|
55
t.integer :upload_id, null: false
66
t.integer :user_id, null: false
7-
t.string :permission_type, null: false, default: 'viewer'
7+
t.string :permission_type, null: false, default: "viewer"
88
t.timestamps
99
end
1010

11-
add_index :onlyoffice_permissions, [:upload_id, :user_id], unique: true
11+
add_index :onlyoffice_permissions, %i[upload_id user_id], unique: true
1212
add_index :onlyoffice_permissions, :upload_id
1313
add_index :onlyoffice_permissions, :user_id
1414
end

lib/onlyoffice_discourse/onlyoffice_controller_extensions.rb

Lines changed: 75 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@ module Onlyoffice
44
module ControllerExtensions
55
def convert
66
begin
7-
service = Onlyoffice::ConversionService.new(
8-
upload_short_url: params[:upload_short_url],
9-
target_format: params[:target_format]
10-
)
11-
7+
service =
8+
Onlyoffice::ConversionService.new(
9+
upload_short_url: params[:upload_short_url],
10+
target_format: params[:target_format],
11+
)
12+
1213
result = service.convert
1314
render json: result
1415
rescue => e
@@ -18,16 +19,18 @@ def convert
1819

1920
def upload_info
2021
upload_short_url = params[:id]
21-
22+
2223
upload = nil
23-
PrettyText::Helpers.lookup_upload_urls([upload_short_url]).each do |short_url, paths|
24-
if paths[:base62_sha1]
25-
sha1 = Upload.sha1_from_base62_encoded(paths[:base62_sha1])
26-
upload = Upload.find_by(sha1: sha1)
27-
elsif paths[:sha1]
28-
upload = Upload.find_by(sha1: paths[:sha1])
24+
PrettyText::Helpers
25+
.lookup_upload_urls([upload_short_url])
26+
.each do |short_url, paths|
27+
if paths[:base62_sha1]
28+
sha1 = Upload.sha1_from_base62_encoded(paths[:base62_sha1])
29+
upload = Upload.find_by(sha1: sha1)
30+
elsif paths[:sha1]
31+
upload = Upload.find_by(sha1: paths[:sha1])
32+
end
2933
end
30-
end
3134

3235
if upload
3336
render json: { upload_id: upload.id, user_id: upload.user_id }
@@ -39,63 +42,79 @@ def upload_info
3942
def list_permissions
4043
upload = find_upload_by_short_url(params[:id])
4144
return render json: { error: "Upload not found" }, status: :not_found unless upload
42-
return render json: { error: "Access denied" }, status: :forbidden unless can_manage_permissions?(upload)
45+
unless can_manage_permissions?(upload)
46+
return render json: { error: "Access denied" }, status: :forbidden
47+
end
4348

4449
permissions = Onlyoffice::Permission.where(upload_id: upload.id).includes(:user)
45-
50+
4651
render json: {
47-
permissions: permissions.map do |p|
48-
{
49-
id: p.id,
50-
user: {
51-
id: p.user.id,
52-
username: p.user.username,
53-
name: p.user.name,
54-
avatar_template: p.user.avatar_template
55-
},
56-
permission_type: p.permission_type
57-
}
58-
end
59-
}
52+
permissions:
53+
permissions.map do |p|
54+
{
55+
id: p.id,
56+
user: {
57+
id: p.user.id,
58+
username: p.user.username,
59+
name: p.user.name,
60+
avatar_template: p.user.avatar_template,
61+
},
62+
permission_type: p.permission_type,
63+
}
64+
end,
65+
}
6066
end
6167

6268
def create_permission
6369
upload = find_upload_by_short_url(params[:id])
6470
return render json: { error: "Upload not found" }, status: :not_found unless upload
65-
return render json: { error: "Access denied" }, status: :forbidden unless can_manage_permissions?(upload)
71+
unless can_manage_permissions?(upload)
72+
return render json: { error: "Access denied" }, status: :forbidden
73+
end
6674

67-
permission = Onlyoffice::Permission.new(
68-
upload_id: upload.id,
69-
user_id: params[:user_id],
70-
permission_type: params[:permission_type]
71-
)
75+
permission =
76+
Onlyoffice::Permission.new(
77+
upload_id: upload.id,
78+
user_id: params[:user_id],
79+
permission_type: params[:permission_type],
80+
)
7281

7382
if permission.save
7483
render json: { success: true }
7584
else
76-
render json: { error: permission.errors.full_messages.join(", ") }, status: :unprocessable_entity
85+
render json: {
86+
error: permission.errors.full_messages.join(", "),
87+
},
88+
status: :unprocessable_entity
7789
end
7890
end
7991

8092
def update_permission
8193
upload = find_upload_by_short_url(params[:id])
8294
return render json: { error: "Upload not found" }, status: :not_found unless upload
83-
return render json: { error: "Access denied" }, status: :forbidden unless can_manage_permissions?(upload)
95+
unless can_manage_permissions?(upload)
96+
return render json: { error: "Access denied" }, status: :forbidden
97+
end
8498

8599
permission = Onlyoffice::Permission.find_by(id: params[:permission_id], upload_id: upload.id)
86100
return render json: { error: "Permission not found" }, status: :not_found unless permission
87101

88102
if permission.update(permission_type: params[:permission_type])
89103
render json: { success: true }
90104
else
91-
render json: { error: permission.errors.full_messages.join(", ") }, status: :unprocessable_entity
105+
render json: {
106+
error: permission.errors.full_messages.join(", "),
107+
},
108+
status: :unprocessable_entity
92109
end
93110
end
94111

95112
def delete_permission
96113
upload = find_upload_by_short_url(params[:id])
97114
return render json: { error: "Upload not found" }, status: :not_found unless upload
98-
return render json: { error: "Access denied" }, status: :forbidden unless can_manage_permissions?(upload)
115+
unless can_manage_permissions?(upload)
116+
return render json: { error: "Access denied" }, status: :forbidden
117+
end
99118

100119
permission = Onlyoffice::Permission.find_by(id: params[:permission_id], upload_id: upload.id)
101120
return render json: { error: "Permission not found" }, status: :not_found unless permission
@@ -111,43 +130,45 @@ def delete_permission
111130

112131
def find_upload_by_short_url(short_url)
113132
upload = nil
114-
PrettyText::Helpers.lookup_upload_urls([short_url]).each do |_, paths|
115-
if paths[:base62_sha1]
116-
sha1 = Upload.sha1_from_base62_encoded(paths[:base62_sha1])
117-
upload = Upload.find_by(sha1: sha1)
118-
elsif paths[:sha1]
119-
upload = Upload.find_by(sha1: paths[:sha1])
133+
PrettyText::Helpers
134+
.lookup_upload_urls([short_url])
135+
.each do |_, paths|
136+
if paths[:base62_sha1]
137+
sha1 = Upload.sha1_from_base62_encoded(paths[:base62_sha1])
138+
upload = Upload.find_by(sha1: sha1)
139+
elsif paths[:sha1]
140+
upload = Upload.find_by(sha1: paths[:sha1])
141+
end
120142
end
121-
end
122143
upload
123144
end
124145

125146
def check_user_permission(upload, user)
126-
return 'editor' unless upload
127-
147+
return "editor" unless upload
148+
128149
# Owner always has editor rights
129-
return 'editor' if upload.user_id == user.id
130-
150+
return "editor" if upload.user_id == user.id
151+
131152
# Check explicit permissions set by owner
132153
permission = Onlyoffice::Permission.find_by(upload_id: upload.id, user_id: user.id)
133154
return permission.permission_type if permission
134-
155+
135156
# Everyone else (including staff) gets viewer by default
136-
'viewer'
157+
"viewer"
137158
end
138159

139160
def can_manage_permissions?(upload)
140161
return false unless current_user
141-
162+
142163
# Check if user is post author (if post_id provided)
143164
if params[:post_id].present?
144165
post = Post.find_by(id: params[:post_id])
145166
return true if post && post.user_id == current_user.id
146167
end
147-
168+
148169
# Only upload owner can manage permissions
149170
return true if upload.user_id == current_user.id
150-
171+
151172
false
152173
end
153174
end

lib/onlyoffice_discourse/onlyoffice_conversion_service.rb

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,15 @@ def initialize(upload_short_url:, target_format:)
1111

1212
def convert
1313
validate_parameters!
14-
14+
1515
file_url = get_file_url
1616
raise "File not found" if file_url.blank?
1717

1818
full_file_url = build_full_url(file_url)
1919
converted_file_url = request_conversion(full_file_url, file_url)
2020

2121
original_filename = File.basename(file_url, ".*")
22-
{
23-
download_url: converted_file_url,
24-
filename: "#{original_filename}.#{@target_format}"
25-
}
22+
{ download_url: converted_file_url, filename: "#{original_filename}.#{@target_format}" }
2623
end
2724

2825
private
@@ -33,9 +30,9 @@ def validate_parameters!
3330

3431
def get_file_url
3532
file_url = ""
36-
PrettyText::Helpers.lookup_upload_urls([@upload_short_url]).each do |short_url, paths|
37-
file_url = paths[:url]
38-
end
33+
PrettyText::Helpers
34+
.lookup_upload_urls([@upload_short_url])
35+
.each { |short_url, paths| file_url = paths[:url] }
3936
file_url
4037
end
4138

@@ -46,13 +43,13 @@ def build_full_url(file_url)
4643
def request_conversion(full_file_url, file_url)
4744
ds_internal_host = SiteSetting.ONLYOFFICE_Docs_address_for_internal_requests_from_the_server
4845
conversion_url = "#{ds_internal_host}/ConvertService.ashx"
49-
46+
5047
conversion_request = {
5148
url: full_file_url,
5249
outputtype: @target_format,
53-
filetype: File.extname(file_url).delete('.').downcase,
50+
filetype: File.extname(file_url).delete(".").downcase,
5451
title: File.basename(file_url, ".*"),
55-
async: false
52+
async: false,
5653
}
5754

5855
if Onlyoffice::OnlyofficeJwt.enabled?
@@ -61,26 +58,22 @@ def request_conversion(full_file_url, file_url)
6158

6259
uri = URI(conversion_url)
6360
http = Net::HTTP.new(uri.host, uri.port)
64-
http.use_ssl = uri.scheme == 'https'
61+
http.use_ssl = uri.scheme == "https"
6562
http.verify_mode = OpenSSL::SSL::VERIFY_NONE if Rails.env.development?
6663

6764
request = Net::HTTP::Post.new(uri.path)
68-
request['Content-Type'] = 'application/json'
69-
request['Accept'] = 'application/json'
65+
request["Content-Type"] = "application/json"
66+
request["Accept"] = "application/json"
7067
request.body = conversion_request.to_json
7168

7269
response = http.request(request)
7370
result = JSON.parse(response.body)
7471

75-
if result['error']
76-
raise "Conversion failed: #{result['error']}"
77-
end
72+
raise "Conversion failed: #{result["error"]}" if result["error"]
7873

79-
unless result['fileUrl']
80-
raise "Conversion failed: no file URL returned"
81-
end
74+
raise "Conversion failed: no file URL returned" unless result["fileUrl"]
8275

83-
result['fileUrl']
76+
result["fileUrl"]
8477
end
8578
end
8679
end

lib/onlyoffice_discourse/onlyoffice_demo.rb

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,7 @@ class OnlyofficeDemo
1010
def self.demo_data
1111
data_json = PluginStore.get(Onlyoffice::PLUGIN_NAME, "demo_data")
1212

13-
if data_json.nil?
14-
return {
15-
available: true,
16-
enabled: false,
17-
start: nil
18-
}
19-
end
13+
return { available: true, enabled: false, start: nil } if data_json.nil?
2014

2115
data = JSON.parse(data_json, symbolize_names: true)
2216

@@ -56,7 +50,7 @@ def self.enable_demo(value)
5650
data[:saved_settings] = {
5751
address: SiteSetting.ONLYOFFICE_Docs_address,
5852
secret: SiteSetting.ONLYOFFICE_Docs_secret_key,
59-
header: SiteSetting.JWT_header
53+
header: SiteSetting.JWT_header,
6054
}
6155
PluginStore.set(Onlyoffice::PLUGIN_NAME, "demo_data", data.to_json)
6256
end
@@ -69,7 +63,8 @@ def self.enable_demo(value)
6963
else
7064
# Restore saved settings when demo disabled
7165
if data[:saved_settings]
72-
SiteSetting.ONLYOFFICE_Docs_address = data[:saved_settings][:address] || "http://localhost"
66+
SiteSetting.ONLYOFFICE_Docs_address =
67+
data[:saved_settings][:address] || "http://localhost"
7368
SiteSetting.ONLYOFFICE_Docs_secret_key = data[:saved_settings][:secret] || ""
7469
SiteSetting.JWT_header = data[:saved_settings][:header] || "Authorization"
7570

lib/onlyoffice_discourse/onlyoffice_jwt.rb

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# frozen_string_literal: true
22

3-
require 'jwt'
3+
require "jwt"
44

55
module Onlyoffice
66
class OnlyofficeJwt
@@ -10,13 +10,14 @@ def self.enabled?
1010

1111
def self.encode(payload)
1212
return nil unless enabled?
13-
JWT.encode(payload, SiteSetting.ONLYOFFICE_Docs_secret_key, 'HS256')
13+
JWT.encode(payload, SiteSetting.ONLYOFFICE_Docs_secret_key, "HS256")
1414
end
1515

1616
def self.decode(token)
1717
return nil unless enabled? || token.blank?
18-
19-
decoded = JWT.decode(token, SiteSetting.ONLYOFFICE_Docs_secret_key, true, { algorithm: 'HS256' })[0]
18+
19+
decoded =
20+
JWT.decode(token, SiteSetting.ONLYOFFICE_Docs_secret_key, true, { algorithm: "HS256" })[0]
2021
decoded.to_json
2122
rescue JWT::DecodeError => e
2223
Rails.logger.error("JWT decode failed: #{e.message}")

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
"lint:hbs:fix": "ember-template-lint {assets,admin/assets,test}/javascripts/**/*.gjs --fix --no-error-on-unmatched-pattern",
1313
"lint:prettier": "pnpm prettier assets/stylesheets/**/*.scss {assets,admin/assets,test}/javascripts/**/*.js --check --no-error-on-unmatched-pattern",
1414
"lint:prettier:fix": "pnpm prettier assets/stylesheets/**/*.scss {assets,admin/assets,test}/javascripts/**/*.js -w --no-error-on-unmatched-pattern",
15-
"lint:types": "ember-tsc -b"
15+
"lint:ruby": "bundle exec rubocop && bundle exec stree check Gemfile $(git ls-files '*.rb') $(git ls-files '*.rake') $(git ls-files '*.thor')",
16+
"lint:ruby:fix": "bundle exec rubocop -a && bundle exec stree write Gemfile $(git ls-files '*.rb') $(git ls-files '*.rake') $(git ls-files '*.thor')"
1617
},
1718
"devDependencies": {
1819
"@discourse/lint-configs": "2.32.0",

0 commit comments

Comments
 (0)