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
21 #include <crypto/hashers/hasher.h>
24 typedef struct private_storage_t private_storage_t
;
27 * private data of storage
29 struct private_storage_t
{
43 * Implementation of storage_t.login.
45 static int login(private_storage_t
*this, char *username
, char *password
)
49 size_t username_len
, password_len
;
52 enumerator_t
*enumerator
;
54 /* hash = SHA1( username | password ) */
55 hasher
= lib
->crypto
->create_hasher(lib
->crypto
, HASH_SHA1
);
60 hash
= chunk_alloca(hasher
->get_hash_size(hasher
));
61 username_len
= strlen(username
);
62 password_len
= strlen(password
);
63 data
= chunk_alloca(username_len
+ password_len
);
64 memcpy(data
.ptr
, username
, username_len
);
65 memcpy(data
.ptr
+ username_len
, password
, password_len
);
66 hasher
->get_hash(hasher
, data
, hash
.ptr
);
67 hasher
->destroy(hasher
);
68 str
= chunk_to_hex(hash
, FALSE
);
70 enumerator
= this->db
->query(this->db
,
71 "SELECT oid FROM users WHERE username = ? AND password = ?;",
72 DB_TEXT
, username
, DB_TEXT
, str
,
76 enumerator
->enumerate(enumerator
, &uid
);
77 enumerator
->destroy(enumerator
);
84 * Implementation of storage_t.create_gateway_enumerator.
86 static enumerator_t
* create_gateway_enumerator(private_storage_t
*this, int user
)
88 enumerator_t
*enumerator
;
90 enumerator
= this->db
->query(this->db
,
91 "SELECT gateways.oid AS gid, name, port, address FROM "
92 "gateways, user_gateway AS ug ON gid = ug.gateway WHERE ug.user = ?;",
94 DB_INT
, DB_TEXT
, DB_INT
, DB_TEXT
);
97 enumerator
= enumerator_create_empty();
103 * Implementation of storage_t.destroy
105 static void destroy(private_storage_t
*this)
107 this->db
->destroy(this->db
);
114 storage_t
*storage_create(char *uri
)
116 private_storage_t
*this = malloc_thing(private_storage_t
);
118 this->public.login
= (int(*)(storage_t
*, char *username
, char *password
))login
;
119 this->public.create_gateway_enumerator
= (enumerator_t
*(*)(storage_t
*,int))create_gateway_enumerator
;
120 this->public.destroy
= (void(*)(storage_t
*))destroy
;
122 this->db
= lib
->db
->create(lib
->db
, uri
);
123 if (this->db
== NULL
)
128 return &this->public;