summaryrefslogtreecommitdiff
path: root/node/Network.cpp
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2013-07-29 17:11:00 -0400
committerAdam Ierymenko <adam.ierymenko@gmail.com>2013-07-29 17:11:00 -0400
commite4c5ad9f43f37f3c5cd9feb1035d3b3091820e43 (patch)
treec5c44341fc0aa527362c89702fc503866416c58a /node/Network.cpp
parent439e602d5a5712d1b33fb19d558d0e9fdf784703 (diff)
downloadinfinitytier-e4c5ad9f43f37f3c5cd9feb1035d3b3091820e43.tar.gz
infinitytier-e4c5ad9f43f37f3c5cd9feb1035d3b3091820e43.zip
More work on network membership certs, and it builds now. Still in heavy development.
Diffstat (limited to 'node/Network.cpp')
-rw-r--r--node/Network.cpp35
1 files changed, 33 insertions, 2 deletions
diff --git a/node/Network.cpp b/node/Network.cpp
index 696426e4..5878a281 100644
--- a/node/Network.cpp
+++ b/node/Network.cpp
@@ -103,8 +103,7 @@ Network::Network(const RuntimeEnvironment *renv,uint64_t id)
throw(std::runtime_error) :
_r(renv),
_tap(renv,renv->identity.address().toMAC(),ZT_IF_MTU,&_CBhandleTapData,this),
- _id(id),
- _isOpen(false)
+ _id(id)
{
}
@@ -114,12 +113,44 @@ Network::~Network()
void Network::setConfiguration(const Network::Config &conf)
{
+ Mutex::Lock _l(_lock);
+ _configuration = conf;
+ _myCertificate = conf.certificateOfMembership();
}
void Network::requestConfiguration()
{
}
+bool Network::isAllowed(const Address &peer) const
+{
+ try {
+ Mutex::Lock _l(_lock);
+ if (_configuration.isOpen())
+ return true;
+ std::map<Address,Certificate>::const_iterator pc(_membershipCertificates.find(peer));
+ if (pc == _membershipCertificates.end())
+ return false;
+ return _myCertificate.qualifyMembership(pc->second);
+ } catch (std::exception &exc) {
+ TRACE("isAllowed() check failed for peer %s: unexpected exception: %s",peer.toString().c_str(),exc.what());
+ return false;
+ } catch ( ... ) {
+ TRACE("isAllowed() check failed for peer %s: unexpected exception: unknown exception",peer.toString().c_str());
+ return false;
+ }
+}
+
+void Network::clean()
+{
+ Mutex::Lock _l(_lock);
+ for(std::map<Address,Certificate>::iterator i=(_membershipCertificates.begin());i!=_membershipCertificates.end();) {
+ if (_myCertificate.qualifyMembership(i->second))
+ ++i;
+ else _membershipCertificates.erase(i++);
+ }
+}
+
void Network::_CBhandleTapData(void *arg,const MAC &from,const MAC &to,unsigned int etherType,const Buffer<4096> &data)
{
const RuntimeEnvironment *_r = ((Network *)arg)->_r;