Blame library/adprivate.h

Packit 8586cb
/*
Packit 8586cb
 * adcli
Packit 8586cb
 *
Packit 8586cb
 * Copyright (C) 2012 Red Hat Inc.
Packit 8586cb
 *
Packit 8586cb
 * This program is free software; you can redistribute it and/or modify
Packit 8586cb
 * it under the terms of the GNU Lesser General Public License as
Packit 8586cb
 * published by the Free Software Foundation; either version 2.1 of
Packit 8586cb
 * the License, or (at your option) any later version.
Packit 8586cb
 *
Packit 8586cb
 * This program is distributed in the hope that it will be useful, but
Packit 8586cb
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 8586cb
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 8586cb
 * Lesser General Public License for more details.
Packit 8586cb
 *
Packit 8586cb
 * You should have received a copy of the GNU Lesser General Public
Packit 8586cb
 * License along with this program; if not, write to the Free Software
Packit 8586cb
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
Packit 8586cb
 * MA 02110-1301 USA
Packit 8586cb
 *
Packit 8586cb
 * Author: Stef Walter <stefw@gnome.org>
Packit 8586cb
 */
Packit 8586cb
Packit 8586cb
#ifndef ADPRIVATE_H_
Packit 8586cb
#define ADPRIVATE_H_
Packit 8586cb
Packit 8586cb
#include "adattrs.h"
Packit 8586cb
#include "adconn.h"
Packit 8586cb
Packit 8586cb
#include <stdarg.h>
Packit 8586cb
#include <limits.h>
Packit 8586cb
#include <stdlib.h>
Packit 8586cb
#include <stdio.h>
Packit Service d2400d
#include <stdint.h>
Packit 8586cb
Packit 8586cb
#include <ldap.h>
Packit 8586cb
Packit 8586cb
#ifndef HOST_NAME_MAX
Packit 8586cb
#define HOST_NAME_MAX 255
Packit 8586cb
#endif
Packit 8586cb
Packit 8586cb
/* Utilities */
Packit 8586cb
Packit 8586cb
#if !defined(__cplusplus) && (__GNUC__ > 2)
Packit 8586cb
#define GNUC_PRINTF(x, y) __attribute__((__format__(__printf__, x, y)))
Packit 8586cb
#define GNUC_WARN_UNUSED __attribute__((warn_unused_result))
Packit 8586cb
#else
Packit 8586cb
#define GNUC_PRINTF(x, y)
Packit 8586cb
#define GNUC_WARN_UNUSED
Packit 8586cb
#endif
Packit 8586cb
Packit 8586cb
/* For detecting clang features */
Packit 8586cb
#ifndef __has_feature
Packit 8586cb
#define __has_feature(x) 0
Packit 8586cb
#endif
Packit 8586cb
Packit 8586cb
#ifndef CLANG_ANALYZER_NORETURN
Packit 8586cb
#if __has_feature(attribute_analyzer_noreturn)
Packit 8586cb
#define CLANG_ANALYZER_NORETURN __attribute__((analyzer_noreturn))
Packit 8586cb
#else
Packit 8586cb
#define CLANG_ANALYZER_NORETURN
Packit 8586cb
#endif
Packit 8586cb
#endif
Packit 8586cb
Packit 8586cb
#define return_val_if_fail(x, v) \
Packit 8586cb
	do { if (!(x)) { \
Packit 8586cb
	     _adcli_precond_failed ("adcli: '%s' not true at %s\n", #x, __func__); \
Packit 8586cb
	     return v; \
Packit 8586cb
	} } while (0)
Packit 8586cb
Packit 8586cb
#define return_unexpected_if_fail(x) \
Packit 8586cb
	return_val_if_fail ((x), ADCLI_ERR_UNEXPECTED)
Packit 8586cb
Packit 8586cb
#define return_if_fail(x) \
Packit 8586cb
	do { if (!(x)) { \
Packit 8586cb
	     _adcli_precond_failed ("adcli: '%s' not true at %s\n", #x, __func__); \
Packit 8586cb
	     return; \
Packit 8586cb
	} } while (0)
Packit 8586cb
Packit 8586cb
#define return_if_reached() \
Packit 8586cb
	do { \
Packit 8586cb
	     _adcli_precond_failed ("adcli: shouldn't be reached at %s\n", __func__); \
Packit 8586cb
	     return; \
Packit 8586cb
	} while (0)
Packit 8586cb
Packit 8586cb
#define return_val_if_reached(v) \
Packit 8586cb
	do { \
Packit 8586cb
	     _adcli_precond_failed ("adcli: shouldn't be reached at %s\n", __func__); \
Packit 8586cb
	     return v; \
Packit 8586cb
	} while (0)
Packit 8586cb
Packit 8586cb
#define return_unexpected_if_reached() \
Packit 8586cb
	return_val_if_reached (ADCLI_ERR_UNEXPECTED)
Packit 8586cb
Packit 8586cb
void           _adcli_precond_failed         (const char *message,
Packit 8586cb
                                              ...) GNUC_PRINTF (1, 2)
Packit 8586cb
                                              CLANG_ANALYZER_NORETURN;
Packit 8586cb
Packit 8586cb
void           _adcli_err                    (const char *format,
Packit 8586cb
                                             ...) GNUC_PRINTF(1, 2);
Packit 8586cb
Packit 8586cb
void           _adcli_warn                   (const char *format,
Packit 8586cb
                                             ...) GNUC_PRINTF(1, 2);
Packit 8586cb
Packit 8586cb
void           _adcli_info                   (const char *format,
Packit 8586cb
                                             ...) GNUC_PRINTF(1, 2);
Packit 8586cb
Packit 8586cb
int            _adcli_strv_len               (char **strv);
Packit 8586cb
Packit 8586cb
char **        _adcli_strv_add               (char **strv,
Packit 8586cb
                                              char *string,
Packit 8586cb
                                              int *length) GNUC_WARN_UNUSED;
Packit Service 09c7c8
Packit Service 09c7c8
char **        _adcli_strv_add_unique        (char **strv,
Packit Service 09c7c8
                                              char *string,
Packit Service 09c7c8
                                              int *length,
Packit Service 09c7c8
                                              bool case_sensitive) GNUC_WARN_UNUSED;
Packit 41f04b
Packit Service a39e32
void           _adcli_strv_remove_unsorted   (char **strv,
Packit Service a39e32
                                              const char *string,
Packit Service a39e32
                                              int *length);
Packit Service a39e32
Packit 8586cb
void           _adcli_strv_free              (char **strv);
Packit 8586cb
Packit 8586cb
int            _adcli_strv_has               (char **strv,
Packit 8586cb
                                              const char *str);
Packit 8586cb
Packit Service cc4392
int            _adcli_strv_has_ex            (char **strv,
Packit Service cc4392
                                              const char *str,
Packit Service cc4392
                                              int (* compare) (const char *match, const char*value));
Packit Service cc4392
Packit 8586cb
char **        _adcli_strv_dup               (char **strv) GNUC_WARN_UNUSED;
Packit 8586cb
Packit 8586cb
char *         _adcli_strv_join              (char **strv,
Packit 8586cb
                                              const char *delim);
Packit 8586cb
Packit 8586cb
void           _adcli_str_up                 (char *str);
Packit 8586cb
Packit 8586cb
void           _adcli_str_down               (char *str);
Packit 8586cb
Packit 8586cb
int            _adcli_str_is_up              (const char *str);
Packit 8586cb
Packit 8586cb
int            _adcli_str_has_prefix         (const char *str,
Packit 8586cb
		                              const char *prefix);
Packit 8586cb
Packit 8586cb
int            _adcli_str_has_suffix         (const char *str,
Packit 8586cb
		                              const char *suffix);
Packit 8586cb
Packit Service d2400d
char *          _adcli_bin_sid_to_str        (const uint8_t *data,
Packit Service d2400d
                                              size_t len);
Packit Service d2400d
Packit 8586cb
char *         _adcli_str_dupn               (void *data,
Packit 8586cb
                                              size_t len);
Packit 8586cb
Packit 8586cb
void           _adcli_str_set                (char **field,
Packit 8586cb
                                              const char *value);
Packit 8586cb
Packit 8586cb
void           _adcli_strv_set               (char ***field,
Packit 8586cb
                                              const char **value);
Packit 8586cb
Packit 8586cb
int            _adcli_password_free          (char *password);
Packit 8586cb
Packit 8586cb
int            _adcli_write_all              (int fd,
Packit 8586cb
                                              const char *buf,
Packit 8586cb
                                              int len);
Packit 8586cb
Packit 8586cb
/* Connection helpers */
Packit 8586cb
Packit 8586cb
char *        _adcli_calc_reset_password     (const char *computer_name);
Packit 8586cb
Packit 8586cb
char *        _adcli_calc_netbios_name       (const char *host_fqdn);
Packit 8586cb
Packit 8586cb
krb5_error_code  _adcli_kinit_computer_creds      (adcli_conn *conn,
Packit 8586cb
                                                   const char *in_tkt_service,
Packit 8586cb
                                                   krb5_ccache ccache,
Packit 8586cb
                                                   krb5_creds *creds);
Packit 8586cb
Packit 8586cb
krb5_error_code  _adcli_kinit_user_creds          (adcli_conn *conn,
Packit 8586cb
                                                   const char *in_tkt_service,
Packit 8586cb
                                                   krb5_ccache ccache,
Packit 8586cb
                                                   krb5_creds *creds);
Packit 8586cb
Packit 8586cb
/* LDAP helpers */
Packit 8586cb
Packit 8586cb
adcli_result  _adcli_ldap_handle_failure     (LDAP *ldap,
Packit 8586cb
                                              adcli_result defres,
Packit 8586cb
                                              const char *desc,
Packit 8586cb
                                              ...) GNUC_PRINTF(3, 4);
Packit 8586cb
Packit Service 2a5351
char *         _adcli_ldap_parse_sid         (LDAP *ldap,
Packit Service 2a5351
                                              LDAPMessage *results,
Packit Service 2a5351
                                              const char *attr_name);
Packit Service 2a5351
Packit 8586cb
char *        _adcli_ldap_parse_value        (LDAP *ldap,
Packit 8586cb
                                              LDAPMessage *results,
Packit 8586cb
                                              const char *attr_name);
Packit 8586cb
Packit 8586cb
char **       _adcli_ldap_parse_values       (LDAP *ldap,
Packit 8586cb
                                              LDAPMessage *results,
Packit 8586cb
                                              const char *attr_name);
Packit 8586cb
Packit 8586cb
char *        _adcli_ldap_parse_dn           (LDAP *ldap,
Packit 8586cb
                                              LDAPMessage *results);
Packit 8586cb
Packit 8586cb
int           _adcli_ldap_ber_case_equal     (struct berval *one,
Packit 8586cb
                                              struct berval *two);
Packit 8586cb
Packit 8586cb
int           _adcli_ldap_have_vals          (struct berval **want,
Packit 8586cb
                                              struct berval **have);
Packit 8586cb
Packit 8586cb
int           _adcli_ldap_have_in_mod        (LDAPMod *want,
Packit 8586cb
                                              struct berval **have);
Packit 8586cb
Packit 8586cb
char *        _adcli_ldap_escape_filter      (const char *value);
Packit 8586cb
Packit 8586cb
int           _adcli_ldap_dn_has_ancestor    (const char *dn,
Packit 8586cb
                                              const char *ancestor);
Packit 8586cb
Packit 8586cb
int           _adcli_ldap_mod_compar         (void *match,
Packit 8586cb
                                              void *mod);
Packit 8586cb
Packit 8586cb
int           _adcli_ldap_filter_for_add     (void *unused,
Packit 8586cb
                                              void *mod);
Packit 8586cb
Packit 8586cb
LDAPMod *     _adcli_ldap_mod_new            (int mod_op,
Packit 8586cb
                                              const char *type,
Packit 8586cb
                                              const char **values);
Packit 8586cb
Packit 8586cb
LDAPMod *     _adcli_ldap_mod_new1           (int mod_op,
Packit 8586cb
                                              const char *type,
Packit 8586cb
                                              const char *value);
Packit 8586cb
Packit 8586cb
void          _adcli_ldap_mod_free           (void *mod);
Packit 8586cb
Packit 8586cb
char *        _adcli_ldap_mods_to_string     (LDAPMod **mods);
Packit 8586cb
Packit 8586cb
/* KRB5 helpers */
Packit 8586cb
Packit 8586cb
adcli_result     _adcli_krb5_init_context         (krb5_context *k5);
Packit 8586cb
Packit 8586cb
adcli_result     _adcli_krb5_open_keytab          (krb5_context k5,
Packit 8586cb
                                                   const char *keytab_name,
Packit 8586cb
                                                   krb5_keytab *keytab);
Packit 8586cb
Packit 8586cb
krb5_error_code  _adcli_krb5_build_principal      (krb5_context k5,
Packit 8586cb
                                                   const char *user,
Packit 8586cb
                                                   const char *realm,
Packit 8586cb
                                                   krb5_principal *principal);
Packit 8586cb
Packit 8586cb
krb5_error_code  _adcli_krb5_keytab_clear         (krb5_context k5,
Packit 8586cb
                                                   krb5_keytab keytab,
Packit 8586cb
                                                   krb5_boolean (* match_func) (krb5_context,
Packit 8586cb
                                                                krb5_keytab_entry *, void *),
Packit 8586cb
                                                   void *match_data);
Packit 8586cb
Packit 8586cb
krb5_error_code  _adcli_krb5_keytab_clear_all     (krb5_context k5,
Packit 8586cb
                                                   krb5_keytab keytab);
Packit 8586cb
Packit 8586cb
krb5_error_code  _adcli_krb5_keytab_enumerate     (krb5_context k5,
Packit 8586cb
                                                   krb5_keytab keytab,
Packit 8586cb
                                                   krb5_boolean (* match_func) (krb5_context,
Packit 8586cb
                                                                krb5_keytab_entry *, void *),
Packit 8586cb
                                                   void *match_data);
Packit 8586cb
Packit 8586cb
krb5_error_code  _adcli_krb5_keytab_add_entries   (krb5_context k5,
Packit 8586cb
                                                   krb5_keytab keytab,
Packit 8586cb
                                                   krb5_principal princpal,
Packit 8586cb
                                                   krb5_kvno kvno,
Packit 8586cb
                                                   krb5_data *password,
Packit 8586cb
                                                   krb5_enctype *enctypes,
Packit 8586cb
                                                   krb5_data *salt);
Packit 8586cb
Packit 8586cb
krb5_error_code  _adcli_krb5_keytab_test_salt     (krb5_context k5,
Packit 8586cb
                                                   krb5_keytab scratch,
Packit 8586cb
                                                   krb5_principal principal,
Packit 8586cb
                                                   krb5_kvno kvno,
Packit 8586cb
                                                   krb5_data *password,
Packit 8586cb
                                                   krb5_enctype *enctypes,
Packit 8586cb
                                                   krb5_data *salt);
Packit 8586cb
Packit 8586cb
krb5_error_code  _adcli_krb5_keytab_discover_salt (krb5_context k5,
Packit 8586cb
                                                   krb5_principal principal,
Packit 8586cb
                                                   krb5_kvno kvno,
Packit 8586cb
                                                   krb5_data *password,
Packit 8586cb
                                                   krb5_enctype *enctypes,
Packit 8586cb
                                                   krb5_data *salts,
Packit 8586cb
                                                   int *discovered);
Packit 8586cb
Packit 8586cb
krb5_error_code  _adcli_krb5_w2k3_salt            (krb5_context k5,
Packit 8586cb
                                                   krb5_principal principal,
Packit 8586cb
                                                   const char *host_netbios,
Packit 8586cb
                                                   krb5_data *salt);
Packit 8586cb
Packit 8586cb
krb5_enctype *   _adcli_krb5_parse_enctypes       (const char *value);
Packit 8586cb
Packit 8586cb
char *           _adcli_krb5_format_enctypes      (krb5_enctype *enctypes);
Packit 8586cb
Packit Service 698e38
krb5_error_code  _adcli_krb5_keytab_copy_entries  (krb5_context k5,
Packit Service 698e38
                                                   krb5_keytab keytab,
Packit Service 698e38
                                                   krb5_principal principal,
Packit Service 698e38
                                                   krb5_kvno kvno,
Packit Service 698e38
                                                   krb5_enctype *enctypes);
Packit Service 698e38
Packit 8586cb
struct _adcli_attrs {
Packit 8586cb
	LDAPMod **mods;
Packit 8586cb
	int len;
Packit 8586cb
};
Packit 8586cb
Packit 8586cb
bool             _adcli_check_nt_time_string_lifetime (const char *nt_time_string, unsigned int lifetime);
Packit 8586cb
Packit Service cb5865
adcli_result     _adcli_call_external_program     (const char *binary,
Packit Service cb5865
                                                   char * const *argv,
Packit Service cb5865
                                                   const char *stdin_data,
Packit Service cb5865
                                                   uint8_t **stdout_data,
Packit Service cb5865
                                                   size_t *stdout_data_len);
Packit Service cb5865
Packit 8586cb
#endif /* ADPRIVATE_H_ */