hs_request.c

Go to the documentation of this file.
00001 /* hs_request.c - Add request and activate functionality to HostServ,
00002  *                along with adding +req as optional param to HostServ list.
00003  *
00004  * (C) 2003-2013 Anope Team
00005  * Contact us at team@anope.org
00006  *
00007  * Based on the original module by Rob <rob@anope.org>
00008  * Included in the Anope module pack since Anope 1.7.11
00009  * Anope Coder: GeniusDex <geniusdex@anope.org>
00010  *
00011  * Please read COPYING and README for further details.
00012  *
00013  * Send bug reports to the Anope Coder instead of the module
00014  * author, because any changes since the inclusion into anope
00015  * are not supported by the original author.
00016  */
00017 
00018 #include "module.h"
00019 
00020 #define AUTHOR "Rob"
00021 #define VERSION VERSION_STRING
00022 
00023 /* Configuration variables */
00024 static int HSRequestMemoUser = 0;
00025 static int HSRequestMemoOper = 0;
00026 static int HSRequestMemoSetters = 0;
00027 char *HSRequestDBName = NULL;
00028 
00029 #define HSREQ_DEFAULT_DBNAME "hs_request.db"
00030 
00031 /* Language defines */
00032 #define LNG_NUM_STRINGS 21
00033 
00034 #define LNG_REQUEST_SYNTAX              0
00035 #define LNG_REQUESTED                   1
00036 #define LNG_REQUEST_WAIT                2
00037 #define LNG_REQUEST_MEMO                3
00038 #define LNG_ACTIVATE_SYNTAX             4
00039 #define LNG_ACTIVATED                   5
00040 #define LNG_ACTIVATE_MEMO               6
00041 #define LNG_REJECT_SYNTAX               7
00042 #define LNG_REJECTED                    8
00043 #define LNG_REJECT_MEMO                 9
00044 #define LNG_REJECT_MEMO_REASON  10
00045 #define LNG_NO_REQUEST                  11
00046 #define LNG_HELP                                12
00047 #define LNG_HELP_SETTER                 13
00048 #define LNG_HELP_REQUEST                14
00049 #define LNG_HELP_ACTIVATE               15
00050 #define LNG_HELP_ACTIVATE_MEMO  16
00051 #define LNG_HELP_REJECT                 17
00052 #define LNG_HELP_REJECT_MEMO    18
00053 #define LNG_WAITING_SYNTAX              19
00054 #define LNG_HELP_WAITING                20
00055 
00056 static int hs_do_request(User * u);
00057 static int hs_do_activate(User * u);
00058 static int hs_do_reject(User * u);
00059 static int hs_do_list_out(User * u);
00060 
00061 static int hs_help_request(User * u);
00062 static int hs_help_activate(User * u);
00063 static int hs_help_reject(User * u);
00064 static int hs_help_waiting(User * u);
00065 static void hs_help(User * u);
00066 
00067 static void my_add_host_request(char *nick, char *vIdent, char *vhost,
00068                          char *creator, int32 tmp_time);
00069 static int my_isvalidchar(const char c);
00070 static void my_memo_lang(User * u, char *name, int z, char *source, int number, ...);
00071 static void req_send_memos(User * u, char *vHost);
00072 static void show_list(User * u);
00073 static int hs_do_waiting(User * u);
00074 static int hsreqevt_nick_dropped(int argc, char **argv);
00075 
00076 static void hsreq_save_db(void);
00077 static void hsreq_load_db(void);
00078 static int hsreqevt_db_saving(int argc, char **argv);
00079 static int hsreqevt_db_backup(int argc, char **argv);
00080 
00081 static void my_load_config(void);
00082 static void my_add_languages(void);
00083 
00084 HostCore *hs_request_head;
00085 
00086 int AnopeInit(int argc, char **argv)
00087 {
00088     Command *c;
00089     EvtHook *hook;
00090 
00091     c = createCommand("request", hs_do_request, nick_identified, -1, -1,
00092                       -1, -1, -1);
00093     moduleAddHelp(c, hs_help_request);
00094     moduleAddCommand(HOSTSERV, c, MOD_HEAD);
00095 
00096     c = createCommand("activate", hs_do_activate, is_host_setter, -1, -1,
00097                       -1, -1, -1);
00098     moduleAddHelp(c, hs_help_activate);
00099     moduleAddCommand(HOSTSERV, c, MOD_HEAD);
00100 
00101     c = createCommand("reject", hs_do_reject, is_host_setter, -1, -1, -1,
00102                       -1, -1);
00103     moduleAddHelp(c, hs_help_reject);
00104     moduleAddCommand(HOSTSERV, c, MOD_HEAD);
00105 
00106     c = createCommand("waiting", hs_do_waiting, is_host_setter, -1, -1, -1,
00107                       -1, -1);
00108     moduleAddHelp(c, hs_help_waiting);
00109     moduleAddCommand(HOSTSERV, c, MOD_HEAD);
00110 
00111     c = createCommand("list", hs_do_list_out, is_services_oper, -1, -1, -1,
00112                       -1, -1);
00113     moduleAddCommand(HOSTSERV, c, MOD_HEAD);
00114 
00115     hook = createEventHook(EVENT_NICK_DROPPED, hsreqevt_nick_dropped);
00116     moduleAddEventHook(hook);
00117 
00118     hook = createEventHook(EVENT_NICK_EXPIRE, hsreqevt_nick_dropped);
00119     moduleAddEventHook(hook);
00120 
00121     hook = createEventHook(EVENT_DB_SAVING, hsreqevt_db_saving);
00122     moduleAddEventHook(hook);
00123 
00124     hook = createEventHook(EVENT_DB_BACKUP, hsreqevt_db_backup);
00125     moduleAddEventHook(hook);
00126 
00127     moduleSetHostHelp(hs_help);
00128     moduleAddAuthor(AUTHOR);
00129     moduleAddVersion(VERSION);
00130     moduleSetType(SUPPORTED);
00131 
00132     my_load_config();
00133     my_add_languages();
00134     hs_request_head = NULL;
00135 
00136     if (debug)
00137         alog("[hs_request] Loading database...");
00138     hsreq_load_db();
00139     alog("hs_request loaded");
00140     return MOD_CONT;
00141 }
00142 
00143 void AnopeFini(void)
00144 {
00145     if (debug)
00146         alog("[hs_request] Saving database...");
00147     hsreq_save_db();
00148 
00149     /* Clean up all open host requests */
00150     while (hs_request_head)
00151         hs_request_head = deleteHostCore(hs_request_head, NULL);
00152 
00153     free(HSRequestDBName);
00154     alog("hs_request un-loaded");
00155 }
00156 
00157 static int hs_do_request(User * u)
00158 {
00159     char *cur_buffer;
00160     char *nick;
00161     char *rawhostmask;
00162     char hostmask[HOSTMAX];
00163     NickAlias *na;
00164     int32 tmp_time;
00165     char *s;
00166     char *vIdent = NULL;
00167     time_t now = time(NULL);
00168 
00169     cur_buffer = moduleGetLastBuffer();
00170     nick = u->nick;
00171     rawhostmask = myStrGetToken(cur_buffer, ' ', 0);
00172 
00173     if (!nick || !rawhostmask) {
00174         if (rawhostmask)
00175             free(rawhostmask);
00176         moduleNoticeLang(s_HostServ, u, LNG_REQUEST_SYNTAX);
00177         return MOD_CONT;
00178     }
00179 
00180     vIdent = myStrGetOnlyToken(rawhostmask, '@', 0);    /* Get the first substring, @ as delimiter */
00181     if (vIdent) {
00182         rawhostmask = myStrGetTokenRemainder(rawhostmask, '@', 1);      /* get the remaining string */
00183         if (!rawhostmask) {
00184             moduleNoticeLang(s_HostServ, u, LNG_REQUEST_SYNTAX);
00185             free(vIdent);
00186             return MOD_CONT;
00187         }
00188         if (strlen(vIdent) > USERMAX - 1) {
00189             notice_lang(s_HostServ, u, HOST_SET_IDENTTOOLONG, USERMAX);
00190             free(vIdent);
00191             free(rawhostmask);
00192             return MOD_CONT;
00193         } else {
00194             for (s = vIdent; *s; s++) {
00195                 if (!my_isvalidchar(*s)) {
00196                     notice_lang(s_HostServ, u, HOST_SET_IDENT_ERROR);
00197                     free(vIdent);
00198                     free(rawhostmask);
00199                     return MOD_CONT;
00200                 }
00201             }
00202         }
00203         if (!ircd->vident) {
00204             notice_lang(s_HostServ, u, HOST_NO_VIDENT);
00205             free(vIdent);
00206             free(rawhostmask);
00207             return MOD_CONT;
00208         }
00209     }
00210     if (strlen(rawhostmask) < HOSTMAX) {
00211         snprintf(hostmask, HOSTMAX, "%s", rawhostmask);
00212     } else {
00213         notice_lang(s_HostServ, u, HOST_SET_TOOLONG, HOSTMAX);
00214         if (vIdent)
00215             free(vIdent);
00216         free(rawhostmask);
00217         return MOD_CONT;
00218     }
00219 
00220     if (!isValidHost(hostmask, 3)) {
00221         notice_lang(s_HostServ, u, HOST_SET_ERROR);
00222         if (vIdent)
00223             free(vIdent);
00224         free(rawhostmask);
00225         return MOD_CONT;
00226     }
00227 
00228     tmp_time = time(NULL);
00229     if ((na = findnick(nick))) {
00230         if (HSRequestMemoOper || HSRequestMemoSetters) {
00231             if (MSSendDelay > 0 && u
00232                 && u->lastmemosend + MSSendDelay > now) {
00233                 moduleNoticeLang(s_HostServ, u, LNG_REQUEST_WAIT,
00234                                  MSSendDelay);
00235                 u->lastmemosend = now;
00236                 if (vIdent)
00237                     free(vIdent);
00238                 free(rawhostmask);
00239                 return MOD_CONT;
00240             }
00241         }
00242         my_add_host_request(nick, vIdent, hostmask, u->nick, tmp_time);
00243 
00244         moduleNoticeLang(s_HostServ, u, LNG_REQUESTED);
00245         req_send_memos(u, hostmask);
00246         alog("New vHost Requested by %s", nick);
00247     } else {
00248         notice_lang(s_HostServ, u, HOST_NOREG, nick);
00249     }
00250 
00251     if (vIdent)
00252         free(vIdent);
00253     free(rawhostmask);
00254 
00255     return MOD_CONT;
00256 }
00257 
00258 static void my_memo_lang(User * u, char *name, int z, char *source, int number, ...)
00259 {
00260     va_list va;
00261     char buffer[4096], outbuf[4096];
00262     char *fmt = NULL;
00263     int lang = LANG_EN_US;
00264     char *s, *t, *buf;
00265     User *u2;
00266 
00267     if ((mod_current_module_name)
00268         && (!mod_current_module
00269             || strcmp(mod_current_module_name, mod_current_module->name)))
00270         mod_current_module = findModule(mod_current_module_name);
00271 
00272     u2 = finduser(name);
00273     /* Find the users lang, and use it if we cant */
00274     if (u2 && u2->na && u2->na->nc)
00275         lang = u2->na->nc->language;
00276 
00277     /* If the users lang isnt supported, drop back to enlgish */
00278     if (mod_current_module->lang[lang].argc == 0)
00279         lang = LANG_EN_US;
00280 
00281     /* If the requested lang string exists for the language */
00282     if (mod_current_module->lang[lang].argc > number) {
00283         fmt = mod_current_module->lang[lang].argv[number];
00284 
00285         buf = sstrdup(fmt);
00286         s = buf;
00287         while (*s) {
00288             t = s;
00289             s += strcspn(s, "\n");
00290             if (*s)
00291                 *s++ = '\0';
00292             strscpy(outbuf, t, sizeof(outbuf));
00293 
00294             va_start(va, number);
00295             vsnprintf(buffer, 4095, outbuf, va);
00296             va_end(va);
00297             if (source)
00298                 memo_send_from(u, name, buffer, z, source);
00299             else
00300                 memo_send(u, name, buffer, z);
00301         }
00302         free(buf);
00303     } else {
00304         alog("%s: INVALID language string call, language: [%d], String [%d]", mod_current_module->name, lang, number);
00305     }
00306 }
00307 
00308 
00309 static void req_send_memos(User * u, char *vHost)
00310 {
00311     int i;
00312     int z = 2;
00313 
00314     if (checkDefCon(DEFCON_NO_NEW_MEMOS))
00315         return;
00316 
00317     if (HSRequestMemoOper == 1) {
00318         for (i = 0; i < servopers.count; i++) {
00319             my_memo_lang(u, (((NickCore *) servopers.list[i])->display), z,
00320                          u->na->nick, LNG_REQUEST_MEMO, vHost);
00321         }
00322         for (i = 0; i < servadmins.count; i++) {
00323             my_memo_lang(u, (((NickCore *) servadmins.list[i])->display),
00324                          z, u->na->nick, LNG_REQUEST_MEMO, vHost);
00325         }
00326         for (i = 0; i < RootNumber; i++) {
00327             my_memo_lang(u, ServicesRoots[i], z, u->na->nick, LNG_REQUEST_MEMO, vHost);
00328         }
00329     }
00330     if (HSRequestMemoSetters == 1) {
00331         for (i = 0; i < HostNumber; i++) {
00332             my_memo_lang(u, HostSetters[i], z, u->na->nick, LNG_REQUEST_MEMO, vHost);
00333         }
00334     }
00335 }
00336 
00337 static int hsreqevt_nick_dropped(int argc, char **argv)
00338 {
00339     HostCore *tmp;
00340     boolean found = false;
00341 
00342     if (!argc)
00343         return MOD_CONT;
00344 
00345     tmp = findHostCore(hs_request_head, argv[0], &found);
00346     if (found)
00347         hs_request_head = deleteHostCore(hs_request_head, tmp);
00348 
00349     return MOD_CONT;
00350 }
00351 
00352 static int hs_do_reject(User * u)
00353 {
00354     char *cur_buffer;
00355     char *nick;
00356     char *reason;
00357     HostCore *tmp, *hc;
00358     boolean found = false;
00359 
00360     cur_buffer = moduleGetLastBuffer();
00361     nick = myStrGetToken(cur_buffer, ' ', 0);
00362     reason = myStrGetTokenRemainder(cur_buffer, ' ', 1);
00363 
00364     if (!nick) {
00365         moduleNoticeLang(s_HostServ, u, LNG_REJECT_SYNTAX);
00366         if (reason)
00367             free(reason);
00368         return MOD_CONT;
00369     }
00370 
00371     tmp = findHostCore(hs_request_head, nick, &found);
00372     if (found) {
00373         if (!tmp)
00374             hc = hs_request_head;
00375         else
00376             hc = tmp->next;
00377 
00378         if (HSRequestMemoUser) {
00379             if (reason)
00380                 my_memo_lang(u, hc->nick, 2, NULL, LNG_REJECT_MEMO_REASON,
00381                              reason);
00382             else
00383                 my_memo_lang(u, hc->nick, 2, NULL, LNG_REJECT_MEMO);
00384         }
00385 
00386         hs_request_head = deleteHostCore(hs_request_head, tmp);
00387         moduleNoticeLang(s_HostServ, u, LNG_REJECTED, nick);
00388         alog("Host Request for %s rejected by %s (%s)", nick, u->nick,
00389              reason ? reason : "");
00390     } else {
00391         moduleNoticeLang(s_HostServ, u, LNG_NO_REQUEST, nick);
00392     }
00393 
00394     free(nick);
00395     if (reason)
00396         free(reason);
00397 
00398     return MOD_CONT;
00399 }
00400 
00401 static int hs_do_activate(User * u)
00402 {
00403     char *cur_buffer;
00404     char *nick;
00405     NickAlias *na;
00406     HostCore *tmp, *hc;
00407     boolean found = false;
00408 
00409     cur_buffer = moduleGetLastBuffer();
00410     nick = myStrGetToken(cur_buffer, ' ', 0);
00411 
00412     if (!nick) {
00413         moduleNoticeLang(s_HostServ, u, LNG_ACTIVATE_SYNTAX);
00414         return MOD_CONT;
00415     }
00416 
00417     if ((na = findnick(nick))) {
00418         tmp = findHostCore(hs_request_head, nick, &found);
00419         if (found) {
00420             if (!tmp)
00421                 hc = hs_request_head;
00422             else
00423                 hc = tmp->next;
00424 
00425             addHostCore(hc->nick, hc->vIdent, hc->vHost, u->nick,
00426                         time(NULL));
00427 
00428             if (HSRequestMemoUser)
00429                 my_memo_lang(u, hc->nick, 2, NULL, LNG_ACTIVATE_MEMO);
00430 
00431             hs_request_head = deleteHostCore(hs_request_head, tmp);
00432             moduleNoticeLang(s_HostServ, u, LNG_ACTIVATED, nick);
00433             alog("Host Request for %s activated by %s", nick, u->nick);
00434         } else {
00435             moduleNoticeLang(s_HostServ, u, LNG_NO_REQUEST, nick);
00436         }
00437     } else {
00438         notice_lang(s_HostServ, u, NICK_X_NOT_REGISTERED, nick);
00439     }
00440 
00441     free(nick);
00442     return MOD_CONT;
00443 }
00444 
00445 
00446 static void my_add_host_request(char *nick, char *vIdent, char *vhost,
00447                          char *creator, int32 tmp_time)
00448 {
00449     HostCore *tmp;
00450     boolean found = false;
00451 
00452     if (!hs_request_head) {
00453         hs_request_head =
00454             createHostCorelist(hs_request_head, nick, vIdent, vhost,
00455                                creator, tmp_time);
00456     } else {
00457         tmp = findHostCore(hs_request_head, nick, &found);
00458         if (!found) {
00459             hs_request_head =
00460                 insertHostCore(hs_request_head, tmp, nick, vIdent, vhost,
00461                                creator, tmp_time);
00462         } else {
00463             hs_request_head = deleteHostCore(hs_request_head, tmp);     /* delete the old entry */
00464             my_add_host_request(nick, vIdent, vhost, creator, tmp_time);        /* recursive call to add new entry */
00465         }
00466     }
00467 }
00468 
00469 static int my_isvalidchar(const char c)
00470 {
00471     if (((c >= 'A') && (c <= 'Z')) || ((c >= 'a') && (c <= 'z'))
00472         || ((c >= '0') && (c <= '9')) || (c == '.') || (c == '-'))
00473         return 1;
00474     else
00475         return 0;
00476 }
00477 
00478 static int hs_do_list_out(User * u)
00479 {
00480     char *key;
00481 
00482     key = moduleGetLastBuffer();
00483     if (!key)
00484         return MOD_CONT;
00485 
00486     if (stricmp(key, "+req") != 0)
00487         return MOD_CONT;
00488 
00489     show_list(u);
00490 
00491     return MOD_CONT;
00492 }
00493 
00494 static int hs_do_waiting(User * u)
00495 {
00496     show_list(u);
00497 
00498     return MOD_CONT;
00499 }
00500 
00501 static void show_list(User * u)
00502 {
00503     struct tm *tm;
00504     char buf[BUFSIZE];
00505     int counter = 1;
00506     int from = 0, to = 0;
00507     int display_counter = 0;
00508     HostCore *current;
00509 
00510     current = hs_request_head;
00511     while (current) {
00512         if ((((counter >= from) && (counter <= to))
00513              || ((from == 0) && (to == 0)))
00514             && (display_counter < NSListMax)) {
00515             display_counter++;
00516             tm = localtime(&current->time);
00517             strftime(buf, sizeof(buf),
00518                      getstring(NULL, STRFTIME_DATE_TIME_FORMAT), tm);
00519             if (current->vIdent)
00520                 notice_lang(s_HostServ, u, HOST_IDENT_ENTRY, counter,
00521                             current->nick, current->vIdent, current->vHost,
00522                             current->creator, buf);
00523             else
00524                 notice_lang(s_HostServ, u, HOST_ENTRY, counter,
00525                             current->nick, current->vHost,
00526                             current->creator, buf);
00527         }
00528         counter++;
00529         current = current->next;
00530     }
00531     notice_lang(s_HostServ, u, HOST_LIST_FOOTER, display_counter);
00532 }
00533 
00534 static int hs_help_request(User * u)
00535 {
00536     moduleNoticeLang(s_HostServ, u, LNG_REQUEST_SYNTAX);
00537     notice(s_HostServ, u->nick, " ");
00538     moduleNoticeLang(s_HostServ, u, LNG_HELP_REQUEST);
00539 
00540     return MOD_CONT;
00541 }
00542 
00543 static int hs_help_activate(User * u)
00544 {
00545     if (is_host_setter(u)) {
00546         moduleNoticeLang(s_HostServ, u, LNG_ACTIVATE_SYNTAX);
00547         notice(s_HostServ, u->nick, " ");
00548         moduleNoticeLang(s_HostServ, u, LNG_HELP_ACTIVATE);
00549         if (HSRequestMemoUser)
00550             moduleNoticeLang(s_HostServ, u, LNG_HELP_ACTIVATE_MEMO);
00551     } else {
00552         notice_lang(s_HostServ, u, NO_HELP_AVAILABLE, "ACTIVATE");
00553     }
00554 
00555     return MOD_CONT;
00556 }
00557 
00558 static int hs_help_reject(User * u)
00559 {
00560     if (is_host_setter(u)) {
00561         moduleNoticeLang(s_HostServ, u, LNG_REJECT_SYNTAX);
00562         notice(s_HostServ, u->nick, " ");
00563         moduleNoticeLang(s_HostServ, u, LNG_HELP_REJECT);
00564         if (HSRequestMemoUser)
00565             moduleNoticeLang(s_HostServ, u, LNG_HELP_REJECT_MEMO);
00566     } else {
00567         notice_lang(s_HostServ, u, NO_HELP_AVAILABLE, "REJECT");
00568     }
00569 
00570     return MOD_CONT;
00571 }
00572 
00573 static int hs_help_waiting(User * u)
00574 {
00575     if (is_host_setter(u)) {
00576         moduleNoticeLang(s_HostServ, u, LNG_WAITING_SYNTAX);
00577         notice(s_HostServ, u->nick, " ");
00578         moduleNoticeLang(s_HostServ, u, LNG_HELP_WAITING);
00579     } else {
00580         notice_lang(s_HostServ, u, NO_HELP_AVAILABLE, "WAITING");
00581     }
00582 
00583     return MOD_CONT;
00584 }
00585 
00586 static void hs_help(User * u)
00587 {
00588     moduleNoticeLang(s_HostServ, u, LNG_HELP);
00589     if (is_host_setter(u))
00590         moduleNoticeLang(s_HostServ, u, LNG_HELP_SETTER);
00591 }
00592 static void hsreq_load_db(void)
00593 {
00594     FILE *fp;
00595     char *filename;
00596     char readbuf[1024];
00597     char *nick, *vident, *vhost, *creator, *tmp;
00598     int32 tmp_time;
00599     char *buf;
00600 
00601     if (HSRequestDBName)
00602         filename = HSRequestDBName;
00603     else
00604         filename = HSREQ_DEFAULT_DBNAME;
00605 
00606     fp = fopen(filename, "r");
00607     if (!fp) {
00608         alog("[hs_request] Unable to open database ('%s') for reading",
00609              filename);
00610         return;
00611     }
00612 
00613     while (fgets(readbuf, 1024, fp)) {
00614         buf = normalizeBuffer(readbuf);
00615         if (buf || *buf) {
00616             nick = myStrGetToken(buf, ':', 0);
00617             vident = myStrGetToken(buf, ':', 1);
00618             vhost = myStrGetToken(buf, ':', 2);
00619             tmp = myStrGetToken(buf, ':', 3);
00620             if (tmp) {
00621                 tmp_time = strtol(tmp, (char **) NULL, 16);
00622                 free(tmp);
00623             } else {
00624                 tmp_time = 0;
00625             }
00626             creator = myStrGetToken(buf, ':', 4);
00627             if (!nick || !vident || !vhost || !creator) {
00628                 alog("[hs_request] Error while reading database, skipping record");
00629                 continue;
00630             }
00631             if (stricmp(vident, "(null)") == 0) {
00632                 free(vident);
00633                 vident = NULL;
00634             }
00635             my_add_host_request(nick, vident, vhost, creator, tmp_time);
00636             free(nick);
00637             free(vhost);
00638             free(creator);
00639             if (vident)
00640                 free(vident);
00641         }
00642         free(buf);
00643     }
00644 
00645     fclose(fp);
00646 
00647     if (debug)
00648         alog("[hs_request] Succesfully loaded database");
00649 }
00650 
00651 static void hsreq_save_db(void)
00652 {
00653     FILE *fp;
00654     char *filename;
00655     char *vident;
00656     HostCore *current;
00657 
00658     if (HSRequestDBName)
00659         filename = HSRequestDBName;
00660     else
00661         filename = HSREQ_DEFAULT_DBNAME;
00662 
00663     fp = fopen(filename, "w");
00664     if (!fp) {
00665         alog("[hs_request] Unable to open database ('%s') for writing",
00666              filename);
00667         return;
00668     }
00669 
00670     current = hs_request_head;
00671     while (current) {
00672         vident = (current->vIdent ? current->vIdent : "(null)");
00673         fprintf(fp, "%s:%s:%s:%X:%s\n", current->nick, vident,
00674                 current->vHost, (uint32) current->time, current->creator);
00675         current = current->next;
00676     }
00677 
00678     fclose(fp);
00679 
00680     if (debug)
00681         alog("[hs_request] Succesfully saved database");
00682 }
00683 
00684 static int hsreqevt_db_saving(int argc, char **argv)
00685 {
00686     if ((argc >= 1) && (stricmp(argv[0], EVENT_START) == 0))
00687         hsreq_save_db();
00688 
00689     return MOD_CONT;
00690 }
00691 
00692 static int hsreqevt_db_backup(int argc, char **argv)
00693 {
00694     if ((argc >= 1) && (stricmp(argv[0], EVENT_START) == 0)) {
00695             if (HSRequestDBName)
00696             ModuleDatabaseBackup(HSRequestDBName);
00697             else
00698             ModuleDatabaseBackup(HSREQ_DEFAULT_DBNAME);
00699         }
00700         
00701     return MOD_CONT;
00702 }
00703 
00704 static void my_load_config(void)
00705 {
00706     int i;
00707     char *tmp = NULL;
00708 
00709     Directive confvalues[][1] = {
00710         {{"HSRequestMemoUser",
00711           {{PARAM_SET, PARAM_RELOAD, &HSRequestMemoUser}}}},
00712         {{"HSRequestMemoOper",
00713           {{PARAM_SET, PARAM_RELOAD, &HSRequestMemoOper}}}},
00714         {{"HSRequestMemoSetters",
00715           {{PARAM_SET, PARAM_RELOAD, &HSRequestMemoSetters}}}},
00716         {{"HSRequestDBName", {{PARAM_STRING, PARAM_RELOAD, &tmp}}}}
00717     };
00718 
00719     for (i = 0; i < 4; i++)
00720         moduleGetConfigDirective(confvalues[i]);
00721 
00722     if (tmp) {
00723         if (HSRequestDBName)
00724             free(HSRequestDBName);
00725         HSRequestDBName = sstrdup(tmp);
00726     } else {
00727         HSRequestDBName = sstrdup(HSREQ_DEFAULT_DBNAME);
00728     }
00729 
00730     if (debug)
00731         alog("debug: [hs_request] Set config vars: MemoUser=%d MemoOper=%d MemoSetters=%d DBName='%s'", HSRequestMemoUser, HSRequestMemoOper, HSRequestMemoSetters, HSRequestDBName);
00732 }
00733 
00734 static void my_add_languages(void)
00735 {
00736     char *langtable_en_us[] = {
00737         /* LNG_REQUEST_SYNTAX */
00738         "Syntax: \002REQUEST \037vhost\037\002",
00739         /* LNG_REQUESTED */
00740         "Your vHost has been requested",
00741         /* LNG_REQUEST_WAIT */
00742         "Please wait %d seconds before requesting a new vHost",
00743         /* LNG_REQUEST_MEMO */
00744         "[auto memo] vHost \002%s\002 has been requested.",
00745         /* LNG_ACTIVATE_SYNTAX */
00746         "Syntax: \002ACTIVATE \037nick\037\002",
00747         /* LNG_ACTIVATED */
00748         "vHost for %s has been activated",
00749         /* LNG_ACTIVATE_MEMO */
00750         "[auto memo] Your requested vHost has been approved.",
00751         /* LNG_REJECT_SYNTAX */
00752         "Syntax: \002REJECT \037nick\037\002",
00753         /* LNG_REJECTED */
00754         "vHost for %s has been rejected",
00755         /* LNG_REJECT_MEMO */
00756         "[auto memo] Your requested vHost has been rejected.",
00757         /* LNG_REJECT_MEMO_REASON */
00758         "[auto memo] Your requested vHost has been rejected. Reason: %s",
00759         /* LNG_NO_REQUEST */
00760         "No request for nick %s found.",
00761         /* LNG_HELP */
00762         "    REQUEST     Request a vHost for your nick",
00763         /* LNG_HELP_SETTER */
00764         "    ACTIVATE    Approve the requested vHost of a user\n"
00765             "    REJECT      Reject the requested vHost of a user\n"
00766             "    WAITING     Convenience command for LIST +req",
00767         /* LNG_HELP_REQUEST */
00768         "Request the given vHost to be actived for your nick by the\n"
00769             "network administrators. Please be patient while your request\n"
00770             "is being considered.",
00771         /* LNG_HELP_ACTIVATE */
00772         "Activate the requested vHost for the given nick.",
00773         /* LNG_HELP_ACTIVATE_MEMO */
00774         "A memo informing the user will also be sent.",
00775         /* LNG_HELP_REJECT */
00776         "Reject the requested vHost for the given nick.",
00777         /* LNG_HELP_REJECT_MEMO */
00778         "A memo informing the user will also be sent.",
00779         /* LNG_WAITING_SYNTAX */
00780         "Syntax: \002WAITING\002",
00781         /* LNG_HELP_WAITING */
00782         "This command is provided for convenience. It is essentially\n"
00783             "the same as performing a LIST +req ."
00784     };
00785 
00786     char *langtable_nl[] = {
00787         /* LNG_REQUEST_SYNTAX */
00788         "Gebruik: \002REQUEST \037vhost\037\002",
00789         /* LNG_REQUESTED */
00790         "Je vHost is aangevraagd",
00791         /* LNG_REQUEST_WAIT */
00792         "Wacht %d seconden voor je een nieuwe vHost aanvraagt",
00793         /* LNG_REQUEST_MEMO */
00794         "[auto memo] vHost \002%s\002 is aangevraagd.",
00795         /* LNG_ACTIVATE_SYNTAX */
00796         "Gebruik: \002ACTIVATE \037nick\037\002",
00797         /* LNG_ACTIVATED */
00798         "vHost voor %s is geactiveerd",
00799         /* LNG_ACTIVATE_MEMO */
00800         "[auto memo] Je aangevraagde vHost is geaccepteerd.",
00801         /* LNG_REJECT_SYNTAX */
00802         "Gebruik: \002REJECT \037nick\037\002",
00803         /* LNG_REJECTED */
00804         "vHost voor %s is afgekeurd",
00805         /* LNG_REJECT_MEMO */
00806         "[auto memo] Je aangevraagde vHost is afgekeurd.",
00807         /* LNG_REJECT_MEMO_REASON */
00808         "[auto memo] Je aangevraagde vHost is afgekeurd. Reden: %s",
00809         /* LNG_NO_REQUEST */
00810         "Geen aanvraag voor nick %s gevonden.",
00811         /* LNG_HELP */
00812         "    REQUEST     Vraag een vHost aan voor je nick",
00813         /* LNG_HELP_SETTER */
00814         "    ACTIVATE    Activeer de aangevraagde vHost voor een gebruiker\n"
00815             "    REJECT      Keur de aangevraagde vHost voor een gebruiker af\n"
00816             "    WAITING     Snelkoppeling naar LIST +req",
00817         /* LNG_HELP_REQUEST */
00818         "Verzoek de gegeven vHost te activeren voor jouw nick bij de\n"
00819             "netwerk beheerders. Het kan even duren voordat je aanvraag\n"
00820             "afgehandeld wordt.",
00821         /* LNG_HELP_ACTIVATE */
00822         "Activeer de aangevraagde vHost voor de gegeven nick.",
00823         /* LNG_HELP_ACTIVATE_MEMO */
00824         "Een memo die de gebruiker op de hoogste stelt zal ook worden verstuurd.",
00825         /* LNG_HELP_REJECT */
00826         "Keur de aangevraagde vHost voor de gegeven nick af.",
00827         /* LNG_HELP_REJECT_MEMO */
00828         "Een memo die de gebruiker op de hoogste stelt zal ook worden verstuurd.",
00829         /* LNG_WAITING_SYNTAX */
00830         "Gebruik: \002WAITING\002",
00831         /* LNG_HELP_WAITING */
00832         "Dit commando is beschikbaar als handigheid. Het is simpelweg\n"
00833             "hetzelfde als LIST +req ."
00834     };
00835 
00836     char *langtable_pt[] = {
00837         /* LNG_REQUEST_SYNTAX */
00838         "Sintaxe: \002REQUEST \037vhost\037\002",
00839         /* LNG_REQUESTED */
00840         "Seu pedido de vHost foi encaminhado",
00841         /* LNG_REQUEST_WAIT */
00842         "Por favor, espere %d segundos antes de fazer um novo pedido de vHost",
00843         /* LNG_REQUEST_MEMO */
00844         "[Auto Memo] O vHost \002%s\002 foi solicitado.",
00845         /* LNG_ACTIVATE_SYNTAX */
00846         "Sintaxe: \002ACTIVATE \037nick\037\002",
00847         /* LNG_ACTIVATED */
00848         "O vHost para %s foi ativado",
00849         /* LNG_ACTIVATE_MEMO */
00850         "[Auto Memo] Seu pedido de vHost foi aprovado.",
00851         /* LNG_REJECT_SYNTAX */
00852         "Sintaxe: \002REJECT \037nick\037\002",
00853         /* LNG_REJECTED */
00854         "O vHost de %s foi recusado",
00855         /* LNG_REJECT_MEMO */
00856         "[Auto Memo] Seu pedido de vHost foi recusado.",
00857         /* LNG_REJECT_MEMO_REASON */
00858         "[Auto Memo] Seu pedido de vHost foi recusado. Motivo: %s",
00859         /* LNG_NO_REQUEST */
00860         "Nenhum pedido encontrado para o nick %s.",
00861         /* LNG_HELP */
00862         "    REQUEST     Request a vHost for your nick",
00863         /* LNG_HELP_SETTER */
00864         "    ACTIVATE    Aprova o pedido de vHost de um usuбrio\n"
00865             "    REJECT      Recusa o pedido de vHost de um usuбrio\n"
00866             "    WAITING     Comando para LISTAR +req",
00867         /* LNG_HELP_REQUEST */
00868         "Solicita a ativaзгo do vHost fornecido em seu nick pelos\n"
00869             "administradores da rede. Por favor, tenha paciкncia\n"
00870             "enquanto seu pedido й analisado.",
00871         /* LNG_HELP_ACTIVATE */
00872         "Ativa o vHost solicitado para o nick fornecido.",
00873         /* LNG_HELP_ACTIVATE_MEMO */
00874         "Um memo informando o usuбrio tambйm serб enviado.",
00875         /* LNG_HELP_REJECT */
00876         "Recusa o pedido de vHost para o nick fornecido.",
00877         /* LNG_HELP_REJECT_MEMO */
00878         "Um memo informando o usuбrio tambйm serб enviado.",
00879         /* LNG_WAITING_SYNTAX */
00880         "Sintaxe: \002WAITING\002",
00881         /* LNG_HELP_WAITING */
00882         "Este comando й usado por conveniкncia. Й essencialmente\n"
00883             "o mesmo que fazer um LIST +req"
00884     };
00885 
00886     char *langtable_ru[] = {
00887         /* LNG_REQUEST_SYNTAX */
00888         "Синтаксис: \002REQUEST \037vHost\037\002",
00889         /* LNG_REQUESTED */
00890         "Ваш запрос на vHost отправлен.",
00891         /* LNG_REQUEST_WAIT */
00892         "Пожалуйста, подождите %d секунд, прежде чем запрашивать новый vHost",
00893         /* LNG_REQUEST_MEMO */
00894         "[авто-сообщение] Был запрошен vHost \002%s\002",
00895         /* LNG_ACTIVATE_SYNTAX */
00896         "Синтаксис: \002ACTIVATE \037ник\037\002",
00897         /* LNG_ACTIVATED */
00898         "vHost для %s успешно активирован",
00899         /* LNG_ACTIVATE_MEMO */
00900         "[авто-сообщение] Запрашиваемый вами vHost утвержден и активирован.",
00901         /* LNG_REJECT_SYNTAX */
00902         "Синтаксис: \002REJECT \037ник\037\002",
00903         /* LNG_REJECTED */
00904         "vHost для %s отклонен.",
00905         /* LNG_REJECT_MEMO */
00906         "[авто-сообщение] Запрашиваемый вами vHost отклонен.",
00907         /* LNG_REJECT_MEMO_REASON */
00908         "[авто-сообщение] Запрашиваемый вами vHost отклонен. Причина: %s",
00909         /* LNG_NO_REQUEST */
00910         "Запрос на vHost для ника %s не найден.",
00911         /* LNG_HELP */
00912         "    REQUEST     Запрос на vHost для вашего текущего ника",
00913         /* LNG_HELP_SETTER */
00914         "    ACTIVATE    Утвердить запрашиваемый пользователем  vHost\n"
00915             "    REJECT      Отклонить запрашиваемый пользователем  vHost\n"
00916             "    WAITING     Список запросов ожидающих обработки (аналог LIST +req)",
00917         /* LNG_HELP_REQUEST */
00918         "Отправляет запрос на активацию vHost, который будет рассмотрен одним из\n"
00919             "администраторов сети. Просьба проявить терпение, пока запрос\n"
00920             "рассматривается администрацией.",
00921         /* LNG_HELP_ACTIVATE */
00922         "Утвердить запрашиваемый vHost для указанного ника.",
00923         /* LNG_HELP_ACTIVATE_MEMO */
00924         "Пользователю будет послано авто-уведомление об активации его запроса.",
00925         /* LNG_HELP_REJECT */
00926         "Отклонить запрашиваемый vHost для указанного ника.",
00927         /* LNG_HELP_REJECT_MEMO */
00928         "Пользователю будет послано авто-уведомление об отклонении его запроса.",
00929         /* LNG_WAITING_SYNTAX */
00930         "Синтаксис: \002WAITING\002",
00931         /* LNG_HELP_WAITING */
00932         "Данная команда создана для удобства использования и выводит список запросов,\n"
00933             "ожидающих обработки. Аналогичная команда: LIST +req ."
00934     };
00935 
00936     char *langtable_it[] = {
00937         /* LNG_REQUEST_SYNTAX */
00938         "Sintassi: \002REQUEST \037vhost\037\002",
00939         /* LNG_REQUESTED */
00940         "Il tuo vHost и stato richiesto",
00941         /* LNG_REQUEST_WAIT */
00942         "Prego attendere %d secondi prima di richiedere un nuovo vHost",
00943         /* LNG_REQUEST_MEMO */
00944         "[auto memo] и stato richiesto il vHost \002%s\002.",
00945         /* LNG_ACTIVATE_SYNTAX */
00946         "Sintassi: \002ACTIVATE \037nick\037\002",
00947         /* LNG_ACTIVATED */
00948         "Il vHost per %s и stato attivato",
00949         /* LNG_ACTIVATE_MEMO */
00950         "[auto memo] Il vHost da te richiesto и stato approvato.",
00951         /* LNG_REJECT_SYNTAX */
00952         "Sintassi: \002REJECT \037nick\037\002",
00953         /* LNG_REJECTED */
00954         "Il vHost per %s и stato rifiutato",
00955         /* LNG_REJECT_MEMO */
00956         "[auto memo] Il vHost da te richiesto и stato rifiutato.",
00957         /* LNG_REJECT_MEMO_REASON */
00958         "[auto memo] Il vHost da te richiesto и stato rifiutato. Motivo: %s",
00959         /* LNG_NO_REQUEST */
00960         "Nessuna richiesta trovata per il nick %s.",
00961         /* LNG_HELP */
00962         "    REQUEST     Richiede un vHost per il tuo nick",
00963         /* LNG_HELP_SETTER */
00964         "    ACTIVATE    Approva il vHost richiesto di un utente\n"
00965             "    REJECT      Rifiuta il vHost richiesto di un utente\n"
00966             "    WAITING     Comando per LIST +req",
00967         /* LNG_HELP_REQUEST */
00968         "Richiede l'attivazione del vHost specificato per il tuo nick da parte\n"
00969             "degli amministratori di rete. Sei pregato di pazientare finchи la tua\n"
00970             "richiesta viene elaborata.",
00971         /* LNG_HELP_ACTIVATE */
00972         "Attiva il vHost richiesto per il nick specificato.",
00973         /* LNG_HELP_ACTIVATE_MEMO */
00974         "Viene inviato un memo per informare l'utente.",
00975         /* LNG_HELP_REJECT */
00976         "Rifiuta il vHost richiesto per il nick specificato.",
00977         /* LNG_HELP_REJECT_MEMO */
00978         "Viene inviato un memo per informare l'utente.",
00979         /* LNG_WAITING_SYNTAX */
00980         "Sintassi: \002WAITING\002",
00981         /* LNG_HELP_WAITING */
00982         "Questo comando и per comoditа. Praticamente и la stessa cosa che\n"
00983             "eseguire un LIST +req ."
00984     };
00985         
00986     char *langtable_de[] = {
00987         /* LNG_REQUEST_SYNTAX */
00988         "Syntax: \002REQUEST \037vhost\037\002",
00989         /* LNG_REQUESTED */
00990         "Dein vHost wurde beantragt",
00991         /* LNG_REQUEST_WAIT */
00992         "Bitte warte %d Sekunden bevor Du einen neuen vHost beantragst",
00993         /* LNG_REQUEST_MEMO */
00994         "[auto memo] vHost \002%s\002 wurde beantragt.",
00995         /* LNG_ACTIVATE_SYNTAX */
00996         "Syntax: \002ACTIVATE \037nick\037\002",
00997         /* LNG_ACTIVATED */
00998         "vHost fьr %s wurde aktiviert",
00999         /* LNG_ACTIVATE_MEMO */
01000         "[auto memo] Dein beantragter vHost wurde freigegeben.",
01001         /* LNG_REJECT_SYNTAX */
01002         "Syntax: \002REJECT \037nick\037\002",
01003         /* LNG_REJECTED */
01004         "vHost fьr %s wurde abgelehnt",
01005         /* LNG_REJECT_MEMO */
01006         "[auto memo] Dein beantragter vHost wurde abgelehnt.",
01007         /* LNG_REJECT_MEMO_REASON */
01008         "[auto memo] Dein beantragter vHost wurde abgelehnt. Begrьndung: %s",
01009         /* LNG_NO_REQUEST */
01010         "Keine vHost Beantragung fьr Nick %s gefunden.",
01011         /* LNG_HELP */
01012         "    REQUEST     Beantrage einen vHost fьr Deinen Nick",
01013         /* LNG_HELP_SETTER */
01014         "    ACTIVATE    Freigeben eines beantragten vHostes von einem User\n"
01015             "    REJECT      Ablehnen eines beantragten vHostes von einem User\n"
01016             "    WAITING     Vereinfachter Befehl fьr LIST +req",
01017         /* LNG_HELP_REQUEST */
01018         "Beantragt den angegebenen vHost fьr Deinen Nick, um von den\n"
01019             "Network Administratoren aktiviert zu werden. Bitte gedulde Dich eine Weile,\n"
01020             "bis ьber Deine Anfrage entschieden wurde.",
01021         /* LNG_HELP_ACTIVATE */
01022         "Aktivert den beantragten vHost fьr den angegebenen Nick.",
01023         /* LNG_HELP_ACTIVATE_MEMO */
01024         "Eine Memo wird an den User gesendet, um ihn zu informieren.",
01025         /* LNG_HELP_REJECT */
01026         "Lehnt den beantragten vHost fьr den genannten Nick ab.",
01027         /* LNG_HELP_REJECT_MEMO */
01028         "Eine Memo wird an den User gesendet, um ihn zu informieren.",
01029         /* LNG_WAITING_SYNTAX */
01030         "Syntax: \002WAITING\002",
01031         /* LNG_HELP_WAITING */
01032         "Dieser Befehl ist Benutzerfreundlicher. Es ist genau derselbe\n"
01033             "als wenn man LIST +req benutzt."
01034     };
01035 
01036     char *langtable_fr[] = {
01037         /* LNG_REQUEST_SYNTAX */
01038         "Syntaxe: \002REQUEST \037vhost\037\002",
01039         /* LNG_REQUESTED */
01040         "Votre demande de vHost a йtй envoyйe",
01041         /* LNG_REQUEST_WAIT */
01042         "Merci d'attendre %d secondes avant de demander un autre vHost",
01043         /* LNG_REQUEST_MEMO */
01044         "[auto memo] Le vHost \002%s\002 a йtй demandй.",
01045         /* LNG_ACTIVATE_SYNTAX */
01046         "Syntaxe: \002ACTIVATE \037pseudo\037\002",
01047         /* LNG_ACTIVATED */
01048         "Le vHost de %s est activй",
01049         /* LNG_ACTIVATE_MEMO */
01050         "[auto memo] Votre demande de vHost a йtй approuvйe.",
01051         /* LNG_REJECT_SYNTAX */
01052         "Syntaxe: \002REJECT \037pseudo\037\002",
01053         /* LNG_REJECTED */
01054         "Le vHost de %s a йtй refusй",
01055         /* LNG_REJECT_MEMO */
01056         "[auto memo] Votre demande de vHost a йtй refusйe.",
01057         /* LNG_REJECT_MEMO_REASON */
01058         "[auto memo] Votre demande de vHost a йtй refusйe pour le motif suivant : %s",
01059         /* LNG_NO_REQUEST */
01060         "Aucune demande faite pour %s.",
01061         /* LNG_HELP */
01062         "    REQUEST     Demander un vHost pour votre pseudo",
01063         /* LNG_HELP_SETTER */
01064         "    ACTIVATE    Approuver la demande de vHost d'un utilisateur\n"
01065             "    REJECT      Refuser la demande de vHost d'un utilisateur\n"
01066             "    WAITING     Raccourci de la commande LIST +req",
01067         /* LNG_HELP_REQUEST */
01068         "Demande le vHost spйcifiй а кtre activй pour votre pseudo par les\n"
01069             "administrateurs du rйseau. Merci d'кtre patient le temps que votre demande\n"
01070             "soit prise en compte.",
01071         /* LNG_HELP_ACTIVATE */
01072         "Active le vHost demandй pour un pseudo spйcifiй.",
01073         /* LNG_HELP_ACTIVATE_MEMO */
01074         "Un mйmo informant l'utilisateur de l'activation sera envoyй йgalement.",
01075         /* LNG_HELP_REJECT */
01076         "Refuse le vHost demandй pour un pseudo spйcifiй.",
01077         /* LNG_HELP_REJECT_MEMO */
01078         "Un mйmo informant l'utilisateur du refus sera envoyй йgalement.",
01079         /* LNG_WAITING_SYNTAX */
01080         "Syntaxe: \002WAITING\002",
01081         /* LNG_HELP_WAITING */
01082         "Cette commande est fournie par commoditй. C'est essentiellement\n"
01083             "la mкme que LIST +req ."
01084     };
01085 
01086     moduleInsertLanguage(LANG_EN_US, LNG_NUM_STRINGS, langtable_en_us);
01087     moduleInsertLanguage(LANG_NL, LNG_NUM_STRINGS, langtable_nl);
01088     moduleInsertLanguage(LANG_PT, LNG_NUM_STRINGS, langtable_pt);
01089     moduleInsertLanguage(LANG_RU, LNG_NUM_STRINGS, langtable_ru);
01090     moduleInsertLanguage(LANG_IT, LNG_NUM_STRINGS, langtable_it);
01091     moduleInsertLanguage(LANG_DE, LNG_NUM_STRINGS, langtable_de);
01092     moduleInsertLanguage(LANG_FR, LNG_NUM_STRINGS, langtable_fr);
01093 }
01094 
01095 /* EOF */