summaryrefslogtreecommitdiff
path: root/app/Auth/Gitlab.php
blob: 336152a51c41c4dcfd7ffa8367c2491f8a9e3a21 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
<?php

namespace Auth;

use Event\AuthEvent;

/**
 * Gitlab backend
 *
 * @package auth
 */
class Gitlab extends Base
{
    /**
     * Backend name
     *
     * @var string
     */
    const AUTH_NAME = 'Gitlab';

    /**
     * OAuth2 instance
     *
     * @access private
     * @var \Core\OAuth2
     */
    private $service;

    /**
     * Authenticate a Gitlab user
     *
     * @access public
     * @param  string  $gitlab_id   Gitlab user id
     * @return boolean
     */
    public function authenticate($gitlab_id)
    {
        $user = $this->user->getByGitlabId($gitlab_id);

        if (! empty($user)) {
            $this->userSession->refresh($user);
            $this->container['dispatcher']->dispatch('auth.success', new AuthEvent(self::AUTH_NAME, $user['id']));
            return true;
        }

        return false;
    }

    /**
     * Unlink a Gitlab account for a given user
     *
     * @access public
     * @param  integer   $user_id    User id
     * @return boolean
     */
    public function unlink($user_id)
    {
        return $this->user->update(array(
            'id' => $user_id,
            'gitlab_id' => '',
        ));
    }

    /**
     * Update the user table based on the Gitlab profile information
     *
     * @access public
     * @param  integer   $user_id    User id
     * @param  array     $profile    Gitlab profile
     * @return boolean
     */
    public function updateUser($user_id, array $profile)
    {
        $user = $this->user->getById($user_id);

        return $this->user->update(array(
            'id' => $user_id,
            'gitlab_id' => $profile['id'],
            'email' => $profile['email'] ?: $user['email'],
            'name' => $profile['name'] ?: $user['name'],
        ));
    }

    /**
     * Get OAuth2 configured service
     *
     * @access public
     * @return \Core\OAuth2
     */
    public function getService()
    {
        if (empty($this->service)) {
            $this->service = $this->oauth->createService(
                GITLAB_CLIENT_ID,
                GITLAB_CLIENT_SECRET,
                $this->helper->url->to('oauth', 'gitlab', array(), '', true),
                GITLAB_OAUTH_AUTHORIZE_URL,
                GITLAB_OAUTH_TOKEN_URL,
                array()
            );
        }

        return $this->service;
    }

    /**
     * Get Gitlab profile
     *
     * @access public
     * @param  string  $code
     * @return array
     */
    public function getProfile($code)
    {
        $this->getService()->getAccessToken($code);

        return $this->httpClient->getJson(
            GITLAB_API_URL.'user',
            array($this->getService()->getAuthorizationHeader())
        );
    }
}