Added user resolve endpoint for Sock Chat.

This commit is contained in:
flash 2021-07-30 22:27:47 +02:00
parent 1589be2245
commit 9de494e671
3 changed files with 62 additions and 24 deletions

0
msz Executable file → Normal file
View file

View file

@ -54,6 +54,7 @@ Router::addRoutes(
Route::group('/_sockchat', 'SockChat')->addChildren(
Route::get('/emotes', 'emotes'),
Route::get('/login', 'login'),
Route::get('/resolve', 'resolve'),
Route::post('/bump', 'bump'),
Route::post('/verify', 'verify'),
Route::get('/bans', 'bans')->addChildren(

View file

@ -95,6 +95,21 @@ final class SockChatHandler extends Handler {
return $this->login($response, $request);
}
public static function calculatePermissions(User $userInfo): int {
$perms = self::PERMS_DEFAULT;
if(perms_check_user(MSZ_PERMS_USER, $userInfo->getId(), MSZ_PERM_USER_MANAGE_USERS))
$perms |= self::PERMS_MANAGE_USERS;
if(perms_check_user(MSZ_PERMS_USER, $userInfo->getId(), MSZ_PERM_USER_MANAGE_WARNINGS))
$perms |= self::PERMS_MANAGE_WARNS;
if(perms_check_user(MSZ_PERMS_USER, $userInfo->getId(), MSZ_PERM_USER_CHANGE_BACKGROUND))
$perms |= self::PERMS_CHANGE_BACKG;
if(perms_check_user(MSZ_PERMS_FORUM, $userInfo->getId(), MSZ_PERM_FORUM_MANAGE_FORUMS))
$perms |= self::PERMS_MANAGE_FORUM;
return $perms;
}
public function emotes(HttpResponse $response, HttpRequest $request): array {
$response->setHeader('Access-Control-Allow-Origin', '*')
->setHeader('Access-Control-Allow-Methods', 'GET');
@ -134,12 +149,17 @@ final class SockChatHandler extends Handler {
continue;
$isPermanent = $warning->isPermanent();
$userInfo = $warning->getUser();
$bans[] = [
'id' => $warning->getUser()->getId(),
'expires' => date('c', $isPermanent ? 0x7FFFFFFF : $warning->getExpirationTime()),
'is_permanent' => $isPermanent,
'user_id' => $userInfo->getId(),
'id' => $userInfo->getId(),
'username' => $userInfo->getUsername(),
'colour_raw' => $userInfo->getColour()->getRaw(),
'rank' => $rank = $userInfo->getRank(),
'ip' => $warning->getUserRemoteAddress(),
'username' => $warning->getUser()->getUsername(),
'is_permanent' => $isPermanent,
'expires' => date('c', $isPermanent ? 0x7FFFFFFF : $warning->getExpirationTime()),
'perms' => self::calculatePermissions($userInfo),
];
}
@ -162,6 +182,7 @@ final class SockChatHandler extends Handler {
if($warning !== null) {
$response['warning'] = $warning->getId();
$response['id'] = $warning->getUserId();
$response['user_id'] = $warning->getUserId();
$response['ip'] = $warning->getUserRemoteAddress();
$response['is_permanent'] = $warning->isPermanent();
$response['expires'] = date('c', $response['is_permanent'] ? 0x7FFFFFFF : $warning->getExpirationTime());
@ -236,13 +257,7 @@ final class SockChatHandler extends Handler {
break;
case 'user':
try {
$userInfo = User::byUsername($subject);
} catch(UserNotFoundException $ex) {
return 404;
}
$warning = UserWarning::byUserIdActive($userInfo->getId());
$warning = UserWarning::byUserIdActive((int)$subject);
break;
}
@ -385,25 +400,47 @@ final class SockChatHandler extends Handler {
$userInfo->bumpActivity($authInfo->ip);
$perms = self::PERMS_DEFAULT;
if(perms_check_user(MSZ_PERMS_USER, $userInfo->getId(), MSZ_PERM_USER_MANAGE_USERS))
$perms |= self::PERMS_MANAGE_USERS;
if(perms_check_user(MSZ_PERMS_USER, $userInfo->getId(), MSZ_PERM_USER_MANAGE_WARNINGS))
$perms |= self::PERMS_MANAGE_WARNS;
if(perms_check_user(MSZ_PERMS_USER, $userInfo->getId(), MSZ_PERM_USER_CHANGE_BACKGROUND))
$perms |= self::PERMS_CHANGE_BACKG;
if(perms_check_user(MSZ_PERMS_FORUM, $userInfo->getId(), MSZ_PERM_FORUM_MANAGE_FORUMS))
$perms |= self::PERMS_MANAGE_FORUM;
return [
'success' => true,
'user_id' => $userInfo->getId(),
'username' => $userInfo->getUsername(),
'colour_raw' => $userInfo->getColour()->getRaw(),
'hierarchy' => $userInfo->getRank(),
'rank' => $rank = $userInfo->getRank(),
'hierarchy' => $rank,
'is_silenced' => date('c', $userInfo->isSilenced() || $userInfo->isBanned() ? ($userInfo->isActiveWarningPermanent() ? strtotime('10 years') : $userInfo->getActiveWarningExpiration()) : 0),
'perms' => $perms,
'perms' => self::calculatePermissions($userInfo),
];
}
public function resolve(HttpResponse $response, HttpRequest $request): array {
$userHash = $request->getHeaderLine('X-SharpChat-Signature');
$method = (string)$request->getQueryParam('m', FILTER_SANITIZE_STRING);
$param = (string)$request->getQueryParam('p', FILTER_SANITIZE_STRING);
$realHash = hash_hmac('sha256', "resolve#{$method}#{$param}", $this->hashKey);
if(!hash_equals($realHash, $userHash))
return [];
try {
switch($method) {
case 'id':
$userInfo = User::byId((int)$param);
break;
case 'name':
$userInfo = User::byUsername($param);
break;
}
} catch(UserNotFoundException $ex) {
return [];
}
return [
'user_id' => $userInfo->getId(),
'username' => $userInfo->getUsername(),
'colour_raw' => $userInfo->getColour()->getRaw(),
'rank' => $rank = $userInfo->getRank(),
'perms' => self::calculatePermissions($userInfo),
];
}
}