close(); } } /** * Get the way we will refer to the user against whom action is being taken * * @param string $email The e-mail address of the user * @return string The string to use when displaying results */ function display_user(string $email): string { return $email == Security::SINGLE_USER_EMAIL ? 'single-user mode user' : "user \"$email\""; } /** * Set a user's password */ function set_password(string $email, string $password): void { $db = Data::getConnection(); try { $displayUser = display_user($email); // Ensure this user exists $user = Security::findUserByEmail($email, $db); if (!$user) { printfn('No %s exists', $displayUser); return; } Security::updatePassword($email, $password, $db); $msg = $email == Security::SINGLE_USER_EMAIL && $password == Security::SINGLE_USER_PASSWORD ? 'reset' : sprintf('set to "%s"', $password); printfn('%s password %s successfully', init_cap($displayUser), $msg); } finally { $db->close(); } } /** * Delete a user * * @param string $email The e-mail address of the user to be deleted */ function delete_user(string $email): void { $db = Data::getConnection(); try { $displayUser = display_user($email); // Get the ID for the provided e-mail address $user = Security::findUserByEmail($email, $db); if (!$user) { printfn('No %s exists', $displayUser); return; } $feedCountQuery = $db->prepare('SELECT COUNT(*) FROM feed WHERE user_id = :user'); $feedCountQuery->bindValue(':user', $user['id']); $feedCountResult = $feedCountQuery->execute(); if (!$feedCountResult) { printfn('SQLite error: %s', $db->lastErrorMsg()); return; } $feedCount = $feedCountResult->fetchArray(SQLITE3_NUM); $proceed = readline("Delete the $displayUser and their $feedCount[0] feed(s)? (y/N)" . PHP_EOL); if (!$proceed || !str_starts_with(strtolower($proceed), 'y')) { printfn('Deletion canceled'); return; } $itemDelete = $db->prepare('DELETE FROM item WHERE feed_id IN (SELECT id FROM feed WHERE user_id = :user)'); $itemDelete->bindValue(':user', $user['id']); $itemDelete->execute(); $feedDelete = $db->prepare('DELETE FROM feed WHERE user_id = :user'); $feedDelete->bindValue(':user', $user['id']); $feedDelete->execute(); $userDelete = $db->prepare('DELETE FROM frc_user WHERE id = :user'); $userDelete->bindValue(':user', $user['id']); $userDelete->execute(); printfn('%s deleted successfully', init_cap($displayUser)); } finally { $db->close(); } } /** * Change the single-user mode user to a different e-mail address and password */ function migrate_single_user(): void { global $argv; $db = Data::getConnection(); try { $single = Security::findUserByEmail(Security::SINGLE_USER_EMAIL, $db); if (!$single) { printfn('There is no single-user mode user to be migrated'); return; } $migrateQuery = $db->prepare('UPDATE frc_user SET email = :email, password = :password WHERE id = :id'); $migrateQuery->bindValue(':email', $argv[2]); $migrateQuery->bindValue(':password', password_hash($argv[3], Security::PW_ALGORITHM)); $migrateQuery->bindValue(':id', $single['id']); $migrateQuery->execute(); printfn('The single user has been moved to "%s", with password "%s"', $argv[2], $argv[3]); } finally { $db->close(); } }