blob: af805b0f738c3a4cdce0209c463a5531422d441e [file] [log] [blame]
Yingdi Yu5ff62102013-10-13 17:24:50 -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
11#include "profile.h"
Yingdi Yu64206112013-12-24 11:16:32 +080012#include "null-ptrs.h"
Yingdi Yu68aced92013-10-17 21:13:03 -070013#include "logging.h"
Yingdi Yu5ff62102013-10-13 17:24:50 -070014
15using namespace std;
16using namespace ndn;
Yingdi Yu64206112013-12-24 11:16:32 +080017using namespace ndn::ptr_lib;
Yingdi Yu5ff62102013-10-13 17:24:50 -070018
Yingdi Yu68aced92013-10-17 21:13:03 -070019INIT_LOGGER("Profile");
Yingdi Yue9ea5c92013-11-06 18:42:34 -080020
21static string nameOid("2.5.4.41");
22static string orgOid("2.5.4.11");
23static string groupOid("2.5.4.1");
24static string homepageOid("2.5.4.3");
25static string advisor("2.5.4.80");
26static string emailOid("1.2.840.113549.1.9.1");
27
Yingdi Yu64206112013-12-24 11:16:32 +080028Profile::Profile(const IdentityCertificate& oldIdentityCertificate)
Yingdi Yue9ea5c92013-11-06 18:42:34 -080029{
Yingdi Yu64206112013-12-24 11:16:32 +080030 IdentityCertificate identityCertificate(oldIdentityCertificate);
Yingdi Yue9ea5c92013-11-06 18:42:34 -080031
32 Name keyName = identityCertificate.getPublicKeyName();
Yingdi Yu64206112013-12-24 11:16:32 +080033 m_identityName = keyName.getPrefix(-1);
Yingdi Yue9ea5c92013-11-06 18:42:34 -080034
35 const string& identityString = m_identityName.toUri();
Yingdi Yu64206112013-12-24 11:16:32 +080036 m_entries[string("IDENTITY")] = identityString;
Yingdi Yue9ea5c92013-11-06 18:42:34 -080037
Yingdi Yu64206112013-12-24 11:16:32 +080038 const vector<CertificateSubjectDescription>& subList = identityCertificate.getSubjectDescriptionList();
39 vector<CertificateSubjectDescription>::const_iterator it = subList.begin();
Yingdi Yue9ea5c92013-11-06 18:42:34 -080040 for(; it != subList.end(); it++)
41 {
Yingdi Yu64206112013-12-24 11:16:32 +080042 const string oidStr = it->getOidString();
43 string valueStr = it->getValue();
Yingdi Yue9ea5c92013-11-06 18:42:34 -080044 if(oidStr == nameOid)
Yingdi Yu64206112013-12-24 11:16:32 +080045 m_entries[string("name")] = valueStr;
Yingdi Yue9ea5c92013-11-06 18:42:34 -080046 else if(oidStr == orgOid)
Yingdi Yu64206112013-12-24 11:16:32 +080047 m_entries[string("institution")] = valueStr;
Yingdi Yue9ea5c92013-11-06 18:42:34 -080048 else if(oidStr == groupOid)
Yingdi Yu64206112013-12-24 11:16:32 +080049 m_entries[string("group")] = valueStr;
Yingdi Yue9ea5c92013-11-06 18:42:34 -080050 else if(oidStr == homepageOid)
Yingdi Yu64206112013-12-24 11:16:32 +080051 m_entries[string("homepage")] = valueStr;
Yingdi Yue9ea5c92013-11-06 18:42:34 -080052 else if(oidStr == advisor)
Yingdi Yu64206112013-12-24 11:16:32 +080053 m_entries[string("advisor")] = valueStr;
Yingdi Yue9ea5c92013-11-06 18:42:34 -080054 else if(oidStr == emailOid)
Yingdi Yu64206112013-12-24 11:16:32 +080055 m_entries[string("email")] = valueStr;
Yingdi Yue9ea5c92013-11-06 18:42:34 -080056 else
Yingdi Yu64206112013-12-24 11:16:32 +080057 m_entries[oidStr] = valueStr;
Yingdi Yue9ea5c92013-11-06 18:42:34 -080058 }
59}
60
Yingdi Yu5ff62102013-10-13 17:24:50 -070061Profile::Profile(const Name& identityName)
62 : m_identityName(identityName)
Yingdi Yu0a6b6c52013-10-15 17:54:00 -070063{
Yingdi Yu64206112013-12-24 11:16:32 +080064 const string& identityString = identityName.toUri();
65 m_entries[string("IDENTITY")] = identityString;
Yingdi Yu0a6b6c52013-10-15 17:54:00 -070066}
Yingdi Yu5ff62102013-10-13 17:24:50 -070067
68Profile::Profile(const Name& identityName,
69 const string& name,
70 const string& institution)
71 : m_identityName(identityName)
72{
Yingdi Yu64206112013-12-24 11:16:32 +080073 const string& identityString = identityName.toUri();
74 m_entries[string("IDENTITY")] = identityString;
Yingdi Yu0a6b6c52013-10-15 17:54:00 -070075
Yingdi Yu64206112013-12-24 11:16:32 +080076 m_entries[string("name")] = name;
77 m_entries[string("institution")] = institution;
Yingdi Yu5ff62102013-10-13 17:24:50 -070078}
79
80Profile::Profile(const Profile& profile)
81 : m_identityName(profile.m_identityName)
82 , m_entries(profile.m_entries)
83{}
84
85void
86Profile::setProfileEntry(const string& profileType,
Yingdi Yu64206112013-12-24 11:16:32 +080087 const string& profileValue)
Yingdi Yu5ff62102013-10-13 17:24:50 -070088{ m_entries[profileType] = profileValue; }
89
Yingdi Yu64206112013-12-24 11:16:32 +080090string
Yingdi Yu53b8a9c2013-10-14 09:36:31 -070091Profile::getProfileEntry(const string& profileType) const
Yingdi Yu5ff62102013-10-13 17:24:50 -070092{
93 if(m_entries.find(profileType) != m_entries.end())
Yingdi Yu64206112013-12-24 11:16:32 +080094 return m_entries.at(profileType);
Yingdi Yu5ff62102013-10-13 17:24:50 -070095
Yingdi Yu64206112013-12-24 11:16:32 +080096 return CHRONOCHAT_NULL_STR;
Yingdi Yu5ff62102013-10-13 17:24:50 -070097}
98
Yingdi Yu64206112013-12-24 11:16:32 +080099void
100Profile::encode(string* output) const
Yingdi Yu5ff62102013-10-13 17:24:50 -0700101{
Yingdi Yu5ff62102013-10-13 17:24:50 -0700102
Yingdi Yu64206112013-12-24 11:16:32 +0800103 Chronos::ProfileMsg profileMsg;
104
105 profileMsg.set_identityname(m_identityName.toUri());
106
107 map<string, string>::const_iterator it = m_entries.begin();
Yingdi Yu5ff62102013-10-13 17:24:50 -0700108 for(; it != m_entries.end(); it++)
109 {
Yingdi Yu64206112013-12-24 11:16:32 +0800110 Chronos::ProfileMsg::ProfileEntry* profileEntry = profileMsg.add_entry();
111 profileEntry->set_oid(it->first);
112 profileEntry->set_data(it->second);
Yingdi Yu5ff62102013-10-13 17:24:50 -0700113 }
Yingdi Yu5ff62102013-10-13 17:24:50 -0700114
Yingdi Yu64206112013-12-24 11:16:32 +0800115 profileMsg.SerializeToString(output);
Yingdi Yu5ff62102013-10-13 17:24:50 -0700116}
117
Yingdi Yu64206112013-12-24 11:16:32 +0800118shared_ptr<Profile>
119Profile::decode(const string& input)
Yingdi Yu5ff62102013-10-13 17:24:50 -0700120{
Yingdi Yu64206112013-12-24 11:16:32 +0800121 Chronos::ProfileMsg profileMsg;
122
123 profileMsg.ParseFromString(input);
Yingdi Yu5ff62102013-10-13 17:24:50 -0700124
Yingdi Yu64206112013-12-24 11:16:32 +0800125 shared_ptr<Profile> profile = make_shared<Profile>(profileMsg.identityname());
Yingdi Yu5ff62102013-10-13 17:24:50 -0700126
Yingdi Yu64206112013-12-24 11:16:32 +0800127 for(int i = 0; i < profileMsg.entry_size(); i++)
Yingdi Yu5ff62102013-10-13 17:24:50 -0700128 {
Yingdi Yu64206112013-12-24 11:16:32 +0800129 const Chronos::ProfileMsg::ProfileEntry& profileEntry = profileMsg.entry(i);
130 profile->setProfileEntry(profileEntry.oid(), profileEntry.data());
Yingdi Yu5ff62102013-10-13 17:24:50 -0700131 }
132
133 return profile;
134}