Class: Legion::Extensions::MicrosoftTeams::Helpers::BrowserAuth
- Inherits:
-
Object
- Object
- Legion::Extensions::MicrosoftTeams::Helpers::BrowserAuth
- Includes:
- Helpers::Lex
- Defined in:
- lib/legion/extensions/microsoft_teams/helpers/browser_auth.rb
Constant Summary collapse
- DEFAULT_SCOPES =
[ 'offline_access', 'openid', 'profile', 'email', 'User.Read', 'People.Read', 'Presence.Read', 'Presence.Read.All', 'Chat.Read', 'Chat.ReadBasic', 'ChatMember.Read', 'ChatMessage.Read', 'Channel.ReadBasic.All', 'ChannelMember.Read.All', 'ChannelMessage.Read.All', 'Team.ReadBasic.All', 'Group-Conversation.Read.All', 'OnlineMeetings.Read', 'OnlineMeetingTranscript.Read.All', 'OnlineMeetingRecording.Read.All', 'OnlineMeetingArtifact.Read.All', 'OnlineMeetingAiInsight.Read.All', 'CallAiInsights.Read.All', 'CallEvents.Read', 'CallRecordings.Read.All', 'CallTranscripts.Read.All', 'TeamsActivity.Read', 'TeamsActivity.Send' ].join(' ').freeze
Instance Attribute Summary collapse
-
#client_id ⇒ Object
readonly
Returns the value of attribute client_id.
-
#scopes ⇒ Object
readonly
Returns the value of attribute scopes.
-
#tenant_id ⇒ Object
readonly
Returns the value of attribute tenant_id.
Instance Method Summary collapse
- #api_hook_available? ⇒ Boolean
- #authenticate ⇒ Object
- #generate_pkce ⇒ Object
- #gui_available? ⇒ Boolean
- #hook_redirect_uri ⇒ Object
-
#initialize(tenant_id:, client_id:, scopes: DEFAULT_SCOPES, auth: nil, force_local_server: false) ⇒ BrowserAuth
constructor
A new instance of BrowserAuth.
- #open_browser(url) ⇒ Object
Constructor Details
#initialize(tenant_id:, client_id:, scopes: DEFAULT_SCOPES, auth: nil, force_local_server: false) ⇒ BrowserAuth
Returns a new instance of BrowserAuth.
34 35 36 37 38 39 40 41 |
# File 'lib/legion/extensions/microsoft_teams/helpers/browser_auth.rb', line 34 def initialize(tenant_id:, client_id:, scopes: DEFAULT_SCOPES, auth: nil, force_local_server: false, **) @tenant_id = tenant_id @client_id = client_id @scopes = scopes @auth = auth || Object.new.extend(Runners::Auth) @force_local_server = force_local_server log.debug("BrowserAuth initialized (tenant=#{tenant_id}, client=#{client_id}, force_local=#{force_local_server})") end |
Instance Attribute Details
#client_id ⇒ Object (readonly)
Returns the value of attribute client_id.
32 33 34 |
# File 'lib/legion/extensions/microsoft_teams/helpers/browser_auth.rb', line 32 def client_id @client_id end |
#scopes ⇒ Object (readonly)
Returns the value of attribute scopes.
32 33 34 |
# File 'lib/legion/extensions/microsoft_teams/helpers/browser_auth.rb', line 32 def scopes @scopes end |
#tenant_id ⇒ Object (readonly)
Returns the value of attribute tenant_id.
32 33 34 |
# File 'lib/legion/extensions/microsoft_teams/helpers/browser_auth.rb', line 32 def tenant_id @tenant_id end |
Instance Method Details
#api_hook_available? ⇒ Boolean
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
# File 'lib/legion/extensions/microsoft_teams/helpers/browser_auth.rb', line 53 def api_hook_available? if @force_local_server log.debug('api_hook_available? => false (force_local_server)') return false end api_defined = defined?(Legion::API) events_defined = defined?(Legion::Events) hooks_defined = defined?(Legion::Extensions::Hooks::Base) route_ok = api_defined && events_defined && hooks_defined && hook_route_registered? log.debug("api_hook_available? => #{!route_ok.nil?} " \ "(API=#{!api_defined.nil?}, Events=#{!events_defined.nil?}, Hooks=#{!hooks_defined.nil?}, route=#{route_ok})") !!route_ok end |
#authenticate ⇒ Object
43 44 45 46 47 48 49 50 51 |
# File 'lib/legion/extensions/microsoft_teams/helpers/browser_auth.rb', line 43 def authenticate if gui_available? log.info('GUI available, using browser auth') authenticate_browser else log.info('No GUI detected, using device code flow') authenticate_device_code end end |
#generate_pkce ⇒ Object
78 79 80 81 82 83 |
# File 'lib/legion/extensions/microsoft_teams/helpers/browser_auth.rb', line 78 def generate_pkce verifier = SecureRandom.urlsafe_base64(32) challenge = Base64.urlsafe_encode64(Digest::SHA256.digest(verifier), padding: false) log.debug('PKCE challenge generated') [verifier, challenge] end |
#gui_available? ⇒ Boolean
85 86 87 88 89 90 |
# File 'lib/legion/extensions/microsoft_teams/helpers/browser_auth.rb', line 85 def gui_available? os = host_os return true if /darwin|mswin|mingw/.match?(os) !ENV['DISPLAY'].nil? || !ENV['WAYLAND_DISPLAY'].nil? end |
#hook_redirect_uri ⇒ Object
69 70 71 72 73 74 75 76 |
# File 'lib/legion/extensions/microsoft_teams/helpers/browser_auth.rb', line 69 def hook_redirect_uri port = if defined?(Legion::Settings) Legion::Settings.dig(:api, :port) || 4567 else 4567 end "http://127.0.0.1:#{port}/api/extensions/microsoft_teams/hooks/auth/handle" end |
#open_browser(url) ⇒ Object
92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
# File 'lib/legion/extensions/microsoft_teams/helpers/browser_auth.rb', line 92 def open_browser(url) cmd = case host_os when /darwin/ then 'open' when /linux/ then 'xdg-open' when /mswin|mingw/ then 'start' end unless cmd log.warn('No browser command found for this OS') return false end log.debug("Opening browser with: #{cmd}") system(cmd, url) end |