Class: Legion::Extensions::MicrosoftTeams::Helpers::BrowserAuth

Inherits:
Object
  • Object
show all
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

Instance Method Summary collapse

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_idObject (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

#scopesObject (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_idObject (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

Returns:

  • (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

#authenticateObject



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_pkceObject



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

Returns:

  • (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_uriObject



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