2 * Copyright (C) 2007 Martin Willi
3 * 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
{
41 * Implementation of storage_t.login.
43 static int login(private_storage_t
*this, char *username
, char *password
)
46 chunk_t hash
, data
, hex_str
;
47 size_t username_len
, password_len
;
49 enumerator_t
*enumerator
;
51 /* hash = SHA1( username | password ) */
52 hasher
= lib
->crypto
->create_hasher(lib
->crypto
, HASH_SHA1
);
57 hash
= chunk_alloca(hasher
->get_hash_size(hasher
));
58 username_len
= strlen(username
);
59 password_len
= strlen(password
);
60 data
= chunk_alloca(username_len
+ password_len
);
61 memcpy(data
.ptr
, username
, username_len
);
62 memcpy(data
.ptr
+ username_len
, password
, password_len
);
63 hasher
->get_hash(hasher
, data
, hash
.ptr
);
64 hasher
->destroy(hasher
);
65 hex_str
= chunk_to_hex(hash
, NULL
, FALSE
);
67 enumerator
= this->db
->query(this->db
,
68 "SELECT oid FROM users WHERE username = ? AND password = ?;",
69 DB_TEXT
, username
, DB_TEXT
, hex_str
.ptr
,
73 enumerator
->enumerate(enumerator
, &uid
);
74 enumerator
->destroy(enumerator
);
81 * Implementation of storage_t.create_gateway_enumerator.
83 static enumerator_t
* create_gateway_enumerator(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();
100 * Implementation of storage_t.destroy
102 static void destroy(private_storage_t
*this)
104 this->db
->destroy(this->db
);
111 storage_t
*storage_create(char *uri
)
113 private_storage_t
*this = malloc_thing(private_storage_t
);
115 this->public.login
= (int(*)(storage_t
*, char *username
, char *password
))login
;
116 this->public.create_gateway_enumerator
= (enumerator_t
*(*)(storage_t
*,int))create_gateway_enumerator
;
117 this->public.destroy
= (void(*)(storage_t
*))destroy
;
119 this->db
= lib
->db
->create(lib
->db
, uri
);
120 if (this->db
== NULL
)
125 return &this->public;