Ver código fonte

Erase user and password specified in command-line from argv.

The user and password is masked with '*'.
Tatsuhiro Tsujikawa 14 anos atrás
pai
commit
2c0476e6d9

+ 2 - 1
src/NameMatchOptionHandler.cc

@@ -54,7 +54,8 @@ NameMatchOptionHandler::NameMatchOptionHandler
     id_(0),
     argType_(argType),
     shortName_(shortName),
-    hidden_(false)
+    hidden_(false),
+    eraseAfterParse_(false)
 {}
 
 NameMatchOptionHandler::~NameMatchOptionHandler() {}

+ 12 - 0
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<NameMatchOptionHandler> NameMatchOptionHandlerHandle;

+ 6 - 0
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

+ 16 - 0
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);
   }
   {

+ 17 - 0
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

+ 4 - 0
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

+ 6 - 1
src/OptionParser.cc

@@ -138,7 +138,7 @@ std::string createOptstring(InputIterator first, InputIterator last)
 
 void OptionParser::parseArg
 (std::ostream& out, std::vector<std::string>& 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";
   }

+ 1 - 1
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<std::string>& nonopts,
-                int argc, char* const argv[]);
+                int argc, char* argv[]);
 
   void parse(Option& option, std::istream& ios);
 

+ 1 - 1
src/main.cc

@@ -174,7 +174,7 @@ void showFiles
 #endif // ENABLE_BITTORRENT || ENABLE_METALINK
 
 extern void option_processing(Option& option, std::vector<std::string>& uris,
-                              int argc, char* const argv[]);
+                              int argc, char* argv[]);
 
 error_code::Value main(int argc, char* argv[])
 {

+ 1 - 1
src/option_processing.cc

@@ -85,7 +85,7 @@ void overrideWithEnv(Option& op, const OptionParser& optionParser,
 } // namespace
 
 void option_processing(Option& op, std::vector<std::string>& uris,
-                       int argc, char* const argv[])
+                       int argc, char* argv[])
 {
   OptionParser oparser;
   oparser.setOptionHandlers(OptionHandlerFactory::createOptionHandlers());