uhub/src/plugins/mod_auth_simple.c

147 lines
3.4 KiB
C
Raw Normal View History

/*
* uhub - A tiny ADC p2p connection hub
* Copyright (C) 2010, Jan Vidar Krey
*/
#include "plugin_api/handle.h"
#include "util/memory.h"
#include "util/list.h"
#include "util/ipcalc.h"
#include "util/misc.h"
#include "util/log.h"
#include "util/config_token.h"
struct acl_list
{
struct linked_list* users;
};
void insert_user(struct linked_list* users, const char* nick, const char* pass, enum auth_credentials cred)
{
struct auth_info* data = (struct auth_info*) hub_malloc_zero(sizeof(struct auth_info));
strncpy(data->nickname, nick, MAX_NICK_LEN);
strncpy(data->password, pass, MAX_PASS_LEN);
data->credentials = cred;
list_append(users, data);
}
static int parse_line(char* line, int line_count, void* ptr_data)
{
struct linked_list* users = (struct linked_list*) ptr_data;
struct cfg_tokens* tokens = cfg_tokenize(line);
enum auth_credentials cred;
if (cfg_token_count(tokens) == 0)
return 0;
if (cfg_token_count(tokens) < 2)
return -1;
char* credential = cfg_token_get_first(tokens);
char* username = cfg_token_get_next(tokens);
char* password = cfg_token_get_next(tokens);
if (strcmp(credential, "admin")) cred = auth_cred_admin;
else if (strcmp(credential, "super")) cred = auth_cred_super;
else if (strcmp(credential, "op")) cred = auth_cred_operator;
else if (strcmp(credential, "reg")) cred = auth_cred_user;
else
return -1;
insert_user(users, username, password, cred);
cfg_tokens_free(tokens);
return 0;
}
static struct acl_list* load_acl(const char* filename, struct uhub_plugin_handle* handle)
{
struct acl_list* list = (struct acl_list*) hub_malloc(sizeof(struct acl_list));
struct linked_list* users = list_create();
if (!list || !users || !filename || !*filename)
{
list_destroy(users);
hub_free(list);
return 0;
}
if (users)
{
if (file_read_lines(filename, users, &parse_line) == -1)
{
fprintf(stderr, "Unable to load %s\n", filename);
}
}
list->users = users;
return list;
}
static void unload_acl(struct acl_list* list)
{
if (!list)
return;
list_clear(list->users, hub_free);
list_destroy(list->users);
hub_free(list);
}
static int get_user(const char* nickname, struct auth_info* info)
{
return 0;
}
static plugin_st register_user(struct auth_info* user)
{
/* Read only mode - so rejected */
return st_deny;
}
static plugin_st update_user(struct auth_info* user)
{
/* Read only mode - so rejected */
return st_deny;
}
static plugin_st delete_user(struct auth_info* user)
{
/* Read only mode - so rejected */
return st_deny;
}
static void set_error_message(struct uhub_plugin_handle* plugin, const char* msg)
{
// if (plugin->error_msg)
// hub_free(plugin->error_msg);
plugin->error_msg = msg;
}
int plugin_register(struct uhub_plugin_handle* plugin, const char* config)
{
plugin->name = "File authentication plugin";
plugin->version = "0.1";
plugin->description = "Authenticated users based on a read-only text file.";
plugin->plugin_api_version = PLUGIN_API_VERSION;
plugin->plugin_funcs_size = sizeof(struct plugin_funcs);
memset(&plugin->funcs, 0, sizeof(struct plugin_funcs));
// Authentication actions.
plugin->funcs.auth_get_user = get_user;
plugin->funcs.auth_register_user = register_user;
plugin->funcs.auth_update_user = update_user;
plugin->funcs.auth_delete_user = delete_user;
plugin->ptr = load_acl(config, plugin);
return 0;
}
int plugin_unregister(struct uhub_plugin_handle* plugin)
{
set_error_message(plugin, 0);
unload_acl(plugin->ptr);
return 0;
}