*/
int CtdlIPCEcho(CtdlIPC *ipc, const char *arg, char *cret)
{
- register int ret;
+ int ret;
char *aaa;
if (!arg) return -2;
*/
int CtdlIPCQuit(CtdlIPC *ipc)
{
- register int ret = 221; /* Default to successful quit */
+ int ret = 221; /* Default to successful quit */
char aaa[SIZ];
CtdlIPC_lock(ipc);
*/
int CtdlIPCLogout(CtdlIPC *ipc)
{
- register int ret;
+ int ret;
char aaa[SIZ];
CtdlIPC_lock(ipc);
*/
int CtdlIPCTryLogin(CtdlIPC *ipc, const char *username, char *cret)
{
- register int ret;
+ int ret;
char *aaa;
if (!username) return -2;
*/
int CtdlIPCTryPassword(CtdlIPC *ipc, const char *passwd, char *cret)
{
- register int ret;
+ int ret;
char *aaa;
if (!passwd) return -2;
*/
int CtdlIPCTryApopPassword(CtdlIPC *ipc, const char *response, char *cret)
{
- register int ret;
+ int ret;
char *aaa;
if (!response) return -2;
*/
int CtdlIPCCreateUser(CtdlIPC *ipc, const char *username, int selfservice, char *cret)
{
- register int ret;
+ int ret;
char *aaa;
if (!username) return -2;
*/
int CtdlIPCChangePassword(CtdlIPC *ipc, const char *passwd, char *cret)
{
- register int ret;
+ int ret;
char *aaa;
if (!passwd) return -2;
/* floor is -1 for all, or floornum */
int CtdlIPCKnownRooms(CtdlIPC *ipc, enum RoomList which, int floor, struct march **listing, char *cret)
{
- register int ret;
+ int ret;
struct march *march = NULL;
static char *proto[] =
{"LKRA", "LKRN", "LKRO", "LZRM", "LRMS", "LPRM" };
/* Caller must free the struct ctdluser; caller may pass an existing one */
int CtdlIPCGetConfig(CtdlIPC *ipc, struct ctdluser **uret, char *cret)
{
- register int ret;
+ int ret;
if (!cret) return -2;
if (!uret) return -2;
/* RENU */
int CtdlIPCRenameUser(CtdlIPC *ipc, char *oldname, char *newname, char *cret)
{
- register int ret;
+ int ret;
char cmd[256];
if (!oldname) return -2;
int CtdlIPCGotoRoom(CtdlIPC *ipc, const char *room, const char *passwd,
struct ctdlipcroom **rret, char *cret)
{
- register int ret;
+ int ret;
char *aaa;
if (!cret) return -2;
int CtdlIPCGetMessages(CtdlIPC *ipc, enum MessageList which, int whicharg,
const char *mtemplate, unsigned long **mret, char *cret)
{
- register int ret;
- register unsigned long count = 0;
+ int ret;
+ unsigned long count = 0;
static char *proto[] =
{ "ALL", "OLD", "NEW", "LAST", "FIRST", "GT", "LT" };
char aaa[33];
int CtdlIPCGetSingleMessage(CtdlIPC *ipc, long msgnum, int headers, int as_mime,
struct ctdlipcmessage **mret, char *cret)
{
- register int ret;
+ int ret;
char aaa[SIZ];
char *bbb = NULL;
size_t bbb_len;
/* WHOK */
int CtdlIPCWhoKnowsRoom(CtdlIPC *ipc, char **listing, char *cret)
{
- register int ret;
+ int ret;
size_t bytes;
if (!cret) return -2;
/* INFO */
int CtdlIPCServerInfo(CtdlIPC *ipc, char *cret)
{
- register int ret;
+ int ret;
size_t bytes;
char *listing = NULL;
char buf[SIZ];
/* RDIR */
int CtdlIPCReadDirectory(CtdlIPC *ipc, char **listing, char *cret)
{
- register int ret;
+ int ret;
size_t bytes;
if (!cret) return -2;
*/
int CtdlIPCSetLastRead(CtdlIPC *ipc, long msgnum, char *cret)
{
- register int ret;
+ int ret;
char aaa[64];
if (!cret) return -2;
/* INVT */
int CtdlIPCInviteUserToRoom(CtdlIPC *ipc, const char *username, char *cret)
{
- register int ret;
+ int ret;
char *aaa;
if (!cret) return -2;
/* KICK */
int CtdlIPCKickoutUserFromRoom(CtdlIPC *ipc, const char *username, char *cret)
{
- register int ret;
+ int ret;
char *aaa;
if (!cret) return -1;
/* GETR */
int CtdlIPCGetRoomAttributes(CtdlIPC *ipc, struct ctdlroom **qret, char *cret)
{
- register int ret;
+ int ret;
if (!cret) return -2;
if (!qret) return -2;
/* set forget to kick all users out of room */
int CtdlIPCSetRoomAttributes(CtdlIPC *ipc, int forget, struct ctdlroom *qret, char *cret)
{
- register int ret;
+ int ret;
char *aaa;
if (!cret) return -2;
/* SETA */
int CtdlIPCSetRoomAide(CtdlIPC *ipc, const char *username, char *cret)
{
- register int ret;
+ int ret;
char *aaa;
if (!cret) return -2;
/* ENT0 */
int CtdlIPCPostMessage(CtdlIPC *ipc, int flag, int *subject_required, struct ctdlipcmessage *mr, char *cret)
{
- register int ret;
+ int ret;
char cmd[SIZ];
char *ptr;
/* MOVE */
int CtdlIPCMoveMessage(CtdlIPC *ipc, int copy, long msgnum, const char *destroom, char *cret)
{
- register int ret;
+ int ret;
char *aaa;
if (!cret) return -2;
int CtdlIPCCreateRoom(CtdlIPC *ipc, int for_real, const char *roomname, int type,
const char *password, int floor, char *cret)
{
- register int ret;
+ int ret;
char *aaa;
if (!cret) return -2;
/* MESG */
int CtdlIPCSystemMessage(CtdlIPC *ipc, const char *message, char **mret, char *cret)
{
- register int ret;
+ int ret;
char *aaa;
size_t bytes;
/* GREG */
int CtdlIPCGetUserRegistration(CtdlIPC *ipc, const char *username, char **rret, char *cret)
{
- register int ret;
+ int ret;
char *aaa;
size_t bytes;
/* VALI */
int CtdlIPCValidateUser(CtdlIPC *ipc, const char *username, int axlevel, char *cret)
{
- register int ret;
+ int ret;
char *aaa;
if (!cret) return -2;
/* CHEK */
int CtdlIPCMiscCheck(CtdlIPC *ipc, struct ctdlipcmisc *chek, char *cret)
{
- register int ret;
+ int ret;
if (!cret) return -1;
if (!chek) return -1;
/* DELF */
int CtdlIPCDeleteFile(CtdlIPC *ipc, const char *filename, char *cret)
{
- register int ret;
+ int ret;
char *aaa;
if (!cret) return -2;
/* MOVF */
int CtdlIPCMoveFile(CtdlIPC *ipc, const char *filename, const char *destroom, char *cret)
{
- register int ret;
+ int ret;
char *aaa;
if (!cret) return -2;
/* RWHO */
int CtdlIPCOnlineUsers(CtdlIPC *ipc, char **listing, time_t *stamp, char *cret)
{
- register int ret;
+ int ret;
size_t bytes;
if (!cret) return -1;
(CtdlIPC*, unsigned long, unsigned long),
char *cret)
{
- register int ret;
+ int ret;
size_t bytes;
time_t last_mod;
char mimetype[SIZ];
(CtdlIPC*, unsigned long, unsigned long),
char *cret)
{
- register int ret;
+ int ret;
size_t bytes;
time_t last_mod;
char filename[SIZ];
(CtdlIPC*, unsigned long, unsigned long),
char *cret)
{
- register int ret;
+ int ret;
size_t bytes;
time_t last_mod;
char mimetype[SIZ];
(CtdlIPC*, unsigned long, unsigned long),
char *cret)
{
- register int ret;
+ int ret;
char *aaa;
FILE *uploadFP;
char MimeTestBuf[64];
(CtdlIPC*, unsigned long, unsigned long),
char *cret)
{
- register int ret;
+ int ret;
FILE *uploadFP;
char *aaa;
char MimeTestBuf[64];
/* QUSR */
int CtdlIPCQueryUsername(CtdlIPC *ipc, const char *username, char *cret)
{
- register int ret;
+ int ret;
char *aaa;
if (!cret) return -2;
/* CFLR */
int CtdlIPCCreateFloor(CtdlIPC *ipc, int for_real, const char *name, char *cret)
{
- register int ret;
+ int ret;
char aaa[SIZ];
if (!cret) return -2;
/* EFLR */
int CtdlIPCEditFloor(CtdlIPC *ipc, int floornum, const char *floorname, char *cret)
{
- register int ret;
+ int ret;
char aaa[SIZ];
if (!cret) return -2;
int revision, const char *software_name, const char *hostname,
char *cret)
{
- register int ret;
+ int ret;
char *aaa;
if (developerid < 0 || clientid < 0 || revision < 0 ||
int CtdlIPCSendInstantMessage(CtdlIPC *ipc, const char *username, const char *text,
char *cret)
{
- register int ret;
+ int ret;
char *aaa;
if (!cret) return -2;
/* RBIO */
int CtdlIPCGetBio(CtdlIPC *ipc, const char *username, char **listing, char *cret)
{
- register int ret;
+ int ret;
size_t bytes;
char *aaa;
int CtdlIPCEnterSystemMessage(CtdlIPC *ipc, const char *filename, const char *text,
char *cret)
{
- register int ret;
+ int ret;
char *aaa;
if (!cret) return -2;
/* HCHG */
int CtdlIPCChangeHostname(CtdlIPC *ipc, const char *hostname, char *cret)
{
- register int ret;
+ int ret;
char *aaa;
if (!cret) return -2;
/* RCHG */
int CtdlIPCChangeRoomname(CtdlIPC *ipc, const char *roomname, char *cret)
{
- register int ret;
+ int ret;
char *aaa;
if (!cret) return -2;
/* UCHG */
int CtdlIPCChangeUsername(CtdlIPC *ipc, const char *username, char *cret)
{
- register int ret;
+ int ret;
char *aaa;
if (!cret) return -2;
/* This function returns the actual server time reported, or 0 if error */
time_t CtdlIPCServerTime(CtdlIPC *ipc, char *cret)
{
- register time_t tret;
- register int ret;
+ time_t tret;
+ int ret;
ret = CtdlIPCGenericCommand(ipc, "TIME", NULL, 0, NULL, NULL, cret);
if (ret / 100 == 2) {
/* AGUP */
-int CtdlIPCAideGetUserParameters(CtdlIPC *ipc, const char *who,
- struct ctdluser **uret, char *cret)
+int CtdlIPCAideGetUserParameters(CtdlIPC *ipc, const char *who, struct ctdluser **uret, char *cret)
{
- register int ret;
+ int ret;
char aaa[SIZ];
if (!cret) return -2;
/* ASUP */
int CtdlIPCAideSetUserParameters(CtdlIPC *ipc, const struct ctdluser *uret, char *cret)
{
- register int ret;
+ int ret;
char *aaa;
if (!cret) return -2;
}
+/* AGEA */
+int CtdlIPCAideGetEmailAddresses(CtdlIPC *ipc, const char *who, char *target_buf, char *cret)
+{
+ int ret;
+ char aaa[SIZ];
+ char *emailaddrs = NULL;
+ size_t emailaddrs_len = 0;
+
+ sprintf(aaa, "AGEA %s", who);
+ ret = CtdlIPCGenericCommand(ipc, aaa, NULL, 0, &emailaddrs, &emailaddrs_len, cret);
+
+ if (ret / 100 == 1) {
+ strcpy(target_buf, emailaddrs);
+ }
+
+ if (emailaddrs != NULL) {
+ free(emailaddrs);
+ }
+
+ return ret;
+}
+
+
/* GPEX */
/* which is 0 = room, 1 = floor, 2 = site, 3 = default for mailboxes */
/* caller must free the struct ExpirePolicy */
strof(mailboxespolicy)
};
char cmd[256];
- register int ret;
+ int ret;
if (!cret) return -2;
if (!policy) return -2;
/* CONF GETSYS */
int CtdlIPCGetSystemConfigByType(CtdlIPC *ipc, const char *mimetype, char **listing, char *cret)
{
- register int ret;
+ int ret;
char *aaa;
size_t bytes;
/* CONF PUTSYS */
int CtdlIPCSetSystemConfigByType(CtdlIPC *ipc, const char *mimetype, const char *listing, char *cret)
{
- register int ret;
+ int ret;
char *aaa;
if (!cret) return -2;
/* QDIR */
int CtdlIPCDirectoryLookup(CtdlIPC *ipc, const char *address, char *cret)
{
- register int ret;
+ int ret;
char *aaa;
if (!address) return -2;
sprintf(aaa, "QDIR %s", address);
ret = CtdlIPCGenericCommand(ipc, aaa, NULL, 0, NULL, NULL, cret);
- free(aaa);
- return ret;
+ free(aaa);
+ return ret;
}
/* Partial read of file from server */
size_t CtdlIPCPartialRead(CtdlIPC *ipc, void **buf, size_t offset, size_t bytes, char *cret)
{
- register size_t len = 0;
+ size_t len = 0;
char aaa[SIZ];
if (!buf) return 0;
/* CLOS */
int CtdlIPCEndDownload(CtdlIPC *ipc, char *cret)
{
- register int ret;
+ int ret;
if (!cret) return -2;
if (!ipc->downloading) return -2;
/* MSGP */
int CtdlIPCSpecifyPreferredFormats(CtdlIPC *ipc, char *cret, char *formats) {
- register int ret;
+ int ret;
char cmd[SIZ];
snprintf(cmd, sizeof cmd, "MSGP %s", formats);
(CtdlIPC*, unsigned long, unsigned long),
char *cret)
{
- register size_t len;
+ size_t len;
if (!cret) return -1;
if (!buf) return -1;
if (progress_gauge_callback)
progress_gauge_callback(ipc, len, bytes);
while (len < bytes) {
- register size_t block;
+ size_t block;
block = CtdlIPCPartialRead(ipc, buf, len, 4096, cret);
if (block == 0) {
(CtdlIPC*, unsigned long, unsigned long),
char *cret)
{
- register size_t len;
- register int calls; /* How many calls in the pipeline */
- register int i; /* iterator */
+ size_t len;
+ int calls; /* How many calls in the pipeline */
+ int i; /* iterator */
char aaa[4096];
if (!cret) return -1;
/* UCLS */
int CtdlIPCEndUpload(CtdlIPC *ipc, int discard, char *cret)
{
- register int ret;
+ int ret;
char cmd[8];
if (!cret) return -1;
(CtdlIPC*, unsigned long, unsigned long),
char *cret)
{
- register int ret = -1;
- register size_t offset = 0;
+ int ret = -1;
+ size_t offset = 0;
size_t bytes;
char aaa[SIZ];
char buf[4096];
progress_gauge_callback(ipc, 0, bytes);
while (offset < bytes) {
- register size_t to_write;
+ size_t to_write;
/* Read some data in */
to_write = fread(buf, 1, 4096, fd);
size_t *bytes_to_receive, char *proto_response)
{
char buf[SIZ];
- register int ret;
+ int ret;
if (!command) return -2;
if (!proto_response) return -2;
unsigned int march_flags2;
int march_access;
};
+
/*
- * User records.
+ * This is NOT the same 'struct ctdluser' from the server.
*/
typedef struct ctdluser ctdluser;
-struct ctdluser { /* User record */
- int version; /* Cit vers. which created this rec */
- uid_t uid; /* Associate with a unix account? */
- char password[32]; /* password */
- unsigned flags; /* See US_ flags below */
- long timescalled; /* Total number of logins */
- long posted; /* Number of messages ever submitted */
- uint8_t axlevel; /* Access level */
- long usernum; /* User number (never recycled) */
- time_t lastcall; /* Date/time of most recent login */
- int USuserpurge; /* Purge time (in days) for user */
- char fullname[64]; /* Display name (primary identifier) */
+struct ctdluser { // User record
+ int version; // Cit vers. which created this rec
+ uid_t uid; // Associate with a unix account?
+ char password[32]; // password
+ unsigned flags; // See US_ flags below
+ long timescalled; // Total number of logins
+ long posted; // Number of messages ever submitted
+ uint8_t axlevel; // Access level
+ long usernum; // User number (never recycled)
+ time_t lastcall; // Date/time of most recent login
+ int USuserpurge; // Purge time (in days) for user
+ char fullname[64]; // Display name (primary identifier)
+ char emailaddrs[512]; // Internet email addresses
};
+
typedef struct ctdlroom ctdlroom;
struct ctdlroom {
char QRname[ROOMNAMELEN]; /* Name of room */
int CtdlIPCChangeRoomname(CtdlIPC *ipc, const char *roomname, char *cret);
int CtdlIPCChangeUsername(CtdlIPC *ipc, const char *username, char *cret);
time_t CtdlIPCServerTime(CtdlIPC *ipc, char *crert);
-int CtdlIPCAideGetUserParameters(CtdlIPC *ipc, const char *who,
- struct ctdluser **uret, char *cret);
+int CtdlIPCAideGetUserParameters(CtdlIPC *ipc, const char *who, struct ctdluser **uret, char *cret);
+int CtdlIPCAideGetEmailAddresses(CtdlIPC *ipc, const char *who, char *, char *cret);
int CtdlIPCAideSetUserParameters(CtdlIPC *ipc, const struct ctdluser *uret, char *cret);
+int CtdlIPCAideSetEmailAddresses(CtdlIPC *ipc, const struct ctdluser *uret, char *cret);
int CtdlIPCRenameUser(CtdlIPC *ipc, char *oldname, char *newname, char *cret);
int CtdlIPCGetMessageExpirationPolicy(CtdlIPC *ipc, GPEXWhichPolicy which,
struct ExpirePolicy **policy, char *cret);
}
}
+/*
+ * Edit a user's Internet email addresses
+ */
+void edit_user_internet_email_addresses(CtdlIPC *ipc, char *who)
+{
+ char buf[256];
+ char *resp = NULL;
+ int num_recs = 0;
+ char **recs = NULL;
+ char ch;
+ int i, j;
+ int quitting = 0;
+ int modified = 0;
+ int r;
+ char emailaddrs[512];
+
+ r = CtdlIPCAideGetEmailAddresses(ipc, who, emailaddrs, buf);
+ if (r / 100 == 1) {
+ while (!IsEmptyStr(emailaddrs)) {
+ extract_token(buf, emailaddrs, 0, '\n', sizeof buf);
+ remove_token(emailaddrs, 0, '\n');
+
+ ++num_recs;
+ if (num_recs == 1) recs = malloc(sizeof(char *));
+ else recs = realloc(recs, (sizeof(char *)) * num_recs);
+ recs[num_recs-1] = malloc(strlen(buf) + 1);
+ strcpy(recs[num_recs-1], buf);
+ }
+ }
+
+ do {
+ scr_printf("\n");
+ color(BRIGHT_WHITE);
+ scr_printf(" Internet email addresses for %s\n", who);
+ color(DIM_WHITE);
+ scr_printf("--- --------------------------------------------------\n");
+ for (i=0; i<num_recs; ++i) {
+ color(DIM_WHITE);
+ scr_printf("%3d ", i+1);
+ color(BRIGHT_CYAN);
+ scr_printf("%s\n", recs[i]);
+ color(DIM_WHITE);
+ }
+
+ ch = keymenu("", "<A>dd|<D>elete|<S>ave|<Q>uit");
+ switch(ch) {
+ case 'a':
+ newprompt("Enter new email address: ", buf, 50);
+ striplt(buf);
+ if (!IsEmptyStr(buf)) {
+ // FIXME validate the email address (format, our own domain, addr does not belong to another user)
+ ++num_recs;
+ if (num_recs == 1) {
+ recs = malloc(sizeof(char *));
+ }
+ else {
+ recs = realloc(recs, (sizeof(char *)) * num_recs);
+ }
+ recs[num_recs-1] = strdup(buf);
+ }
+ modified = 1;
+ break;
+ case 'd':
+ i = intprompt("Delete which address", 1, 1, num_recs) - 1;
+ free(recs[i]);
+ --num_recs;
+ for (j=i; j<num_recs; ++j) {
+ recs[j] = recs[j+1];
+ }
+ modified = 1;
+ break;
+ case 's':
+ r = 1;
+ for (i = 0; i < num_recs; i++)
+ r += 1 + strlen(recs[i]);
+ resp = (char *)calloc(1, r);
+ if (!resp) {
+ scr_printf("Can't save config - out of memory!\n");
+ logoff(ipc, 1);
+ }
+ if (num_recs) for (i = 0; i < num_recs; i++) {
+ strcat(resp, recs[i]);
+ strcat(resp, "\n");
+ }
+
+ //r = CtdlIPCSetSystemConfigByType(ipc, INTERNETCFG, resp, buf);
+ //if (r / 100 != 4) {
+ //scr_printf("%s\n", buf);
+ //} else {
+ //scr_printf("Wrote %d records.\n", num_recs);
+ //modified = 0;
+ //}
+ scr_printf("<%s>\n", resp);
+
+
+
+ free(resp);
+ break;
+ case 'q':
+ quitting = !modified || boolprompt("Quit without saving", 0);
+ break;
+ default:
+ break;
+ }
+ } while (!quitting);
+
+ if (recs != NULL) {
+ for (i=0; i<num_recs; ++i) free(recs[i]);
+ free(recs);
+ }
+}
+
+
/*
* Edit or delete a user (cmd=25 to edit/create, 96 to delete)
*/
return;
}
- if (cmd == 25) {
- val_user(ipc, user->fullname, 0); /* Display registration */
+ if (cmd == 25) { // user edit
+
+ /* val_user(ipc, user->fullname, 0); we used to display the vCard here but there's really no need */
if (!newnow) {
change_name = 1;
}
user->axlevel = intprompt("Access level", user->axlevel, 0, 6);
- if (boolprompt("Permission to send Internet mail", (user->flags & US_INTERNET)))
+ if (boolprompt("Permission to send Internet mail", (user->flags & US_INTERNET))) {
user->flags |= US_INTERNET;
- else
+ }
+ else {
user->flags &= ~US_INTERNET;
- if (boolprompt("Ask user to register again", !(user->flags & US_REGIS)))
+ }
+ if (boolprompt("Ask user to register again", !(user->flags & US_REGIS))) {
user->flags &= ~US_REGIS;
- else
+ }
+ else {
user->flags |= US_REGIS;
- user->timescalled = intprompt("Times called",
- user->timescalled, 0, INT_MAX);
- user->posted = intprompt("Messages posted",
- user->posted, 0, INT_MAX);
- user->lastcall = boolprompt("Set last call to now", 0) ?
- time(NULL) : user->lastcall;
- user->USuserpurge = intprompt("Purge time (in days, 0 for system default",
- user->USuserpurge, 0, INT_MAX);
+ }
+ user->timescalled = intprompt("Times called", user->timescalled, 0, INT_MAX);
+ user->posted = intprompt("Messages posted", user->posted, 0, INT_MAX);
+ user->lastcall = boolprompt("Set last login to now", 0) ? time(NULL) : user->lastcall;
+ user->USuserpurge = intprompt("Purge time (in days, 0 for system default", user->USuserpurge, 0, INT_MAX);
}
if (cmd == 96) {
scr_printf("%s\n", buf);
}
free(user);
+
+ if (boolprompt("Edit this user's Internet email addresses", 0)) {
+ edit_user_internet_email_addresses(ipc, who);
+ }
+
}