summaryrefslogtreecommitdiff
path: root/app/Auth
diff options
context:
space:
mode:
authorFrederic Guillot <fred@kanboard.net>2015-08-23 13:15:59 -0400
committerFrederic Guillot <fred@kanboard.net>2015-08-23 13:15:59 -0400
commit8eb739bb910fb91737c6ce65f244eb9a3ac8f35c (patch)
treedb615be44d945a8dc1880a1238a381ec6534dfa2 /app/Auth
parent297c11e48e1cf18e5773a7463721d862dfd6063d (diff)
Add Gitlab authentication
Diffstat (limited to 'app/Auth')
-rw-r--r--app/Auth/Gitlab.php122
1 files changed, 122 insertions, 0 deletions
diff --git a/app/Auth/Gitlab.php b/app/Auth/Gitlab.php
new file mode 100644
index 00000000..336152a5
--- /dev/null
+++ b/app/Auth/Gitlab.php
@@ -0,0 +1,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())
+ );
+ }
+}