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]) & atoi(argv[3]))
91 StoreField(f, 3, nfs_states[i]);
92 if (atoi(argv[3]) & MR_FS_GROUPQUOTA)
93 f->inputlines[4]->returnvalue.booleanvalue = 1;
95 f->inputlines[4]->returnvalue.booleanvalue = 0;
96 StoreField(f, 5, argv[4]);
97 StoreField(f, 6, argv[5]);
110 f = GetAndClearForm(fn);
112 display_error("Unknown form in ModifyCallback!\n");
115 f->extrastuff = form->extrastuff;
116 f->menu = form->menu;
117 for (i = 0; i < count; i++)
118 if (f->inputlines[i]->type == FT_BOOLEAN)
119 f->inputlines[i]->returnvalue.booleanvalue =
120 strcmp(argv[i + offset], "0") ? 1 : 0;
122 StoreField(f, i, argv[i + offset]);
124 display_error("Unknown function in ModifyCallback!\n");
130 /* Generate a new cryptographic signature for the user record */
131 SignUser(argv, offset)
140 if (strcmp(argv[U_NAME + offset], UNIQUE_LOGIN)) {
141 sprintf(buf, "%s:%s", argv[U_NAME + offset], argv[U_MITID + offset]);
143 i = GDSS_Verify(buf, strlen(buf), argv[U_SIGNATURE + offset], &si);
144 /* If it's already signed OK, don't resign it. */
145 if (i != GDSS_SUCCESS) {
146 free(argv[U_SIGNATURE + offset]);
147 argv[U_SIGNATURE + offset] = (char *) malloc(GDSS_Sig_Size() * 2);
149 i = GDSS_Sign(buf, strlen(buf), argv[U_SIGNATURE + offset]);
150 if (i != GDSS_SUCCESS)
151 com_err(program_name, gdss2et(i),
152 "Failed to create signature");
154 unsigned char newbuf[256];
156 i = GDSS_Verify(buf, strlen(buf),
157 argv[U_SIGNATURE + offset], &si);
158 if (strlen(newbuf) > 68) {
160 AppendLog("Signature too long, trying again\n");
166 AppendLog("Made signature:");hex_dump(argv[U_SIGNATURE + offset]);
168 AppendLog("Don't need to remake signature\n");
173 argv[U_SIGNATURE + offset] = strsave("");
178 /* when OK pressed */
180 MoiraFormComplete(dummy1, form)
184 process_form(form, TRUE);
188 /* when APPLY pressed */
190 MoiraFormApply(dummy1, form)
197 /* undocumented Motif internal routine to advance in tab group.
198 * In this case we're going backwards because for some reason
199 * the form advances whenever this button is pressed.
200 * However, it doesn't seem to go backwards even though source
201 * implies that it should. So we go forward until we wrap.
204 for (p = form->inputlines; *p; p++)
207 _XmMgrTraversal(form->formpointer, XmTRAVERSE_PREV_TAB_GROUP);
208 process_form(form, FALSE);
212 int CollectData(argc, argv, form)
217 struct save_queue *sq;
219 sq = (struct save_queue *) form->extrastuff;
220 sq_save_data(sq, strsave(argv[0]));
225 /* callback when form is complete to process the data */
227 process_form(form, remove)
231 char *qy, *argv[32], buf[256], *s, **aargv;
232 int (*retfunc)(), argc, i;
235 retfunc = DisplayCallback;
238 for (i = 0; form->inputlines[i]; i++)
239 argv[i] = StringValue(form, i);
240 qy = form->menu->query;
241 argc = form->menu->argc;
243 switch (form->menu->operation) {
245 if (*stringval(form, 0)) {
246 qy = "get_user_account_by_login";
247 argv[0] = stringval(form, 0);
249 } else if (*stringval(form, 3)) {
250 qy = "get_user_account_by_uid";
251 argv[0] = stringval(form, 3);
253 } else if (*stringval(form, 4)) {
254 qy = "get_user_account_by_class";
255 argv[0] = stringval(form, 4);
257 } else if (*stringval(form, 1) == 0 &&
258 *stringval(form, 2) == 0) {
259 display_error("Must fill in at least one blank.");
262 if (*stringval(form, 1) == 0)
263 StoreField(form, 1, "*");
264 if (*stringval(form, 2) == 0)
265 StoreField(form, 2, "*");
266 qy = "get_user_account_by_name";
267 argv[0] = stringval(form, 1);
268 argv[1] = stringval(form, 2);
273 argv[U_STATE][1] = 0;
274 argv[U_SECURE] = argv[U_SIGNATURE];
279 if (!strcmp(form->formname, "mod_user")) {
280 qy = "update_user_account";
281 for (i = 0; i < U_SIGNATURE; i++)
282 argv[i + 1] = StringValue(form, i);
283 argv[0] = form->extrastuff;
284 argv[U_STATE + 1][1] = 0;
285 argv[U_SIGNATURE + 1] = form->inputlines[U_SIGNATURE]->keyword_name;
286 argv[U_SECURE + 1] = StringValue(form, U_SIGNATURE);
287 if (*argv[U_SECURE + 1] == '1')
288 if (atoi(form->inputlines[U_COMMENT]->keyword_name))
289 argv[U_SECURE + 1] = form->inputlines[U_COMMENT]->keyword_name;
293 gettimeofday(&tv, NULL);
294 printf("Got %ld, %ld\n", tv.tv_sec, tv.tv_usec);
295 sprintf(buf, "%ld", tv.tv_sec);
296 argv[U_SECURE + 1] = strsave(buf);
299 argc = U_MODTIME + 1;
302 form->extrastuff = (caddr_t) "mod_user";
303 retfunc = ModifyCallback;
306 if (*stringval(form, 2)) {
307 argv[0] = stringval(form, 2);
309 argv[0] = stringval(form, 0);
310 argv[1] = stringval(form, 1);
311 form->extrastuff = NULL;
312 i = MoiraQuery("get_user_account_by_name", 2, argv,
313 ModifyCallback, (char *)form);
315 com_err(program_name, i, " looking up user by name");
318 if (form->extrastuff == NULL) {
319 display_error("Ambiguous user specification");
322 argv[0] = (char *)form->extrastuff;
324 qy = "register_user";
325 argv[1] = stringval(form, 3);
333 display_error("Expunge is not yet implemented");
337 if (!strcmp(form->formname, "mod_finger")) {
338 qy = "update_finger_by_login";
339 for (i = 0; i < F_MODTIME - 1; i++)
340 argv[i + 1] = StringValue(form, i);
341 argv[0] = form->extrastuff;
345 form->extrastuff = (caddr_t) "mod_finger";
346 retfunc = ModifyCallback;
349 if (!*stringval(form, 0))
351 if (!*stringval(form, 1))
355 if (!strcmp(argv[1], "POP"))
356 argv[2] = stringval(form, 3);
358 case MM_SHOW_ACE_USE:
359 if (boolval(form, 2)) {
360 sprintf(buf, "R%s", stringval(form, 0));
365 if (!strcmp(form->formname, "mod_list")) {
367 for (i = 0; i < L_MODTIME; i++)
368 argv[i + 1] = StringValue(form, i);
369 argv[0] = form->extrastuff;
370 argc = L_MODTIME + 1;
373 form->extrastuff = (caddr_t) "mod_list";
374 retfunc = ModifyCallback;
376 case MM_SHOW_MEMBERS:
377 if (!*stringval(form, 0)) {
378 qy = "get_lists_of_member";
379 argv[0] = stringval(form, 1);
380 sprintf(buf, "Lists of %s %s:\n", stringval(form, 1), argv[2]);
382 if (boolval(form, 3)) {
383 sprintf(buf, "R%s", stringval(form, 1));
386 argv[1] = stringval(form, 2);
389 sprintf(buf, "Members of list: %s\n", argv[0]);
393 case MM_DEL_ALL_MEMBER:
394 form->extrastuff = (caddr_t) sq_create();
395 retfunc = CollectData;
398 if (*stringval(form, 0)) {
399 qy = "get_filesys_by_label";
400 argv[0] = stringval(form, 0);
402 } else if (*stringval(form, 1)) {
403 StoreHost(form, 1, &argv[0]);
404 if (*stringval(form, 2)) {
405 qy = "get_filesys_by_nfsphys";
406 argv[1] = stringval(form, 2);
409 qy = "get_filesys_by_machine";
412 } else if (*stringval(form, 3)) {
413 qy = "get_filesys_by_group";
414 argv[0] = stringval(form, 3);
417 /* fall through to */
418 case MM_SHOW_FSGROUP:
419 form->extrastuff = (caddr_t) sq_create();
422 StoreHost(form, FS_MACHINE, &argv[FS_MACHINE]);
423 if (!strcmp(stringval(form, FS_TYPE), "AFS") ||
424 !strcmp(stringval(form, FS_TYPE), "FSGROUP") ||
425 !strcmp(stringval(form, FS_TYPE), "MUL"))
426 argv[FS_MACHINE] = "\\[NONE\\]";
429 if (!strcmp(form->formname, "mod_filsys")) {
430 qy = "update_filesys";
431 for (i = 0; i < FS_MODTIME; i++)
432 argv[i + 1] = StringValue(form, i);
433 StoreHost(form, FS_MACHINE, &argv[FS_MACHINE + 1]);
434 argv[0] = form->extrastuff;
435 argc = FS_MODTIME + 1;
438 form->extrastuff = (caddr_t) "mod_filsys";
439 retfunc = ModifyCallback;
442 argv[1] = strsave(stringval(form, 1));
443 s = index(argv[1], ' ');
445 i = MoiraQuery("remove_filesys_from_fsgroup", 2, argv, ModifyCallback,
448 com_err(program_name, i, " removing filesystem from FS group");
452 /* fall through to: */
454 /* find the two keys to sort between */
455 argv[2] = strsave(argv[2]);
456 s = index(argv[2], ' ');
459 s = index(argv[2], ')');
463 if (*argv[2] == 0) argv[2] = "A";
464 /* Finding the after key is gross. We look through the widgets
465 * in the radiobox to find the one selected and the one after
466 * it. The name of the widget is also the member name.
473 cr = (CompositeRec *)form->inputlines[2]->mywidget;
474 for (i = 0; i < cr->composite.num_children; i++) {
475 kid = cr->composite.children[i];
476 if (!strcmp(XtName(kid), stringval(form, 2))) {
478 if (i < cr->composite.num_children) {
479 argv[3] = strsave(XtName(cr->composite.children[i]));
480 s = index(argv[3], ' ');
483 s = index(argv[3], ')');
492 if (*argv[3] == 0) argv[3] = "Z";
494 printf("Got before key of \"%s\" and after key of \"%s\"\n",
497 /* copy the matching chars */
498 for (s = buf; *argv[2] && *argv[2] == *argv[3]; argv[3]++)
500 /* and set the last char */
506 if (*argv[3] == 0) *argv[3] = 'Z';
507 if (*argv[3] - *argv[2] > 1) {
508 *s++ = (*argv[3] + *argv[2])/2;
514 argv[2] = strsave(buf);
517 argv[1] = strsave(stringval(form, 1));
518 s = index(argv[1], ' ');
521 case MM_SHOW_FS_ALIAS:
522 case MM_ADD_FS_ALIAS:
523 case MM_DEL_FS_ALIAS:
525 argv[2] = stringval(form, 1);
528 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
529 if (!*stringval(form, 1))
533 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
534 sprintf(buf, "%d", atoi(stringval(form, NFS_STATUS)) +
535 (boolval(form, 4) ? MR_FS_GROUPQUOTA : 0));
536 argv[NFS_STATUS] = buf;
537 argv[NFS_ALLOC] = stringval(form, 5);
538 argv[NFS_SIZE] = stringval(form, 6);
541 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
542 if (!strcmp(form->formname, "mod_nfs")) {
543 qy = "update_nfsphys";
545 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
546 sprintf(buf, "%d", atoi(stringval(form, NFS_STATUS)) +
547 (boolval(form, 4) ? MR_FS_GROUPQUOTA : 0));
548 argv[NFS_STATUS] = buf;
549 argv[NFS_ALLOC] = stringval(form, 5);
550 argv[NFS_SIZE] = stringval(form, 6);
553 form->extrastuff = (caddr_t) "mod_nfs";
554 retfunc = ModifyCallback;
557 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
560 if (!*stringval(form, 0))
562 if (*stringval(form, 1)) {
564 argv[2] = stringval(form, 1);
565 } else if (*stringval(form, 2)) {
567 argv[2] = stringval(form, 2);
568 } else if (!*stringval(form, 0)) {
569 display_error("Must specify something.");
572 qy = "get_quota_by_filesys";
579 StoreHost(form, 0, &argv[0]);
582 if (!strcmp(form->formname, "mod_machine")) {
583 qy = "update_machine";
584 for (i = 0; i < M_MODTIME; i++)
585 argv[i + 1] = StringValue(form, i);
586 argv[0] = form->extrastuff;
587 argc = M_MODTIME + 1;
590 StoreHost(form, 0, &argv[0]);
591 form->extrastuff = (caddr_t) "mod_machine";
592 retfunc = ModifyCallback;
595 if (!strcmp(form->formname, "mod_cluster")) {
596 qy = "update_cluster";
597 for (i = 0; i < C_MODTIME; i++)
598 argv[i + 1] = StringValue(form, i);
599 argv[0] = form->extrastuff;
600 argc = C_MODTIME + 1;
603 form->extrastuff = (caddr_t) "mod_cluster";
604 retfunc = ModifyCallback;
607 if (!*stringval(form, 0))
610 StoreHost(form, 0, &argv[0]);
611 if (!*stringval(form, 1))
613 AppendToLog("Cluster mappings:\n");
617 StoreHost(form, 0, &argv[0]);
620 if (!*stringval(form, 1))
624 StoreHost(form, PCAP_SPOOL_HOST, &argv[PCAP_SPOOL_HOST]);
625 StoreHost(form, PCAP_QSERVER, &argv[PCAP_QSERVER]);
628 if (!write_log_to_file(stringval(form, 0)) && remove)
629 XtUnmanageChild(form->formpointer);
632 argv[0] = form->extrastuff;
634 argv[2] = StringValue(form, 0);
635 for (s = argv[2]; *s; s++)
636 if (islower(*s)) *s = toupper(*s);
641 display_error("Unknown function in form callback.\n");
644 i = MoiraQuery(qy, argc, argv, retfunc, (char *)form);
646 com_err(program_name, i, " executing database query");
651 if (form->extrastuff && (f = GetForm((char *)(form->extrastuff)))) {
652 if (form->formpointer)
653 XtUnmanageChild(form->formpointer);
654 f->extrastuff = (caddr_t) strsave(stringval(form, 0));
655 f->menu = form->menu;
658 switch (form->menu->operation) {
661 f->inputlines[U_STATE]->keywords = user_states;
662 StoreField(f, U_STATE, user_states[atoi(stringval(f, U_STATE))]);
663 GetKeywords(f, U_CLASS, "class");
665 AppendToLog("Done.\n");
670 AppendToLog("Done.\n");
674 GetKeywords(f, L_ACE_TYPE, "ace_type");
675 f->inputlines[L_GROUP]->valuechanged = MoiraValueChanged;
676 f->inputlines[L_ACE_TYPE]->valuechanged = MoiraValueChanged;
678 AppendToLog("Done.\n");
682 GetKeywords(f, FS_TYPE, "filesys");
683 sprintf(buf, "fs_access_%s", stringval(f, FS_TYPE));
684 GetKeywords(f, FS_ACCESS, buf);
685 GetKeywords(f, FS_L_TYPE, "lockertype");
686 if (!strcmp(stringval(f, FS_MACHINE), "[NONE]"))
687 StoreField(f, FS_MACHINE, "\\[NONE\\]");
688 f->inputlines[FS_TYPE]->valuechanged = MoiraValueChanged;
690 AppendToLog("Done.\n");
694 GetKeywords(f, 1, "mac_type");
696 AppendToLog("Done.\n");
700 f->inputlines[3]->keywords = nfs_states;
702 AppendToLog("Done.\n");
704 case MM_DEL_ALL_MEMBER:
705 argv[1] = StringValue(form, 0);
706 argv[2] = StringValue(form, 1);
707 while (sq_get_data(form->extrastuff, &(argv[0]))) {
708 sprintf(buf, "Delete %s %s from list %s?", StringValue(form, 0),
709 StringValue(form, 1), argv[0]);
710 if (!boolval(form, 2) ||
711 AskQuestion(buf, "confirm_del_all")) {
712 i = MoiraQuery("delete_member_from_list", 3, argv,
713 DisplayCallback, NULL);
715 com_err(program_name, i, " while removing member from list");
717 sprintf(buf, "Member %s %s removed from list %s.\n",
718 argv[1], argv[2], argv[0]);
724 AppendToLog("Done.\n");
727 case MM_SHOW_FSGROUP:
728 while (sq_get_data(form->extrastuff, &aargv)) {
731 sq_destroy(form->extrastuff);
739 case MM_CLEAR_SERVICE:
740 case MM_RESET_SERVICE:
764 case MM_ADD_FS_ALIAS:
765 case MM_DEL_FS_ALIAS:
780 AppendToLog("Done.\n");
783 CacheNewValue(GetForm(form->menu->form), (int) form->menu->accel,
784 form->extrastuff, StringValue(form, 0));
787 if (remove && form->formpointer)
788 XtUnmanageChild(form->formpointer);
801 int (*retfunc)(), argc, i;
804 retfunc = DisplayCallback;
810 switch (m->operation) {
811 case MM_SHOW_MAILLIST:
812 argv[0] = argv[1] = argv[3] = "TRUE";
814 argv[4] = "DONTCARE";
815 AppendToLog("Public Mailinglists:\n");
818 argv[0] = "def_quota";
821 AppendToLog("Services and Hosts with failed updates:\n");
822 argv[0] = argv[2] = "DONTCARE";
824 i = MoiraQuery("qualified_get_server", 3, argv, retfunc, NULL);
825 if (i && i != MR_NO_MATCH)
826 com_err(program_name, i, " executing database query");
828 argv[1] = argv[2] = argv[3] = argv[5] = "DONTCARE";
830 i = MoiraQuery("qualified_get_server_host", 6, argv, retfunc, NULL);
831 if (i && i != MR_NO_MATCH)
832 com_err(program_name, i, " executing database query");
836 case MM_HELP_WILDCARDS:
837 case MM_HELP_AUTHORS:
840 case MM_HELP_KEYBOARD:
848 display_error("Unknown function in menu callback.\n");
851 i = MoiraQuery(qy, argc, argv, retfunc, (char *)&dummy);
853 com_err(program_name, i, " executing database query");