//--------------------------------------------------------------------- bool PeerContactProfile::setPublicProfile(ElementPtr newProfileElement) { AutoRecursiveLock lock(mLock); if (!mDocument) return false; PeerFilesPtr outer = mPeerFiles.lock(); if (!outer) return false; IPeerFilePrivatePtr privatePeer = outer->getPrivate(); if (!privatePeer) return false; try { ElementPtr contactProfileElement = getContactProfileElement(); if (!contactProfileElement) return false; ElementPtr publicElement = contactProfileElement->findFirstChildElement("public"); ElementPtr profileElement; if (publicElement) profileElement = publicElement->findFirstChildElementChecked("profile"); if (!newProfileElement) { // erasing the profile element to clean newProfileElement = Element::create(); newProfileElement->setValue("profile"); } if (profileElement) { profileElement->adoptAsNextSibling(newProfileElement); profileElement->orphan(); } else { if (!publicElement) { publicElement = Element::create(); publicElement->setValue("public"); contactProfileElement->adoptAsFirstChild(publicElement); } publicElement->adoptAsLastChild(newProfileElement); } // upgrade the document version number UINT version = getVersionNumber(); ++version; contactProfileElement->setAttribute("version", Stringize<UINT>(version).string()); if (!isExternal()) { // now this this must be signed privatePeer->signElement(contactProfileElement); } } catch (zsLib::XML::Exceptions::CheckFailed &) { return false; } return true; }
//--------------------------------------------------------------------- bool PeerContactProfile::setPrivateProfile(ElementPtr newProfileElement) { AutoRecursiveLock lock(mLock); if (!mDocument) return false; PeerFilesPtr outer; IPeerFilePrivatePtr privatePeer; if (!isExternal()) { outer = mPeerFiles.lock(); if (!outer) return false; privatePeer = outer->getPrivate(); if (!privatePeer) return false; } try { ElementPtr contactProfileElement = getContactProfileElement(); if (!contactProfileElement) return false; ElementPtr privateElement = contactProfileElement->findFirstChildElementChecked("private"); ElementPtr encryptedProfileElement = privateElement->findFirstChildElement("encryptedProfile"); ElementPtr saltElement = privateElement->findFirstChildElementChecked("salt"); String saltAsBase64 = saltElement->getText(true); if (!newProfileElement) { // erasing the profile element to clean newProfileElement = Element::create(); newProfileElement->setValue("profile"); } DocumentPtr tempDoc = Document::create(); tempDoc->adoptAsLastChild(newProfileElement->clone()); // write out the new value boost::shared_array<char> output = tempDoc->write(); // encrypt it String encryptedProfileAsBase64 = encryptToBase64( "profile", mContactProfileSecret.c_str(), saltAsBase64, (const BYTE *)(output.get()), strlen(output.get()) ); ElementPtr tempNewEncryptedProfileElement = Element::create(); tempNewEncryptedProfileElement->setValue("encryptedProfile"); TextPtr encryptedProfileText = Text::create(); encryptedProfileText->setValue(encryptedProfileAsBase64); tempNewEncryptedProfileElement->adoptAsLastChild(encryptedProfileText); if (encryptedProfileElement) { encryptedProfileElement->adoptAsNextSibling(tempNewEncryptedProfileElement); encryptedProfileElement->orphan(); } else { privateElement->adoptAsLastChild(tempNewEncryptedProfileElement); } // upgrade the document version number UINT version = getVersionNumber(); ++version; contactProfileElement->setAttribute("version", Stringize<UINT>(version).string()); if (!isExternal()) { // now this this must be signed privatePeer->signElement(contactProfileElement); } } catch (zsLib::XML::Exceptions::CheckFailed &) { return false; } return true; }