diff options
| -rw-r--r-- | app/models/project.rb | 3 | ||||
| -rw-r--r-- | app/models/project_import_data.rb | 2 | ||||
| -rw-r--r-- | db/migrate/20160302152808_remove_wrong_import_url_from_projects.rb | 26 | ||||
| -rw-r--r-- | lib/gitlab/import_url.rb | 1 |
4 files changed, 26 insertions, 6 deletions
diff --git a/app/models/project.rb b/app/models/project.rb index 4e5fa8821ea..242ad19b115 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -406,6 +406,7 @@ class Project < ActiveRecord::Base def import_url=(value) import_url = Gitlab::ImportUrl.new(value) + # deletes any existing import_data create_import_data(credentials: import_url.credentials) super(import_url.sanitized_url) end @@ -450,7 +451,7 @@ class Project < ActiveRecord::Base def safe_import_url result = URI.parse(self.import_url) result.password = '*****' unless result.password.nil? - result.user = '*****' unless result.user.nil? #tokens or other data may be saved as user + result.user = '*****' unless result.user.nil? || result.user == "git" #tokens or other data may be saved as user result.to_s rescue self.import_url diff --git a/app/models/project_import_data.rb b/app/models/project_import_data.rb index f3b9daa0d1a..420c01f9960 100644 --- a/app/models/project_import_data.rb +++ b/app/models/project_import_data.rb @@ -12,7 +12,7 @@ require 'file_size_validator' class ProjectImportData < ActiveRecord::Base belongs_to :project - attr_encrypted :credentials, key: Gitlab::Application.secrets.db_key_base, marshal: true, encode: true + attr_encrypted :credentials, key: Gitlab::Application.secrets.db_key_base, marshal: true, encode: true, :mode => :per_attribute_iv_and_salt serialize :data, JSON diff --git a/db/migrate/20160302152808_remove_wrong_import_url_from_projects.rb b/db/migrate/20160302152808_remove_wrong_import_url_from_projects.rb index fd718ef3974..0f7da3103b8 100644 --- a/db/migrate/20160302152808_remove_wrong_import_url_from_projects.rb +++ b/db/migrate/20160302152808_remove_wrong_import_url_from_projects.rb @@ -6,25 +6,43 @@ class RemoveWrongImportUrlFromProjects < ActiveRecord::Migration class FakeProjectImportData extend AttrEncrypted attr_accessor :credentials - attr_encrypted :credentials, key: Gitlab::Application.secrets.db_key_base, marshal: true, encode: true + attr_encrypted :credentials, key: Gitlab::Application.secrets.db_key_base, marshal: true, encode: true, :mode => :per_attribute_iv_and_salt end def up + byebug projects_with_wrong_import_url do |project| import_url = Gitlab::ImportUrl.new(project["import_url"]) ActiveRecord::Base.transaction do - execute("UPDATE projects SET import_url = '#{quote(import_url.sanitized_url)}' WHERE id = #{project['id']}") + execute("UPDATE projects SET import_url = #{quote(import_url.sanitized_url)} WHERE id = #{project['id']}") fake_import_data = FakeProjectImportData.new fake_import_data.credentials = import_url.credentials - execute("UPDATE project_import_data SET encrypted_credentials = '#{quote(fake_import_data.encrypted_credentials)}' WHERE project_id = #{project['id']}") + project_import_data = project_import_data(project['id']) + if project_import_data + execute(update_import_data_sql(project_import_data['id'], fake_import_data)) + else + execute(insert_import_data_sql(project['id'], fake_import_data)) + end end end end + def insert_import_data_sql(project_id, fake_import_data) + %( INSERT into project_import_data (encrypted_credentials, project_id, encrypted_credentials_iv, encrypted_credentials_salt) VALUES ( #{quote(fake_import_data.encrypted_credentials)}, '#{project_id}', #{quote(fake_import_data.encrypted_credentials_iv)}, #{quote(fake_import_data.encrypted_credentials_salt)})) + end + + def update_import_data_sql(id, fake_import_data) + %( UPDATE project_import_data SET encrypted_credentials = #{quote(fake_import_data.encrypted_credentials)}, encrypted_credentials_iv = #{quote(fake_import_data.encrypted_credentials_iv)}, encrypted_credentials_salt = #{quote(fake_import_data.encrypted_credentials_salt)} WHERE id = '#{id}') + end + def projects_with_wrong_import_url # TODO Check live with #operations for possible false positives. Also, consider regex? But may have issues MySQL/PSQL - select_all("SELECT p.id, p.import_url FROM projects p WHERE p.import_url IS NOT NULL AND (p.import_url LIKE '%//%:%@%' OR p.import_url LIKE '#{"_"*40}@github.com%')") + select_all("SELECT p.id, p.import_url FROM projects p WHERE p.import_url IS NOT NULL AND (p.import_url LIKE '%//%:%@%' OR p.import_url LIKE 'https___#{"_"*40}@github.com%')") + end + + def project_import_data(project_id) + select_one("SELECT id FROM project_import_data WHERE project_id = '#{project_id}'") end def quote(value) diff --git a/lib/gitlab/import_url.rb b/lib/gitlab/import_url.rb index 7358edac2ee..aa430920252 100644 --- a/lib/gitlab/import_url.rb +++ b/lib/gitlab/import_url.rb @@ -20,6 +20,7 @@ module Gitlab private def generate_full_url + return @url unless @credentials @full_url = @url.dup @full_url.user = @credentials[:user] @full_url.password = @credentials[:password] |
