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