Skip to content

Instantly share code, notes, and snippets.

@billguy
Last active August 29, 2015 14:23
Show Gist options
  • Save billguy/be0f4bd34ca8c3335e6a to your computer and use it in GitHub Desktop.
Save billguy/be0f4bd34ca8c3335e6a to your computer and use it in GitHub Desktop.
Basic Duo Security operations in a Rails concern
module Duo
require 'duo/duo_api' # https://github.com/duosecurity/duo_api_ruby
extend ActiveSupport::Concern
included do
def duo_username
#whatever...
end
private
def duo_account_id
self.class.duo_api('GET', '/admin/v1/users', { username: duo_username }) do |response|
parsed_response = JSON.parse(response.body, symbolize_names: true)[:response].first
parsed_response ? parsed_response.fetch(:user_id) : nil
end
end
end
module ClassMethods
def duo_client
# assumes some kind of app wide config
@duo_client ||= DuoApi.new(APP_CONFIG['duo_ikey'], APP_CONFIG['duo_skey'], APP_CONFIG['duo_host'])
end
def duo_api(method='GET', uri='/admin/v1/users', params={})
response = duo_client.request(method, uri, params)
raise Net::HTTPBadRequest if response.code == 400
yield(response) if block_given?
rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::HTTPBadRequest, Net::ProtocolError => e
errors.add(:base, e.message)
false
end
def list_duo_accounts
@duo_accounts ||= begin
duo_api('GET', '/admin/v1/users') do |response|
parsed_response = JSON.parse(response.body, symbolize_names: true)[:response]
end
end
end
def duo_accounts_matching_username(regex=//)
list_duo_accounts.select{|duo_account| duo_account[:username].match(regex)}
end
def create_duo_account(duo_username, full_name)
duo_api('POST', '/admin/v1/users', { username: duo_username, email: duo_username, realname: full_name })
end
def update_duo_account(duo_account_id, duo_username, full_name)
duo_api('POST', "/admin/v1/users/#{duo_account_id}", { username: duo_username, email: duo_username, realname: full_name })
end
def activate_duo_account(duo_account_id)
duo_api('POST', "/admin/v1/users/#{duo_account_id}", { status: 'active' })
end
def deactivate_duo_account(duo_account_id)
duo_api('POST', "/admin/v1/users/#{duo_account_id}", { status: 'disabled' })
end
def destroy_duo_account(duo_account_id)
duo_api('DELETE', "/admin/v1/users/#{duo_account_id}")
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment