/* Copyright (C) 2003 Aaron Stone This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* $Id: sievecmd.c 1712 2005-03-26 20:23:18Z aaron $ * This is dbmail-sievecmd, which provides * a command line interface to the sievescripts */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "sievecmd.h" #include "auth.h" #include #include #include #include "dbmail.h" #include "list.h" #include "debug.h" #include "db.h" #include #include #include #include "dm_getopt.h" #ifdef HAVE_CRYPT_H #include #endif #include "dbmd5.h" char *configFile = DEFAULT_CONFIG_FILE; /* set up database login data */ extern db_param_t _db_params; int main(int argc, char *argv[]) { struct list sysItems; int res = 0, opt = 0, act = 0; u64_t user_idnr = 0; char *user_name = NULL; char *name = NULL; FILE *source = NULL; extern char *dm_optarg; openlog(PNAME, LOG_PID, LOG_MAIL); setvbuf(stdout, 0, _IONBF, 0); ReadConfig("DBMAIL", configFile, &sysItems); SetTraceLevel(&sysItems); GetDBParams(&_db_params, &sysItems); configure_debug(TRACE_ERROR, 1, 0); while (opt != -1 && act != 'h') { opt = dm_getopt(argc, argv, "a:d:i:r:u:l"); switch (opt) { case -1: /* Break right away if this is the end of the args */ break; case 'a': case 'd': case 'i': case 'r': if (act != 0) act = 'h'; else act = opt; name = dm_optarg; source = stdin; // FIXME to take files as input, too break; case 'u': user_name = dm_strdup(dm_optarg); break; case 'l': if (act != 0) act = 'h'; else act = opt; break; default: act = 'h'; break; } } if (act != 'h' && act != 0) { printf("*** dbmail-sievecmd ***\n"); /* Open database connection */ printf("Opening connection to database...\n"); if (db_connect() != 0) { printf ("Failed. Could not connect to database (check log)\n"); return -1; } if (db_check_version() != 0) { printf ("Failed. Version error. Please upgrade your database\n"); return -1; } /* Open authentication connection */ printf("Opening connection to authentication...\n"); if (auth_connect() != 0) { printf ("Failed. Could not connect to authentication (check log)\n"); return -1; } printf("Ok. Connected!\n"); /* Retrieve the user ID number */ switch (auth_user_exists(user_name, &user_idnr)) { case 0: printf("User [%s] does not exist!\n", user_name); break; case -1: printf("Error retrieving User ID Number\n"); res = -1; goto mainend; } } switch (act) { case 'a': res = do_activate(user_idnr, name); break; case 'd': res = do_deactivate(user_idnr, name); break; case 'i': res = do_insert(user_idnr, name, source); break; case 'r': res = do_remove(user_idnr, name); break; case 'l': res = do_list(user_idnr); break; case 'h': default: res = do_showhelp(); break; } mainend: dm_free(user_name); db_disconnect(); auth_disconnect(); return res; } int do_activate(u64_t user_idnr, char *name) { int res = 0; res = db_activate_sievescript(user_idnr, name); if (res == -3) { printf("Script [%s] does not exist.\n", name); return -1; } else if (res != 0) { printf("Error activating script [%s].\n" "It is possible that no script is currently active!\n", name); return -1; } printf("Script [%s] is now active. All others are inactive.\n", name); return 0; } int do_deactivate(u64_t user_idnr, char *name) { int res = 0; res = db_deactivate_sievescript(user_idnr, name); if (res == -3) { printf("Script [%s] does not exist.\n", name); return -1; } else if (res != 0) { printf("Error deactivating script [%s].\n", name); return -1; } printf ("Script [%s] is now deactivated. No scripts are currently active.\n", name); return 0; } int do_insert(u64_t user_idnr, char *name, FILE * source) { int res = 0; char *buf = NULL; char *errmsg = NULL; /* Read the file into a char array */ res = read_script_file(source, &buf); if (res != 0) { printf("Error reading in your script!\n"); return -1; } /* Check if the script is valid */ res = my_sieve_script_validate(buf, &errmsg); if (res != 0) { printf("Script has errors: [%s].\n", name, errmsg); return -1; } /* Make the DB call to store the script */ res = db_add_sievescript(user_idnr, name, buf); if (res == -3) { printf("Script [%s] already exists.\n", name); return -1; } else if (res != 0) { printf("Error inserting script [%s] into the database!\n", name); return -1; } printf("Script [%s] successfully inserted and marked inactive!\n", name); return 0; } int do_remove(u64_t user_idnr, char *name) { int res; res = db_delete_sievescript(user_idnr, name); if (res == -3) { printf("Script [%s] does not exist.\n", name); return -1; } else if (res != 0) { printf("Error deleting script [%s].\n", name); return -1; } printf("Script [%s] deleted.\n", name); return 0; } int do_list(u64_t user_idnr) { struct list scriptlist; struct element *tmp; if (db_get_sievescript_listall(user_idnr, &scriptlist) < 0) { printf("Error retrieving Sieve script list.\n"); return -1; } if (list_totalnodes(&scriptlist) > 0) printf("Found %ld scripts:\n", list_totalnodes(&scriptlist)); else printf("No scripts found!\n"); tmp = list_getstart(&scriptlist); while (tmp) { struct ssinfo *info = (struct ssinfo *) tmp->data; if (info->active == 1) printf(" + "); else printf(" - "); printf("%s\n", info->name); tmp = tmp->nextnode; } if (scriptlist.start) list_freelist(&scriptlist.start); return 0; } int do_showhelp() { printf("*** dbmail-sievecmd ***\n"); printf("Use this program to manage your users' Sieve scripts.\n"); printf("See the man page for more info. Summary:\n\n"); printf(" -u username Username of script user \n"); printf (" -l List scripts belonging to user \n"); printf(" -a scriptname Activate the named script \n"); printf (" (only one script can be active; \n" " deactivates any others) \n"); printf (" -d scriptname Deactivate the named script \n"); printf (" (no scripts will be active after this) \n"); printf (" -i scriptname file Insert the named script from file \n"); printf (" (a single dash, -, indicates input \n" " from STDIN) \n"); printf(" -r scriptname Remove the named script \n"); printf (" (if script was active, no script is \n" " active after deletion) \n"); return 0; } int read_script_file(FILE * f, char **m_buf) { size_t f_len = 0; size_t f_pos = 0; char *tmp_buf = NULL; char *f_buf = NULL; if (!f) { printf("Received NULL as script input\n"); return -1; } while (!feof(f)) { if (f_pos + 1 >= f_len) { tmp_buf = dm_realloc(f_buf, sizeof(char) * (f_len += 200)); if (tmp_buf != NULL) f_buf = tmp_buf; else return -2; } f_buf[f_pos] = fgetc(f); f_pos++; } if (f_pos) f_buf[f_pos] = '\0'; /* Since f_buf is either NULL or valid, we're golden */ *m_buf = f_buf; return 0; }