|
@@ -286,18 +286,28 @@ void Network::addMembershipCertificate(const CertificateOfMembership &cert,bool
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- SharedPtr<Peer> signer(RR->topology->getPeer(cert.signedBy()));
|
|
|
+ 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 {
|
|
|
|
|
|
- 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;
|
|
|
- }
|
|
|
+ SharedPtr<Peer> signer(RR->topology->getPeer(cert.signedBy()));
|
|
|
|
|
|
- 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 (!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 (!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;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|