1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_xmlsecurity.hxx"
26*b1cdbd2cSJim Jagielski #include <xmlsecurity/digitalsignaturesdialog.hxx>
27*b1cdbd2cSJim Jagielski #include <xmlsecurity/certificatechooser.hxx>
28*b1cdbd2cSJim Jagielski #include <xmlsecurity/certificateviewer.hxx>
29*b1cdbd2cSJim Jagielski #include <xmlsecurity/biginteger.hxx>
30*b1cdbd2cSJim Jagielski #include <xmloff/xmluconv.hxx>
31*b1cdbd2cSJim Jagielski #include <com/sun/star/embed/XStorage.hpp>
32*b1cdbd2cSJim Jagielski #include <com/sun/star/embed/ElementModes.hpp>
33*b1cdbd2cSJim Jagielski #include <com/sun/star/io/XSeekable.hpp>
34*b1cdbd2cSJim Jagielski #include <com/sun/star/io/XTruncate.hpp>
35*b1cdbd2cSJim Jagielski #include <com/sun/star/embed/XTransactedObject.hpp>
36*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XNameAccess.hpp>
37*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XComponent.hpp>
38*b1cdbd2cSJim Jagielski #include <com/sun/star/security/NoPasswordException.hpp>
39*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/DisposedException.hpp>
40*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertySet.hpp>
41*b1cdbd2cSJim Jagielski #include <com/sun/star/security/CertificateValidity.hdl>
42*b1cdbd2cSJim Jagielski #include <com/sun/star/packages/WrongPasswordException.hpp>
43*b1cdbd2cSJim Jagielski #include <com/sun/star/security/SerialNumberAdapter.hpp>
44*b1cdbd2cSJim Jagielski #include <com/sun/star/security/XDocumentDigitalSignatures.hpp>
45*b1cdbd2cSJim Jagielski #include <com/sun/star/xml/dom/XDocumentBuilder.hpp>
46*b1cdbd2cSJim Jagielski #include <com/sun/star/packages/manifest/XManifestReader.hpp>
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski 
49*b1cdbd2cSJim Jagielski #include <rtl/ustrbuf.hxx>
50*b1cdbd2cSJim Jagielski #include <rtl/uri.hxx>
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski #include <tools/date.hxx>
53*b1cdbd2cSJim Jagielski #include <tools/time.hxx>
54*b1cdbd2cSJim Jagielski 
55*b1cdbd2cSJim Jagielski #include "dialogs.hrc"
56*b1cdbd2cSJim Jagielski #include "digitalsignaturesdialog.hrc"
57*b1cdbd2cSJim Jagielski #include "helpids.hrc"
58*b1cdbd2cSJim Jagielski #include "resourcemanager.hxx"
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski #include <vcl/msgbox.hxx> // Until encrypted docs work...
61*b1cdbd2cSJim Jagielski #include <unotools/configitem.hxx>
62*b1cdbd2cSJim Jagielski #include <comphelper/componentcontext.hxx>
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski #define OUSTR(x) ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(x) )
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski /* HACK: disable some warnings for MS-C */
68*b1cdbd2cSJim Jagielski #ifdef _MSC_VER
69*b1cdbd2cSJim Jagielski #pragma warning (disable : 4355)	// 4355: this used in initializer-list
70*b1cdbd2cSJim Jagielski #endif
71*b1cdbd2cSJim Jagielski 
72*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::security;
73*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
74*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
75*b1cdbd2cSJim Jagielski namespace css = ::com::sun::star;
76*b1cdbd2cSJim Jagielski using ::rtl::OUString;
77*b1cdbd2cSJim Jagielski 
78*b1cdbd2cSJim Jagielski namespace
79*b1cdbd2cSJim Jagielski {
80*b1cdbd2cSJim Jagielski     class SaveODFItem: public utl::ConfigItem
81*b1cdbd2cSJim Jagielski     {
82*b1cdbd2cSJim Jagielski         sal_Int16 m_nODF;
83*b1cdbd2cSJim Jagielski     public:
84*b1cdbd2cSJim Jagielski 	virtual void Commit();
85*b1cdbd2cSJim Jagielski 	virtual void Notify( const ::com::sun::star::uno::Sequence< rtl::OUString >& aPropertyNames );
86*b1cdbd2cSJim Jagielski         SaveODFItem();
87*b1cdbd2cSJim Jagielski         //See group ODF in Common.xcs
isLessODF1_2()88*b1cdbd2cSJim Jagielski         bool isLessODF1_2()
89*b1cdbd2cSJim Jagielski         {
90*b1cdbd2cSJim Jagielski             return m_nODF < 3;
91*b1cdbd2cSJim Jagielski         }
92*b1cdbd2cSJim Jagielski     };
93*b1cdbd2cSJim Jagielski 
Commit()94*b1cdbd2cSJim Jagielski void SaveODFItem::Commit() {}
Notify(const::com::sun::star::uno::Sequence<rtl::OUString> &)95*b1cdbd2cSJim Jagielski void SaveODFItem::Notify( const ::com::sun::star::uno::Sequence< rtl::OUString >& ) {}
96*b1cdbd2cSJim Jagielski 
SaveODFItem()97*b1cdbd2cSJim Jagielski     SaveODFItem::SaveODFItem(): utl::ConfigItem(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(
98*b1cdbd2cSJim Jagielski         "Office.Common/Save"))), m_nODF(0)
99*b1cdbd2cSJim Jagielski     {
100*b1cdbd2cSJim Jagielski         OUString sDef(RTL_CONSTASCII_USTRINGPARAM("ODF/DefaultVersion"));
101*b1cdbd2cSJim Jagielski         Sequence< css::uno::Any > aValues = GetProperties( Sequence<OUString>(&sDef,1) );
102*b1cdbd2cSJim Jagielski         if ( aValues.getLength() == 1)
103*b1cdbd2cSJim Jagielski         {
104*b1cdbd2cSJim Jagielski             sal_Int16 nTmp = 0;
105*b1cdbd2cSJim Jagielski             if ( aValues[0] >>= nTmp )
106*b1cdbd2cSJim Jagielski                 m_nODF = nTmp;
107*b1cdbd2cSJim Jagielski             else
108*b1cdbd2cSJim Jagielski                 throw uno::RuntimeException(
109*b1cdbd2cSJim Jagielski                     OUString(RTL_CONSTASCII_USTRINGPARAM(
110*b1cdbd2cSJim Jagielski                         "[xmlsecurity]SaveODFItem::SaveODFItem(): Wrong Type!")), 0 );
111*b1cdbd2cSJim Jagielski 
112*b1cdbd2cSJim Jagielski         }
113*b1cdbd2cSJim Jagielski         else
114*b1cdbd2cSJim Jagielski             throw uno::RuntimeException(
115*b1cdbd2cSJim Jagielski                 OUString(RTL_CONSTASCII_USTRINGPARAM(
116*b1cdbd2cSJim Jagielski                     "[xmlsecurity] Could not open property Office.Common/Save/ODF/DefaultVersion")), 0);
117*b1cdbd2cSJim Jagielski     }
118*b1cdbd2cSJim Jagielski }
119*b1cdbd2cSJim Jagielski 
120*b1cdbd2cSJim Jagielski /* Using the zip storage, we cannot get the properties "MediaType" and "IsEncrypted"
121*b1cdbd2cSJim Jagielski     We use the manifest to find out if a file is xml and if it is encrypted.
122*b1cdbd2cSJim Jagielski     The parameter is an encoded uri. However, the manifest contains paths. Therefore
123*b1cdbd2cSJim Jagielski     the path is encoded as uri, so they can be compared.
124*b1cdbd2cSJim Jagielski */
isXML(const rtl::OUString & rURI)125*b1cdbd2cSJim Jagielski bool DigitalSignaturesDialog::isXML(const rtl::OUString& rURI )
126*b1cdbd2cSJim Jagielski {
127*b1cdbd2cSJim Jagielski     OSL_ASSERT(mxStore.is());
128*b1cdbd2cSJim Jagielski 
129*b1cdbd2cSJim Jagielski     bool bIsXML = false;
130*b1cdbd2cSJim Jagielski     bool bPropsAvailable = false;
131*b1cdbd2cSJim Jagielski     const OUString sPropFullPath(RTL_CONSTASCII_USTRINGPARAM("FullPath"));
132*b1cdbd2cSJim Jagielski     const OUString sPropMediaType(RTL_CONSTASCII_USTRINGPARAM("MediaType"));
133*b1cdbd2cSJim Jagielski     const OUString sPropDigest(RTL_CONSTASCII_USTRINGPARAM("Digest"));
134*b1cdbd2cSJim Jagielski 
135*b1cdbd2cSJim Jagielski     for (int i = 0; i < m_manifest.getLength(); i++)
136*b1cdbd2cSJim Jagielski     {
137*b1cdbd2cSJim Jagielski         Any digest;
138*b1cdbd2cSJim Jagielski         const Sequence< css::beans::PropertyValue >& entry = m_manifest[i];
139*b1cdbd2cSJim Jagielski         OUString sPath, sMediaType;
140*b1cdbd2cSJim Jagielski         bool bEncrypted = false;
141*b1cdbd2cSJim Jagielski         for (int j = 0; j < entry.getLength(); j++)
142*b1cdbd2cSJim Jagielski         {
143*b1cdbd2cSJim Jagielski             const css::beans::PropertyValue & prop = entry[j];
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski             if (prop.Name.equals( sPropFullPath ) )
146*b1cdbd2cSJim Jagielski                 prop.Value >>= sPath;
147*b1cdbd2cSJim Jagielski             else if (prop.Name.equals( sPropMediaType ) )
148*b1cdbd2cSJim Jagielski                 prop.Value >>= sMediaType;
149*b1cdbd2cSJim Jagielski             else if (prop.Name.equals( sPropDigest ) )
150*b1cdbd2cSJim Jagielski                 bEncrypted = true;
151*b1cdbd2cSJim Jagielski         }
152*b1cdbd2cSJim Jagielski         if (DocumentSignatureHelper::equalsReferenceUriManifestPath(rURI, sPath))
153*b1cdbd2cSJim Jagielski         {
154*b1cdbd2cSJim Jagielski             bIsXML = sMediaType.equals(OUSTR("text/xml")) && ! bEncrypted;
155*b1cdbd2cSJim Jagielski             bPropsAvailable = true;
156*b1cdbd2cSJim Jagielski             break;
157*b1cdbd2cSJim Jagielski         }
158*b1cdbd2cSJim Jagielski     }
159*b1cdbd2cSJim Jagielski     if (!bPropsAvailable)
160*b1cdbd2cSJim Jagielski     {
161*b1cdbd2cSJim Jagielski         //This would be the case for at least mimetype, META-INF/manifest.xml
162*b1cdbd2cSJim Jagielski         //META-INF/macrosignatures.xml.
163*b1cdbd2cSJim Jagielski         //Files can only be encrypted if they are in the manifest.xml.
164*b1cdbd2cSJim Jagielski         //That is, the current file cannot be encrypted, otherwise bPropsAvailable
165*b1cdbd2cSJim Jagielski         //would be true.
166*b1cdbd2cSJim Jagielski         OUString aXMLExt( RTL_CONSTASCII_USTRINGPARAM( "XML" ) );
167*b1cdbd2cSJim Jagielski         sal_Int32 nSep = rURI.lastIndexOf( '.' );
168*b1cdbd2cSJim Jagielski         if ( nSep != (-1) )
169*b1cdbd2cSJim Jagielski         {
170*b1cdbd2cSJim Jagielski             OUString aExt = rURI.copy( nSep+1 );
171*b1cdbd2cSJim Jagielski             if (aExt.equalsIgnoreAsciiCase(aXMLExt ))
172*b1cdbd2cSJim Jagielski                 bIsXML = true;
173*b1cdbd2cSJim Jagielski         }
174*b1cdbd2cSJim Jagielski      }
175*b1cdbd2cSJim Jagielski     return bIsXML;
176*b1cdbd2cSJim Jagielski }
177*b1cdbd2cSJim Jagielski 
DigitalSignaturesDialog(Window * pParent,uno::Reference<uno::XComponentContext> & rxCtx,DocumentSignatureMode eMode,sal_Bool bReadOnly,const::rtl::OUString & sODFVersion,bool bHasDocumentSignature)178*b1cdbd2cSJim Jagielski DigitalSignaturesDialog::DigitalSignaturesDialog(
179*b1cdbd2cSJim Jagielski     Window* pParent,
180*b1cdbd2cSJim Jagielski     uno::Reference< uno::XComponentContext >& rxCtx, DocumentSignatureMode eMode,
181*b1cdbd2cSJim Jagielski     sal_Bool bReadOnly, const ::rtl::OUString& sODFVersion, bool bHasDocumentSignature)
182*b1cdbd2cSJim Jagielski 	:ModalDialog		( pParent, XMLSEC_RES( RID_XMLSECDLG_DIGSIG ) )
183*b1cdbd2cSJim Jagielski 	,mxCtx 				( rxCtx )
184*b1cdbd2cSJim Jagielski 	,maSignatureHelper	( rxCtx )
185*b1cdbd2cSJim Jagielski 	,meSignatureMode	( eMode )
186*b1cdbd2cSJim Jagielski 	,maHintDocFT		( this, XMLSEC_RES( FT_HINT_DOC ) )
187*b1cdbd2cSJim Jagielski 	,maHintBasicFT		( this, XMLSEC_RES( FT_HINT_BASIC ) )
188*b1cdbd2cSJim Jagielski 	,maHintPackageFT	( this, XMLSEC_RES( FT_HINT_PACK ) )
189*b1cdbd2cSJim Jagielski 	,maSignaturesLB		( this, XMLSEC_RES( LB_SIGNATURES ) )
190*b1cdbd2cSJim Jagielski 	,maSigsValidImg		( this, XMLSEC_RES( IMG_STATE_VALID ) )
191*b1cdbd2cSJim Jagielski 	,maSigsValidFI		( this, XMLSEC_RES( FI_STATE_VALID ) )
192*b1cdbd2cSJim Jagielski 	,maSigsInvalidImg	( this, XMLSEC_RES( IMG_STATE_BROKEN ) )
193*b1cdbd2cSJim Jagielski     ,maSigsInvalidFI    ( this, XMLSEC_RES( FI_STATE_BROKEN ) )
194*b1cdbd2cSJim Jagielski     ,maSigsNotvalidatedImg( this, XMLSEC_RES( IMG_STATE_NOTVALIDATED ) )
195*b1cdbd2cSJim Jagielski     ,maSigsNotvalidatedFI ( this, XMLSEC_RES( FI_STATE_NOTVALIDATED ) )
196*b1cdbd2cSJim Jagielski     ,maSigsOldSignatureFI ( this, XMLSEC_RES( FI_STATE_OLDSIGNATURE) )
197*b1cdbd2cSJim Jagielski     ,maViewBtn          ( this, XMLSEC_RES( BTN_VIEWCERT ) )
198*b1cdbd2cSJim Jagielski 	,maAddBtn			( this, XMLSEC_RES( BTN_ADDCERT ) )
199*b1cdbd2cSJim Jagielski 	,maRemoveBtn		( this, XMLSEC_RES( BTN_REMOVECERT ) )
200*b1cdbd2cSJim Jagielski 	,maBottomSepFL		( this, XMLSEC_RES( FL_BOTTOM_SEP ) )
201*b1cdbd2cSJim Jagielski 	,maOKBtn			( this, XMLSEC_RES( BTN_OK ) )
202*b1cdbd2cSJim Jagielski 	,maHelpBtn			( this, XMLSEC_RES( BTN_HELP ) )
203*b1cdbd2cSJim Jagielski     ,m_sODFVersion (sODFVersion)
204*b1cdbd2cSJim Jagielski     ,m_bHasDocumentSignature(bHasDocumentSignature)
205*b1cdbd2cSJim Jagielski     ,m_bWarningShowSignMacro(false)
206*b1cdbd2cSJim Jagielski {
207*b1cdbd2cSJim Jagielski     // --> PB #i48253 the tablistbox needs its own unique id
208*b1cdbd2cSJim Jagielski     maSignaturesLB.Window::SetUniqueId( HID_XMLSEC_TREE_SIGNATURESDLG );
209*b1cdbd2cSJim Jagielski     // <--
210*b1cdbd2cSJim Jagielski     Size aControlSize( maSignaturesLB.GetSizePixel() );
211*b1cdbd2cSJim Jagielski     aControlSize = maSignaturesLB.PixelToLogic( aControlSize, MapMode( MAP_APPFONT ) );
212*b1cdbd2cSJim Jagielski     const long nControlWidth = aControlSize.Width();
213*b1cdbd2cSJim Jagielski     static long nTabs[] = { 4, 0, 6*nControlWidth/100, 36*nControlWidth/100, 74*nControlWidth/100 };
214*b1cdbd2cSJim Jagielski 	maSignaturesLB.SetTabs( &nTabs[ 0 ] );
215*b1cdbd2cSJim Jagielski 	maSignaturesLB.InsertHeaderEntry( String( XMLSEC_RES( STR_HEADERBAR ) ) );
216*b1cdbd2cSJim Jagielski 
217*b1cdbd2cSJim Jagielski     maSigsNotvalidatedFI.SetText( String( XMLSEC_RES( STR_NO_INFO_TO_VERIFY ) ) );
218*b1cdbd2cSJim Jagielski 
219*b1cdbd2cSJim Jagielski     if ( GetSettings().GetStyleSettings().GetHighContrastMode() )
220*b1cdbd2cSJim Jagielski     {
221*b1cdbd2cSJim Jagielski         // high contrast mode needs other images
222*b1cdbd2cSJim Jagielski         maSigsValidImg.SetImage( Image( XMLSEC_RES( IMG_STATE_VALID_HC ) ) );
223*b1cdbd2cSJim Jagielski         maSigsInvalidImg.SetImage( Image( XMLSEC_RES( IMG_STATE_BROKEN_HC ) ) );
224*b1cdbd2cSJim Jagielski         maSigsNotvalidatedImg.SetImage( Image( XMLSEC_RES( IMG_STATE_NOTVALIDATED_HC ) ) );
225*b1cdbd2cSJim Jagielski     }
226*b1cdbd2cSJim Jagielski 
227*b1cdbd2cSJim Jagielski     FreeResource();
228*b1cdbd2cSJim Jagielski 
229*b1cdbd2cSJim Jagielski 	mbVerifySignatures = true;
230*b1cdbd2cSJim Jagielski 	mbSignaturesChanged = false;
231*b1cdbd2cSJim Jagielski 
232*b1cdbd2cSJim Jagielski 	maSignaturesLB.SetSelectHdl( LINK( this, DigitalSignaturesDialog, SignatureHighlightHdl ) );
233*b1cdbd2cSJim Jagielski 	maSignaturesLB.SetDoubleClickHdl( LINK( this, DigitalSignaturesDialog, SignatureSelectHdl ) );
234*b1cdbd2cSJim Jagielski 
235*b1cdbd2cSJim Jagielski 	maViewBtn.SetClickHdl( LINK( this, DigitalSignaturesDialog, ViewButtonHdl ) );
236*b1cdbd2cSJim Jagielski 	maViewBtn.Disable();
237*b1cdbd2cSJim Jagielski 
238*b1cdbd2cSJim Jagielski 	maAddBtn.SetClickHdl( LINK( this, DigitalSignaturesDialog, AddButtonHdl ) );
239*b1cdbd2cSJim Jagielski 	if ( bReadOnly  )
240*b1cdbd2cSJim Jagielski 	    maAddBtn.Disable();
241*b1cdbd2cSJim Jagielski 
242*b1cdbd2cSJim Jagielski 	maRemoveBtn.SetClickHdl( LINK( this, DigitalSignaturesDialog, RemoveButtonHdl ) );
243*b1cdbd2cSJim Jagielski 	maRemoveBtn.Disable();
244*b1cdbd2cSJim Jagielski 
245*b1cdbd2cSJim Jagielski     maOKBtn.SetClickHdl( LINK( this, DigitalSignaturesDialog, OKButtonHdl) );
246*b1cdbd2cSJim Jagielski 
247*b1cdbd2cSJim Jagielski 	switch( meSignatureMode )
248*b1cdbd2cSJim Jagielski 	{
249*b1cdbd2cSJim Jagielski 		case SignatureModeDocumentContent:	maHintDocFT.Show();		break;
250*b1cdbd2cSJim Jagielski 		case SignatureModeMacros:		    maHintBasicFT.Show();	break;
251*b1cdbd2cSJim Jagielski 		case SignatureModePackage:	        maHintPackageFT.Show();	break;
252*b1cdbd2cSJim Jagielski 	}
253*b1cdbd2cSJim Jagielski 
254*b1cdbd2cSJim Jagielski 	// adjust fixed text to images
255*b1cdbd2cSJim Jagielski 	XmlSec::AlignAndFitImageAndControl( maSigsValidImg, maSigsValidFI, 5 );
256*b1cdbd2cSJim Jagielski 	XmlSec::AlignAndFitImageAndControl( maSigsInvalidImg, maSigsInvalidFI, 5 );
257*b1cdbd2cSJim Jagielski     XmlSec::AlignAndFitImageAndControl( maSigsNotvalidatedImg, maSigsNotvalidatedFI, 5 );
258*b1cdbd2cSJim Jagielski     XmlSec::AlignAndFitImageAndControl( maSigsNotvalidatedImg, maSigsOldSignatureFI, 5 );
259*b1cdbd2cSJim Jagielski }
260*b1cdbd2cSJim Jagielski 
~DigitalSignaturesDialog()261*b1cdbd2cSJim Jagielski DigitalSignaturesDialog::~DigitalSignaturesDialog()
262*b1cdbd2cSJim Jagielski {
263*b1cdbd2cSJim Jagielski }
264*b1cdbd2cSJim Jagielski 
Init()265*b1cdbd2cSJim Jagielski sal_Bool DigitalSignaturesDialog::Init()
266*b1cdbd2cSJim Jagielski {
267*b1cdbd2cSJim Jagielski     bool bInit = maSignatureHelper.Init();
268*b1cdbd2cSJim Jagielski 
269*b1cdbd2cSJim Jagielski     DBG_ASSERT( bInit, "Error initializing security context!" );
270*b1cdbd2cSJim Jagielski 
271*b1cdbd2cSJim Jagielski     if ( bInit )
272*b1cdbd2cSJim Jagielski     {
273*b1cdbd2cSJim Jagielski         maSignatureHelper.SetStartVerifySignatureHdl( LINK( this, DigitalSignaturesDialog, StartVerifySignatureHdl ) );
274*b1cdbd2cSJim Jagielski     }
275*b1cdbd2cSJim Jagielski 
276*b1cdbd2cSJim Jagielski     return bInit;
277*b1cdbd2cSJim Jagielski }
278*b1cdbd2cSJim Jagielski 
SetStorage(const com::sun::star::uno::Reference<com::sun::star::embed::XStorage> & rxStore)279*b1cdbd2cSJim Jagielski void DigitalSignaturesDialog::SetStorage( const com::sun::star::uno::Reference < com::sun::star::embed::XStorage >& rxStore )
280*b1cdbd2cSJim Jagielski {
281*b1cdbd2cSJim Jagielski     mxStore = rxStore;
282*b1cdbd2cSJim Jagielski     maSignatureHelper.SetStorage( mxStore, m_sODFVersion);
283*b1cdbd2cSJim Jagielski 
284*b1cdbd2cSJim Jagielski     Reference < css::packages::manifest::XManifestReader > xReader(
285*b1cdbd2cSJim Jagielski         mxCtx->getServiceManager()->createInstanceWithContext(
286*b1cdbd2cSJim Jagielski         OUSTR("com.sun.star.packages.manifest.ManifestReader"), mxCtx), UNO_QUERY_THROW);
287*b1cdbd2cSJim Jagielski 
288*b1cdbd2cSJim Jagielski 	//Get the manifest.xml
289*b1cdbd2cSJim Jagielski     Reference < css::embed::XStorage > xSubStore(rxStore->openStorageElement(
290*b1cdbd2cSJim Jagielski                 OUSTR("META-INF"), css::embed::ElementModes::READ), UNO_QUERY_THROW);
291*b1cdbd2cSJim Jagielski 
292*b1cdbd2cSJim Jagielski     Reference< css::io::XInputStream > xStream(
293*b1cdbd2cSJim Jagielski         xSubStore->openStreamElement(OUSTR("manifest.xml"), css::embed::ElementModes::READ),
294*b1cdbd2cSJim Jagielski         UNO_QUERY_THROW);
295*b1cdbd2cSJim Jagielski 
296*b1cdbd2cSJim Jagielski     m_manifest = xReader->readManifestSequence(xStream);
297*b1cdbd2cSJim Jagielski }
298*b1cdbd2cSJim Jagielski 
SetSignatureStream(const cssu::Reference<css::io::XStream> & rxStream)299*b1cdbd2cSJim Jagielski void DigitalSignaturesDialog::SetSignatureStream( const cssu::Reference < css::io::XStream >& rxStream )
300*b1cdbd2cSJim Jagielski {
301*b1cdbd2cSJim Jagielski     mxSignatureStream = rxStream;
302*b1cdbd2cSJim Jagielski }
303*b1cdbd2cSJim Jagielski 
canAddRemove()304*b1cdbd2cSJim Jagielski bool DigitalSignaturesDialog::canAddRemove()
305*b1cdbd2cSJim Jagielski {
306*b1cdbd2cSJim Jagielski     //m56
307*b1cdbd2cSJim Jagielski     bool ret = true;
308*b1cdbd2cSJim Jagielski     OSL_ASSERT(mxStore.is());
309*b1cdbd2cSJim Jagielski     bool bDoc1_1 = DocumentSignatureHelper::isODFPre_1_2(m_sODFVersion);
310*b1cdbd2cSJim Jagielski     SaveODFItem item;
311*b1cdbd2cSJim Jagielski     bool bSave1_1 = item.isLessODF1_2();
312*b1cdbd2cSJim Jagielski 
313*b1cdbd2cSJim Jagielski     // see specification
314*b1cdbd2cSJim Jagielski     //cvs: specs/www/appwide/security/Electronic_Signatures_and_Security.sxw
315*b1cdbd2cSJim Jagielski     //Paragraph 'Behavior with regard to ODF 1.2'
316*b1cdbd2cSJim Jagielski     //For both, macro and document
317*b1cdbd2cSJim Jagielski     if ( (!bSave1_1  && bDoc1_1) || (bSave1_1 && bDoc1_1) )
318*b1cdbd2cSJim Jagielski     {
319*b1cdbd2cSJim Jagielski         //#4
320*b1cdbd2cSJim Jagielski         ErrorBox err(NULL, XMLSEC_RES(RID_XMLSECDLG_OLD_ODF_FORMAT));
321*b1cdbd2cSJim Jagielski         err.Execute();
322*b1cdbd2cSJim Jagielski         ret = false;
323*b1cdbd2cSJim Jagielski     }
324*b1cdbd2cSJim Jagielski 
325*b1cdbd2cSJim Jagielski     //As of OOo 3.2 the document signature includes in macrosignatures.xml. That is
326*b1cdbd2cSJim Jagielski     //adding a macro signature will break an existing document signature.
327*b1cdbd2cSJim Jagielski     //The sfx2 will remove the documentsignature when the user adds a macro signature
328*b1cdbd2cSJim Jagielski     if (meSignatureMode == SignatureModeMacros
329*b1cdbd2cSJim Jagielski         && ret)
330*b1cdbd2cSJim Jagielski     {
331*b1cdbd2cSJim Jagielski         if (m_bHasDocumentSignature && !m_bWarningShowSignMacro)
332*b1cdbd2cSJim Jagielski         {
333*b1cdbd2cSJim Jagielski             //The warning says that the document signatures will be removed if the user
334*b1cdbd2cSJim Jagielski             //continues. He can then either press 'OK' or 'NO'
335*b1cdbd2cSJim Jagielski             //It the user presses 'Add' or 'Remove' several times then, then the warning
336*b1cdbd2cSJim Jagielski             //is shown every time until the user presses 'OK'. From then on, the warning
337*b1cdbd2cSJim Jagielski             //is not displayed anymore as long as the signatures dialog is alive.
338*b1cdbd2cSJim Jagielski             if (QueryBox(
339*b1cdbd2cSJim Jagielski                 NULL, XMLSEC_RES(MSG_XMLSECDLG_QUERY_REMOVEDOCSIGNBEFORESIGN)).Execute() == RET_NO)
340*b1cdbd2cSJim Jagielski                 ret = false;
341*b1cdbd2cSJim Jagielski             else
342*b1cdbd2cSJim Jagielski                 m_bWarningShowSignMacro = true;
343*b1cdbd2cSJim Jagielski 
344*b1cdbd2cSJim Jagielski         }
345*b1cdbd2cSJim Jagielski     }
346*b1cdbd2cSJim Jagielski     return ret;
347*b1cdbd2cSJim Jagielski }
348*b1cdbd2cSJim Jagielski 
canAdd()349*b1cdbd2cSJim Jagielski bool DigitalSignaturesDialog::canAdd()
350*b1cdbd2cSJim Jagielski {
351*b1cdbd2cSJim Jagielski     if (canAddRemove())
352*b1cdbd2cSJim Jagielski         return true;
353*b1cdbd2cSJim Jagielski     return false;
354*b1cdbd2cSJim Jagielski }
355*b1cdbd2cSJim Jagielski 
canRemove()356*b1cdbd2cSJim Jagielski bool DigitalSignaturesDialog::canRemove()
357*b1cdbd2cSJim Jagielski {
358*b1cdbd2cSJim Jagielski     if (canAddRemove())
359*b1cdbd2cSJim Jagielski         return true;
360*b1cdbd2cSJim Jagielski     return false;
361*b1cdbd2cSJim Jagielski }
362*b1cdbd2cSJim Jagielski 
Execute()363*b1cdbd2cSJim Jagielski short DigitalSignaturesDialog::Execute()
364*b1cdbd2cSJim Jagielski {
365*b1cdbd2cSJim Jagielski     // Verify Signatures and add certificates to ListBox...
366*b1cdbd2cSJim Jagielski     mbVerifySignatures = true;
367*b1cdbd2cSJim Jagielski     ImplGetSignatureInformations(false);
368*b1cdbd2cSJim Jagielski     ImplFillSignaturesBox();
369*b1cdbd2cSJim Jagielski 
370*b1cdbd2cSJim Jagielski     // Only verify once, content will not change.
371*b1cdbd2cSJim Jagielski     // But for refreshing signature information, StartVerifySignatureHdl will be called after each add/remove
372*b1cdbd2cSJim Jagielski     mbVerifySignatures = false;
373*b1cdbd2cSJim Jagielski 
374*b1cdbd2cSJim Jagielski     return Dialog::Execute();
375*b1cdbd2cSJim Jagielski }
376*b1cdbd2cSJim Jagielski 
IMPL_LINK(DigitalSignaturesDialog,SignatureHighlightHdl,void *,EMPTYARG)377*b1cdbd2cSJim Jagielski IMPL_LINK( DigitalSignaturesDialog, SignatureHighlightHdl, void*, EMPTYARG )
378*b1cdbd2cSJim Jagielski {
379*b1cdbd2cSJim Jagielski 	bool bSel = maSignaturesLB.FirstSelected() ? true : false;
380*b1cdbd2cSJim Jagielski     maViewBtn.Enable( bSel );
381*b1cdbd2cSJim Jagielski     if ( maAddBtn.IsEnabled() ) // not read only
382*b1cdbd2cSJim Jagielski 	    maRemoveBtn.Enable( bSel );
383*b1cdbd2cSJim Jagielski 
384*b1cdbd2cSJim Jagielski     return 0;
385*b1cdbd2cSJim Jagielski }
386*b1cdbd2cSJim Jagielski 
IMPL_LINK(DigitalSignaturesDialog,OKButtonHdl,void *,EMPTYARG)387*b1cdbd2cSJim Jagielski IMPL_LINK( DigitalSignaturesDialog, OKButtonHdl, void*, EMPTYARG )
388*b1cdbd2cSJim Jagielski {
389*b1cdbd2cSJim Jagielski     // Export all other signatures...
390*b1cdbd2cSJim Jagielski     SignatureStreamHelper aStreamHelper = ImplOpenSignatureStream(
391*b1cdbd2cSJim Jagielski         embed::ElementModes::WRITE|embed::ElementModes::TRUNCATE, false );
392*b1cdbd2cSJim Jagielski     uno::Reference< io::XOutputStream > xOutputStream(
393*b1cdbd2cSJim Jagielski         aStreamHelper.xSignatureStream, uno::UNO_QUERY );
394*b1cdbd2cSJim Jagielski     uno::Reference< com::sun::star::xml::sax::XDocumentHandler> xDocumentHandler =
395*b1cdbd2cSJim Jagielski         maSignatureHelper.CreateDocumentHandlerWithHeader( xOutputStream );
396*b1cdbd2cSJim Jagielski 
397*b1cdbd2cSJim Jagielski     int nInfos = maCurrentSignatureInformations.size();
398*b1cdbd2cSJim Jagielski     for( int n = 0 ; n < nInfos ; ++n )
399*b1cdbd2cSJim Jagielski         maSignatureHelper.ExportSignature(
400*b1cdbd2cSJim Jagielski         xDocumentHandler, maCurrentSignatureInformations[ n ] );
401*b1cdbd2cSJim Jagielski 
402*b1cdbd2cSJim Jagielski     maSignatureHelper.CloseDocumentHandler( xDocumentHandler);
403*b1cdbd2cSJim Jagielski 
404*b1cdbd2cSJim Jagielski     // If stream was not provided, we are responsible for committing it....
405*b1cdbd2cSJim Jagielski     if ( !mxSignatureStream.is() )
406*b1cdbd2cSJim Jagielski     {
407*b1cdbd2cSJim Jagielski         uno::Reference< embed::XTransactedObject > xTrans(
408*b1cdbd2cSJim Jagielski             aStreamHelper.xSignatureStorage, uno::UNO_QUERY );
409*b1cdbd2cSJim Jagielski         xTrans->commit();
410*b1cdbd2cSJim Jagielski     }
411*b1cdbd2cSJim Jagielski 
412*b1cdbd2cSJim Jagielski     EndDialog(RET_OK);
413*b1cdbd2cSJim Jagielski     return 0;
414*b1cdbd2cSJim Jagielski }
415*b1cdbd2cSJim Jagielski 
IMPL_LINK(DigitalSignaturesDialog,SignatureSelectHdl,void *,EMPTYARG)416*b1cdbd2cSJim Jagielski IMPL_LINK( DigitalSignaturesDialog, SignatureSelectHdl, void*, EMPTYARG )
417*b1cdbd2cSJim Jagielski {
418*b1cdbd2cSJim Jagielski     ImplShowSignaturesDetails();
419*b1cdbd2cSJim Jagielski     return 0;
420*b1cdbd2cSJim Jagielski }
421*b1cdbd2cSJim Jagielski 
IMPL_LINK(DigitalSignaturesDialog,ViewButtonHdl,Button *,EMPTYARG)422*b1cdbd2cSJim Jagielski IMPL_LINK( DigitalSignaturesDialog, ViewButtonHdl, Button*, EMPTYARG )
423*b1cdbd2cSJim Jagielski {
424*b1cdbd2cSJim Jagielski     ImplShowSignaturesDetails();
425*b1cdbd2cSJim Jagielski     return 0;
426*b1cdbd2cSJim Jagielski }
427*b1cdbd2cSJim Jagielski 
IMPL_LINK(DigitalSignaturesDialog,AddButtonHdl,Button *,EMPTYARG)428*b1cdbd2cSJim Jagielski IMPL_LINK( DigitalSignaturesDialog, AddButtonHdl, Button*, EMPTYARG )
429*b1cdbd2cSJim Jagielski {
430*b1cdbd2cSJim Jagielski     if( ! canAdd())
431*b1cdbd2cSJim Jagielski         return 0;
432*b1cdbd2cSJim Jagielski     try
433*b1cdbd2cSJim Jagielski     {
434*b1cdbd2cSJim Jagielski         uno::Reference<com::sun::star::xml::crypto::XSecurityEnvironment> xSecEnv = maSignatureHelper.GetSecurityEnvironment();
435*b1cdbd2cSJim Jagielski 
436*b1cdbd2cSJim Jagielski         uno::Reference<com::sun::star::security::XSerialNumberAdapter> xSerialNumberAdapter =
437*b1cdbd2cSJim Jagielski 			::com::sun::star::security::SerialNumberAdapter::create(mxCtx);
438*b1cdbd2cSJim Jagielski         CertificateChooser aChooser( this, mxCtx, xSecEnv, maCurrentSignatureInformations );
439*b1cdbd2cSJim Jagielski         if ( aChooser.Execute() == RET_OK )
440*b1cdbd2cSJim Jagielski         {
441*b1cdbd2cSJim Jagielski             uno::Reference< ::com::sun::star::security::XCertificate > xCert = aChooser.GetSelectedCertificate();
442*b1cdbd2cSJim Jagielski             if ( !xCert.is() )
443*b1cdbd2cSJim Jagielski             {
444*b1cdbd2cSJim Jagielski                 DBG_ERRORFILE( "no certificate selected" );
445*b1cdbd2cSJim Jagielski                 return -1;
446*b1cdbd2cSJim Jagielski             }
447*b1cdbd2cSJim Jagielski             rtl::OUString aCertSerial = xSerialNumberAdapter->toString( xCert->getSerialNumber() );
448*b1cdbd2cSJim Jagielski             if ( !aCertSerial.getLength() )
449*b1cdbd2cSJim Jagielski             {
450*b1cdbd2cSJim Jagielski                 DBG_ERROR( "Error in Certificate, problem with serial number!" );
451*b1cdbd2cSJim Jagielski                 return -1;
452*b1cdbd2cSJim Jagielski             }
453*b1cdbd2cSJim Jagielski 
454*b1cdbd2cSJim Jagielski             maSignatureHelper.StartMission();
455*b1cdbd2cSJim Jagielski 
456*b1cdbd2cSJim Jagielski             sal_Int32 nSecurityId = maSignatureHelper.GetNewSecurityId();
457*b1cdbd2cSJim Jagielski 
458*b1cdbd2cSJim Jagielski             rtl::OUStringBuffer aStrBuffer;
459*b1cdbd2cSJim Jagielski             SvXMLUnitConverter::encodeBase64(aStrBuffer, xCert->getEncoded());
460*b1cdbd2cSJim Jagielski 
461*b1cdbd2cSJim Jagielski             maSignatureHelper.SetX509Certificate( nSecurityId,
462*b1cdbd2cSJim Jagielski                 xCert->getIssuerName(), aCertSerial,
463*b1cdbd2cSJim Jagielski                 aStrBuffer.makeStringAndClear());
464*b1cdbd2cSJim Jagielski 
465*b1cdbd2cSJim Jagielski             std::vector< rtl::OUString > aElements =
466*b1cdbd2cSJim Jagielski                 DocumentSignatureHelper::CreateElementList(
467*b1cdbd2cSJim Jagielski                     mxStore, rtl::OUString(), meSignatureMode, OOo3_2Document);
468*b1cdbd2cSJim Jagielski 
469*b1cdbd2cSJim Jagielski             sal_Int32 nElements = aElements.size();
470*b1cdbd2cSJim Jagielski             for ( sal_Int32 n = 0; n < nElements; n++ )
471*b1cdbd2cSJim Jagielski             {
472*b1cdbd2cSJim Jagielski                 bool bBinaryMode = !isXML(aElements[n]);
473*b1cdbd2cSJim Jagielski                 maSignatureHelper.AddForSigning( nSecurityId, aElements[n], aElements[n], bBinaryMode );
474*b1cdbd2cSJim Jagielski             }
475*b1cdbd2cSJim Jagielski 
476*b1cdbd2cSJim Jagielski             maSignatureHelper.SetDateTime( nSecurityId, Date(), Time() );
477*b1cdbd2cSJim Jagielski 
478*b1cdbd2cSJim Jagielski             // We open a signature stream in which the existing and the new
479*b1cdbd2cSJim Jagielski             //signature is written. ImplGetSignatureInformation (later in this function) will
480*b1cdbd2cSJim Jagielski             //then read the stream an will fill  maCurrentSignatureInformations. The final signature
481*b1cdbd2cSJim Jagielski             //is written when the user presses OK. Then only maCurrentSignatureInformation and
482*b1cdbd2cSJim Jagielski             //a sax writer are used to write the information.
483*b1cdbd2cSJim Jagielski             SignatureStreamHelper aStreamHelper = ImplOpenSignatureStream(
484*b1cdbd2cSJim Jagielski                 css::embed::ElementModes::WRITE|css::embed::ElementModes::TRUNCATE, true);
485*b1cdbd2cSJim Jagielski             Reference< css::io::XOutputStream > xOutputStream(
486*b1cdbd2cSJim Jagielski                 aStreamHelper.xSignatureStream, UNO_QUERY_THROW);
487*b1cdbd2cSJim Jagielski             Reference< css::xml::sax::XDocumentHandler> xDocumentHandler =
488*b1cdbd2cSJim Jagielski                 maSignatureHelper.CreateDocumentHandlerWithHeader( xOutputStream );
489*b1cdbd2cSJim Jagielski 
490*b1cdbd2cSJim Jagielski             // Export old signatures...
491*b1cdbd2cSJim Jagielski  	        int nInfos = maCurrentSignatureInformations.size();
492*b1cdbd2cSJim Jagielski             for ( int n = 0; n < nInfos; n++ )
493*b1cdbd2cSJim Jagielski 	            maSignatureHelper.ExportSignature( xDocumentHandler, maCurrentSignatureInformations[n]);
494*b1cdbd2cSJim Jagielski 
495*b1cdbd2cSJim Jagielski             // Create a new one...
496*b1cdbd2cSJim Jagielski 	        maSignatureHelper.CreateAndWriteSignature( xDocumentHandler );
497*b1cdbd2cSJim Jagielski 
498*b1cdbd2cSJim Jagielski             // That's it...
499*b1cdbd2cSJim Jagielski 	        maSignatureHelper.CloseDocumentHandler( xDocumentHandler);
500*b1cdbd2cSJim Jagielski 
501*b1cdbd2cSJim Jagielski             maSignatureHelper.EndMission();
502*b1cdbd2cSJim Jagielski 
503*b1cdbd2cSJim Jagielski 			aStreamHelper = SignatureStreamHelper();	// release objects...
504*b1cdbd2cSJim Jagielski 
505*b1cdbd2cSJim Jagielski             mbSignaturesChanged = true;
506*b1cdbd2cSJim Jagielski 
507*b1cdbd2cSJim Jagielski             sal_Int32 nStatus = maSignatureHelper.GetSignatureInformation( nSecurityId ).nStatus;
508*b1cdbd2cSJim Jagielski 
509*b1cdbd2cSJim Jagielski             if ( nStatus == ::com::sun::star::xml::crypto::SecurityOperationStatus_OPERATION_SUCCEEDED )
510*b1cdbd2cSJim Jagielski             {
511*b1cdbd2cSJim Jagielski                 mbSignaturesChanged = true;
512*b1cdbd2cSJim Jagielski 
513*b1cdbd2cSJim Jagielski                 // Can't simply remember current information, need parsing for getting full information :(
514*b1cdbd2cSJim Jagielski 				// We need to verify the signatures again, otherwise the status in the signature information
515*b1cdbd2cSJim Jagielski 				// will not contain
516*b1cdbd2cSJim Jagielski 				// SecurityOperationStatus_OPERATION_SUCCEEDED
517*b1cdbd2cSJim Jagielski 				mbVerifySignatures = true;
518*b1cdbd2cSJim Jagielski                 ImplGetSignatureInformations(true);
519*b1cdbd2cSJim Jagielski                 ImplFillSignaturesBox();
520*b1cdbd2cSJim Jagielski             }
521*b1cdbd2cSJim Jagielski         }
522*b1cdbd2cSJim Jagielski     }
523*b1cdbd2cSJim Jagielski 	catch ( uno::Exception& )
524*b1cdbd2cSJim Jagielski 	{
525*b1cdbd2cSJim Jagielski 	    DBG_ERROR( "Exception while adding a signature!" );
526*b1cdbd2cSJim Jagielski 		// Don't keep invalid entries...
527*b1cdbd2cSJim Jagielski 		ImplGetSignatureInformations(true);
528*b1cdbd2cSJim Jagielski         ImplFillSignaturesBox();
529*b1cdbd2cSJim Jagielski 	}
530*b1cdbd2cSJim Jagielski 
531*b1cdbd2cSJim Jagielski     return 0;
532*b1cdbd2cSJim Jagielski }
533*b1cdbd2cSJim Jagielski 
IMPL_LINK(DigitalSignaturesDialog,RemoveButtonHdl,Button *,EMPTYARG)534*b1cdbd2cSJim Jagielski IMPL_LINK( DigitalSignaturesDialog, RemoveButtonHdl, Button*, EMPTYARG )
535*b1cdbd2cSJim Jagielski {
536*b1cdbd2cSJim Jagielski     if (!canRemove())
537*b1cdbd2cSJim Jagielski         return 0;
538*b1cdbd2cSJim Jagielski 	if( maSignaturesLB.FirstSelected() )
539*b1cdbd2cSJim Jagielski 	{
540*b1cdbd2cSJim Jagielski 	    try
541*b1cdbd2cSJim Jagielski 	    {
542*b1cdbd2cSJim Jagielski             sal_uInt16 nSelected = (sal_uInt16) (sal_uIntPtr) maSignaturesLB.FirstSelected()->GetUserData();
543*b1cdbd2cSJim Jagielski     		maCurrentSignatureInformations.erase( maCurrentSignatureInformations.begin()+nSelected );
544*b1cdbd2cSJim Jagielski 
545*b1cdbd2cSJim Jagielski     		// Export all other signatures...
546*b1cdbd2cSJim Jagielski             SignatureStreamHelper aStreamHelper = ImplOpenSignatureStream(
547*b1cdbd2cSJim Jagielski                 css::embed::ElementModes::WRITE | css::embed::ElementModes::TRUNCATE, true);
548*b1cdbd2cSJim Jagielski             Reference< css::io::XOutputStream > xOutputStream(
549*b1cdbd2cSJim Jagielski                 aStreamHelper.xSignatureStream, UNO_QUERY_THROW);
550*b1cdbd2cSJim Jagielski             Reference< css::xml::sax::XDocumentHandler> xDocumentHandler =
551*b1cdbd2cSJim Jagielski                 maSignatureHelper.CreateDocumentHandlerWithHeader( xOutputStream );
552*b1cdbd2cSJim Jagielski 
553*b1cdbd2cSJim Jagielski             int nInfos = maCurrentSignatureInformations.size();
554*b1cdbd2cSJim Jagielski     		for( int n = 0 ; n < nInfos ; ++n )
555*b1cdbd2cSJim Jagielski     			maSignatureHelper.ExportSignature( xDocumentHandler, maCurrentSignatureInformations[ n ] );
556*b1cdbd2cSJim Jagielski 
557*b1cdbd2cSJim Jagielski     	    maSignatureHelper.CloseDocumentHandler( xDocumentHandler);
558*b1cdbd2cSJim Jagielski 
559*b1cdbd2cSJim Jagielski             mbSignaturesChanged = true;
560*b1cdbd2cSJim Jagielski 
561*b1cdbd2cSJim Jagielski 			aStreamHelper = SignatureStreamHelper();	// release objects...
562*b1cdbd2cSJim Jagielski 
563*b1cdbd2cSJim Jagielski             ImplFillSignaturesBox();
564*b1cdbd2cSJim Jagielski         }
565*b1cdbd2cSJim Jagielski     	catch ( uno::Exception& )
566*b1cdbd2cSJim Jagielski     	{
567*b1cdbd2cSJim Jagielski     	    DBG_ERROR( "Exception while removing a signature!" );
568*b1cdbd2cSJim Jagielski 			// Don't keep invalid entries...
569*b1cdbd2cSJim Jagielski 			ImplGetSignatureInformations(true);
570*b1cdbd2cSJim Jagielski 			ImplFillSignaturesBox();
571*b1cdbd2cSJim Jagielski     	}
572*b1cdbd2cSJim Jagielski 	}
573*b1cdbd2cSJim Jagielski 
574*b1cdbd2cSJim Jagielski     return 0;
575*b1cdbd2cSJim Jagielski }
576*b1cdbd2cSJim Jagielski 
IMPL_LINK(DigitalSignaturesDialog,StartVerifySignatureHdl,void *,EMPTYARG)577*b1cdbd2cSJim Jagielski IMPL_LINK( DigitalSignaturesDialog, StartVerifySignatureHdl, void*, EMPTYARG )
578*b1cdbd2cSJim Jagielski {
579*b1cdbd2cSJim Jagielski     return mbVerifySignatures ? 1 : 0;
580*b1cdbd2cSJim Jagielski }
581*b1cdbd2cSJim Jagielski 
ImplFillSignaturesBox()582*b1cdbd2cSJim Jagielski void DigitalSignaturesDialog::ImplFillSignaturesBox()
583*b1cdbd2cSJim Jagielski {
584*b1cdbd2cSJim Jagielski     maSignaturesLB.Clear();
585*b1cdbd2cSJim Jagielski 
586*b1cdbd2cSJim Jagielski     uno::Reference< ::com::sun::star::xml::crypto::XSecurityEnvironment > xSecEnv = maSignatureHelper.GetSecurityEnvironment();
587*b1cdbd2cSJim Jagielski     uno::Reference<com::sun::star::security::XSerialNumberAdapter> xSerialNumberAdapter =
588*b1cdbd2cSJim Jagielski         ::com::sun::star::security::SerialNumberAdapter::create(mxCtx);
589*b1cdbd2cSJim Jagielski 
590*b1cdbd2cSJim Jagielski     uno::Reference< ::com::sun::star::security::XCertificate > xCert;
591*b1cdbd2cSJim Jagielski 
592*b1cdbd2cSJim Jagielski 	String aNullStr;
593*b1cdbd2cSJim Jagielski 	int nInfos = maCurrentSignatureInformations.size();
594*b1cdbd2cSJim Jagielski     int nValidSigs = 0, nValidCerts = 0;
595*b1cdbd2cSJim Jagielski     bool bAllNewSignatures = true;
596*b1cdbd2cSJim Jagielski 
597*b1cdbd2cSJim Jagielski     if( nInfos )
598*b1cdbd2cSJim Jagielski     {
599*b1cdbd2cSJim Jagielski         for( int n = 0; n < nInfos; ++n )
600*b1cdbd2cSJim Jagielski         {
601*b1cdbd2cSJim Jagielski             DocumentSignatureAlgorithm mode = DocumentSignatureHelper::getDocumentAlgorithm(
602*b1cdbd2cSJim Jagielski                 m_sODFVersion, maCurrentSignatureInformations[n]);
603*b1cdbd2cSJim Jagielski             std::vector< rtl::OUString > aElementsToBeVerified =
604*b1cdbd2cSJim Jagielski                 DocumentSignatureHelper::CreateElementList(
605*b1cdbd2cSJim Jagielski                 mxStore, ::rtl::OUString(), meSignatureMode, mode);
606*b1cdbd2cSJim Jagielski 
607*b1cdbd2cSJim Jagielski             const SignatureInformation& rInfo = maCurrentSignatureInformations[n];
608*b1cdbd2cSJim Jagielski 			//First we try to get the certificate which is embedded in the XML Signature
609*b1cdbd2cSJim Jagielski             if (rInfo.ouX509Certificate.getLength())
610*b1cdbd2cSJim Jagielski 			    xCert = xSecEnv->createCertificateFromAscii(rInfo.ouX509Certificate);
611*b1cdbd2cSJim Jagielski             else {
612*b1cdbd2cSJim Jagielski                 //There must be an embedded certificate because we use it to get the
613*b1cdbd2cSJim Jagielski                 //issuer name. We cannot use /Signature/KeyInfo/X509Data/X509IssuerName
614*b1cdbd2cSJim Jagielski                 //because it could be modified by an attacker. The issuer is displayed
615*b1cdbd2cSJim Jagielski                 //in the digital signature dialog.
616*b1cdbd2cSJim Jagielski                 //Comparing the X509IssuerName with the one from the X509Certificate in order
617*b1cdbd2cSJim Jagielski                 //to find out if the X509IssuerName was modified does not work. See #i62684
618*b1cdbd2cSJim Jagielski                 DBG_ASSERT(sal_False, "Could not find embedded certificate!");
619*b1cdbd2cSJim Jagielski             }
620*b1cdbd2cSJim Jagielski 
621*b1cdbd2cSJim Jagielski 			//In case there is no embedded certificate we try to get it from a local store
622*b1cdbd2cSJim Jagielski             //Todo: This probably could be removed, see above.
623*b1cdbd2cSJim Jagielski 			if (!xCert.is())
624*b1cdbd2cSJim Jagielski 				xCert = xSecEnv->getCertificate( rInfo.ouX509IssuerName, xSerialNumberAdapter->toSequence( rInfo.ouX509SerialNumber ) );
625*b1cdbd2cSJim Jagielski 
626*b1cdbd2cSJim Jagielski 		    DBG_ASSERT( xCert.is(), "Certificate not found and can't be created!" );
627*b1cdbd2cSJim Jagielski 
628*b1cdbd2cSJim Jagielski 		    String	aSubject;
629*b1cdbd2cSJim Jagielski 		    String	aIssuer;
630*b1cdbd2cSJim Jagielski 		    String	aDateTimeStr;
631*b1cdbd2cSJim Jagielski 
632*b1cdbd2cSJim Jagielski             bool bSigValid = false;
633*b1cdbd2cSJim Jagielski             bool bCertValid = false;
634*b1cdbd2cSJim Jagielski             if( xCert.is() )
635*b1cdbd2cSJim Jagielski 		    {
636*b1cdbd2cSJim Jagielski                 //check the validity of the cert
637*b1cdbd2cSJim Jagielski                 try {
638*b1cdbd2cSJim Jagielski                     sal_Int32 certResult = xSecEnv->verifyCertificate(xCert,
639*b1cdbd2cSJim Jagielski                         Sequence<css::uno::Reference<css::security::XCertificate> >());
640*b1cdbd2cSJim Jagielski 
641*b1cdbd2cSJim Jagielski                     bCertValid = certResult == css::security::CertificateValidity::VALID ? true : false;
642*b1cdbd2cSJim Jagielski                     if ( bCertValid )
643*b1cdbd2cSJim Jagielski                         nValidCerts++;
644*b1cdbd2cSJim Jagielski 
645*b1cdbd2cSJim Jagielski                 } catch (css::uno::SecurityException& ) {
646*b1cdbd2cSJim Jagielski                     OSL_ENSURE(0, "Verification of certificate failed");
647*b1cdbd2cSJim Jagielski                     bCertValid = false;
648*b1cdbd2cSJim Jagielski                 }
649*b1cdbd2cSJim Jagielski 
650*b1cdbd2cSJim Jagielski                 aSubject = XmlSec::GetContentPart( xCert->getSubjectName() );
651*b1cdbd2cSJim Jagielski                 aIssuer = XmlSec::GetContentPart( xCert->getIssuerName() );
652*b1cdbd2cSJim Jagielski                 // --> PB 2004-10-12 #i20172# String with date and time information
653*b1cdbd2cSJim Jagielski                 aDateTimeStr = XmlSec::GetDateTimeString( rInfo.stDateTime );
654*b1cdbd2cSJim Jagielski             }
655*b1cdbd2cSJim Jagielski             bSigValid = ( rInfo.nStatus == ::com::sun::star::xml::crypto::SecurityOperationStatus_OPERATION_SUCCEEDED );
656*b1cdbd2cSJim Jagielski 
657*b1cdbd2cSJim Jagielski             if ( bSigValid )
658*b1cdbd2cSJim Jagielski             {
659*b1cdbd2cSJim Jagielski                  bSigValid = DocumentSignatureHelper::checkIfAllFilesAreSigned(
660*b1cdbd2cSJim Jagielski                       aElementsToBeVerified, rInfo, mode);
661*b1cdbd2cSJim Jagielski 
662*b1cdbd2cSJim Jagielski                 if( bSigValid )
663*b1cdbd2cSJim Jagielski 			        nValidSigs++;
664*b1cdbd2cSJim Jagielski             }
665*b1cdbd2cSJim Jagielski 
666*b1cdbd2cSJim Jagielski             Image aImage;
667*b1cdbd2cSJim Jagielski             if (!bSigValid)
668*b1cdbd2cSJim Jagielski             {
669*b1cdbd2cSJim Jagielski                 aImage = maSigsInvalidImg.GetImage();
670*b1cdbd2cSJim Jagielski             }
671*b1cdbd2cSJim Jagielski             else if (bSigValid && !bCertValid)
672*b1cdbd2cSJim Jagielski             {
673*b1cdbd2cSJim Jagielski                 aImage = maSigsNotvalidatedImg.GetImage();
674*b1cdbd2cSJim Jagielski             }
675*b1cdbd2cSJim Jagielski             //Check if the signature is a "old" document signature, that is, which was created
676*b1cdbd2cSJim Jagielski             //by an version of OOo previous to 3.2
677*b1cdbd2cSJim Jagielski             else if (meSignatureMode == SignatureModeDocumentContent
678*b1cdbd2cSJim Jagielski                 && bSigValid && bCertValid && !DocumentSignatureHelper::isOOo3_2_Signature(
679*b1cdbd2cSJim Jagielski                 maCurrentSignatureInformations[n]))
680*b1cdbd2cSJim Jagielski             {
681*b1cdbd2cSJim Jagielski                 aImage = maSigsNotvalidatedImg.GetImage();
682*b1cdbd2cSJim Jagielski                 bAllNewSignatures &= false;
683*b1cdbd2cSJim Jagielski             }
684*b1cdbd2cSJim Jagielski             else if (meSignatureMode == SignatureModeDocumentContent
685*b1cdbd2cSJim Jagielski                 && bSigValid && bCertValid && DocumentSignatureHelper::isOOo3_2_Signature(
686*b1cdbd2cSJim Jagielski                 maCurrentSignatureInformations[n]))
687*b1cdbd2cSJim Jagielski             {
688*b1cdbd2cSJim Jagielski                 aImage = maSigsValidImg.GetImage();
689*b1cdbd2cSJim Jagielski             }
690*b1cdbd2cSJim Jagielski             else if (meSignatureMode == SignatureModeMacros
691*b1cdbd2cSJim Jagielski                 && bSigValid && bCertValid)
692*b1cdbd2cSJim Jagielski             {
693*b1cdbd2cSJim Jagielski                 aImage = aImage = maSigsValidImg.GetImage();
694*b1cdbd2cSJim Jagielski             }
695*b1cdbd2cSJim Jagielski 
696*b1cdbd2cSJim Jagielski             SvLBoxEntry* pEntry = maSignaturesLB.InsertEntry( aNullStr, aImage, aImage );
697*b1cdbd2cSJim Jagielski 		    maSignaturesLB.SetEntryText( aSubject, pEntry, 1 );
698*b1cdbd2cSJim Jagielski 		    maSignaturesLB.SetEntryText( aIssuer, pEntry, 2 );
699*b1cdbd2cSJim Jagielski 		    maSignaturesLB.SetEntryText( aDateTimeStr, pEntry, 3 );
700*b1cdbd2cSJim Jagielski 		    pEntry->SetUserData( ( void* ) n );		// missuse user data as index
701*b1cdbd2cSJim Jagielski         }
702*b1cdbd2cSJim Jagielski     }
703*b1cdbd2cSJim Jagielski 
704*b1cdbd2cSJim Jagielski     bool bAllSigsValid = (nValidSigs == nInfos);
705*b1cdbd2cSJim Jagielski     bool bAllCertsValid = (nValidCerts == nInfos);
706*b1cdbd2cSJim Jagielski     bool bShowValidState = nInfos && (bAllSigsValid && bAllCertsValid && bAllNewSignatures);
707*b1cdbd2cSJim Jagielski 
708*b1cdbd2cSJim Jagielski     bool bShowNotValidatedState = nInfos && (bAllSigsValid && (!bAllCertsValid || !bAllNewSignatures));
709*b1cdbd2cSJim Jagielski     bool bShowInvalidState = nInfos && !bAllSigsValid;
710*b1cdbd2cSJim Jagielski 
711*b1cdbd2cSJim Jagielski 	maSigsValidImg.Show( bShowValidState);
712*b1cdbd2cSJim Jagielski 	maSigsValidFI.Show( bShowValidState );
713*b1cdbd2cSJim Jagielski 	maSigsInvalidImg.Show( bShowInvalidState );
714*b1cdbd2cSJim Jagielski 	maSigsInvalidFI.Show( bShowInvalidState );
715*b1cdbd2cSJim Jagielski 
716*b1cdbd2cSJim Jagielski     maSigsNotvalidatedImg.Show(bShowNotValidatedState);
717*b1cdbd2cSJim Jagielski     //bAllNewSignatures is always true if we are not in document mode
718*b1cdbd2cSJim Jagielski     maSigsNotvalidatedFI.Show(nInfos && bAllSigsValid && ! bAllCertsValid);
719*b1cdbd2cSJim Jagielski     maSigsOldSignatureFI.Show(nInfos && bAllSigsValid && bAllCertsValid && !bAllNewSignatures);
720*b1cdbd2cSJim Jagielski 
721*b1cdbd2cSJim Jagielski 	SignatureHighlightHdl( NULL );
722*b1cdbd2cSJim Jagielski }
723*b1cdbd2cSJim Jagielski 
724*b1cdbd2cSJim Jagielski 
725*b1cdbd2cSJim Jagielski //If bUseTempStream is true then the temporary signature stream is used.
726*b1cdbd2cSJim Jagielski //Otherwise the real signature stream is used.
ImplGetSignatureInformations(bool bUseTempStream)727*b1cdbd2cSJim Jagielski void DigitalSignaturesDialog::ImplGetSignatureInformations(bool bUseTempStream)
728*b1cdbd2cSJim Jagielski {
729*b1cdbd2cSJim Jagielski     maCurrentSignatureInformations.clear();
730*b1cdbd2cSJim Jagielski 
731*b1cdbd2cSJim Jagielski     maSignatureHelper.StartMission();
732*b1cdbd2cSJim Jagielski 
733*b1cdbd2cSJim Jagielski     SignatureStreamHelper aStreamHelper = ImplOpenSignatureStream(
734*b1cdbd2cSJim Jagielski         css::embed::ElementModes::READ, bUseTempStream);
735*b1cdbd2cSJim Jagielski     if ( aStreamHelper.xSignatureStream.is() )
736*b1cdbd2cSJim Jagielski     {
737*b1cdbd2cSJim Jagielski         uno::Reference< io::XInputStream > xInputStream( aStreamHelper.xSignatureStream, uno::UNO_QUERY );
738*b1cdbd2cSJim Jagielski 	    maSignatureHelper.ReadAndVerifySignature( xInputStream );
739*b1cdbd2cSJim Jagielski     }
740*b1cdbd2cSJim Jagielski     maSignatureHelper.EndMission();
741*b1cdbd2cSJim Jagielski 
742*b1cdbd2cSJim Jagielski     maCurrentSignatureInformations = maSignatureHelper.GetSignatureInformations();
743*b1cdbd2cSJim Jagielski 
744*b1cdbd2cSJim Jagielski     mbVerifySignatures = false;
745*b1cdbd2cSJim Jagielski }
746*b1cdbd2cSJim Jagielski 
ImplShowSignaturesDetails()747*b1cdbd2cSJim Jagielski void DigitalSignaturesDialog::ImplShowSignaturesDetails()
748*b1cdbd2cSJim Jagielski {
749*b1cdbd2cSJim Jagielski 	if( maSignaturesLB.FirstSelected() )
750*b1cdbd2cSJim Jagielski 	{
751*b1cdbd2cSJim Jagielski         sal_uInt16 nSelected = (sal_uInt16) (sal_uIntPtr) maSignaturesLB.FirstSelected()->GetUserData();
752*b1cdbd2cSJim Jagielski 		const SignatureInformation&	rInfo = maCurrentSignatureInformations[ nSelected ];
753*b1cdbd2cSJim Jagielski 		css::uno::Reference<css::xml::crypto::XSecurityEnvironment > xSecEnv =
754*b1cdbd2cSJim Jagielski 			maSignatureHelper.GetSecurityEnvironment();
755*b1cdbd2cSJim Jagielski         css::uno::Reference<com::sun::star::security::XSerialNumberAdapter> xSerialNumberAdapter =
756*b1cdbd2cSJim Jagielski             ::com::sun::star::security::SerialNumberAdapter::create(mxCtx);
757*b1cdbd2cSJim Jagielski 		// Use Certificate from doc, not from key store
758*b1cdbd2cSJim Jagielski 		uno::Reference< dcss::security::XCertificate > xCert;
759*b1cdbd2cSJim Jagielski 		if (rInfo.ouX509Certificate.getLength())
760*b1cdbd2cSJim Jagielski 			xCert = xSecEnv->createCertificateFromAscii(rInfo.ouX509Certificate);
761*b1cdbd2cSJim Jagielski 		//fallback if no certificate is embedded, get if from store
762*b1cdbd2cSJim Jagielski 		if (!xCert.is())
763*b1cdbd2cSJim Jagielski 			xCert = xSecEnv->getCertificate( rInfo.ouX509IssuerName, xSerialNumberAdapter->toSequence( rInfo.ouX509SerialNumber ) );
764*b1cdbd2cSJim Jagielski 
765*b1cdbd2cSJim Jagielski 		DBG_ASSERT( xCert.is(), "Error getting cCertificate!" );
766*b1cdbd2cSJim Jagielski 		if ( xCert.is() )
767*b1cdbd2cSJim Jagielski 		{
768*b1cdbd2cSJim Jagielski 			CertificateViewer aViewer( this, maSignatureHelper.GetSecurityEnvironment(), xCert, sal_False );
769*b1cdbd2cSJim Jagielski 			aViewer.Execute();
770*b1cdbd2cSJim Jagielski 		}
771*b1cdbd2cSJim Jagielski 	}
772*b1cdbd2cSJim Jagielski }
773*b1cdbd2cSJim Jagielski 
774*b1cdbd2cSJim Jagielski //If bTempStream is true, then a temporary stream is return. If it is false then, the actual
775*b1cdbd2cSJim Jagielski //signature stream is used.
776*b1cdbd2cSJim Jagielski //Everytime the user presses Add a new temporary stream is created.
777*b1cdbd2cSJim Jagielski //We keep the temporary stream as member because ImplGetSignatureInformations
778*b1cdbd2cSJim Jagielski //will later access the stream to create DocumentSignatureInformation objects
779*b1cdbd2cSJim Jagielski //which are stored in maCurrentSignatureInformations.
ImplOpenSignatureStream(sal_Int32 nStreamOpenMode,bool bTempStream)780*b1cdbd2cSJim Jagielski SignatureStreamHelper DigitalSignaturesDialog::ImplOpenSignatureStream(
781*b1cdbd2cSJim Jagielski     sal_Int32 nStreamOpenMode, bool bTempStream)
782*b1cdbd2cSJim Jagielski {
783*b1cdbd2cSJim Jagielski 	SignatureStreamHelper aHelper;
784*b1cdbd2cSJim Jagielski     if (bTempStream)
785*b1cdbd2cSJim Jagielski     {
786*b1cdbd2cSJim Jagielski         if (nStreamOpenMode & css::embed::ElementModes::TRUNCATE)
787*b1cdbd2cSJim Jagielski         {
788*b1cdbd2cSJim Jagielski             //We write always into a new temporary stream.
789*b1cdbd2cSJim Jagielski             mxTempSignatureStream = Reference < css::io::XStream >(
790*b1cdbd2cSJim Jagielski                 mxCtx->getServiceManager()->createInstanceWithContext(
791*b1cdbd2cSJim Jagielski                 OUSTR( "com.sun.star.io.TempFile" ), mxCtx) ,
792*b1cdbd2cSJim Jagielski                 UNO_QUERY_THROW);
793*b1cdbd2cSJim Jagielski             aHelper.xSignatureStream = mxTempSignatureStream;
794*b1cdbd2cSJim Jagielski         }
795*b1cdbd2cSJim Jagielski         else
796*b1cdbd2cSJim Jagielski         {
797*b1cdbd2cSJim Jagielski             //When we read from the temp stream, then we must have previously
798*b1cdbd2cSJim Jagielski             //created one.
799*b1cdbd2cSJim Jagielski             OSL_ASSERT(mxTempSignatureStream.is());
800*b1cdbd2cSJim Jagielski         }
801*b1cdbd2cSJim Jagielski         aHelper.xSignatureStream = mxTempSignatureStream;
802*b1cdbd2cSJim Jagielski     }
803*b1cdbd2cSJim Jagielski     else
804*b1cdbd2cSJim Jagielski     {
805*b1cdbd2cSJim Jagielski         //No temporary stream
806*b1cdbd2cSJim Jagielski         if (!mxSignatureStream.is())
807*b1cdbd2cSJim Jagielski         {
808*b1cdbd2cSJim Jagielski             //We may not have a dedicated stream for writing the signature
809*b1cdbd2cSJim Jagielski             //So we take one directly from the storage
810*b1cdbd2cSJim Jagielski             //Or DocumentDigitalSignatures::showDocumentContentSignatures was called,
811*b1cdbd2cSJim Jagielski             //in which case Add/Remove is not allowed. This is done, for example, if the
812*b1cdbd2cSJim Jagielski             //document is readonly
813*b1cdbd2cSJim Jagielski             aHelper = DocumentSignatureHelper::OpenSignatureStream(
814*b1cdbd2cSJim Jagielski                 mxStore, nStreamOpenMode, meSignatureMode );
815*b1cdbd2cSJim Jagielski         }
816*b1cdbd2cSJim Jagielski         else
817*b1cdbd2cSJim Jagielski         {
818*b1cdbd2cSJim Jagielski             aHelper.xSignatureStream = mxSignatureStream;
819*b1cdbd2cSJim Jagielski         }
820*b1cdbd2cSJim Jagielski     }
821*b1cdbd2cSJim Jagielski 
822*b1cdbd2cSJim Jagielski     if (nStreamOpenMode & css::embed::ElementModes::TRUNCATE)
823*b1cdbd2cSJim Jagielski     {
824*b1cdbd2cSJim Jagielski         css::uno::Reference < css::io::XTruncate > xTruncate(
825*b1cdbd2cSJim Jagielski             aHelper.xSignatureStream, UNO_QUERY_THROW);
826*b1cdbd2cSJim Jagielski         DBG_ASSERT( xTruncate.is(), "ImplOpenSignatureStream - Stream does not support xTruncate!" );
827*b1cdbd2cSJim Jagielski         xTruncate->truncate();
828*b1cdbd2cSJim Jagielski     }
829*b1cdbd2cSJim Jagielski     else if ( bTempStream || mxSignatureStream.is())
830*b1cdbd2cSJim Jagielski     {
831*b1cdbd2cSJim Jagielski         //In case we read the signature stream from the storage directly,
832*b1cdbd2cSJim Jagielski         //which is the case when DocumentDigitalSignatures::showDocumentContentSignatures
833*b1cdbd2cSJim Jagielski         //then XSeakable is not supported
834*b1cdbd2cSJim Jagielski         css::uno::Reference < css::io::XSeekable > xSeek(
835*b1cdbd2cSJim Jagielski             aHelper.xSignatureStream, UNO_QUERY_THROW);
836*b1cdbd2cSJim Jagielski         DBG_ASSERT( xSeek.is(), "ImplOpenSignatureStream - Stream does not support xSeekable!" );
837*b1cdbd2cSJim Jagielski         xSeek->seek( 0 );
838*b1cdbd2cSJim Jagielski     }
839*b1cdbd2cSJim Jagielski 
840*b1cdbd2cSJim Jagielski 	return aHelper;
841*b1cdbd2cSJim Jagielski }
842*b1cdbd2cSJim Jagielski 
843