Page MenuHomeGRNET

vima.rb
No OneTemporary

File Metadata

Created
Sun, May 18, 6:10 PM
## -*- encoding : utf-8 -*-
require 'oauth2'
Warden::Strategies.add(:vima) do
Key = Rails.application.secrets.oauth2_vima_client_id
Secret = Rails.application.secrets.oauth2_vima_secret
def valid?
params['vima'] || params['error'] || params['code']
end
def client
OAuth2::Client.new(
Key,
Secret,
site: 'https://vima.grnet.gr',
token_url: "/o/token",
authorize_url: "/o/authorize",
:ssl => {:ca_path => "/etc/ssl/certs"}
)
end
def redirect_uri
uri = URI.parse(request.url)
uri.scheme = 'https' unless Rails.env.development?
uri.path = '/vima'
uri.query = nil
uri.to_s
end
def redirect_to_vima
redirect! client.auth_code.authorize_url(:redirect_uri => redirect_uri, scope: 'read')
end
def authenticate!
if !Archiving::settings[:vima_oauth_enabled]
return fail!("ViMa is temporarily disabled")
end
if params['error']
Rails.logger.warn("WARDEN: ERROR #{params['error']}")
return fail!("ViMa log in failed: #{params['error']}")
end
return redirect_to_vima if params['vima']
access_token = client.auth_code.get_token(
params['code'],
{ :redirect_uri => redirect_uri },
{ :mode => :query, :param_name => "access_token", :header_format => "" })
user_data = access_token.get(
'https://vima.grnet.gr/user/details',
{ mode: :query, param_name: 'access_token' }
).parsed.deep_symbolize_keys
if [user_data[:username], user_data[:email], user_data[:id]].any?(&:blank?)
return fail!("ViMa login failed: no user data")
end
###### TBR
# temporary, for user migration
user = User.find_or_initialize_by(username: user_data[:username],
email: user_data[:email])
user.identifier = "vima:#{user_data[:id]}"
######
# actual implementation
#user = User.find_or_initialize_by(identifier: user_data[:identifier])
if !user.enabled? && user.persisted?
return fail!('Service not available')
end
user.login_at = Time.now
if user.new_record?
user.enabled = true
# TBR
user.identifier = "vima:#{user_data[:id]}"
user.vima!
else
user.save!
end
if user.refetch_hosts?
vms = fetch_vms(access_token)[:response][:instances]
user.hosts_updated_at = Time.now
user.save
end
vms ||= user.hosts.pluck(:fqdn)
assign_vms(user, vms)
success!(user)
end
def fetch_vms(access_token)
Rails.logger.warn("ViMa: fetching vms")
vms = access_token.get(
'https://vima.grnet.gr/instances/list?tag=vima:service:archiving',
{ mode: :query, param_name: 'access_token' }
).parsed.deep_symbolize_keys
if vms[:response][:errors] != false
Rails.logger.warn("ViMa: errors on instances/list response for user #{vms[:user][:username]}")
end
vms
end
def assign_vms(user, vms)
Rails.logger.warn("ViMa: user: #{user.username}")
Rails.logger.warn("ViMa: vms: #{vms}")
Rails.logger.warn("ViMa: session vms: #{session[:vms]}")
session[:vms] = vms.first(50)
Host.where(fqdn: vms).each do |host|
host.users << user unless host.users.include?(user)
end
end
end

Event Timeline