#![forbid(
exceeding_bitshifts, mutable_transmutes, no_mangle_const_items, unknown_crate_types, warnings
)]
#![deny(
bad_style, deprecated, improper_ctypes, missing_docs, non_shorthand_field_patterns,
overflowing_literals, plugin_as_library, private_no_mangle_fns, private_no_mangle_statics,
stable_features, unconditional_recursion, unknown_lints, unsafe_code, unused, unused_allocation,
unused_attributes, unused_comparisons, unused_features, unused_parens, while_true
)]
#![warn(
trivial_casts, trivial_numeric_casts, unused_extern_crates, unused_import_braces,
unused_qualifications, unused_results
)]
#![allow(
box_pointers, missing_copy_implementations, missing_debug_implementations,
variant_size_differences
)]
#![cfg_attr(
feature = "cargo-clippy",
deny(clippy, unicode_not_nfc, wrong_pub_self_convention, option_unwrap_used)
)]
#![cfg_attr(feature = "cargo-clippy", allow(implicit_hasher, too_many_arguments, use_debug))]
extern crate clap;
extern crate maidsafe_utilities;
extern crate safe_app;
extern crate safe_authenticator;
#[macro_use]
extern crate unwrap;
use clap::{App, Arg};
use safe_app::{utils, ClientError, CoreError};
use safe_authenticator::{AuthError, Authenticator};
fn main() {
unwrap!(maidsafe_utilities::log::init(true));
let matches = App::new("self_authentication")
.arg(
Arg::with_name("invite")
.long("invite")
.takes_value(true)
.help("Use the given invite."),
)
.get_matches();
let mut secret_0 = String::new();
let mut secret_1 = String::new();
println!("\nDo you already have an account created (enter Y for yes)?");
let mut user_option = String::new();
let _ = std::io::stdin().read_line(&mut user_option);
user_option = user_option.trim().to_string();
if user_option != "Y" && user_option != "y" {
println!("\n\tAccount Creation");
println!("\t================");
println!("\n------------ Enter account-locator ---------------");
let _ = std::io::stdin().read_line(&mut secret_0);
secret_0 = secret_0.trim().to_string();
println!("\n------------ Enter password ---------------");
let _ = std::io::stdin().read_line(&mut secret_1);
secret_1 = secret_1.trim().to_string();
let invitation: String = if let Some(i) = matches.value_of("invite") {
i.to_string()
} else {
unwrap!(utils::generate_random_string(10))
};
println!("\nTrying to create an account...");
match Authenticator::create_acc(
secret_0.as_str(),
secret_1.as_str(),
invitation.as_str(),
|| (),
) {
Ok(_) => (),
Err(AuthError::CoreError(CoreError::RoutingClientError(
ClientError::AccountExists,
))) => {
println!(
"ERROR: This domain is already taken. Please retry with different \
locator and/or password"
);
return;
}
Err(err) => panic!("{:?}", err),
}
println!("Account created successfully!");
println!("\n\n\tAuto Account Login");
println!("\t==================");
{
println!("\nTrying to log into the created account using supplied credentials...");
let _ = unwrap!(Authenticator::login(secret_0, secret_1, || ()));
println!("Account login successful!");
}
}
println!("\n\n\tManual Account Login");
println!("\t====================");
loop {
secret_0 = String::new();
secret_1 = String::new();
println!("\n------------ Enter account-locator ---------------");
let _ = std::io::stdin().read_line(&mut secret_0);
secret_0 = secret_0.trim().to_string();
println!("\n------------ Enter password ---------------");
let _ = std::io::stdin().read_line(&mut secret_1);
secret_1 = secret_1.trim().to_string();
{
println!("\nTrying to log in...");
match Authenticator::login(secret_0, secret_1, || ()) {
Ok(_) => {
println!("Account login successful!");
break;
}
Err(error) => println!("ERROR: Account login failed!\nReason: {:?}\n\n", error),
}
}
}
}