21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
# File 'lib/legion/cli/auth_command.rb', line 21
def teams
out = formatter
Connection.ensure_settings(resolve_secrets: false)
port = begin
Legion::Settings.dig(:api, :port) || 4567
rescue StandardError
4567
end
out.('Microsoft Teams Authentication')
require 'net/http'
require 'legion/json'
uri = ::URI.parse("http://127.0.0.1:#{port}/api/auth/teams/authorize")
params = {}
params[:scopes] = options[:scopes] if options[:scopes]
response = ::Net::HTTP.post(uri, Legion::JSON.dump(params), 'Content-Type' => 'application/json')
parsed = Legion::JSON.load(response.body)
unless response.code.to_i == 200 && parsed.dig(:data, :authorize_url)
error_msg = parsed.dig(:error, :message) || "HTTP #{response.code}"
out.error("Daemon returned: #{error_msg}")
raise SystemExit, 1
end
url = parsed[:data][:authorize_url]
out.info('Opening browser for Microsoft login...')
system('open', url) || out.warn("Open this URL manually:\n #{url}")
out.info('Waiting for callback on daemon...')
poll_uri = ::URI.parse("http://127.0.0.1:#{port}/api/auth/teams/status?state=#{parsed.dig(:data, :state)}")
30.times do
sleep 2
poll_response = ::Net::HTTP.get_response(poll_uri)
poll_data = Legion::JSON.load(poll_response.body)
if poll_data.dig(:data, :authenticated)
out.success('Authentication successful! Token stored by daemon.')
return
end
next unless poll_data.dig(:data, :error)
out.error("Authentication failed: #{poll_data[:data][:error]}")
raise SystemExit, 1
end
out.error('Timed out waiting for authentication (60s)')
raise SystemExit, 1
rescue Errno::ECONNREFUSED
out = formatter
out.error('Daemon not running. Start it first: legionio start')
raise SystemExit, 1
end
|