Я не знаком с внутренностями PostgreSQL или конфигурацией PostgreSQL. Мой первый подход заключается в изучении документации, чтобы определить, можно ли установить максимальное время истечения срока действия пароля с использованием прав администратора. Я предполагаю, что вы уже изучили это подробно и чувствуете, что это лучший вариант.
Исходя из этого, я просмотрел код временной метки в репозитории Postgres github. Я не скомпилировал это, но считаю, что это близко. Мне не было ясно, что такое Datum, является ли это типом TimeStampTz, или это нужно каким-то образом преобразовать. Он может не скомпилироваться должным образом без ответа на этот вопрос. Дайте мне знать, если это работает для вас:
В верхней части файла добавьте это в список включений:
#include "utils/timestamp.h"
Позже, там же, где вы разместили текущий код, замените его следующим:
if (validuntil_null) {
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("password expiriration missing")));
} else {
TimestampTz now = GetCurrentTimestamp();
const int ThreeMonthsInMiliSeconds = 90 * 24 * 3600 * 1000;
if(TimestampDifferenceExceeds(now, validuntil_time, ThreeMonthsInMiliSeconds) {
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("password expiriration time is greater than 90 days")));
}
}
Вот исходный код для этой функции timedifference из timestamp.c:
/*
* TimestampDifferenceExceeds -- report whether the difference between two
* timestamps is >= a threshold (expressed in milliseconds)
*
* Both inputs must be ordinary finite timestamps (in current usage,
* they'll be results from GetCurrentTimestamp()).
*/
bool
TimestampDifferenceExceeds(TimestampTz start_time,
TimestampTz stop_time,
int msec)
{
TimestampTz diff = stop_time - start_time;
return (diff >= msec * INT64CONST(1000));
}