From 2c0476e6d9033cdf58b9899b165bbddd974e88db Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Fri, 22 Apr 2011 23:38:59 +0900 Subject: [PATCH] Erase user and password specified in command-line from argv. The user and password is masked with '*'. --- src/NameMatchOptionHandler.cc | 3 ++- src/NameMatchOptionHandler.h | 12 ++++++++++++ src/OptionHandler.h | 6 ++++++ src/OptionHandlerFactory.cc | 16 ++++++++++++++++ src/OptionHandlerImpl.cc | 17 +++++++++++++++++ src/OptionHandlerImpl.h | 4 ++++ src/OptionParser.cc | 7 ++++++- src/OptionParser.h | 2 +- src/main.cc | 2 +- src/option_processing.cc | 2 +- 10 files changed, 66 insertions(+), 5 deletions(-) diff --git a/src/NameMatchOptionHandler.cc b/src/NameMatchOptionHandler.cc index 0917c4b7..d517f9d5 100644 --- a/src/NameMatchOptionHandler.cc +++ b/src/NameMatchOptionHandler.cc @@ -54,7 +54,8 @@ NameMatchOptionHandler::NameMatchOptionHandler id_(0), argType_(argType), shortName_(shortName), - hidden_(false) + hidden_(false), + eraseAfterParse_(false) {} NameMatchOptionHandler::~NameMatchOptionHandler() {} diff --git a/src/NameMatchOptionHandler.h b/src/NameMatchOptionHandler.h index 99704e81..91c6f418 100644 --- a/src/NameMatchOptionHandler.h +++ b/src/NameMatchOptionHandler.h @@ -63,6 +63,8 @@ protected: bool hidden_; + bool eraseAfterParse_; + virtual void parseArg(Option& option, const std::string& arg) = 0; public: NameMatchOptionHandler(const std::string& optName, @@ -127,6 +129,16 @@ public: { return argType_; } + + virtual bool getEraseAfterParse() const + { + return eraseAfterParse_; + } + + virtual void setEraseAfterParse(bool eraseAfterParse) + { + eraseAfterParse_ = eraseAfterParse; + } }; typedef SharedHandle NameMatchOptionHandlerHandle; diff --git a/src/OptionHandler.h b/src/OptionHandler.h index 8445a6f5..725cf22a 100644 --- a/src/OptionHandler.h +++ b/src/OptionHandler.h @@ -94,6 +94,12 @@ public: virtual int getOptionID() const = 0; virtual void setOptionID(int id) = 0; + + // Returns true if option value should be erased from argv to + // prevent it from appearing in the output of ps. + virtual bool getEraseAfterParse() const = 0; + + virtual void setEraseAfterParse(bool eraseAfterParse) = 0; }; class OptionHandlerNameLesser:public std::binary_function diff --git a/src/OptionHandlerFactory.cc b/src/OptionHandlerFactory.cc index 82c43ef0..4e8d3ed3 100644 --- a/src/OptionHandlerFactory.cc +++ b/src/OptionHandlerFactory.cc @@ -619,6 +619,7 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers() (PREF_RPC_USER, TEXT_RPC_USER)); op->addTag(TAG_RPC); + op->setEraseAfterParse(true); handlers.push_back(op); } { @@ -626,6 +627,7 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers() (PREF_RPC_PASSWD, TEXT_RPC_PASSWD)); op->addTag(TAG_RPC); + op->setEraseAfterParse(true); handlers.push_back(op); } { @@ -676,6 +678,7 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers() TEXT_XML_RPC_USER)), PREF_RPC_USER)); op->addTag(TAG_RPC); + op->setEraseAfterParse(true); handlers.push_back(op); } { @@ -687,6 +690,7 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers() TEXT_XML_RPC_PASSWD)), PREF_RPC_PASSWD)); op->addTag(TAG_RPC); + op->setEraseAfterParse(true); handlers.push_back(op); } // HTTP/FTP options @@ -971,6 +975,7 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers() TEXT_HTTP_PASSWD)); op->addTag(TAG_BASIC); op->addTag(TAG_HTTP); + op->setEraseAfterParse(true); handlers.push_back(op); } { @@ -979,6 +984,7 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers() TEXT_HTTP_USER)); op->addTag(TAG_BASIC); op->addTag(TAG_HTTP); + op->setEraseAfterParse(true); handlers.push_back(op); } { @@ -1055,6 +1061,7 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers() TEXT_FTP_PASSWD)); op->addTag(TAG_BASIC); op->addTag(TAG_FTP); + op->setEraseAfterParse(true); handlers.push_back(op); } { @@ -1091,6 +1098,7 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers() TEXT_FTP_USER)); op->addTag(TAG_BASIC); op->addTag(TAG_FTP); + op->setEraseAfterParse(true); handlers.push_back(op); } { @@ -1117,6 +1125,7 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers() TEXT_HTTP_PROXY_PASSWD, NO_DEFAULT_VALUE)); op->addTag(TAG_HTTP); + op->setEraseAfterParse(true); handlers.push_back(op); } { @@ -1125,6 +1134,7 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers() TEXT_HTTP_PROXY_USER, NO_DEFAULT_VALUE)); op->addTag(TAG_HTTP); + op->setEraseAfterParse(true); handlers.push_back(op); } { @@ -1143,6 +1153,7 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers() NO_DEFAULT_VALUE)); op->addTag(TAG_HTTP); op->addTag(TAG_HTTPS); + op->setEraseAfterParse(true); handlers.push_back(op); } { @@ -1152,6 +1163,7 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers() NO_DEFAULT_VALUE)); op->addTag(TAG_HTTP); op->addTag(TAG_HTTPS); + op->setEraseAfterParse(true); handlers.push_back(op); } { @@ -1168,6 +1180,7 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers() TEXT_FTP_PROXY_PASSWD, NO_DEFAULT_VALUE)); op->addTag(TAG_FTP); + op->setEraseAfterParse(true); handlers.push_back(op); } { @@ -1176,6 +1189,7 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers() TEXT_FTP_PROXY_USER, NO_DEFAULT_VALUE)); op->addTag(TAG_FTP); + op->setEraseAfterParse(true); handlers.push_back(op); } { @@ -1196,6 +1210,7 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers() op->addTag(TAG_FTP); op->addTag(TAG_HTTP); op->addTag(TAG_HTTPS); + op->setEraseAfterParse(true); handlers.push_back(op); } { @@ -1206,6 +1221,7 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers() op->addTag(TAG_FTP); op->addTag(TAG_HTTP); op->addTag(TAG_HTTPS); + op->setEraseAfterParse(true); handlers.push_back(op); } { diff --git a/src/OptionHandlerImpl.cc b/src/OptionHandlerImpl.cc index 7295c9c5..23fce6a1 100644 --- a/src/OptionHandlerImpl.cc +++ b/src/OptionHandlerImpl.cc @@ -115,6 +115,13 @@ char NullOptionHandler::getShortName() const return 0; } +bool NullOptionHandler::getEraseAfterParse() const +{ + return false; +} + +void NullOptionHandler::setEraseAfterParse(bool eraseAfterParse) {} + BooleanOptionHandler::BooleanOptionHandler (const std::string& optName, const std::string& description, @@ -814,4 +821,14 @@ void DeprecatedOptionHandler::setOptionID(int id) depOptHandler_->setOptionID(id); } +bool DeprecatedOptionHandler::getEraseAfterParse() const +{ + return depOptHandler_->getEraseAfterParse(); +} + +void DeprecatedOptionHandler::setEraseAfterParse(bool eraseAfterParse) +{ + depOptHandler_->setEraseAfterParse(eraseAfterParse); +} + } // namespace aria2 diff --git a/src/OptionHandlerImpl.h b/src/OptionHandlerImpl.h index 11673211..ddafcebe 100644 --- a/src/OptionHandlerImpl.h +++ b/src/OptionHandlerImpl.h @@ -65,6 +65,8 @@ public: virtual int getOptionID() const; virtual void setOptionID(int id); virtual char getShortName() const; + virtual bool getEraseAfterParse() const; + virtual void setEraseAfterParse(bool eraseAfterParse); }; class BooleanOptionHandler : public NameMatchOptionHandler { @@ -315,6 +317,8 @@ public: virtual char getShortName() const; virtual int getOptionID() const; virtual void setOptionID(int id); + virtual bool getEraseAfterParse() const; + virtual void setEraseAfterParse(bool eraseAfterParse); }; } // namespace aria2 diff --git a/src/OptionParser.cc b/src/OptionParser.cc index 15e49fa7..c2a00eeb 100644 --- a/src/OptionParser.cc +++ b/src/OptionParser.cc @@ -138,7 +138,7 @@ std::string createOptstring(InputIterator first, InputIterator last) void OptionParser::parseArg (std::ostream& out, std::vector& nonopts, - int argc, char* const argv[]) + int argc, char* argv[]) { size_t numPublicOption = countPublicOption(optionHandlers_.begin(), optionHandlers_.end()); @@ -165,6 +165,11 @@ void OptionParser::parseArg out << op->getName() << "="; if(optarg) { out << optarg; + if(op->getEraseAfterParse()) { + for(char* p = optarg; *p != '\0'; ++p) { + *p = '*'; + } + } } out << "\n"; } diff --git a/src/OptionParser.h b/src/OptionParser.h index d06e01d8..0c767229 100644 --- a/src/OptionParser.h +++ b/src/OptionParser.h @@ -69,7 +69,7 @@ public: // NAME=VALUE format. Non-option strings are stored in nonopts. // Throws Exception when an unrecognized option is found. void parseArg(std::ostream& out, std::vector& nonopts, - int argc, char* const argv[]); + int argc, char* argv[]); void parse(Option& option, std::istream& ios); diff --git a/src/main.cc b/src/main.cc index 81e5391a..fd621a2b 100644 --- a/src/main.cc +++ b/src/main.cc @@ -174,7 +174,7 @@ void showFiles #endif // ENABLE_BITTORRENT || ENABLE_METALINK extern void option_processing(Option& option, std::vector& uris, - int argc, char* const argv[]); + int argc, char* argv[]); error_code::Value main(int argc, char* argv[]) { diff --git a/src/option_processing.cc b/src/option_processing.cc index 97b2aa5b..4fad4465 100644 --- a/src/option_processing.cc +++ b/src/option_processing.cc @@ -85,7 +85,7 @@ void overrideWithEnv(Option& op, const OptionParser& optionParser, } // namespace void option_processing(Option& op, std::vector& uris, - int argc, char* const argv[]) + int argc, char* argv[]) { OptionParser oparser; oparser.setOptionHandlers(OptionHandlerFactory::createOptionHandlers());