Example #1
0
bool client_authenticate(client_t* cli)
{
	_log(LVL_DEBUG, "Asking authentication\n");
	char* auth_tok = datastore_lookup(cli->server->datastore, "DB_ADM.USER.AUTH_HASH");
	if(auth_tok == NULL)
	{
		_log(LVL_WARNING, "Authentication is activated, but no password has been set. Skipping authentication.\n");
		return true;
	}
	else
	{
		_log(LVL_DEBUG, "Stored hash : %s\n", auth_tok);
		char* r = "Authentication needed\r\n";
		_log(LVL_DEBUG, "%s", r);
		send(cli->sock, r, strlen(r), 0);
		//Authenticate user
		char username[32];
		char pass[32];
		char cat[128];
		cat[0] = '\0';
		
		if(read_line(cli->sock, username, 32, false) <= 0)
			return false;
		if(read_line(cli->sock, pass, 32, false) <= 0)
			return false;
		
		strcat(cat, username);
		strcat(cat, ":");
		strcat(cat, pass);
		
		hash_algo_t* algo = crypto_get_hash_algo("sha256");
		char digest_str[algo->digest_str_len];
		crypto_hash_str(algo, cat, strlen(cat), digest_str);
		
		_log(LVL_DEBUG, "Auth token : %s\n", digest_str);
		
		if(!strcmp(digest_str, auth_tok))
		{
			r = "Authentication success\r\n";
			_log(LVL_DEBUG, r);
			send(cli->sock, r, strlen(r), 0);
			return true;
		}
		else
		{
			r = "Authentication failed\r\n";
			_log(LVL_ERROR, r);
			send(cli->sock, r, strlen(r), 0);
			return false;
		}
	}
}
Example #2
0
void do_digest(request_t* req)
{
	//Convert digest algorithm name to lowercase
	int i = 0;
	while(req->argv[0][i] != '\0')
	{
		req->argv[0][i] = tolower((int)req->argv[0][i]);
		i++;
	}
	hash_algo_t* algo = crypto_get_hash_algo(req->argv[0]);
	if(algo == NULL)
	{
		char *error = "Unknown hash algorithm";
		_log(LVL_DEBUG, "%s : %s\n", error, req->argv[0]);
		req->reply.rc = -1;
		req->reply.message = error;
		return;
	}
	char digest_str[algo->digest_str_len];
	crypto_hash_str(algo, req->argv[2], strlen(req->argv[2]), digest_str);
	req->reply.rc = datastore_set(req->client->datastore, req->argv[1], digest_str);
}