u_pwd_init()u_pwd_term()u_pwd_auth_user(g_pwd, const char *usr, const char *pwd)u_pwd_retr(const char *pwd, const char *user, &user_rec)u_pwd_rec_get_opaque(user_rec)Od verze 2.1.0 obsahuje KLone funkce pro práci s databází hesel. Databáze má jednoduchou strukturu.
name:md5hash:rest
Databáze je uložena v souboru, buďto v samotné aplikaci, nebo ji lze přesměrovat na soubor na filesystému. Nejdříve soubor v aplikaci. Funkce pracující s touto databází předpokládají že ji máme otevřenou a proto jim ji musíme připravit. Tak učiníme pomocí hooks kdy zajistíme otevření souboru při spuštění aplikace.
Příklad 73.1. Soubor auth_hooks.c z ukázkové aplikace klapp-auth-simple-1.1.0
#include <klone/klone.h>
#include <u/libu.h>
u_pwd_t *g_pwd = NULL;
static char *embfs_fgets (char *str, int size, void *stream);
int auth_init(void)
{
io_t *pwd_io;
const char *pwd_name = "/etc/passwd";
/*
* dbg_err_if (emb_open(pwd_name, &pwd_io));
* dbg_err_if (u_pwd_init(pwd_io, embfs_fgets, , &g_pwd))
*/
dbg_err_if (u_pwd_init_agnostic(pwd_name, u_md5, MD5_DIGEST_BUFSZ, &g_pwd));
return 0;
err:
return ~0;
}
int auth_term(void)
{
return u_pwd_term(g_pwd);
}
void hooks_setup(void)
{
hook_server_init(auth_init);
hook_server_term(auth_term);
return;
}
static char *embfs_fgets (char *str, int size, void *stream)
{
io_t *io = (io_t *) stream;
dbg_err_if (io_gets(io, str, size) <= 0);
return str;
err:
return NULL;
}K uvedenému souboru který je v samostatném adresáři auth_hooks patří Makefile
# always include common.mk in MaKL-based makefiles include common.mk # include klone-related variables include ../vars.mk # name of the library LIB = auth-hooks # list of source files SRCS = auth_hooks.c # compilation flags CFLAGS += -I ../include $(KLONE_CFLAGS) include lib.mk
Hesla si zahašujeme například pomocí ruby a zapíšeme do souboru.
$irbirb>require 'digest/md5'irb>Digest::MD5.hexdigest('stewy')
if you need to add some "policy" to your master password file you can use the .opaque field of an u_pwd_rec_t, pushing the intended semantics (i.e. time limits, usage counter, bad logins counter, etc.) into it:
user:db33f30c28364cd44195ed6105b82c29:my_policy_attrs
{
…
dbg_err_if(u_pwd_retr(pwd, user, &user_rec));
user_policy_attr = u_pwd_rec_get_opaque(user_rec);
if (check_my_policy(user_policy_attr))
…
}Aby se hooks uplatnili, přidáme do hlavního Makefile řádky
KLONE_CONF_ARGS += --enable_hooks WEBAPP_LDADD = $(CURDIR)/auth-hooks/libauth-hooks.a
První oznamuje, že se mají povolit hooks, druhý pak říká že se má k aplikaci přidat knihovna v níž je soubor auth_hooks.c
Pokud chceme mít soubor s hesly jinde než zakompilovaný do aplikace, provedeme následující úpravy:
Do hlavního Makefile přidáme
KLONE_CONF_ARGS += --enable_sup_fs