FlippyPass/project/backend/manager.c

168 lines
No EOL
4.3 KiB
C

// Header
#include "manager.h"
// Functions - Private
void manager_loadnames(Manager* manager){
// Loading the names of all passwords
char* data = secure_storage_load(manager->secure_storage, Store_File_Path_Data, "Data");
// Do we not have any passwords?
if (!data) {
// DEBUG
FURI_LOG_D(TAG, "No passwords found.");
// Creating names
manager->names = malloc(sizeof(char*));
// Returning
return;
}
// Splitting string
int count = 0;
char** split = split_string(data, F_DELIMITER, &count);
// Freeing data
free(data);
// Passwords
/*
Doing some risky bitshifting in order to divide by 4
This little ARMv7 processor would hate division
*/
int num_of_passwords = count >> 2;
// Allocating memory for names array
manager->names = malloc(num_of_passwords * sizeof(char*));
// Going through split string
for (int i = 0; i < count; i++) {
// Checking if it's the 4th number
if (i % 4 == 0) {
// Adding it to the array!
manager->names[manager->count] = split[i];
// It's another password!
manager->count++;
}
}
// Cleanup
free(split);
}
// Constructors
Manager* manager_init(char* key) {
// Creating result in memory
Manager* result = malloc(sizeof(Manager));
// Setting variables
result->secure_storage = secure_storage_init(key);
result->count = 0;
// Loading all names on start
manager_loadnames(result);
// Returning manager
return result;
}
// Functions
void manager_savepass(Manager* manager, Password* pass) {
// Our resulting string
char* result = secure_storage_load(manager->secure_storage, Store_File_Path_Data, "Data");
// Is the result empty?
if(!result) {
// Allocating result
FuriString* n_result = furi_string_alloc();
// Setting stuff
furi_string_printf(n_result, "%s%c%s%c%s%c0",
pass->name, F_DELIMITER,
pass->user, F_DELIMITER,
pass->phrase, F_DELIMITER);
// Saving the data
char* data = malloc(sizeof(char) * furi_string_size(n_result));
strcpy(data, furi_string_get_cstr(n_result));
secure_storage_save(manager->secure_storage, Store_File_Path_Data, "Data", data);
// Cleanup
furi_string_free(n_result);
free(data);
} else {
// New result
FuriString* new_result = furi_string_alloc();
// Appending addon to result
furi_string_printf(new_result, "%s%c%s%c%s%c%s%c0",
result, F_DELIMITER,
pass->name, F_DELIMITER,
pass->user, F_DELIMITER,
pass->phrase, F_DELIMITER);
// Saving the data
char* data = malloc(sizeof(char) * furi_string_size(new_result));
strcpy(data, furi_string_get_cstr(new_result));
secure_storage_save(manager->secure_storage, Store_File_Path_Data, "Data", data);
// Cleanup
furi_string_free(new_result);
free(result);
free(data);
}
// Freeing password
pass_free(pass);
}
void manager_loadpass(Manager* manager, char* name) {
// Freeing previous password
if (manager->current != NULL) {
free(manager->current);
}
// DEBUG
FURI_LOG_D(TAG, "Loading password of name %s", name);
// Loading password string
char* data = secure_storage_load(manager->secure_storage, Store_File_Path_Data, "Data");
// Splitting string
int count = 0;
char** split = split_string(data, F_DELIMITER, &count);
// Unloading data
free(data);
// Going through string to grab data
for(int i = 0; i < count; i++) {
// Is it a multiple of four?
if (i % 4 == 0) {
// Does the password name match?
if (!strcmp(name, split[i])) {
// Setting the new current password
manager->current = pass_init(
name,
split[i+1],
split[i+2],
0);
// Break!
break;
}
}
}
// Cleanup
free(split);
}
void manager_free(Manager* manager) {
for(int i = 0; i < manager->count; i++) {
free(manager->names[i]);
}
free(manager->current);
free(manager->new);
free(manager);
}