Skip to content

Commit 5560ec7

Browse files
author
replydev
committed
Error handling, and fix database overwrite flaw
1 parent 8f49760 commit 5560ec7

File tree

3 files changed

+53
-28
lines changed

3 files changed

+53
-28
lines changed

src/argument_functions.rs

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,9 @@ pub fn import(args: Vec<String>){
4444

4545
pub fn add(args: Vec<String>){
4646
if args.len() == 5{
47-
if database_loader::add_element(&args[2],&args[3],&args[4]){
48-
println!("Success");
49-
}
50-
else{
51-
println!("Invalid values");
47+
match database_loader::add_element(&args[2],&args[3],&args[4]){
48+
Ok(()) => println!("Success"),
49+
Err(e) => println!("An error occurred: {}",e)
5250
}
5351
}
5452
else{
@@ -59,11 +57,10 @@ pub fn add(args: Vec<String>){
5957
pub fn remove(args: Vec<String>){
6058
if args.len() == 3{
6159
let id = args[2].parse::<usize>().unwrap();
62-
if database_loader::remove_element_from_db(id) {
63-
println!("ok");
64-
}
65-
else{
66-
println!("{} is a wrong index", id);
60+
61+
match database_loader::remove_element_from_db(id){
62+
Ok(()) => println!("Success"),
63+
Err(e) => println!("An error has occurred: {}",e)
6764
}
6865
}
6966
else{
@@ -103,7 +100,7 @@ pub fn export(args: Vec<String>){
103100

104101
pub fn json(args: Vec<String>){
105102
if args.len() == 2{
106-
println!("{}",otp_helper::get_json_results())
103+
println!("{}",otp_helper::get_json_results().expect("Failed to get json results"));
107104
}
108105
else{
109106
println!("Invalid argument, type cotp --json");

src/database_loader.rs

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -66,18 +66,18 @@ impl OTPElement {
6666
}
6767
}
6868

69-
pub fn read_from_file() -> Vec<OTPElement>{
69+
pub fn read_from_file() -> Result<Vec<OTPElement>,String>{
7070
let mut encrypted_contents = read_to_string(&get_db_path()).unwrap();
7171
//rust close files at the end of the function
7272
let contents = cryptograpy::decrypt_string(&mut encrypted_contents, &cryptograpy::prompt_for_passwords("Password: "));
7373
match contents {
7474
Ok(contents) => {
7575
let vector: Vec<OTPElement> = serde_json::from_str(&contents).unwrap();
76-
return vector;
76+
return Ok(vector);
7777
},
7878
Err(e) => {
7979
println!("{}", e);
80-
return Vec::new();
80+
return Err(String::from("Cannot decrypt existing database"));
8181
}
8282
}
8383
}
@@ -88,28 +88,39 @@ pub fn check_secret(secret: &str) -> bool{
8888
return upper_secret.chars().all(char::is_alphanumeric);
8989
}
9090

91-
pub fn add_element(secret: &String,issuer: &String,label: &String) -> bool{
91+
pub fn add_element(secret: &String,issuer: &String,label: &String) -> Result<(),String>{
9292
if !check_secret(&secret){
93-
return false;
93+
return Err(String::from("Bad secret"))
9494
}
9595
let otp_element = OTPElement::new(secret.to_string(), issuer.to_string(), label.to_string(),6, String::from("TOTP"), String::from("SHA1"),String::from("Default"),0,0,30,vec![]);
96-
let mut elements = read_from_file();
96+
let mut elements;
97+
match read_from_file(){
98+
Ok(result) => elements = result,
99+
Err(e) => return Err(e)
100+
}
97101
elements.push(otp_element);
98102
overwrite_database(elements);
99-
true
103+
Ok(())
100104
}
101105

102-
pub fn remove_element_from_db(mut id: usize) -> bool{
106+
pub fn remove_element_from_db(mut id: usize) -> Result<(),String>{
103107
if id == 0{
104-
return false;
108+
return Err(String::from("0 is a bad index"));
105109
}
106110
//user inserts numbers starting from 1, so we will decrement the value becouse we use array indexes instead
107111
id -= 1;
108112

109-
let mut elements: Vec<OTPElement> = read_from_file();
113+
let mut elements: Vec<OTPElement>;
114+
115+
match read_from_file(){
116+
Ok(result) => elements = result,
117+
Err(e) => {
118+
return Err(e);
119+
}
120+
}
110121

111122
if id >= elements.len(){
112-
return false;
123+
return Err(format!("{} is a bad index",id+1));
113124
}
114125

115126
for i in 0..elements.len(){
@@ -119,15 +130,21 @@ pub fn remove_element_from_db(mut id: usize) -> bool{
119130
}
120131
}
121132
overwrite_database(elements);
122-
true
133+
Ok(())
123134
}
124135

125136
pub fn edit_element(mut id: usize, secret: &str,issuer: &str,label: &str) -> Result<(), String> {
126137
if id == 0{
127138
return Err(String::from("Invalid element"));
128139
}
129140
id -= 1;
130-
let mut elements: Vec<OTPElement> = read_from_file();
141+
142+
let mut elements: Vec<OTPElement>;
143+
match read_from_file(){
144+
Ok(result) => elements = result,
145+
Err(e) => return Err(String::from("Cannot decrypt existing database"))
146+
}
147+
131148

132149
if id >= elements.len() {
133150
return Err(String::from("Invalid element"));

src/otp_helper.rs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,14 @@ impl JsonResult {
2323
}
2424

2525
pub fn show_codes(){
26-
let elements: Vec<database_loader::OTPElement> = database_loader::read_from_file();
26+
let elements: Vec<database_loader::OTPElement>;
27+
match database_loader::read_from_file(){
28+
Ok(result) => elements = result,
29+
Err(e) => {
30+
println!("An error as occurred: {}",e);
31+
return;
32+
}
33+
}
2734
for i in 0..elements.len() {
2835
print_totp(i,&elements[i]);
2936
}
@@ -49,9 +56,13 @@ fn get_good_otp_code(element: &database_loader::OTPElement) -> String {
4956
s_otp
5057
}
5158

52-
pub fn get_json_results() -> String{
53-
let elements: Vec<database_loader::OTPElement> = database_loader::read_from_file();
59+
pub fn get_json_results() -> Result<String,String>{
60+
let elements: Vec<database_loader::OTPElement>;
5461

62+
match database_loader::read_from_file(){
63+
Ok(result) => elements = result,
64+
Err(e) => return Err(e)
65+
}
5566
let mut results: Vec<JsonResult> = Vec::new();
5667

5768
for i in 0..elements.len() {
@@ -61,5 +72,5 @@ pub fn get_json_results() -> String{
6172

6273
let json_string: &str = &serde_json::to_string_pretty(&results).unwrap();
6374

64-
json_string.to_string()
75+
Ok(json_string.to_string())
6576
}

0 commit comments

Comments
 (0)