我需要修改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”),以及它是否与之前的设置不同。
知道吗?
提前谢谢。

最佳答案

我不熟悉PostgreSQL的内部结构或PostgreSQL的配置我的第一个方法是研究文档,以确定是否可以使用管理员权限设置最大密码过期时间。我猜你已经详细研究过了,觉得这是最好的选择。
基于此,我回顾了Postgres github存储库中的一些时间戳代码我还没有整理,但相信这是接近的我不清楚数据是什么,是否已经是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")));
    }
}

下面是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));
}

关于c - PostgreSQL passwordcheck.c修改,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53060430/

10-11 03:33