import os import emoji from oso_cloud import Oso # Set up the Oso client oso = Oso(url='https://cloud.osohq.com', api_key=os.environ.get('OSO_AUTH')) def check(user, action, resource, context_facts=[]): is_authorized = oso.authorize(user, action, resource, context_facts) icon = emoji.emojize(':cross_mark:') if is_authorized: icon = emoji.emojize(':thumbs_up:') print(f'{icon} {user["id"]} is {"not " if not is_authorized else ""}allowed to {action} {resource["type"]}: {resource["id"]}') def resource(type, identifier): return {'type': type, 'id': str(identifier)} def user(identifier): return resource('User', identifier) def account(identifier): return resource('Account', identifier) def contract(identifier): return resource('Contract', identifier) def account_payee(identifier): return resource('AccountPayee', identifier) def content(identifier): return resource('Content', identifier) def content_type(identifier): return resource('ContentType', identifier) MICHELLE = user('Michelle') ELAINE = user('Elaine') OLIVER = user('Oliver') CONRAD = user('Conrad') PAUL = user('Paul') ALLAN = user('Allan') NATE = user('Nate') USERS = [ MICHELLE, ELAINE, OLIVER, CONRAD, PAUL, ALLAN, NATE, ] ACTIONS = [ 'view', 'create', 'edit', 'review', ] account_1 = account(1) account_222 = account(222) account_888 = account(888) account_999 = account(999) contract_1 = contract(1) contract_1_context_facts = [ ['has_relation', contract_1, 'account', account_1] ] contract_2 = contract(888) contract_2_context_facts = [ ['has_relation', contract_2, 'account', account_888] ] contract_3 = contract(999) contract_3_context_facts = [ ['has_relation', contract_3, 'account', account_999] ] account_payee_1 = account_payee(1) account_payee_1_context_facts = [ ['has_relation', account_payee_1, 'account', account_1] ] account_payee_2 = account_payee(888) account_payee_2_context_facts = [ ['has_relation', account_payee_2, 'account', account_888] ] account_payee_3 = account_payee(999) account_payee_3_context_facts = [ ['has_relation', account_payee_3, 'account', account_999] ] CONTENT_TYPE_DIGITAL_AUDIO = content_type('digital_audio') CONTENT_TYPE_PHYSICAL_AUDIO = content_type('physical_audio') CONTENT_TYPE_PERFORMANCE_RIGHTS = content_type('sr/performance') content_dig_1 = content('digital_audio for account 1') content_dig_1_context_facts = [ ['has_relation', content_dig_1, 'account', account_1], ['has_tag', content_dig_1, 'content_type', CONTENT_TYPE_DIGITAL_AUDIO] ] content_dig_222 = content('digital_audio for account 222') content_dig_222_context_facts = [ ['has_relation', content_dig_222, 'account', account_222], ['has_tag', content_dig_222, 'content_type', CONTENT_TYPE_DIGITAL_AUDIO] ] content_dig_888 = content('digital_audio for account 888') content_dig_888_context_facts = [ ['has_relation', content_dig_888, 'account', account_888], ['has_tag', content_dig_888, 'content_type', CONTENT_TYPE_DIGITAL_AUDIO] ] content_dig_999 = content('digital_audio for account 999') content_dig_999_context_facts = [ ['has_relation', content_dig_999, 'account', account_999], ['has_tag', content_dig_999, 'content_type', CONTENT_TYPE_DIGITAL_AUDIO] ] # Note this shouldn't actually exist because account 999 is FC: digital_audio only content_phys_999 = content('fake physical_audio for account 999') content_phys_999_context_facts = [ ['has_relation', content_phys_999, 'account', account_999], ['has_tag', content_phys_999, 'content_type', CONTENT_TYPE_PHYSICAL_AUDIO] ] content_nr_888 = content('sr/performance for account 888') content_nr_888_context_facts = [ ['has_relation', content_nr_888, 'account', account_888], ['has_tag', content_nr_888, 'content_type', CONTENT_TYPE_PERFORMANCE_RIGHTS] ] RESOURCES = [ (account_1, []), (account_222, []), (account_888, []), (account_999, []), (contract_1, contract_1_context_facts), (contract_2, contract_2_context_facts), (contract_3, contract_3_context_facts), (account_payee_1, account_payee_1_context_facts), (account_payee_2, account_payee_2_context_facts), (account_payee_3, account_payee_3_context_facts), (content_dig_1, content_dig_1_context_facts), (content_dig_222, content_dig_222_context_facts), (content_dig_888, content_dig_888_context_facts), (content_dig_999, content_dig_999_context_facts), (content_phys_999, content_phys_999_context_facts), (content_nr_888, content_nr_888_context_facts), ] def main(): num_checks = 0 for user in USERS: for resource in RESOURCES: for action in ACTIONS: num_checks += 1 check(user, action, resource[0], resource[1]) print(f'Executed {num_checks} authorization checks') if __name__ == "__main__": import timeit print(timeit.timeit("main()", number=1, setup="from __main__ import main"))