blob: ae3ec562ec0c5a030fad726df3795db4b1ccdab8 [file] [log] [blame]
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