Annotation of embedaddon/strongswan/src/manager/storage.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2007 Martin Willi
3: * HSR Hochschule fuer Technik Rapperswil
4: *
5: * This program is free software; you can redistribute it and/or modify it
6: * under the terms of the GNU General Public License as published by the
7: * Free Software Foundation; either version 2 of the License, or (at your
8: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
9: *
10: * This program is distributed in the hope that it will be useful, but
11: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13: * for more details.
14: */
15:
16: #include "storage.h"
17:
18: #include <library.h>
19: #include <crypto/hashers/hasher.h>
20:
21:
22: typedef struct private_storage_t private_storage_t;
23:
24: /**
25: * private data of storage
26: */
27: struct private_storage_t {
28:
29: /**
30: * public functions
31: */
32: storage_t public;
33:
34: /**
35: * database connection
36: */
37: database_t *db;
38: };
39:
40: METHOD(storage_t, login, int,
41: private_storage_t *this, char *username, char *password)
42: {
43: hasher_t *hasher;
44: chunk_t hash, data, hex_str;
45: size_t username_len, password_len;
46: int uid = 0;
47: enumerator_t *enumerator;
48:
49: /* hash = SHA1( username | password ) */
50: hasher = lib->crypto->create_hasher(lib->crypto, HASH_SHA1);
51: if (hasher == NULL)
52: {
53: return 0;
54: }
55: hash = chunk_alloca(hasher->get_hash_size(hasher));
56: username_len = strlen(username);
57: password_len = strlen(password);
58: data = chunk_alloca(username_len + password_len);
59: memcpy(data.ptr, username, username_len);
60: memcpy(data.ptr + username_len, password, password_len);
61: if (!hasher->get_hash(hasher, data, hash.ptr))
62: {
63: hasher->destroy(hasher);
64: return 0;
65: }
66: hasher->destroy(hasher);
67: hex_str = chunk_to_hex(hash, NULL, FALSE);
68:
69: enumerator = this->db->query(this->db,
70: "SELECT oid FROM users WHERE username = ? AND password = ?;",
71: DB_TEXT, username, DB_TEXT, hex_str.ptr,
72: DB_INT);
73: if (enumerator)
74: {
75: enumerator->enumerate(enumerator, &uid);
76: enumerator->destroy(enumerator);
77: }
78: free(hex_str.ptr);
79: return uid;
80: }
81:
82: METHOD(storage_t, create_gateway_enumerator, enumerator_t*,
83: private_storage_t *this, int user)
84: {
85: enumerator_t *enumerator;
86:
87: enumerator = this->db->query(this->db,
88: "SELECT gateways.oid AS gid, name, port, address FROM "
89: "gateways, user_gateway AS ug ON gid = ug.gateway WHERE ug.user = ?;",
90: DB_INT, user,
91: DB_INT, DB_TEXT, DB_INT, DB_TEXT);
92: if (!enumerator)
93: {
94: enumerator = enumerator_create_empty();
95: }
96: return enumerator;
97: }
98:
99: METHOD(storage_t, destroy, void,
100: private_storage_t *this)
101: {
102: this->db->destroy(this->db);
103: free(this);
104: }
105:
106: /*
107: * see header file
108: */
109: storage_t *storage_create(char *uri)
110: {
111: private_storage_t *this;
112:
113: INIT(this,
114: .public = {
115: .login = _login,
116: .create_gateway_enumerator = _create_gateway_enumerator,
117: .destroy = _destroy,
118: },
119: .db = lib->db->create(lib->db, uri),
120: );
121: if (this->db == NULL)
122: {
123: free(this);
124: return NULL;
125: }
126: return &this->public;
127: }
128:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>