mirror of
https://github.com/wiz0u/WTelegramClient.git
synced 2025-12-06 06:52:01 +01:00
fix #27: compatibility with Mono/Android
This commit is contained in:
parent
72fba55407
commit
1b1243a758
|
|
@ -369,7 +369,7 @@ namespace WTelegram
|
|||
{
|
||||
lock (_session) _session.Save();
|
||||
}
|
||||
Helpers.Log(2, $"Connected to {(TLConfig.test_mode ? "Test DC" : "DC")} {TLConfig.this_dc}... {TLConfig.flags & (Config.Flags)~0xE00}");
|
||||
Helpers.Log(2, $"Connected to {(TLConfig.test_mode ? "Test DC" : "DC")} {TLConfig.this_dc}... {TLConfig.flags & (Config.Flags)~0xE00U}");
|
||||
}
|
||||
|
||||
/// <summary>Obtain/create a Client for a secondary session on a specific Data Center</summary>
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@ namespace WTelegram
|
|||
private readonly DateTime _sessionStart = DateTime.UtcNow;
|
||||
private readonly SHA256 _sha256 = SHA256.Create();
|
||||
private Stream _store;
|
||||
private byte[] _reuseKey; // used only if AES Encryptor.CanReuseTransform = false (Mono)
|
||||
private byte[] _encrypted = new byte[16];
|
||||
private ICryptoTransform _encryptor;
|
||||
private Utf8JsonWriter _jsonWriter;
|
||||
|
|
@ -83,6 +84,7 @@ namespace WTelegram
|
|||
session._store = store;
|
||||
Encryption.RNG.GetBytes(session._encrypted, 0, 16);
|
||||
session._encryptor = aes.CreateEncryptor(rgbKey, session._encrypted);
|
||||
if (!session._encryptor.CanReuseTransform) session._reuseKey = rgbKey;
|
||||
session._jsonWriter = new Utf8JsonWriter(session._jsonStream, default);
|
||||
return session;
|
||||
}
|
||||
|
|
@ -98,6 +100,9 @@ namespace WTelegram
|
|||
_encryptor.TransformBlock(_sha256.ComputeHash(utf8Json, 0, utf8JsonLen), 0, 32, _encrypted, 16);
|
||||
_encryptor.TransformBlock(utf8Json, 0, encryptedLen - 64, _encrypted, 48);
|
||||
_encryptor.TransformFinalBlock(utf8Json, encryptedLen - 64, utf8JsonLen & 15).CopyTo(_encrypted, encryptedLen - 16);
|
||||
if (!_encryptor.CanReuseTransform) // under Mono, AES encryptor is not reusable
|
||||
using (var aes = Aes.Create())
|
||||
_encryptor = aes.CreateEncryptor(_reuseKey, _encrypted[0..16]);
|
||||
_store.Position = 0;
|
||||
_store.Write(_encrypted, 0, encryptedLen);
|
||||
_store.SetLength(encryptedLen);
|
||||
|
|
|
|||
606
src/TL.Schema.cs
606
src/TL.Schema.cs
File diff suppressed because it is too large
Load diff
|
|
@ -363,7 +363,7 @@ namespace TL
|
|||
/// <summary>Random message ID of the message this message replies to (parameter added in layer 45)</summary>
|
||||
[IfFlag(3)] public long reply_to_random_id;
|
||||
|
||||
[Flags] public enum Flags
|
||||
[Flags] public enum Flags : uint
|
||||
{
|
||||
/// <summary>Field <see cref="reply_to_random_id"/> has a value</summary>
|
||||
has_reply_to_random_id = 0x8,
|
||||
|
|
@ -503,7 +503,7 @@ namespace TL
|
|||
/// <summary>Random group ID, assigned by the author of message.<br/>Multiple encrypted messages with a photo attached and with the same group ID indicate an <a href="https://corefork.telegram.org/api/files#albums-grouped-media">album or grouped media</a> (parameter added in layer 45)</summary>
|
||||
[IfFlag(17)] public long grouped_id;
|
||||
|
||||
[Flags] public enum Flags
|
||||
[Flags] public enum Flags : uint
|
||||
{
|
||||
/// <summary>Field <see cref="reply_to_random_id"/> has a value</summary>
|
||||
has_reply_to_random_id = 0x8,
|
||||
|
|
|
|||
14
src/TL.cs
14
src/TL.cs
|
|
@ -39,14 +39,14 @@ namespace TL
|
|||
writer.Write(ctorNb);
|
||||
IEnumerable<FieldInfo> fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
|
||||
if (tlDef.inheritBefore) fields = fields.GroupBy(f => f.DeclaringType).Reverse().SelectMany(g => g);
|
||||
int flags = 0;
|
||||
uint flags = 0;
|
||||
IfFlagAttribute ifFlag;
|
||||
foreach (var field in fields)
|
||||
{
|
||||
if (((ifFlag = field.GetCustomAttribute<IfFlagAttribute>()) != null) && (flags & (1 << ifFlag.Bit)) == 0) continue;
|
||||
if (((ifFlag = field.GetCustomAttribute<IfFlagAttribute>()) != null) && (flags & (1U << ifFlag.Bit)) == 0) continue;
|
||||
object value = field.GetValue(obj);
|
||||
writer.WriteTLValue(value, field.FieldType);
|
||||
if (field.Name == "flags") flags = (int)value;
|
||||
if (field.Name == "flags") flags = (uint)value;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -63,14 +63,14 @@ namespace TL
|
|||
var obj = Activator.CreateInstance(type);
|
||||
IEnumerable<FieldInfo> fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
|
||||
if (tlDef.inheritBefore) fields = fields.GroupBy(f => f.DeclaringType).Reverse().SelectMany(g => g);
|
||||
int flags = 0;
|
||||
uint flags = 0;
|
||||
IfFlagAttribute ifFlag;
|
||||
foreach (var field in fields)
|
||||
{
|
||||
if (((ifFlag = field.GetCustomAttribute<IfFlagAttribute>()) != null) && (flags & (1 << ifFlag.Bit)) == 0) continue;
|
||||
if (((ifFlag = field.GetCustomAttribute<IfFlagAttribute>()) != null) && (flags & (1U << ifFlag.Bit)) == 0) continue;
|
||||
object value = reader.ReadTLValue(field.FieldType);
|
||||
field.SetValue(obj, value);
|
||||
if (field.Name == "flags") flags = (int)value;
|
||||
if (field.Name == "flags") flags = (uint)value;
|
||||
else if (field.Name == "access_hash") reader.Client?.UpdateAccessHash(obj, type, value);
|
||||
}
|
||||
return (IObject)obj;
|
||||
|
|
@ -108,6 +108,8 @@ namespace TL
|
|||
writer.Write(int256);
|
||||
else if (value is IObject tlObject)
|
||||
WriteTLObject(writer, tlObject);
|
||||
else if (type.IsEnum) // needed for Mono (enums in generic types are seen as TypeCode.Object)
|
||||
writer.Write((uint)value);
|
||||
else
|
||||
ShouldntBeHere();
|
||||
break;
|
||||
|
|
|
|||
Loading…
Reference in a new issue