Initial commit

This commit is contained in:
Yaser
2026-08-13 19:50:53 +03:30
commit 38084458fe
879 changed files with 95198 additions and 0 deletions

69
lib/peatio/vault/totp.rb Normal file
View File

@@ -0,0 +1,69 @@
# frozen_string_literal: true
require 'vault'
module Vault
# Vault::TOTP helper
module TOTP
Error = Class.new(StandardError)
class << self
def server_available?
read_data('sys/health').present?
rescue StandardError
false
end
def validate?(uid, code)
write_data(totp_code_key(uid), code: code).data[:valid]
end
def with_human_error
raise ArgumentError, 'Block is required' unless block_given?
yield
rescue Vault::VaultError => e
::Rails.logger.error { e }
if e.message.include?('connection refused')
raise Error, '2FA server is under maintenance'
end
if e.message.include?('code already used')
raise Error, 'This code was already used. Wait until the next time period'
end
raise e
end
private
def totp_key(uid)
"totp/keys/#{Vault.application}_#{uid}"
end
def totp_code_key(uid)
"totp/code/#{Vault.application}_#{uid}"
end
def read_data(key)
with_human_error do
vault.read(key)
end
end
def read_code(uid)
read_data(totp_code_key(uid)).data[:code]
end
def write_data(key, params)
with_human_error do
vault.write(key, params)
end
end
def vault
Vault.logical
end
end
end
end

View File

@@ -0,0 +1,108 @@
# frozen_string_literal: true
require 'vault'
module Vault
class TOTPAction
Error = Class.new(StandardError)
ISSUER_NAME = 'Dena'
attr_reader :action
def initialize(action)
raise 'Please determine action for totp code' if action.blank?
@action = action
end
def server_available?
read_data('sys/health').present?
rescue StandardError
false
end
def otp_secret(otp)
CGI.parse(URI.parse(otp.data[:url]).query)['secret'][0]
end
def safe_create(uid, email)
return if exist?(uid)
create(uid, email)
end
def create(uid, email, period: '360')
write_data(totp_key(uid),
generate: true,
issuer: ::Peatio::App.config.app_name,
period: period, account_name: email, qr_size: 300)
end
def exist?(uid)
read_data(totp_key(uid)).present?
end
def validate?(uid, code)
return false unless exist?(uid)
result = write_data(totp_code_key(uid), code: code)
return false unless result
result.data[:valid]
end
def safe_validate?(uid, code)
return false unless exist?(uid)
code == read_code(uid)
end
def delete(uid)
delete_data(totp_key(uid))
end
def with_human_error
raise ArgumentError, 'Block is required' unless block_given?
yield
rescue Vault::VaultError => e
::Rails.logger.error { e }
false
end
def totp_key(uid)
"totp/keys/#{Vault.application}_#{@action}_#{uid}"
end
def totp_code_key(uid)
"totp/code/#{Vault.application}_#{@action}_#{uid}"
end
def read_data(key)
with_human_error do
vault.read(key)
end
end
def read_code(uid)
read_data(totp_code_key(uid)).data[:code]
end
def write_data(key, params)
with_human_error { vault.write(key, params) }
end
def delete_data(key)
with_human_error do
vault.delete(key)
end
end
def vault
Vault.logical
end
end
end