--- src/libcmis/oauth2-providers.cxx +++ src/libcmis/oauth2-providers.cxx @@ -26,6 +26,8 @@ * instead of those above. */ +#include + #include #include @@ -45,6 +47,29 @@ #define HTML_PARSE_RECOVER 0 #endif +namespace { + +// See : +void addXWwwFormUrlencoded(std::string * buffer, std::string const & data) { + assert(buffer); + for (string::const_iterator i = data.begin(); i != data.end(); ++i) { + unsigned char c = static_cast(*i); + if (c == ' ' || c == '*' || c == '-' || c == '.' || (c >= '0' && c <= '9') + || (c >= 'A' && c <= 'Z') || c == '_' || (c >= 'a' && c <= 'z')) + { + *buffer += static_cast(c); + } else { + static const char hex[16] = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; + *buffer += '%'; + *buffer += hex[c >> 4]; + *buffer += hex[c & 0xF]; + } + } +} + +} + string OAuth2Providers::OAuth2Gdrive( HttpSession* session, const string& authUrl, const string& username, const string& password ) { @@ -97,7 +120,7 @@ return string( ); loginEmailPost += "Email="; - loginEmailPost += string( username ); + addXWwwFormUrlencoded(&loginEmailPost, username); istringstream loginEmailIs( loginEmailPost ); string loginEmailRes; @@ -119,7 +142,7 @@ return string( ); loginPasswdPost += "Passwd="; - loginPasswdPost += string( password ); + addXWwwFormUrlencoded(&loginPasswdPost, password); istringstream loginPasswdIs( loginPasswdPost ); string loginPasswdRes;