· 4 years ago · Jul 21, 2021, 06:14 PM
1#include <stdio.h>
2#include <sqlite3.h>
3#include <unistd.h>
4#include <stdlib.h>
5#include <string.h>
6#include <pwd.h>
7#define MAX_STR_LEN 30
8
9int main(int argc, char* argv[]){
10 char* ops = "vi";
11 char op = getopt(argc, argv, ops);
12 if(op == 'v'){
13 fprintf(stdout, "Version 0.1.0\n");
14 return 0;
15 }
16 if(op == 'i'){
17 fprintf(stdout, "Developed by Yianni Kiritsis for CS50 final project\nFor information on how to use this manager, go to INSERT GITHUB LINK HERE\n");
18 return 0;
19 }
20 if(op == '?'){
21 fprintf(stderr, "Try running ./passwords -i for more information\n");
22 return 1;
23 }
24
25 sqlite3* pass_data;
26 sqlite3_stmt* pass_stmt;
27 const char* pass_tail;
28 char* pass_err;
29
30 if(sqlite3_open("database.db", &pass_data)){
31 fprintf(stderr, "Could not open the .db file\n");
32 return 1;
33 }
34
35 if(sqlite3_exec(pass_data, "CREATE TABLE IF NOT EXISTS password(pass TEXT NOT NULL);", NULL, NULL, &pass_err)){
36 fprintf(stderr, "ERROR: %s\n", pass_err);
37 return 1;
38 }
39
40 uid_t uid = getuid();
41 struct passwd *id = getpwuid(uid);
42 char usrpass[MAX_STR_LEN];
43
44 char* first_query = sqlite3_mprintf("SELECT pass FROM password LIMIT 1;");
45 if(sqlite3_prepare_v2(pass_data, first_query, 128, &pass_stmt, &pass_tail) != SQLITE_OK){
46 fprintf(stderr, "ERROR: %s\n", pass_err);
47 return 1;
48 }
49
50 while((sqlite3_step(pass_stmt)) == SQLITE_ROW)
51 strcpy(usrpass, sqlite3_column_text (pass_stmt, 0));
52 char* enteredpass;
53
54 do{
55 fprintf(stdout, "Hello, %s. Enter password to access: ", id->pw_name);
56 enteredpass = getpass("");
57 }while(strcmp(enteredpass, usrpass) != 0);
58
59 if(sqlite3_exec(pass_data, "CREATE TABLE IF NOT EXISTS passwords(username TEXT NOT NULL, password TEXT NOT NULL, email TEXT NOT NULL, website TEXT NOT NULL);", NULL, NULL, &pass_err)){
60 fprintf(stderr, "ERROR: %s\n", pass_err);
61 return 1;
62 }
63
64 int choice;
65 while(1){
66 do{
67 fprintf(stdout, "================MENU================\n1) Create new password\n2) Find all sites and apps connected to an email\n3) Find a password for a site or app\n4) Change program password\n5)Exit\n====================================\n");
68 fscanf(stdin, "%i", &choice);
69 if(choice < 1 || choice > 5){
70 fprintf(stdout, "Invalid selection\n");
71 }
72 }while(choice < 1 || choice > 5);
73
74 if(choice == 1){
75 char username[MAX_STR_LEN];
76 char password[MAX_STR_LEN];
77 char email[MAX_STR_LEN];
78 char website[MAX_STR_LEN];
79
80 fprintf(stdout, "Provide username\n");
81 fscanf(stdin, "%30s", username);
82
83 fprintf(stdout, "Provide password\n");
84 fscanf(stdin, "%30s", password);
85
86 fprintf(stdout, "Provide email\n");
87 fscanf(stdin, "%30s", email);
88
89 fprintf(stdout, "Provide website/application\n");
90 fscanf(stdin, "%30s", website);
91
92 char* query = sqlite3_mprintf("INSERT INTO passwords(username, password, email, website) VALUES('%s', '%s', '%s', '%s');", username, password, email, website);
93
94 if(sqlite3_exec(pass_data, query, NULL, NULL, &pass_err)){
95 fprintf(stderr, "ERROR: %s\n", pass_err);
96 return 1;
97 }
98 }
99
100 if(choice == 2){
101 char email[MAX_STR_LEN];
102 fprintf(stdout, "Provide email\n");
103 fscanf(stdin, "%30s", email);
104
105 char* query = sqlite3_mprintf("SELECT username, password, email, website FROM passwords WHERE email = '%s' ORDER BY username ASC;", email);
106
107 if(sqlite3_prepare_v2(pass_data, query, 128, &pass_stmt, &pass_tail) != SQLITE_OK){
108 fprintf(stderr, "ERROR: %s\n", pass_err);
109 return 1;
110 }
111
112 while((sqlite3_step(pass_stmt)) == SQLITE_ROW){
113 fprintf(stdout, "\nUsername: %s", sqlite3_column_text (pass_stmt, 0));
114 fprintf(stdout, "\nPassword: %s", sqlite3_column_text (pass_stmt, 1));
115 fprintf(stdout, "\nEmail: %s", sqlite3_column_text (pass_stmt, 2));
116 fprintf(stdout, "\nWebsite: %s", sqlite3_column_text (pass_stmt, 3));
117 fprintf(stdout, "\n");
118 }
119 fprintf(stdout, "\n");
120 }
121
122 if(choice == 3){
123 char website[MAX_STR_LEN];
124 fprintf(stdout, "Provide website\n");
125 fscanf(stdin, "%30s", website);
126
127 char* query = sqlite3_mprintf("SELECT username, password, email, website FROM passwords WHERE website = '%s' ORDER BY username ASC;", website);
128
129 if(sqlite3_prepare_v2(pass_data, query, 128, &pass_stmt, &pass_tail) != SQLITE_OK){
130 fprintf(stderr, "ERROR: %s\n", pass_err);
131 return 1;
132 }
133
134 while((sqlite3_step(pass_stmt)) == SQLITE_ROW){
135 fprintf(stdout, "\nUsername: %s", sqlite3_column_text(pass_stmt, 0));
136 fprintf(stdout, "\nPassword: %s", sqlite3_column_text(pass_stmt, 1));
137 fprintf(stdout, "\nEmail: %s", sqlite3_column_text(pass_stmt, 2));
138 fprintf(stdout, "\nWebsite: %s", sqlite3_column_text(pass_stmt, 3));
139 fprintf(stdout, "\n");
140 }
141 fprintf(stdout, "\n");
142 }
143 if(choice == 4){
144 char newpass[MAX_STR_LEN];
145 fprintf(stdout, "Provide new password\n");
146 fscanf(stdin, "%30s", newpass);
147
148 if(sqlite3_exec(pass_data, "DELETE FROM password;", NULL, NULL, &pass_err)){
149 fprintf(stderr, "ERROR: %s\n", pass_err);
150 return 1;
151 }
152
153 char* query = sqlite3_mprintf("INSERT INTO password(pass) VALUES('%s');", newpass);
154
155 if(sqlite3_exec(pass_data, query, NULL, NULL, &pass_err)){
156 fprintf(stderr, "ERROR: %s\n", pass_err);
157 return 1;
158 }else{
159 fprintf(stdout, "Your new password is: %s\n", newpass);
160 }
161 }
162 if(choice == 5){
163 fprintf(stdout, "So long, partner\n");
164 break;
165 }
166 }
167
168 sqlite3_finalize(pass_stmt);
169 sqlite3_close(pass_data);
170}