blob: 8ce77c8ac182aab18e2b1da2827003ef6c7f29b8 [file] [log] [blame]
Yingdi Yu0269c872013-10-16 13:16:49 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
2/*
3 * Copyright (c) 2013, Regents of the University of California
4 * Yingdi Yu
5 *
6 * BSD license, See the LICENSE file for more information
7 *
8 * Author: Yingdi Yu <yingdi@cs.ucla.edu>
9 */
10
Yingdi Yubf7517c2013-10-15 20:31:37 -070011#include "addcontactpanel.h"
12#include "ui_addcontactpanel.h"
13
Yingdi Yud95c5642013-10-20 19:43:10 -070014#ifndef Q_MOC_RUN
Yingdi Yub2e747d2013-11-05 23:06:43 -080015#include <cryptopp/base64.h>
16// #include <ndn.cxx/helpers/der/der.h>
17#include <ndn.cxx/helpers/der/visitor/simple-visitor.h>
Yingdi Yud95c5642013-10-20 19:43:10 -070018#include "logging.h"
19#endif
20
Yingdi Yu4685b1b2013-10-18 17:05:02 -070021using namespace ndn;
22using namespace std;
23
Yingdi Yud95c5642013-10-20 19:43:10 -070024INIT_LOGGER("AddContactPanel");
25
Yingdi Yu4685b1b2013-10-18 17:05:02 -070026AddContactPanel::AddContactPanel(Ptr<ContactManager> contactManager,
Yingdi Yu9236c432013-10-18 11:29:25 -070027 QWidget *parent)
Yingdi Yu0269c872013-10-16 13:16:49 -070028 : QDialog(parent)
29 , ui(new Ui::AddContactPanel)
Yingdi Yu9236c432013-10-18 11:29:25 -070030 , m_contactManager(contactManager)
Yingdi Yud95c5642013-10-20 19:43:10 -070031 , m_warningDialog(new WarningDialog())
Yingdi Yubf7517c2013-10-15 20:31:37 -070032{
Yingdi Yu0269c872013-10-16 13:16:49 -070033 ui->setupUi(this);
Yingdi Yud95c5642013-10-20 19:43:10 -070034
35 qRegisterMetaType<ndn::Name>("NdnName");
36 qRegisterMetaType<EndorseCertificate>("EndorseCertificate");
Yingdi Yub2e747d2013-11-05 23:06:43 -080037 qRegisterMetaType<ndn::Data>("NdnData");
Yingdi Yu0269c872013-10-16 13:16:49 -070038
39 connect(ui->cancelButton, SIGNAL(clicked()),
40 this, SLOT(onCancelClicked()));
41 connect(ui->searchButton, SIGNAL(clicked()),
42 this, SLOT(onSearchClicked()));
Yingdi Yu2ac40fb2013-10-21 13:38:38 -070043 connect(ui->addButton, SIGNAL(clicked()),
44 this, SLOT(onAddClicked()));
45 connect(&*m_contactManager, SIGNAL(contactFetched(const EndorseCertificate&)),
46 this, SLOT(selfEndorseCertificateFetched(const EndorseCertificate&)));
Yingdi Yud95c5642013-10-20 19:43:10 -070047 connect(&*m_contactManager, SIGNAL(contactFetchFailed(const ndn::Name&)),
48 this, SLOT(selfEndorseCertificateFetchFailed(const ndn::Name&)));
Yingdi Yub2e747d2013-11-05 23:06:43 -080049 connect(&*m_contactManager, SIGNAL(collectEndorseFetched(const ndn::Data&)),
50 this, SLOT(onCollectEndorseFetched(const ndn::Data&)));
51 connect(&*m_contactManager, SIGNAL(collectEndorseFetchFailed(const ndn::Name&)),
52 this, SLOT(onCollectEndorseFetchFailed(const ndn::Name&)));
53 connect(&*m_contactManager, SIGNAL(contactKeyFetched(const EndorseCertificate&)),
54 this, SLOT(onContactKeyFetched(const EndorseCertificate&)));
55 connect(&*m_contactManager, SIGNAL(contactKeyFetchFailed(const ndn::Name&)),
56 this, SLOT(onContactKeyFetchFailed(const ndn::Name&)));
57
58
Yingdi Yubf7517c2013-10-15 20:31:37 -070059}
60
61AddContactPanel::~AddContactPanel()
62{
63 delete ui;
Yingdi Yud95c5642013-10-20 19:43:10 -070064 delete m_warningDialog;
Yingdi Yubf7517c2013-10-15 20:31:37 -070065}
Yingdi Yu0269c872013-10-16 13:16:49 -070066
67void
68AddContactPanel::onCancelClicked()
69{ this->close(); }
70
71void
72AddContactPanel::onSearchClicked()
73{
Yingdi Yub2e747d2013-11-05 23:06:43 -080074 m_currentEndorseCertificateReady = false;
75 m_currentCollectEndorseReady = false;
Yingdi Yu2ac40fb2013-10-21 13:38:38 -070076 ui->infoView->clear();
77 for(int i = ui->infoView->rowCount() - 1; i >= 0 ; i--)
78 ui->infoView->removeRow(i);
Yingdi Yu4685b1b2013-10-18 17:05:02 -070079 QString inputIdentity = ui->contactInput->text();
80 m_searchIdentity = Name(inputIdentity.toUtf8().constData());
Yingdi Yud95c5642013-10-20 19:43:10 -070081
Yingdi Yub2e747d2013-11-05 23:06:43 -080082 if(Qt::Checked == ui->fetchBox->checkState())
83 {
84 m_contactManager->fetchSelfEndorseCertificate(m_searchIdentity);
85 m_contactManager->fetchCollectEndorse(m_searchIdentity);
86 }
87 else
88 {
89 if(isCorrectName(m_searchIdentity))
90 m_contactManager->fetchKey(m_searchIdentity);
91 else
92 {
93 m_warningDialog->setMsg("Wrong key certificate name!");
94 m_warningDialog->show();
95 }
96 }
97}
98
99bool
100AddContactPanel::isCorrectName(const Name& name)
101{
102 string key("KEY");
103 string idCert("ID-CERT");
104
105 if(name.get(-1).toUri() != idCert)
106 return false;
107
108 int keyIndex = -1;
109 for(int i = 0; i < name.size(); i++)
110 {
111 if(name.get(i).toUri() == key)
112 {
113 keyIndex = i;
114 break;
115 }
116 }
117
118 if(keyIndex < 0)
119 return false;
120 else
121 return true;
Yingdi Yu0269c872013-10-16 13:16:49 -0700122}
123
124void
125AddContactPanel::onAddClicked()
126{
Yingdi Yu2ac40fb2013-10-21 13:38:38 -0700127 ContactItem contactItem(*m_currentEndorseCertificate);
Yingdi Yu71c01872013-11-03 16:22:05 -0800128 m_contactManager->getContactStorage()->addContact(contactItem);
Yingdi Yu2ac40fb2013-10-21 13:38:38 -0700129 emit newContactAdded();
130 this->close();
Yingdi Yu0269c872013-10-16 13:16:49 -0700131}
132
Yingdi Yu4685b1b2013-10-18 17:05:02 -0700133void
Yingdi Yud95c5642013-10-20 19:43:10 -0700134AddContactPanel::selfEndorseCertificateFetched(const EndorseCertificate& endorseCertificate)
Yingdi Yu4685b1b2013-10-18 17:05:02 -0700135{
Yingdi Yu2ac40fb2013-10-21 13:38:38 -0700136 m_currentEndorseCertificate = Ptr<EndorseCertificate>(new EndorseCertificate(endorseCertificate));
Yingdi Yub2e747d2013-11-05 23:06:43 -0800137 m_currentEndorseCertificateReady = true;
138
139 if(m_currentCollectEndorseReady == true)
140 displayContactInfo();
Yingdi Yud95c5642013-10-20 19:43:10 -0700141}
142
143void
144AddContactPanel::selfEndorseCertificateFetchFailed(const Name& identity)
145{
146 m_warningDialog->setMsg("Cannot fetch contact profile");
147 m_warningDialog->show();
Yingdi Yu4685b1b2013-10-18 17:05:02 -0700148}
149
Yingdi Yub2e747d2013-11-05 23:06:43 -0800150void
151AddContactPanel::onContactKeyFetched(const EndorseCertificate& endorseCertificate)
152{
153 m_currentEndorseCertificate = Ptr<EndorseCertificate>(new EndorseCertificate(endorseCertificate));
154
155 const Blob& keyBlob = endorseCertificate.getPublicKeyInfo().getKeyBlob();
156 string encoded;
157 CryptoPP::StringSource ss(reinterpret_cast<const unsigned char *>(keyBlob.buf()), keyBlob.size(), true,
158 new CryptoPP::Base64Encoder(new CryptoPP::StringSink(encoded), true, 64));
159
160 ui->infoView->setColumnCount(1);
161 ui->infoView->insertRow(0);
162 QTableWidgetItem *keyBits = new QTableWidgetItem(QString::fromUtf8(encoded.c_str()));
163 ui->infoView->setItem(0, 0, keyBits);
164}
165
166void
167AddContactPanel::onContactKeyFetchFailed(const Name& identity)
168{
169 m_warningDialog->setMsg("Cannot fetch contact ksk certificate");
170 m_warningDialog->show();
171}
172
173void
174AddContactPanel::onCollectEndorseFetched(const Data& data)
175{
176 m_currentCollectEndorse = Ptr<Data>(new Data(data));
177 m_currentCollectEndorseReady = true;
178
179 if(m_currentEndorseCertificateReady == true)
180 displayContactInfo();
181}
182
183void
184AddContactPanel::onCollectEndorseFetchFailed(const Name& identity)
185{
186 m_currentCollectEndorse = NULL;
187 m_currentCollectEndorseReady = true;
188
189 if(m_currentEndorseCertificateReady == true)
190 displayContactInfo();
191}
192
193void
194AddContactPanel::displayContactInfo()
195{
196 _LOG_TRACE("displayContactInfo");
197 const Profile& profile = m_currentEndorseCertificate->getProfileData()->getProfile();
198 const Blob& profileBlob = m_currentEndorseCertificate->getProfileData()->content();
199
200 map<string, int> endorseCount;
201
202 if(m_currentCollectEndorse != NULL)
203 {
204 _LOG_DEBUG("CollectEndorse fetched");
205 boost::iostreams::stream
206 <boost::iostreams::array_source> is (m_currentCollectEndorse->content().buf(), m_currentCollectEndorse->content().size());
207
208 Ptr<der::DerSequence> root = DynamicCast<der::DerSequence>(der::DerNode::parse(reinterpret_cast<InputIterator &>(is)));
209 const der::DerNodePtrList & children = root->getChildren();
210 der::SimpleVisitor simpleVisitor;
211
212 for(int i = 0; i < children.size(); i++)
213 {
214 Ptr<Blob> dataBlob = boost::any_cast<Ptr<Blob> >(children[i]->accept(simpleVisitor));
215 Ptr<Data> data = Data::decodeFromWire(dataBlob);
216 Ptr<EndorseCertificate> endorseCert = Ptr<EndorseCertificate>(new EndorseCertificate(*data));
217 _LOG_DEBUG("endorseCert name: " << endorseCert->getName().toUri());
218
219 Name signerKeyName = endorseCert->getSigner();
220 Name signerName = signerKeyName.getPrefix(signerKeyName.size()-1);
221
222 Ptr<ContactItem> contact = m_contactManager->getContact(signerName);
223 if(contact == NULL)
224 continue;
225 _LOG_DEBUG("get contact: " << signerName.toUri());
226
227 if(!contact->isIntroducer() || !contact->canBeTrustedFor(m_currentEndorseCertificate->getProfileData()->getIdentityName()))
228 continue;
229 _LOG_DEBUG("contact can be trusted");
230
231 if(!security::PolicyManager::verifySignature(*data, contact->getSelfEndorseCertificate().getPublicKeyInfo()))
232 continue;
233
234 const Blob& tmpProfileBlob = endorseCert->getProfileData()->content();
235 if(profileBlob != tmpProfileBlob)
236 continue;
237
238 _LOG_DEBUG("Profile equal");
239
240 const vector<string>& endorseList = endorseCert->getEndorseList();
241 vector<string>::const_iterator it = endorseList.begin();
242 for(; it != endorseList.end(); it++)
243 {
244 _LOG_DEBUG("Entry: " << *it);
245 endorseCount[*it] += 1;
246 }
247 }
248 }
249
250 // map<string, int>::iterator tmp_it = endorseCount.begin();
251 // for(; tmp_it != endorseCount.end(); tmp_it++)
252 // {
253 // _LOG_DEBUG("Entry: " << tmp_it->first << " " << tmp_it->second);
254 // }
255
256 ui->infoView->setColumnCount(3);
257 Profile::const_iterator it = profile.begin();
258 int rowCount = 0;
259
260 QTableWidgetItem *typeHeader = new QTableWidgetItem(QString::fromUtf8("Type"));
261 ui->infoView->setHorizontalHeaderItem(0, typeHeader);
262 QTableWidgetItem *valueHeader = new QTableWidgetItem(QString::fromUtf8("Value"));
263 ui->infoView->setHorizontalHeaderItem(1, valueHeader);
264 QTableWidgetItem *endorseHeader = new QTableWidgetItem(QString::fromUtf8("Endorse"));
265 ui->infoView->setHorizontalHeaderItem(2, endorseHeader);
266
267 for(; it != profile.end(); it++)
268 {
269 ui->infoView->insertRow(rowCount);
270 QTableWidgetItem *type = new QTableWidgetItem(QString::fromUtf8(it->first.c_str()));
271 ui->infoView->setItem(rowCount, 0, type);
272
273 string valueString(it->second.buf(), it->second.size());
274 QTableWidgetItem *value = new QTableWidgetItem(QString::fromUtf8(valueString.c_str()));
275 ui->infoView->setItem(rowCount, 1, value);
276
277 map<string, int>::iterator map_it = endorseCount.find(it->first);
278 QTableWidgetItem *endorse = NULL;
279 if(map_it == endorseCount.end())
280 endorse = new QTableWidgetItem(QString::number(0));
281 else
282 endorse = new QTableWidgetItem(QString::number(map_it->second));
283 ui->infoView->setItem(rowCount, 2, endorse);
284
285 rowCount++;
286 }
287}
288
Yingdi Yu0269c872013-10-16 13:16:49 -0700289#if WAF
290#include "addcontactpanel.moc"
291#include "addcontactpanel.cpp.moc"
292#endif