/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace com::sun::star; namespace svx::SignatureLineHelper { OUString getSignatureImage(const OUString& rType) { OUString aType = rType; if (aType.isEmpty()) { aType = "signature-line.svg"; } OUString aPath("$BRAND_BASE_DIR/" LIBO_SHARE_FOLDER "/filter/" + aType); rtl::Bootstrap::expandMacros(aPath); SvFileStream aStream(aPath, StreamMode::READ); if (aStream.GetError() != ERRCODE_NONE) { SAL_WARN("cui.dialogs", "failed to open " << aType); } OString const svg = read_uInt8s_ToOString(aStream, aStream.remainingSize()); return OUString::fromUtf8(svg); } uno::Reference getSignatureCertificate(SfxObjectShell* pShell, weld::Window* pParent) { if (!pShell) { return {}; } if (!pParent) { return {}; } uno::Reference xSigner; if (pShell->GetMedium()->GetFilter()->IsAlienFormat()) { xSigner = security::DocumentDigitalSignatures::createDefault( comphelper::getProcessComponentContext()); } else { OUString const aODFVersion( comphelper::OStorageHelper::GetODFVersionFromStorage(pShell->GetStorage())); xSigner = security::DocumentDigitalSignatures::createWithVersion( comphelper::getProcessComponentContext(), aODFVersion); } xSigner->setParentWindow(pParent->GetXWindow()); OUString aDescription; security::CertificateKind certificateKind = security::CertificateKind_NONE; // When signing ooxml, we only want X.509 certificates if (pShell->GetMedium()->GetFilter()->IsAlienFormat()) { certificateKind = security::CertificateKind_X509; } uno::Reference xSignCertificate = xSigner->selectSigningCertificateWithType(certificateKind, aDescription); return xSignCertificate; } OUString getSignerName(const css::uno::Reference& xCertificate) { return comphelper::xmlsec::GetContentPart(xCertificate->getSubjectName(), xCertificate->getCertificateKind()); } OUString getLocalizedDate() { const SvtSysLocale aSysLocale; const LocaleDataWrapper& rLocaleData = aSysLocale.GetLocaleData(); Date aDateTime(Date::SYSTEM); return rLocaleData.getDate(aDateTime); } uno::Reference importSVG(std::u16string_view rSVG) { SvMemoryStream aSvgStream(4096, 4096); aSvgStream.WriteOString(OUStringToOString(rSVG, RTL_TEXTENCODING_UTF8)); uno::Reference xInputStream(new utl::OSeekableInputStreamWrapper(aSvgStream)); const uno::Reference& xContext( comphelper::getProcessComponentContext()); uno::Reference xProvider = graphic::GraphicProvider::create(xContext); uno::Sequence aMediaProperties{ comphelper::makePropertyValue( u"InputStream"_ustr, xInputStream) }; uno::Reference xGraphic(xProvider->queryGraphic(aMediaProperties)); return xGraphic; } void setShapeCertificate(const SdrView* pView, const css::uno::Reference& xCertificate) { const SdrMarkList& rMarkList = pView->GetMarkedObjectList(); if (rMarkList.GetMarkCount() < 1) { return; } const SdrMark* pMark = rMarkList.GetMark(0); SdrObject* pSignatureLine = pMark->GetMarkedSdrObj(); if (!pSignatureLine) { return; } // Remember the selected certificate. uno::Reference xShape = pSignatureLine->getUnoShape(); uno::Reference xShapeProps(xShape, uno::UNO_QUERY); comphelper::SequenceAsHashMap aMap(xShapeProps->getPropertyValue(u"InteropGrabBag"_ustr)); aMap[u"SignatureCertificate"_ustr] <<= xCertificate; xShapeProps->setPropertyValue(u"InteropGrabBag"_ustr, uno::Any(aMap.getAsConstPropertyValueList())); // Read svg and replace placeholder texts. OUString aSvgImage( svx::SignatureLineHelper::getSignatureImage(u"signature-line-draw.svg"_ustr)); aSvgImage = aSvgImage.replaceAll("[SIGNED_BY]", SvxResId(RID_SVXSTR_SIGNATURELINE_DSIGNED_BY)); OUString aSignerName = svx::SignatureLineHelper::getSignerName(xCertificate); aSvgImage = aSvgImage.replaceAll("[SIGNER_NAME]", aSignerName); OUString aDate = svx::SignatureLineHelper::getLocalizedDate(); aDate = SvxResId(RID_SVXSTR_SIGNATURELINE_DATE).replaceFirst("%1", aDate); aSvgImage = aSvgImage.replaceAll("[DATE]", aDate); uno::Reference xGraphic = svx::SignatureLineHelper::importSVG(aSvgImage); xShapeProps->setPropertyValue(u"Graphic"_ustr, uno::Any(xGraphic)); } } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */