MediaUserAuth.cc
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00013 #include <list>
00014 #include <boost/format.hpp>
00015
00016 #include "zypp/base/Gettext.h"
00017 #include "zypp/base/String.h"
00018
00019 #include "zypp/media/MediaException.h"
00020 #include "zypp/media/MediaUserAuth.h"
00021
00022
00023 using namespace std;
00024
00025 namespace zypp {
00026 namespace media {
00027
00028
00029 AuthData::AuthData(const Url & url)
00030 : _url(url)
00031 {
00032 _username = url.getUsername();
00033 _password = url.getPassword();
00034 }
00035
00036
00037 bool AuthData::valid() const
00038 {
00039 return username().size() && password().size();
00040 }
00041
00042 std::ostream & AuthData::dumpOn( std::ostream & str ) const
00043 {
00044 str << "username: '" << _username << "'" << std::endl
00045 << "password: " << (_password.empty() ? "<empty>" : "<non-empty>")
00046 << std::endl;
00047 return str;
00048 }
00049
00050 std::ostream & AuthData::dumpAsIniOn( std::ostream & str ) const
00051 {
00052 if (_url.isValid())
00053 str
00054 << "[" << _url.asString(
00055 url::ViewOptions()
00056 - url::ViewOptions::WITH_USERNAME
00057 - url::ViewOptions::WITH_PASSWORD)
00058 << "]" << endl;
00059
00060 str
00061 << "username = " << _username << endl
00062 << "password = " << _password << endl;
00063
00064 return str;
00065 }
00066
00067 bool CurlAuthData::valid() const
00068 {
00069 return username().size() && password().size();
00070 }
00071
00072
00073 std::ostream & CurlAuthData::dumpOn( std::ostream & str ) const
00074 {
00075 AuthData::dumpOn(str) << " auth_type: " << _auth_type_str
00076 << " (" << _auth_type << ")" << std::endl;
00077 return str;
00078 }
00079
00080 long CurlAuthData::auth_type_str2long(std::string & auth_type_str)
00081 {
00082 curl_version_info_data *curl_info = curl_version_info(CURLVERSION_NOW);
00083
00084 std::vector<std::string> list;
00085 std::vector<std::string>::const_iterator it;
00086 long auth_type = CURLAUTH_NONE;
00087
00088 zypp::str::split(auth_type_str, std::back_inserter(list), ",");
00089
00090 for(it = list.begin(); it != list.end(); ++it)
00091 {
00092 if(*it == "basic")
00093 {
00094 auth_type |= CURLAUTH_BASIC;
00095 }
00096 else
00097 if(*it == "digest")
00098 {
00099 auth_type |= CURLAUTH_DIGEST;
00100 }
00101 else
00102 if((curl_info && (curl_info->features & CURL_VERSION_NTLM)) &&
00103 (*it == "ntlm"))
00104 {
00105 auth_type |= CURLAUTH_NTLM;
00106 }
00107 else
00108 if((curl_info && (curl_info->features & CURL_VERSION_SPNEGO)) &&
00109 (*it == "spnego" || *it == "negotiate"))
00110 {
00111
00112 auth_type |= CURLAUTH_GSSNEGOTIATE;
00113 }
00114 else
00115 if((curl_info && (curl_info->features & CURL_VERSION_GSSNEGOTIATE)) &&
00116 (*it == "gssnego" || *it == "negotiate"))
00117 {
00118 auth_type |= CURLAUTH_GSSNEGOTIATE;
00119 }
00120 else
00121 {
00122 std::string msg = boost::str(
00123 boost::format (_("Unsupported HTTP authentication method '%s'")) % *it);
00124
00125 ZYPP_THROW(MediaException(msg));
00126 }
00127 }
00128
00129 return auth_type;
00130 }
00131
00132 std::string CurlAuthData::auth_type_long2str(long auth_type)
00133 {
00134 std::list<std::string> auth_list;
00135
00136 if(auth_type & CURLAUTH_GSSNEGOTIATE)
00137 auth_list.push_back("negotiate");
00138
00139 if(auth_type & CURLAUTH_NTLM)
00140 auth_list.push_back("ntlm");
00141
00142 if(auth_type & CURLAUTH_DIGEST)
00143 auth_list.push_back("digest");
00144
00145 if(auth_type & CURLAUTH_BASIC)
00146 auth_list.push_back("basic");
00147
00148 return str::join(auth_list, ",");
00149 }
00150
00151
00152 std::ostream & operator << (std::ostream & str, const AuthData & auth_data)
00153 {
00154 auth_data.dumpOn(str);
00155 return str;
00156 }
00157
00158 std::ostream & operator << (std::ostream & str, const CurlAuthData & auth_data)
00159 {
00160 auth_data.dumpOn(str);
00161 return str;
00162 }
00163
00164
00165 }
00166 }