Blame library/adutil.c

Packit Service 6d40f9
/*
Packit Service 6d40f9
 * adcli
Packit Service 6d40f9
 *
Packit Service 6d40f9
 * Copyright (C) 2012 Red Hat Inc.
Packit Service 6d40f9
 *
Packit Service 6d40f9
 * This program is free software; you can redistribute it and/or modify
Packit Service 6d40f9
 * it under the terms of the GNU Lesser General Public License as
Packit Service 6d40f9
 * published by the Free Software Foundation; either version 2.1 of
Packit Service 6d40f9
 * the License, or (at your option) any later version.
Packit Service 6d40f9
 *
Packit Service 6d40f9
 * This program is distributed in the hope that it will be useful, but
Packit Service 6d40f9
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 6d40f9
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 6d40f9
 * Lesser General Public License for more details.
Packit Service 6d40f9
 *
Packit Service 6d40f9
 * You should have received a copy of the GNU Lesser General Public
Packit Service 6d40f9
 * License along with this program; if not, write to the Free Software
Packit Service 6d40f9
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
Packit Service 6d40f9
 * MA 02110-1301 USA
Packit Service 6d40f9
 *
Packit Service 6d40f9
 * Author: Stef Walter <stefw@gnome.org>
Packit Service 6d40f9
 */
Packit Service 6d40f9
Packit Service 6d40f9
#include "config.h"
Packit Service 6d40f9
Packit Service 6d40f9
#include "adcli.h"
Packit Service 6d40f9
#include "adprivate.h"
Packit Service 6d40f9
#include "seq.h"
Packit Service 6d40f9
Packit Service 6d40f9
#include <assert.h>
Packit Service 6d40f9
#include <ctype.h>
Packit Service 6d40f9
#include <errno.h>
Packit Service 6d40f9
#include <stdio.h>
Packit Service 6d40f9
#include <stdlib.h>
Packit Service 6d40f9
#include <string.h>
Packit Service 6d40f9
#include <unistd.h>
Packit Service 6d40f9
#include <stdint.h>
Packit Service 6d40f9
#include <time.h>
Packit Service 6d40f9
Packit Service 6d40f9
static adcli_message_func message_func = NULL;
Packit Service 6d40f9
static char last_error[2048] = { 0, };
Packit Service 6d40f9
Packit Service 6d40f9
void
Packit Service 6d40f9
_adcli_precond_failed (const char *message,
Packit Service 6d40f9
                       ...)
Packit Service 6d40f9
{
Packit Service 6d40f9
	va_list va;
Packit Service 6d40f9
	const char *env;
Packit Service 6d40f9
Packit Service 6d40f9
	va_start (va, message);
Packit Service 6d40f9
	vfprintf (stderr, message, va);
Packit Service 6d40f9
	va_end (va);
Packit Service 6d40f9
Packit Service 6d40f9
	env = getenv ("ADCLI_STRICT");
Packit Service 6d40f9
	if (env != NULL && env[0] != '\0')
Packit Service 6d40f9
		abort ();
Packit Service 6d40f9
Packit Service 6d40f9
	/* Let coverity know we're not supposed to return from here */
Packit Service 6d40f9
#ifdef __COVERITY__
Packit Service 6d40f9
	abort();
Packit Service 6d40f9
#endif
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
const char *
Packit Service 6d40f9
adcli_result_to_string (adcli_result res)
Packit Service 6d40f9
{
Packit Service 6d40f9
	switch (res) {
Packit Service 6d40f9
	case ADCLI_SUCCESS:
Packit Service 6d40f9
		return "Success";
Packit Service 6d40f9
	case ADCLI_ERR_UNEXPECTED:
Packit Service 6d40f9
		return "Unexpected or internal system error";
Packit Service 6d40f9
	case ADCLI_ERR_DIRECTORY:
Packit Service 6d40f9
		return "Problem with the Active Directory or connecting to it";
Packit Service 6d40f9
	case ADCLI_ERR_CREDENTIALS:
Packit Service 6d40f9
		return "The administrative credentials are invalid or access is denied";
Packit Service 6d40f9
	case ADCLI_ERR_CONFIG:
Packit Service 6d40f9
		return "The local system has an invalid configuration";
Packit Service 6d40f9
	case ADCLI_ERR_FAIL:
Packit Service 6d40f9
		return "Generic failure";
Packit Service 6d40f9
	}
Packit Service 6d40f9
Packit Service 6d40f9
	return_val_if_reached ("Unknown error");
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
static void
Packit Service 6d40f9
messagev (adcli_message_type type,
Packit Service 6d40f9
          const char *format,
Packit Service 6d40f9
          va_list va)
Packit Service 6d40f9
{
Packit Service 6d40f9
	char buffer[sizeof (last_error)];
Packit Service 6d40f9
	char *where = buffer;
Packit Service 6d40f9
	int ret;
Packit Service 6d40f9
Packit Service 6d40f9
	if (type == ADCLI_MESSAGE_ERROR)
Packit Service 6d40f9
		where = last_error;
Packit Service 6d40f9
	else if (message_func == NULL)
Packit Service 6d40f9
		return;
Packit Service 6d40f9
Packit Service 6d40f9
	ret = vsnprintf (where, sizeof (buffer), format, va);
Packit Service 6d40f9
	return_if_fail (ret >= 0);
Packit Service 6d40f9
Packit Service 6d40f9
	if (message_func != NULL)
Packit Service 6d40f9
		(message_func) (type, where);
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
void
Packit Service 6d40f9
_adcli_err (const char *format,
Packit Service 6d40f9
            ...)
Packit Service 6d40f9
{
Packit Service 6d40f9
	va_list va;
Packit Service 6d40f9
	va_start (va, format);
Packit Service 6d40f9
	messagev (ADCLI_MESSAGE_ERROR, format, va);
Packit Service 6d40f9
	va_end (va);
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
void
Packit Service 6d40f9
_adcli_warn (const char *format,
Packit Service 6d40f9
             ...)
Packit Service 6d40f9
{
Packit Service 6d40f9
	va_list va;
Packit Service 6d40f9
	va_start (va, format);
Packit Service 6d40f9
	messagev (ADCLI_MESSAGE_ERROR, format, va);
Packit Service 6d40f9
	va_end (va);
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
void
Packit Service 6d40f9
_adcli_info (const char *format,
Packit Service 6d40f9
             ...)
Packit Service 6d40f9
{
Packit Service 6d40f9
	va_list va;
Packit Service 6d40f9
	va_start (va, format);
Packit Service 6d40f9
	messagev (ADCLI_MESSAGE_INFO, format, va);
Packit Service 6d40f9
	va_end (va);
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
void
Packit Service 6d40f9
adcli_set_message_func (adcli_message_func func)
Packit Service 6d40f9
{
Packit Service 6d40f9
	message_func = func;
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
const char *
Packit Service 6d40f9
adcli_get_last_error (void)
Packit Service 6d40f9
{
Packit Service 6d40f9
	return last_error[0] ? last_error : NULL;
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
void
Packit Service 6d40f9
adcli_clear_last_error (void)
Packit Service 6d40f9
{
Packit Service 6d40f9
	last_error[0] = '\0';
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
void
Packit Service 6d40f9
_adcli_strv_free (char **strv)
Packit Service 6d40f9
{
Packit Service 6d40f9
	seq_free (strv, free);
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
char **
Packit Service 6d40f9
_adcli_strv_dup (char **strv)
Packit Service 6d40f9
{
Packit Service 6d40f9
	int count;
Packit Service 6d40f9
Packit Service 6d40f9
	if (!strv)
Packit Service 6d40f9
		return NULL;
Packit Service 6d40f9
Packit Service 6d40f9
	count = seq_count (strv);
Packit Service 6d40f9
	return seq_dup (strv, &count, (seq_copy)strdup);
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
char *
Packit Service 6d40f9
_adcli_strv_join (char **strv,
Packit Service 6d40f9
                  const char *delim)
Packit Service 6d40f9
{
Packit Service 6d40f9
	char *result = NULL;
Packit Service 6d40f9
	int at = 0;
Packit Service 6d40f9
	int dlen;
Packit Service 6d40f9
	int slen;
Packit Service 6d40f9
	int i;
Packit Service 6d40f9
Packit Service 6d40f9
	dlen = strlen (delim);
Packit Service 6d40f9
	for (i = 0; strv && strv[i] != NULL; i++) {
Packit Service 6d40f9
		slen = strlen (strv[i]);
Packit Service 6d40f9
		result = realloc (result, at + dlen + slen + 1);
Packit Service 6d40f9
		return_val_if_fail (result != NULL, NULL);
Packit Service 6d40f9
		if (at != 0) {
Packit Service 6d40f9
			memcpy (result + at, delim, dlen);
Packit Service 6d40f9
			at += dlen;
Packit Service 6d40f9
		}
Packit Service 6d40f9
Packit Service 6d40f9
		memcpy (result + at, strv[i], slen);
Packit Service 6d40f9
		at += slen;
Packit Service 6d40f9
		result[at] = '\0';
Packit Service 6d40f9
	}
Packit Service 6d40f9
Packit Service 6d40f9
	return result;
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
int
Packit Service 6d40f9
_adcli_strv_len (char **strv)
Packit Service 6d40f9
{
Packit Service 6d40f9
	return seq_count (strv);
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
char **
Packit Service 6d40f9
_adcli_strv_add (char **strv,
Packit Service 6d40f9
                 char *string,
Packit Service 6d40f9
                 int *length)
Packit Service 6d40f9
{
Packit Service 6d40f9
	int len;
Packit Service 6d40f9
Packit Service 6d40f9
	return_val_if_fail (string != NULL, strv);
Packit Service 6d40f9
Packit Service 6d40f9
	if (!length) {
Packit Service 6d40f9
		len = seq_count (strv);
Packit Service 6d40f9
		length = &len;
Packit Service 6d40f9
	}
Packit Service 6d40f9
Packit Service 6d40f9
	return seq_push (strv, length, string);
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
int
Packit Service 6d40f9
_adcli_strv_has (char **strv,
Packit Service 6d40f9
                 const char *str)
Packit Service 6d40f9
{
Packit Service 6d40f9
	int i;
Packit Service 6d40f9
Packit Service 6d40f9
	for (i = 0; strv && strv[i] != NULL; i++) {
Packit Service 6d40f9
		if (strcmp (strv[i], str) == 0)
Packit Service 6d40f9
			return 1;
Packit Service 6d40f9
	}
Packit Service 6d40f9
Packit Service 6d40f9
	return 0;
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
void
Packit Service 6d40f9
_adcli_str_up (char *str)
Packit Service 6d40f9
{
Packit Service 6d40f9
	while (*str != '\0') {
Packit Service 6d40f9
		*str = toupper (*str);
Packit Service 6d40f9
		str++;
Packit Service 6d40f9
	}
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
int
Packit Service 6d40f9
_adcli_str_is_up (const char *str)
Packit Service 6d40f9
{
Packit Service 6d40f9
	while (*str != '\0') {
Packit Service 6d40f9
		if (*str != toupper (*str))
Packit Service 6d40f9
			return 0;
Packit Service 6d40f9
		str++;
Packit Service 6d40f9
	}
Packit Service 6d40f9
	return 1;
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
void
Packit Service 6d40f9
_adcli_str_down (char *str)
Packit Service 6d40f9
{
Packit Service 6d40f9
	while (*str != '\0') {
Packit Service 6d40f9
		*str = tolower (*str);
Packit Service 6d40f9
		str++;
Packit Service 6d40f9
	}
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
void
Packit Service 6d40f9
_adcli_str_set (char **field,
Packit Service 6d40f9
                const char *value)
Packit Service 6d40f9
{
Packit Service 6d40f9
	char *newval = NULL;
Packit Service 6d40f9
Packit Service 6d40f9
	if (value) {
Packit Service 6d40f9
		newval = strdup (value);
Packit Service 6d40f9
		return_if_fail (newval != NULL);
Packit Service 6d40f9
	}
Packit Service 6d40f9
Packit Service 6d40f9
	free (*field);
Packit Service 6d40f9
	*field = newval;
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
void
Packit Service 6d40f9
_adcli_strv_set (char ***field,
Packit Service 6d40f9
                 const char **value)
Packit Service 6d40f9
{
Packit Service 6d40f9
	char **newval = NULL;
Packit Service 6d40f9
Packit Service 6d40f9
	if (value) {
Packit Service 6d40f9
		newval = _adcli_strv_dup ((char **)value);
Packit Service 6d40f9
		return_if_fail (newval != NULL);
Packit Service 6d40f9
	}
Packit Service 6d40f9
Packit Service 6d40f9
	_adcli_strv_free (*field);
Packit Service 6d40f9
	*field = newval;
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
char *
Packit Service 6d40f9
_adcli_str_dupn (void *data,
Packit Service 6d40f9
                 size_t len)
Packit Service 6d40f9
{
Packit Service 6d40f9
	char *result;
Packit Service 6d40f9
Packit Service 6d40f9
	result = malloc (len + 1);
Packit Service 6d40f9
	return_val_if_fail (result, NULL);
Packit Service 6d40f9
Packit Service 6d40f9
	memcpy (result, data, len);
Packit Service 6d40f9
	result[len] = '\0';
Packit Service 6d40f9
	return result;
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
int
Packit Service 6d40f9
_adcli_str_has_prefix (const char *str,
Packit Service 6d40f9
                       const char *prefix)
Packit Service 6d40f9
{
Packit Service 6d40f9
	size_t len = strlen (str);
Packit Service 6d40f9
	size_t lp = strlen (prefix);
Packit Service 6d40f9
	return (len >= lp && strncmp (str, prefix, lp) == 0);
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
int
Packit Service 6d40f9
_adcli_str_has_suffix (const char *str,
Packit Service 6d40f9
                       const char *suffix)
Packit Service 6d40f9
{
Packit Service 6d40f9
	size_t len = strlen (str);
Packit Service 6d40f9
	size_t ls = strlen (suffix);
Packit Service 6d40f9
	return (len >= ls && strncmp (str + (len - ls), suffix, ls) == 0);
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
int
Packit Service 6d40f9
_adcli_password_free (char *password)
Packit Service 6d40f9
{
Packit Service 6d40f9
	int ret;
Packit Service 6d40f9
Packit Service 6d40f9
	if (password == NULL)
Packit Service 6d40f9
		return 0;
Packit Service 6d40f9
Packit Service 6d40f9
	ret = adcli_mem_clear (password, strlen (password));
Packit Service 6d40f9
	free (password);
Packit Service 6d40f9
	return ret;
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
int
Packit Service 6d40f9
adcli_mem_clear (void *data,
Packit Service 6d40f9
                 size_t length)
Packit Service 6d40f9
{
Packit Service 6d40f9
	volatile char *vp;
Packit Service 6d40f9
	int ret = 0;
Packit Service 6d40f9
Packit Service 6d40f9
	if (data == NULL)
Packit Service 6d40f9
		return 0;
Packit Service 6d40f9
Packit Service 6d40f9
	/*
Packit Service 6d40f9
	 * Cracktastic stuff here to help compilers not
Packit Service 6d40f9
	 * optimize this away
Packit Service 6d40f9
	 */
Packit Service 6d40f9
Packit Service 6d40f9
	vp = (volatile char*)data;
Packit Service 6d40f9
	while (length) {
Packit Service 6d40f9
		*vp = 0xAA;
Packit Service 6d40f9
		ret += *vp;
Packit Service 6d40f9
		vp++;
Packit Service 6d40f9
		length--;
Packit Service 6d40f9
	}
Packit Service 6d40f9
Packit Service 6d40f9
	return ret;
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
int
Packit Service 6d40f9
_adcli_write_all (int fd,
Packit Service 6d40f9
                  const char *buf,
Packit Service 6d40f9
                  int len)
Packit Service 6d40f9
{
Packit Service 6d40f9
	int res;
Packit Service 6d40f9
Packit Service 6d40f9
	if (len == -1)
Packit Service 6d40f9
		len = strlen (buf);
Packit Service 6d40f9
Packit Service 6d40f9
	while (len > 0) {
Packit Service 6d40f9
		res = write (fd, buf, len);
Packit Service 6d40f9
		if (res <= 0) {
Packit Service 6d40f9
			if (errno == EAGAIN || errno == EINTR)
Packit Service 6d40f9
				continue;
Packit Service 6d40f9
			return -errno;
Packit Service 6d40f9
		} else  {
Packit Service 6d40f9
			len -= res;
Packit Service 6d40f9
			buf += res;
Packit Service 6d40f9
		}
Packit Service 6d40f9
	}
Packit Service 6d40f9
Packit Service 6d40f9
	return 0;
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
#define AD_TO_UNIX_TIME_CONST 11644473600LL
Packit Service 6d40f9
Packit Service 6d40f9
bool
Packit Service 6d40f9
_adcli_check_nt_time_string_lifetime (const char *nt_time_string,
Packit Service 6d40f9
                                      unsigned int lifetime)
Packit Service 6d40f9
{
Packit Service 6d40f9
	uint64_t nt_now;
Packit Service 6d40f9
	unsigned long long int pwd_last_set;
Packit Service 6d40f9
	char *endptr;
Packit Service 6d40f9
	time_t now;
Packit Service 6d40f9
Packit Service 6d40f9
	if (nt_time_string == NULL) {
Packit Service 6d40f9
		_adcli_err ("Missing NT time string, assuming it is expired");
Packit Service 6d40f9
		return false;
Packit Service 6d40f9
	}
Packit Service 6d40f9
Packit Service 6d40f9
	if (lifetime == 0) {
Packit Service 6d40f9
		_adcli_info ("Password lifetime is 0, forcing renewal");
Packit Service 6d40f9
		return false;
Packit Service 6d40f9
	}
Packit Service 6d40f9
Packit Service 6d40f9
	now = time (NULL);
Packit Service 6d40f9
	/* NT timestamps start at 1601-01-01 and use a 100ns base */
Packit Service 6d40f9
	nt_now = (now + AD_TO_UNIX_TIME_CONST) * 1000 * 1000 * 10;
Packit Service 6d40f9
	errno = 0;
Packit Service 6d40f9
	pwd_last_set = strtoull (nt_time_string, &endptr, 10);
Packit Service 6d40f9
	if (errno != 0 || *endptr != '\0' || endptr == nt_time_string) {
Packit Service 6d40f9
		_adcli_err ("Failed to convert NT time string, assuming it is expired");
Packit Service 6d40f9
		return false;
Packit Service 6d40f9
	}
Packit Service 6d40f9
Packit Service 6d40f9
	if (pwd_last_set + (lifetime * 24ULL * 60 * 60 \
Packit Service 6d40f9
				* 1000 * 1000 * 10) > nt_now) {
Packit Service 6d40f9
		_adcli_info ("Password not too old, no change needed");
Packit Service 6d40f9
		return true;
Packit Service 6d40f9
	}
Packit Service 6d40f9
Packit Service 6d40f9
	return false;
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
#ifdef UTIL_TESTS
Packit Service 6d40f9
Packit Service 6d40f9
#include "test.h"
Packit Service 6d40f9
Packit Service 6d40f9
static void
Packit Service 6d40f9
test_strv_add_free (void)
Packit Service 6d40f9
{
Packit Service 6d40f9
	char **strv = NULL;
Packit Service 6d40f9
Packit Service 6d40f9
	strv = _adcli_strv_add (strv, strdup ("one"), NULL);
Packit Service 6d40f9
	strv = _adcli_strv_add (strv, strdup ("two"), NULL);
Packit Service 6d40f9
	strv = _adcli_strv_add (strv, strdup ("three"), NULL);
Packit Service 6d40f9
Packit Service 6d40f9
	assert_str_eq (strv[0], "one");
Packit Service 6d40f9
	assert_str_eq (strv[1], "two");
Packit Service 6d40f9
	assert_str_eq (strv[2], "three");
Packit Service 6d40f9
	assert (strv[3] == NULL);
Packit Service 6d40f9
Packit Service 6d40f9
	_adcli_strv_free (strv);
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
static void
Packit Service 6d40f9
test_strv_dup (void)
Packit Service 6d40f9
{
Packit Service 6d40f9
	char *values[] = { "one", "two", "three", NULL };
Packit Service 6d40f9
	char **strv;
Packit Service 6d40f9
Packit Service 6d40f9
	strv = _adcli_strv_dup (values);
Packit Service 6d40f9
Packit Service 6d40f9
	assert_str_eq (strv[0], "one");
Packit Service 6d40f9
	assert_str_eq (strv[1], "two");
Packit Service 6d40f9
	assert_str_eq (strv[2], "three");
Packit Service 6d40f9
	assert (strv[3] == NULL);
Packit Service 6d40f9
Packit Service 6d40f9
	_adcli_strv_free (strv);
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
static void
Packit Service 6d40f9
test_strv_count (void)
Packit Service 6d40f9
{
Packit Service 6d40f9
	char *values[] = { "one", "two", "three", NULL };
Packit Service 6d40f9
	int len;
Packit Service 6d40f9
Packit Service 6d40f9
	len = _adcli_strv_len (values);
Packit Service 6d40f9
	assert_num_eq (len, 3);
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
static void
Packit Service 6d40f9
test_check_nt_time_string_lifetime (void)
Packit Service 6d40f9
{
Packit Service 6d40f9
	char *time_str;
Packit Service 6d40f9
Packit Service 6d40f9
	/* Missing or invalid value */
Packit Service 6d40f9
	assert (!_adcli_check_nt_time_string_lifetime (NULL, 0));
Packit Service 6d40f9
	assert (!_adcli_check_nt_time_string_lifetime ("", 0));
Packit Service 6d40f9
	assert (!_adcli_check_nt_time_string_lifetime ("a", 0));
Packit Service 6d40f9
	assert (!_adcli_check_nt_time_string_lifetime ("1a", 0));
Packit Service 6d40f9
Packit Service 6d40f9
	/* Certainly expired*/
Packit Service 6d40f9
	assert (!_adcli_check_nt_time_string_lifetime ("0", 0));
Packit Service 6d40f9
Packit Service 6d40f9
	/* 1969-01-01T00:00:00: 116129340000000000 */
Packit Service 6d40f9
	/* Calculated with PowerShell:
Packit Service 6d40f9
	 * (Get-Date -Date "1969-01-01T00:00:00").ToFileTime() */
Packit Service 6d40f9
Packit Service 6d40f9
	assert (!_adcli_check_nt_time_string_lifetime ("130645404000000000", 1));
Packit Service 6d40f9
Packit Service 6d40f9
	/* Make sure lifetime==0 will retrun false even if pwdLastSet is in the future */
Packit Service 6d40f9
	assert (asprintf (&time_str, "%llu",
Packit Service 6d40f9
			  (time (NULL) + 10 + AD_TO_UNIX_TIME_CONST) * 1000 * 1000 *10)
Packit Service 6d40f9
		!= -1);
Packit Service 6d40f9
	assert (!_adcli_check_nt_time_string_lifetime (time_str, 0));
Packit Service 6d40f9
Packit Service 6d40f9
	/* This test will fail some time after 2200AD as a reminder to reflect
Packit Service 6d40f9
	 * why adcli is still needed. */
Packit Service 6d40f9
	assert (_adcli_check_nt_time_string_lifetime ("130645404000000000", 100000));
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
int
Packit Service 6d40f9
main (int argc,
Packit Service 6d40f9
      char *argv[])
Packit Service 6d40f9
{
Packit Service 6d40f9
	test_func (test_strv_add_free, "/util/strv_add_free");
Packit Service 6d40f9
	test_func (test_strv_dup, "/util/strv_dup");
Packit Service 6d40f9
	test_func (test_strv_count, "/util/strv_count");
Packit Service 6d40f9
	test_func (test_check_nt_time_string_lifetime, "/util/check_nt_time_string_lifetime");
Packit Service 6d40f9
	return test_run (argc, argv);
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
#endif /* UTIL_TESTS */