Imported Upstream version 15.0.0
[platform/upstream/libzypp.git] / zypp / media / MediaUserAuth.cc
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/media/MediaUserAuth.cc
10  *
11  */
12
13 #include <list>
14 #include <curl/curl.h>
15
16 #include <boost/format.hpp>
17
18 #include "zypp/base/Gettext.h"
19 #include "zypp/base/String.h"
20
21 #include "zypp/media/MediaException.h"
22 #include "zypp/media/MediaUserAuth.h"
23
24
25 using namespace std;
26
27 namespace zypp {
28   namespace media {
29
30
31 AuthData::AuthData(const Url & url)
32   : _url(url)
33 {
34   _username = url.getUsername();
35   _password = url.getPassword();
36 }
37
38
39 bool AuthData::valid() const
40 {
41   return username().size() && password().size();
42 }
43
44 std::ostream & AuthData::dumpOn( std::ostream & str ) const
45 {
46   str << "username: '" << _username << "'" << std::endl
47       << "password: " << (_password.empty() ? "<empty>" : "<non-empty>")
48       << std::endl;
49   return str;
50 }
51
52 std::ostream & AuthData::dumpAsIniOn( std::ostream & str ) const
53 {
54   if (_url.isValid())
55     str
56       << "[" << _url.asString(
57         url::ViewOptions()
58         - url::ViewOptions::WITH_USERNAME
59         - url::ViewOptions::WITH_PASSWORD)
60       << "]" << endl;
61
62   str
63     << "username = " << _username << endl
64     << "password = " << _password << endl;
65
66   return str;
67 }
68
69 CurlAuthData::CurlAuthData()
70   : AuthData()
71   , _auth_type_str()
72   , _auth_type(CURLAUTH_NONE)
73 {}
74
75 CurlAuthData::CurlAuthData(const AuthData & authData)
76   : AuthData(authData)
77   , _auth_type_str()
78   , _auth_type(CURLAUTH_NONE)
79 {}
80
81 bool CurlAuthData::valid() const
82 {
83   return username().size() && password().size();
84 }
85
86 std::ostream & CurlAuthData::dumpOn( std::ostream & str ) const
87 {
88   AuthData::dumpOn(str) << " auth_type: " << _auth_type_str
89     << " (" << _auth_type << ")" << std::endl;
90   return str;
91 }
92
93 long CurlAuthData::auth_type_str2long(std::string & auth_type_str)
94 {
95   curl_version_info_data *curl_info = curl_version_info(CURLVERSION_NOW);
96
97   std::vector<std::string>                  list;
98   std::vector<std::string>::const_iterator  it;
99   long                                      auth_type = CURLAUTH_NONE;
100
101   zypp::str::split(auth_type_str, std::back_inserter(list), ",");
102
103   for(it = list.begin(); it != list.end(); ++it)
104   {
105     if(*it == "basic")
106     {
107       auth_type |= CURLAUTH_BASIC;
108     }
109     else
110     if(*it == "digest")
111     {
112       auth_type |= CURLAUTH_DIGEST;
113     }
114     else
115     if((curl_info && (curl_info->features & CURL_VERSION_NTLM)) &&
116        (*it == "ntlm"))
117     {
118       auth_type |= CURLAUTH_NTLM;
119     }
120     else
121     if((curl_info && (curl_info->features & CURL_VERSION_SPNEGO)) &&
122        (*it == "spnego" || *it == "negotiate"))
123     {
124       // there is no separate spnego flag for this auth type
125       auth_type |= CURLAUTH_GSSNEGOTIATE;
126     }
127     else
128     if((curl_info && (curl_info->features & CURL_VERSION_GSSNEGOTIATE)) &&
129        (*it == "gssnego" || *it == "negotiate"))
130     {
131       auth_type |= CURLAUTH_GSSNEGOTIATE;
132     }
133     else
134     {
135       std::string msg = boost::str(
136         boost::format (_("Unsupported HTTP authentication method '%s'")) % *it);
137
138       ZYPP_THROW(MediaException(msg));
139     }
140   }
141
142   return auth_type;
143 }
144
145 std::string CurlAuthData::auth_type_long2str(long auth_type)
146 {
147   std::list<std::string> auth_list;
148
149   if(auth_type & CURLAUTH_GSSNEGOTIATE)
150     auth_list.push_back("negotiate");
151
152   if(auth_type & CURLAUTH_NTLM)
153     auth_list.push_back("ntlm");
154
155   if(auth_type & CURLAUTH_DIGEST)
156     auth_list.push_back("digest");
157
158   if(auth_type & CURLAUTH_BASIC)
159     auth_list.push_back("basic");
160
161   return str::join(auth_list, ",");
162 }
163
164
165 std::ostream & operator << (std::ostream & str, const AuthData & auth_data)
166 {
167   auth_data.dumpOn(str);
168   return str;
169 }
170
171 std::ostream & operator << (std::ostream & str, const CurlAuthData & auth_data)
172 {
173   auth_data.dumpOn(str);
174   return str;
175 }
176
177
178   } // namespace media
179 } // namespace zypp