Last active
August 29, 2015 14:23
-
-
Save billguy/be0f4bd34ca8c3335e6a to your computer and use it in GitHub Desktop.
Basic Duo Security operations in a Rails concern
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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