|
|
1.1 ! root 1: /* del_alias.c - */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/others/quipu/uips/manage/RCS/del_alias.c,v 7.1 90/07/27 08:47:19 mrose Exp $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/others/quipu/uips/manage/RCS/del_alias.c,v 7.1 90/07/27 08:47:19 mrose Exp $ ! 9: * ! 10: * ! 11: * $Log: del_alias.c,v $ ! 12: * Revision 7.1 90/07/27 08:47:19 mrose ! 13: * update ! 14: * ! 15: * Revision 7.0 90/06/26 14:52:33 mrose ! 16: * *** empty log message *** ! 17: * ! 18: */ ! 19: ! 20: /* ! 21: * NOTICE ! 22: * ! 23: * Acquisition, use, and distribution of this module and related ! 24: * materials are subject to the restrictions of a license agreement. ! 25: * Consult the Preface in the User's Manual for the full terms of ! 26: * this agreement. ! 27: * ! 28: */ ! 29: ! 30: ! 31: #include "quipu/util.h" ! 32: #include "quipu/entry.h" ! 33: #include "quipu/remove.h" ! 34: #include "quipu/compare.h" ! 35: #include "quipu/modify.h" ! 36: ! 37: extern DN dn; ! 38: extern char frompipe; ! 39: #define OPT (!frompipe || rps -> ps_byteno == 0 ? opt : rps) ! 40: #define RPS (!frompipe || opt -> ps_byteno == 0 ? rps : opt) ! 41: extern PS opt; ! 42: extern PS rps; ! 43: extern Entry current_entry ; ! 44: ! 45: call_del_alias (argc, argv) ! 46: int argc; ! 47: char **argv; ! 48: { ! 49: DN dnptr, aoj_dn, oj_dn, save_dn; ! 50: DN trail = NULLDN ; ! 51: extern DN str2dn_aux() ; ! 52: extern DN sequence_dn () ; ! 53: PS str_ps ; ! 54: char *str_buffer ; ! 55: char alias = FALSE ; ! 56: int mod_failed = 0 ; ! 57: AV_Sequence aliObjNameAVS ; ! 58: struct entrymod *emnew ; ! 59: struct DSError compare_error; ! 60: struct ds_compare_result compare_result; ! 61: struct ds_compare_arg compare_arg; ! 62: struct ds_removeentry_arg remove_arg; ! 63: struct ds_modifyentry_arg mod_arg; ! 64: struct DSError mod_error; ! 65: struct DSError error; ! 66: char objectname[80] ; ! 67: char *contact_compare[6] ; ! 68: char *contact_showentry[6] ; ! 69: char *contact_modify[1] ; ! 70: contact_compare[0] = "compare" ; ! 71: contact_compare[1] = ""; ! 72: contact_compare[2] = "-attribute"; ! 73: contact_compare[4] = "-noprint"; ! 74: contact_compare[5] = "-dontdereferencealias" ; ! 75: contact_showentry[0] = "showentry"; ! 76: contact_showentry[1] = "-noshow" ; ! 77: contact_showentry[2] = "-all" ; ! 78: contact_showentry[3] = "-nokey" ; ! 79: contact_showentry[4] = "-dontdereferencealias"; ! 80: contact_modify[0] = "modify" ; ! 81: ! 82: emnew = em_alloc() ; ! 83: str_buffer = (char *) malloc ((unsigned)1000) ; ! 84: contact_showentry[5] = (char *) malloc ((unsigned)strlen(argv[1])) ; ! 85: (void)strcpy(contact_showentry[5], argv[1]) ; ! 86: ! 87: contact_compare[3] = (char *) malloc ((unsigned)strlen("objectClass=alias.")) ; ! 88: (void)strcpy(contact_compare[3], "objectClass=alias") ; ! 89: ! 90: if ((argc = service_control (OPT, argc, argv, &remove_arg.rma_common)) == -1) ! 91: return ; ! 92: ! 93: if (argc > 2) ! 94: { ! 95: ps_printf (OPT,"Too many arguments. Aborting...\n"); ! 96: Usage (argv[0]); ! 97: return ; ! 98: } ! 99: ! 100: if (argc == 1) ! 101: { ! 102: ps_printf (OPT,"Delete what???\n") ; ! 103: Usage (argv[0]) ; ! 104: return ; ! 105: } ! 106: ! 107: (void)strcpy(objectname,argv[1]) ; ! 108: contact_compare[1] = argv[1] ; ! 109: ! 110: if (service_control (OPT, 6, contact_compare, &compare_arg.cma_common) == -1) ! 111: { ! 112: ps_print(OPT, "Problems with compare service control flags.\n") ; ! 113: return ; ! 114: } ! 115: ! 116: /* Turn a sequence number back into a DN */ ! 117: if (*objectname >= '0' && *objectname <= '9') ! 118: { ! 119: /* First convert the number into a dn */ ! 120: oj_dn = dn_cpy(sequence_dn(atoi(objectname))) ; ! 121: } ! 122: else ! 123: { ! 124: if (*objectname == '.') ! 125: { ! 126: ps_print(OPT, "..@ gives me a headache. Ambiguous. Aborting.\n") ; ! 127: return ; ! 128: } ! 129: if (*objectname == '@') ! 130: { ! 131: oj_dn = dn_cpy(str2dn(objectname + 1)) ; ! 132: } ! 133: else ! 134: { ! 135: /*oj_dn = dn_cpy(dn) ; ! 136: *dn_append(oj_dn, dn_cpy(str2dn(objectname))) ; ! 137: */ ! 138: save_dn = str2dn_aux(objectname,&alias) ; ! 139: if (save_dn != NULLDN) ! 140: { ! 141: if (alias) ! 142: { ! 143: oj_dn = dn_cpy(save_dn); ! 144: } ! 145: else ! 146: { ! 147: if (dn == NULLDN) ! 148: { ! 149: oj_dn = dn_cpy(save_dn) ; ! 150: } ! 151: else ! 152: { ! 153: oj_dn = dn_cpy(dn) ; ! 154: dn_append (oj_dn,save_dn); ! 155: } ! 156: } ! 157: } ! 158: dn_free(save_dn) ; ! 159: } ! 160: } ! 161: ! 162: if (get_ava (&compare_arg.cma_purported, "objectClass", "alias") != OK) ! 163: { ! 164: ps_print(OPT, "Oops, 'objectClass=alias' is a bad attribute!\n") ; ! 165: ps_print(OPT, "This is very bad...\n") ; ! 166: return ; ! 167: } ! 168: ! 169: save_dn = dn_cpy(dn) ; ! 170: dn = dn_cpy(oj_dn) ; ! 171: compare_arg.cma_object = oj_dn; ! 172: ! 173: if (rebind () != OK) ! 174: return ; ! 175: ! 176: /* Strong authentication */ ! 177: if (compare_arg.cma_common.ca_security != (struct security_parms *) 0) ! 178: { ! 179: struct signature *sign_operation(); ! 180: int encode_DAS_CompareArgumentData(); ! 181: ! 182: compare_arg.cma_common.ca_sig = ! 183: sign_operation((caddr_t)&compare_arg, encode_DAS_CompareArgumentData) ; ! 184: } ! 185: ! 186: while (ds_compare (&compare_arg, &compare_error, &compare_result) != DS_OK) ! 187: { ! 188: if (dish_error (OPT, &compare_error) == 0) ! 189: { ! 190: return ; ! 191: } ! 192: compare_arg.cma_object = compare_error.ERR_REFERRAL.DSE_ref_candidates->cr_name; ! 193: } ! 194: ! 195: if (compare_result.cmr_matched == FALSE) ! 196: { ! 197: ps_printf(OPT, "Sorry, object is not an alias. Aborting.\n") ; ! 198: return ; ! 199: } ! 200: ! 201: call_showentry(5, contact_showentry) ; ! 202: ! 203: if (current_entry == NULLENTRY) ! 204: { ! 205: (void)fprintf(stderr, "we have no current entry. No wonder!\n") ; ! 206: } ! 207: else ! 208: { ! 209: Attr_Sequence eptr ; ! 210: AttributeType a_t = AttrT_new("aliasedObjectName") ; ! 211: ! 212: for (eptr = current_entry->e_attributes; eptr != NULLATTR; eptr = eptr->attr_link) ! 213: { ! 214: if ( AttrT_cmp (eptr->attr_type, a_t) == 0 ) ! 215: { ! 216: aliObjNameAVS = avs_cpy(eptr->attr_value); ! 217: } ! 218: } ! 219: } ! 220: if (aliObjNameAVS == NULLAV) ! 221: { ! 222: ps_print(OPT, "Can't find 'aliasedObjectName' attribute type.\n") ; ! 223: ps_print(OPT, "Are you sure that this is an alias? Aborting.\n") ; ! 224: return ; ! 225: } ! 226: ! 227: /* Now we have the other end of the alias in AttrValue format, ! 228: * convert it into a DN, so we can modify it. ! 229: */ ! 230: ! 231: if ((str_ps = ps_alloc(str_open)) == NULLPS) ! 232: { ! 233: ps_printf(OPT, "Ps alloc for your string failed.\n") ; ! 234: return ; ! 235: } ! 236: if (str_setup (str_ps, str_buffer, 998, 1) == NOTOK) ! 237: { ! 238: ps_printf (OPT, "str_setup: %s", ps_error (str_ps -> ps_errno)); ! 239: ps_free (str_ps); ! 240: return ; ! 241: } ! 242: ! 243: avs_print(str_ps, aliObjNameAVS, EDBOUT) ; ! 244: *str_ps->ps_ptr = 0 ; ! 245: ps_free (str_ps) ; ! 246: { ! 247: char *ptr_local = str_buffer ; ! 248: while(*ptr_local !=0 && *ptr_local != '\n') ! 249: ptr_local++ ; ! 250: *ptr_local = '\0' ; ! 251: } ! 252: aoj_dn = str2dn(str_buffer) ; ! 253: ! 254: /* We now have converted a string to DN and we now have to form the ! 255: * attribute "seeAlso=<DN>", put it into the modify attributes ! 256: * and delete that attribute from the other end of the alias. ! 257: */ ! 258: ! 259: if (service_control(OPT, 1, contact_modify, &mod_arg.mea_common) == -1) ! 260: { ! 261: ps_printf(OPT, "Del_alias: Badly wrong. Service controls for modify in error...\n") ; ! 262: return ; ! 263: } ! 264: ! 265: dn_free(dn) ; ! 266: dn = dn_cpy(aoj_dn) ; ! 267: contact_showentry[1] = ( char *) malloc ((unsigned)strlen("-noshow") + 1) ; ! 268: (void)strcpy(contact_showentry[1], "-noshow") ; ! 269: contact_showentry[2] = ( char *) malloc ((unsigned)strlen("-all") + 1) ; ! 270: (void)strcpy(contact_showentry[2], "-all") ; ! 271: contact_showentry[3] = ( char *) malloc ((unsigned)strlen("-nokey") + 1) ; ! 272: (void)strcpy(contact_showentry[3], "-nokey") ; ! 273: contact_showentry[4] = ( char *) malloc ((unsigned)strlen("-dontdereferencealias") + 1) ; ! 274: (void)strcpy(contact_showentry[4], "-dontdereferencealias") ; ! 275: ! 276: call_showentry(5, contact_showentry) ; ! 277: if (current_entry == NULLENTRY) ! 278: { ! 279: (void)fprintf(stderr, "we have no current entry. No wonder!\n") ; ! 280: } ! 281: else ! 282: { ! 283: Attr_Sequence eptr ; ! 284: AttributeType a_t = AttrT_new("seeAlso") ; ! 285: ! 286: emnew->em_type = -1 ; ! 287: for (eptr = current_entry->e_attributes; eptr != NULLATTR; eptr = eptr->attr_link) ! 288: { ! 289: if ( AttrT_cmp (eptr->attr_type, a_t) == 0 ) ! 290: { ! 291: if (emnew->em_type == -1) ! 292: { ! 293: emnew->em_type = EM_REMOVEATTRIBUTE ; ! 294: } ! 295: else ! 296: { ! 297: emnew->em_type = EM_REMOVEVALUES ; ! 298: } ! 299: } ! 300: } ! 301: if (emnew->em_type == -1) ! 302: { ! 303: ps_print(OPT, "INVALID set of entries for the alias object\n") ; ! 304: ps_print(OPT, "Aborting...\n") ; ! 305: return ; ! 306: } ! 307: } ! 308: ! 309: { ! 310: AV_Sequence new_avs = avs_comp_alloc() ; ! 311: AttributeValue new_AV = AttrV_alloc() ; ! 312: ! 313: str_buffer = (char *) malloc ((unsigned)1000) ; ! 314: if ((str_ps = ps_alloc(str_open)) == NULLPS) ! 315: { ! 316: ps_printf(OPT, "Ps alloc for your string failed.\n") ; ! 317: return ; ! 318: } ! 319: if (str_setup (str_ps, str_buffer, 998, 1) == NOTOK) ! 320: { ! 321: ps_printf (OPT, "str_setup: %s", ps_error (str_ps -> ps_errno)); ! 322: ps_free (str_ps); ! 323: return ; ! 324: } ! 325: ! 326: dn_print(str_ps, oj_dn, EDBOUT) ; ! 327: *str_ps->ps_ptr = 0 ; ! 328: ps_free(str_ps) ; ! 329: ! 330: new_AV = AttrV_cpy(str2AttrV(str_buffer, str2syntax("DN"))) ; ! 331: new_avs = avs_comp_new(AttrV_cpy(new_AV)) ; ! 332: emnew->em_what = as_comp_new(AttrT_new("seeAlso"), new_avs, NULLACL_INFO) ; ! 333: } ! 334: emnew->em_next = NULLMOD ; ! 335: mod_arg.mea_object = aoj_dn; ! 336: mod_arg.mea_changes = emnew ; ! 337: ! 338: if (rebind () != OK) ! 339: return ; ! 340: ! 341: /* ! 342: * If this operation is time-stamped, it may have expired while the user ! 343: * was editing the entry. Re-calculate the time-stamp. Modify is the only ! 344: * dish command where this needs to be done. ! 345: */ ! 346: ! 347: if ((mod_arg.mea_common.ca_security != (struct security_parms *) 0) ! 348: && (mod_arg.mea_common.ca_security->sp_time != NULLCP)) ! 349: { ! 350: char *new_version(); ! 351: ! 352: free(mod_arg.mea_common.ca_security->sp_time); ! 353: mod_arg.mea_common.ca_security->sp_time = new_version(); ! 354: } ! 355: ! 356: /* If security parameters are present, take this to mean that strong ! 357: * authentication is required. This disallows 'parms + no signature' ! 358: * (pointless) and 'signature + no parms' (security risk). ! 359: */ ! 360: if (mod_arg.mea_common.ca_security != (struct security_parms *) 0) ! 361: { ! 362: int encode_DAS_ModifyEntryArgumentData(); ! 363: struct signature *sign_operation(); ! 364: mod_arg.mea_common.ca_sig = ! 365: sign_operation((caddr_t)&mod_arg, ! 366: encode_DAS_ModifyEntryArgumentData); ! 367: } ! 368: ! 369: while (ds_modifyentry (&mod_arg, &mod_error) != DS_OK) ! 370: { ! 371: if (dish_error (OPT, &mod_error) == 0) ! 372: { ! 373: ps_print(OPT, "Unable to modify ") ; ! 374: dn_print(OPT, aoj_dn, EDBOUT) ; ! 375: ps_print(OPT, "\nContinuing to delete alias...") ; ! 376: mod_failed = 1 ; ! 377: } ! 378: mod_arg.mea_object = mod_error.ERR_REFERRAL.DSE_ref_candidates->cr_name; ! 379: } ! 380: if (!mod_failed) ! 381: { ! 382: ps_print (RPS, "Modified "); ! 383: dn_print (RPS, aoj_dn, EDBOUT); ! 384: ps_print (RPS, "\n"); ! 385: delete_cache (aoj_dn); /* re-cache when next read */ ! 386: } ! 387: ! 388: dn_free(dn) ; ! 389: dn = dn_cpy(save_dn) ; ! 390: ! 391: if (move (objectname) == OK) ! 392: argc--; ! 393: ! 394: remove_arg.rma_object = dn; ! 395: ! 396: if (rebind () != OK) ! 397: return ; ! 398: ! 399: while (ds_removeentry (&remove_arg, &error) != DS_OK) ! 400: { ! 401: if (dish_error (OPT, &error) == 0) ! 402: return ; ! 403: remove_arg.rma_object = error.ERR_REFERRAL.DSE_ref_candidates->cr_name; ! 404: } ! 405: ! 406: ps_print (RPS, "Removed "); ! 407: dn_print (RPS, dn, EDBOUT); ! 408: delete_cache (dn); ! 409: for (dnptr = dn; dnptr->dn_parent != NULLDN; dnptr = dnptr->dn_parent) ! 410: trail = dnptr; ! 411: ! 412: if (trail != NULLDN) ! 413: trail->dn_parent = NULLDN; ! 414: else ! 415: dn = NULLDN; ! 416: ! 417: dn_comp_free (dnptr); ! 418: ps_print (RPS, "\n"); ! 419: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.