|
Packit Service |
584ef9 |
/* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
Packit Service |
584ef9 |
#include <stdio.h>
|
|
Packit Service |
584ef9 |
#include <stdlib.h>
|
|
Packit Service |
584ef9 |
#include <stdbool.h>
|
|
Packit Service |
584ef9 |
#include <string.h>
|
|
Packit Service |
584ef9 |
#include <sys/types.h>
|
|
Packit Service |
584ef9 |
#include <sys/stat.h>
|
|
Packit Service |
584ef9 |
#include <unistd.h>
|
|
Packit Service |
584ef9 |
#include <inttypes.h>
|
|
Packit Service |
584ef9 |
|
|
Packit Service |
584ef9 |
#include "authfile.h"
|
|
Packit Service |
584ef9 |
#include "util.h"
|
|
Packit Service |
584ef9 |
|
|
Packit Service |
584ef9 |
// TODO: frontend needs a refactor so this can avoid global objects.
|
|
Packit Service |
584ef9 |
|
|
Packit Service |
584ef9 |
#define MAX_ENTRY_LEN 256
|
|
Packit Service |
584ef9 |
// Not supposed to be a huge database!
|
|
Packit Service |
584ef9 |
#define MAX_ENTRIES 8
|
|
Packit Service |
584ef9 |
|
|
Packit Service |
584ef9 |
typedef struct auth_entry {
|
|
Packit Service |
584ef9 |
char *user;
|
|
Packit Service |
584ef9 |
size_t ulen;
|
|
Packit Service |
584ef9 |
char *pass;
|
|
Packit Service |
584ef9 |
size_t plen;
|
|
Packit Service |
584ef9 |
} auth_t;
|
|
Packit Service |
584ef9 |
|
|
Packit Service |
584ef9 |
auth_t main_auth_entries[MAX_ENTRIES];
|
|
Packit Service |
584ef9 |
int entry_cnt = 0;
|
|
Packit Service |
584ef9 |
char *main_auth_data = NULL;
|
|
Packit Service |
584ef9 |
|
|
Packit Service |
584ef9 |
enum authfile_ret authfile_load(const char *file) {
|
|
Packit Service |
584ef9 |
struct stat sb;
|
|
Packit Service |
584ef9 |
char *auth_data = NULL;
|
|
Packit Service |
584ef9 |
auth_t auth_entries[MAX_ENTRIES];
|
|
Packit Service |
584ef9 |
|
|
Packit Service |
584ef9 |
if (stat(file, &sb) == -1) {
|
|
Packit Service |
584ef9 |
return AUTHFILE_MISSING;
|
|
Packit Service |
584ef9 |
}
|
|
Packit Service |
584ef9 |
|
|
Packit Service |
584ef9 |
auth_data = calloc(1, sb.st_size);
|
|
Packit Service |
584ef9 |
|
|
Packit Service |
584ef9 |
if (auth_data == NULL) {
|
|
Packit Service |
584ef9 |
return AUTHFILE_OOM;
|
|
Packit Service |
584ef9 |
}
|
|
Packit Service |
584ef9 |
|
|
Packit Service |
584ef9 |
FILE *pwfile = fopen(file, "r");
|
|
Packit Service |
584ef9 |
if (pwfile == NULL) {
|
|
Packit Service |
584ef9 |
// not strictly necessary but to be safe.
|
|
Packit Service |
584ef9 |
free(auth_data);
|
|
Packit Service |
584ef9 |
return AUTHFILE_OPENFAIL;
|
|
Packit Service |
584ef9 |
}
|
|
Packit Service |
584ef9 |
|
|
Packit Service |
584ef9 |
char *auth_cur = auth_data;
|
|
Packit Service |
584ef9 |
auth_t *entry_cur = auth_entries;
|
|
Packit Service |
584ef9 |
int used = 0;
|
|
Packit Service |
584ef9 |
|
|
Packit Service |
584ef9 |
while ((fgets(auth_cur, MAX_ENTRY_LEN, pwfile)) != NULL) {
|
|
Packit Service |
584ef9 |
int x;
|
|
Packit Service |
584ef9 |
int found = 0;
|
|
Packit Service |
584ef9 |
|
|
Packit Service |
584ef9 |
for (x = 0; x < MAX_ENTRY_LEN; x++) {
|
|
Packit Service |
584ef9 |
if (!found && auth_cur[x] == ':') {
|
|
Packit Service |
584ef9 |
entry_cur->user = auth_cur;
|
|
Packit Service |
584ef9 |
entry_cur->ulen = x;
|
|
Packit Service |
584ef9 |
entry_cur->pass = &auth_cur[x+1];
|
|
Packit Service |
584ef9 |
found = 1;
|
|
Packit Service |
584ef9 |
} else if (found) {
|
|
Packit Service |
584ef9 |
// Find end of password.
|
|
Packit Service |
584ef9 |
if (auth_cur[x] == '\n' ||
|
|
Packit Service |
584ef9 |
auth_cur[x] == '\r' ||
|
|
Packit Service |
584ef9 |
auth_cur[x] == '\0') {
|
|
Packit Service |
584ef9 |
entry_cur->plen = x - (entry_cur->ulen + 1);
|
|
Packit Service |
584ef9 |
break;
|
|
Packit Service |
584ef9 |
}
|
|
Packit Service |
584ef9 |
}
|
|
Packit Service |
584ef9 |
}
|
|
Packit Service |
584ef9 |
|
|
Packit Service |
584ef9 |
// malformed line.
|
|
Packit Service |
584ef9 |
if (!found) {
|
|
Packit Service |
584ef9 |
(void)fclose(pwfile);
|
|
Packit Service |
584ef9 |
free(auth_data);
|
|
Packit Service |
584ef9 |
return AUTHFILE_MALFORMED;
|
|
Packit Service |
584ef9 |
}
|
|
Packit Service |
584ef9 |
|
|
Packit Service |
584ef9 |
// FIXME: no silent truncation.
|
|
Packit Service |
584ef9 |
if (++used == MAX_ENTRIES) {
|
|
Packit Service |
584ef9 |
break;
|
|
Packit Service |
584ef9 |
}
|
|
Packit Service |
584ef9 |
// EOF
|
|
Packit Service |
584ef9 |
if (auth_cur[x] == '\0')
|
|
Packit Service |
584ef9 |
break;
|
|
Packit Service |
584ef9 |
|
|
Packit Service |
584ef9 |
auth_cur += x;
|
|
Packit Service |
584ef9 |
entry_cur++;
|
|
Packit Service |
584ef9 |
}
|
|
Packit Service |
584ef9 |
|
|
Packit Service |
584ef9 |
// swap the main pointer out now, so if there's an error reloading we
|
|
Packit Service |
584ef9 |
// don't break the existing authentication.
|
|
Packit Service |
584ef9 |
if (main_auth_data != NULL) {
|
|
Packit Service |
584ef9 |
free(main_auth_data);
|
|
Packit Service |
584ef9 |
}
|
|
Packit Service |
584ef9 |
|
|
Packit Service |
584ef9 |
entry_cnt = used;
|
|
Packit Service |
584ef9 |
main_auth_data = auth_data;
|
|
Packit Service |
584ef9 |
memcpy(main_auth_entries, auth_entries, sizeof(auth_entries));
|
|
Packit Service |
584ef9 |
|
|
Packit Service |
584ef9 |
(void)fclose(pwfile);
|
|
Packit Service |
584ef9 |
|
|
Packit Service |
584ef9 |
return AUTHFILE_OK;
|
|
Packit Service |
584ef9 |
}
|
|
Packit Service |
584ef9 |
|
|
Packit Service |
584ef9 |
// if only loading the file could be this short...
|
|
Packit Service |
584ef9 |
int authfile_check(const char *user, const char *pass) {
|
|
Packit Service |
584ef9 |
size_t ulen = strlen(user);
|
|
Packit Service |
584ef9 |
size_t plen = strlen(pass);
|
|
Packit Service |
584ef9 |
|
|
Packit Service |
584ef9 |
for (int x = 0; x < entry_cnt; x++) {
|
|
Packit Service |
584ef9 |
auth_t *e = &main_auth_entries[x];
|
|
Packit Service |
584ef9 |
if (ulen == e->ulen && plen == e->plen &&
|
|
Packit Service |
584ef9 |
safe_memcmp(user, e->user, e->ulen) &&
|
|
Packit Service |
584ef9 |
safe_memcmp(pass, e->pass, e->plen)) {
|
|
Packit Service |
584ef9 |
return 1;
|
|
Packit Service |
584ef9 |
}
|
|
Packit Service |
584ef9 |
}
|
|
Packit Service |
584ef9 |
|
|
Packit Service |
584ef9 |
return 0;
|
|
Packit Service |
584ef9 |
}
|