194 lines
No EOL
5.2 KiB
C
194 lines
No EOL
5.2 KiB
C
// Header
|
|
#include "manager.h"
|
|
|
|
// Functions - Private
|
|
char** split_string(const char* str, char delimiter, int* count) {
|
|
// Calculate how many substrings will be created
|
|
int i, numSubstrings = 1;
|
|
for (i = 0; str[i] != '\0'; i++) {
|
|
if (str[i] == delimiter) {
|
|
numSubstrings++;
|
|
}
|
|
}
|
|
|
|
// Allocate memory for the array of strings
|
|
char** result = malloc(numSubstrings * sizeof(char*));
|
|
*count = numSubstrings;
|
|
|
|
// Split the string
|
|
int start = 0, substringIndex = 0;
|
|
for (i = 0; str[i] != '\0'; i++) {
|
|
if (str[i] == delimiter) {
|
|
int length = i - start;
|
|
result[substringIndex] = malloc((length + 1) * sizeof(char));
|
|
strncpy(result[substringIndex], str + start, length);
|
|
result[substringIndex][length] = '\0';
|
|
start = i + 1;
|
|
substringIndex++;
|
|
}
|
|
}
|
|
// Add the last substring
|
|
int length = i - start;
|
|
result[substringIndex] = malloc((length + 1) * sizeof(char));
|
|
strncpy(result[substringIndex], str + start, length);
|
|
result[substringIndex][length] = '\0';
|
|
|
|
return result;
|
|
}
|
|
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, '|', &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|%s|%s|0", pass->name, pass->user, pass->phrase);
|
|
|
|
// 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|%s|%s|%s|0", result, pass->name, pass->user, pass->phrase);
|
|
|
|
// 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, '|', &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);
|
|
} |