blob: 2bb51530166e535b4ebc0923722a287e1d91b7df [file] [log] [blame]
Yingdi Yu9236c432013-10-18 11:29:25 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
2/*
Junxiao Shid5798f22016-08-22 02:33:26 +00003 * Copyright (c) 2013-2016, Regents of the University of California
4 * Yingdi Yu
Yingdi Yu9236c432013-10-18 11:29:25 -07005 *
6 * BSD license, See the LICENSE file for more information
7 *
8 * Author: Yingdi Yu <yingdi@cs.ucla.edu>
Qiuhan Ding0cfc1512015-02-17 17:44:11 -08009 * Qiuhan Ding <qiuhanding@cs.ucla.edu>
Yingdi Yu9236c432013-10-18 11:29:25 -070010 */
11
Yingdi Yuf8f572d2014-01-13 11:19:47 -080012#if __clang__
Yingdi Yuf8f572d2014-01-13 11:19:47 -080013#pragma clang diagnostic ignored "-Wtautological-compare"
Yingdi Yuf8f572d2014-01-13 11:19:47 -080014#endif
15
Yingdi Yu0b0a7362014-08-05 16:31:30 -070016#include "contact-manager.hpp"
Yingdi Yu348f5ea2014-03-01 14:47:25 -080017#include <QStringList>
Yingdi Yu06f572b2014-03-11 15:46:10 -070018#include <QFile>
Yingdi Yu9236c432013-10-18 11:29:25 -070019
Yingdi Yu4685b1b2013-10-18 17:05:02 -070020#ifndef Q_MOC_RUN
Junxiao Shid5798f22016-08-22 02:33:26 +000021#include <ndn-cxx/encoding/buffer-stream.hpp>
Varun Patil3d850902020-11-23 12:19:14 +053022#include <ndn-cxx/face.hpp>
23#include <ndn-cxx/security/validator.hpp>
24#include <ndn-cxx/security/validator-null.hpp>
25#include <ndn-cxx/security/signing-helpers.hpp>
26#include <ndn-cxx/security/verification-helpers.hpp>
Yingdi Yu0b0a7362014-08-05 16:31:30 -070027#include "cryptopp.hpp"
Yingdi Yu348f5ea2014-03-01 14:47:25 -080028#include <boost/asio.hpp>
29#include <boost/tokenizer.hpp>
30#include <boost/filesystem.hpp>
Yingdi Yuec3d9a32013-10-18 18:35:09 -070031#include "logging.h"
Yingdi Yu4685b1b2013-10-18 17:05:02 -070032#endif
Yingdi Yu9236c432013-10-18 11:29:25 -070033
Yingdi Yu348f5ea2014-03-01 14:47:25 -080034namespace fs = boost::filesystem;
Yingdi Yu9236c432013-10-18 11:29:25 -070035
Yingdi Yueb692ac2015-02-10 18:46:18 -080036namespace chronochat {
Yingdi Yu4685b1b2013-10-18 17:05:02 -070037
Yingdi Yu0b0a7362014-08-05 16:31:30 -070038using std::string;
39using std::map;
40using std::vector;
41
42using ndn::Face;
43using ndn::OBufferStream;
Varun Patil3d850902020-11-23 12:19:14 +053044using ndn::security::Certificate;
Yingdi Yu17032f82014-03-25 15:48:23 -070045
Yingdi Yu348f5ea2014-03-01 14:47:25 -080046
Yingdi Yu2c9e7712014-10-20 11:55:05 -070047ContactManager::ContactManager(Face& face,
Yingdi Yufa4ce792014-02-06 18:09:22 -080048 QObject* parent)
49 : QObject(parent)
Yingdi Yufa4ce792014-02-06 18:09:22 -080050 , m_face(face)
51{
Yingdi Yu76dd8002013-12-24 11:16:32 +080052 initializeSecurity();
Yingdi Yu9236c432013-10-18 11:29:25 -070053}
54
55ContactManager::~ContactManager()
Yingdi Yu0b0a7362014-08-05 16:31:30 -070056{
57}
Yingdi Yu9236c432013-10-18 11:29:25 -070058
Yingdi Yu76dd8002013-12-24 11:16:32 +080059void
60ContactManager::initializeSecurity()
61{
Varun Patil3d850902020-11-23 12:19:14 +053062 m_validator = make_shared<ndn::security::ValidatorConfig>(m_face);
63 m_validator->load("security/validation-contact-manager.conf");
Yingdi Yu76dd8002013-12-24 11:16:32 +080064}
65
66void
Yingdi Yufa4ce792014-02-06 18:09:22 -080067ContactManager::fetchCollectEndorse(const Name& identity)
Yingdi Yub2e747d2013-11-05 23:06:43 -080068{
69 Name interestName = identity;
70 interestName.append("DNS").append("ENDORSED");
71
Yingdi Yu76dd8002013-12-24 11:16:32 +080072 Interest interest(interestName);
Yingdi Yua7876722014-03-25 14:46:55 -070073 interest.setInterestLifetime(time::milliseconds(1000));
Varun Patil3d850902020-11-23 12:19:14 +053074 interest.setCanBePrefix(true);
Yingdi Yufa4ce792014-02-06 18:09:22 -080075 interest.setMustBeFresh(true);
Yingdi Yu76dd8002013-12-24 11:16:32 +080076
Varun Patil3d850902020-11-23 12:19:14 +053077 ndn::security::DataValidationSuccessCallback onValidated =
Yingdi Yu0b0a7362014-08-05 16:31:30 -070078 bind(&ContactManager::onDnsCollectEndorseValidated, this, _1, identity);
Varun Patil3d850902020-11-23 12:19:14 +053079 ndn::security::DataValidationFailureCallback onValidationFailed =
Yingdi Yu0b0a7362014-08-05 16:31:30 -070080 bind(&ContactManager::onDnsCollectEndorseValidationFailed, this, _1, _2, identity);
81 TimeoutNotify timeoutNotify =
82 bind(&ContactManager::onDnsCollectEndorseTimeoutNotify, this, _1, identity);
Yingdi Yu76dd8002013-12-24 11:16:32 +080083
Yingdi Yu348f5ea2014-03-01 14:47:25 -080084 sendInterest(interest, onValidated, onValidationFailed, timeoutNotify, 0);
Yingdi Yub2e747d2013-11-05 23:06:43 -080085}
86
87void
Qiuhan Ding0cfc1512015-02-17 17:44:11 -080088ContactManager::fetchEndorseCertificateInternal(const Name& identity, size_t certIndex)
Yingdi Yub2e747d2013-11-05 23:06:43 -080089{
Yingdi Yu0b0a7362014-08-05 16:31:30 -070090 shared_ptr<EndorseCollection> endorseCollection =
91 m_bufferedContacts[identity].m_endorseCollection;
Yingdi Yu348f5ea2014-03-01 14:47:25 -080092
Qiuhan Ding0cfc1512015-02-17 17:44:11 -080093 if(certIndex >= endorseCollection->getCollectionEntries().size())
Varun Patil3d850902020-11-23 12:19:14 +053094 return prepareEndorseInfo(identity);
Yingdi Yu348f5ea2014-03-01 14:47:25 -080095
Qiuhan Ding0cfc1512015-02-17 17:44:11 -080096 Name interestName(endorseCollection->getCollectionEntries()[certIndex].certName);
Yingdi Yu348f5ea2014-03-01 14:47:25 -080097
Yingdi Yu76dd8002013-12-24 11:16:32 +080098 Interest interest(interestName);
Yingdi Yua7876722014-03-25 14:46:55 -070099 interest.setInterestLifetime(time::milliseconds(1000));
Varun Patil3d850902020-11-23 12:19:14 +0530100 interest.setMustBeFresh(false);
Yingdi Yu76dd8002013-12-24 11:16:32 +0800101
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700102 m_face.expressInterest(interest,
103 bind(&ContactManager::onEndorseCertificateInternal,
104 this, _1, _2, identity, certIndex,
Qiuhan Ding0cfc1512015-02-17 17:44:11 -0800105 endorseCollection->getCollectionEntries()[certIndex].hash),
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700106 bind(&ContactManager::onEndorseCertificateInternalTimeout,
Varun Patil3d850902020-11-23 12:19:14 +0530107 this, _1, identity, certIndex),
108 bind(&ContactManager::onEndorseCertificateInternalTimeout,
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700109 this, _1, identity, certIndex));
Yingdi Yu76dd8002013-12-24 11:16:32 +0800110}
111
Yingdi Yu76dd8002013-12-24 11:16:32 +0800112void
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800113ContactManager::prepareEndorseInfo(const Name& identity)
Yingdi Yu76dd8002013-12-24 11:16:32 +0800114{
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800115 // _LOG_DEBUG("prepareEndorseInfo");
116 const Profile& profile = m_bufferedContacts[identity].m_selfEndorseCert->getProfile();
Yingdi Yu76dd8002013-12-24 11:16:32 +0800117
Qiuhan Ding0cfc1512015-02-17 17:44:11 -0800118 shared_ptr<EndorseInfo> endorseInfo = make_shared<EndorseInfo>();
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800119 m_bufferedContacts[identity].m_endorseInfo = endorseInfo;
120
Qiuhan Ding0cfc1512015-02-17 17:44:11 -0800121 map<string, size_t> endorseCount;
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700122 for (Profile::const_iterator pIt = profile.begin(); pIt != profile.end(); pIt++) {
123 // _LOG_DEBUG("prepareEndorseInfo: profile[" << pIt->first << "]: " << pIt->second);
124 endorseCount[pIt->first] = 0;
125 }
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800126
Qiuhan Ding0cfc1512015-02-17 17:44:11 -0800127 size_t endorseCertCount = 0;
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800128
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700129 vector<shared_ptr<EndorseCertificate> >::const_iterator cIt =
130 m_bufferedContacts[identity].m_endorseCertList.begin();
131 vector<shared_ptr<EndorseCertificate> >::const_iterator cEnd =
132 m_bufferedContacts[identity].m_endorseCertList.end();
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800133
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700134 for (; cIt != cEnd; cIt++, endorseCertCount++) {
Varun Patil3d850902020-11-23 12:19:14 +0530135 shared_ptr<Contact> contact = getContact((*cIt)->getSigner());
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700136 if (!static_cast<bool>(contact))
137 continue;
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700138
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700139 if (!contact->isIntroducer() ||
140 !contact->canBeTrustedFor(profile.getIdentityName()))
141 continue;
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800142
Varun Patil3d850902020-11-23 12:19:14 +0530143 if (!(*cIt)->isValid())
144 continue;
145
146 if (!ndn::security::verifySignature(**cIt, contact->getPublicKey().data(), contact->getPublicKey().size()))
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700147 continue;
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800148
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700149 const Profile& tmpProfile = (*cIt)->getProfile();
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700150 const vector<string>& endorseList = (*cIt)->getEndorseList();
151 for (vector<string>::const_iterator eIt = endorseList.begin(); eIt != endorseList.end(); eIt++)
Varun Patil3d850902020-11-23 12:19:14 +0530152 if (tmpProfile.get(*eIt) == profile.get(*eIt))
153 endorseCount[*eIt] += 1;
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700154 }
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800155
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700156 for (Profile::const_iterator pIt = profile.begin(); pIt != profile.end(); pIt++) {
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700157 std::stringstream ss;
158 ss << endorseCount[pIt->first] << "/" << endorseCertCount;
Qiuhan Ding0cfc1512015-02-17 17:44:11 -0800159 endorseInfo->addEndorsement(pIt->first, pIt->second, ss.str());
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700160 }
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800161
162 emit contactEndorseInfoReady (*endorseInfo);
163}
164
165void
Varun Patil3d850902020-11-23 12:19:14 +0530166ContactManager::onDnsSelfEndorseCertValidated(const Data& data,
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800167 const Name& identity)
168{
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700169 try {
170 Data plainData;
Varun Patil3d850902020-11-23 12:19:14 +0530171 plainData.wireDecode(data.getContent().blockFromValue());
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700172 shared_ptr<EndorseCertificate> selfEndorseCertificate =
173 make_shared<EndorseCertificate>(boost::cref(plainData));
Varun Patil3d850902020-11-23 12:19:14 +0530174
175 if (ndn::security::verifySignature(plainData, *selfEndorseCertificate)) {
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700176 m_bufferedContacts[identity].m_selfEndorseCert = selfEndorseCertificate;
177 fetchCollectEndorse(identity);
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800178 }
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700179 else
Varun Patil3d850902020-11-23 12:19:14 +0530180 emit contactInfoFetchFailed(QString::fromStdString(identity.toUri() + ": verification failed"));
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700181 }
182 catch(Block::Error& e) {
Varun Patil3d850902020-11-23 12:19:14 +0530183 emit contactInfoFetchFailed(QString::fromStdString(identity.toUri() + ": block error " + e.what()));
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700184 }
Yingdi Yu1cc45d92015-02-09 14:19:54 -0800185 catch(EndorseCertificate::Error& e) {
Varun Patil3d850902020-11-23 12:19:14 +0530186 emit contactInfoFetchFailed(QString::fromStdString(identity.toUri() + ": cert error " + e.what()));
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700187 }
Yingdi Yu1cc45d92015-02-09 14:19:54 -0800188 catch(Data::Error& e) {
Varun Patil3d850902020-11-23 12:19:14 +0530189 emit contactInfoFetchFailed(QString::fromStdString(identity.toUri() + ": data error " + e.what()));
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700190 }
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800191}
192
193void
Varun Patil3d850902020-11-23 12:19:14 +0530194ContactManager::onDnsSelfEndorseCertValidationFailed(const Data& data,
195 const ndn::security::ValidationError& error,
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800196 const Name& identity)
197{
198 // If we cannot validate the Self-Endorse-Certificate, we may retry or fetch id-cert,
199 // but let's stay with failure for now.
200 emit contactInfoFetchFailed(QString::fromStdString(identity.toUri()));
201}
202
203void
204ContactManager::onDnsSelfEndorseCertTimeoutNotify(const Interest& interest,
205 const Name& identity)
206{
207 // If we cannot validate the Self-Endorse-Certificate, we may retry or fetch id-cert,
208 // but let's stay with failure for now.
209 emit contactInfoFetchFailed(QString::fromStdString(identity.toUri()));
210}
211
212void
Varun Patil3d850902020-11-23 12:19:14 +0530213ContactManager::onDnsCollectEndorseValidated(const Data& data,
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800214 const Name& identity)
215{
Qiuhan Ding0cfc1512015-02-17 17:44:11 -0800216 try {
217 shared_ptr<EndorseCollection> endorseCollection =
Varun Patil3d850902020-11-23 12:19:14 +0530218 make_shared<EndorseCollection>(data.getContent().blockFromValue());
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700219 m_bufferedContacts[identity].m_endorseCollection = endorseCollection;
220 fetchEndorseCertificateInternal(identity, 0);
221 }
Varun Patil3d850902020-11-23 12:19:14 +0530222 catch (std::runtime_error&) {
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800223 prepareEndorseInfo(identity);
Qiuhan Ding0cfc1512015-02-17 17:44:11 -0800224 }
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800225}
226
227void
Varun Patil3d850902020-11-23 12:19:14 +0530228ContactManager::onDnsCollectEndorseValidationFailed(const Data& data,
229 const ndn::security::ValidationError& error,
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800230 const Name& identity)
231{
232 prepareEndorseInfo(identity);
233}
234
235void
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700236ContactManager::onDnsCollectEndorseTimeoutNotify(const Interest& interest, const Name& identity)
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800237{
238 // _LOG_DEBUG("onDnsCollectEndorseTimeoutNotify: " << interest.getName());
239 prepareEndorseInfo(identity);
240}
241
242void
Varun Patil3d850902020-11-23 12:19:14 +0530243ContactManager::onEndorseCertificateInternal(const Interest& interest, const Data& data,
Qiuhan Ding0cfc1512015-02-17 17:44:11 -0800244 const Name& identity, size_t certIndex,
245 string hash)
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800246{
Yingdi Yu17032f82014-03-25 15:48:23 -0700247 std::stringstream ss;
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700248 {
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800249 using namespace CryptoPP;
250
251 SHA256 hash;
252 StringSource(data.wireEncode().wire(), data.wireEncode().size(), true,
253 new HashFilter(hash, new FileSink(ss)));
254 }
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700255
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700256 if (ss.str() == hash) {
257 shared_ptr<EndorseCertificate> endorseCertificate =
258 make_shared<EndorseCertificate>(boost::cref(data));
259 m_bufferedContacts[identity].m_endorseCertList.push_back(endorseCertificate);
260 }
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800261
262 fetchEndorseCertificateInternal(identity, certIndex+1);
263}
264
265void
266ContactManager::onEndorseCertificateInternalTimeout(const Interest& interest,
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700267 const Name& identity,
Qiuhan Ding0cfc1512015-02-17 17:44:11 -0800268 size_t certIndex)
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800269{
270 fetchEndorseCertificateInternal(identity, certIndex+1);
271}
272
273void
274ContactManager::collectEndorsement()
275{
276 {
277 boost::recursive_mutex::scoped_lock lock(m_collectCountMutex);
278 m_collectCount = m_contactList.size();
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700279
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700280 for (ContactList::iterator it = m_contactList.begin(); it != m_contactList.end(); it++) {
281 Name interestName = (*it)->getNameSpace();
282 interestName.append("DNS").append(m_identity.wireEncode()).append("ENDORSEE");
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800283
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700284 Interest interest(interestName);
Varun Patil3d850902020-11-23 12:19:14 +0530285 interest.setMustBeFresh(true);
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700286 interest.setInterestLifetime(time::milliseconds(1000));
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700287
Varun Patil3d850902020-11-23 12:19:14 +0530288 ndn::security::DataValidationSuccessCallback onValidated =
289 bind(&ContactManager::onDnsEndorseeValidated, this, _1);
290 ndn::security::DataValidationFailureCallback onValidationFailed =
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700291 bind(&ContactManager::onDnsEndorseeValidationFailed, this, _1, _2);
292 TimeoutNotify timeoutNotify = bind(&ContactManager::onDnsEndorseeTimeoutNotify, this, _1);
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700293
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700294 sendInterest(interest, onValidated, onValidationFailed, timeoutNotify, 0);
295 }
Yingdi Yu76dd8002013-12-24 11:16:32 +0800296 }
297}
298
299void
Varun Patil3d850902020-11-23 12:19:14 +0530300ContactManager::onDnsEndorseeValidated(const Data& data)
Yingdi Yuae8217c2013-11-09 00:03:26 -0800301{
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800302 Data endorseData;
Varun Patil3d850902020-11-23 12:19:14 +0530303 endorseData.wireDecode(data.getContent().blockFromValue());
Yingdi Yu76dd8002013-12-24 11:16:32 +0800304
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800305 EndorseCertificate endorseCertificate(endorseData);
306 m_contactStorage->updateCollectEndorse(endorseCertificate);
Yingdi Yu76dd8002013-12-24 11:16:32 +0800307
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800308 decreaseCollectStatus();
Yingdi Yu76dd8002013-12-24 11:16:32 +0800309}
Yingdi Yuae8217c2013-11-09 00:03:26 -0800310
311void
Varun Patil3d850902020-11-23 12:19:14 +0530312ContactManager::onDnsEndorseeValidationFailed(const Data& data,
313 const ndn::security::ValidationError& error)
Yingdi Yu4685b1b2013-10-18 17:05:02 -0700314{
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800315 decreaseCollectStatus();
Yingdi Yu4685b1b2013-10-18 17:05:02 -0700316}
317
Yingdi Yub2e747d2013-11-05 23:06:43 -0800318void
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800319ContactManager::onDnsEndorseeTimeoutNotify(const Interest& interest)
Yingdi Yub2e747d2013-11-05 23:06:43 -0800320{
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800321 decreaseCollectStatus();
Yingdi Yub2e747d2013-11-05 23:06:43 -0800322}
323
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700324void
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800325ContactManager::decreaseCollectStatus()
Yingdi Yub2e747d2013-11-05 23:06:43 -0800326{
Qiuhan Ding0cfc1512015-02-17 17:44:11 -0800327 size_t count;
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800328 {
329 boost::recursive_mutex::scoped_lock lock(m_collectCountMutex);
330 m_collectCount--;
331 count = m_collectCount;
332 }
Yingdi Yub2e747d2013-11-05 23:06:43 -0800333
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800334 if(count == 0)
335 publishCollectEndorsedDataInDNS();
336}
Yingdi Yub2e747d2013-11-05 23:06:43 -0800337
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800338void
339ContactManager::publishCollectEndorsedDataInDNS()
340{
341 Name dnsName = m_identity;
342 dnsName.append("DNS").append("ENDORSED").appendVersion();
Yingdi Yub2e747d2013-11-05 23:06:43 -0800343
Yingdi Yu6c3c5962014-09-09 16:52:38 -0700344 shared_ptr<Data> data = make_shared<Data>();
345 data->setName(dnsName);
Varun Patil3d850902020-11-23 12:19:14 +0530346 data->setFreshnessPeriod(time::milliseconds(1000));
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800347
348 EndorseCollection endorseCollection;
349 m_contactStorage->getCollectEndorse(endorseCollection);
350
Qiuhan Ding0cfc1512015-02-17 17:44:11 -0800351 data->setContent(endorseCollection.wireEncode());
Varun Patil3d850902020-11-23 12:19:14 +0530352
353 m_keyChain.sign(*data, ndn::security::signingByIdentity(m_identity));
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800354
Yingdi Yu6c3c5962014-09-09 16:52:38 -0700355 m_contactStorage->updateDnsOthersEndorse(*data);
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700356 m_face.put(*data);
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800357}
358
359void
Varun Patil3d850902020-11-23 12:19:14 +0530360ContactManager::onIdentityCertValidated(const Data& data)
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800361{
Varun Patil3d850902020-11-23 12:19:14 +0530362 shared_ptr<Certificate> cert = make_shared<Certificate>(boost::cref(data));
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800363 m_bufferedIdCerts[cert->getName()] = cert;
364 decreaseIdCertCount();
365}
366
367void
Varun Patil3d850902020-11-23 12:19:14 +0530368ContactManager::onIdentityCertValidationFailed(const Data& data,
369 const ndn::security::ValidationError& error)
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800370{
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700371 // _LOG_DEBUG("ContactManager::onIdentityCertValidationFailed " << data->getName());
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800372 decreaseIdCertCount();
373}
374
375void
376ContactManager::onIdentityCertTimeoutNotify(const Interest& interest)
377{
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700378 // _LOG_DEBUG("ContactManager::onIdentityCertTimeoutNotify: " << interest.getName());
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800379 decreaseIdCertCount();
380}
381
382void
383ContactManager::decreaseIdCertCount()
384{
Qiuhan Ding0cfc1512015-02-17 17:44:11 -0800385 size_t count;
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800386 {
387 boost::recursive_mutex::scoped_lock lock(m_idCertCountMutex);
388 m_idCertCount--;
389 count = m_idCertCount;
390 }
391
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700392 if (count == 0) {
393 QStringList certNameList;
394 QStringList nameList;
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800395
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700396 for(BufferedIdCerts::const_iterator it = m_bufferedIdCerts.begin();
397 it != m_bufferedIdCerts.end(); it++) {
398 certNameList << QString::fromStdString(it->second->getName().toUri());
399 Profile profile(*(it->second));
400 nameList << QString::fromStdString(profile.get("name"));
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800401 }
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700402
403 emit idCertNameListReady(certNameList);
404 emit nameListReady(nameList);
405 }
Yingdi Yub2e747d2013-11-05 23:06:43 -0800406}
407
Yingdi Yu76dd8002013-12-24 11:16:32 +0800408shared_ptr<EndorseCertificate>
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800409ContactManager::getSignedSelfEndorseCertificate(const Profile& profile)
Yingdi Yu4685b1b2013-10-18 17:05:02 -0700410{
Varun Patil3d850902020-11-23 12:19:14 +0530411 auto signCert = m_keyChain.getPib().getIdentity(m_identity)
412 .getDefaultKey().getDefaultCertificate();
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700413 vector<string> endorseList;
414 for (Profile::const_iterator it = profile.begin(); it != profile.end(); it++)
Yingdi Yu4685b1b2013-10-18 17:05:02 -0700415 endorseList.push_back(it->first);
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700416
417 shared_ptr<EndorseCertificate> selfEndorseCertificate =
Varun Patil3d850902020-11-23 12:19:14 +0530418 make_shared<EndorseCertificate>(boost::cref(signCert),
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700419 boost::cref(profile),
420 boost::cref(endorseList));
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700421
Varun Patil3d850902020-11-23 12:19:14 +0530422 m_keyChain.sign(*selfEndorseCertificate,
423 ndn::security::signingByIdentity(m_identity).setSignatureInfo(
424 selfEndorseCertificate->getSignatureInfo()));
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700425
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800426 return selfEndorseCertificate;
Yingdi Yu4685b1b2013-10-18 17:05:02 -0700427}
428
Yingdi Yu4685b1b2013-10-18 17:05:02 -0700429void
Yingdi Yu76dd8002013-12-24 11:16:32 +0800430ContactManager::publishSelfEndorseCertificateInDNS(const EndorseCertificate& selfEndorseCertificate)
Yingdi Yu4685b1b2013-10-18 17:05:02 -0700431{
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800432 Name dnsName = m_identity;
Yingdi Yufa4ce792014-02-06 18:09:22 -0800433 dnsName.append("DNS").append("PROFILE").appendVersion();
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800434
Yingdi Yu6c3c5962014-09-09 16:52:38 -0700435 shared_ptr<Data> data = make_shared<Data>();
436 data->setName(dnsName);
437 data->setContent(selfEndorseCertificate.wireEncode());
438 data->setFreshnessPeriod(time::milliseconds(1000));
Yingdi Yu76dd8002013-12-24 11:16:32 +0800439
Varun Patil3d850902020-11-23 12:19:14 +0530440 m_keyChain.sign(*data, ndn::security::signingByIdentity(m_identity));
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800441
Yingdi Yu6c3c5962014-09-09 16:52:38 -0700442 m_contactStorage->updateDnsSelfProfileData(*data);
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700443 m_face.put(*data);
Yingdi Yu4685b1b2013-10-18 17:05:02 -0700444}
445
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700446shared_ptr<EndorseCertificate>
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800447ContactManager::generateEndorseCertificate(const Name& identity)
Yingdi Yub2e747d2013-11-05 23:06:43 -0800448{
Varun Patil3d850902020-11-23 12:19:14 +0530449 auto signCert = m_keyChain.getPib().getIdentity(m_identity)
450 .getDefaultKey().getDefaultCertificate();
451
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800452 shared_ptr<Contact> contact = getContact(identity);
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700453 if (!static_cast<bool>(contact))
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800454 return shared_ptr<EndorseCertificate>();
Yingdi Yub2e747d2013-11-05 23:06:43 -0800455
Varun Patil3d850902020-11-23 12:19:14 +0530456 Name signerKeyName = m_identity;
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800457
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700458 vector<string> endorseList;
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800459 m_contactStorage->getEndorseList(identity, endorseList);
460
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700461 shared_ptr<EndorseCertificate> cert =
462 shared_ptr<EndorseCertificate>(new EndorseCertificate(contact->getPublicKeyName(),
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800463 contact->getPublicKey(),
464 contact->getNotBefore(),
465 contact->getNotAfter(),
Varun Patil3d850902020-11-23 12:19:14 +0530466 signCert.getKeyId(),
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700467 signerKeyName,
468 contact->getProfile(),
469 endorseList));
Varun Patil3d850902020-11-23 12:19:14 +0530470 m_keyChain.sign(*cert,
471 ndn::security::signingByIdentity(m_identity)
472 .setSignatureInfo(cert->getSignatureInfo()));
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800473 return cert;
474
475}
476
477void
478ContactManager::publishEndorseCertificateInDNS(const EndorseCertificate& endorseCertificate)
479{
Varun Patil3d850902020-11-23 12:19:14 +0530480 Name endorsee = endorseCertificate.getKeyName().getPrefix(-4);
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800481 Name dnsName = m_identity;
482 dnsName.append("DNS")
483 .append(endorsee.wireEncode())
484 .append("ENDORSEE")
485 .appendVersion();
Yingdi Yub2e747d2013-11-05 23:06:43 -0800486
Yingdi Yu6c3c5962014-09-09 16:52:38 -0700487 shared_ptr<Data> data = make_shared<Data>();
488 data->setName(dnsName);
489 data->setContent(endorseCertificate.wireEncode());
Varun Patil3d850902020-11-23 12:19:14 +0530490 data->setFreshnessPeriod(time::milliseconds(1000));
Yingdi Yub2e747d2013-11-05 23:06:43 -0800491
Varun Patil3d850902020-11-23 12:19:14 +0530492 m_keyChain.sign(*data, ndn::security::signingByIdentity(m_identity));
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800493
Yingdi Yu6c3c5962014-09-09 16:52:38 -0700494 m_contactStorage->updateDnsEndorseOthers(*data, dnsName.get(-3).toUri());
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700495 m_face.put(*data);
Yingdi Yub2e747d2013-11-05 23:06:43 -0800496}
497
498void
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800499ContactManager::sendInterest(const Interest& interest,
Varun Patil3d850902020-11-23 12:19:14 +0530500 const ndn::security::DataValidationSuccessCallback& onValidated,
501 const ndn::security::DataValidationFailureCallback& onValidationFailed,
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800502 const TimeoutNotify& timeoutNotify,
503 int retry /* = 1 */)
Yingdi Yub2e747d2013-11-05 23:06:43 -0800504{
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700505 m_face.expressInterest(interest,
506 bind(&ContactManager::onTargetData,
507 this, _1, _2, onValidated, onValidationFailed),
508 bind(&ContactManager::onTargetTimeout,
Varun Patil3d850902020-11-23 12:19:14 +0530509 this, _1, retry, onValidated, onValidationFailed, timeoutNotify),
510 bind(&ContactManager::onTargetTimeout,
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700511 this, _1, retry, onValidated, onValidationFailed, timeoutNotify));
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800512}
Yingdi Yu76dd8002013-12-24 11:16:32 +0800513
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800514void
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700515ContactManager::onTargetData(const Interest& interest,
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800516 const Data& data,
Varun Patil3d850902020-11-23 12:19:14 +0530517 const ndn::security::DataValidationSuccessCallback& onValidated,
518 const ndn::security::DataValidationFailureCallback& onValidationFailed)
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800519{
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700520 m_validator->validate(data, onValidated, onValidationFailed);
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800521}
Yingdi Yub2e747d2013-11-05 23:06:43 -0800522
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800523void
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700524ContactManager::onTargetTimeout(const Interest& interest,
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800525 int retry,
Varun Patil3d850902020-11-23 12:19:14 +0530526 const ndn::security::DataValidationSuccessCallback& onValidated,
527 const ndn::security::DataValidationFailureCallback& onValidationFailed,
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800528 const TimeoutNotify& timeoutNotify)
529{
530 // _LOG_DEBUG("On interest timeout: " << interest.getName());
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700531 if (retry > 0)
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800532 sendInterest(interest, onValidated, onValidationFailed, timeoutNotify, retry-1);
533 else
534 timeoutNotify(interest);
535}
536
537void
538ContactManager::onDnsInterest(const Name& prefix, const Interest& interest)
539{
540 const Name& interestName = interest.getName();
541 shared_ptr<Data> data;
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700542
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700543 if (interestName.size() <= prefix.size())
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800544 return;
545
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700546 if (interestName.size() == (prefix.size()+1)) {
547 data = m_contactStorage->getDnsData("N/A", interestName.get(prefix.size()).toUri());
548 if (static_cast<bool>(data))
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700549 m_face.put(*data);
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700550 return;
551 }
Yingdi Yub2e747d2013-11-05 23:06:43 -0800552
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700553 if (interestName.size() == (prefix.size()+2)) {
554 data = m_contactStorage->getDnsData(interestName.get(prefix.size()).toUri(),
555 interestName.get(prefix.size()+1).toUri());
556 if (static_cast<bool>(data))
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700557 m_face.put(*data);
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700558 return;
559 }
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800560}
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700561
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800562void
Yingdi Yu17032f82014-03-25 15:48:23 -0700563ContactManager::onDnsRegisterFailed(const Name& prefix, const std::string& failInfo)
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800564{
565 emit warning(QString(failInfo.c_str()));
566}
567
Varun Patil3d850902020-11-23 12:19:14 +0530568void
569ContactManager::onKeyInterest(const Name& prefix, const Interest& interest)
570{
571 const Name& interestName = interest.getName();
572 shared_ptr<Certificate> data;
573
574 try {
575 ndn::security::Certificate cert = m_keyChain.getPib()
576 .getIdentity(m_identity)
577 .getDefaultKey()
578 .getDefaultCertificate();
579 if (cert.getKeyName() == interestName)
580 return m_face.put(cert);
581 } catch (ndn::security::Pib::Error&) {}
582
583 data = m_contactStorage->getSelfEndorseCertificate();
584 if (static_cast<bool>(data) && data->getKeyName().equals(interestName))
585 return m_face.put(*data);
586
587 data = m_contactStorage->getCollectEndorseByName(interestName);
588 if (static_cast<bool>(data))
589 return m_face.put(*data);
590}
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800591
592// public slots
593void
594ContactManager::onIdentityUpdated(const QString& identity)
595{
596 m_identity = Name(identity.toStdString());
597
598 m_contactStorage = make_shared<ContactStorage>(m_identity);
599
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800600 Name dnsPrefix;
601 dnsPrefix.append(m_identity).append("DNS");
Varun Patil3d850902020-11-23 12:19:14 +0530602 auto dnsListenerId = make_shared<ndn::RegisteredPrefixHandle>(
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700603 m_face.setInterestFilter(dnsPrefix,
Varun Patil3d850902020-11-23 12:19:14 +0530604 bind(&ContactManager::onDnsInterest, this, _1, _2),
605 bind(&ContactManager::onDnsRegisterFailed, this, _1, _2)));
606
607 Name keyPrefix;
608 keyPrefix.append(m_identity).append("KEY");
609 auto keyListenerId = make_shared<ndn::RegisteredPrefixHandle>(
610 m_face.setInterestFilter(keyPrefix,
611 bind(&ContactManager::onKeyInterest, this, _1, _2),
612 bind(&ContactManager::onDnsRegisterFailed, this, _1, _2)));
613
614 Name profileCertPrefix;
615 profileCertPrefix.append(m_identity).append("PROFILE-CERT");
616 auto profileCertListenerId = make_shared<ndn::RegisteredPrefixHandle>(
617 m_face.setInterestFilter(profileCertPrefix,
618 bind(&ContactManager::onKeyInterest, this, _1, _2),
619 bind(&ContactManager::onDnsRegisterFailed, this, _1, _2)));
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700620
621 if (m_dnsListenerId != 0)
Varun Patil3d850902020-11-23 12:19:14 +0530622 m_dnsListenerId->unregister();
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700623 m_dnsListenerId = dnsListenerId;
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800624
Varun Patil3d850902020-11-23 12:19:14 +0530625 if (m_keyListenerId != 0)
626 m_keyListenerId->unregister();
627 m_keyListenerId = keyListenerId;
628
629 if (m_profileCertListenerId != 0)
630 m_profileCertListenerId->unregister();
631 m_profileCertListenerId = profileCertListenerId;
632
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800633 m_contactList.clear();
634 m_contactStorage->getAllContacts(m_contactList);
635
636 m_bufferedContacts.clear();
Varun Patil3d850902020-11-23 12:19:14 +0530637 onWaitForContactList();
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800638
639 collectEndorsement();
Yingdi Yub2e747d2013-11-05 23:06:43 -0800640}
641
Yingdi Yuae8217c2013-11-09 00:03:26 -0800642void
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800643ContactManager::onFetchContactInfo(const QString& identity)
Yingdi Yuae8217c2013-11-09 00:03:26 -0800644{
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800645 // try to fetch self-endorse-certificate via DNS PROFILE first.
646 Name identityName(identity.toStdString());
647 Name interestName;
648 interestName.append(identityName).append("DNS").append("PROFILE");
Yingdi Yu76dd8002013-12-24 11:16:32 +0800649
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800650 // _LOG_DEBUG("onFetchContactInfo " << identity.toStdString() << " profile: " << interestName);
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700651
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800652 Interest interest(interestName);
Yingdi Yua7876722014-03-25 14:46:55 -0700653 interest.setInterestLifetime(time::milliseconds(1000));
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800654 interest.setMustBeFresh(true);
Yingdi Yu76dd8002013-12-24 11:16:32 +0800655
Varun Patil3d850902020-11-23 12:19:14 +0530656 ndn::security::DataValidationSuccessCallback onValidated =
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700657 bind(&ContactManager::onDnsSelfEndorseCertValidated, this, _1, identityName);
Varun Patil3d850902020-11-23 12:19:14 +0530658 ndn::security::DataValidationFailureCallback onValidationFailed =
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700659 bind(&ContactManager::onDnsSelfEndorseCertValidationFailed, this, _1, _2, identityName);
660 TimeoutNotify timeoutNotify =
661 bind(&ContactManager::onDnsSelfEndorseCertTimeoutNotify, this, _1, identityName);
Yingdi Yu76dd8002013-12-24 11:16:32 +0800662
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800663 sendInterest(interest, onValidated, onValidationFailed, timeoutNotify, 0);
664}
Yingdi Yu76dd8002013-12-24 11:16:32 +0800665
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800666void
667ContactManager::onAddFetchedContact(const QString& identity)
668{
669 // _LOG_DEBUG("onAddFetchedContact");
670
671 Name identityName(identity.toStdString());
672
673 BufferedContacts::const_iterator it = m_bufferedContacts.find(identityName);
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700674 if (it != m_bufferedContacts.end()) {
675 Contact contact(*(it->second.m_selfEndorseCert));
676 // _LOG_DEBUG("onAddFetchedContact: contact ready");
677 try {
678 m_contactStorage->addContact(contact);
679 m_bufferedContacts.erase(identityName);
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800680
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700681 m_contactList.clear();
682 m_contactStorage->getAllContacts(m_contactList);
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800683
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700684 onWaitForContactList();
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800685 }
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700686 catch(ContactStorage::Error& e) {
687 emit warning(QString::fromStdString(e.what()));
688 }
689 }
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800690 else
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700691 emit warning(QString("Failure: no information of %1").arg(identity));
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800692}
693
694void
695ContactManager::onUpdateProfile()
696{
697 // Get current profile;
698 shared_ptr<Profile> newProfile = m_contactStorage->getSelfProfile();
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700699 if (!static_cast<bool>(newProfile))
Yingdi Yuae8217c2013-11-09 00:03:26 -0800700 return;
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800701
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700702 // _LOG_DEBUG("ContactManager::onUpdateProfile: getProfile");
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800703
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700704 shared_ptr<EndorseCertificate> newEndorseCertificate =
705 getSignedSelfEndorseCertificate(*newProfile);
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800706
707 m_contactStorage->addSelfEndorseCertificate(*newEndorseCertificate);
708
709 publishSelfEndorseCertificateInDNS(*newEndorseCertificate);
710}
711
712void
713ContactManager::onRefreshBrowseContact()
714{
Varun Patil3d850902020-11-23 12:19:14 +0530715 return;
716
717#if 0
718 // The following no longer works as we don't serve such a list anymore
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700719 vector<string> bufferedIdCertNames;
720 try {
721 using namespace boost::asio::ip;
722 tcp::iostream request_stream;
Varun Patil3d850902020-11-23 12:19:14 +0530723 request_stream.expires_from_now(std::chrono::milliseconds(5000));
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700724 request_stream.connect("ndncert.named-data.net","80");
725 if (!request_stream) {
726 emit warning(QString::fromStdString("Fail to fetch certificate directory! #1"));
727 return;
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800728 }
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700729
730 request_stream << "GET /cert/list/ HTTP/1.0\r\n";
731 request_stream << "Host: ndncert.named-data.net\r\n\r\n";
732 request_stream.flush();
733
734 string line1;
735 std::getline(request_stream,line1);
736 if (!request_stream) {
737 emit warning(QString::fromStdString("Fail to fetch certificate directory! #2"));
738 return;
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800739 }
740
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700741 std::stringstream response_stream(line1);
742 string http_version;
743 response_stream >> http_version;
Qiuhan Ding0cfc1512015-02-17 17:44:11 -0800744 size_t status_code;
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700745 response_stream >> status_code;
746 string status_message;
747 std::getline(response_stream,status_message);
748
749 if (!response_stream ||
750 http_version.substr(0,5) != "HTTP/") {
751 emit warning(QString::fromStdString("Fail to fetch certificate directory! #3"));
752 return;
753 }
754 if (status_code!=200) {
755 emit warning(QString::fromStdString("Fail to fetch certificate directory! #4"));
756 return;
757 }
758 vector<string> headers;
759 string header;
760 while (std::getline(request_stream, header) && header != "\r")
761 headers.push_back(header);
762
763 std::istreambuf_iterator<char> stream_iter (request_stream);
764 std::istreambuf_iterator<char> end_of_stream;
765
766 typedef boost::tokenizer< boost::escaped_list_separator<char>,
767 std::istreambuf_iterator<char> > tokenizer_t;
768 tokenizer_t certItems (stream_iter,
769 end_of_stream,
770 boost::escaped_list_separator<char>('\\', '\n', '"'));
771
772 for (tokenizer_t::iterator it = certItems.begin(); it != certItems.end (); it++)
773 if (!it->empty())
774 bufferedIdCertNames.push_back(*it);
775 }
776 catch(std::exception &e) {
777 emit warning(QString::fromStdString("Fail to fetch certificate directory! #N"));
778 }
779
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800780 {
781 boost::recursive_mutex::scoped_lock lock(m_idCertCountMutex);
782 m_idCertCount = bufferedIdCertNames.size();
Yingdi Yuae8217c2013-11-09 00:03:26 -0800783 }
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800784 m_bufferedIdCerts.clear();
785
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700786 for (vector<string>::const_iterator it = bufferedIdCertNames.begin();
787 it != bufferedIdCertNames.end(); it++) {
788 Name certName(*it);
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800789
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700790 Interest interest(certName);
791 interest.setInterestLifetime(time::milliseconds(1000));
792 interest.setMustBeFresh(true);
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700793
Varun Patil3d850902020-11-23 12:19:14 +0530794 ndn::security::DataValidationSuccessCallback onValidated =
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700795 bind(&ContactManager::onIdentityCertValidated, this, _1);
Varun Patil3d850902020-11-23 12:19:14 +0530796 ndn::security::DataValidationFailureCallback onValidationFailed =
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700797 bind(&ContactManager::onIdentityCertValidationFailed, this, _1, _2);
798 TimeoutNotify timeoutNotify =
799 bind(&ContactManager::onIdentityCertTimeoutNotify, this, _1);
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800800
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700801 sendInterest(interest, onValidated, onValidationFailed, timeoutNotify, 0);
802 }
Varun Patil3d850902020-11-23 12:19:14 +0530803#endif
Yingdi Yuae8217c2013-11-09 00:03:26 -0800804}
805
Yingdi Yu72232692013-11-12 17:50:21 -0800806void
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800807ContactManager::onFetchIdCert(const QString& qCertName)
Yingdi Yu72232692013-11-12 17:50:21 -0800808{
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800809 Name certName(qCertName.toStdString());
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700810 if (m_bufferedIdCerts.find(certName) != m_bufferedIdCerts.end())
811 emit idCertReady(*m_bufferedIdCerts[certName]);
Yingdi Yu72232692013-11-12 17:50:21 -0800812}
Yingdi Yuae8217c2013-11-09 00:03:26 -0800813
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800814void
815ContactManager::onAddFetchedContactIdCert(const QString& qCertName)
816{
817 Name certName(qCertName.toStdString());
Varun Patil3d850902020-11-23 12:19:14 +0530818 Name identity = certName.getPrefix(-1);
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800819
820 BufferedIdCerts::const_iterator it = m_bufferedIdCerts.find(certName);
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700821 if (it != m_bufferedIdCerts.end()) {
822 Contact contact(*it->second);
823 try {
824 m_contactStorage->addContact(contact);
825 m_bufferedIdCerts.erase(certName);
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800826
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700827 m_contactList.clear();
828 m_contactStorage->getAllContacts(m_contactList);
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800829
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700830 onWaitForContactList();
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800831 }
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700832 catch(ContactStorage::Error& e) {
833 emit warning(QString::fromStdString(e.what()));
834 }
835 }
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800836 else
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700837 emit warning(QString("Failure: no information of %1")
838 .arg(QString::fromStdString(identity.toUri())));
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800839}
840
841void
842ContactManager::onWaitForContactList()
843{
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800844 QStringList aliasList;
845 QStringList idList;
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700846 for (ContactList::const_iterator it = m_contactList.begin(); it != m_contactList.end(); it++) {
847 aliasList << QString((*it)->getAlias().c_str());
848 idList << QString((*it)->getNameSpace().toUri().c_str());
849 }
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700850
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800851 emit contactAliasListReady(aliasList);
852 emit contactIdListReady(idList);
853}
854
855void
856ContactManager::onWaitForContactInfo(const QString& identity)
857{
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700858 for (ContactList::const_iterator it = m_contactList.begin(); it != m_contactList.end(); it++)
859 if ((*it)->getNameSpace().toUri() == identity.toStdString())
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800860 emit contactInfoReady(QString((*it)->getNameSpace().toUri().c_str()),
861 QString((*it)->getName().c_str()),
862 QString((*it)->getInstitution().c_str()),
863 (*it)->isIntroducer());
864}
865
866void
867ContactManager::onRemoveContact(const QString& identity)
868{
869 m_contactStorage->removeContact(Name(identity.toStdString()));
870 m_contactList.clear();
871 m_contactStorage->getAllContacts(m_contactList);
872
873 onWaitForContactList();
874}
875
876void
877ContactManager::onUpdateAlias(const QString& identity, const QString& alias)
878{
879 m_contactStorage->updateAlias(Name(identity.toStdString()), alias.toStdString());
880 m_contactList.clear();
881 m_contactStorage->getAllContacts(m_contactList);
882
883 onWaitForContactList();
884}
885
886void
887ContactManager::onUpdateIsIntroducer(const QString& identity, bool isIntroducer)
888{
889 m_contactStorage->updateIsIntroducer(Name(identity.toStdString()), isIntroducer);
890}
891
892void
893ContactManager::onUpdateEndorseCertificate(const QString& identity)
894{
895 Name identityName(identity.toStdString());
Varun Patil3d850902020-11-23 12:19:14 +0530896 shared_ptr<Certificate> newEndorseCertificate = generateEndorseCertificate(identityName);
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800897
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700898 if (!static_cast<bool>(newEndorseCertificate))
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800899 return;
900
901 m_contactStorage->addEndorseCertificate(*newEndorseCertificate, identityName);
902
903 publishEndorseCertificateInDNS(*newEndorseCertificate);
904}
905
Yingdi Yueb692ac2015-02-10 18:46:18 -0800906} // namespace chronochat
Yingdi Yufa4ce792014-02-06 18:09:22 -0800907
Yingdi Yu4685b1b2013-10-18 17:05:02 -0700908
909#if WAF
910#include "contact-manager.moc"
Yingdi Yu42125862014-08-07 17:04:28 -0700911// #include "contact-manager.cpp.moc"
Yingdi Yu4685b1b2013-10-18 17:05:02 -0700912#endif