Define a token expansion for %{strftime:<string>}.

This commit is contained in:
Roland C. Dowdeswell
2019-11-07 22:29:14 +00:00
committed by Viktor Dukhovni
parent 3c7da79838
commit 0c869176f4
2 changed files with 67 additions and 19 deletions

@ -52,7 +52,8 @@ typedef int PTYPE;
* the returned path may or may not exist.
*/
static krb5_error_code
_expand_temp_folder(krb5_context context, PTYPE param, const char *postfix, char **ret)
_expand_temp_folder(krb5_context context, PTYPE param, const char *postfix,
const char *arg, char **ret)
{
TCHAR tpath[MAX_PATH];
size_t len;
@ -89,7 +90,8 @@ extern HINSTANCE _krb5_hInstance;
* krb5.dll is located.
*/
static krb5_error_code
_expand_bin_dir(krb5_context context, PTYPE param, const char *postfix, char **ret)
_expand_bin_dir(krb5_context context, PTYPE param, const char *postfix,
const char *arg, char **ret)
{
TCHAR path[MAX_PATH];
TCHAR *lastSlash;
@ -139,7 +141,8 @@ _expand_bin_dir(krb5_context context, PTYPE param, const char *postfix, char **r
*
*/
static krb5_error_code
_expand_userid(krb5_context context, PTYPE param, const char *postfix, char **ret)
_expand_userid(krb5_context context, PTYPE param, const char *postfix,
const char *arg, char **ret)
{
int rv = EINVAL;
HANDLE hThread = NULL;
@ -237,7 +240,8 @@ _expand_userid(krb5_context context, PTYPE param, const char *postfix, char **re
*/
static krb5_error_code
_expand_csidl(krb5_context context, PTYPE folder, const char *postfix, char **ret)
_expand_csidl(krb5_context context, PTYPE folder, const char *postfix,
const char *arg, char **ret)
{
TCHAR path[MAX_PATH];
size_t len;
@ -266,7 +270,8 @@ _expand_csidl(krb5_context context, PTYPE folder, const char *postfix, char **re
#else
static krb5_error_code
_expand_path(krb5_context context, PTYPE param, const char *postfix, char **ret)
_expand_path(krb5_context context, PTYPE param, const char *postfix,
const char *arg, char **ret)
{
*ret = strdup(postfix);
if (*ret == NULL)
@ -275,7 +280,8 @@ _expand_path(krb5_context context, PTYPE param, const char *postfix, char **ret)
}
static krb5_error_code
_expand_temp_folder(krb5_context context, PTYPE param, const char *postfix, char **ret)
_expand_temp_folder(krb5_context context, PTYPE param, const char *postfix,
const char *arg, char **ret)
{
const char *p = NULL;
@ -291,7 +297,8 @@ _expand_temp_folder(krb5_context context, PTYPE param, const char *postfix, char
}
static krb5_error_code
_expand_userid(krb5_context context, PTYPE param, const char *postfix, char **str)
_expand_userid(krb5_context context, PTYPE param, const char *postfix,
const char *arg, char **str)
{
int ret = asprintf(str, "%ld", (unsigned long)getuid());
if (ret < 0 || *str == NULL)
@ -300,7 +307,8 @@ _expand_userid(krb5_context context, PTYPE param, const char *postfix, char **st
}
static krb5_error_code
_expand_euid(krb5_context context, PTYPE param, const char *postfix, char **str)
_expand_euid(krb5_context context, PTYPE param, const char *postfix,
const char *arg, char **str)
{
int ret = asprintf(str, "%ld", (unsigned long)geteuid());
if (ret < 0 || *str == NULL)
@ -310,7 +318,8 @@ _expand_euid(krb5_context context, PTYPE param, const char *postfix, char **str)
#endif /* _WIN32 */
static krb5_error_code
_expand_username(krb5_context context, PTYPE param, const char *postfix, char **str)
_expand_username(krb5_context context, PTYPE param, const char *postfix,
const char *arg, char **str)
{
char user[128];
const char *username = roken_get_username(user, sizeof(user));
@ -330,7 +339,8 @@ _expand_username(krb5_context context, PTYPE param, const char *postfix, char **
}
static krb5_error_code
_expand_loginname(krb5_context context, PTYPE param, const char *postfix, char **str)
_expand_loginname(krb5_context context, PTYPE param, const char *postfix,
const char *arg, char **str)
{
char user[128];
const char *username = roken_get_loginname(user, sizeof(user));
@ -349,6 +359,22 @@ _expand_loginname(krb5_context context, PTYPE param, const char *postfix, char *
return 0;
}
static krb5_error_code
_expand_strftime(krb5_context context, PTYPE param, const char *postfix,
const char *arg, char **ret)
{
size_t len;
time_t t;
char buf[1024];
t = time(NULL);
len = strftime(buf, sizeof(buf), arg, localtime(&t));
if (len == 0 || len >= sizeof(buf))
return ENOMEM;
*ret = strdup(buf);
return 0;
}
/**
* Expand an extra token
*/
@ -369,7 +395,8 @@ _expand_extra_token(krb5_context context, const char *value, char **ret)
*/
static krb5_error_code
_expand_null(krb5_context context, PTYPE param, const char *postfix, char **ret)
_expand_null(krb5_context context, PTYPE param, const char *postfix,
const char *arg, char **ret)
{
*ret = strdup("");
if (*ret == NULL)
@ -387,7 +414,7 @@ static const struct {
PTYPE param;
const char * postfix;
int (*exp_func)(krb5_context, PTYPE, const char *, char **);
int (*exp_func)(krb5_context, PTYPE, const char *, const char *, char **);
#define SPECIALP(f, P) FTYPE_SPECIAL, 0, P, f
#define SPECIAL(f) SPECIALP(f, NULL)
@ -422,7 +449,8 @@ static const struct {
{"TEMP", SPECIAL(_expand_temp_folder)},
{"USERID", SPECIAL(_expand_userid)},
{"uid", SPECIAL(_expand_userid)},
{"null", SPECIAL(_expand_null)}
{"null", SPECIAL(_expand_null)},
{"strftime", SPECIAL(_expand_strftime)}
};
static krb5_error_code
@ -432,8 +460,10 @@ _expand_token(krb5_context context,
char **extra_tokens,
char **ret)
{
krb5_error_code errcode;
size_t i;
char **p;
const char *colon;
*ret = NULL;
@ -449,11 +479,26 @@ _expand_token(krb5_context context,
return _expand_extra_token(context, p[1], ret);
}
for (i = 0; i < sizeof(tokens)/sizeof(tokens[0]); i++) {
if (!strncmp(token+2, tokens[i].tok, (token_end - token) - 2))
return tokens[i].exp_func(context, tokens[i].param,
tokens[i].postfix, ret);
}
for (colon=token+2; colon < token_end; colon++)
if (*colon == ':')
break;
for (i = 0; i < sizeof(tokens)/sizeof(tokens[0]); i++)
if (!strncmp(token+2, tokens[i].tok, (colon - token) - 2)) {
char *arg = NULL;
errcode = 0;
if (*colon == ':') {
asprintf(&arg, "%.*s", (int)(token_end - colon - 1), colon + 1);
if (!arg)
errcode = ENOMEM;
}
if (!errcode)
errcode = tokens[i].exp_func(context, tokens[i].param,
tokens[i].postfix, arg, ret);
free(arg);
return errcode;
}
if (context)
krb5_set_error_message(context, EINVAL, "Invalid token.");

@ -678,7 +678,10 @@ typedef struct {
extern const char *heimdal_version, *heimdal_long_version;
typedef void (KRB5_CALLCONV * krb5_log_log_func_t)(const char*, const char*, void*);
typedef void (KRB5_CALLCONV * krb5_log_log_func_t)(krb5_context,
const char*,
const char*,
void*);
typedef void (KRB5_CALLCONV * krb5_log_close_func_t)(void*);
typedef struct krb5_log_facility {