Author: jkupec Date: Tue Jan 29 14:40:28 2008 New Revision: 8383 URL: http://svn.opensuse.org/viewcvs/zypp?rev=8383&view=rev Log: - read .curlrc more robustly (#330351, #331038) Added: branches/SuSE-Linux-10_3-Branch/libzypp/zypp/media/CurlConfig.cc branches/SuSE-Linux-10_3-Branch/libzypp/zypp/media/CurlConfig.h Modified: branches/SuSE-Linux-10_3-Branch/libzypp/zypp/CMakeLists.txt branches/SuSE-Linux-10_3-Branch/libzypp/zypp/media/MediaCurl.cc Modified: branches/SuSE-Linux-10_3-Branch/libzypp/zypp/CMakeLists.txt URL: http://svn.opensuse.org/viewcvs/zypp/branches/SuSE-Linux-10_3-Branch/libzypp... ============================================================================== --- branches/SuSE-Linux-10_3-Branch/libzypp/zypp/CMakeLists.txt (original) +++ branches/SuSE-Linux-10_3-Branch/libzypp/zypp/CMakeLists.txt Tue Jan 29 14:40:28 2008 @@ -379,6 +379,7 @@ media/MediaISO.cc media/MediaManager.cc media/MediaUserAuth.cc + media/CurlConfig.cc ) SET( zypp_media_HEADERS @@ -398,6 +399,7 @@ media/MediaUserAuth.h media/Mount.h media/ProxyInfo.h + media/CurlConfig.h ) INSTALL( FILES Added: branches/SuSE-Linux-10_3-Branch/libzypp/zypp/media/CurlConfig.cc URL: http://svn.opensuse.org/viewcvs/zypp/branches/SuSE-Linux-10_3-Branch/libzypp... ============================================================================== --- branches/SuSE-Linux-10_3-Branch/libzypp/zypp/media/CurlConfig.cc (added) +++ branches/SuSE-Linux-10_3-Branch/libzypp/zypp/media/CurlConfig.cc Tue Jan 29 14:40:28 2008 @@ -0,0 +1,181 @@ +#include <iostream> +#include <fstream> + +#include "zypp/base/Logger.h" +#include "zypp/base/IOStream.h" +#include "zypp/Pathname.h" +#include "zypp/PathInfo.h" + +#include "zypp/media/CurlConfig.h" + +using namespace std; + +namespace zypp +{ + namespace media + { + + + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : CurlConfig::parseConfig + // METHOD TYPE : int + // + int CurlConfig::parseConfig(CurlConfig & config, const std::string & filename) + { + Pathname curlrcFile; + + if(filename.empty()) + { + // attempts to load .curlrc from the homedir + char *home = getenv("HOME"); + if(home) + curlrcFile = string( home ) + string( "/.curlrc" ); + } + else + curlrcFile = filename; + + PathInfo h_info(curlrcFile.dirname(), PathInfo::LSTAT); + PathInfo c_info(curlrcFile, PathInfo::LSTAT); + + if( h_info.isDir() && h_info.owner() == getuid() && + c_info.isFile() && c_info.owner() == getuid()) + { + MIL << "Going to parse " << curlrcFile << endl; + } + else + { + WAR << "Not allowed to parse '" << curlrcFile + << "': bad file owner" << std::endl; + return 1; + } + + ifstream inp(curlrcFile.c_str()); + for(iostr::EachLine in( inp ); in; in.next()) + { + string line = str::trim(*in); + + // skip empty lines and comments + if (line.empty()) + continue; + switch (line[0]) + { + case '#': + case '/': + case '\r': + case '\n': + case '*': + case '\0': + continue; + } + + // DBG << "line " << in.lineNo() << ": " << line << endl; // can't log passwords + + const char * beg = line.c_str(); + const char * cur = beg; + +// space, '=' and ':' are all valid separators in curlrc +#define ISSEP(x) (((x)=='=') || ((x) == ':') || isspace(x)) + + // skip leading dashes (they are optional) + while (*cur && *cur == '-') + cur++; + beg = cur; + + // skip non-separator characters + while (*cur && !ISSEP(*cur)) + cur++; + + string option(beg, cur - beg); + + // skip separator characters + while (*cur && ISSEP(*cur)) + cur++; + + // rewind to the end of the line + beg = cur; + while (*cur) + cur++; + + string value(beg, cur - beg); + + DBG << "GOT: " << option << endl; + + if (!value.empty()) + { + // quoted parameter + if (value[0] == '"') + { + // remove the quotes + string::size_type pos = value.rfind('"'); + bool cut_last = + pos == value.size() - 1 && pos > 1 && value[pos-1] != '\'; + value = value.substr(1, + cut_last ? value.size() - 2 : value.size() - 1); + + // replace special characters: + pos = 0; + while ((pos = value.find('\', pos)) != string::npos) + { + // just erase the backslash if it is found at the end + if (pos == value.size() - 1) + { + value = value.erase(pos, 1); + break; + } + + switch(value[pos+1]) + { + case 't': + value = value.replace(pos, 2, "\t"); + break; + case 'n': + value = value.replace(pos, 2, "\n"); + break; + case 'r': + value = value.replace(pos, 2, "\r"); + break; + case 'v': + value = value.replace(pos, 2, "\v"); + break; + case '\': + value = value.erase(pos++, 1); + break; + default:; + value = value.erase(pos, 1); + } + } + } + + // DBG << "PARAM: " << value << endl; // can't log passwords + } + + CurlConfig::setParameter(config, option, value); + } // for EachLine in curlrc + + return 0; + } + + + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : CurlConfig::setParameter + // METHOD TYPE : int + // + int CurlConfig::setParameter(CurlConfig & config, + const std::string & option, + const std::string & value) + { + if (option == "proxy-user") + config.proxyuserpwd = value; + // add more curl config data here as they become needed + // else if (option == "foo") + else + DBG << "Ignoring option " << option << endl; + + return 0; + } + + + } // namespace media +} // namespace zypp Added: branches/SuSE-Linux-10_3-Branch/libzypp/zypp/media/CurlConfig.h URL: http://svn.opensuse.org/viewcvs/zypp/branches/SuSE-Linux-10_3-Branch/libzypp... ============================================================================== --- branches/SuSE-Linux-10_3-Branch/libzypp/zypp/media/CurlConfig.h (added) +++ branches/SuSE-Linux-10_3-Branch/libzypp/zypp/media/CurlConfig.h Tue Jan 29 14:40:28 2008 @@ -0,0 +1,47 @@ +#ifndef ZYPP_MEDIA_CURLRCONFIG_H_ +#define ZYPP_MEDIA_CURLRCONFIG_H_ + +//#include "zypp/base/NonCopyable.h" +#include "zypp/base/String.h" + +namespace zypp +{ + namespace media + { + + + /** + * Structure holding values of curlrc options. + */ + struct CurlConfig + { + public: + /** + * Parse a curlrc file and store the result in the \a config structure. + * + * \param config a CurlConfig structure + * \param filename path to the curlrc file. If empty, ~/.curlrc is used. + * \return 0 on success, 1 if problem occurs. + */ + static int parseConfig(CurlConfig & config, const std::string & filename = ""); + + /** + * Stores the \a value of the \a option in the \a config structure or + * logs an unknown option. + * + * \return 0 on success, 1 if problem occurs. + */ + static int setParameter(CurlConfig & config, + const std::string & option, + const std::string & value); + + public: + std::string proxyuserpwd; + // add more curl config data here as they become needed + }; + + + } // namespace media +} // namespace zypp + +#endif /*ZYPP_MEDIA_CURLRCONFIG_H_*/ Modified: branches/SuSE-Linux-10_3-Branch/libzypp/zypp/media/MediaCurl.cc URL: http://svn.opensuse.org/viewcvs/zypp/branches/SuSE-Linux-10_3-Branch/libzypp... ============================================================================== --- branches/SuSE-Linux-10_3-Branch/libzypp/zypp/media/MediaCurl.cc (original) +++ branches/SuSE-Linux-10_3-Branch/libzypp/zypp/media/MediaCurl.cc Tue Jan 29 14:40:28 2008 @@ -23,6 +23,7 @@ #include "zypp/media/proxyinfo/ProxyInfos.h" #include "zypp/media/ProxyInfo.h" #include "zypp/media/MediaUserAuth.h" +#include "zypp/media/CurlConfig.h" #include "zypp/thread/Once.h" #include <cstdlib> #include <sys/types.h> @@ -220,6 +221,9 @@ if ( !_url.isValid() ) ZYPP_THROW(MediaBadUrlException(_url)); + CurlConfig curlconf; + CurlConfig::parseConfig(curlconf); // parse ~/.curlrc + curl_version_info_data *curl_info = NULL; curl_info = curl_version_info(CURLVERSION_NOW); // curl_info does not need any free (is static) @@ -560,37 +564,17 @@ _proxyuserpwd = _url.getQueryParam( "proxyuser" ); if ( ! _proxyuserpwd.empty() ) { - string proxypassword( _url.getQueryParam( "proxypassword" ) ); if ( ! proxypassword.empty() ) { _proxyuserpwd += ":" + proxypassword; } - } else { - char *home = getenv("HOME"); - if( home && *home) + if (curlconf.proxyuserpwd.empty()) + DBG << "~/.curlrc does not contain the proxy-user option" << endl; + else { - Pathname curlrcFile = string( home ) + string( "/.curlrc" ); - - PathInfo h_info(string(home), PathInfo::LSTAT); - PathInfo c_info(curlrcFile, PathInfo::LSTAT); - - if( h_info.isDir() && h_info.owner() == getuid() && - c_info.isFile() && c_info.owner() == getuid()) - { - map<string,string> rc_data = base::sysconfig::read( curlrcFile ); - - map<string,string>::const_iterator it = rc_data.find("--proxy-user"); - if (it != rc_data.end()) - _proxyuserpwd = it->second; - - DBG << "got proxy userpwd (--proxy-user) from ~/culrc" << endl; - } - else - { - WAR << "Not allowed to parse '" << curlrcFile - << "': bad file owner" << std::endl; - } + _proxyuserpwd = curlconf.proxyuserpwd; + DBG << "using proxy-user from ~/.curlrc" << endl; } } -- To unsubscribe, e-mail: zypp-commit+unsubscribe@opensuse.org For additional commands, e-mail: zypp-commit+help@opensuse.org