1
0
Fork 0
discourse-custom-wizard-unl.../lib/custom_wizard/pro/authentication.rb
2021-08-18 14:59:43 +08:00

132 Zeilen
Kein EOL
2,8 KiB
Ruby

class CustomWizard::ProAuthentication
include ActiveModel::Serialization
attr_reader :client_id,
:auth_by,
:auth_at,
:api_key
def initialize
api = get_api_key
@api_key = api.key
@auth_at = api.auth_at
@auth_by = api.auth_by
@client_id = get_client_id || set_client_id
end
def active?
@api_key.present?
end
def update(data)
api_key = data[:key]
user_id = data[:user_id]
user = User.find(user_id)
if user&.admin
set_api_key(api_key, user.id)
else
false
end
end
def destroy
remove
end
def generate_keys(user_id, request_id)
rsa = OpenSSL::PKey::RSA.generate(2048)
nonce = SecureRandom.hex(32)
set_keys(request_id, user_id, rsa, nonce)
OpenStruct.new(nonce: nonce, public_key: rsa.public_key)
end
def decrypt_payload(request_id, payload)
keys = get_keys(request_id)
return false unless keys.present? && keys.pem
delete_keys(request_id)
rsa = OpenSSL::PKey::RSA.new(keys.pem)
decrypted_payload = rsa.private_decrypt(Base64.decode64(payload))
return false unless decrypted_payload.present?
begin
data = JSON.parse(decrypted_payload).symbolize_keys
rescue JSON::ParserError
return false
end
return false unless data[:nonce] == keys.nonce
data[:user_id] = keys.user_id
data
end
private
def api_key_db_key
"api_key"
end
def api_client_id_db_key
"api_client_id"
end
def keys_db_key
"keys"
end
def get_api_key
raw = PluginStore.get(CustomWizard::Pro.namespace, api_key_db_key)
OpenStruct.new(
key: raw && raw['key'],
auth_by: raw && raw['auth_by'],
auth_at: raw && raw['auth_at']
)
end
def set_api_key(key, user_id)
PluginStore.set(CustomWizard::Pro.namespace, api_key_db_key,
key: key,
auth_by: user_id,
auth_at: Time.now
)
end
def remove
PluginStore.remove(CustomWizard::Pro.namespace, api_key_db_key)
end
def get_client_id
PluginStore.get(CustomWizard::Pro.namespace, api_client_id_db_key)
end
def set_client_id
client_id = SecureRandom.hex(32)
PluginStore.set(CustomWizard::Pro.namespace, api_client_id_db_key, client_id)
client_id
end
def set_keys(request_id, user_id, rsa, nonce)
PluginStore.set(CustomWizard::Pro.namespace, "#{keys_db_key}_#{request_id}",
user_id: user_id,
pem: rsa.export,
nonce: nonce
)
end
def get_keys(request_id)
raw = PluginStore.get(CustomWizard::Pro.namespace, "#{keys_db_key}_#{request_id}")
OpenStruct.new(
user_id: raw && raw['user_id'],
pem: raw && raw['pem'],
nonce: raw && raw['nonce']
)
end
def delete_keys(request_id)
PluginStore.remove(CustomWizard::Pro.namespace, "#{keys_db_key}_#{request_id}")
end
end