| Attribute VB_Name = "CommonPreparation" | |
| '************************************************************************* | |
| ' | |
| ' Licensed to the Apache Software Foundation (ASF) under one | |
| ' or more contributor license agreements. See the NOTICE file | |
| ' distributed with this work for additional information | |
| ' regarding copyright ownership. The ASF licenses this file | |
| ' to you under the Apache License, Version 2.0 (the | |
| ' "License"); you may not use this file except in compliance | |
| ' with the License. You may obtain a copy of the License at | |
| ' | |
| ' http://www.apache.org/licenses/LICENSE-2.0 | |
| ' | |
| ' Unless required by applicable law or agreed to in writing, | |
| ' software distributed under the License is distributed on an | |
| ' "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
| ' KIND, either express or implied. See the License for the | |
| ' specific language governing permissions and limitations | |
| ' under the License. | |
| ' | |
| '************************************************************************* | |
| Option Explicit | |
| Private Declare Function CryptAcquireContext Lib "advapi32.dll" _ | |
| Alias "CryptAcquireContextA" (ByRef phProv As Long, _ | |
| ByVal pszContainer As String, ByVal pszProvider As String, _ | |
| ByVal dwProvType As Long, ByVal dwFlags As Long) As Long | |
| Private Declare Function CryptReleaseContext Lib "advapi32.dll" ( _ | |
| ByVal hProv As Long, ByVal dwFlags As Long) As Long | |
| Private Declare Function CryptCreateHash Lib "advapi32.dll" ( _ | |
| ByVal hProv As Long, ByVal Algid As Long, ByVal hKey As Long, _ | |
| ByVal dwFlags As Long, ByRef phHash As Long) As Long | |
| Private Declare Function CryptDestroyHash Lib "advapi32.dll" (ByVal hHash As Long) As Long | |
| Private Declare Function CryptHashData Lib "advapi32.dll" (ByVal hHash As Long, _ | |
| pbData As Any, ByVal dwDataLen As Long, ByVal dwFlags As Long) As Long | |
| Private Declare Function CryptGetHashParam Lib "advapi32.dll" ( _ | |
| ByVal hHash As Long, ByVal dwParam As Long, pbData As Any, _ | |
| pdwDataLen As Long, ByVal dwFlags As Long) As Long | |
| Private Const ALG_CLASS_ANY As Long = 0 | |
| Private Const ALG_TYPE_ANY As Long = 0 | |
| Private Const ALG_CLASS_HASH As Long = 32768 | |
| Private Const ALG_SID_MD5 As Long = 3 | |
| ' Hash algorithms | |
| Private Const MD5_ALGORITHM As Long = ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_MD5 | |
| ' CryptSetProvParam | |
| Private Const PROV_RSA_FULL As Long = 1 | |
| ' used when acquiring the provider | |
| Private Const CRYPT_VERIFYCONTEXT As Long = &HF0000000 | |
| ' Microsoft provider data | |
| Private Const MS_DEFAULT_PROVIDER As String = _ | |
| "Microsoft Base Cryptographic Provider v1.0" | |
| Function DoPreparation(docAnalysis As DocumentAnalysis, myIssue As IssueInfo, preparationNote As String, _ | |
| var As Variant, currDoc As Object) As Boolean | |
| On Error GoTo HandleErrors | |
| Dim currentFunctionName As String | |
| currentFunctionName = "DoPreparation" | |
| DoPreparation = False | |
| 'Log as Preparable | |
| AddIssueDetailsNote myIssue, 0, preparationNote, RID_STR_COMMON_PREPARATION_NOTE | |
| myIssue.Preparable = True | |
| docAnalysis.PreparableIssuesCount = docAnalysis.PreparableIssuesCount + 1 | |
| If Not CheckDoPrepare Then Exit Function | |
| 'Do Prepare | |
| If myIssue.IssueTypeXML = CSTR_ISSUE_OBJECTS_GRAPHICS_AND_FRAMES And _ | |
| myIssue.SubTypeXML = CSTR_SUBISSUE_OBJECT_IN_HEADER_FOOTER Then | |
| DoPreparation = Prepare_HeaderFooter_GraphicFrames(docAnalysis, myIssue, var, currDoc) | |
| ElseIf myIssue.IssueTypeXML = CSTR_ISSUE_CONTENT_DOCUMENT_PROPERTIES And _ | |
| myIssue.SubTypeXML = CSTR_SUBISSUE_OLD_WORKBOOK_VERSION Then | |
| DoPreparation = Prepare_WorkbookVersion() | |
| End If | |
| FinalExit: | |
| Exit Function | |
| HandleErrors: | |
| WriteDebug currentFunctionName & _ | |
| " : path " & docAnalysis.name & ": " & _ | |
| " : myIssue " & myIssue.IssueTypeXML & "_" & myIssue.SubTypeXML & ": " & _ | |
| Err.Number & " " & Err.Description & " " & Err.Source | |
| Resume FinalExit | |
| End Function | |
| Function InDocPreparation() As Boolean | |
| InDocPreparation = True | |
| End Function | |
| Function Prepare_DocumentCustomProperties(docAnalysis As DocumentAnalysis, myIssue As IssueInfo, _ | |
| var As Variant, currDoc As Object) As Boolean | |
| On Error GoTo HandleErrors | |
| Dim currentFunctionName As String | |
| currentFunctionName = "Prepare_DocumentCustomProperties" | |
| Dim aProp As DocumentProperty | |
| Dim myCustomDocumentProperties As DocumentProperties | |
| Dim commentProp As DocumentProperty | |
| Prepare_DocumentCustomProperties = False | |
| Set myCustomDocumentProperties = getAppSpecificCustomDocProperties(currDoc) | |
| Set commentProp = getAppSpecificCommentBuiltInDocProperty(currDoc) | |
| Set aProp = var 'Safe as we know that a DocumentProperty is being passed in | |
| If commentProp.value <> "" Then commentProp.value = commentProp.value & vbLf | |
| commentProp.value = commentProp.value & _ | |
| RID_STR_COMMON_SUBISSUE_DOCUMENT_CUSTOM_PROPERTY & ": " & vbLf | |
| commentProp.value = commentProp.value & _ | |
| RID_STR_COMMON_ATTRIBUTE_NAME & " - " & aProp.name & ", " & _ | |
| RID_STR_COMMON_ATTRIBUTE_TYPE & " - " & getCustomDocPropTypeAsString(aProp.Type) & ", " & _ | |
| RID_STR_COMMON_ATTRIBUTE_VALUE & " - " & aProp.value | |
| myCustomDocumentProperties.item(aProp.name).Delete | |
| Prepare_DocumentCustomProperties = True | |
| FinalExit: | |
| Exit Function | |
| HandleErrors: | |
| WriteDebug currentFunctionName & " : " & docAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source | |
| Resume FinalExit | |
| End Function | |
| Private Function GetProvider(hCtx As Long) As Boolean | |
| Const NTE_BAD_KEYSET = &H80090016 | |
| Const NTE_EXISTS = &H8009000F | |
| Const NTE_KEYSET_NOT_DEF = &H80090019 | |
| Dim currentFunctionName As String | |
| currentFunctionName = "GetProvider" | |
| Dim strTemp As String | |
| Dim strProvider As String | |
| Dim strErrorMsg As String | |
| Dim errStr As String | |
| GetProvider = False | |
| On Error Resume Next | |
| strTemp = vbNullChar | |
| strProvider = MS_DEFAULT_PROVIDER & vbNullChar | |
| If CBool(CryptAcquireContext(hCtx, ByVal strTemp, _ | |
| ByVal strProvider, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) Then | |
| GetProvider = True | |
| Exit Function | |
| End If | |
| Select Case Err.LastDllError | |
| Case NTE_BAD_KEYSET | |
| errStr = "Key container does not exist or You do not have access to the key container." | |
| Case NTE_EXISTS | |
| errStr = "The key container already exists, but you are attempting to create it" | |
| Case NTE_KEYSET_NOT_DEF | |
| errStr = "The Crypto Service Provider (CSP) may not be set up correctly" | |
| End Select | |
| WriteDebug currentFunctionName & "Problems acquiring Crypto Provider: " & MS_DEFAULT_PROVIDER & ": " & errStr | |
| End Function | |
| Function MD5HashString(ByVal Str As String) As String | |
| Const HP_HASHVAL = 2 | |
| Const HP_HASHSIZE = 4 | |
| On Error GoTo HandleErrors | |
| Dim currentFunctionName As String | |
| currentFunctionName = "MD5HashString" | |
| Dim hCtx As Long | |
| Dim hHash As Long | |
| Dim ret As Long | |
| Dim lLen As Long | |
| Dim lIdx As Long | |
| Dim abData() As Byte | |
| If Not GetProvider(hCtx) Then Err.Raise Err.LastDllError | |
| ret = CryptCreateHash(hCtx, MD5_ALGORITHM, 0, 0, hHash) | |
| If ret = 0 Then Err.Raise Err.LastDllError | |
| ret = CryptHashData(hHash, ByVal Str, Len(Str), 0) | |
| If ret = 0 Then Err.Raise Err.LastDllError | |
| ret = CryptGetHashParam(hHash, HP_HASHSIZE, lLen, 4, 0) | |
| If ret = 0 Then Err.Raise Err.LastDllError | |
| ReDim abData(0 To lLen - 1) | |
| ret = CryptGetHashParam(hHash, HP_HASHVAL, abData(0), lLen, 0) | |
| If ret = 0 Then Err.Raise Err.LastDllError | |
| For lIdx = 0 To UBound(abData) | |
| MD5HashString = MD5HashString & Right$("0" & Hex$(abData(lIdx)), 2) | |
| Next | |
| CryptDestroyHash hHash | |
| CryptReleaseContext hCtx, 0 | |
| FinalExit: | |
| Exit Function | |
| HandleErrors: | |
| MD5HashString = "" | |
| WriteDebug currentFunctionName & _ | |
| Err.Number & " " & Err.Description & " " & Err.Source | |
| Resume FinalExit | |
| End Function | |