summaryrefslogtreecommitdiff
path: root/node/Network.cpp
diff options
context:
space:
mode:
authorGrant Limberg <glimberg@gmail.com>2015-07-07 19:24:02 -0700
committerGrant Limberg <glimberg@gmail.com>2015-07-07 19:24:02 -0700
commit1ad2cfeedfa2a9f4fc1f512e1009e5bb1b0630cb (patch)
treed8264c9bd4f6b9dce3f5237b94fe1f2fc521cf19 /node/Network.cpp
parent6d398beefddb48d91f27e5f41bf39f40eb77222f (diff)
parent412389ec755528108e0254e75a9cf43fc53e331a (diff)
downloadinfinitytier-1ad2cfeedfa2a9f4fc1f512e1009e5bb1b0630cb.tar.gz
infinitytier-1ad2cfeedfa2a9f4fc1f512e1009e5bb1b0630cb.zip
Merge branch 'adamierymenko-dev' into android-jni
Diffstat (limited to 'node/Network.cpp')
-rw-r--r--node/Network.cpp56
1 files changed, 29 insertions, 27 deletions
diff --git a/node/Network.cpp b/node/Network.cpp
index 4414e4d1..adc8e1b8 100644
--- a/node/Network.cpp
+++ b/node/Network.cpp
@@ -264,56 +264,58 @@ void Network::requestConfiguration()
outp.append((uint64_t)_config->revision());
else outp.append((uint64_t)0);
}
- RR->sw->send(outp,true,_id);
+ RR->sw->send(outp,true,0);
}
-void Network::addMembershipCertificate(const CertificateOfMembership &cert,bool forceAccept)
+bool Network::validateAndAddMembershipCertificate(const CertificateOfMembership &cert)
{
if (!cert) // sanity check
- return;
+ return false;
Mutex::Lock _l(_lock);
CertificateOfMembership &old = _membershipCertificates[cert.issuedTo()];
// Nothing to do if the cert hasn't changed -- we get duplicates due to zealous cert pushing
if (old == cert)
- return;
+ return true; // but if it's a duplicate of one we already accepted, return is 'true'
// Check signature, log and return if cert is invalid
- if (!forceAccept) {
- if (cert.signedBy() != controller()) {
- TRACE("rejected network membership certificate for %.16llx signed by %s: signer not a controller of this network",(unsigned long long)_id,cert.signedBy().toString().c_str());
- return;
+ if (cert.signedBy() != controller()) {
+ TRACE("rejected network membership certificate for %.16llx signed by %s: signer not a controller of this network",(unsigned long long)_id,cert.signedBy().toString().c_str());
+ return false; // invalid signer
+ }
+
+ if (cert.signedBy() == RR->identity.address()) {
+
+ // We are the controller: RR->identity.address() == controller() == cert.signedBy()
+ // So, verify that we signed th cert ourself
+ if (!cert.verify(RR->identity)) {
+ TRACE("rejected network membership certificate for %.16llx self signed by %s: signature check failed",(unsigned long long)_id,cert.signedBy().toString().c_str());
+ return false; // invalid signature
}
- if (cert.signedBy() == RR->identity.address()) {
- // We are the controller: RR->identity.address() == controller() == cert.signedBy()
- // So, verify that we signed th cert ourself
- if (!cert.verify(RR->identity)) {
- TRACE("rejected network membership certificate for %.16llx self signed by %s: signature check failed",(unsigned long long)_id,cert.signedBy().toString().c_str());
- return;
- }
- } else {
+ } else {
- SharedPtr<Peer> signer(RR->topology->getPeer(cert.signedBy()));
+ SharedPtr<Peer> signer(RR->topology->getPeer(cert.signedBy()));
- if (!signer) {
- // This would be rather odd, since this is our controller... could happen
- // if we get packets before we've gotten config.
- RR->sw->requestWhois(cert.signedBy());
- return;
- }
+ if (!signer) {
+ // This would be rather odd, since this is our controller... could happen
+ // if we get packets before we've gotten config.
+ RR->sw->requestWhois(cert.signedBy());
+ return false; // signer unknown
+ }
- if (!cert.verify(signer->identity())) {
- TRACE("rejected network membership certificate for %.16llx signed by %s: signature check failed",(unsigned long long)_id,cert.signedBy().toString().c_str());
- return;
- }
+ if (!cert.verify(signer->identity())) {
+ TRACE("rejected network membership certificate for %.16llx signed by %s: signature check failed",(unsigned long long)_id,cert.signedBy().toString().c_str());
+ return false; // invalid signature
}
}
// If we made it past authentication, update cert
if (cert.revision() != old.revision())
old = cert;
+
+ return true;
}
bool Network::peerNeedsOurMembershipCertificate(const Address &to,uint64_t now)