6 #include <moira_site.h>
9 #include <sys/socket.h>
10 #include <netinet/in.h>
11 #include <X11/IntrinsicP.h>
12 #include <X11/CoreP.h>
13 #include <X11/CompositeP.h>
23 /* Called with moira data that is to be modified. */
25 int ModifyCallback(argc, argv, form)
36 switch (form->menu->operation) {
39 f = GetAndClearForm("mod_user");
41 display_error("Unknown form in ModifyCallback!\n");
44 f->extrastuff = form->extrastuff;
46 for (i = 0; i < U_SIGNATURE; i++)
47 if (f->inputlines[i]->type == FT_BOOLEAN)
48 f->inputlines[i]->returnvalue.booleanvalue =
49 strcmp(argv[i + offset], "0") ? 1 : 0;
51 StoreField(f, i, argv[i + offset]);
52 f->inputlines[U_SIGNATURE]->keyword_name = strsave(argv[U_SIGNATURE]);
53 f->inputlines[U_SIGNATURE]->returnvalue.booleanvalue =
54 strcmp(argv[U_SECURE], "0") ? 1 : 0;
55 f->inputlines[U_COMMENT]->keyword_name = strsave(argv[U_SECURE]);
59 count = F_MODTIME - 1;
64 form->extrastuff = NULL;
66 form->extrastuff = strsave(argv[U_UID]);
78 f = GetAndClearForm("mod_nfs");
80 display_error("Unknown form in ModifyCallback of mod_nfs\n");
83 f->extrastuff = form->extrastuff;
85 StoreField(f, 0, argv[0]);
86 StoreField(f, 1, argv[1]);
87 StoreField(f, 2, argv[2]);
88 f->inputlines[3]->keywords = nfs_states;
89 for (i = 0; nfs_states[i]; i++)
90 if ((atoi(nfs_states[i]) & ~MR_FS_GROUPQUOTA) == atoi(argv[3]))
91 StoreField(f, 3, nfs_states[i]);
92 StoreField(f, 3, argv[3]);
93 if (atoi(argv[3]) && MR_FS_GROUPQUOTA)
94 f->inputlines[4]->returnvalue.booleanvalue = 1;
95 StoreField(f, 5, argv[4]);
96 StoreField(f, 6, argv[5]);
109 f = GetAndClearForm(fn);
111 display_error("Unknown form in ModifyCallback!\n");
114 f->extrastuff = form->extrastuff;
115 f->menu = form->menu;
116 for (i = 0; i < count; i++)
117 if (f->inputlines[i]->type == FT_BOOLEAN)
118 f->inputlines[i]->returnvalue.booleanvalue =
119 strcmp(argv[i + offset], "0") ? 1 : 0;
121 StoreField(f, i, argv[i + offset]);
123 display_error("Unknown function in ModifyCallback!\n");
129 /* Generate a new cryptographic signature for the user record */
130 SignUser(argv, offset)
139 if (strcmp(argv[U_NAME + offset], UNIQUE_LOGIN)) {
140 sprintf(buf, "%s:%s", argv[U_NAME + offset], argv[U_MITID + offset]);
142 i = GDSS_Verify(buf, strlen(buf), argv[U_SIGNATURE + offset], &si);
143 /* If it's already signed OK, don't resign it. */
144 if (i != GDSS_SUCCESS) {
145 free(argv[U_SIGNATURE + offset]);
146 argv[U_SIGNATURE + offset] = (char *) malloc(GDSS_Sig_Size() * 2);
148 i = GDSS_Sign(buf, strlen(buf), argv[U_SIGNATURE + offset]);
149 if (i != GDSS_SUCCESS)
150 com_err(program_name, gdss2et(i),
151 "Failed to create signature");
153 unsigned char newbuf[256];
155 i = GDSS_Verify(buf, strlen(buf),
156 argv[U_SIGNATURE + offset], &si);
157 if (strlen(newbuf) > 68) {
159 AppendLog("Signature too long, trying again\n");
165 AppendLog("Made signature:");hex_dump(argv[U_SIGNATURE + offset]);
167 AppendLog("Don't need to remake signature\n");
172 argv[U_SIGNATURE + offset] = strsave("");
177 /* when OK pressed */
179 MoiraFormComplete(dummy1, form)
183 process_form(form, TRUE);
187 /* when APPLY pressed */
189 MoiraFormApply(dummy1, form)
196 /* undocumented Motif internal routine to advance in tab group.
197 * In this case we're going backwards because for some reason
198 * the form advances whenever this button is pressed.
199 * However, it doesn't seem to go backwards even though source
200 * implies that it should. So we go forward until we wrap.
203 for (p = form->inputlines; *p; p++)
206 _XmMgrTraversal(form->formpointer, XmTRAVERSE_PREV_TAB_GROUP);
207 process_form(form, FALSE);
211 int CollectData(argc, argv, form)
216 struct save_queue *sq;
218 sq = (struct save_queue *) form->extrastuff;
219 sq_save_data(sq, strsave(argv[0]));
224 /* callback when form is complete to process the data */
226 process_form(form, remove)
230 char *qy, *argv[32], buf[256], *s, **aargv;
231 int (*retfunc)(), argc, i;
234 retfunc = DisplayCallback;
237 for (i = 0; form->inputlines[i]; i++)
238 argv[i] = StringValue(form, i);
239 qy = form->menu->query;
240 argc = form->menu->argc;
242 switch (form->menu->operation) {
244 if (*stringval(form, 0)) {
245 qy = "get_user_account_by_login";
246 argv[0] = stringval(form, 0);
248 } else if (*stringval(form, 3)) {
249 qy = "get_user_account_by_uid";
250 argv[0] = stringval(form, 3);
252 } else if (*stringval(form, 4)) {
253 qy = "get_user_account_by_class";
254 argv[0] = stringval(form, 4);
256 } else if (*stringval(form, 1) == 0 &&
257 *stringval(form, 2) == 0) {
258 display_error("Must fill in at least one blank.");
261 if (*stringval(form, 1) == 0)
262 StoreField(form, 1, "*");
263 if (*stringval(form, 2) == 0)
264 StoreField(form, 2, "*");
265 qy = "get_user_account_by_name";
266 argv[0] = stringval(form, 1);
267 argv[1] = stringval(form, 2);
272 argv[U_STATE][1] = 0;
273 argv[U_SECURE] = argv[U_SIGNATURE];
278 if (!strcmp(form->formname, "mod_user")) {
279 qy = "update_user_account";
280 for (i = 0; i < U_SIGNATURE; i++)
281 argv[i + 1] = StringValue(form, i);
282 argv[0] = form->extrastuff;
283 argv[U_STATE + 1][1] = 0;
284 argv[U_SIGNATURE + 1] = form->inputlines[U_SIGNATURE]->keyword_name;
285 argv[U_SECURE + 1] = StringValue(form, U_SIGNATURE);
286 if (*argv[U_SECURE + 1] == '1')
287 if (atoi(form->inputlines[U_COMMENT]->keyword_name))
288 argv[U_SECURE + 1] = form->inputlines[U_COMMENT]->keyword_name;
292 gettimeofday(&tv, NULL);
293 printf("Got %ld, %ld\n", tv.tv_sec, tv.tv_usec);
294 sprintf(buf, "%ld", tv.tv_sec);
295 argv[U_SECURE + 1] = strsave(buf);
298 argc = U_MODTIME + 1;
301 form->extrastuff = (caddr_t) "mod_user";
302 retfunc = ModifyCallback;
305 if (*stringval(form, 2)) {
306 argv[0] = stringval(form, 2);
308 argv[0] = stringval(form, 0);
309 argv[1] = stringval(form, 1);
310 form->extrastuff = NULL;
311 i = MoiraQuery("get_user_account_by_name", 2, argv,
312 ModifyCallback, (char *)form);
314 com_err(program_name, i, " looking up user by name");
317 if (form->extrastuff == NULL) {
318 display_error("Ambiguous user specification");
321 argv[0] = (char *)form->extrastuff;
323 qy = "register_user";
324 argv[1] = stringval(form, 3);
332 display_error("Expunge is not yet implemented");
336 if (!strcmp(form->formname, "mod_finger")) {
337 qy = "update_finger_by_login";
338 for (i = 0; i < F_MODTIME - 1; i++)
339 argv[i + 1] = StringValue(form, i);
340 argv[0] = form->extrastuff;
344 form->extrastuff = (caddr_t) "mod_finger";
345 retfunc = ModifyCallback;
348 if (!*stringval(form, 0))
350 if (!*stringval(form, 1))
354 if (!strcmp(argv[1], "POP"))
355 argv[2] = stringval(form, 3);
357 case MM_SHOW_ACE_USE:
358 if (boolval(form, 2)) {
359 sprintf(buf, "R%s", stringval(form, 0));
364 if (!strcmp(form->formname, "mod_list")) {
366 for (i = 0; i < L_MODTIME; i++)
367 argv[i + 1] = StringValue(form, i);
368 argv[0] = form->extrastuff;
369 argc = L_MODTIME + 1;
372 form->extrastuff = (caddr_t) "mod_list";
373 retfunc = ModifyCallback;
375 case MM_SHOW_MEMBERS:
376 if (!*stringval(form, 0)) {
377 qy = "get_lists_of_member";
378 argv[0] = stringval(form, 1);
379 sprintf(buf, "Lists of %s %s:\n", stringval(form, 1), argv[2]);
381 if (boolval(form, 3)) {
382 sprintf(buf, "R%s", stringval(form, 1));
385 argv[1] = stringval(form, 2);
388 sprintf(buf, "Members of list: %s\n", argv[0]);
392 case MM_DEL_ALL_MEMBER:
393 form->extrastuff = (caddr_t) sq_create();
394 retfunc = CollectData;
397 if (*stringval(form, 0)) {
398 qy = "get_filesys_by_label";
399 argv[0] = stringval(form, 0);
401 } else if (*stringval(form, 1)) {
402 StoreHost(form, 1, &argv[0]);
403 if (*stringval(form, 2)) {
404 qy = "get_filesys_by_nfsphys";
405 argv[1] = stringval(form, 2);
408 qy = "get_filesys_by_machine";
411 } else if (*stringval(form, 3)) {
412 qy = "get_filesys_by_group";
413 argv[0] = stringval(form, 3);
416 /* fall through to */
417 case MM_SHOW_FSGROUP:
418 form->extrastuff = (caddr_t) sq_create();
421 StoreHost(form, FS_MACHINE, &argv[FS_MACHINE]);
422 if (!strcmp(stringval(form, FS_TYPE), "AFS") ||
423 !strcmp(stringval(form, FS_TYPE), "FSGROUP") ||
424 !strcmp(stringval(form, FS_TYPE), "MUL"))
425 argv[FS_MACHINE] = "\\[NONE\\]";
428 if (!strcmp(form->formname, "mod_filsys")) {
429 qy = "update_filesys";
430 for (i = 0; i < FS_MODTIME; i++)
431 argv[i + 1] = StringValue(form, i);
432 StoreHost(form, FS_MACHINE, &argv[FS_MACHINE + 1]);
433 argv[0] = form->extrastuff;
434 argc = FS_MODTIME + 1;
437 form->extrastuff = (caddr_t) "mod_filsys";
438 retfunc = ModifyCallback;
441 argv[1] = strsave(stringval(form, 1));
442 s = index(argv[1], ' ');
444 i = MoiraQuery("remove_filesys_from_fsgroup", 2, argv, ModifyCallback,
447 com_err(program_name, i, " removing filesystem from FS group");
451 /* fall through to: */
453 /* find the two keys to sort between */
454 argv[2] = strsave(argv[2]);
455 s = index(argv[2], ' ');
458 s = index(argv[2], ')');
462 if (*argv[2] == 0) argv[2] = "A";
463 /* Finding the after key is gross. We look through the widgets
464 * in the radiobox to find the one selected and the one after
465 * it. The name of the widget is also the member name.
472 cr = (CompositeRec *)form->inputlines[2]->mywidget;
473 for (i = 0; i < cr->composite.num_children; i++) {
474 kid = cr->composite.children[i];
475 if (!strcmp(XtName(kid), stringval(form, 2))) {
477 if (i < cr->composite.num_children) {
478 argv[3] = strsave(XtName(cr->composite.children[i]));
479 s = index(argv[3], ' ');
482 s = index(argv[3], ')');
491 if (*argv[3] == 0) argv[3] = "Z";
493 printf("Got before key of \"%s\" and after key of \"%s\"\n",
496 /* copy the matching chars */
497 for (s = buf; *argv[2] && *argv[2] == *argv[3]; argv[3]++)
499 /* and set the last char */
505 if (*argv[3] == 0) *argv[3] = 'Z';
506 if (*argv[3] - *argv[2] > 1) {
507 *s++ = (*argv[3] + *argv[2])/2;
513 argv[2] = strsave(buf);
516 argv[1] = strsave(stringval(form, 1));
517 s = index(argv[1], ' ');
520 case MM_SHOW_FS_ALIAS:
521 case MM_ADD_FS_ALIAS:
522 case MM_DEL_FS_ALIAS:
524 argv[2] = stringval(form, 1);
527 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
528 if (!*stringval(form, 1))
532 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
533 sprintf(buf, "%d", atoi(stringval(form, NFS_STATUS)) +
534 (boolval(form, 4) ? MR_FS_GROUPQUOTA : 0));
535 argv[NFS_STATUS] = buf;
536 argv[NFS_ALLOC] = stringval(form, 5);
537 argv[NFS_SIZE] = stringval(form, 6);
540 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
541 if (!strcmp(form->formname, "mod_nfs")) {
542 qy = "update_nfsphys";
546 form->extrastuff = (caddr_t) "mod_nfs";
547 retfunc = ModifyCallback;
550 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
553 if (!*stringval(form, 0))
555 if (*stringval(form, 1)) {
557 argv[2] = stringval(form, 1);
558 } else if (*stringval(form, 2)) {
560 argv[2] = stringval(form, 2);
561 } else if (!*stringval(form, 0)) {
562 display_error("Must specify something.");
565 qy = "get_quota_by_filesys";
572 StoreHost(form, 0, &argv[0]);
575 if (!strcmp(form->formname, "mod_machine")) {
576 qy = "update_machine";
577 for (i = 0; i < M_MODTIME; i++)
578 argv[i + 1] = StringValue(form, i);
579 argv[0] = form->extrastuff;
580 argc = M_MODTIME + 1;
583 StoreHost(form, 0, &argv[0]);
584 form->extrastuff = (caddr_t) "mod_machine";
585 retfunc = ModifyCallback;
588 if (!strcmp(form->formname, "mod_cluster")) {
589 qy = "update_cluster";
590 for (i = 0; i < C_MODTIME; i++)
591 argv[i + 1] = StringValue(form, i);
592 argv[0] = form->extrastuff;
593 argc = C_MODTIME + 1;
596 form->extrastuff = (caddr_t) "mod_cluster";
597 retfunc = ModifyCallback;
600 if (!*stringval(form, 0))
603 StoreHost(form, 0, &argv[0]);
604 if (!*stringval(form, 1))
606 AppendToLog("Cluster mappings:\n");
610 StoreHost(form, 0, &argv[0]);
613 if (!*stringval(form, 1))
617 StoreHost(form, PCAP_SPOOL_HOST, &argv[PCAP_SPOOL_HOST]);
618 StoreHost(form, PCAP_QSERVER, &argv[PCAP_QSERVER]);
621 if (!write_log_to_file(stringval(form, 0)) && remove)
622 XtUnmanageChild(form->formpointer);
625 argv[0] = form->extrastuff;
627 argv[2] = StringValue(form, 0);
628 for (s = argv[2]; *s; s++)
629 if (islower(*s)) *s = toupper(*s);
634 display_error("Unknown function in form callback.\n");
637 i = MoiraQuery(qy, argc, argv, retfunc, (char *)form);
639 com_err(program_name, i, " executing database query");
644 if (form->extrastuff && (f = GetForm((char *)(form->extrastuff)))) {
645 if (form->formpointer)
646 XtUnmanageChild(form->formpointer);
647 f->extrastuff = (caddr_t) strsave(stringval(form, 0));
648 f->menu = form->menu;
651 switch (form->menu->operation) {
654 f->inputlines[U_STATE]->keywords = user_states;
655 StoreField(f, U_STATE, user_states[atoi(stringval(f, U_STATE))]);
656 GetKeywords(f, U_CLASS, "class");
658 AppendToLog("Done.\n");
663 AppendToLog("Done.\n");
667 GetKeywords(f, L_ACE_TYPE, "ace_type");
668 f->inputlines[L_GROUP]->valuechanged = MoiraValueChanged;
669 f->inputlines[L_ACE_TYPE]->valuechanged = MoiraValueChanged;
671 AppendToLog("Done.\n");
675 GetKeywords(f, FS_TYPE, "filesys");
676 sprintf(buf, "fs_access_%s", stringval(f, FS_TYPE));
677 GetKeywords(f, FS_ACCESS, buf);
678 GetKeywords(f, FS_L_TYPE, "lockertype");
679 if (!strcmp(stringval(f, FS_MACHINE), "[NONE]"))
680 StoreField(f, FS_MACHINE, "\\[NONE\\]");
681 f->inputlines[FS_TYPE]->valuechanged = MoiraValueChanged;
683 AppendToLog("Done.\n");
687 GetKeywords(f, 1, "mac_type");
689 AppendToLog("Done.\n");
693 f->inputlines[3]->keywords = nfs_states;
695 AppendToLog("Done.\n");
697 case MM_DEL_ALL_MEMBER:
698 argv[1] = StringValue(form, 0);
699 argv[2] = StringValue(form, 1);
700 while (sq_get_data(form->extrastuff, &(argv[0]))) {
701 sprintf(buf, "Delete %s %s from list %s?", StringValue(form, 0),
702 StringValue(form, 1), argv[0]);
703 if (!boolval(form, 2) ||
704 AskQuestion(buf, "If you answer yes, this member will be deleted from the named list.\n\
705 Answer no to avoid the deletion. In either case, you will continue to\n\
706 be prompted with the other lists the member belongs to.")) {
707 i = MoiraQuery("delete_member_from_list", 3, argv,
708 DisplayCallback, NULL);
710 com_err(program_name, i, " while removing member from list");
712 sprintf(buf, "Member %s %s removed from list %s.\n",
713 argv[1], argv[2], argv[0]);
719 AppendToLog("Done.\n");
722 case MM_SHOW_FSGROUP:
723 while (sq_get_data(form->extrastuff, &aargv)) {
726 sq_destroy(form->extrastuff);
734 case MM_CLEAR_SERVICE:
735 case MM_RESET_SERVICE:
759 case MM_ADD_FS_ALIAS:
760 case MM_DEL_FS_ALIAS:
775 AppendToLog("Done.\n");
778 CacheNewValue(GetForm(form->menu->form), (int) form->menu->accel,
779 form->extrastuff, StringValue(form, 0));
782 if (remove && form->formpointer)
783 XtUnmanageChild(form->formpointer);
796 int (*retfunc)(), argc, i;
799 retfunc = DisplayCallback;
805 switch (m->operation) {
806 case MM_SHOW_MAILLIST:
807 argv[0] = argv[1] = argv[3] = "TRUE";
809 argv[4] = "DONTCARE";
810 AppendToLog("Public Mailinglists:\n");
813 argv[0] = "def_quota";
816 AppendToLog("Services and Hosts with failed updates:\n");
817 argv[0] = argv[2] = "DONTCARE";
819 i = MoiraQuery("qualified_get_server", 3, argv, retfunc, NULL);
820 if (i && i != MR_NO_MATCH)
821 com_err(program_name, i, " executing database query");
823 argv[1] = argv[2] = argv[3] = argv[5] = "DONTCARE";
825 i = MoiraQuery("qualified_get_server_host", 6, argv, retfunc, NULL);
826 if (i && i != MR_NO_MATCH)
827 com_err(program_name, i, " executing database query");
831 case MM_HELP_WILDCARDS:
832 case MM_HELP_AUTHORS:
841 display_error("Unknown function in menu callback.\n");
844 i = MoiraQuery(qy, argc, argv, retfunc, (char *)&dummy);
846 com_err(program_name, i, " executing database query");