00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #if defined(macintosh)
00029 #include <types.h>
00030 #include <time.h>
00031 #else
00032 #include <sys/types.h>
00033 #include <sys/time.h>
00034 #endif
00035 #include <stdio.h>
00036 #include <string.h>
00037 #include <stdlib.h>
00038 #include "merc.h"
00039 #include "recycle.h"
00040
00041 BAN_DATA *ban_list;
00042
00043 void save_bans (void)
00044 {
00045 BAN_DATA *pban;
00046 FILE *fp;
00047 bool found = FALSE;
00048
00049 fclose (fpReserve);
00050 if ((fp = fopen (BAN_FILE, "w")) == NULL)
00051 {
00052 perror (BAN_FILE);
00053 }
00054
00055 for (pban = ban_list; pban != NULL; pban = pban->next)
00056 {
00057 if (IS_SET (pban->ban_flags, BAN_PERMANENT))
00058 {
00059 found = TRUE;
00060 fprintf (fp, "%-20s %-2d %s\n", pban->name, pban->level,
00061 print_flags (pban->ban_flags));
00062 }
00063 }
00064
00065 fclose (fp);
00066 fpReserve = fopen (NULL_FILE, "r");
00067 if (!found)
00068 unlink (BAN_FILE);
00069 }
00070
00071 void load_bans (void)
00072 {
00073 FILE *fp;
00074 BAN_DATA *ban_last;
00075
00076 if ((fp = fopen (BAN_FILE, "r")) == NULL)
00077 return;
00078
00079 ban_last = NULL;
00080 for (;;)
00081 {
00082 twiddle();
00083 BAN_DATA *pban;
00084 if (feof (fp))
00085 {
00086 fclose (fp);
00087 return;
00088 }
00089
00090 pban = new_ban ();
00091
00092 pban->name = str_dup (fread_word (fp));
00093 pban->level = fread_number (fp);
00094 pban->ban_flags = fread_flag (fp);
00095 fread_to_eol (fp);
00096
00097 if (ban_list == NULL)
00098 ban_list = pban;
00099 else
00100 ban_last->next = pban;
00101 ban_last = pban;
00102 }
00103 }
00104
00105 bool check_ban (char *site, int type)
00106 {
00107
00108 BAN_DATA *pban;
00109 char host[MAX_STRING_LENGTH];
00110
00111 strcpy (host, capitalize (site));
00112 host[0] = LOWER (host[0]);
00113
00114 for (pban = ban_list; pban != NULL; pban = pban->next)
00115 {
00116 if (!IS_SET (pban->ban_flags, type))
00117 continue;
00118
00119 if (IS_SET (pban->ban_flags, BAN_PREFIX)
00120 && IS_SET (pban->ban_flags, BAN_SUFFIX)
00121 && strstr (pban->name, host) != NULL)
00122 return TRUE;
00123
00124 if (IS_SET (pban->ban_flags, BAN_PREFIX)
00125 && !str_suffix (pban->name, host))
00126 return TRUE;
00127
00128 if (IS_SET (pban->ban_flags, BAN_SUFFIX)
00129 && !str_prefix (pban->name, host))
00130 return TRUE;
00131 }
00132
00133 return FALSE;
00134 }
00135
00136
00137 void ban_site (CHAR_DATA * ch, char *argument, bool fPerm)
00138 {
00139 char buf[MAX_STRING_LENGTH], buf2[MAX_STRING_LENGTH];
00140 char arg1[MAX_INPUT_LENGTH], arg2[MAX_INPUT_LENGTH];
00141 char *name;
00142 BUFFER *buffer;
00143 BAN_DATA *pban, *prev;
00144 bool prefix = FALSE, suffix = FALSE;
00145 int type;
00146
00147 argument = one_argument (argument, arg1);
00148 argument = one_argument (argument, arg2);
00149
00150 if (arg1[0] == '\0')
00151 {
00152 if (ban_list == NULL)
00153 {
00154 send_to_char ("No sites banned at this time.\n\r", ch);
00155 return;
00156 }
00157 buffer = new_buf ();
00158
00159 sprintf(buf, "%-40s %-5s %-5s %-7s\n\r", "Banned Sites", "Level", "Type", "Status");
00160 add_buf(buffer, buf);
00161
00162 for (pban = ban_list; pban != NULL; pban = pban->next)
00163 {
00164 sprintf (buf2, "%s%s%s",
00165 IS_SET (pban->ban_flags, BAN_PREFIX) ? "*" : "",
00166 pban->name,
00167 IS_SET (pban->ban_flags, BAN_SUFFIX) ? "*" : "");
00168 sprintf (buf, "%-40s %-5d %-7s %s\n\r",
00169 buf2, pban->level,
00170 IS_SET (pban->ban_flags, BAN_NEWBIES) ? "newbies" :
00171 IS_SET (pban->ban_flags, BAN_PERMIT) ? "permit" :
00172 IS_SET (pban->ban_flags, BAN_ALL) ? "all" : "",
00173 IS_SET (pban->ban_flags,
00174 BAN_PERMANENT) ? "perm" : "temp");
00175 add_buf (buffer, buf);
00176 }
00177
00178 page_to_char (buf_string (buffer), ch);
00179 free_buf (buffer);
00180 return;
00181 }
00182
00183
00184 if (arg2[0] == '\0' || !str_prefix (arg2, "all"))
00185 type = BAN_ALL;
00186 else if (!str_prefix (arg2, "newbies"))
00187 type = BAN_NEWBIES;
00188 else if (!str_prefix (arg2, "permit"))
00189 type = BAN_PERMIT;
00190 else
00191 {
00192 send_to_char
00193 ("Acceptable ban types are all, newbies, and permit.\n\r", ch);
00194 return;
00195 }
00196
00197 name = arg1;
00198
00199 if (name[0] == '*')
00200 {
00201 prefix = TRUE;
00202 name++;
00203 }
00204
00205 if (name[strlen (name) - 1] == '*')
00206 {
00207 suffix = TRUE;
00208 name[strlen (name) - 1] = '\0';
00209 }
00210
00211 if (strlen (name) == 0)
00212 {
00213 send_to_char ("You have to ban SOMETHING.\n\r", ch);
00214 return;
00215 }
00216
00217 prev = NULL;
00218 for (pban = ban_list; pban != NULL; prev = pban, pban = pban->next)
00219 {
00220 if (!str_cmp (name, pban->name))
00221 {
00222 if (pban->level > get_trust (ch))
00223 {
00224 send_to_char ("That ban was set by a higher power.\n\r", ch);
00225 return;
00226 }
00227 else
00228 {
00229 if (prev == NULL)
00230 ban_list = pban->next;
00231 else
00232 prev->next = pban->next;
00233 free_ban (pban);
00234 }
00235 }
00236 }
00237
00238 pban = new_ban ();
00239 pban->name = str_dup (name);
00240 pban->level = get_trust (ch);
00241
00242
00243 pban->ban_flags = type;
00244
00245 if (prefix)
00246 SET_BIT (pban->ban_flags, BAN_PREFIX);
00247 if (suffix)
00248 SET_BIT (pban->ban_flags, BAN_SUFFIX);
00249 if (fPerm)
00250 SET_BIT (pban->ban_flags, BAN_PERMANENT);
00251
00252 pban->next = ban_list;
00253 ban_list = pban;
00254 save_bans ();
00255 sprintf (buf, "%s has been banned.\n\r", pban->name);
00256 send_to_char (buf, ch);
00257 return;
00258 }
00259
00260 void do_ban (CHAR_DATA * ch, char *argument)
00261 {
00262 ban_site (ch, argument, FALSE);
00263 }
00264
00265 void do_permban (CHAR_DATA * ch, char *argument)
00266 {
00267 ban_site (ch, argument, TRUE);
00268 }
00269
00270 void do_allow (CHAR_DATA * ch, char *argument)
00271 {
00272 char arg[MAX_INPUT_LENGTH];
00273 char buf[MAX_STRING_LENGTH];
00274 BAN_DATA *prev;
00275 BAN_DATA *curr;
00276
00277 one_argument (argument, arg);
00278
00279 if (arg[0] == '\0')
00280 {
00281 send_to_char ("Remove which site from the ban list?\n\r", ch);
00282 return;
00283 }
00284
00285 prev = NULL;
00286 for (curr = ban_list; curr != NULL; prev = curr, curr = curr->next)
00287 {
00288 if (!str_cmp (arg, curr->name))
00289 {
00290 if (curr->level > get_trust (ch))
00291 {
00292 send_to_char
00293 ("You are not powerful enough to lift that ban.\n\r", ch);
00294 return;
00295 }
00296 if (prev == NULL)
00297 ban_list = ban_list->next;
00298 else
00299 prev->next = curr->next;
00300
00301 free_ban (curr);
00302 sprintf (buf, "Ban on %s lifted.\n\r", arg);
00303 send_to_char (buf, ch);
00304 save_bans ();
00305 return;
00306 }
00307 }
00308
00309 send_to_char ("Site is not banned.\n\r", ch);
00310 return;
00311 }