| 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 |