summaryrefslogtreecommitdiffstats
path: root/source/lib/smbd_creds_db.c
blob: 8156dec0965aeedf7ff1e6779fa62807cc386172 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include "includes.h"

extern int DEBUGLEVEL;

static TDB_CONTEXT *db = NULL;

static char *make_creds_key(uint32 pid, uint16 vuid, int *klen)
{
	char *k;

	(*klen) = sizeof(pid) + sizeof(vuid);
	k = malloc((*klen) * sizeof(char));

	if (k != NULL)
	{
		*((uint32*)k) = pid;
		*((uint16*)(k+sizeof(pid))) = vuid;

		DEBUG(10,("make_creds_key: pid: %x vuid %x\n",
		           pid, vuid));
		dump_data(10, k, (*klen));
	}

	return k;
}

BOOL smbd_cred_get(uint32 pid, uint16 vuid, struct smbd_creds *dc)
{
	int klen;
	char *k;
	TDB_DATA key, data;

	DEBUG(10,("smbd_cred_get:\n"));

	k = make_creds_key(pid, vuid, &klen);

	if (k == NULL) return False;

	key.dptr  = k;
	key.dsize = klen;

	data = tdb_fetch(db, key);

	free(k);

	if (data.dptr == NULL)
	{
		DEBUG(10,("smbd_cred_get: NULL data\n"));
		return False;
	}
	if (data.dsize != sizeof(*dc))
	{
		DEBUG(10,("smbd_cred_get: data size mismatch\n"));
		free(data.dptr);
		return False;
	}

	memcpy(dc, data.dptr, sizeof(*dc));
	free(data.dptr);

	dump_data(100, (char*)dc, sizeof(*dc));
	return True;
}

BOOL smbd_cred_store(uint32 pid, uint16 vuid, struct smbd_creds *dc)
{
	int klen;
	char *k;
	TDB_DATA key, data;
	BOOL ret;

	DEBUG(10,("smbd_cred_store:\n"));

	k = make_creds_key(pid, vuid, &klen);

	if (k == NULL) return False;

	key.dptr  = k;
	key.dsize = klen;

	data.dptr  = (char*)dc;
	data.dsize = sizeof(*dc);

	ret = (tdb_store(db, key, data, TDB_REPLACE) == 0);

	free(k);

	dump_data(100, (char*)dc, sizeof(*dc));

	return ret;
}

BOOL smbd_cred_init_db(void)
{
	db = tdb_open(lock_path("smbdcreds.tdb"), 0, 0, 
		      O_RDWR | O_CREAT, 0600);

	if (db == NULL)
	{
		DEBUG(0,("smbd_cred_init_db: failed\n"));
		return False;
	}
	
	DEBUG(10,("smbd_cred_init_db: opened\n"));

	return True;
}