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; } } }
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); }