|
<?php |
|
/* |
|
* Elgg Auth Adaptor for FileGator (https://filegator.io) |
|
* (c) 2022 Waldbühne Heessen |
|
*/ |
|
|
|
namespace Filegator\Services\Auth\Adapters; |
|
|
|
use Filegator\Services\Auth\AuthInterface; |
|
use Filegator\Services\Auth\User; |
|
use Filegator\Services\Auth\UsersCollection; |
|
use Filegator\Services\Service; |
|
use Filegator\Services\Session\SessionStorageInterface as Session; |
|
use Filegator\Utils\PasswordHash; |
|
|
|
class Elgg implements Service, AuthInterface |
|
{ |
|
const SESSION_KEY = 'elgg_auth'; |
|
const SESSION_HASH = 'elgg_auth_hash'; |
|
|
|
const GUEST_USERNAME = 'guest'; |
|
|
|
protected $session; |
|
|
|
protected $file; |
|
|
|
protected $elggApiUrl; |
|
protected $elggAdmins; |
|
|
|
public function __construct(Session $session) |
|
{ |
|
$this->session = $session; |
|
} |
|
|
|
public function init(array $config = []) |
|
{ |
|
$this->elggApiUrl = $config['elggApiUrl']; |
|
$this->elggAdmins = $config['elggAdmins']; |
|
} |
|
|
|
public function user(): ?User |
|
{ |
|
return $this->session ? $this->session->get(self::SESSION_KEY, null) : null; |
|
} |
|
|
|
public function forget() |
|
{ |
|
return $this->session->invalidate(); |
|
} |
|
|
|
public function authenticate($username, $password): bool |
|
{ |
|
// prevent anonymous auth |
|
if (!isset($password) || empty($password)) return false; |
|
if (!isset($username) || empty($username)) return false; |
|
|
|
$ch = curl_init(); |
|
curl_setopt($ch, CURLOPT_URL, $this->elggApiUrl); |
|
curl_setopt($ch, CURLOPT_POST, true); |
|
curl_setopt($ch, CURLOPT_POSTFIELDS, "username=$username&password=$password"); |
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); |
|
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Accept: application/json")); |
|
|
|
$output = curl_exec($ch); |
|
|
|
$result = json_decode($output); |
|
|
|
if (is_null($result)) { |
|
return false; |
|
} |
|
|
|
if ($result->status == -1) { |
|
return false; |
|
} |
|
|
|
$user = new User(); |
|
$user->setUsername($username); |
|
$isAdmin = false; |
|
foreach ($this->elggAdmins as $admin) { |
|
if ($username == $admin) { |
|
$isAdmin = true; |
|
} |
|
} |
|
$user->setRole($isAdmin ? 'admin' : 'user'); |
|
$user->setHomeDir('/'); |
|
$user->setPermissions('read|write|upload|download|batchdownload|zip', true); |
|
$this->store($user); |
|
|
|
return true; |
|
} |
|
|
|
public function find($username): ?User |
|
{ |
|
return null; |
|
} |
|
|
|
public function store(User $user) |
|
{ |
|
return $this->session->set(self::SESSION_KEY, $user); |
|
} |
|
|
|
public function update($username, User $user, $password = ''): User |
|
{ |
|
return $user; |
|
} |
|
|
|
public function add(User $user, $password): User { |
|
return $user; |
|
} |
|
|
|
public function delete(User $user) { |
|
return; |
|
} |
|
|
|
public function getGuest(): User { |
|
return new User(); |
|
} |
|
|
|
public function allUsers(): UsersCollection { |
|
return new UsersCollection(); |
|
} |
|
|
|
} |