Change auth to allow multiple logins
exit(0);
}
- if (!auth_login(username, password)) {
+ char *token = auth_login(username, password);
+ if (token == NULL) {
respond_JSON_Failure();
exit(0);
}
- char *token = auth_get_token(username);
printf("Set-Cookie: auth=%s\r\n", token);
free(token);
if (!check_auth(username))
exit(0);
- auth_logout(username);
+ const char *given_token = cgi_getcookie("auth");
+ auth_logout(username, given_token);
respond_JSON_Success();
} else if (strncmp(path, "/subscribe", 10) == 0 || strncmp(path, "/unsubscribe", 12) == 0) {
const char *username = cgi_getentrystr("username");
return token;
}
-int auth_login(const char *username, const char *password) {
+char * auth_login(const char *username, const char *password) {
char filename[512];
int token_fd;
if (!auth_check_password(username, password))
- return 0;
+ return NULL;
- sprintf(filename, "%s/%s/token", DATA_PATH, username);
+ char *token = create_random_token();
+
+ sprintf(filename, "%s/%s/tokens", DATA_PATH, username);
+ if (access(filename, F_OK) != 0) {
+ if (mkdir(filename, 0700) == -1) {
+ perror("Could not create auth token dir");
+ return NULL;
+ }
+ }
+
+ sprintf(filename, "%s/%s/tokens/%s", DATA_PATH, username, token);
token_fd = open(filename, O_WRONLY | O_CREAT, 0600);
if (token_fd == -1) {
perror("Could not open token");
- return 0;
+ return NULL;
}
-
- char *token = create_random_token();
- write(token_fd, token, TOKEN_SIZE * 2);
close(token_fd);
- free(token);
- return 1;
+ return token;
}
-int auth_logout(const char *username) {
+int auth_logout(const char *username, const char *token) {
char filename[512];
if (!valid_name(username))
return 0;
- sprintf(filename, "%s/%s/token", DATA_PATH, username);
+ sprintf(filename, "%s/%s/tokens", DATA_PATH, username);
+ if (access(filename, F_OK) != 0) {
+ return 0;
+ }
+
+ sprintf(filename, "%s/%s/tokens/%s", DATA_PATH, username, token);
if (unlink(filename) == -1)
return 0;
return 1;
}
-char *auth_get_token(const char *username) {
+int auth_check_token(const char *username, const char *given_token) {
char filename[512];
- char *token;
- int token_fd;
- if (!valid_name(username))
- return 0;
+ sprintf(filename, "%s/%s/tokens/%s", DATA_PATH, username, given_token);
- 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;
-}
-
-int auth_check_token(const char *username, const char *given_token) {
- char *token = auth_get_token(username);
- if (token != NULL && given_token != NULL) {
- int ret = (strncmp(token, given_token, TOKEN_SIZE * 2) == 0);
- free(token);
- return ret;
- } else {
- return 0;
- }
+ return (access(filename, F_OK) == 0);
}
int auth_set_password(const char *, const char *);
int auth_get_password(const char *, char *);
int auth_check_password(const char *, const char *);
-int auth_login(const char *username, const char *password);
-int auth_logout(const char *username);
-char *auth_get_token(const char *username);
+char * auth_login(const char *username, const char *password);
+int auth_logout(const char *username, const char *token);
int auth_check_token(const char *username, const char *given_token);
#endif //_AUTH_H
if (as->username[0] == 0 || as->password[0] == 0)
return respond_JSON_Failure(connection);
- if (!auth_login(as->username, as->password))
+ char *token = auth_login(as->username, as->password);
+ if (token == NULL)
return respond_JSON_Failure(connection);
response = MHD_create_response_from_data(strlen(JSON_SUCCESS), JSON_SUCCESS, MHD_NO, MHD_NO);
- char *token = auth_get_token(as->username);
data = malloc(512);
snprintf(data, 512, "auth=%s", token);
MHD_add_response_header(response, "Set-Cookie", data);
struct auth_state *as = (struct auth_state *) *ptr;
- auth_logout(as->username);
+ const char *given_token = MHD_lookup_connection_value(connection, MHD_COOKIE_KIND, "auth");
+ auth_logout(as->username, given_token);
return respond_JSON_Success(connection);
} else if (strncmp(url, "/subscribe", 10) == 0 || strncmp(url, "/unsubscribe", 12) == 0) {
ret = process_and_check_auth(connection, method, upload_data, upload_data_size, ptr);