support for local users with extra-data needed for activity-pub
This commit is contained in:
parent
199922299d
commit
0d3a7c871b
7 changed files with 76 additions and 11 deletions
|
@ -13,6 +13,13 @@ namespace Federator\Data;
|
|||
*/
|
||||
class User
|
||||
{
|
||||
/**
|
||||
* user id on the external system
|
||||
*
|
||||
* @var string $externalid
|
||||
*/
|
||||
public $externalid;
|
||||
|
||||
/**
|
||||
* user id
|
||||
*
|
||||
|
@ -52,6 +59,7 @@ class User
|
|||
}
|
||||
$user = new User();
|
||||
$user->id = $data['id'];
|
||||
$user->externalid = $data['externalid'];
|
||||
/// TODO: replace with enums
|
||||
$user->permissions = $data['permissions'];
|
||||
return $user;
|
||||
|
@ -79,6 +87,7 @@ class User
|
|||
{
|
||||
$data = [
|
||||
'id' => $this->id,
|
||||
'externalid' => $this->externalid,
|
||||
'permissions' => $this->permissions
|
||||
];
|
||||
return json_encode($data) | '';
|
||||
|
|
|
@ -14,14 +14,60 @@ namespace Federator\DIO;
|
|||
class User
|
||||
{
|
||||
/**
|
||||
* extend the given user with internal data
|
||||
* @param \mysqli $dbh database handle @unused-param
|
||||
* @param \Federator\Data\User $user user to extend @unused-param
|
||||
* add local user based on given user object received from remote service
|
||||
* @param \mysqli $dbh database handle
|
||||
* @param \Federator\Data\User $user user object to use
|
||||
* @param string $_user user/profile name
|
||||
* @return void
|
||||
*/
|
||||
protected static function extendUser(\mysqli $dbh, \Federator\Data\User $user) : void
|
||||
protected static function addLocalUser($dbh, $user, $_user)
|
||||
{
|
||||
// do nothing for now
|
||||
// TODO: if a new user, create own database entry with additionally needed info
|
||||
echo "a new user\n";
|
||||
// needed fields: RSA key pair, user name (handle)
|
||||
|
||||
$private_key = openssl_pkey_new();
|
||||
if ($private_key === false) {
|
||||
throw new \Federator\Exceptions\ServerError();
|
||||
}
|
||||
$public = openssl_pkey_get_details($private_key)['key'];
|
||||
$private = '';
|
||||
openssl_pkey_export($private_key, $private);
|
||||
$sql = 'insert into users (id, externalid, rsapublic, rsaprivate) values (?, ?, ?, ?)';
|
||||
$stmt = $dbh->prepare($sql);
|
||||
if ($stmt === false) {
|
||||
throw new \Federator\Exceptions\ServerError();
|
||||
}
|
||||
$stmt->bind_param("ssss", $_user, $user->externalid, $public, $private);
|
||||
$stmt->execute();
|
||||
$stmt->close();
|
||||
}
|
||||
|
||||
/**
|
||||
* extend the given user with internal data
|
||||
* @param \mysqli $dbh database handle
|
||||
* @param \Federator\Data\User $user user to extend
|
||||
* @param string $_user user/profile name
|
||||
*/
|
||||
protected static function extendUser(\mysqli $dbh, $user, $_user) : void
|
||||
{
|
||||
$sql = 'select id from users where id=?';
|
||||
$stmt = $dbh->prepare($sql);
|
||||
if ($stmt === false) {
|
||||
throw new \Federator\Exceptions\ServerError();
|
||||
}
|
||||
$stmt->bind_param("s", $_user);
|
||||
$ret = $stmt->bind_result($user->id);
|
||||
$stmt->execute();
|
||||
if ($ret) {
|
||||
$stmt->fetch();
|
||||
}
|
||||
$stmt->close();
|
||||
// if a new user, create own database entry with additionally needed info
|
||||
if ($user->id === null) {
|
||||
self::addLocalUser($dbh, $user, $_user);
|
||||
}
|
||||
|
||||
// no further processing for now
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -55,7 +101,7 @@ class User
|
|||
if ($user === false) {
|
||||
return false;
|
||||
}
|
||||
self::extendUser($dbh, $user);
|
||||
self::extendUser($dbh, $user, $_user);
|
||||
if ($cache !== null && $saveToCache) {
|
||||
$cache->saveRemoteUserBySession($_session, $_user, $user);
|
||||
}
|
||||
|
|
|
@ -29,7 +29,7 @@ class DummyConnector implements Connector
|
|||
{
|
||||
// validate $_session and $user
|
||||
$user = new \Federator\Data\User();
|
||||
$user->id = $_user;
|
||||
$user->externalid = $_user;
|
||||
$user->permissions = ['PUBLISH'];
|
||||
$user->session = $_session;
|
||||
return $user;
|
||||
|
|
|
@ -34,6 +34,13 @@ class RedisCache implements Cache
|
|||
*/
|
||||
private $redis;
|
||||
|
||||
/**
|
||||
* user cache time to life
|
||||
*
|
||||
* @var int time to life in secons
|
||||
*/
|
||||
private $userTTL;
|
||||
|
||||
/**
|
||||
* constructor
|
||||
*/
|
||||
|
@ -42,6 +49,7 @@ class RedisCache implements Cache
|
|||
$config = parse_ini_file('../rediscache.ini');
|
||||
if ($config !== false) {
|
||||
$this->config = $config;
|
||||
$this->userTTL = array_key_exists('userttl', $config) ? intval($config['userttl'], 10) : 60;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -104,7 +112,7 @@ class RedisCache implements Cache
|
|||
{
|
||||
$key = self::createKey('u', $_session, $_user);
|
||||
$serialized = $user->toJson();
|
||||
$this->redis->set($key, $serialized);
|
||||
$this->redis->setEx($key, $this->userTTL, $serialized,);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -15,8 +15,8 @@ primary goal is to connect ContentNation via ActivityPub again.
|
|||
- [X] API framework
|
||||
- [X] interfact to connect to existing service
|
||||
- [X] cache layer for users minmal version
|
||||
- [ ] overlay to extend with needed info like private keys, urls, ...
|
||||
- [ ] full cache for users
|
||||
- [X] overlay to extend with needed info like private keys, urls, ...
|
||||
- [X] full cache for users
|
||||
- [ ] webfinger
|
||||
- [ ] discovery endpoints
|
||||
- [ ] ap outbox
|
||||
|
|
|
@ -3,3 +3,4 @@ host = localhost
|
|||
port = 6379
|
||||
username = federator
|
||||
password = redis*change*password
|
||||
userttl = 10
|
||||
|
|
|
@ -1,2 +1,3 @@
|
|||
create table settings(`key` varchar(255) unique primary key, `value` text);
|
||||
create table users(`id` varchar(255) unique primary key, `externalid` varchar(255), index(`externalid`), `rsapublic` text, `rsaprivate` text);
|
||||
insert into settings (`key`, `value`) value ("database_version", "2024-08-19");
|
||||
|
|
Loading…
Reference in a new issue