1
0
Fork 0
mirror of synced 2024-10-03 19:53:33 +13:00

Fix race condition

This commit is contained in:
Matej Bačo 2023-04-28 09:30:30 +02:00
parent 6c6154b3d4
commit 8c1d89c33c
4 changed files with 79 additions and 55 deletions

2
.gitmodules vendored
View file

@ -1,4 +1,4 @@
[submodule "app/console"]
path = app/console
url = https://github.com/appwrite/console
branch = feat-oauth
branch = feat/cloud-beta-card

View file

@ -1,32 +1,32 @@
{
"eldad@appwrite.io": { "memberSince": "2020-10-15", "spot": "0", "gitHub": "eldadfux" },
"christy@appwrite.io": { "memberSince": "2020-12-01", "spot": "1", "gitHub": "https://github.com/christyjacob4" },
"torsten@appwrite.io": { "memberSince": "2020-12-28", "spot": "2", "gitHub": "https://github.com/torstendittmann " },
"damodar@appwrite.io": { "memberSince": "2021-01-02", "spot": "3", "gitHub": "https://github.com/lohanidamodar" },
"bradley@appwrite.io": { "memberSince": "2021-05-21", "spot": "5", "gitHub": "https://github.com/PineappleIOnic" },
"jake@appwrite.io": { "memberSince": "2021-06-28", "spot": "6", "gitHub": "https://github.com/abnegate" },
"sara@appwrite.io": { "memberSince": "2021-08-16", "spot": "7", "gitHub": "https://github.com/sarakaandorp" },
"christy@appwrite.io": { "memberSince": "2020-12-01", "spot": "1", "gitHub": "christyjacob4" },
"torsten@appwrite.io": { "memberSince": "2020-12-28", "spot": "2", "gitHub": "torstendittmann" },
"damodar@appwrite.io": { "memberSince": "2021-01-02", "spot": "3", "gitHub": "lohanidamodar" },
"bradley@appwrite.io": { "memberSince": "2021-05-21", "spot": "5", "gitHub": "PineappleIOnic" },
"jake@appwrite.io": { "memberSince": "2021-06-28", "spot": "6", "gitHub": "abnegate" },
"sara@appwrite.io": { "memberSince": "2021-08-16", "spot": "7", "gitHub": "sarakaandorp" },
"matej@appwrite.io": { "memberSince": "2021-08-23", "spot": "8", "gitHub": "meldiron" },
"aditya@appwrite.io": { "memberSince": "2021-09-01", "spot": "9", "gitHub": "https://github.com/adityaoberai" },
"wess@appwrite.io": { "memberSince": "2021-11-08", "spot": "12", "gitHub": "https://github.com/wess" },
"may@appwrite.io": { "memberSince": "2021-11-28", "spot": "14", "gitHub": "https://github.com/MayEnder" },
"elad@appwrite.io": { "memberSince": "2021-12-19", "spot": "15", "gitHub": "https://github.com/elad2412" },
"vincent@appwrite.io": { "memberSince": "2022-01-01", "spot": "16", "gitHub": "https://github.com/gewenyu99" },
"haimantika@appwrite.io": { "memberSince": "2022-04-01", "spot": "18", "gitHub": "https://github.com/Haimantika" },
"chen@appwrite.io": { "memberSince": "2022-01-24", "spot": "19", "gitHub": "https://github.com/chenparnasa" },
"tessa@appwrite.io": { "memberSince": "2022-04-21", "spot": "20", "gitHub": "https://github.com/tessamero" },
"shimon@appwrite.io": { "memberSince": "2022-05-01", "spot": "23", "gitHub": "https://github.com/shimonewman" },
"shmuel@appwrite.io": { "memberSince": "2022-03-20", "spot": "24", "gitHub": "https://github.com/fogelito" },
"arman@appwrite.io": { "memberSince": "2022-04-04", "spot": "25", "gitHub": "https://github.com/ArmanNik" },
"carla@appwrite.io": { "memberSince": "2022-04-04", "spot": "26", "gitHub": "https://github.com/heyCarla" },
"emma@appwrite.io": { "memberSince": "2022-05-08", "spot": "27", "gitHub": "https://github.com/emmacarpagnano1" },
"dylan@appwrite.io": { "memberSince": "2022-05-09", "spot": "28", "gitHub": "https://github.com/DylanG-64" },
"steven@appwrite.io": { "memberSince": "2022-07-01", "spot": "30", "gitHub": "https://github.com/stnguyen90" },
"jyoti@appwrite.io": { "memberSince": "2022-10-24", "spot": "31", "gitHub": "https://github.com/joeyouss" },
"jade@appwrite.io": { "memberSince": "2022-10-31", "spot": "32", "gitHub": "https://github.com/dajebp" },
"khushboo@appwrite.io": { "memberSince": "2021-11-08", "spot": "13", "gitHub": "https://github.com/vermakhushboo" },
"thomas@appwrite.io": { "memberSince": "2022-11-03", "spot": "34", "gitHub": "https://github.com/TGlide/" },
"holly@appwrite.io": { "memberSince": "2022-12-05", "spot": "35", "gitHub": "" },
"laura@appwrite.io": { "memberSince": "2023-01-25", "spot": "36", "gitHub": "https://github.com/LauraDuRy" },
"caio@appwrite.io": { "memberSince": "2023-03-27", "spot": "37", "gitHub": "https://github.com/ariascaio" }
"aditya@appwrite.io": { "memberSince": "2021-09-01", "spot": "9", "gitHub": "adityaoberai" },
"wess@appwrite.io": { "memberSince": "2021-11-08", "spot": "12", "gitHub": "wess" },
"may@appwrite.io": { "memberSince": "2021-11-28", "spot": "14", "gitHub": "MayEnder" },
"elad@appwrite.io": { "memberSince": "2021-12-19", "spot": "15", "gitHub": "elad2412" },
"vincent@appwrite.io": { "memberSince": "2022-01-01", "spot": "16", "gitHub": "gewenyu99" },
"haimantika@appwrite.io": { "memberSince": "2022-04-01", "spot": "18", "gitHub": "Haimantika" },
"chen@appwrite.io": { "memberSince": "2022-01-24", "spot": "19", "gitHub": "chenparnasa" },
"tessa@appwrite.io": { "memberSince": "2022-04-21", "spot": "20", "gitHub": "tessamero" },
"shimon@appwrite.io": { "memberSince": "2022-05-01", "spot": "23", "gitHub": "shimonewman" },
"shmuel@appwrite.io": { "memberSince": "2022-03-20", "spot": "24", "gitHub": "fogelito" },
"arman@appwrite.io": { "memberSince": "2022-04-04", "spot": "25", "gitHub": "ArmanNik" },
"carla@appwrite.io": { "memberSince": "2022-04-04", "spot": "26", "gitHub": "heyCarla" },
"emma@appwrite.io": { "memberSince": "2022-05-08", "spot": "27", "gitHub": "emmacarpagnano1" },
"dylan@appwrite.io": { "memberSince": "2022-05-09", "spot": "28", "gitHub": "DylanG-64" },
"steven@appwrite.io": { "memberSince": "2022-07-01", "spot": "30", "gitHub": "stnguyen90" },
"jyoti@appwrite.io": { "memberSince": "2022-10-24", "spot": "31", "gitHub": "joeyouss" },
"jade@appwrite.io": { "memberSince": "2022-10-31", "spot": "32", "gitHub": "dajebp" },
"khushboo@appwrite.io": { "memberSince": "2021-11-08", "spot": "13", "gitHub": "vermakhushboo" },
"thomas@appwrite.io": { "memberSince": "2022-11-03", "spot": "34", "gitHub": "TGlide" },
"holly@appwrite.io": { "memberSince": "2022-12-05", "spot": "35", "gitHub": "HollyBarclay" },
"laura@appwrite.io": { "memberSince": "2023-01-25", "spot": "36", "gitHub": "LauraDuRy" },
"caio@appwrite.io": { "memberSince": "2023-03-27", "spot": "37", "gitHub": "ariascaio" }
}

@ -1 +1 @@
Subproject commit 297f5f24389c905e4e2ff93f8fe6ed6f2e06e614
Subproject commit 61de491bb2651a996cfc9aa4a3eb432c6b2b9de9

View file

@ -57,12 +57,16 @@ $avatarCallback = function (string $type, string $code, int $width, int $height,
unset($image);
};
$getUserGitHub = function (Document $user, Document $project, Database $dbForProject) {
$getUserGitHub = function (string $userId, Document $project, Database $dbForProject, Database $dbForConsole) {
try {
$user = Authorization::skip(fn () => $dbForConsole->getDocument('users', $userId));
$sessions = $user->getAttribute('sessions', []);
$session = $sessions[0] ?? new Document();
$provider = $session->getAttribute('provider');
$accessToken = $session->getAttribute('providerAccessToken');
$accessTokenExpiry = $session->getAttribute('providerAccessTokenExpiry');
$refreshToken = $session->getAttribute('providerRefreshToken');
$appId = $project->getAttribute('authProviders', [])[$provider . 'Appid'] ?? '';
@ -76,25 +80,45 @@ $getUserGitHub = function (Document $user, Document $project, Database $dbForPro
$oauth2 = new $className($appId, $appSecret, '', [], []);
try {
$oauth2->refreshTokens($refreshToken);
$isExpired = new \DateTime($accessTokenExpiry) < new \DateTime('now');
$isExpired = true;
if ($isExpired) {
try {
$oauth2->refreshTokens($refreshToken);
$accessToken = $oauth2->getAccessToken('');
$refreshToken = $oauth2->getRefreshToken('');
$accessToken = $oauth2->getAccessToken('');
$refreshToken = $oauth2->getRefreshToken('');
$session
->setAttribute('providerAccessToken', $accessToken)
->setAttribute('providerRefreshToken', $refreshToken)
->setAttribute('providerAccessTokenExpiry', DateTime::addSeconds(new \DateTime(), (int)$oauth2->getAccessTokenExpiry('')));
if (empty($accessToken) || empty($refreshToken)) {
throw new \Exception("Generation race-condition occured."); // Handeled properly in catch
}
Authorization::skip(fn () => $dbForProject->updateDocument('sessions', $session->getId(), $session));
$session
->setAttribute('providerAccessToken', $accessToken)
->setAttribute('providerRefreshToken', $refreshToken)
->setAttribute('providerAccessTokenExpiry', DateTime::addSeconds(new \DateTime(), (int)$oauth2->getAccessTokenExpiry('')));
$dbForProject->deleteCachedDocument('users', $user->getId());
} catch (Throwable $err) {
// TODO: Fix Race contition
$sessions = $user->getAttribute('sessions', []);
$session = $sessions[0] ?? new Document();
$accessToken = $session->getAttribute('providerAccessToken');
Authorization::skip(fn () => $dbForProject->updateDocument('sessions', $session->getId(), $session));
$dbForProject->deleteCachedDocument('users', $user->getId());
} catch (Throwable $err) {
$index = 0;
do {
$oldAccessToken = $accessToken;
$user = Authorization::skip(fn () => $dbForConsole->getDocument('users', $userId));
$sessions = $user->getAttribute('sessions', []);
$session = $sessions[0] ?? new Document();
$accessToken = $session->getAttribute('providerAccessToken');
if ($accessToken !== $oldAccessToken) {
break;
}
$index++;
sleep(0.5);
} while ($index < 10);
}
}
$githubUser = $oauth2->getUserSlug($accessToken);
@ -510,7 +534,7 @@ App::get('/v1/cards/cloud')
$email = $user->getAttribute('email', '');
$createdAt = new \DateTime($user->getCreatedAt());
$gitHub = $getUserGitHub($user, $project, $dbForProject);
$gitHub = $getUserGitHub($user->getId(), $project, $dbForProject, $dbForConsole);
$githubName = $gitHub['name'] ?? '';
$githubId = $gitHub['id'] ?? '';
@ -525,7 +549,7 @@ App::get('/v1/cards/cloud')
$createdAt = new \DateTime($employees[$email]['memberSince'] ?? '');
}
if (!$isEmployee) {
if (!$isEmployee && !empty($githubName)) {
$employeeGitHub = \array_search(\strtolower($githubName), \array_map(fn ($employee) => \strtolower($employee['gitHub']) ?? '', $employees));
if (!empty($employeeGitHub)) {
$isEmployee = true;
@ -713,7 +737,7 @@ App::get('/v1/cards/cloud-back')
$userId = $user->getId();
$email = $user->getAttribute('email', '');
$gitHub = $getUserGitHub($user, $project, $dbForProject);
$gitHub = $getUserGitHub($user->getId(), $project, $dbForProject, $dbForConsole);
$githubId = $gitHub['id'] ?? '';
$isHero = \array_key_exists($email, $heroes);
@ -795,7 +819,7 @@ App::get('/v1/cards/cloud-og')
$email = $user->getAttribute('email', '');
$createdAt = new \DateTime($user->getCreatedAt());
$gitHub = $getUserGitHub($user, $project, $dbForProject);
$gitHub = $getUserGitHub($user->getId(), $project, $dbForProject, $dbForConsole);
$githubName = $gitHub['name'] ?? '';
$githubId = $gitHub['id'] ?? '';
@ -810,7 +834,7 @@ App::get('/v1/cards/cloud-og')
$createdAt = new \DateTime($employees[$email]['memberSince'] ?? '');
}
if (!$isEmployee) {
if (!$isEmployee && !empty($githubName)) {
$employeeGitHub = \array_search(\strtolower($githubName), \array_map(fn ($employee) => \strtolower($employee['gitHub']) ?? '', $employees));
if (!empty($employeeGitHub)) {
$isEmployee = true;
@ -913,7 +937,7 @@ App::get('/v1/cards/cloud-og')
if ($cardVariation === '1') {
$group->rotateImage(new ImagickPixel('#00000000'), -22);
if(\strlen($employeeNumber) <= 1) {
if (\strlen($employeeNumber) <= 1) {
$baseImage->compositeImage($group, Imagick::COMPOSITE_OVER, 660, 245);
} else {
$baseImage->compositeImage($group, Imagick::COMPOSITE_OVER, 655, 247);
@ -921,7 +945,7 @@ App::get('/v1/cards/cloud-og')
} else {
$group->rotateImage(new ImagickPixel('#00000000'), 32);
if(\strlen($employeeNumber) <= 1) {
if (\strlen($employeeNumber) <= 1) {
$baseImage->compositeImage($group, Imagick::COMPOSITE_OVER, 775, 465);
} else {
$baseImage->compositeImage($group, Imagick::COMPOSITE_OVER, 767, 470);
@ -960,7 +984,7 @@ App::get('/v1/cards/cloud-og')
$name = \substr($name, 0, 33);
}
if($cardVariation === '1') {
if ($cardVariation === '1') {
if (\strlen($name) <= 23) {
$text->setFontSize(54);
} else {
@ -973,7 +997,7 @@ App::get('/v1/cards/cloud-og')
$text->setFontSize(28);
}
}
$text->setFontWeight(700);
if ($cardVariation === '1') {