00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
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
00362 if( mode_fnc == NULL ) {
00363 fprintf(stderr, "%s: Unknown argument. No mode given\n", MODULE);
00364 return 1;
00365 }
00366
00367
00368 mode_argv = (char **) calloc(sizeof(char *), (argc - i)+2);
00369 assert(mode_argv != NULL);
00370
00371
00372 mode_argc = eurephia_arraycp(i, argc, argv, mode_argv, (argc - i));
00373
00374
00375 rc = mode_fnc(ctx, sess, cfg, mode_argc, mode_argv);
00376 free_nullsafe(ctx, mode_argv);
00377
00378 return rc;
00379
00380 }