Skip to content

Commit

Permalink
SECURITY: Improve theme git import (#12694)
Browse files Browse the repository at this point in the history
  • Loading branch information
davidtaylorhq committed Apr 14, 2021
1 parent 0afcf9e commit 9430185
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 1 deletion.
1 change: 1 addition & 0 deletions config/locales/server.en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ en:
about_json_values: "about.json contains invalid values: %{errors}"
modifier_values: "about.json modifiers contain invalid values: %{errors}"
git: "Error cloning git repository, access is denied or repository is not found"
git_ref_not_found: "Unable to checkout git reference: %{ref}"
unpack_failed: "Failed to unpack file"
file_too_big: "The uncompressed file is too big."
unknown_file_type: "The file you uploaded does not appear to be a valid Discourse theme."
Expand Down
11 changes: 10 additions & 1 deletion lib/theme_store/git_importer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,16 @@ def import!
end
if version = Discourse.find_compatible_git_resource(@temp_folder)
Discourse::Utils.execute_command(chdir: @temp_folder) do |runner|
return runner.exec("git cat-file -e #{version} || git fetch --depth 1 $(git rev-parse --symbolic-full-name @{upstream} | awk -F '/' '{print $3}') #{version}; git reset --hard #{version}")
begin
runner.exec "git", "cat-file", "-e", version
rescue RuntimeError => e
tracking_ref = runner.exec "git", "rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{upstream}"
remote_name = tracking_ref.split("/", 2)[0]
runner.exec "git", "fetch", "--depth", "1", remote_name, "#{version}:#{version}"
end
runner.exec "git", "reset", "--hard", version
rescue RuntimeError
raise RemoteTheme::ImportError.new(I18n.t("themes.import_error.git_ref_not_found", ref: version))
end
end
end
Expand Down
8 changes: 8 additions & 0 deletions lib/version.rb
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,14 @@ def self.find_compatible_resource(version_list, version = ::Discourse::VERSION::
checkout_version = target
end

return if checkout_version.nil?

begin
Discourse::Utils.execute_command "git", "check-ref-format", "--allow-onelevel", checkout_version
rescue RuntimeError
raise InvalidVersionListError, "Invalid ref name: #{checkout_version}"
end

checkout_version
end

Expand Down

0 comments on commit 9430185

Please sign in to comment.