blacklist.c

Go to the documentation of this file.
00001 /* blacklist.c  --  eurephiadm blacklist command:
00002  *                  Show/edit blacklist
00003  *
00004  *  GPLv2 only - Copyright (C) 2009 - 2010
00005  *               David Sommerseth <dazo@users.sourceforge.net>
00006  *
00007  *  This program is free software; you can redistribute it and/or
00008  *  modify it under the terms of the GNU General Public License
00009  *  as published by the Free Software Foundation; version 2
00010  *  of the License.
00011  *
00012  *  This program is distributed in the hope that it will be useful,
00013  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015  *  GNU General Public License for more details.
00016  *
00017  *  You should have received a copy of the GNU General Public License
00018  *  along with this program; if not, write to the Free Software
00019  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
00020  *
00021  */
00022 
00032 #include <stdio.h>
00033 #include <string.h>
00034 #include <assert.h>
00035 
00036 #ifdef HAVE_LIBXML2
00037 #include <libxml/tree.h>
00038 #endif
00039 
00040 #define MODULE "eurephia::Blacklist" 
00041 #include <eurephia_nullsafe.h>
00042 #include <eurephia_context.h>
00043 #include <eurephia_log.h>
00044 #include <eurephia_xml.h>
00045 #include <eurephia_values_struct.h>
00046 #include <eurephiadb_session_struct.h>
00047 #include <eurephiadb_mapping.h>
00048 #include <eurephiadb_driver.h>
00049 #include <eurephia_values.h>
00050 
00051 #include "../argparser.h"
00052 #include "../xsltparser.h"
00053 
00054 
00060 void display_blacklist_help(int page)
00061 {
00062         switch( page ) {
00063         case 'l':
00064                 printf("The blacklist list mode will show registered entries in the blacklist.\n"
00065                        "\n"
00066                        "     -v | --verbose               Show more details\n"
00067                        "\n"
00068                        "Filters:\n"
00069                        "     -u | --username <username>   User name\n"
00070                        "     -d | --digest <SHA1 digest>  Certificate SHA1 digest\n"
00071                        "     -i | --ipaddr <ip address>   IP address\n\n");
00072                 break;
00073 
00074         case 'D':
00075                 printf("The blacklist delete mode will remove a blacklisted entry.\n"
00076                        "\n"
00077                        "One of the following parameters must be given (only one):\n"
00078                        "     -u | --username <username>   User name\n"
00079                        "     -d | --digest <SHA1 digest>  Certificate SHA1 digest\n"
00080                        "     -i | --ipaddr <ip address>   IP address\n"
00081                        "     -b | --blid <ID>             Blacklist record ID\n"
00082                        "\n"
00083                        );
00084                 break;
00085 
00086         case 'A':
00087                 printf("The blacklist add mode will register a new entry to be blacklisted.\n"
00088                        "\n"
00089                        "One of the following parameters must be given (only one):\n"
00090                        "     -u | --username <username>   User name\n"
00091                        "     -d | --digest <SHA1 digest>  Certificate SHA1 digest\n"
00092                        "     -i | --ipaddr <ip address>   IP address\n"
00093                        "\n"
00094                        );
00095                 break;
00096 
00097         default:
00098                 printf("Available modes for the blacklist command are:\n\n"
00099                        "     -l | --list         List all entries on theblacklist\n"
00100                        "     -A | --add          Add an entry to the blacklist\n"
00101                        "     -D | --delete       Delete an entry from the blacklist\n"
00102                        "     -h | --help <mode>  Show help\n\n");
00103                 break;
00104         }
00105 }
00106 
00107 
00111 void help_Blacklist()
00112 {
00113         display_blacklist_help(0);
00114 }
00115 
00116 
00128 int help_Blacklist2(eurephiaCTX *ctx, eurephiaSESSION *sess, eurephiaVALUES *cfg, int argc, char **argv)
00129 {
00130         e_options modeargs[] = {
00131                 {"--list", "-l", 0},
00132                 {"--add", "-A", 0},
00133                 {"--delete", "-D", 0},
00134                 {NULL, NULL, 0}
00135         };
00136         int i = 1;
00137         display_blacklist_help(eurephia_getopt(&i, argc, argv, modeargs));
00138         return 0;
00139 }
00140 
00141 
00153 int list_blacklist(eurephiaCTX *ctx, eurephiaSESSION *sess, eurephiaVALUES *cfg, int argc, char **argv)
00154 {
00155         xmlDoc *blst_xml = NULL, *srch_xml = NULL;
00156         xmlNode *fmap_n = NULL, *srch_n = NULL;
00157         char *xsltparams[] = {"view", "'list'", NULL};
00158         int i = 0;
00159 
00160         e_options modeargs[] = {
00161                 {"--verbose", "-v", 0},
00162                 {"--help", "-h", 0},
00163                 {"--username", "-u", 1},
00164                 {"--digest", "-d", 1},
00165                 {"--ipaddr", "-i", 1},
00166                 {NULL, NULL, 0}
00167         };
00168 
00169         eurephiaXML_CreateDoc(ctx, 1, "blacklist", &srch_xml, &srch_n);
00170         xmlNewProp(srch_n, (xmlChar *) "mode", (xmlChar *) "list");
00171 
00172         fmap_n = xmlNewChild(srch_n, NULL, (xmlChar *) "fieldMapping", NULL);
00173         xmlNewProp(fmap_n, (xmlChar *) "table", (xmlChar *) "blacklist");
00174 
00175         for( i = 1; i < argc; i++ ) {
00176                 switch( eurephia_getopt(&i, argc, argv, modeargs) ) {
00177                 case 'v':
00178                         xsltparams[1] = "'details'";
00179                         break;
00180 
00181                 case 'u':
00182                         xmlNewChild(fmap_n, NULL, (xmlChar *) "username", (xmlChar *) optargs[0]);
00183                         break;
00184 
00185                 case 'd':
00186                         xmlNewChild(fmap_n, NULL, (xmlChar *) "digest", (xmlChar *) optargs[0]);
00187                         break;
00188 
00189                 case 'i':
00190                         xmlNewChild(fmap_n, NULL, (xmlChar *) "ip", (xmlChar *) optargs[0]);
00191                         break;
00192 
00193                 case 'h':
00194                         display_blacklist_help('l');
00195                         return 0;
00196 
00197                 default:
00198                         return 1;
00199                 }
00200         }
00201 
00202         blst_xml = eDBadminBlacklist(ctx, srch_xml);
00203         xmlFreeDoc(srch_xml);
00204         if( blst_xml == NULL ) {
00205                 fprintf(stderr, "%s: Error retrieving the blacklist.\n", MODULE);
00206                 return 1;
00207         }
00208         xslt_print_xmldoc(stdout, cfg, blst_xml, "blacklist.xsl", (const char **) xsltparams);
00209         xmlFreeDoc(blst_xml);
00210         return 0;
00211 }
00212 
00213 
00225 int modify_blacklist(eurephiaCTX *ctx, eurephiaSESSION *sess, eurephiaVALUES *cfg, int argc, char **argv)
00226 {
00227         xmlDoc *result_xml = NULL, *upd_xml = NULL;
00228         xmlNode *fmap_n = NULL, *upd_n = NULL;
00229         eurephiaRESULT *res = NULL;
00230         int i = 0, rc = 1, mode = 0;
00231 
00232         e_options modeargs[] = {
00233                 {"--help", "-h", 0},
00234                 {"--username", "-u", 1},
00235                 {"--digest", "-d", 1},
00236                 {"--ipaddr", "-i", 1},
00237                 {"--blid", "-b", 1},
00238                 {NULL, NULL, 0}
00239         };
00240 
00241         eurephiaXML_CreateDoc(ctx, 1, "blacklist", &upd_xml, &upd_n);
00242         if( (strcmp(argv[0], "--add") == 0) || (strcmp(argv[0], "-A") == 0) ) {
00243                 xmlNewProp(upd_n, (xmlChar *) "mode", (xmlChar *) "add");
00244                 mode = 'A';
00245         } else if( (strcmp(argv[0], "--delete") == 0) || (strcmp(argv[0], "-D") == 0) ) {
00246                 xmlNewProp(upd_n, (xmlChar *) "mode", (xmlChar *) "delete");
00247                 mode = 'D';
00248         } else {
00249                 fprintf(stderr, "%s: Invalid mode\n", MODULE);
00250                 xmlFreeDoc(upd_xml);
00251                 return 1;
00252         }
00253 
00254         fmap_n = xmlNewChild(upd_n, NULL, (xmlChar *) "fieldMapping", NULL);
00255         xmlNewProp(fmap_n, (xmlChar *) "table", (xmlChar *) "blacklist");
00256 
00257         for( i = 1; i < argc; i++ ) {
00258                 switch( eurephia_getopt(&i, argc, argv, modeargs) ) {
00259                 case 'u':
00260                         xmlNewChild(fmap_n, NULL, (xmlChar *) "username", (xmlChar *) optargs[0]);
00261                         break;
00262 
00263                 case 'd':
00264                         xmlNewChild(fmap_n, NULL, (xmlChar *) "digest", (xmlChar *) optargs[0]);
00265                         break;
00266 
00267                 case 'i':
00268                         xmlNewChild(fmap_n, NULL, (xmlChar *) "ip", (xmlChar *) optargs[0]);
00269                         break;
00270 
00271                 case 'b':
00272                         xmlNewChild(fmap_n, NULL, (xmlChar *) "id", (xmlChar *) optargs[0]);
00273                         break;
00274 
00275                 case 'h':
00276                         display_blacklist_help(mode);
00277                         return 0;
00278 
00279                 default:
00280                         return 1;
00281                 }
00282         }
00283 
00284         result_xml = eDBadminBlacklist(ctx, upd_xml);
00285         xmlFreeDoc(upd_xml);
00286         if( result_xml == NULL ) {
00287                 fprintf(stderr, "%s: Could not modify the blacklist\n", MODULE);
00288                 return 1;
00289         }
00290 
00291         res = eurephiaXML_ParseResultMsg(ctx, result_xml);
00292         if( res == NULL ) {
00293                 fprintf(stderr, "%s: Error updating the blacklist. No results returned.\n", MODULE);
00294                 return 1;
00295 
00296         }
00297 
00298         if( res->resultType == exmlERROR ) {
00299                 fprintf(stderr, "%s: %s\n", MODULE, res->message);
00300                 rc = 1;
00301         } else {
00302                 fprintf(stdout, "%s: %s\n", MODULE, res->message);
00303                 rc = 0;
00304         }
00305         free_nullsafe(ctx, res);
00306         xmlFreeDoc(result_xml);
00307 
00308         return rc;
00309 }
00310 
00311 
00323 int cmd_Blacklist(eurephiaCTX *ctx, eurephiaSESSION *sess, eurephiaVALUES *cfg, int argc, char **argv)
00324 {
00325         char **mode_argv;
00326         int rc = 0, i = 0, mode_argc = 0;
00327         e_options cmdargs[] = {
00328                 {"--list", "-l", 0},
00329                 {"--add", "-A", 0},
00330                 {"--delete", "-D", 0},
00331                 {"--help", "-h", 0},
00332                 {NULL, NULL, 0}
00333         };
00334         int (*mode_fnc) (eurephiaCTX *ctx, eurephiaSESSION *sess, eurephiaVALUES *cfg, int argc, char **argv);
00335 
00336         assert((ctx != NULL) && (ctx->dbc != NULL));
00337 
00338         mode_fnc = NULL;
00339         for( i = 1; i < argc; i++ ) {
00340                 switch( eurephia_getopt(&i, argc, argv, cmdargs) ) {
00341                 case 'l':
00342                         mode_fnc = list_blacklist;
00343                         break;
00344 
00345                 case 'A':
00346                 case 'D':
00347                         mode_fnc = modify_blacklist;
00348                         break;
00349 
00350                 case 'h':
00351                         mode_fnc = help_Blacklist2;
00352 
00353                 default:
00354                         break;
00355                 }
00356                 if( mode_fnc != NULL ) {
00357                         break;
00358                 }
00359         }
00360 
00361         // If we do not have any known mode defined, exit with error
00362         if( mode_fnc == NULL )  {
00363                 fprintf(stderr, "%s: Unknown argument.  No mode given\n", MODULE);
00364                 return 1;
00365         }
00366 
00367         // Allocate memory for our arguments being sent to the mode function
00368         mode_argv = (char **) calloc(sizeof(char *), (argc - i)+2);
00369         assert(mode_argv != NULL);
00370 
00371         // Copy over only the arguments needed for the mode
00372         mode_argc = eurephia_arraycp(i, argc, argv, mode_argv, (argc - i));
00373 
00374         // Call the mode function
00375         rc = mode_fnc(ctx, sess, cfg, mode_argc, mode_argv);
00376         free_nullsafe(ctx, mode_argv);
00377 
00378         return rc;
00379 
00380 }
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines