blob: 78f6102d0d7b86582fd26776995b94a8c3d1d666 [file] [log] [blame]
Yingdi Yud59b5932013-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 Yua4898752013-10-15 20:31:37 -070011#include "addcontactpanel.h"
12#include "ui_addcontactpanel.h"
13
Yingdi Yuc29fb982013-10-20 19:43:10 -070014#ifndef Q_MOC_RUN
Yingdi Yu6a5b9f62013-11-06 23:00:21 -080015// #include <cryptopp/base64.h>
Yingdi Yu8dacdf22013-11-05 23:06:43 -080016// #include <ndn.cxx/helpers/der/der.h>
17#include <ndn.cxx/helpers/der/visitor/simple-visitor.h>
Yingdi Yuc29fb982013-10-20 19:43:10 -070018#include "logging.h"
19#endif
20
Yingdi Yuaa8d7692013-10-18 17:05:02 -070021using namespace ndn;
22using namespace std;
23
Yingdi Yuc29fb982013-10-20 19:43:10 -070024INIT_LOGGER("AddContactPanel");
25
Yingdi Yuaa8d7692013-10-18 17:05:02 -070026AddContactPanel::AddContactPanel(Ptr<ContactManager> contactManager,
Yingdi Yu0b82a4e2013-10-18 11:29:25 -070027 QWidget *parent)
Yingdi Yud59b5932013-10-16 13:16:49 -070028 : QDialog(parent)
29 , ui(new Ui::AddContactPanel)
Yingdi Yu0b82a4e2013-10-18 11:29:25 -070030 , m_contactManager(contactManager)
Yingdi Yuc29fb982013-10-20 19:43:10 -070031 , m_warningDialog(new WarningDialog())
Yingdi Yua4898752013-10-15 20:31:37 -070032{
Yingdi Yud59b5932013-10-16 13:16:49 -070033 ui->setupUi(this);
Yingdi Yuc29fb982013-10-20 19:43:10 -070034
35 qRegisterMetaType<ndn::Name>("NdnName");
36 qRegisterMetaType<EndorseCertificate>("EndorseCertificate");
Yingdi Yu8dacdf22013-11-05 23:06:43 -080037 qRegisterMetaType<ndn::Data>("NdnData");
Yingdi Yud59b5932013-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 Yu79c25a22013-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 Yuc29fb982013-10-20 19:43:10 -070047 connect(&*m_contactManager, SIGNAL(contactFetchFailed(const ndn::Name&)),
48 this, SLOT(selfEndorseCertificateFetchFailed(const ndn::Name&)));
Yingdi Yu8dacdf22013-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 Yua4898752013-10-15 20:31:37 -070059}
60
61AddContactPanel::~AddContactPanel()
62{
63 delete ui;
Yingdi Yuc29fb982013-10-20 19:43:10 -070064 delete m_warningDialog;
Yingdi Yua4898752013-10-15 20:31:37 -070065}
Yingdi Yud59b5932013-10-16 13:16:49 -070066
67void
68AddContactPanel::onCancelClicked()
69{ this->close(); }
70
71void
72AddContactPanel::onSearchClicked()
73{
Yingdi Yu8dacdf22013-11-05 23:06:43 -080074 m_currentEndorseCertificateReady = false;
75 m_currentCollectEndorseReady = false;
Yingdi Yu79c25a22013-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 Yuaa8d7692013-10-18 17:05:02 -070079 QString inputIdentity = ui->contactInput->text();
80 m_searchIdentity = Name(inputIdentity.toUtf8().constData());
Yingdi Yuc29fb982013-10-20 19:43:10 -070081
Yingdi Yu8dacdf22013-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 Yud59b5932013-10-16 13:16:49 -0700122}
123
124void
125AddContactPanel::onAddClicked()
126{
Yingdi Yu79c25a22013-10-21 13:38:38 -0700127 ContactItem contactItem(*m_currentEndorseCertificate);
Yingdi Yu6a5b9f62013-11-06 23:00:21 -0800128 try{
129 m_contactManager->getContactStorage()->addContact(contactItem);
130 }catch(exception& e){
131 m_warningDialog->setMsg(e.what());
132 m_warningDialog->show();
Yingdi Yub35b8652013-11-07 11:32:40 -0800133 _LOG_ERROR("Exception: " << e.what());
Yingdi Yu6a5b9f62013-11-06 23:00:21 -0800134 return;
135 }
Yingdi Yu79c25a22013-10-21 13:38:38 -0700136 emit newContactAdded();
137 this->close();
Yingdi Yud59b5932013-10-16 13:16:49 -0700138}
139
Yingdi Yuaa8d7692013-10-18 17:05:02 -0700140void
Yingdi Yuc29fb982013-10-20 19:43:10 -0700141AddContactPanel::selfEndorseCertificateFetched(const EndorseCertificate& endorseCertificate)
Yingdi Yuaa8d7692013-10-18 17:05:02 -0700142{
Yingdi Yub35b8652013-11-07 11:32:40 -0800143 try{
144 m_currentEndorseCertificate = Ptr<EndorseCertificate>(new EndorseCertificate(endorseCertificate));
145 }catch(exception& e){
146 m_warningDialog->setMsg(e.what());
147 m_warningDialog->show();
148 _LOG_ERROR("Exception: " << e.what());
149 return;
150 }
Yingdi Yu8dacdf22013-11-05 23:06:43 -0800151 m_currentEndorseCertificateReady = true;
152
153 if(m_currentCollectEndorseReady == true)
154 displayContactInfo();
Yingdi Yuc29fb982013-10-20 19:43:10 -0700155}
156
157void
158AddContactPanel::selfEndorseCertificateFetchFailed(const Name& identity)
159{
160 m_warningDialog->setMsg("Cannot fetch contact profile");
161 m_warningDialog->show();
Yingdi Yuaa8d7692013-10-18 17:05:02 -0700162}
163
Yingdi Yu8dacdf22013-11-05 23:06:43 -0800164void
165AddContactPanel::onContactKeyFetched(const EndorseCertificate& endorseCertificate)
166{
Yingdi Yub35b8652013-11-07 11:32:40 -0800167 try{
168 m_currentEndorseCertificate = Ptr<EndorseCertificate>(new EndorseCertificate(endorseCertificate));
169 }catch(exception& e){
170 m_warningDialog->setMsg(e.what());
171 m_warningDialog->show();
172 _LOG_ERROR("Exception: " << e.what());
173 return;
174 }
Yingdi Yu8dacdf22013-11-05 23:06:43 -0800175
Alexander Afanasyev4f04c552013-11-07 15:30:05 -0800176 m_currentCollectEndorseReady = false;
Yingdi Yue9ea5c92013-11-06 18:42:34 -0800177
178 displayContactInfo();
Yingdi Yu8dacdf22013-11-05 23:06:43 -0800179}
180
181void
182AddContactPanel::onContactKeyFetchFailed(const Name& identity)
183{
184 m_warningDialog->setMsg("Cannot fetch contact ksk certificate");
185 m_warningDialog->show();
186}
187
188void
189AddContactPanel::onCollectEndorseFetched(const Data& data)
190{
191 m_currentCollectEndorse = Ptr<Data>(new Data(data));
192 m_currentCollectEndorseReady = true;
193
194 if(m_currentEndorseCertificateReady == true)
195 displayContactInfo();
196}
197
198void
199AddContactPanel::onCollectEndorseFetchFailed(const Name& identity)
200{
201 m_currentCollectEndorse = NULL;
202 m_currentCollectEndorseReady = true;
203
204 if(m_currentEndorseCertificateReady == true)
205 displayContactInfo();
206}
207
208void
209AddContactPanel::displayContactInfo()
210{
Yingdi Yub35b8652013-11-07 11:32:40 -0800211 // _LOG_TRACE("displayContactInfo");
Yingdi Yu8dacdf22013-11-05 23:06:43 -0800212 const Profile& profile = m_currentEndorseCertificate->getProfileData()->getProfile();
213 const Blob& profileBlob = m_currentEndorseCertificate->getProfileData()->content();
214
215 map<string, int> endorseCount;
216
217 if(m_currentCollectEndorse != NULL)
218 {
Yingdi Yu8dacdf22013-11-05 23:06:43 -0800219 boost::iostreams::stream
220 <boost::iostreams::array_source> is (m_currentCollectEndorse->content().buf(), m_currentCollectEndorse->content().size());
221
222 Ptr<der::DerSequence> root = DynamicCast<der::DerSequence>(der::DerNode::parse(reinterpret_cast<InputIterator &>(is)));
223 const der::DerNodePtrList & children = root->getChildren();
224 der::SimpleVisitor simpleVisitor;
225
226 for(int i = 0; i < children.size(); i++)
227 {
228 Ptr<Blob> dataBlob = boost::any_cast<Ptr<Blob> >(children[i]->accept(simpleVisitor));
Yingdi Yu8dacdf22013-11-05 23:06:43 -0800229
Yingdi Yub35b8652013-11-07 11:32:40 -0800230 Ptr<Data> data = NULL;
231 Ptr<EndorseCertificate> endorseCert = NULL;
232 try{
233 data = Data::decodeFromWire(dataBlob);
234 endorseCert = Ptr<EndorseCertificate>(new EndorseCertificate(*data));
235 }catch(exception& e){
236 continue;
237 }
238
Yingdi Yu8dacdf22013-11-05 23:06:43 -0800239 Name signerKeyName = endorseCert->getSigner();
240 Name signerName = signerKeyName.getPrefix(signerKeyName.size()-1);
241
242 Ptr<ContactItem> contact = m_contactManager->getContact(signerName);
243 if(contact == NULL)
244 continue;
Yingdi Yu8dacdf22013-11-05 23:06:43 -0800245
246 if(!contact->isIntroducer() || !contact->canBeTrustedFor(m_currentEndorseCertificate->getProfileData()->getIdentityName()))
247 continue;
Yingdi Yu8dacdf22013-11-05 23:06:43 -0800248
249 if(!security::PolicyManager::verifySignature(*data, contact->getSelfEndorseCertificate().getPublicKeyInfo()))
250 continue;
251
252 const Blob& tmpProfileBlob = endorseCert->getProfileData()->content();
253 if(profileBlob != tmpProfileBlob)
254 continue;
255
Yingdi Yu8dacdf22013-11-05 23:06:43 -0800256 const vector<string>& endorseList = endorseCert->getEndorseList();
257 vector<string>::const_iterator it = endorseList.begin();
258 for(; it != endorseList.end(); it++)
Yingdi Yu6a5b9f62013-11-06 23:00:21 -0800259 endorseCount[*it] += 1;
Yingdi Yu8dacdf22013-11-05 23:06:43 -0800260 }
261 }
Yingdi Yu8dacdf22013-11-05 23:06:43 -0800262
263 ui->infoView->setColumnCount(3);
264 Profile::const_iterator it = profile.begin();
265 int rowCount = 0;
266
267 QTableWidgetItem *typeHeader = new QTableWidgetItem(QString::fromUtf8("Type"));
268 ui->infoView->setHorizontalHeaderItem(0, typeHeader);
269 QTableWidgetItem *valueHeader = new QTableWidgetItem(QString::fromUtf8("Value"));
270 ui->infoView->setHorizontalHeaderItem(1, valueHeader);
271 QTableWidgetItem *endorseHeader = new QTableWidgetItem(QString::fromUtf8("Endorse"));
272 ui->infoView->setHorizontalHeaderItem(2, endorseHeader);
273
274 for(; it != profile.end(); it++)
275 {
276 ui->infoView->insertRow(rowCount);
277 QTableWidgetItem *type = new QTableWidgetItem(QString::fromUtf8(it->first.c_str()));
278 ui->infoView->setItem(rowCount, 0, type);
279
280 string valueString(it->second.buf(), it->second.size());
281 QTableWidgetItem *value = new QTableWidgetItem(QString::fromUtf8(valueString.c_str()));
282 ui->infoView->setItem(rowCount, 1, value);
283
284 map<string, int>::iterator map_it = endorseCount.find(it->first);
285 QTableWidgetItem *endorse = NULL;
286 if(map_it == endorseCount.end())
287 endorse = new QTableWidgetItem(QString::number(0));
288 else
289 endorse = new QTableWidgetItem(QString::number(map_it->second));
290 ui->infoView->setItem(rowCount, 2, endorse);
291
292 rowCount++;
293 }
294}
295
Yingdi Yud59b5932013-10-16 13:16:49 -0700296#if WAF
297#include "addcontactpanel.moc"
298#include "addcontactpanel.cpp.moc"
299#endif