Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Léo-Paul Géneau
gitlab-ce
Commits
746f4720
Commit
746f4720
authored
8 years ago
by
Z.J. van de Weg
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Revert removing of some files
parent
dc6921bd
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
167 additions
and
0 deletions
+167
-0
lib/mattermost/command.rb
lib/mattermost/command.rb
+4
-0
lib/mattermost/error.rb
lib/mattermost/error.rb
+3
-0
lib/mattermost/session.rb
lib/mattermost/session.rb
+160
-0
No files found.
lib/mattermost/command.rb
View file @
746f4720
module
Mattermost
class
Command
<
Client
def
create
(
params
)
<<<<<<<
HEAD
response
=
session_post
(
"/api/v3/teams/
#{
params
[
:team_id
]
}
/commands/create"
,
=======
response
=
json_post
(
"/api/v3/teams/
#{
params
[
:team_id
]
}
/commands/create"
,
>>>>>>>
Revert
removing
of
some
files
body:
params
.
to_json
)
response
[
'token'
]
...
...
This diff is collapsed.
Click to expand it.
lib/mattermost/error.rb
0 → 100644
View file @
746f4720
module
Mattermost
class
Error
<
StandardError
;
end
end
This diff is collapsed.
Click to expand it.
lib/mattermost/session.rb
0 → 100644
View file @
746f4720
module
Mattermost
class
NoSessionError
<
Mattermost
::
Error
def
message
'No session could be set up, is Mattermost configured with Single Sign On?'
end
end
class
ConnectionError
<
Mattermost
::
Error
;
end
# This class' prime objective is to obtain a session token on a Mattermost
# instance with SSO configured where this GitLab instance is the provider.
#
# The process depends on OAuth, but skips a step in the authentication cycle.
# For example, usually a user would click the 'login in GitLab' button on
# Mattermost, which would yield a 302 status code and redirects you to GitLab
# to approve the use of your account on Mattermost. Which would trigger a
# callback so Mattermost knows this request is approved and gets the required
# data to create the user account etc.
#
# This class however skips the button click, and also the approval phase to
# speed up the process and keep it without manual action and get a session
# going.
class
Session
include
Doorkeeper
::
Helpers
::
Controller
include
HTTParty
LEASE_TIMEOUT
=
60
base_uri
Settings
.
mattermost
.
host
attr_accessor
:current_resource_owner
,
:token
def
initialize
(
current_user
)
@current_resource_owner
=
current_user
end
def
with_session
with_lease
do
raise
Mattermost
::
NoSessionError
unless
create
begin
yield
self
rescue
Errno
::
ECONNREFUSED
raise
Mattermost
::
NoSessionError
ensure
destroy
end
end
end
# Next methods are needed for Doorkeeper
def
pre_auth
@pre_auth
||=
Doorkeeper
::
OAuth
::
PreAuthorization
.
new
(
Doorkeeper
.
configuration
,
server
.
client_via_uid
,
params
)
end
def
authorization
@authorization
||=
strategy
.
request
end
def
strategy
@strategy
||=
server
.
authorization_request
(
pre_auth
.
response_type
)
end
def
request
@request
||=
OpenStruct
.
new
(
parameters:
params
)
end
def
params
Rack
::
Utils
.
parse_query
(
oauth_uri
.
query
).
symbolize_keys
end
def
get
(
path
,
options
=
{})
handle_exceptions
do
self
.
class
.
get
(
path
,
options
.
merge
(
headers:
@headers
))
end
end
def
post
(
path
,
options
=
{})
handle_exceptions
do
self
.
class
.
post
(
path
,
options
.
merge
(
headers:
@headers
))
end
end
private
def
create
return
unless
oauth_uri
return
unless
token_uri
@token
=
request_token
@headers
=
{
Authorization
:
"Bearer
#{
@token
}
"
}
@token
end
def
destroy
post
(
'/api/v3/users/logout'
)
end
def
oauth_uri
return
@oauth_uri
if
defined?
(
@oauth_uri
)
@oauth_uri
=
nil
response
=
get
(
"/api/v3/oauth/gitlab/login"
,
follow_redirects:
false
)
return
unless
300
<=
response
.
code
&&
response
.
code
<
400
redirect_uri
=
response
.
headers
[
'location'
]
return
unless
redirect_uri
@oauth_uri
=
URI
.
parse
(
redirect_uri
)
end
def
token_uri
@token_uri
||=
if
oauth_uri
authorization
.
authorize
.
redirect_uri
if
pre_auth
.
authorizable?
end
end
def
request_token
response
=
get
(
token_uri
,
follow_redirects:
false
)
if
200
<=
response
.
code
&&
response
.
code
<
400
response
.
headers
[
'token'
]
end
end
def
with_lease
lease_uuid
=
lease_try_obtain
raise
NoSessionError
unless
lease_uuid
begin
yield
ensure
Gitlab
::
ExclusiveLease
.
cancel
(
lease_key
,
lease_uuid
)
end
end
def
lease_key
"mattermost:session"
end
def
lease_try_obtain
lease
=
::
Gitlab
::
ExclusiveLease
.
new
(
lease_key
,
timeout:
LEASE_TIMEOUT
)
lease
.
try_obtain
end
def
handle_exceptions
yield
rescue
HTTParty
::
Error
=>
e
raise
Mattermost
::
ConnectionError
.
new
(
e
.
message
)
rescue
Errno
::
ECONNREFUSED
raise
Mattermost
::
ConnectionError
.
new
(
e
.
message
)
end
end
end
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment