1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373
|
/* -*- show-trailing-whitespace: t; indent-tabs: t -*-
*
* Copyright (c) 2003,2004,2005,2006 David Lichteblau
* Copyright (c) 2006 Perry Nguyen
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
#include <glib.h>
/* fixme: */
#define LDAP_DEPRECATED 1
#include <ldap.h>
#include <ldap_schema.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/termios.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <time.h>
#include <unistd.h>
#include <ctype.h>
#define MANUAL_SYNTAX_URL "http://www.lichteblau.com/ldapvi/manual#syntax"
#define MANUAL_LDIF_URL "http://www.lichteblau.com/ldapvi/manual#syntax-ldif"
#define RFC_2849_URL "http://www.rfc-editor.org/rfc/rfc2849.txt"
typedef struct tschema {
GHashTable *classes;
GHashTable *types;
} tschema;
typedef struct tentroid {
tschema *schema;
GPtrArray *classes;
GPtrArray *must;
GPtrArray *may;
LDAPObjectClass *structural;
GString *comment;
GString *error;
} tentroid;
/*
* error.c
*/
#define syserr() do_syserr(__FILE__, __LINE__)
void do_syserr(char *file, int line);
void yourfault(char *str);
void ldaperr(LDAP *ld, char *str);
/*
* arguments.c
*/
enum ldapvi_mode {
ldapvi_mode_edit, ldapvi_mode_in, ldapvi_mode_out,
ldapvi_mode_delete, ldapvi_mode_rename, ldapvi_mode_modrdn
};
enum bind_dialog {
BD_NEVER = LDAP_SASL_QUIET,
BD_AUTO = LDAP_SASL_AUTOMATIC,
BD_ALWAYS = LDAP_SASL_INTERACTIVE
};
/* FIXME (?): For now, we recklessly leak all strings stored in
* bind_options when reauthentication is performed and new values are
* stored. */
typedef struct bind_options {
ber_tag_t authmethod; /* LDAP_AUTH_SASL or LDAP_AUTH_NONE */
enum bind_dialog dialog;
char *user; /* DN or user search filter */
char *password; /* Simple or SASL passwd */
char *sasl_authcid;
char *sasl_authzid;
char *sasl_mech;
char *sasl_realm;
char *sasl_secprops;
} bind_options;
typedef struct cmdline {
char *server;
GPtrArray *basedns;
int scope;
char *filter;
char **attrs;
bind_options bind_options;
int quiet;
int referrals;
GPtrArray *classes;
int ldapmodify_add;
int managedsait;
char *sortkeys;
int starttls;
int tls;
int deref;
int verbose;
int noquestions;
int noninteractive;
int discover;
int config;
int ldif;
int ldapvi;
int mode;
char **delete_dns;
char *rename_old;
char *rename_new;
int rename_dor;
char *in_file;
int schema_comments;
int continuous;
int profileonlyp;
} cmdline;
void init_cmdline(cmdline *cmdline);
void parse_arguments(
int argc, const char **argv, cmdline *result, GPtrArray *ctrls);
void usage(int fd, int rc);
/*
* data.c
*/
typedef struct named_array {
char *name;
GPtrArray *array;
} named_array;
typedef struct tentry {
struct named_array e;
} tentry;
#define entry_dn(entry) ((entry)->e.name)
#define entry_attributes(entry) ((entry)->e.array)
typedef struct tattribute {
struct named_array a;
} tattribute;
#define attribute_ad(attribute) ((attribute)->a.name)
#define attribute_values(attribute) ((attribute)->a.array)
tentry *entry_new(char *dn);
void entry_free(tentry *e);
int entry_cmp(tentry *e, tentry *f);
tattribute *attribute_new(char *ad);
void attribute_free(tattribute *a);
int attribute_cmp(tattribute *a, tattribute *b);
int named_array_ptr_cmp(const void *aa, const void *bb);
LDAPMod *attribute2mods(tattribute *attribute);
LDAPMod **entry2mods(tentry *entry);
tattribute *entry_find_attribute(tentry *entry, char *ad, int createp);
void attribute_append_value(tattribute *attribute, char *data, int n);
int attribute_find_value(tattribute *attribute, char *data, int n);
int attribute_remove_value(tattribute *a, char *data, int n);
struct berval *string2berval(GArray *s);
struct berval *gstring2berval(GString *s);
char *array2string(GArray *av);
void xfree_berval(struct berval *bv);
/*
* parse.c
*/
typedef int (*parser_entry)(FILE *, long, char **, tentry **, long *);
typedef int (*parser_peek)(FILE *, long, char **, long *);
typedef int (*parser_skip)(FILE *, long, char **);
typedef int (*parser_rename)(FILE *, long, char **, char **, int *);
typedef int (*parser_delete)(FILE *, long, char **);
typedef int (*parser_modify)(FILE *, long, char **, LDAPMod ***);
typedef void (*print_entry)(FILE *, tentry *, char *, tentroid *);
typedef struct tparser {
parser_entry entry;
parser_peek peek;
parser_skip skip;
parser_rename rename;
parser_delete delete;
parser_modify modify;
print_entry print; /* ja, das muss so sein */
} tparser;
extern tparser ldif_parser;
extern tparser ldapvi_parser;
int peek_entry(FILE *s, long offset, char **key, long *pos);
int read_entry(FILE *s, long offset, char **key, tentry **entry, long *pos);
int read_rename(FILE *s, long offset, char **dn1, char **dn2, int *);
int read_modify(FILE *s, long offset, char **dn, LDAPMod ***mods);
int read_delete(FILE *s, long offset, char **dn);
int skip_entry(FILE *s, long offset, char **key);
int read_profile(FILE *s, tentry **entry);
/*
* diff.c
*/
typedef int (*handler_change)(int, char *, char *, LDAPMod **, void *);
typedef int (*handler_rename)(int, char *, tentry *, void *);
typedef int (*handler_add)(int, char *, LDAPMod **, void *);
typedef int (*handler_delete)(int, char *, void *);
typedef int (*handler_rename0)(int, char *, char *, int, void *);
typedef struct thandler {
handler_change change;
handler_rename rename;
handler_add add;
handler_delete delete;
handler_rename0 rename0;
} thandler;
int compare_streams(
tparser *parser,
thandler *handler,
void *userdata,
GArray *offsets,
FILE *clean,
FILE *data,
long *error_position,
long *syntax_error_position);
enum frob_rdn_mode {
FROB_RDN_CHECK, FROB_RDN_REMOVE, FROB_RDN_ADD, FROB_RDN_CHECK_NONE
};
int frob_rdn(tentry *entry, char *dn, int mode);
int process_immediate(tparser *, thandler *, void *, FILE *, long, char *);
/*
* misc.c
*/
enum dialog_mode {
DIALOG_DEFAULT, DIALOG_PASSWORD, DIALOG_CHALLENGE
};
typedef struct dialog {
enum dialog_mode mode;
char *prompt;
char *value;
} tdialog;
int carray_cmp(GArray *a, GArray *b);
int carray_ptr_cmp(const void *aa, const void *bb);
void cp(char *src, char *dst, off_t skip, int append);
void fcopy(FILE *src, FILE *dst);
char choose(char *prompt, char *charbag, char *help);
void edit_pos(char *pathname, long pos);
void edit(char *pathname, long line);
void view(char *pathname);
int pipeview(int *fd);
void pipeview_wait(int pid);
char *home_filename(char *name);
void read_ldapvi_history(void);
void write_ldapvi_history(void);
char *ldapvi_getline(char *prompt, char *value);
char *get_password();
char *append(char *a, char *b);
void *xalloc(size_t size);
char *xdup(char *str);
int adjoin_str(GPtrArray *, char *);
int adjoin_ptr(GPtrArray *, void *);
void init_dialog(tdialog *, enum dialog_mode, char *, char *);
void dialog(char *header, tdialog *, int, int);
void fdcp(int fdsrc, int fddst);
/*
* schema.c
*/
char *objectclass_name(LDAPObjectClass *);
char *attributetype_name(LDAPAttributeType *);
tschema *schema_new(LDAP *ld);
void schema_free(tschema *schema);
LDAPObjectClass *schema_get_objectclass(tschema *, char *);
LDAPAttributeType *schema_get_attributetype(tschema *, char *);
tentroid *entroid_new(tschema *);
void entroid_reset(tentroid *);
void entroid_free(tentroid *);
LDAPObjectClass *entroid_get_objectclass(tentroid *, char *);
LDAPAttributeType *entroid_get_attributetype(tentroid *, char *);
LDAPObjectClass *entroid_request_class(tentroid *, char *);
int entroid_remove_ad(tentroid *, char *);
int compute_entroid(tentroid *);
/*
* print.c
*/
typedef enum t_print_binary_mode {
PRINT_ASCII, PRINT_UTF8, PRINT_JUNK
} t_print_binary_mode;
extern t_print_binary_mode print_binary_mode;
void print_ldapvi_entry(FILE *s, tentry *entry, char *key, tentroid *);
void print_ldapvi_modify(FILE *s, char *dn, LDAPMod **mods);
void print_ldapvi_rename(FILE *s, char *olddn, char *newdn, int deleteoldrdn);
void print_ldapvi_add(FILE *s, char *dn, LDAPMod **mods);
void print_ldapvi_delete(FILE *s, char *dn);
void print_ldapvi_modrdn(FILE *s, char *olddn, char *newrdn, int deleteoldrdn);
void print_ldapvi_message(FILE *, LDAP *, LDAPMessage *, int key, tentroid *);
void print_ldif_entry(FILE *s, tentry *entry, char *key, tentroid *);
void print_ldif_modify(FILE *s, char *dn, LDAPMod **mods);
void print_ldif_rename(FILE *s, char *olddn, char *newdn, int deleteoldrdn);
void print_ldif_add(FILE *s, char *dn, LDAPMod **mods);
void print_ldif_delete(FILE *s, char *dn);
void print_ldif_modrdn(FILE *s, char *olddn, char *newrdn, int deleteoldrdn);
void print_ldif_message(FILE *, LDAP *, LDAPMessage *, int key, tentroid *);
/*
* search.c
*/
void discover_naming_contexts(LDAP *ld, GPtrArray *basedns);
GArray *search(
FILE *s, LDAP *ld, cmdline *cmdline, LDAPControl **ctrls, int notty,
int ldif);
LDAPMessage *get_entry(LDAP *ld, char *dn, LDAPMessage **result);
/*
* port.c
*/
typedef void (*on_exit_function)(int, void *);
int g_string_append_sha(GString *string, char *key);
int g_string_append_ssha(GString *string, char *key);
int g_string_append_md5(GString *string, char *key);
int g_string_append_smd5(GString *string, char *key);
/*
* base64.c
*/
void print_base64(unsigned char const *src, size_t srclength, FILE *s);
void g_string_append_base64(
GString *string, unsigned char const *src, size_t srclength);
int read_base64(char const *src, unsigned char *target, size_t targsize);
/*
* sasl.c
*/
typedef struct sasl_defaults {
bind_options *bind_options;
GPtrArray *scratch;
char *pathname;
int fd, out, err;
} tsasl_defaults;
void init_sasl_redirection(tsasl_defaults *, char *);
void enable_sasl_redirection(tsasl_defaults *);
void disable_sasl_redirection(tsasl_defaults *);
void finish_sasl_redirection(tsasl_defaults *);
tsasl_defaults *sasl_defaults_new(bind_options *bind_options);
void sasl_defaults_free(tsasl_defaults *sd);
int ldapvi_sasl_interact(LDAP *ld, unsigned flags, void *defaults, void *p);
|