Class: DuoApi::Admin

Inherits:
DuoApi show all
Defined in:
lib/duo_api/admin.rb

Overview

Duo Admin API (duo.com/docs/adminapi)

Constant Summary

Constants inherited from DuoApi

BACKOFF_FACTOR, INITIAL_BACKOFF_WAIT_SECS, MAX_BACKOFF_WAIT_SECS, VERSION

Instance Attribute Summary

Attributes inherited from DuoApi

#ca_file, #default_params

Instance Method Summary collapse

Methods inherited from DuoApi

#delete, #get, #get_all, #get_image, #initialize, #post, #put, #request

Constructor Details

This class inherits a constructor from DuoApi

Instance Method Details

#add_administrative_unit_admin(admin_unit_id:, admin_id:) ⇒ Object



634
635
636
# File 'lib/duo_api/admin.rb', line 634

def add_administrative_unit_admin(admin_unit_id:, admin_id:)
  post("/admin/v1/administrative_units/#{admin_unit_id}/admin/#{admin_id}")[:response]
end

#add_administrative_unit_group(admin_unit_id:, group_id:) ⇒ Object



642
643
644
# File 'lib/duo_api/admin.rb', line 642

def add_administrative_unit_group(admin_unit_id:, group_id:)
  post("/admin/v1/administrative_units/#{admin_unit_id}/group/#{group_id}")[:response]
end

#add_administrative_unit_integration(admin_unit_id:, integration_key:) ⇒ Object



650
651
652
# File 'lib/duo_api/admin.rb', line 650

def add_administrative_unit_integration(admin_unit_id:, integration_key:)
  post("/admin/v1/administrative_units/#{admin_unit_id}/integration/#{integration_key}")[:response]
end

#add_custom_branding_draft_user(user_id:) ⇒ Object



778
779
780
# File 'lib/duo_api/admin.rb', line 778

def add_custom_branding_draft_user(user_id:)
  post("/admin/v1/branding/draft/users/#{user_id}")[:response]
end

#add_user_group(user_id:, group_id:) ⇒ Object



90
91
92
93
# File 'lib/duo_api/admin.rb', line 90

def add_user_group(user_id:, group_id:)
  params = { group_id: group_id }
  post("/admin/v1/users/#{user_id}/groups", params)[:response]
end

#add_user_hardware_token(user_id:, token_id:) ⇒ Object



116
117
118
119
# File 'lib/duo_api/admin.rb', line 116

def add_user_hardware_token(user_id:, token_id:)
  params = { token_id: token_id }
  post("/admin/v1/users/#{user_id}/tokens", params)[:response]
end

#add_user_phone(user_id:, phone_id:) ⇒ Object



103
104
105
106
# File 'lib/duo_api/admin.rb', line 103

def add_user_phone(user_id:, phone_id:)
  params = { phone_id: phone_id }
  post("/admin/v1/users/#{user_id}/phones", params)[:response]
end

#block_registered_device(compkey:) ⇒ Object



494
495
496
# File 'lib/duo_api/admin.rb', line 494

def block_registered_device(compkey:)
  post("/admin/v1/registered_devices/blocked/#{compkey}")[:response]
end

#block_registered_devices(registered_device_key_list:) ⇒ Object



489
490
491
492
# File 'lib/duo_api/admin.rb', line 489

def block_registered_devices(registered_device_key_list:)
  params = { registered_device_key_list: registered_device_key_list }
  post('/admin/v1/registered_devices/blocked', params)[:response]
end

#bulk_create_users(users:) ⇒ Object



33
34
35
36
37
38
# File 'lib/duo_api/admin.rb', line 33

def bulk_create_users(users:)
  # Each user hash in users array requires :username and supports the following
  # optional keys: realname, emaiml, status, notes, firstname, lastname
  params = { users: json_serialized_array(users) }
  post('/admin/v1/users/bulk_create', params)[:response]
end

#bulk_operations(operations:) ⇒ Object

Bulk Operations



151
152
153
154
155
156
157
158
159
160
161
162
163
# File 'lib/duo_api/admin.rb', line 151

def bulk_operations(operations:)
  # Each hash in user_operations array requires :method, :path, and :body
  # Each :body has the same parameter requirements as the individual operation
  # Supported operations:
  #   Create User:       POST /admin/v1/users
  #   Modify User:       POST /admin/v1/users/[user_id]
  #   Delete User:     DELETE /admin/v1/users/[user_id]
  #   Add User Group:    POST /admin/v1/users/[user_id]/groups
  #   Remove User Group: POST /admin/v1/users/[user_id]/groups/[group_id]
  operations.each{ |o| o[:body][:aliases] = serialized_aliases(o[:body][:aliases]) if o[:body][:aliases] }
  params = { operations: json_serialized_array(operations) }
  post('/admin/v1/bulk', params)[:response]
end

#bulk_restore_users(user_id_list:) ⇒ Object



40
41
42
43
# File 'lib/duo_api/admin.rb', line 40

def bulk_restore_users(user_id_list:)
  params = { user_id_list: json_serialized_array(user_id_list) }
  post('/admin/v1/users/bulk_restore', params)[:response]
end

#bulk_trash_users(user_id_list:) ⇒ Object



45
46
47
48
# File 'lib/duo_api/admin.rb', line 45

def bulk_trash_users(user_id_list:)
  params = { user_id_list: json_serialized_array(user_id_list) }
  post('/admin/v1/users/bulk_send_to_trash', params)[:response]
end

#calculate_policy(user_id:, integration_key:) ⇒ Object



421
422
423
424
# File 'lib/duo_api/admin.rb', line 421

def calculate_policy(user_id:, integration_key:)
  params = { user_id: user_id, integration_key: integration_key }
  get('/admin/v2/policies/calculate', params)[:response]
end

#clear_admin_inactivity(admin_id:) ⇒ Object



550
551
552
# File 'lib/duo_api/admin.rb', line 550

def clear_admin_inactivity(admin_id:)
  post("/admin/v1/admins/#{admin_id}/clear_inactivity")[:response]
end

#copy_policy(policy_key:, **optional_params) ⇒ Object



426
427
428
429
430
# File 'lib/duo_api/admin.rb', line 426

def copy_policy(policy_key:, **optional_params)
  # optional_params: new_policy_names_list
  params = optional_params.merge({ policy_key: policy_key })
  post('/admin/v2/policies/copy', params)[:response]
end

#create_activation_url(phone_id:, **optional_params) ⇒ Object



222
223
224
225
# File 'lib/duo_api/admin.rb', line 222

def create_activation_url(phone_id:, **optional_params)
  # optional_params: valid_secs, install
  post("/admin/v1/phones/#{phone_id}/activation_url", optional_params)[:response]
end

#create_admin(email:, name:, **optional_params) ⇒ Object



527
528
529
530
531
# File 'lib/duo_api/admin.rb', line 527

def create_admin(email:, name:, **optional_params)
  # optional_params: phone, role, restricted_by_admin_units, send_email, token_id, valid_days
  params = optional_params.merge({ email: email, name: name })
  post('/admin/v1/admins', params)[:response]
end

#create_administrative_unit(name:, description:, restrict_by_groups:, **optional_params) ⇒ Object



621
622
623
624
625
626
# File 'lib/duo_api/admin.rb', line 621

def create_administrative_unit(name:, description:, restrict_by_groups:, **optional_params)
  # optional_params: restrict_by_integrations, admins, groups, integrations
  params = optional_params.merge({ name: name, description: description,
                                   restrict_by_groups: restrict_by_groups })
  post('/admin/v1/administrative_units', params)[:response]
end


554
555
556
# File 'lib/duo_api/admin.rb', line 554

def create_existing_admin_activation_link(admin_id:)
  post("/admin/v1/admins/#{admin_id}/activation_link")[:response]
end

#create_group(name:, **optional_params) ⇒ Object



173
174
175
176
177
# File 'lib/duo_api/admin.rb', line 173

def create_group(name:, **optional_params)
  # optional_params: desc, status
  params = optional_params.merge({ name: name })
  post('/admin/v1/groups', params)[:response]
end

#create_integration(name:, type:, **optional_params) ⇒ Object



348
349
350
351
352
353
354
355
356
357
358
359
# File 'lib/duo_api/admin.rb', line 348

def create_integration(name:, type:, **optional_params)
  # optional_params: adminapi_admins, adminapi_admins_read, adminapi_allow_to_set_permissions,
  #                  adminapi_info, adminapi_integrations, adminapi_read_log,
  #                  adminapi_read_resource, adminapi_settings, adminapi_write_resource,
  #                  enroll_policy, greeting, groups_allowed, ip_whitelist,
  #                  ip_whitelist_enroll_policy, networks_for_api_access, notes,
  #                  trusted_device_days, self_service_allowed, sso, username_normalization_policy
  #
  #      sso params: https://duo.com/docs/adminapi#sso-parameters
  params = optional_params.merge({ name: name, type: type })
  post('/admin/v3/integrations', params)[:response]
end


566
567
568
569
570
# File 'lib/duo_api/admin.rb', line 566

def create_new_admin_activation_link(email:, **optional_params)
  # optional_params: admin_name, admin_role, send_email, valid_days
  params = optional_params.merge({ email: email })
  post('/admin/v1/admins/activations', params)[:response]
end

#create_phone(**optional_params) ⇒ Object



204
205
206
207
# File 'lib/duo_api/admin.rb', line 204

def create_phone(**optional_params)
  # optional_params: number, name, extension, type, platform, predelay, postdelay
  post('/admin/v1/phones', optional_params)[:response]
end

#create_policy(policy_name:, **optional_params) ⇒ Object



432
433
434
435
436
# File 'lib/duo_api/admin.rb', line 432

def create_policy(policy_name:, **optional_params)
  # optional_params: apply_to_apps, apply_to_groups_in_apps, sections
  params = optional_params.merge({ policy_name: policy_name })
  post('/admin/v2/policies', params)[:response]
end

#create_shared_desktop_authenticator(group_id_list:, trusted_endpoint_integration_id_list:, **optional_params) ⇒ Object



306
307
308
309
310
311
312
313
314
# File 'lib/duo_api/admin.rb', line 306

def create_shared_desktop_authenticator(group_id_list:, trusted_endpoint_integration_id_list:,
                                        **optional_params)
  # optional_params: active, name
  params = optional_params.merge({
    group_id_list: group_id_list,
    trusted_endpoint_integration_id_list: trusted_endpoint_integration_id_list
  })
  post('/admin/v1/desktop_authenticators/shared_device_auth', params)[:response]
end

#create_token(type:, serial:, **optional_params) ⇒ Object



249
250
251
252
253
# File 'lib/duo_api/admin.rb', line 249

def create_token(type:, serial:, **optional_params)
  # optional_params: secret, counter, private_id, aes_key
  params = optional_params.merge({ type: type, serial: serial })
  post('/admin/v1/tokens', params)[:response]
end

#create_user(username:, **optional_params) ⇒ Object



23
24
25
26
27
28
29
30
31
# File 'lib/duo_api/admin.rb', line 23

def create_user(username:, **optional_params)
  # optional_params: alias1, alias2, alias3, alias4, aliases, realname, email,
  #                  enable_auto_prompt, status, notes, firstname, lastname
  optional_params.tap do |p|
    p[:aliases] = serialized_aliases(p[:aliases]) if p[:aliases]
  end
  params = optional_params.merge({ username: username })
  post('/admin/v1/users', params)[:response]
end

#create_user_bypass_codes(user_id:, **optional_params) ⇒ Object



74
75
76
77
78
79
80
# File 'lib/duo_api/admin.rb', line 74

def create_user_bypass_codes(user_id:, **optional_params)
  # optional_params: count, codes, preserve_existing, reuse_count, valid_secs
  optional_params.tap do |p|
    p[:codes] = csv_serialized_array(p[:codes]) if p[:codes]
  end
  post("/admin/v1/users/#{user_id}/bypass_codes", optional_params)[:response]
end

#delete_admin(admin_id:) ⇒ Object



542
543
544
# File 'lib/duo_api/admin.rb', line 542

def delete_admin(admin_id:)
  delete("/admin/v1/admins/#{admin_id}")[:response]
end

#delete_administrative_unit(admin_unit_id:) ⇒ Object



658
659
660
# File 'lib/duo_api/admin.rb', line 658

def delete_administrative_unit(admin_unit_id:)
  delete("/admin/v1/administrative_units/#{admin_unit_id}")[:response]
end

#delete_bypass_code(bypass_code_id:) ⇒ Object



337
338
339
# File 'lib/duo_api/admin.rb', line 337

def delete_bypass_code(bypass_code_id:)
  delete("/admin/v1/bypass_codes/#{bypass_code_id}")[:response]
end

#delete_desktop_authenticator(dakey:) ⇒ Object



294
295
296
# File 'lib/duo_api/admin.rb', line 294

def delete_desktop_authenticator(dakey:)
  delete("/admin/v1/desktop_authenticators/#{dakey}")[:response]
end


558
559
560
# File 'lib/duo_api/admin.rb', line 558

def delete_existing_admin_activation_link(admin_id:)
  delete("/admin/v1/admins/#{admin_id}/activation_link")[:response]
end

#delete_group(group_id:) ⇒ Object



192
193
194
# File 'lib/duo_api/admin.rb', line 192

def delete_group(group_id:)
  delete("/admin/v1/groups/#{group_id}")[:response]
end

#delete_integration(integration_key:) ⇒ Object



378
379
380
# File 'lib/duo_api/admin.rb', line 378

def delete_integration(integration_key:)
  delete("/admin/v3/integrations/#{integration_key}")[:response]
end

#delete_logoObject



751
752
753
# File 'lib/duo_api/admin.rb', line 751

def 
  delete('/admin/v1/logo')[:response]
end

#delete_new_admin_pending_activations(admin_activation_id:) ⇒ Object



576
577
578
# File 'lib/duo_api/admin.rb', line 576

def delete_new_admin_pending_activations(admin_activation_id:)
  delete("/admin/v1/admins/activations/#{admin_activation_id}")[:response]
end

#delete_phone(phone_id:) ⇒ Object



218
219
220
# File 'lib/duo_api/admin.rb', line 218

def delete_phone(phone_id:)
  delete("/admin/v1/phones/#{phone_id}")[:response]
end

#delete_policy(policy_key:) ⇒ Object



451
452
453
# File 'lib/duo_api/admin.rb', line 451

def delete_policy(policy_key:)
  delete("/admin/v2/policies/#{policy_key}")[:response]
end

#delete_registered_device(compkey:) ⇒ Object



477
478
479
# File 'lib/duo_api/admin.rb', line 477

def delete_registered_device(compkey:)
  delete("/admin/v1/registered_devices/#{compkey}")[:response]
end

#delete_shared_desktop_authenticator(shared_device_key:) ⇒ Object



322
323
324
# File 'lib/duo_api/admin.rb', line 322

def delete_shared_desktop_authenticator(shared_device_key:)
  delete("/admin/v1/desktop_authenticators/shared_device_auth/#{shared_device_key}")[:response]
end

#delete_token(token_id:) ⇒ Object



264
265
266
# File 'lib/duo_api/admin.rb', line 264

def delete_token(token_id:)
  delete("/admin/v1/tokens/#{token_id}")[:response]
end

#delete_user(user_id:) ⇒ Object



64
65
66
# File 'lib/duo_api/admin.rb', line 64

def delete_user(user_id:)
  delete("/admin/v1/users/#{user_id}")[:response]
end

#delete_webauthncredential(webauthnkey:) ⇒ Object



279
280
281
# File 'lib/duo_api/admin.rb', line 279

def delete_webauthncredential(webauthnkey:)
  delete("/admin/v1/webauthncredentials/#{webauthnkey}")[:response]
end


562
563
564
# File 'lib/duo_api/admin.rb', line 562

def email_existing_admin_activation_link(admin_id:)
  post("/admin/v1/admins/#{admin_id}/activation_link/email")[:response]
end

#enroll_user(username:, email:, **optional_params) ⇒ Object



68
69
70
71
72
# File 'lib/duo_api/admin.rb', line 68

def enroll_user(username:, email:, **optional_params)
  # optional_params: valid_secs
  params = optional_params.merge({ username: username, email: email })
  post('/admin/v1/users/enroll', params)[:response]
end

#get_account_info_summaryObject

Account Info



802
803
804
# File 'lib/duo_api/admin.rb', line 802

def 
  get('/admin/v1/info/summary')[:response]
end

#get_activity_logs(mintime:, maxtime:, **optional_params) ⇒ Object



677
678
679
680
681
682
683
684
# File 'lib/duo_api/admin.rb', line 677

def get_activity_logs(mintime:, maxtime:, **optional_params)
  # optional_params: sort
  params = optional_params.merge({ mintime: mintime, maxtime: maxtime })
  data_array_path = i[response items]
   = i[response ]
  get_all('/admin/v2/logs/activity', params, data_array_path: data_array_path,
          metadata_path: ).dig(*data_array_path)
end

#get_admin(admin_id:) ⇒ Object



533
534
535
# File 'lib/duo_api/admin.rb', line 533

def get_admin(admin_id:)
  get("/admin/v1/admins/#{admin_id}")[:response]
end

#get_admin_allowed_auth_factorsObject



598
599
600
# File 'lib/duo_api/admin.rb', line 598

def get_admin_allowed_auth_factors
  get('/admin/v1/admins/allowed_auth_methods')[:response]
end

#get_admin_logs(**optional_params) ⇒ Object



686
687
688
689
# File 'lib/duo_api/admin.rb', line 686

def get_admin_logs(**optional_params)
  # optional_params: mintime
  get('/admin/v1/logs/administrator', optional_params)[:response]
end

#get_admin_password_mgmt_status(admin_id:) ⇒ Object



589
590
591
# File 'lib/duo_api/admin.rb', line 589

def get_admin_password_mgmt_status(admin_id:)
  get("/admin/v1/admins/#{admin_id}/password_mgmt")[:response]
end

#get_admin_password_mgmt_statusesObject



585
586
587
# File 'lib/duo_api/admin.rb', line 585

def get_admin_password_mgmt_statuses
  get_all('/admin/v1/admins/password_mgmt')[:response]
end

#get_administrative_unit(admin_unit_id:) ⇒ Object



617
618
619
# File 'lib/duo_api/admin.rb', line 617

def get_administrative_unit(admin_unit_id:)
  get("/admin/v1/administrative_units/#{admin_unit_id}")[:response]
end

#get_administrative_units(**optional_params) ⇒ Object

Administrative Units



612
613
614
615
# File 'lib/duo_api/admin.rb', line 612

def get_administrative_units(**optional_params)
  # optional_params: admin_id, group_id, integration_key
  get_all('/admin/v1/administrative_units', optional_params)[:response]
end

#get_adminsObject

Administrators



523
524
525
# File 'lib/duo_api/admin.rb', line 523

def get_admins
  get_all('/admin/v1/admins')[:response]
end

#get_authentication_attempts_report(**optional_params) ⇒ Object



811
812
813
# File 'lib/duo_api/admin.rb', line 811

def get_authentication_attempts_report(**optional_params)
  get('/admin/v1/info/authentication_attempts', optional_params)[:response]
end

#get_authentication_logs(mintime:, maxtime:, **optional_params) ⇒ Object

Logs



665
666
667
668
669
670
671
672
673
674
675
# File 'lib/duo_api/admin.rb', line 665

def get_authentication_logs(mintime:, maxtime:, **optional_params)
  # optional_params: applications, users, assessment, detections, event_types, factors, formatter,
  #                  groups, phone_numbers, reasons, results, tokens, sort
  #
  #       more info: https://duo.com/docs/adminapi#authentication-logs
  params = optional_params.merge({ mintime: mintime, maxtime: maxtime })
  data_array_path = i[response authlogs]
   = i[response ]
  get_all('/admin/v2/logs/authentication', params, data_array_path: data_array_path,
          metadata_path: ).dig(*data_array_path)
end

#get_blocked_registered_device(compkey:) ⇒ Object



485
486
487
# File 'lib/duo_api/admin.rb', line 485

def get_blocked_registered_device(compkey:)
  get("/admin/v1/registered_devices/blocked/#{compkey}")[:response]
end

#get_blocked_registered_devicesObject



481
482
483
# File 'lib/duo_api/admin.rb', line 481

def get_blocked_registered_devices
  get_all('/admin/v1/registered_devices/blocked')[:response]
end

#get_bypass_code(bypass_code_id:) ⇒ Object



333
334
335
# File 'lib/duo_api/admin.rb', line 333

def get_bypass_code(bypass_code_id:)
  get("/admin/v1/bypass_codes/#{bypass_code_id}")[:response]
end

#get_bypass_codesObject

Bypass Codes



329
330
331
# File 'lib/duo_api/admin.rb', line 329

def get_bypass_codes
  get_all('/admin/v1/bypass_codes')[:response]
end

#get_custom_brandingObject

Custom Branding



758
759
760
# File 'lib/duo_api/admin.rb', line 758

def get_custom_branding
  get('/admin/v1/branding')[:response]
end

#get_custom_branding_draftObject



768
769
770
# File 'lib/duo_api/admin.rb', line 768

def get_custom_branding_draft
  get('/admin/v1/branding/draft')[:response]
end

#get_custom_branding_messagingObject



790
791
792
# File 'lib/duo_api/admin.rb', line 790

def get_custom_branding_messaging
  get('/admin/v1/branding/custom_messaging')[:response]
end

#get_desktop_authenticator(dakey:) ⇒ Object



290
291
292
# File 'lib/duo_api/admin.rb', line 290

def get_desktop_authenticator(dakey:)
  get("/admin/v1/desktop_authenticators/#{dakey}")[:response]
end

#get_desktop_authenticatorsObject

Desktop Authenticators



286
287
288
# File 'lib/duo_api/admin.rb', line 286

def get_desktop_authenticators
  get_all('/admin/v1/desktop_authenticators')[:response]
end

#get_endpoint(epkey:) ⇒ Object



462
463
464
# File 'lib/duo_api/admin.rb', line 462

def get_endpoint(epkey:)
  get("/admin/v1/endpoints/#{epkey}")[:response]
end

#get_endpointsObject

Endpoints



458
459
460
# File 'lib/duo_api/admin.rb', line 458

def get_endpoints
  get_all('/admin/v1/endpoints')[:response]
end

#get_global_policyObject



413
414
415
# File 'lib/duo_api/admin.rb', line 413

def get_global_policy
  get('/admin/v2/policies/global')[:response]
end

#get_group(group_id:) ⇒ Object



179
180
181
# File 'lib/duo_api/admin.rb', line 179

def get_group(group_id:)
  get("/admin/v2/groups/#{group_id}")[:response]
end

#get_group_users(group_id:) ⇒ Object



183
184
185
# File 'lib/duo_api/admin.rb', line 183

def get_group_users(group_id:)
  get_all("/admin/v2/groups/#{group_id}/users")[:response]
end

#get_groups(**optional_params) ⇒ Object

Groups



168
169
170
171
# File 'lib/duo_api/admin.rb', line 168

def get_groups(**optional_params)
  # optional_params: group_id_list
  get_all('/admin/v1/groups', optional_params)[:response]
end

#get_integration(integration_key:) ⇒ Object



361
362
363
# File 'lib/duo_api/admin.rb', line 361

def get_integration(integration_key:)
  get("/admin/v3/integrations/#{integration_key}")[:response]
end

#get_integration_secret_key(integration_key:) ⇒ Object



382
383
384
# File 'lib/duo_api/admin.rb', line 382

def get_integration_secret_key(integration_key:)
  get("/admin/v1/integrations/#{integration_key}/skey")[:response]
end

#get_integrationsObject

Integrations



344
345
346
# File 'lib/duo_api/admin.rb', line 344

def get_integrations
  get_all('/admin/v3/integrations')[:response]
end

#get_logoObject



740
741
742
# File 'lib/duo_api/admin.rb', line 740

def 
  get_image('/admin/v1/logo')
end

#get_new_admin_pending_activationsObject



572
573
574
# File 'lib/duo_api/admin.rb', line 572

def get_new_admin_pending_activations
  get_all('/admin/v1/admins/activations')[:response]
end

#get_oauth_integration_client_secret(integration_key:, client_id:) ⇒ Object



386
387
388
# File 'lib/duo_api/admin.rb', line 386

def get_oauth_integration_client_secret(integration_key:, client_id:)
  get("/admin/v2/integrations/oauth_cc/#{integration_key}/client_secret/#{client_id}")[:response]
end

#get_offline_enrollment_logs(**optional_params) ⇒ Object



700
701
702
703
# File 'lib/duo_api/admin.rb', line 700

def get_offline_enrollment_logs(**optional_params)
  # optional_params: mintime
  get('/admin/v1/logs/offline_enrollment', optional_params)[:response]
end

#get_oidc_integration_client_secret(integration_key:) ⇒ Object



394
395
396
# File 'lib/duo_api/admin.rb', line 394

def get_oidc_integration_client_secret(integration_key:)
  get("/admin/v2/integrations/oidc/#{integration_key}/client_secret")[:response]
end

#get_passport_configObject

Passport



510
511
512
# File 'lib/duo_api/admin.rb', line 510

def get_passport_config
  get('/admin/v2/passport/config')[:response]
end

#get_phone(phone_id:) ⇒ Object



209
210
211
# File 'lib/duo_api/admin.rb', line 209

def get_phone(phone_id:)
  get("/admin/v1/phones/#{phone_id}")[:response]
end

#get_phones(**optional_params) ⇒ Object

Phones



199
200
201
202
# File 'lib/duo_api/admin.rb', line 199

def get_phones(**optional_params)
  # optional_params: number, extension
  get_all('/admin/v1/phones', optional_params)[:response]
end

#get_policiesObject



409
410
411
# File 'lib/duo_api/admin.rb', line 409

def get_policies
  get_all('/admin/v2/policies')[:response]
end

#get_policies_summaryObject

Policies



405
406
407
# File 'lib/duo_api/admin.rb', line 405

def get_policies_summary
  get('/admin/v2/policies/summary')[:response]
end

#get_policy(policy_key:) ⇒ Object



417
418
419
# File 'lib/duo_api/admin.rb', line 417

def get_policy(policy_key:)
  get("/admin/v2/policies/#{policy_key}")[:response]
end

#get_registered_device(compkey:) ⇒ Object



473
474
475
# File 'lib/duo_api/admin.rb', line 473

def get_registered_device(compkey:)
  get("/admin/v1/registered_devices/#{compkey}")[:response]
end

#get_registered_devicesObject

Registered Devices



469
470
471
# File 'lib/duo_api/admin.rb', line 469

def get_registered_devices
  get_all('/admin/v1/registered_devices')[:response]
end

#get_settingsObject

Settings



721
722
723
# File 'lib/duo_api/admin.rb', line 721

def get_settings
  get('/admin/v1/settings')[:response]
end

#get_shared_desktop_authenticator(shared_device_key:) ⇒ Object



302
303
304
# File 'lib/duo_api/admin.rb', line 302

def get_shared_desktop_authenticator(shared_device_key:)
  get("/admin/v1/desktop_authenticators/shared_device_auth/#{shared_device_key}")[:response]
end

#get_shared_desktop_authenticatorsObject



298
299
300
# File 'lib/duo_api/admin.rb', line 298

def get_shared_desktop_authenticators
  get_all('/admin/v1/desktop_authenticators/shared_device_auth')[:response]
end

#get_telephony_credits_used_report(**optional_params) ⇒ Object



806
807
808
809
# File 'lib/duo_api/admin.rb', line 806

def get_telephony_credits_used_report(**optional_params)
  # optional_params: maxtime, mintime
  get('/admin/v1/info/telephony_credits_used', optional_params)[:response]
end

#get_telephony_logs(mintime:, maxtime:, **optional_params) ⇒ Object



691
692
693
694
695
696
697
698
# File 'lib/duo_api/admin.rb', line 691

def get_telephony_logs(mintime:, maxtime:, **optional_params)
  # optional_params: sort
  params = optional_params.merge({ mintime: mintime, maxtime: maxtime })
  data_array_path = i[response items]
   = i[response ]
  get_all('/admin/v2/logs/telephony', params, data_array_path: data_array_path,
          metadata_path: ).dig(*data_array_path)
end

#get_token(token_id:) ⇒ Object



255
256
257
# File 'lib/duo_api/admin.rb', line 255

def get_token(token_id:)
  get("/admin/v1/tokens/#{token_id}")[:response]
end

#get_tokens(**optional_params) ⇒ Object

Tokens



244
245
246
247
# File 'lib/duo_api/admin.rb', line 244

def get_tokens(**optional_params)
  # optional_params: type, serial
  get_all('/admin/v1/tokens', optional_params)[:response]
end

#get_trust_monitor_events(mintime:, maxtime:, **optional_params) ⇒ Object

Trust Monitor



708
709
710
711
712
713
714
715
716
# File 'lib/duo_api/admin.rb', line 708

def get_trust_monitor_events(mintime:, maxtime:, **optional_params)
  # optional_params: formatter, type
  params = optional_params.merge({ mintime: mintime, maxtime: maxtime })
  params[:limit] = 200 if !params[:limit] || (params[:limit].to_i > 200)
  data_array_path = i[response events]
   = i[response ]
  get_all('/admin/v1/trust_monitor/events', params, data_array_path: data_array_path,
          metadata_path: ).dig(*data_array_path)
end

#get_user(user_id:) ⇒ Object



50
51
52
# File 'lib/duo_api/admin.rb', line 50

def get_user(user_id:)
  get("/admin/v1/users/#{user_id}")[:response]
end

#get_user_authentication_attempts_report(**optional_params) ⇒ Object



815
816
817
# File 'lib/duo_api/admin.rb', line 815

def get_user_authentication_attempts_report(**optional_params)
  get('/admin/v1/info/user_authentication_attempts', optional_params)[:response]
end

#get_user_bypass_codes(user_id:) ⇒ Object



82
83
84
# File 'lib/duo_api/admin.rb', line 82

def get_user_bypass_codes(user_id:)
  get_all("/admin/v1/users/#{user_id}/bypass_codes")[:response]
end

#get_user_desktop_authenticators(user_id:) ⇒ Object



129
130
131
# File 'lib/duo_api/admin.rb', line 129

def get_user_desktop_authenticators(user_id:)
  get_all("/admin/v1/users/#{user_id}/desktopauthenticators")[:response]
end

#get_user_groups(user_id:) ⇒ Object



86
87
88
# File 'lib/duo_api/admin.rb', line 86

def get_user_groups(user_id:)
  get_all("/admin/v1/users/#{user_id}/groups")[:response]
end

#get_user_hardware_tokens(user_id:) ⇒ Object



112
113
114
# File 'lib/duo_api/admin.rb', line 112

def get_user_hardware_tokens(user_id:)
  get_all("/admin/v1/users/#{user_id}/tokens")[:response]
end

#get_user_phones(user_id:) ⇒ Object



99
100
101
# File 'lib/duo_api/admin.rb', line 99

def get_user_phones(user_id:)
  get_all("/admin/v1/users/#{user_id}/phones")[:response]
end

#get_user_webauthn_credentials(user_id:) ⇒ Object



125
126
127
# File 'lib/duo_api/admin.rb', line 125

def get_user_webauthn_credentials(user_id:)
  get_all("/admin/v1/users/#{user_id}/webauthncredentials")[:response]
end

#get_users(**optional_params) ⇒ Object

Users



14
15
16
17
18
19
20
21
# File 'lib/duo_api/admin.rb', line 14

def get_users(**optional_params)
  # optional_params: username, email, user_id_list, username_list
  optional_params.tap do |p|
    p[:user_id_list] = json_serialized_array(p[:user_id_list]) if p[:user_id_list]
    p[:username_list] = json_serialized_array(p[:username_list]) if p[:username_list]
  end
  get_all('/admin/v1/users', optional_params)[:response]
end

#get_verification_push_response(user_id:, push_id:) ⇒ Object



143
144
145
146
# File 'lib/duo_api/admin.rb', line 143

def get_verification_push_response(user_id:, push_id:)
  params = { push_id: push_id }
  get("/admin/v1/users/#{user_id}/verification_push_response", params)[:response]
end

#get_webauthncredential(webauthnkey:) ⇒ Object



275
276
277
# File 'lib/duo_api/admin.rb', line 275

def get_webauthncredential(webauthnkey:)
  get("/admin/v1/webauthncredentials/#{webauthnkey}")[:response]
end

#get_webauthncredentialsObject

WebAuthn Credentials



271
272
273
# File 'lib/duo_api/admin.rb', line 271

def get_webauthncredentials
  get_all('/admin/v1/webauthncredentials')[:response]
end

#publish_custom_branding_draftObject



786
787
788
# File 'lib/duo_api/admin.rb', line 786

def publish_custom_branding_draft
  post('/admin/v1/branding/draft/publish')[:response]
end

#remove_administrative_unit_admin(admin_unit_id:, admin_id:) ⇒ Object



638
639
640
# File 'lib/duo_api/admin.rb', line 638

def remove_administrative_unit_admin(admin_unit_id:, admin_id:)
  delete("/admin/v1/administrative_units/#{admin_unit_id}/admin/#{admin_id}")[:response]
end

#remove_administrative_unit_group(admin_unit_id:, group_id:) ⇒ Object



646
647
648
# File 'lib/duo_api/admin.rb', line 646

def remove_administrative_unit_group(admin_unit_id:, group_id:)
  delete("/admin/v1/administrative_units/#{admin_unit_id}/group/#{group_id}")[:response]
end

#remove_administrative_unit_integration(admin_unit_id:, integration_key:) ⇒ Object



654
655
656
# File 'lib/duo_api/admin.rb', line 654

def remove_administrative_unit_integration(admin_unit_id:, integration_key:)
  delete("/admin/v1/administrative_units/#{admin_unit_id}/integration/#{integration_key}")[:response]
end

#remove_custom_branding_draft_user(user_id:) ⇒ Object



782
783
784
# File 'lib/duo_api/admin.rb', line 782

def remove_custom_branding_draft_user(user_id:)
  delete("/admin/v1/branding/draft/users/#{user_id}")[:response]
end

#remove_user_group(user_id:, group_id:) ⇒ Object



95
96
97
# File 'lib/duo_api/admin.rb', line 95

def remove_user_group(user_id:, group_id:)
  delete("/admin/v1/users/#{user_id}/groups/#{group_id}")[:response]
end

#remove_user_hardware_token(user_id:, token_id:) ⇒ Object



121
122
123
# File 'lib/duo_api/admin.rb', line 121

def remove_user_hardware_token(user_id:, token_id:)
  delete("/admin/v1/users/#{user_id}/tokens/#{token_id}")[:response]
end

#remove_user_phone(user_id:, phone_id:) ⇒ Object



108
109
110
# File 'lib/duo_api/admin.rb', line 108

def remove_user_phone(user_id:, phone_id:)
  delete("/admin/v1/users/#{user_id}/phones/#{phone_id}")[:response]
end

#reset_admin_auth_attempts(admin_id:) ⇒ Object



546
547
548
# File 'lib/duo_api/admin.rb', line 546

def reset_admin_auth_attempts(admin_id:)
  post("/admin/v1/admins/#{admin_id}/reset")[:response]
end

#reset_oauth_integration_client_secret(integration_key:, client_id:) ⇒ Object



390
391
392
# File 'lib/duo_api/admin.rb', line 390

def reset_oauth_integration_client_secret(integration_key:, client_id:)
  post("/admin/v2/integrations/oauth_cc/#{integration_key}/client_secret/#{client_id}")[:response]
end

#reset_oidc_integration_client_secret(integration_key:) ⇒ Object



398
399
400
# File 'lib/duo_api/admin.rb', line 398

def reset_oidc_integration_client_secret(integration_key:)
  post("/admin/v2/integrations/oidc/#{integration_key}/client_secret")[:response]
end

#resync_token(token_id:, code1:, code2:, code3:) ⇒ Object



259
260
261
262
# File 'lib/duo_api/admin.rb', line 259

def resync_token(token_id:, code1:, code2:, code3:)
  params = { code1: code1, code2: code2, code3: code3 }
  post("/admin/v1/tokens/#{token_id}/resync", params)[:response]
end

#send_sms_activation(phone_id:, **optional_params) ⇒ Object



227
228
229
230
# File 'lib/duo_api/admin.rb', line 227

def send_sms_activation(phone_id:, **optional_params)
  # optional_params: valid_secs, install, installation_msg, activation_msg
  post("/admin/v1/phones/#{phone_id}/send_sms_activation", optional_params)[:response]
end

#send_sms_installation(phone_id:, **optional_params) ⇒ Object



232
233
234
235
# File 'lib/duo_api/admin.rb', line 232

def send_sms_installation(phone_id:, **optional_params)
  # optional_params: installation_msg
  post("/admin/v1/phones/#{phone_id}/send_sms_installation", optional_params)[:response]
end

#send_sms_passcodes(phone_id:) ⇒ Object



237
238
239
# File 'lib/duo_api/admin.rb', line 237

def send_sms_passcodes(phone_id:)
  post("/admin/v1/phones/#{phone_id}/send_sms_passcodes")[:response]
end

#send_verification_push(user_id:, phone_id:) ⇒ Object



138
139
140
141
# File 'lib/duo_api/admin.rb', line 138

def send_verification_push(user_id:, phone_id:)
  params = { phone_id: phone_id }
  post("/admin/v1/users/#{user_id}/send_verification_push", params)[:response]
end

#sync_admin(directory_key:, email:) ⇒ Object



580
581
582
583
# File 'lib/duo_api/admin.rb', line 580

def sync_admin(directory_key:, email:)
  params = { email: email }
  post("/admin/v1/admins/directorysync/#{directory_key}/syncadmin", params)[:response]
end

#sync_user(username:, directory_key:) ⇒ Object



133
134
135
136
# File 'lib/duo_api/admin.rb', line 133

def sync_user(username:, directory_key:)
  params = { username: username }
  post("/admin/v1/users/directorysync/#{directory_key}/syncuser", params)[:response]
end

#unblock_registered_device(compkey:) ⇒ Object



503
504
505
# File 'lib/duo_api/admin.rb', line 503

def unblock_registered_device(compkey:)
  delete("/admin/v1/registered_devices/blocked/#{compkey}")[:response]
end

#unblock_registered_devices(registered_device_key_list:) ⇒ Object



498
499
500
501
# File 'lib/duo_api/admin.rb', line 498

def unblock_registered_devices(registered_device_key_list:)
  params = { registered_device_key_list: registered_device_key_list }
  delete('/admin/v1/registered_devices/blocked', params)[:response]
end

#update_admin(admin_id:, **optional_params) ⇒ Object



537
538
539
540
# File 'lib/duo_api/admin.rb', line 537

def update_admin(admin_id:, **optional_params)
  # optional_params: phone, role, restricted_by_admin_units, token_id, name, status
  post("/admin/v1/admins/#{admin_id}", optional_params)[:response]
end

#update_admin_allowed_auth_factors(**optional_params) ⇒ Object



602
603
604
605
606
607
# File 'lib/duo_api/admin.rb', line 602

def update_admin_allowed_auth_factors(**optional_params)
  # optional_params: hardware_token_enabled, mobile_otp_enabled, push_enabled, sms_enabled,
  #                  verified_push_enabled, verified_push_length, voice_enabled, webauthn_enabled,
  #                  yubikey_enabled
  post('/admin/v1/admins/allowed_auth_methods', optional_params)[:response]
end

#update_admin_password_mgmt_status(admin_id:, **optional_params) ⇒ Object



593
594
595
596
# File 'lib/duo_api/admin.rb', line 593

def update_admin_password_mgmt_status(admin_id:, **optional_params)
  # optional_params: has_external_password_mgmt, password
  post("/admin/v1/admins/#{admin_id}/password_mgmt", optional_params)[:response]
end

#update_administrative_unit(admin_unit_id:, **optional_params) ⇒ Object



628
629
630
631
632
# File 'lib/duo_api/admin.rb', line 628

def update_administrative_unit(admin_unit_id:, **optional_params)
  # optional_params: restrict_by_integrations, admins, groups, integrations,
  #                  name, description, restrict_by_groups
  post("/admin/v1/administrative_units/#{admin_unit_id}", optional_params)[:response]
end

#update_custom_branding(**optional_params) ⇒ Object



762
763
764
765
766
# File 'lib/duo_api/admin.rb', line 762

def update_custom_branding(**optional_params)
  # optional_params: background_img, card_accent_color, logo, page_background_color,
  #                  powered_by_duo, sso_custom_username_label
  post('/admin/v1/branding', optional_params)[:response]
end

#update_custom_branding_draft(**optional_params) ⇒ Object



772
773
774
775
776
# File 'lib/duo_api/admin.rb', line 772

def update_custom_branding_draft(**optional_params)
  # optional_params: background_img, card_accent_color, logo, page_background_color,
  #                  powered_by_duo, sso_custom_username_label, user_ids
  post('/admin/v1/branding/draft', optional_params)[:response]
end

#update_custom_branding_messaging(**optional_params) ⇒ Object



794
795
796
797
# File 'lib/duo_api/admin.rb', line 794

def update_custom_branding_messaging(**optional_params)
  # optional_params: help_links, help_text, locale
  post('/admin/v1/branding/custom_messaging', optional_params)[:response]
end

#update_group(group_id:, **optional_params) ⇒ Object



187
188
189
190
# File 'lib/duo_api/admin.rb', line 187

def update_group(group_id:, **optional_params)
  # optional_params: desc, status, name
  post("/admin/v1/groups/#{group_id}", optional_params)[:response]
end

#update_integration(integration_key:, **optional_params) ⇒ Object



365
366
367
368
369
370
371
372
373
374
375
376
# File 'lib/duo_api/admin.rb', line 365

def update_integration(integration_key:, **optional_params)
  # optional_params: adminapi_admins, adminapi_admins_read, adminapi_allow_to_set_permissions,
  #                  adminapi_info, adminapi_integrations, adminapi_read_log,
  #                  adminapi_read_resource, adminapi_settings, adminapi_write_resource,
  #                  enroll_policy, greeting, groups_allowed, ip_whitelist,
  #                  ip_whitelist_enroll_policy, networks_for_api_access, notes,
  #                  trusted_device_days, self_service_allowed, sso, username_normalization_policy,
  #                  name, policy_key, prompt_v4_enabled, reset_secret_key
  #
  #      sso params: https://duo.com/docs/adminapi#sso-parameters
  post("/admin/v3/integrations/#{integration_key}", optional_params)[:response]
end

#update_logo(logo:) ⇒ Object



744
745
746
747
748
749
# File 'lib/duo_api/admin.rb', line 744

def (logo:)
  # logo should be raw png data or base64 strict encoded raw png data
   = base64?() ?  : Base64.strict_encode64()
  params = { logo:  }
  post('/admin/v1/logo', params)[:response]
end

#update_passport_config(disabled_groups:, enabled_groups:, enabled_status:) ⇒ Object



514
515
516
517
518
# File 'lib/duo_api/admin.rb', line 514

def update_passport_config(disabled_groups:, enabled_groups:, enabled_status:)
  params = { disabled_groups: disabled_groups, enabled_groups: enabled_groups,
             enabled_status: enabled_status }
  post('/admin/v2/passport/config', params)[:response]
end

#update_phone(phone_id:, **optional_params) ⇒ Object



213
214
215
216
# File 'lib/duo_api/admin.rb', line 213

def update_phone(phone_id:, **optional_params)
  # optional_params: number, name, extension, type, platform, predelay, postdelay
  post("/admin/v1/phones/#{phone_id}", optional_params)[:response]
end

#update_policies(policies_to_update:, policy_changes:) ⇒ Object



438
439
440
441
442
# File 'lib/duo_api/admin.rb', line 438

def update_policies(policies_to_update:, policy_changes:)
  # parameter formatting: https://duo.com/docs/adminapi#update-policies
  params = { policies_to_update: policies_to_update, policy_changes: policy_changes }
  put('/admin/v2/policies/update', params)[:response]
end

#update_policy(policy_key:, **optional_params) ⇒ Object



444
445
446
447
448
449
# File 'lib/duo_api/admin.rb', line 444

def update_policy(policy_key:, **optional_params)
  # optional_params: apply_to_apps, apply_to_groups_in_apps, sections,
  #                  policy_name, sections_to_delete
  params = optional_params.merge({ policy_key: policy_key })
  put("/admin/v2/policies/#{policy_key}", params)[:response]
end

#update_settings(**optional_params) ⇒ Object



725
726
727
728
729
730
731
732
733
734
735
736
737
738
# File 'lib/duo_api/admin.rb', line 725

def update_settings(**optional_params)
  # optional_params: caller_id, duo_mobile_otp_type, email_activity_notification_enabled,
  #                  enrollment_universal_prompt_enabled, fraud_email, fraud_email_enabled,
  #                  global_ssp_policy_enforced, helpdesk_bypass, helpdesk_bypass_expiration,
  #                  helpdesk_can_send_enroll_email, inactive_user_expiration, keypress_confirm,
  #                  keypress_fraud, language, lockout_expire_duration, lockout_threshold,
  #                  log_retention_days, minimum_password_length, name,
  #                  password_requires_lower_alpha, password_requires_numeric,
  #                  password_requires_special, password_requires_upper_alpha,
  #                  push_activity_notification_enabled, sms_batch, sms_expiration, sms_message,
  #                  sms_refresh, telephony_warning_min, timezone, unenrolled_user_lockout_threshold,
  #                  user_managers_can_put_users_in_bypass, user_telephony_cost_max
  post('/admin/v1/settings', optional_params)[:response]
end

#update_shared_desktop_authenticator(shared_device_key:, **optional_params) ⇒ Object



316
317
318
319
320
# File 'lib/duo_api/admin.rb', line 316

def update_shared_desktop_authenticator(shared_device_key:, **optional_params)
  # optional_params: active, name, group_id_list, trusted_endpoint_integration_id_list
  put("/admin/v1/desktop_authenticators/shared_device_auth/#{shared_device_key}",
      optional_params)[:response]
end

#update_user(user_id:, **optional_params) ⇒ Object



54
55
56
57
58
59
60
61
62
# File 'lib/duo_api/admin.rb', line 54

def update_user(user_id:, **optional_params)
  # optional_params: alias1, alias2, alias3, alias4, aliases, realname, email,
  #                  enable_auto_prompt, status, notes, firstname, lastname,
  #                  username
  optional_params.tap do |p|
    p[:aliases] = serialized_aliases(p[:aliases]) if p[:aliases]
  end
  post("/admin/v1/users/#{user_id}", optional_params)[:response]
end