2 * Copyright (C) 2007 Martin Willi
3 * HSR Hochschule fuer Technik Rapperswil
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>.
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
19 #include <crypto/hashers/hasher.h>
22 typedef struct private_storage_t private_storage_t
;
25 * private data of storage
27 struct private_storage_t
{
40 METHOD(storage_t
, login
, int,
41 private_storage_t
*this, char *username
, char *password
)
44 chunk_t hash
, data
, hex_str
;
45 size_t username_len
, password_len
;
47 enumerator_t
*enumerator
;
49 /* hash = SHA1( username | password ) */
50 hasher
= lib
->crypto
->create_hasher(lib
->crypto
, HASH_SHA1
);
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
))
63 hasher
->destroy(hasher
);
66 hasher
->destroy(hasher
);
67 hex_str
= chunk_to_hex(hash
, NULL
, FALSE
);
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
,
75 enumerator
->enumerate(enumerator
, &uid
);
76 enumerator
->destroy(enumerator
);
82 METHOD(storage_t
, create_gateway_enumerator
, enumerator_t
*,
83 private_storage_t
*this, int user
)
85 enumerator_t
*enumerator
;
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 = ?;",
91 DB_INT
, DB_TEXT
, DB_INT
, DB_TEXT
);
94 enumerator
= enumerator_create_empty();
99 METHOD(storage_t
, destroy
, void,
100 private_storage_t
*this)
102 this->db
->destroy(this->db
);
109 storage_t
*storage_create(char *uri
)
111 private_storage_t
*this;
116 .create_gateway_enumerator
= _create_gateway_enumerator
,
119 .db
= lib
->db
->create(lib
->db
, uri
),
121 if (this->db
== NULL
)
126 return &this->public;