Files
2026-06-04 11:42:34 +02:00

878 lines
21 KiB
C#

using System;
using System.IO;
namespace ICSharpCode.SharpZipLib.Zip
{
// Token: 0x02000056 RID: 86
public class ZipEntry : ICloneable
{
// Token: 0x0600032E RID: 814 RVA: 0x000115C0 File Offset: 0x000105C0
public ZipEntry(string name)
: this(name, 0, 51, CompressionMethod.Deflated)
{
}
// Token: 0x0600032F RID: 815 RVA: 0x000115CD File Offset: 0x000105CD
internal ZipEntry(string name, int versionRequiredToExtract)
: this(name, versionRequiredToExtract, 51, CompressionMethod.Deflated)
{
}
// Token: 0x06000330 RID: 816 RVA: 0x000115DC File Offset: 0x000105DC
internal ZipEntry(string name, int versionRequiredToExtract, int madeByInfo, CompressionMethod method)
{
this.externalFileAttributes = -1;
this.method = CompressionMethod.Deflated;
this.zipFileIndex = -1L;
base..ctor();
if (name == null)
{
throw new ArgumentNullException("name");
}
if (name.Length > 65535)
{
throw new ArgumentException("Name is too long", "name");
}
if (versionRequiredToExtract != 0 && versionRequiredToExtract < 10)
{
throw new ArgumentOutOfRangeException("versionRequiredToExtract");
}
this.DateTime = DateTime.Now;
this.name = name;
this.versionMadeBy = (ushort)madeByInfo;
this.versionToExtract = (ushort)versionRequiredToExtract;
this.method = method;
}
// Token: 0x06000331 RID: 817 RVA: 0x00011670 File Offset: 0x00010670
[Obsolete("Use Clone instead")]
public ZipEntry(ZipEntry entry)
{
this.externalFileAttributes = -1;
this.method = CompressionMethod.Deflated;
this.zipFileIndex = -1L;
base..ctor();
if (entry == null)
{
throw new ArgumentNullException("entry");
}
this.known = entry.known;
this.name = entry.name;
this.size = entry.size;
this.compressedSize = entry.compressedSize;
this.crc = entry.crc;
this.dosTime = entry.dosTime;
this.method = entry.method;
this.comment = entry.comment;
this.versionToExtract = entry.versionToExtract;
this.versionMadeBy = entry.versionMadeBy;
this.externalFileAttributes = entry.externalFileAttributes;
this.flags = entry.flags;
this.zipFileIndex = entry.zipFileIndex;
this.offset = entry.offset;
this.forceZip64_ = entry.forceZip64_;
if (entry.extra != null)
{
this.extra = new byte[entry.extra.Length];
Array.Copy(entry.extra, 0, this.extra, 0, entry.extra.Length);
}
}
// Token: 0x170000AA RID: 170
// (get) Token: 0x06000332 RID: 818 RVA: 0x00011791 File Offset: 0x00010791
public bool HasCrc
{
get
{
return (byte)(this.known & ZipEntry.Known.Crc) != 0;
}
}
// Token: 0x170000AB RID: 171
// (get) Token: 0x06000333 RID: 819 RVA: 0x000117A2 File Offset: 0x000107A2
// (set) Token: 0x06000334 RID: 820 RVA: 0x000117B2 File Offset: 0x000107B2
public bool IsCrypted
{
get
{
return (this.flags & 1) != 0;
}
set
{
if (value)
{
this.flags |= 1;
return;
}
this.flags &= -2;
}
}
// Token: 0x170000AC RID: 172
// (get) Token: 0x06000335 RID: 821 RVA: 0x000117D5 File Offset: 0x000107D5
// (set) Token: 0x06000336 RID: 822 RVA: 0x000117E9 File Offset: 0x000107E9
public bool IsUnicodeText
{
get
{
return (this.flags & 2048) != 0;
}
set
{
if (value)
{
this.flags |= 2048;
return;
}
this.flags &= -2049;
}
}
// Token: 0x170000AD RID: 173
// (get) Token: 0x06000337 RID: 823 RVA: 0x00011813 File Offset: 0x00010813
// (set) Token: 0x06000338 RID: 824 RVA: 0x0001181B File Offset: 0x0001081B
internal byte CryptoCheckValue
{
get
{
return this.cryptoCheckValue_;
}
set
{
this.cryptoCheckValue_ = value;
}
}
// Token: 0x170000AE RID: 174
// (get) Token: 0x06000339 RID: 825 RVA: 0x00011824 File Offset: 0x00010824
// (set) Token: 0x0600033A RID: 826 RVA: 0x0001182C File Offset: 0x0001082C
public int Flags
{
get
{
return this.flags;
}
set
{
this.flags = value;
}
}
// Token: 0x170000AF RID: 175
// (get) Token: 0x0600033B RID: 827 RVA: 0x00011835 File Offset: 0x00010835
// (set) Token: 0x0600033C RID: 828 RVA: 0x0001183D File Offset: 0x0001083D
public long ZipFileIndex
{
get
{
return this.zipFileIndex;
}
set
{
this.zipFileIndex = value;
}
}
// Token: 0x170000B0 RID: 176
// (get) Token: 0x0600033D RID: 829 RVA: 0x00011846 File Offset: 0x00010846
// (set) Token: 0x0600033E RID: 830 RVA: 0x0001184E File Offset: 0x0001084E
public long Offset
{
get
{
return this.offset;
}
set
{
this.offset = value;
}
}
// Token: 0x170000B1 RID: 177
// (get) Token: 0x0600033F RID: 831 RVA: 0x00011857 File Offset: 0x00010857
// (set) Token: 0x06000340 RID: 832 RVA: 0x0001186D File Offset: 0x0001086D
public int ExternalFileAttributes
{
get
{
if ((byte)(this.known & ZipEntry.Known.ExternalAttributes) == 0)
{
return -1;
}
return this.externalFileAttributes;
}
set
{
this.externalFileAttributes = value;
this.known |= ZipEntry.Known.ExternalAttributes;
}
}
// Token: 0x170000B2 RID: 178
// (get) Token: 0x06000341 RID: 833 RVA: 0x00011886 File Offset: 0x00010886
public int VersionMadeBy
{
get
{
return (int)(this.versionMadeBy & 255);
}
}
// Token: 0x170000B3 RID: 179
// (get) Token: 0x06000342 RID: 834 RVA: 0x00011894 File Offset: 0x00010894
public bool IsDOSEntry
{
get
{
return this.HostSystem == 0 || this.HostSystem == 10;
}
}
// Token: 0x06000343 RID: 835 RVA: 0x000118AC File Offset: 0x000108AC
private bool HasDosAttributes(int attributes)
{
bool flag = false;
if ((byte)(this.known & ZipEntry.Known.ExternalAttributes) != 0 && (this.HostSystem == 0 || this.HostSystem == 10) && (this.ExternalFileAttributes & attributes) == attributes)
{
flag = true;
}
return flag;
}
// Token: 0x170000B4 RID: 180
// (get) Token: 0x06000344 RID: 836 RVA: 0x000118E7 File Offset: 0x000108E7
// (set) Token: 0x06000345 RID: 837 RVA: 0x000118F7 File Offset: 0x000108F7
public int HostSystem
{
get
{
return (this.versionMadeBy >> 8) & 255;
}
set
{
this.versionMadeBy &= 255;
this.versionMadeBy |= (ushort)((value & 255) << 8);
}
}
// Token: 0x170000B5 RID: 181
// (get) Token: 0x06000346 RID: 838 RVA: 0x00011924 File Offset: 0x00010924
public int Version
{
get
{
if (this.versionToExtract != 0)
{
return (int)this.versionToExtract;
}
int num = 10;
if (this.AESKeySize > 0)
{
num = 51;
}
else if (this.CentralHeaderRequiresZip64)
{
num = 45;
}
else if (CompressionMethod.Deflated == this.method)
{
num = 20;
}
else if (this.IsDirectory)
{
num = 20;
}
else if (this.IsCrypted)
{
num = 20;
}
else if (this.HasDosAttributes(8))
{
num = 11;
}
return num;
}
}
// Token: 0x170000B6 RID: 182
// (get) Token: 0x06000347 RID: 839 RVA: 0x00011994 File Offset: 0x00010994
public bool CanDecompress
{
get
{
return this.Version <= 51 && (this.Version == 10 || this.Version == 11 || this.Version == 20 || this.Version == 45 || this.Version == 51) && this.IsCompressionMethodSupported();
}
}
// Token: 0x06000348 RID: 840 RVA: 0x000119E5 File Offset: 0x000109E5
public void ForceZip64()
{
this.forceZip64_ = true;
}
// Token: 0x06000349 RID: 841 RVA: 0x000119EE File Offset: 0x000109EE
public bool IsZip64Forced()
{
return this.forceZip64_;
}
// Token: 0x170000B7 RID: 183
// (get) Token: 0x0600034A RID: 842 RVA: 0x000119F8 File Offset: 0x000109F8
public bool LocalHeaderRequiresZip64
{
get
{
bool flag = this.forceZip64_;
if (!flag)
{
ulong num = this.compressedSize;
if (this.versionToExtract == 0 && this.IsCrypted)
{
num += 12UL;
}
flag = (this.size >= (ulong)(-1) || num >= (ulong)(-1)) && (this.versionToExtract == 0 || this.versionToExtract >= 45);
}
return flag;
}
}
// Token: 0x170000B8 RID: 184
// (get) Token: 0x0600034B RID: 843 RVA: 0x00011A58 File Offset: 0x00010A58
public bool CentralHeaderRequiresZip64
{
get
{
return this.LocalHeaderRequiresZip64 || this.offset >= (long)((ulong)(-1));
}
}
// Token: 0x170000B9 RID: 185
// (get) Token: 0x0600034C RID: 844 RVA: 0x00011A71 File Offset: 0x00010A71
// (set) Token: 0x0600034D RID: 845 RVA: 0x00011A88 File Offset: 0x00010A88
public long DosTime
{
get
{
if ((byte)(this.known & ZipEntry.Known.Time) == 0)
{
return 0L;
}
return (long)((ulong)this.dosTime);
}
set
{
this.dosTime = (uint)value;
this.known |= ZipEntry.Known.Time;
}
}
// Token: 0x170000BA RID: 186
// (get) Token: 0x0600034E RID: 846 RVA: 0x00011AA4 File Offset: 0x00010AA4
// (set) Token: 0x0600034F RID: 847 RVA: 0x00011B48 File Offset: 0x00010B48
public DateTime DateTime
{
get
{
uint num = Math.Min(59U, 2U * (this.dosTime & 31U));
uint num2 = Math.Min(59U, (this.dosTime >> 5) & 63U);
uint num3 = Math.Min(23U, (this.dosTime >> 11) & 31U);
uint num4 = Math.Max(1U, Math.Min(12U, (this.dosTime >> 21) & 15U));
uint num5 = ((this.dosTime >> 25) & 127U) + 1980U;
int num6 = Math.Max(1, Math.Min(DateTime.DaysInMonth((int)num5, (int)num4), (int)((this.dosTime >> 16) & 31U)));
return new DateTime((int)num5, (int)num4, num6, (int)num3, (int)num2, (int)num);
}
set
{
uint num = (uint)value.Year;
uint num2 = (uint)value.Month;
uint num3 = (uint)value.Day;
uint num4 = (uint)value.Hour;
uint num5 = (uint)value.Minute;
uint num6 = (uint)value.Second;
if (num < 1980U)
{
num = 1980U;
num2 = 1U;
num3 = 1U;
num4 = 0U;
num5 = 0U;
num6 = 0U;
}
else if (num > 2107U)
{
num = 2107U;
num2 = 12U;
num3 = 31U;
num4 = 23U;
num5 = 59U;
num6 = 59U;
}
this.DosTime = (long)((ulong)((((num - 1980U) & 127U) << 25) | (num2 << 21) | (num3 << 16) | (num4 << 11) | (num5 << 5) | (num6 >> 1)));
}
}
// Token: 0x170000BB RID: 187
// (get) Token: 0x06000350 RID: 848 RVA: 0x00011BEF File Offset: 0x00010BEF
public string Name
{
get
{
return this.name;
}
}
// Token: 0x170000BC RID: 188
// (get) Token: 0x06000351 RID: 849 RVA: 0x00011BF7 File Offset: 0x00010BF7
// (set) Token: 0x06000352 RID: 850 RVA: 0x00011C0D File Offset: 0x00010C0D
public long Size
{
get
{
if ((byte)(this.known & ZipEntry.Known.Size) == 0)
{
return -1L;
}
return (long)this.size;
}
set
{
this.size = (ulong)value;
this.known |= ZipEntry.Known.Size;
}
}
// Token: 0x170000BD RID: 189
// (get) Token: 0x06000353 RID: 851 RVA: 0x00011C25 File Offset: 0x00010C25
// (set) Token: 0x06000354 RID: 852 RVA: 0x00011C3B File Offset: 0x00010C3B
public long CompressedSize
{
get
{
if ((byte)(this.known & ZipEntry.Known.CompressedSize) == 0)
{
return -1L;
}
return (long)this.compressedSize;
}
set
{
this.compressedSize = (ulong)value;
this.known |= ZipEntry.Known.CompressedSize;
}
}
// Token: 0x170000BE RID: 190
// (get) Token: 0x06000355 RID: 853 RVA: 0x00011C53 File Offset: 0x00010C53
// (set) Token: 0x06000356 RID: 854 RVA: 0x00011C6D File Offset: 0x00010C6D
public long Crc
{
get
{
if ((byte)(this.known & ZipEntry.Known.Crc) == 0)
{
return -1L;
}
return (long)((ulong)this.crc & (ulong)(-1));
}
set
{
if (((ulong)this.crc & 18446744069414584320UL) != 0UL)
{
throw new ArgumentOutOfRangeException("value");
}
this.crc = (uint)value;
this.known |= ZipEntry.Known.Crc;
}
}
// Token: 0x170000BF RID: 191
// (get) Token: 0x06000357 RID: 855 RVA: 0x00011CA6 File Offset: 0x00010CA6
// (set) Token: 0x06000358 RID: 856 RVA: 0x00011CAE File Offset: 0x00010CAE
public CompressionMethod CompressionMethod
{
get
{
return this.method;
}
set
{
if (!ZipEntry.IsCompressionMethodSupported(value))
{
throw new NotSupportedException("Compression method not supported");
}
this.method = value;
}
}
// Token: 0x170000C0 RID: 192
// (get) Token: 0x06000359 RID: 857 RVA: 0x00011CCA File Offset: 0x00010CCA
internal CompressionMethod CompressionMethodForHeader
{
get
{
if (this.AESKeySize <= 0)
{
return this.method;
}
return CompressionMethod.WinZipAES;
}
}
// Token: 0x170000C1 RID: 193
// (get) Token: 0x0600035A RID: 858 RVA: 0x00011CDE File Offset: 0x00010CDE
// (set) Token: 0x0600035B RID: 859 RVA: 0x00011CE8 File Offset: 0x00010CE8
public byte[] ExtraData
{
get
{
return this.extra;
}
set
{
if (value == null)
{
this.extra = null;
return;
}
if (value.Length > 65535)
{
throw new ArgumentOutOfRangeException("value");
}
this.extra = new byte[value.Length];
Array.Copy(value, 0, this.extra, 0, value.Length);
}
}
// Token: 0x170000C2 RID: 194
// (get) Token: 0x0600035C RID: 860 RVA: 0x00011D34 File Offset: 0x00010D34
// (set) Token: 0x0600035D RID: 861 RVA: 0x00011D90 File Offset: 0x00010D90
public int AESKeySize
{
get
{
switch (this._aesEncryptionStrength)
{
case 0:
return 0;
case 1:
return 128;
case 2:
return 192;
case 3:
return 256;
default:
throw new ZipException("Invalid AESEncryptionStrength " + this._aesEncryptionStrength);
}
}
set
{
if (value == 0)
{
this._aesEncryptionStrength = 0;
return;
}
if (value == 128)
{
this._aesEncryptionStrength = 1;
return;
}
if (value != 256)
{
throw new ZipException("AESKeySize must be 0, 128 or 256: " + value);
}
this._aesEncryptionStrength = 3;
}
}
// Token: 0x170000C3 RID: 195
// (get) Token: 0x0600035E RID: 862 RVA: 0x00011DE2 File Offset: 0x00010DE2
internal byte AESEncryptionStrength
{
get
{
return (byte)this._aesEncryptionStrength;
}
}
// Token: 0x170000C4 RID: 196
// (get) Token: 0x0600035F RID: 863 RVA: 0x00011DEB File Offset: 0x00010DEB
internal int AESSaltLen
{
get
{
return this.AESKeySize / 16;
}
}
// Token: 0x170000C5 RID: 197
// (get) Token: 0x06000360 RID: 864 RVA: 0x00011DF6 File Offset: 0x00010DF6
internal int AESOverheadSize
{
get
{
return 12 + this.AESSaltLen;
}
}
// Token: 0x06000361 RID: 865 RVA: 0x00011E04 File Offset: 0x00010E04
internal void ProcessExtraData(bool localHeader)
{
ZipExtraData zipExtraData = new ZipExtraData(this.extra);
if (zipExtraData.Find(1))
{
this.forceZip64_ = true;
if (zipExtraData.ValueLength < 4)
{
throw new ZipException("Extra data extended Zip64 information length is invalid");
}
if (localHeader || this.size == (ulong)(-1))
{
this.size = (ulong)zipExtraData.ReadLong();
}
if (localHeader || this.compressedSize == (ulong)(-1))
{
this.compressedSize = (ulong)zipExtraData.ReadLong();
}
if (!localHeader && this.offset == (long)((ulong)(-1)))
{
this.offset = zipExtraData.ReadLong();
}
}
else if ((this.versionToExtract & 255) >= 45 && (this.size == (ulong)(-1) || this.compressedSize == (ulong)(-1)))
{
throw new ZipException("Zip64 Extended information required but is missing.");
}
if (zipExtraData.Find(10))
{
if (zipExtraData.ValueLength < 4)
{
throw new ZipException("NTFS Extra data invalid");
}
zipExtraData.ReadInt();
while (zipExtraData.UnreadCount >= 4)
{
int num = zipExtraData.ReadShort();
int num2 = zipExtraData.ReadShort();
if (num == 1)
{
if (num2 >= 24)
{
long num3 = zipExtraData.ReadLong();
zipExtraData.ReadLong();
zipExtraData.ReadLong();
this.DateTime = DateTime.FromFileTime(num3);
break;
}
break;
}
else
{
zipExtraData.Skip(num2);
}
}
}
else if (zipExtraData.Find(21589))
{
int valueLength = zipExtraData.ValueLength;
int num4 = zipExtraData.ReadByte();
if ((num4 & 1) != 0 && valueLength >= 5)
{
int num5 = zipExtraData.ReadInt();
this.DateTime = (new DateTime(1970, 1, 1, 0, 0, 0).ToUniversalTime() + new TimeSpan(0, 0, 0, num5, 0)).ToLocalTime();
}
}
if (this.method == CompressionMethod.WinZipAES)
{
this.ProcessAESExtraData(zipExtraData);
}
}
// Token: 0x06000362 RID: 866 RVA: 0x00011FAC File Offset: 0x00010FAC
private void ProcessAESExtraData(ZipExtraData extraData)
{
if (!extraData.Find(39169))
{
throw new ZipException("AES Extra Data missing");
}
this.versionToExtract = 51;
this.Flags |= 64;
int valueLength = extraData.ValueLength;
if (valueLength < 7)
{
throw new ZipException("AES Extra Data Length " + valueLength + " invalid.");
}
int num = extraData.ReadShort();
extraData.ReadShort();
int num2 = extraData.ReadByte();
int num3 = extraData.ReadShort();
this._aesVer = num;
this._aesEncryptionStrength = num2;
this.method = (CompressionMethod)num3;
}
// Token: 0x170000C6 RID: 198
// (get) Token: 0x06000363 RID: 867 RVA: 0x0001203F File Offset: 0x0001103F
// (set) Token: 0x06000364 RID: 868 RVA: 0x00012047 File Offset: 0x00011047
public string Comment
{
get
{
return this.comment;
}
set
{
if (value != null && value.Length > 65535)
{
throw new ArgumentOutOfRangeException("value", "cannot exceed 65535");
}
this.comment = value;
}
}
// Token: 0x170000C7 RID: 199
// (get) Token: 0x06000365 RID: 869 RVA: 0x00012070 File Offset: 0x00011070
public bool IsDirectory
{
get
{
int length = this.name.Length;
return (length > 0 && (this.name[length - 1] == '/' || this.name[length - 1] == '\\')) || this.HasDosAttributes(16);
}
}
// Token: 0x170000C8 RID: 200
// (get) Token: 0x06000366 RID: 870 RVA: 0x000120BE File Offset: 0x000110BE
public bool IsFile
{
get
{
return !this.IsDirectory && !this.HasDosAttributes(8);
}
}
// Token: 0x06000367 RID: 871 RVA: 0x000120D4 File Offset: 0x000110D4
public bool IsCompressionMethodSupported()
{
return ZipEntry.IsCompressionMethodSupported(this.CompressionMethod);
}
// Token: 0x06000368 RID: 872 RVA: 0x000120E4 File Offset: 0x000110E4
public object Clone()
{
ZipEntry zipEntry = (ZipEntry)base.MemberwiseClone();
if (this.extra != null)
{
zipEntry.extra = new byte[this.extra.Length];
Array.Copy(this.extra, 0, zipEntry.extra, 0, this.extra.Length);
}
return zipEntry;
}
// Token: 0x06000369 RID: 873 RVA: 0x00012134 File Offset: 0x00011134
public override string ToString()
{
return this.name;
}
// Token: 0x0600036A RID: 874 RVA: 0x0001213C File Offset: 0x0001113C
public static bool IsCompressionMethodSupported(CompressionMethod method)
{
return method == CompressionMethod.Deflated || method == CompressionMethod.Stored;
}
// Token: 0x0600036B RID: 875 RVA: 0x00012148 File Offset: 0x00011148
public static string CleanName(string name)
{
if (name == null)
{
return string.Empty;
}
if (Path.IsPathRooted(name))
{
name = name.Substring(Path.GetPathRoot(name).Length);
}
name = name.Replace("\\", "/");
while (name.Length > 0 && name[0] == '/')
{
name = name.Remove(0, 1);
}
return name;
}
// Token: 0x04000286 RID: 646
private ZipEntry.Known known;
// Token: 0x04000287 RID: 647
private int externalFileAttributes;
// Token: 0x04000288 RID: 648
private ushort versionMadeBy;
// Token: 0x04000289 RID: 649
private string name;
// Token: 0x0400028A RID: 650
private ulong size;
// Token: 0x0400028B RID: 651
private ulong compressedSize;
// Token: 0x0400028C RID: 652
private ushort versionToExtract;
// Token: 0x0400028D RID: 653
private uint crc;
// Token: 0x0400028E RID: 654
private uint dosTime;
// Token: 0x0400028F RID: 655
private CompressionMethod method;
// Token: 0x04000290 RID: 656
private byte[] extra;
// Token: 0x04000291 RID: 657
private string comment;
// Token: 0x04000292 RID: 658
private int flags;
// Token: 0x04000293 RID: 659
private long zipFileIndex;
// Token: 0x04000294 RID: 660
private long offset;
// Token: 0x04000295 RID: 661
private bool forceZip64_;
// Token: 0x04000296 RID: 662
private byte cryptoCheckValue_;
// Token: 0x04000297 RID: 663
private int _aesVer;
// Token: 0x04000298 RID: 664
private int _aesEncryptionStrength;
// Token: 0x02000057 RID: 87
[Flags]
private enum Known : byte
{
// Token: 0x0400029A RID: 666
None = 0,
// Token: 0x0400029B RID: 667
Size = 1,
// Token: 0x0400029C RID: 668
CompressedSize = 2,
// Token: 0x0400029D RID: 669
Crc = 4,
// Token: 0x0400029E RID: 670
Time = 8,
// Token: 0x0400029F RID: 671
ExternalAttributes = 16
}
}
}