blob: c5c80e40bfa98cab9ab496f7feff3ac3b10055e5 [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();
133 return;
134 }
Yingdi Yu79c25a22013-10-21 13:38:38 -0700135 emit newContactAdded();
136 this->close();
Yingdi Yud59b5932013-10-16 13:16:49 -0700137}
138
Yingdi Yuaa8d7692013-10-18 17:05:02 -0700139void
Yingdi Yuc29fb982013-10-20 19:43:10 -0700140AddContactPanel::selfEndorseCertificateFetched(const EndorseCertificate& endorseCertificate)
Yingdi Yuaa8d7692013-10-18 17:05:02 -0700141{
Yingdi Yu79c25a22013-10-21 13:38:38 -0700142 m_currentEndorseCertificate = Ptr<EndorseCertificate>(new EndorseCertificate(endorseCertificate));
Yingdi Yu8dacdf22013-11-05 23:06:43 -0800143 m_currentEndorseCertificateReady = true;
144
145 if(m_currentCollectEndorseReady == true)
146 displayContactInfo();
Yingdi Yuc29fb982013-10-20 19:43:10 -0700147}
148
149void
150AddContactPanel::selfEndorseCertificateFetchFailed(const Name& identity)
151{
152 m_warningDialog->setMsg("Cannot fetch contact profile");
153 m_warningDialog->show();
Yingdi Yuaa8d7692013-10-18 17:05:02 -0700154}
155
Yingdi Yu8dacdf22013-11-05 23:06:43 -0800156void
157AddContactPanel::onContactKeyFetched(const EndorseCertificate& endorseCertificate)
158{
159 m_currentEndorseCertificate = Ptr<EndorseCertificate>(new EndorseCertificate(endorseCertificate));
160
Yingdi Yue9ea5c92013-11-06 18:42:34 -0800161 m_currentCollectEndorseReady = NULL;
162
163 displayContactInfo();
Yingdi Yu8dacdf22013-11-05 23:06:43 -0800164}
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;
Yingdi Yu8dacdf22013-11-05 23:06:43 -0800225
226 if(!contact->isIntroducer() || !contact->canBeTrustedFor(m_currentEndorseCertificate->getProfileData()->getIdentityName()))
227 continue;
Yingdi Yu8dacdf22013-11-05 23:06:43 -0800228
229 if(!security::PolicyManager::verifySignature(*data, contact->getSelfEndorseCertificate().getPublicKeyInfo()))
230 continue;
231
232 const Blob& tmpProfileBlob = endorseCert->getProfileData()->content();
233 if(profileBlob != tmpProfileBlob)
234 continue;
235
Yingdi Yu8dacdf22013-11-05 23:06:43 -0800236 const vector<string>& endorseList = endorseCert->getEndorseList();
237 vector<string>::const_iterator it = endorseList.begin();
238 for(; it != endorseList.end(); it++)
Yingdi Yu6a5b9f62013-11-06 23:00:21 -0800239 endorseCount[*it] += 1;
Yingdi Yu8dacdf22013-11-05 23:06:43 -0800240 }
241 }
242
243 // map<string, int>::iterator tmp_it = endorseCount.begin();
244 // for(; tmp_it != endorseCount.end(); tmp_it++)
245 // {
246 // _LOG_DEBUG("Entry: " << tmp_it->first << " " << tmp_it->second);
247 // }
248
249 ui->infoView->setColumnCount(3);
250 Profile::const_iterator it = profile.begin();
251 int rowCount = 0;
252
253 QTableWidgetItem *typeHeader = new QTableWidgetItem(QString::fromUtf8("Type"));
254 ui->infoView->setHorizontalHeaderItem(0, typeHeader);
255 QTableWidgetItem *valueHeader = new QTableWidgetItem(QString::fromUtf8("Value"));
256 ui->infoView->setHorizontalHeaderItem(1, valueHeader);
257 QTableWidgetItem *endorseHeader = new QTableWidgetItem(QString::fromUtf8("Endorse"));
258 ui->infoView->setHorizontalHeaderItem(2, endorseHeader);
259
260 for(; it != profile.end(); it++)
261 {
262 ui->infoView->insertRow(rowCount);
263 QTableWidgetItem *type = new QTableWidgetItem(QString::fromUtf8(it->first.c_str()));
264 ui->infoView->setItem(rowCount, 0, type);
265
266 string valueString(it->second.buf(), it->second.size());
267 QTableWidgetItem *value = new QTableWidgetItem(QString::fromUtf8(valueString.c_str()));
268 ui->infoView->setItem(rowCount, 1, value);
269
270 map<string, int>::iterator map_it = endorseCount.find(it->first);
271 QTableWidgetItem *endorse = NULL;
272 if(map_it == endorseCount.end())
273 endorse = new QTableWidgetItem(QString::number(0));
274 else
275 endorse = new QTableWidgetItem(QString::number(map_it->second));
276 ui->infoView->setItem(rowCount, 2, endorse);
277
278 rowCount++;
279 }
280}
281
Yingdi Yud59b5932013-10-16 13:16:49 -0700282#if WAF
283#include "addcontactpanel.moc"
284#include "addcontactpanel.cpp.moc"
285#endif