Procházet zdrojové kódy

admin is broken

pull/3/head
Emil před 10 měsíci
rodič
revize
4d893fb3d9
3 změnil soubory, kde provedl 24 přidání a 22 odebrání
  1. +7
    -6
      include/parse.h
  2. +5
    -5
      src/main.c
  3. +12
    -11
      src/parse.c

+ 7
- 6
include/parse.h Zobrazit soubor

@@ -2,12 +2,13 @@

typedef struct
{
char * username;
char * password;
char * channel;
char * server;
char * admin;
int port;
size_t admin_count;
char * username;
char * password;
char * channel;
char * server;
char ** admins;
int port;
} creds_t;

extern creds_t creds;


+ 5
- 5
src/main.c Zobrazit soubor

@@ -81,17 +81,17 @@ main (int argc,
if (strcmp(arg, "db") == 0)
{ db = argv[1]; }
else if (strcmp(arg, "server") == 0)
{ FREE(creds.server); creds.server = strdup(argv[1]); }
{ free(creds.server); creds.server = strdup(argv[1]); }
else if (strcmp(arg, "port") == 0)
{ creds.port = atoi(argv[1]); }
else if (strcmp(arg, "channel") == 0)
{ FREE(creds.channel); creds.channel = strdup(argv[1]); }
{ free(creds.channel); creds.channel = strdup(argv[1]); }
else if (strcmp(arg, "username") == 0)
{ FREE(creds.username); creds.username = strdup(argv[1]); }
{ free(creds.username); creds.username = strdup(argv[1]); }
else if (strcmp(arg, "password") == 0)
{ FREE(creds.password); creds.password = strdup(argv[1]); }
{ free(creds.password); creds.password = strdup(argv[1]); }
else if (strcmp(arg, "admin") == 0)
{ FREE(creds.admin); creds.admin = strdup(argv[1]); }
{ free(creds.admins); parse_admins(argv[1]); } /* argv isn't constant :> */
else if (strcmp(arg, "auth") == 0)
{
authfile = argv[1];


+ 12
- 11
src/parse.c Zobrazit soubor

@@ -59,7 +59,6 @@ size_t const cred_names_len[] =
};

creds_t creds = {0};
char ** admins = NULL;

DECL char *
slurp(char const * fn)
@@ -161,6 +160,7 @@ DECL int
parse_pair(char const * buf, size_t len)
{
size_t i, f, x;
char * adm;
/* fprintf(stderr, "ENT len:%ld buf:%sEOF\n", len, buf); */
for (i = 0; buf[i] &&
i < len; ++i)
@@ -192,7 +192,7 @@ parse_pair(char const * buf, size_t len)
case CHANNEL: creds.channel = strndup(buf,x); break;
case SERVER: creds.server = strndup(buf,x); break;
case PORT: creds.port = atoi(buf); break;
case ADMINS: parse_admins(strndup(buf,x)); break;
case ADMINS: adm = strndup(buf,x); parse_admins(adm); free(adm); break;
}
if (x + 2 < len)
{ buf += x + 1; }
@@ -207,6 +207,7 @@ parse_pair(char const * buf, size_t len)
return 0;
}

/* FIXME MAKE parse_admins constant! */
/* WARNING: admin_string WILL be changed */
DECL void
parse_admins(char * admin_string)
@@ -218,7 +219,7 @@ parse_admins(char * admin_string)
size_t i = 0;
char * token = NULL;

admins = calloc(ADMIN_LIST_INIT_SIZE, sizeof(char *));
creds.admins = calloc(ADMIN_LIST_INIT_SIZE, sizeof(char *));

while ((token = strtok(admin_string, " ")))
{
@@ -226,30 +227,30 @@ parse_admins(char * admin_string)
{
/* double the space */
current_array_size *= 2;
admins = realloc(admins, current_array_size);
creds.admins = realloc(creds.admins, current_array_size);
}

admins[i - 1] = strdup(token);
creds.admins[i - 1] = strdup(token);
}

/* set up array end marker for proper clean-up later */
if (i + 1 > current_array_size)
{
admins = realloc(admins, current_array_size + 1);
creds.admins = realloc(creds.admins, current_array_size + 1);
}
admins[i] = NULL;
creds.admins[i] = NULL;
}

DECL int
is_admin(char const * user)
{
/* No Gods or Kings, Only Man */
if (admins == NULL)
if (creds.admins == NULL)
{ return 0; }

for (size_t i = 0; admins[i]; ++i)
for (size_t i = 0; creds.admins[i]; ++i)
{
if (!strcmp(admins[i], user))
if (!strcmp(creds.admins[i], user))
{ return 1; }
}

@@ -269,5 +270,5 @@ creds_free_rest(void)
/* FULL_FREE(creds.password); */
FULL_FREE(creds.channel);
FULL_FREE(creds.server);
FULL_FREE(creds.admin);
FREE(creds.admins);
}