#include "Options.h" Options::Options() { char _cwd[FILENAME_MAX]; #ifdef WIN32 GetCurrentDirectory(FILENAME_MAX, _cwd); #else getcwd(_cwd, FILENAME_MAX); #endif std::string cwd(_cwd); user = ""; pass = ""; dr = cwd; cn = -1; ml = DEF_PASSWD_LENGTH; ns = false; nc = false; nn = false; pp = false; cc = false; } Options::~Options() { } PasswordSpec Options::getPasswordSpec() { PasswordSpec spec; spec.ml = ml; spec.ns = ns; spec.nc = nc; spec.nn = nn; return spec; } void Options::checkString(std::string str) { if (str == "") throw 1.0; if (str.find("\"") != std::string::npos) throw 1.0; if (str.find("'") != std::string::npos) throw 1.0; if (str.find(" ") != std::string::npos) throw 1.0; } void Options::parseArgv(int start, int argc, char* argv[]) { bool setGenMod = false; std::vector args = loadOptionsFile(start, argc, argv); for (int i = 0; i < args.size(); i++) { std::string opt(args[i]); if (opt == "") continue; if (opt == "-user") { i++; if (i >= args.size()) { std::cerr << "Warning: user: value is missing." << std::endl; i--; continue; } user = std::string(args[i]); checkString(user); } else if (opt == "-pass") { i++; if (i >= args.size()) { std::cerr << "Warning: pass: value is missing." << std::endl; i--; continue; } pass = std::string(args[i]); checkString(pass); } else if (opt == "-dr") { i++; if (i >= args.size()) { std::cerr << "Warning: directory: value is missing." << std::endl; i--; continue; } dr = std::string(args[i]); } else if (opt == "-cn") { i++; if (i >= args.size()) { std::cerr << "Warning: credential-number: value is missing." << std::endl; i--; continue; } std::istringstream dat((std::string(args[i]))); int num; dat >> num; if (dat.fail()) { i--; std::cerr << "Warning: trouble parsing credential number." << std::endl; } else { cn = num; if (cn < 0) { std::cerr << "Notice: set credential number below zero; ignoring." << std::endl; cn = -1; } } } else if (opt == "-ml") { i++; if (i >= args.size()) { std::cerr << "Warning: max-length: value is missing." << std::endl; i--; continue; } std::istringstream dat((std::string(args[i]))); int len; dat >> len; if (dat.fail()) { i--; std::cerr << "Warning: trouble parsing max-length." << std::endl; } else { ml = len; setGenMod = true; if (ml < 1) { std::cerr << "Notice: set max-length below one; ignoring." << std::endl; ml = DEF_PASSWD_LENGTH; } } } else if (opt == "-ns") { ns = true; setGenMod = true; } else if (opt == "-nc") { nc = true; setGenMod = true; } else if (opt == "-nn") { nn = true; setGenMod = true; } else if (opt == "-pp") pp = true; else if (opt == "-cc") cc = true; else std::cerr << "Notice: unrecognized option: " << opt << std::endl; } if (setGenMod && pass != "") std::cerr << "Notice: setting generator modifiers and explicitly setting a password. Explicit password takes precedence." << std::endl; } std::vector Options::loadOptionsFile(int start, int argc, char* argv[]) { std::vector args; std::ifstream opfile(OPTIONS_FILE); if (opfile.good()) { std::cout << "Notice: using " << OPTIONS_FILE << " from working directory." << std::endl; while (!opfile.eof()) { std::string str; opfile >> str; args.push_back(str); } } opfile.close(); for (int i = start; i < argc; i++) { args.push_back(argv[i]); } return args; }