73.9.1. Databáze hesel

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.

$ irb
irb> 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: