Postgresql passwordcheck.c модификация - PullRequest
0 голосов
/ 30 октября 2018

Мне нужно изменить https://github.com/postgres/postgres/blob/REL9_5_13/contrib/passwordcheck/passwordcheck.c, чтобы проверить пароль перед его установкой.

Я не очень хорош с C.

Итак, я добавил эту проверку:

if (validuntil_null)
            ereport(ERROR,
                (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                 errmsg("password expiriration missing")));

и работает, проверяет, установлена ​​ли дата истечения срока действия.

Теперь я хочу проверить, является ли эта дата истечения срока действия разумной, например, не более 3 месяцев (с использованием «validuntil_time») и отличается ли она от предыдущего набора.

Есть идеи?

спасибо заранее.

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Спасибо, Джон, в конце я справился так:

if (validuntil_null) {
ereport(ERROR,
        (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                errmsg("password expiriration missing")));
} else {
TimestampTz now = GetCurrentTimestamp();
const off64_t threshold = (const off64_t)((off64_t)90 * 24 * 3600 * 1000 );
  if (now > validuntil_time) {
            ereport(ERROR,
                    (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                     errmsg("\nERROR now: %ld validuntil_time: %ld threshold: %ld",now,validuntil_time,threshold)));
  } else {
    const off64_t diff= (const off64_t)((off64_t)(validuntil_time - now)/1000);
    if (diff >= threshold) {
        ereport(ERROR,
                    (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                     errmsg("\nERROR: DATE is more than 90 days: now: %ld validuntil_time: %ld threshold: %ld",now,validuntil_time,threshold)));
    }
    elog(INFO,"\nnow: %ld validuntil_time: %ld threshold: %ld diff: %ld",now,validuntil_time,threshold,diff);
         }
}   

Спасибо

0 голосов
/ 30 октября 2018

Я не знаком с внутренностями 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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...