@ -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>
@ -287,3 +289,68 @@ UniValue 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 ( ) ) ;
}
}