+int authenticate(pam_handle_t* pamh, const char* uuid)
+{
+ char* file_content;
+ struct json_object* database;
+ struct json_object* key;
+
+ file_content = get_file_content(DATABASE_FILE);
+ if (!file_content)
+ {
+ printf("[PAM DEBUG] Failed to read database file (%s)\n", DATABASE_FILE);
+ return PAM_SERVICE_ERR;
+ }
+
+ database = json_tokener_parse(file_content);
+ if (!database)
+ {
+ printf("[PAM DEBUG] Failed to parse the database\n");
+ return PAM_SERVICE_ERR;
+ }
+
+ if (json_object_object_get_ex(database, uuid, &key))
+ {
+ printf("[PAM] Key found!\n");
+ printf("[PAM DEBUG] pam_set_item(\"%s\")\n", uuid);
+ pam_set_item(pamh, PAM_USER, uuid);
+
+ const char* pam_authtok;
+ if (pam_get_item(pamh, PAM_AUTHTOK, (const void**)&pam_authtok) == PAM_SUCCESS && !pam_authtok)
+ pam_set_item(pamh, PAM_AUTHTOK, uuid);
+
+ json_object_put(database);
+ free(file_content);
+ return PAM_SUCCESS;
+ }
+
+ printf("[PAM] Key not found!\n");
+ free(file_content);
+ if (database) json_object_put(database);
+ return PAM_AUTH_ERR;
+}