|
|
@ -6,6 +6,7 @@ |
|
|
|
#include "rpcprotocol.h" |
|
|
|
|
|
|
|
#include "clientversion.h" |
|
|
|
#include "random.h" |
|
|
|
#include "tinyformat.h" |
|
|
|
#include "util.h" |
|
|
|
#include "utilstrencodings.h" |
|
|
@ -13,6 +14,7 @@ |
|
|
|
#include "version.h" |
|
|
|
|
|
|
|
#include <stdint.h> |
|
|
|
#include <fstream> |
|
|
|
|
|
|
|
#include <boost/algorithm/string.hpp> |
|
|
|
#include <boost/asio.hpp> |
|
|
@ -288,3 +290,68 @@ Object JSONRPCError(int code, const string& message) |
|
|
|
error.push_back(Pair("message", message)); |
|
|
|
return error; |
|
|
|
} |
|
|
|
|
|
|
|
/** Username used when cookie authentication is in use (arbitrary, only for
|
|
|
|
* recognizability in debugging/logging purposes) |
|
|
|
*/ |
|
|
|
static const std::string COOKIEAUTH_USER = "__cookie__"; |
|
|
|
/** Default name for auth cookie file */ |
|
|
|
static const std::string COOKIEAUTH_FILE = ".cookie"; |
|
|
|
|
|
|
|
boost::filesystem::path GetAuthCookieFile() |
|
|
|
{ |
|
|
|
boost::filesystem::path path(GetArg("-rpccookiefile", COOKIEAUTH_FILE)); |
|
|
|
if (!path.is_complete()) path = GetDataDir() / path; |
|
|
|
return path; |
|
|
|
} |
|
|
|
|
|
|
|
bool GenerateAuthCookie(std::string *cookie_out) |
|
|
|
{ |
|
|
|
unsigned char rand_pwd[32]; |
|
|
|
GetRandBytes(rand_pwd, 32); |
|
|
|
std::string cookie = COOKIEAUTH_USER + ":" + EncodeBase64(&rand_pwd[0],32); |
|
|
|
|
|
|
|
/** the umask determines what permissions are used to create this file -
|
|
|
|
* these are set to 077 in init.cpp unless overridden with -sysperms. |
|
|
|
*/ |
|
|
|
std::ofstream file; |
|
|
|
boost::filesystem::path filepath = GetAuthCookieFile(); |
|
|
|
file.open(filepath.string().c_str()); |
|
|
|
if (!file.is_open()) { |
|
|
|
LogPrintf("Unable to open cookie authentication file %s for writing\n", filepath.string()); |
|
|
|
return false; |
|
|
|
} |
|
|
|
file << cookie; |
|
|
|
file.close(); |
|
|
|
LogPrintf("Generated RPC authentication cookie %s\n", filepath.string()); |
|
|
|
|
|
|
|
if (cookie_out) |
|
|
|
*cookie_out = cookie; |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
bool GetAuthCookie(std::string *cookie_out) |
|
|
|
{ |
|
|
|
std::ifstream file; |
|
|
|
std::string cookie; |
|
|
|
boost::filesystem::path filepath = GetAuthCookieFile(); |
|
|
|
file.open(filepath.string().c_str()); |
|
|
|
if (!file.is_open()) |
|
|
|
return false; |
|
|
|
std::getline(file, cookie); |
|
|
|
file.close(); |
|
|
|
|
|
|
|
if (cookie_out) |
|
|
|
*cookie_out = cookie; |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
void DeleteAuthCookie() |
|
|
|
{ |
|
|
|
try { |
|
|
|
boost::filesystem::remove(GetAuthCookieFile()); |
|
|
|
} catch (const boost::filesystem::filesystem_error& e) { |
|
|
|
LogPrintf("%s: Unable to remove random auth cookie file: %s\n", __func__, e.what()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|