void getacl() { maildir_aclt_list l; char buf[2]; char *owner; const char *a; const char *editentity=cgi("editentity"); const char *editaccess=cgi("editaccess"); const char *entitytype=""; const char *entityval=""; int negate=0; if (acl_read(&l, sqwebmail_folder, &owner) < 0) { printf("%s", getarg("ACL_noaccess")); return; } strcpy(buf, ACL_ADMINISTER); acl_computeRights(&l, buf, owner); if (owner) free(owner); if (buf[0] == 0) { maildir_aclt_list_destroy(&l); return; } printf("<form method=\"post\" name=\"form1\" action=\""); output_scriptptr(); printf("\">"); output_scriptptrpostinfo(); printf("<input type=\"hidden\" name=\"update\" value=\"1\" />\n" "<input type=\"hidden\" name=\"form\" value=\"acl\" />\n"); printf("<table class=\"folder-acl-list\"><tbody>" "<tr><th align=\"left\">%s</th><th align=\"left\">%s</th></tr>\n", getarg("ENTITY"), getarg("ACCESSRIGHTS")); maildir_aclt_list_enum(&l, getacl_cb, NULL); if (*editentity == '-') { ++editentity; negate=1; } if (*editentity) { if (strncmp(editentity, "user="******"user"; entityval=editentity+5; } else if (strncmp(editentity, "group=", 6) == 0) { entitytype="group"; entityval=editentity+6; } else if (strcmp(editentity, "owner") == 0 || strcmp(editentity, "anonymous") == 0) { entitytype=editentity; } else { entitytype="other"; entityval=editentity; } } printf("<tr><td colspan=\"2\"><hr width=\"90%%\" />"); printf("<table><tbody>\n"); printf("<tr><th colspan=\"2\" align=\"left\">%s</th></tr>\n", getarg("UPDATEHDR")); printf("<tr align=\"top\"><td>" "<select name=\"negate\" id=\"negate\">\n" "<option value=\"\" > </option>\n" "<option value=\"-\" %s>-</option>\n" "</select>\n" "<select name=\"entitytype\" id=\"entitytype\" " "onchange=\"javascript:updent()\" >\n" "<option value=\"user\" %s >%s</option>\n" "<option value=\"group\" %s >%s</option>\n" "<option value=\"owner\" %s >%s</option>\n" "<option value=\"anonymous\" %s >%s</option>\n" "<option value=\"administrators\" %s >%s</option>\n" "<option value=\"other\" %s >%s</option>\n" "</select><input type=\"text\" name=\"entity\" " " id=\"entity\" value=\"", negate ? "selected=\"selected\"":"", strcmp(entitytype, "user") == 0 ? "selected=\"selected\"":"", getarg("USER"), strcmp(entitytype, "group") == 0 ? "selected=\"selected\"":"", getarg("GROUP"), strcmp(entitytype, "owner") == 0 ? "selected=\"selected\"":"", getarg("OWNER"), strcmp(entitytype, "anonymous") == 0 ? "selected=\"selected\"":"", getarg("ANONYMOUS"), strcmp(entitytype, "administrators") == 0 ? "selected=\"selected\"":"", getarg("ADMINISTRATORS"), strcmp(entitytype, "other") == 0 ? "selected=\"selected\"":"", getarg("OTHER")); p_ident_name(entityval); printf("\"/></td><td><table><tbody>"); a=getarg("ACL_all"); while (*a) { char buf2[40]; sprintf(buf2, "ACL_%c", *a); printf("<tr><td><input type=\"checkbox\" name=\"acl_%c\" " "id=\"acl_%c\" %s />" "</td><td>%s</td></tr>\n", *a, *a, strchr(editaccess, *a) ? "checked=\"checked\"":"", getarg(buf2)); ++a; } printf("</tbody></table></td></tr>\n" "<tr><td> </td>" "<td><input type=\"submit\" name=\"do.update\" value=\"%s\" />" "</td>" "</table></tbody></td></tr>\n", getarg("UPDATE")); printf("</tbody></table></form>\n"); }
int main(int argc, char *argv[]) { const char *cmd; const char *maildir; const char *folder; if (argc < 3) usage(); cmd=argv[1]; if (strcmp(cmd, resetcmd) && strcmp(cmd, listcmd) && strcmp(cmd, setcmd) && strcmp(cmd, deletecmd) && strcmp(cmd, computecmd)) usage(); maildir=argv[2]; if (strcmp(cmd, resetcmd) == 0) { if (maildir_acl_reset(maildir)) { perror(maildir); exit(1); } exit(0); } if (argc < 4) usage(); folder=argv[3]; if (strcmp(folder, INBOX) && strncmp(folder, INBOX ".", sizeof(INBOX ".")-1)) { errno=EINVAL; perror(folder); exit(1); } folder += sizeof(INBOX)-1; if (!*folder) folder="."; if (strcmp(cmd, listcmd) == 0) { maildir_aclt_list l; if (maildir_acl_read(&l, maildir, folder) || maildir_aclt_list_enum(&l, acl_list, NULL)) { perror(maildir); exit(1); } maildir_aclt_list_destroy(&l); exit(0); } if (strcmp(cmd, setcmd) == 0) { maildir_aclt_list l; maildir_aclt a; const char *identifier; const char *rights; const char *err_failedrights; if (argc < 6) usage(); identifier=argv[4]; rights=argv[5]; if (maildir_acl_read(&l, maildir, folder)) { perror(maildir); exit(1); } if (*rights == '+') { if (maildir_aclt_init(&a, NULL, maildir_aclt_list_find(&l, identifier )) || maildir_aclt_add(&a, rights+1, NULL)) { perror(argv[0]); exit(1); } } else if (*rights == '-') { if (maildir_aclt_init(&a, NULL, maildir_aclt_list_find(&l, identifier )) || maildir_aclt_del(&a, rights+1, NULL)) { perror(argv[0]); exit(1); } } else if (maildir_aclt_init(&a, rights, NULL)) { perror(argv[0]); exit (1); } if (maildir_aclt_list_add(&l, identifier, NULL, &a)) { perror(argv[0]); exit(1); } if (maildir_acl_write(&l, maildir, folder, "owner", &err_failedrights)) { if (err_failedrights) { fprintf(stderr, "Trying to set invalid access" " rights for %s\n", err_failedrights); } else perror(maildir); exit(1); } } if (strcmp(cmd, deletecmd) == 0) { maildir_aclt_list l; const char *identifier; const char *err_failedrights; if (argc < 5) usage(); identifier=argv[4]; if (maildir_acl_read(&l, maildir, folder)) { perror(maildir); exit(1); } if (maildir_aclt_list_del(&l, identifier)) { perror(maildir); exit(1); } if (maildir_acl_write(&l, maildir, folder, "owner", &err_failedrights)) { if (err_failedrights) { fprintf(stderr, "Trying to set invalid access" " rights for %s\n", err_failedrights); } else perror(maildir); exit(1); } } if (strcmp(cmd, computecmd) == 0) { maildir_aclt_list l; maildir_aclt a; struct computeinfo ci; ci.argc=argc; ci.argv=argv; if (argc < 5) usage(); if (maildir_acl_read(&l, maildir, folder)) { perror(maildir); exit(1); } if (maildir_acl_compute(&a, &l, isme, &ci)) { perror(maildir); exit(1); } printf("%s\n", maildir_aclt_ascstr(&a)); } return (0); }