Make the cache less broken, not working yet.
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@22813 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -59,10 +59,11 @@ typedef struct krb5_scache {
|
|||||||
|
|
||||||
#define DEFAULT_SCACHE "/tmp/scache-foo" /* XXX */
|
#define DEFAULT_SCACHE "/tmp/scache-foo" /* XXX */
|
||||||
|
|
||||||
#define SCACHE_STRINIFY(x) #x
|
#define SCACHE_STRING(x) #x
|
||||||
|
#define SCACHE_XSTRING(x) SCACHE_STRING(x)
|
||||||
|
|
||||||
#define SCACHE_DEF_CID 0
|
#define SCACHE_DEF_CID 0
|
||||||
#define SCACHE_DEF_CID_NAME SCACHE_STRINIFY(SCACHE_DEF_CID)
|
#define SCACHE_DEF_CID_NAME SCACHE_XSTRING(SCACHE_DEF_CID)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
@@ -88,7 +89,7 @@ typedef struct krb5_scache {
|
|||||||
|
|
||||||
#define SQL_CCREDS "" \
|
#define SQL_CCREDS "" \
|
||||||
"CREATE TABLE credentials (" \
|
"CREATE TABLE credentials (" \
|
||||||
"cid INTEGER NOT NULL" \
|
"cid INTEGER NOT NULL," \
|
||||||
"kvno INTEGER NOT NULL," \
|
"kvno INTEGER NOT NULL," \
|
||||||
"etype INTEGER NOT NULL," \
|
"etype INTEGER NOT NULL," \
|
||||||
"cred BLOB NOT NULL" \
|
"cred BLOB NOT NULL" \
|
||||||
@@ -121,8 +122,8 @@ free_krb5(void *str)
|
|||||||
krb5_xfree(str);
|
krb5_xfree(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static const char*
|
static const char*
|
||||||
@@ -152,18 +153,10 @@ scc_alloc(const char *name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static krb5_error_code
|
static krb5_error_code
|
||||||
make_database(krb5_context context, krb5_scache *s, int create)
|
open_database(krb5_context context, krb5_scache *s, int flags)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
int flags = SQLITE_OPEN_READWRITE;
|
ret = sqlite3_open_v2(s->file, &s->db, SQLITE_OPEN_READWRITE|flags, NULL);
|
||||||
|
|
||||||
if (s->db)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (create)
|
|
||||||
flags |= SQLITE_OPEN_CREATE;
|
|
||||||
|
|
||||||
ret = sqlite3_open_v2(s->file, &s->db, flags, NULL);
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
if (s->db) {
|
if (s->db) {
|
||||||
krb5_set_error_string(context, "Error opening scache file %s: %s",
|
krb5_set_error_string(context, "Error opening scache file %s: %s",
|
||||||
@@ -174,25 +167,68 @@ make_database(krb5_context context, krb5_scache *s, int create)
|
|||||||
krb5_set_error_string(context, "out of memory");
|
krb5_set_error_string(context, "out of memory");
|
||||||
return ENOENT;
|
return ENOENT;
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
sqlite3_prepare_v2(s->db, SQL_ICRED, -1, &s->icred, NULL);
|
static krb5_error_code
|
||||||
sqlite3_prepare_v2(s->db, SQL_IPRINCIPAL, -1, &s->iprincipal, NULL);
|
make_database(krb5_context context, krb5_scache *s, int create)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
sqlite3_prepare_v2(s->db, SQL_ICACHE, -1, &s->icache, NULL);
|
if (s->db)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
ret = open_database(context, s, 0);
|
||||||
|
if (ret) {
|
||||||
|
ret = open_database(context, s, SQLITE_OPEN_CREATE);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
sqlite3_exec(s->db, SQL_CMASTER, NULL, NULL, NULL);
|
||||||
|
sqlite3_exec(s->db, SQL_CCACHE, NULL, NULL, NULL);
|
||||||
|
ret = sqlite3_exec(s->db, SQL_CCREDS, NULL, NULL, NULL);
|
||||||
|
if (ret != SQLITE_OK) {
|
||||||
|
krb5_set_error_string(context, "Failed to create table creds: %s",
|
||||||
|
sqlite3_errmsg(s->db));
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
sqlite3_exec(s->db, SQL_CPRINCIPALS, NULL, NULL, NULL);
|
||||||
|
|
||||||
|
sqlite3_exec(s->db, SQL_SETUP_MASTER, NULL, NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = sqlite3_prepare_v2(s->db, SQL_ICRED, -1, &s->icred, NULL);
|
||||||
|
if (ret != SQLITE_OK) {
|
||||||
|
krb5_set_error_string(context, "Failed to create icred: %s",
|
||||||
|
sqlite3_errmsg(s->db));
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
ret = sqlite3_prepare_v2(s->db, SQL_IPRINCIPAL, -1, &s->iprincipal, NULL);
|
||||||
|
if (ret != SQLITE_OK) {
|
||||||
|
krb5_set_error_string(context, "Failed to create iprincipal: %s",
|
||||||
|
sqlite3_errmsg(s->db));
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = sqlite3_prepare_v2(s->db, SQL_ICACHE, -1, &s->icache, NULL);
|
||||||
|
if (ret != SQLITE_OK) {
|
||||||
|
krb5_set_error_string(context, "Failed to create icache: %s",
|
||||||
|
sqlite3_errmsg(s->db));
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
sqlite3_prepare_v2(s->db, SQL_UCACHE_PRINCIPAL, -1, &s->ucachep, NULL);
|
sqlite3_prepare_v2(s->db, SQL_UCACHE_PRINCIPAL, -1, &s->ucachep, NULL);
|
||||||
sqlite3_prepare_v2(s->db, SQL_SCACHE, -1, &s->scache, NULL);
|
sqlite3_prepare_v2(s->db, SQL_SCACHE, -1, &s->scache, NULL);
|
||||||
|
|
||||||
if (create) {
|
if (create) {
|
||||||
sqlite3_exec(s->db, SQL_CMASTER, NULL, NULL, NULL);
|
/* create inital entry */
|
||||||
sqlite3_exec(s->db, SQL_CCACHE, NULL, NULL, NULL);
|
sqlite3_bind_text(s->icache, 1, s->name, -1, NULL);
|
||||||
sqlite3_exec(s->db, SQL_CCREDS, NULL, NULL, NULL);
|
do {
|
||||||
sqlite3_exec(s->db, SQL_CPRINCIPALS, NULL, NULL, NULL);
|
ret = sqlite3_step(s->icache);
|
||||||
|
} while (ret == SQLITE_ROW);
|
||||||
sqlite3_exec(s->db, SQL_SETUP_MASTER, NULL, NULL, NULL);
|
if (ret != SQLITE_DONE) {
|
||||||
|
krb5_set_error_string(context, "Failed to add scache: %d", ret);
|
||||||
sqlite3_bind_text(s->icache, 1, s->name, -1, free_data);
|
|
||||||
if (sqlite3_step(s->icred) != SQLITE_DONE)
|
|
||||||
goto end;
|
goto end;
|
||||||
|
}
|
||||||
sqlite3_reset(s->icred);
|
sqlite3_reset(s->icred);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -204,17 +240,9 @@ end:
|
|||||||
if (create)
|
if (create)
|
||||||
unlink(s->file);
|
unlink(s->file);
|
||||||
|
|
||||||
krb5_clear_error_string(context);
|
|
||||||
return ENOENT;
|
return ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
create_tabels(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static krb5_error_code
|
static krb5_error_code
|
||||||
scc_resolve(krb5_context context, krb5_ccache *id, const char *res)
|
scc_resolve(krb5_context context, krb5_ccache *id, const char *res)
|
||||||
{
|
{
|
||||||
@@ -232,7 +260,6 @@ scc_resolve(krb5_context context, krb5_ccache *id, const char *res)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static krb5_error_code
|
static krb5_error_code
|
||||||
scc_gen_new(krb5_context context, krb5_ccache *id)
|
scc_gen_new(krb5_context context, krb5_ccache *id)
|
||||||
{
|
{
|
||||||
@@ -244,6 +271,7 @@ scc_gen_new(krb5_context context, krb5_ccache *id)
|
|||||||
krb5_set_error_string (context, "malloc: out of memory");
|
krb5_set_error_string (context, "malloc: out of memory");
|
||||||
return KRB5_CC_NOMEM;
|
return KRB5_CC_NOMEM;
|
||||||
}
|
}
|
||||||
|
s->cid = ++foo;
|
||||||
|
|
||||||
(*id)->data.data = s;
|
(*id)->data.data = s;
|
||||||
(*id)->data.length = sizeof(*s);
|
(*id)->data.length = sizeof(*s);
|
||||||
@@ -276,6 +304,8 @@ scc_initialize(krb5_context context,
|
|||||||
|
|
||||||
sqlite3_reset(s->ucachep);
|
sqlite3_reset(s->ucachep);
|
||||||
|
|
||||||
|
/* XXX delete all entries for this cid, trigger ? */
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -426,22 +456,24 @@ scc_get_principal(krb5_context context,
|
|||||||
|
|
||||||
sqlite3_bind_int(s->scache, 1, s->cid);
|
sqlite3_bind_int(s->scache, 1, s->cid);
|
||||||
|
|
||||||
if (sqlite3_step(s->scache) != SQLITE_DONE) {
|
if (sqlite3_step(s->scache) != SQLITE_ROW) {
|
||||||
sqlite3_reset(s->scache);
|
sqlite3_reset(s->scache);
|
||||||
krb5_clear_error_string(context);
|
krb5_set_error_string(context, "No principal for scache %d", s->cid);
|
||||||
return ENOENT;
|
return ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sqlite3_column_type(s->scache, 2) == SQLITE_TEXT) {
|
if (sqlite3_column_type(s->scache, 2) == SQLITE_TEXT) {
|
||||||
sqlite3_reset(s->scache);
|
sqlite3_reset(s->scache);
|
||||||
krb5_clear_error_string(context);
|
krb5_set_error_string(context, "Principal data of wrong type "
|
||||||
|
"for scache %d", s->cid);
|
||||||
return ENOENT;
|
return ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
str = (const char *)sqlite3_column_text(s->scache, 2);
|
str = (const char *)sqlite3_column_text(s->scache, 2);
|
||||||
if (str == NULL) {
|
if (str == NULL) {
|
||||||
sqlite3_reset(s->scache);
|
sqlite3_reset(s->scache);
|
||||||
krb5_clear_error_string(context);
|
krb5_set_error_string(context, "Principal not set "
|
||||||
|
"for scache %d", s->cid);
|
||||||
return ENOENT;
|
return ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user