X-Git-Url: http://git.bytex64.net/?a=blobdiff_plain;f=common%2Fauth.c;h=01164626e9599a9e29cd9917c580028040f41b0b;hb=a65aeec9e6152703de9c770e56e689b1356cddb0;hp=0a3a8f5c664c07f0d1175f66679c5ad6c3a6e332;hpb=65e6e5bf86b8474d7178beb870901e2a8e9e0d17;p=blerg.git diff --git a/common/auth.c b/common/auth.c index 0a3a8f5..0116462 100644 --- a/common/auth.c +++ b/common/auth.c @@ -3,9 +3,12 @@ #include #include #include +#include #include "config.h" #include "auth.h" +#define TOKEN_SIZE 16 + int auth_set_password(const char *username, const char *password) { char filename[512]; int fd; @@ -49,3 +52,83 @@ int auth_check_password(const char *username, const char *password) { else return 0; } + +void hexify(char *dst, char *src, int len) { + static char hex[] = "0123456789abcdef"; + int i; + + for (i = 0; i < len; i++) { + dst[i * 2] = hex[(src[i] & 0xF0) >> 4]; + dst[i * 2 + 1] = hex[src[i] & 0xF]; + } +} + +char *create_random_token() { + unsigned char buf[TOKEN_SIZE]; + char *token; + int rand_fd; + + rand_fd = open("/dev/urandom", O_RDONLY); + if (rand_fd == -1) { + perror("Could not open /dev/urandom\n"); + return 0; + } + read(rand_fd, buf, TOKEN_SIZE); + close(rand_fd); + + token = malloc(TOKEN_SIZE * 2 + 1); + hexify(token, buf, TOKEN_SIZE); + token[TOKEN_SIZE * 2] = 0; + + return token; +} + +int auth_login(const char *username, const char *password) { + char filename[512]; + int token_fd; + + if (!auth_check_password(username, password)) + return 0; + + sprintf(filename, "%s/%s/token", DATA_PATH, username); + token_fd = open(filename, O_WRONLY | O_CREAT, 0600); + if (token_fd == -1) { + perror("Could not open token"); + return 0; + } + + char *token = create_random_token(); + write(token_fd, token, TOKEN_SIZE * 2); + close(token_fd); + free(token); + + return 1; +} + +int auth_logout(const char *username) { + char filename[512]; + sprintf(filename, "%s/%s/token", DATA_PATH, username); + if (unlink(filename) == -1) + return 0; + + return 1; +} + +char *auth_get_token(const char *username) { + char filename[512]; + char *token; + int token_fd; + + sprintf(filename, "%s/%s/token", DATA_PATH, username); + token_fd = open(filename, O_RDONLY, 0600); + if (token_fd == -1) { + perror("Could not open token"); + return NULL; + } + + token = malloc(TOKEN_SIZE * 2 + 1); + read(token_fd, token, TOKEN_SIZE * 2); + close(token_fd); + + return token; +}