Skip to content

Commit

Permalink
Refactor PDF formats
Browse files Browse the repository at this point in the history
  • Loading branch information
neilharvey committed Nov 19, 2024
1 parent bee2cef commit fc30460
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 59 deletions.
4 changes: 2 additions & 2 deletions src/FileSignatures/FileFormatInspector.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,12 +57,12 @@ public FileFormatInspector(IEnumerable<FileFormat> formats)
RemoveBaseFormats(matches);
}

if (matches.Count > 0)
if (matches.Count > 1)
{
return matches.OrderByDescending(m => m.HeaderLength).First();
}

return null;
return matches.Count == 1 ? matches[0] : null;
}

private List<FileFormat> FindMatchingFormats(Stream stream)
Expand Down
6 changes: 3 additions & 3 deletions src/FileSignatures/FileSignatures.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,13 @@
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<Version>5.0.2</Version>
<Version>5.0.3-rc1</Version>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<AssemblyVersion>5.0.2</AssemblyVersion>
<AssemblyVersion>5.0.3</AssemblyVersion>
<LangVersion>Latest</LangVersion>
<Nullable>enable</Nullable>
<FileVersion>5.0.2</FileVersion>
<FileVersion>5.0.3</FileVersion>
<SignAssembly>True</SignAssembly>
<AssemblyOriginatorKeyFile>..\..\FileSignatures.snk</AssemblyOriginatorKeyFile>
</PropertyGroup>
Expand Down
17 changes: 7 additions & 10 deletions src/FileSignatures/Formats/AdobePdf.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,16 @@ public AdobePdf() : base([
])
{
}

protected override bool CompareFileByteToSignatureAt(byte fileByte, int signatureIndex)
{
return base.CompareFileByteToSignatureAt(fileByte, signatureIndex) || IsVersionNumber(fileByte, Signature[signatureIndex]);
}

private static bool IsVersionNumber(byte fileByte, byte signatureByte)

protected override bool IsSignatureByte(byte value, int signatureIndex)
{
return signatureByte == VersionNumberPlaceholder && IsNumber(fileByte);
return IsVersionNumber(value, Signature[signatureIndex])
|| base.IsSignatureByte(value, signatureIndex);
}

private static bool IsNumber(byte @byte)
private static bool IsVersionNumber(byte value, byte signatureByte)
{
return @byte is >= 0x30 and <= 0x39;
var isNumber = value is >= 0x30 and <= 0x39;
return signatureByte == VersionNumberPlaceholder && isNumber;
}
}
58 changes: 14 additions & 44 deletions src/FileSignatures/Formats/Pdf.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,64 +19,34 @@ protected Pdf(byte[] signature) : base(signature, "application/pdf", "pdf", 0)

public override bool IsMatch(Stream stream)
{
if (stream == null || stream.Length < HeaderLength)
if (stream == null || (stream.Length < HeaderLength && HeaderLength < int.MaxValue) || Offset > stream.Length)
{
return false;
}

stream.Position = 0;
var signatureValidationIndex = 0;
int fileByte;
stream.Position = Offset;

while (stream.Position < MaxFileHeaderSize && (fileByte = stream.ReadByte()) != -1)
var signatureIndex = 0;
while (stream.Position < MaxFileHeaderSize && stream.Position < stream.Length)
{
if (CompareFileByteToSignatureAt((byte)fileByte, signatureValidationIndex))
var b = (byte)stream.ReadByte();
if (IsSignatureByte(b, signatureIndex))
{
signatureValidationIndex++;
signatureIndex++;
}
else
{
signatureValidationIndex = 0;
signatureIndex = 0;
}

if (signatureValidationIndex == Signature.Count)
return true;
if (signatureIndex == Signature.Count)
return true;
}

return false;
}

protected virtual bool CompareFileByteToSignatureAt(byte fileByte, int signatureIndex)
{
return fileByte == Signature[signatureIndex];
}
}

public class AdobePdf : Pdf
{
private const byte VersionNumberPlaceholder = 0x00;

public AdobePdf() : base([
0x25, 0x21, 0x50, 0x53, 0x2D, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x2D, VersionNumberPlaceholder, 0x2E,
VersionNumberPlaceholder, 0x20, 0x50, 0x44,
0x46, 0x2D, VersionNumberPlaceholder, 0x2E, VersionNumberPlaceholder
])
{
}

protected override bool CompareFileByteToSignatureAt(byte fileByte, int signatureIndex)
{
return base.CompareFileByteToSignatureAt(fileByte, signatureIndex) || IsVersionNumber(fileByte, Signature[signatureIndex]);
}

private static bool IsVersionNumber(byte fileByte, byte signatureByte)
{
return signatureByte == VersionNumberPlaceholder && IsNumber(fileByte);
}

private static bool IsNumber(byte @byte)
{
return @byte is >= 0x30 and <= 0x39;
}
protected virtual bool IsSignatureByte(byte value, int signatureIndex)
=> value == Signature[signatureIndex];
}
}

0 comments on commit fc30460

Please sign in to comment.