mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-02-17 13:24:15 -05:00
limited webinterface to localhost by default, added command line option to listen on all interfaces
git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@8076 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
parent
ae0603a687
commit
45ac4cca06
1
TODO.txt
1
TODO.txt
@ -90,6 +90,7 @@ H [ ] valgrind pass for memory leaks
|
|||||||
H [ ] valgrind pass for memory errors
|
H [ ] valgrind pass for memory errors
|
||||||
H [ ] valgrind pass for performance
|
H [ ] valgrind pass for performance
|
||||||
E [ ] remove mktemp => use mkstemp
|
E [ ] remove mktemp => use mkstemp
|
||||||
|
note: mkstemp is not available on Windows
|
||||||
H [ ] RsGxsDataAccess::processRequests locks mDataMutex until all requests are processed.
|
H [ ] RsGxsDataAccess::processRequests locks mDataMutex until all requests are processed.
|
||||||
Adding a new request or poll for the request status are freezing until the mutex is available.
|
Adding a new request or poll for the request status are freezing until the mutex is available.
|
||||||
|
|
||||||
|
@ -228,15 +228,9 @@ public:
|
|||||||
};
|
};
|
||||||
#endif // ENABLE_FILESTREAMER
|
#endif // ENABLE_FILESTREAMER
|
||||||
|
|
||||||
ApiServerMHD::ApiServerMHD(std::string root_dir, uint16_t port):
|
ApiServerMHD::ApiServerMHD():
|
||||||
mRootDir(root_dir), mPort(port),
|
mConfigOk(false), mDaemon(0)
|
||||||
mDaemon(0)
|
|
||||||
{
|
{
|
||||||
// make sure the docroot dir ends with a slash
|
|
||||||
if(mRootDir.empty())
|
|
||||||
mRootDir = "./";
|
|
||||||
else if (mRootDir[mRootDir.size()-1] != '/' && mRootDir[mRootDir.size()-1] != '\\')
|
|
||||||
mRootDir += "/";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ApiServerMHD::~ApiServerMHD()
|
ApiServerMHD::~ApiServerMHD()
|
||||||
@ -244,21 +238,64 @@ ApiServerMHD::~ApiServerMHD()
|
|||||||
stop();
|
stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ApiServerMHD::configure(std::string docroot, uint16_t port, std::string bind_address, bool allow_from_all)
|
||||||
|
{
|
||||||
|
mRootDir = docroot;
|
||||||
|
// make sure the docroot dir ends with a slash
|
||||||
|
if(mRootDir.empty())
|
||||||
|
mRootDir = "./";
|
||||||
|
else if (mRootDir[mRootDir.size()-1] != '/' && mRootDir[mRootDir.size()-1] != '\\')
|
||||||
|
mRootDir += "/";
|
||||||
|
|
||||||
|
mListenAddr.sin_family = AF_INET;
|
||||||
|
mListenAddr.sin_port = htons(port);
|
||||||
|
|
||||||
|
// untested
|
||||||
|
/*
|
||||||
|
if(!bind_address.empty())
|
||||||
|
{
|
||||||
|
if(!inet_pton(AF_INET6, bind_address.c_str(), &mListenAddr.sin6_addr))
|
||||||
|
{
|
||||||
|
std::cerr << "ApiServerMHD::configure() invalid bind address: \"" << bind_address << "\"" << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else*/ if(allow_from_all)
|
||||||
|
{
|
||||||
|
mListenAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
|
||||||
|
std::cerr << "ApiServerMHD::configure(): will serve the webinterface to ALL IP adresses." << std::endl;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mListenAddr.sin_addr.S_un.S_addr = htonl(INADDR_LOOPBACK);
|
||||||
|
std::cerr << "ApiServerMHD::configure(): will serve the webinterface to LOCALHOST only." << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
mConfigOk = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool ApiServerMHD::start()
|
bool ApiServerMHD::start()
|
||||||
{
|
{
|
||||||
|
if(!mConfigOk)
|
||||||
|
{
|
||||||
|
std::cerr << "ApiServerMHD::start() ERROR: server not configured. You have to call configure() first." << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if(mDaemon)
|
if(mDaemon)
|
||||||
{
|
{
|
||||||
std::cerr << "ApiServerMHD::start() ERROR: server already started. You have to call stop() first." << std::endl;
|
std::cerr << "ApiServerMHD::start() ERROR: server already started. You have to call stop() first." << std::endl;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
mDaemon = MHD_start_daemon(MHD_USE_SELECT_INTERNALLY, mPort,
|
mDaemon = MHD_start_daemon(MHD_USE_SELECT_INTERNALLY, 9999, // port will be overwritten by MHD_OPTION_SOCK_ADDR
|
||||||
&static_acceptPolicyCallback, this,
|
&static_acceptPolicyCallback, this,
|
||||||
&static_accessHandlerCallback, this,
|
&static_accessHandlerCallback, this,
|
||||||
MHD_OPTION_NOTIFY_COMPLETED, &static_requestCompletedCallback, this,
|
MHD_OPTION_NOTIFY_COMPLETED, &static_requestCompletedCallback, this,
|
||||||
|
MHD_OPTION_SOCK_ADDR, &mListenAddr,
|
||||||
MHD_OPTION_END);
|
MHD_OPTION_END);
|
||||||
if(mDaemon)
|
if(mDaemon)
|
||||||
{
|
{
|
||||||
std::cerr << "ApiServerMHD::start() SUCCESS. Started server on port " << mPort << ". Serving files from \"" << mRootDir << "\" at /" << std::endl;
|
std::cerr << "ApiServerMHD::start() SUCCESS. Started server on port " << ntohs(mListenAddr.sin_port) << ". Serving files from \"" << mRootDir << "\" at /" << std::endl;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -306,16 +343,9 @@ void ApiServerMHD::static_requestCompletedCallback(void *cls, MHD_Connection* co
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int ApiServerMHD::acceptPolicyCallback(const sockaddr *addr, socklen_t addrlen)
|
int ApiServerMHD::acceptPolicyCallback(const sockaddr* /*addr*/, socklen_t /*addrlen*/)
|
||||||
{
|
{
|
||||||
// limit to localhost
|
// accept all connetions
|
||||||
// denies from localhost, TODO
|
|
||||||
/*
|
|
||||||
if(addr->sa_family == AF_INET && ((sockaddr_in*)addr)->sin_addr.s_addr == INADDR_LOOPBACK)
|
|
||||||
return MHD_YES;
|
|
||||||
else
|
|
||||||
return MHD_NO;
|
|
||||||
*/
|
|
||||||
return MHD_YES;
|
return MHD_YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,8 +14,17 @@ namespace resource_api{
|
|||||||
class ApiServerMHD
|
class ApiServerMHD
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ApiServerMHD(std::string root_dir, uint16_t port);
|
ApiServerMHD();
|
||||||
~ApiServerMHD();
|
~ApiServerMHD();
|
||||||
|
/**
|
||||||
|
* @brief configure the http server
|
||||||
|
* @param docroot sets the directory from which static files should be served. default = ./
|
||||||
|
* @param port the port to listen on. The server will listen on ipv4 and ipv6.
|
||||||
|
* @param bind_address NOT IMPLEMENTED optional, specifies an ipv6 adress to listen on.
|
||||||
|
* @param allow_from_all when true, listen on all ips. (only when bind_adress is empty)
|
||||||
|
* @return true on success
|
||||||
|
*/
|
||||||
|
bool configure(std::string docroot, uint16_t port, std::string bind_address, bool allow_from_all);
|
||||||
bool start();
|
bool start();
|
||||||
void stop();
|
void stop();
|
||||||
|
|
||||||
@ -32,8 +41,9 @@ private:
|
|||||||
int acceptPolicyCallback(const struct sockaddr * addr, socklen_t addrlen);
|
int acceptPolicyCallback(const struct sockaddr * addr, socklen_t addrlen);
|
||||||
int accessHandlerCallback(struct MHD_Connection * connection, const char *url, const char *method, const char *version, const char *upload_data, size_t *upload_data_size, void **con_cls);
|
int accessHandlerCallback(struct MHD_Connection * connection, const char *url, const char *method, const char *version, const char *upload_data, size_t *upload_data_size, void **con_cls);
|
||||||
void requestCompletedCallback(struct MHD_Connection *connection, void **con_cls, MHD_RequestTerminationCode toe);
|
void requestCompletedCallback(struct MHD_Connection *connection, void **con_cls, MHD_RequestTerminationCode toe);
|
||||||
|
bool mConfigOk;
|
||||||
std::string mRootDir;
|
std::string mRootDir;
|
||||||
uint16_t mPort;
|
struct sockaddr_in mListenAddr;
|
||||||
MHD_Daemon* mDaemon;
|
MHD_Daemon* mDaemon;
|
||||||
ApiServer mApiServer;
|
ApiServer mApiServer;
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user