|
|
1.1 ! root 1: /* add.c - */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/quipu/dish/RCS/add.c,v 7.2 90/07/09 14:46:56 mrose Exp $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/quipu/dish/RCS/add.c,v 7.2 90/07/09 14:46:56 mrose Exp $ ! 9: * ! 10: * ! 11: * $Log: add.c,v $ ! 12: * Revision 7.2 90/07/09 14:46:56 mrose ! 13: * sync ! 14: * ! 15: * Revision 7.1 90/01/11 18:37:30 mrose ! 16: * real-sync ! 17: * ! 18: * Revision 7.0 89/11/23 22:19:55 mrose ! 19: * Release 6.0 ! 20: * ! 21: */ ! 22: ! 23: /* ! 24: * NOTICE ! 25: * ! 26: * Acquisition, use, and distribution of this module and related ! 27: * materials are subject to the restrictions of a license agreement. ! 28: * Consult the Preface in the User's Manual for the full terms of ! 29: * this agreement. ! 30: * ! 31: */ ! 32: ! 33: ! 34: #include "quipu/util.h" ! 35: #include "quipu/dua.h" ! 36: #include "quipu/add.h" ! 37: #include "quipu/entry.h" ! 38: ! 39: #define ORG_PERSON "thornPerson & quipuObject" ! 40: /* this should probably go elsewhere !!! */ ! 41: ! 42: extern DN dn; ! 43: ! 44: #define OPT (!frompipe || rps -> ps_byteno == 0 ? opt : rps) ! 45: #define RPS (!frompipe || opt -> ps_byteno == 0 ? rps : opt) ! 46: extern char frompipe; ! 47: extern PS opt, rps; ! 48: ! 49: char fname[128]; ! 50: static char new_draft; ! 51: ! 52: call_add (argc, argv) ! 53: int argc; ! 54: char **argv; ! 55: { ! 56: ! 57: Entry entry_ptr; ! 58: FILE *fd; ! 59: struct ds_addentry_arg add_arg; ! 60: struct DSError error; ! 61: Attr_Sequence get_attributes(); ! 62: extern int parse_status; ! 63: ! 64: int x; ! 65: int draft_flag = 0; ! 66: char *O_class = NULLCP; ! 67: char noedit_flag = FALSE; ! 68: DN moddn; ! 69: char *home; ! 70: ! 71: if (home = getenv ("DISHDRAFT")) ! 72: (void) strcpy (fname, home); ! 73: else ! 74: if (home = getenv ("HOME")) ! 75: (void) sprintf (fname, "%s/.dishdraft", home); ! 76: else ! 77: (void) strcpy (fname, "./.dishdraft"); ! 78: new_draft = FALSE; ! 79: ! 80: if ((argc = service_control (OPT, argc, argv, &add_arg.ada_common)) == -1) ! 81: return; ! 82: ! 83: for (x = 1; x < argc; x++) { ! 84: if (test_arg (argv[x], "-template", 1)) { ! 85: int i; ! 86: FILE *in, *out; ! 87: extern int errno; ! 88: ! 89: draft_flag = 1; ! 90: if (++x == argc) { ! 91: ps_printf (OPT, "template file name missing\n"); ! 92: Usage (argv[0]); ! 93: return; ! 94: } ! 95: if ((in = fopen (argv[x], "r")) == NULL) { ! 96: ps_printf (OPT, "unable to open template %s: %s\n", ! 97: argv[x], sys_errname (errno)); ! 98: return; ! 99: } ! 100: i = umask (0177); ! 101: out = fopen (fname, "w"); ! 102: (void) umask (i); ! 103: if (out == NULL) { ! 104: ps_printf (OPT, "unable to write draft %s: %s\n", ! 105: fname, sys_errname (errno)); ! 106: (void) fclose (in); ! 107: return; ! 108: } ! 109: while ((i = getc (in)) != EOF) ! 110: if (putc (i, out) == EOF) { ! 111: ps_printf (OPT, "error writing draft %s: %s\n", ! 112: fname, sys_errname (errno)); ! 113: (void) fclose (in); ! 114: (void) fclose (out); ! 115: return; ! 116: } ! 117: (void) fclose (in); ! 118: (void) fclose (out); ! 119: } else if (test_arg (argv[x], "-draft", 1)) { ! 120: draft_flag = 1; ! 121: if (++x == argc) { ! 122: ps_printf (OPT, "Draft file name missing\n"); ! 123: Usage (argv[0]); ! 124: return; ! 125: } ! 126: (void) strcpy (fname, argv[x]); ! 127: } else if (test_arg (argv[x], "-objectclass",1)) { ! 128: if (++x == argc) { ! 129: ps_printf (OPT, "Object Class missing\n"); ! 130: Usage (argv[0]); ! 131: return; ! 132: } ! 133: O_class = argv[x]; ! 134: } else if (test_arg(argv[x], "-newdraft", 2)) ! 135: new_draft = TRUE; ! 136: else if (test_arg(argv[x], "-noedit", 3)) ! 137: noedit_flag = TRUE; ! 138: else if (move (argv[x]) == OK) ! 139: continue; ! 140: else { ! 141: ps_printf (OPT,"Unknown option %s\n",argv[x]); ! 142: Usage (argv[0]); ! 143: return; ! 144: } ! 145: } ! 146: ! 147: if ((!noedit_flag) && (draft_flag != 1)) { /* if no draft - create a template */ ! 148: if (add_template (fname, O_class) != OK) ! 149: return; ! 150: } ! 151: ! 152: if ( ! noedit_flag) ! 153: if (editentry (1, argv) != OK) { ! 154: make_old (fname,draft_flag); ! 155: return; ! 156: } ! 157: ! 158: /* now parse the files */ ! 159: ! 160: if ((fd = fopen (fname, "r")) == (FILE *) NULL) { ! 161: ps_printf (OPT, "Can't open draft entry %s\n", fname); ! 162: return; ! 163: } ! 164: ! 165: entry_ptr = get_default_entry (NULLENTRY); ! 166: entry_ptr->e_attributes = get_attributes (fd); ! 167: ! 168: (void) fclose (fd); ! 169: if (parse_status != 0) ! 170: return ; ! 171: ! 172: add_arg.ada_object = dn; ! 173: ! 174: for (moddn = dn ; moddn->dn_parent != NULLDN; moddn=moddn->dn_parent) ! 175: ; ! 176: entry_ptr->e_name = rdn_cpy (moddn->dn_rdn); ! 177: ! 178: add_arg.ada_entry = entry_ptr->e_attributes; ! 179: ! 180: if (rebind () != OK) { ! 181: entry_free (entry_ptr); ! 182: return; ! 183: } ! 184: ! 185: /* Strong authentication */ ! 186: if (add_arg.ada_common.ca_security != (struct security_parms *) 0) ! 187: { ! 188: struct signature *sign_operation(); ! 189: int encode_DAS_AddEntryArgumentData(); ! 190: ! 191: add_arg.ada_common.ca_sig = ! 192: sign_operation((caddr_t)&add_arg, encode_DAS_AddEntryArgumentData); ! 193: } ! 194: ! 195: while (ds_addentry (&add_arg, &error) != DS_OK) { ! 196: if (dish_error (OPT, &error) == 0) { ! 197: entry_free (entry_ptr); ! 198: return; ! 199: } ! 200: add_arg.ada_object = error.ERR_REFERRAL.DSE_ref_candidates->cr_name; ! 201: } ! 202: ps_print (RPS, "Added "); ! 203: dn_print (RPS, dn, EDBOUT); ! 204: ps_print (RPS, "\n"); ! 205: ! 206: delete_list_cache (dn); ! 207: entry_free (entry_ptr); ! 208: ! 209: make_old (fname,draft_flag); ! 210: ! 211: } ! 212: ! 213: make_old (file, commit) ! 214: char * file; ! 215: char commit; ! 216: { ! 217: char newname[LINESIZE]; ! 218: ! 219: if (commit == 0) { ! 220: (void) sprintf (newname, "%s.old", file); ! 221: (void) rename (file, newname); ! 222: } ! 223: } ! 224: ! 225: ! 226: Attr_Sequence make_template_as (oc) ! 227: AV_Sequence oc; ! 228: { ! 229: AV_Sequence avs; ! 230: Attr_Sequence newas; ! 231: Attr_Sequence as = NULLATTR; ! 232: table_seq optr; ! 233: AttributeType at; ! 234: objectclass * ocp; ! 235: ! 236: for (avs = oc; avs != NULLAV; avs = avs->avseq_next) { ! 237: ocp = (objectclass *) avs->avseq_av.av_struct; ! 238: for (optr=ocp->oc_must; optr!=NULLTABLE_SEQ; optr=optr->ts_next) { ! 239: at = optr->ts_oa; ! 240: newas = as_comp_new (at,NULLAV,NULLACL_INFO); ! 241: as = as_merge (as,newas); ! 242: } ! 243: } ! 244: ! 245: for (avs = oc; avs != NULLAV; avs = avs->avseq_next) { ! 246: ocp = (objectclass *) avs->avseq_av.av_struct; ! 247: for (optr=ocp->oc_may; optr!=NULLTABLE_SEQ; optr=optr->ts_next) { ! 248: at = optr->ts_oa; ! 249: newas = as_comp_new (at,NULLAV,NULLACL_INFO); ! 250: as = as_merge (as,newas); ! 251: } ! 252: } ! 253: ! 254: return (as); ! 255: } ! 256: ! 257: add_template (name, objclass) ! 258: char *name; ! 259: char *objclass; ! 260: { ! 261: FILE *fptr; ! 262: PS ps; ! 263: char obuf[LINESIZE]; ! 264: Attr_Sequence as; ! 265: Attr_Sequence ocas; ! 266: int um; ! 267: ! 268: if (objclass == NULLCP) ! 269: objclass = ORG_PERSON; ! 270: ! 271: if (!new_draft) ! 272: if ((fptr = fopen (name, "r")) != NULL) { ! 273: (void) fclose (fptr); ! 274: if (yesno ("Use existing draft file ? ")) ! 275: return OK; ! 276: else ! 277: make_old (fname,FALSE); ! 278: return (OK); /* template already exists ! */ ! 279: } ! 280: um = umask (0177); ! 281: if ((fptr = fopen (name, "w")) == NULL) { ! 282: ps_printf (OPT, "Can't open template entry %s\n", name); ! 283: return (-1); ! 284: } ! 285: (void) umask (um); ! 286: if ((ps = ps_alloc (std_open)) == NULLPS) { ! 287: return (-1); ! 288: } ! 289: if (std_setup (ps, fptr) == NOTOK) { ! 290: return (-1); ! 291: } ! 292: ! 293: (void) sprintf (obuf, "objectClass=%s", objclass); ! 294: if ((ocas = str2as (obuf)) == NULLATTR) ! 295: return (-1); ! 296: ! 297: as = make_template_as (ocas->attr_value); ! 298: as = as_merge (as,ocas); ! 299: ! 300: as_print (ps,as,EDBOUT); ! 301: ! 302: as_free (as); ! 303: ps_free (ps); ! 304: (void) fclose (fptr); ! 305: ! 306: return (OK); ! 307: ! 308: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.