🔑 feat: infinite key expiry (#3252)

This commit is contained in:
Marco Beretta 2024-07-05 17:15:09 +03:00 committed by GitHub
parent 1aad315de6
commit 1edbfdbce2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 37 additions and 23 deletions

View file

@ -93,7 +93,7 @@ const getUserKeyExpiry = async ({ userId, name }) => {
if (!keyValue) {
return { expiresAt: null };
}
return { expiresAt: keyValue.expiresAt };
return { expiresAt: keyValue.expiresAt || 'never' };
};
/**
@ -108,18 +108,23 @@ const getUserKeyExpiry = async ({ userId, name }) => {
* @description This function either updates an existing user key or inserts a new one into the database,
* after encrypting the provided value. It sets the provided expiry date for the key.
*/
const updateUserKey = async ({ userId, name, value, expiresAt }) => {
const updateUserKey = async ({ userId, name, value, expiresAt = null }) => {
const encryptedValue = encrypt(value);
return await Key.findOneAndUpdate(
{ userId, name },
{
userId,
name,
value: encryptedValue,
expiresAt: new Date(expiresAt),
},
{ upsert: true, new: true },
).lean();
let updateObject = {
userId,
name,
value: encryptedValue,
};
// Only add expiresAt to the update object if it's not null
if (expiresAt) {
updateObject.expiresAt = new Date(expiresAt);
}
return await Key.findOneAndUpdate({ userId, name }, updateObject, {
upsert: true,
new: true,
}).lean();
};
/**

View file

@ -41,6 +41,7 @@ const EXPIRY = {
ONE_DAY: { display: 'in 1 day', value: 24 * 60 * 60 * 1000 },
ONE_WEEK: { display: 'in 7 days', value: 7 * 24 * 60 * 60 * 1000 },
ONE_MONTH: { display: 'in 30 days', value: 30 * 24 * 60 * 60 * 1000 },
NEVER: { display: 'never', value: 0 },
};
const SetKeyDialog = ({
@ -84,7 +85,13 @@ const SetKeyDialog = ({
const submit = () => {
const selectedOption = expirationOptions.find((option) => option.display === expiresAtLabel);
const expiresAt = Date.now() + (selectedOption ? selectedOption.value : 0);
let expiresAt;
if (selectedOption?.value === 0) {
expiresAt = null;
} else {
expiresAt = Date.now() + (selectedOption ? selectedOption.value : 0);
}
const saveKey = (key: string) => {
saveUserKey(key, expiresAt);
@ -160,12 +167,12 @@ const SetKeyDialog = ({
main={
<div className="grid w-full items-center gap-2">
<small className="text-red-600">
{`${localize('com_endpoint_config_key_encryption')} ${
!expiryTime
? localize('com_endpoint_config_key_expiry')
: `${new Date(expiryTime).toLocaleString()}`
}`}
</small>
{expiryTime === 'never'
? localize('com_endpoint_config_key_never_expires')
: `${localize('com_endpoint_config_key_encryption')} ${new Date(
expiryTime,
).toLocaleString()}`}
</small>{' '}
<Dropdown
label="Expires "
value={expiresAtLabel}

View file

@ -21,16 +21,17 @@ const useUserKey = (endpoint: string) => {
const updateKey = useUpdateUserKeysMutation();
const checkUserKey = useUserKeyQuery(keyName);
const getExpiry = useCallback(() => {
if (checkUserKey.data) {
return checkUserKey.data.expiresAt;
return checkUserKey.data?.expiresAt || 'never';
}
}, [checkUserKey.data]);
const checkExpiry = useCallback(() => {
const expiresAt = getExpiry();
if (!expiresAt) {
return false;
return true;
}
const expiresAtDate = new Date(expiresAt);
@ -41,8 +42,8 @@ const useUserKey = (endpoint: string) => {
}, [getExpiry]);
const saveUserKey = useCallback(
(userKey: string, expiresAt: number) => {
const dateStr = new Date(expiresAt).toISOString();
(userKey: string, expiresAt: number | null) => {
const dateStr = expiresAt ? new Date(expiresAt).toISOString() : '';
updateKey.mutate({
name: keyName,
value: userKey,

View file

@ -507,6 +507,7 @@ export default {
com_endpoint_config_value: 'Enter value for',
com_endpoint_config_key_name_placeholder: 'Set API key first',
com_endpoint_config_key_encryption: 'Your key will be encrypted and deleted at',
com_endpoint_config_key_never_expires: 'Your key will never expire',
com_endpoint_config_key_expiry: 'the expiry time',
com_endpoint_config_click_here: 'Click Here',
com_endpoint_config_google_service_key: 'Google Service Account Key',