mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Refactor SyncCore
This commit is contained in:
parent
75aa77faa8
commit
10692a323e
9
BUCK
9
BUCK
@ -37,6 +37,7 @@ framework_dependencies = [
|
||||
"//submodules/SSignalKit/SwiftSignalKit:SwiftSignalKit",
|
||||
"//submodules/Postbox:Postbox",
|
||||
"//submodules/TelegramApi:TelegramApi",
|
||||
"//submodules/SyncCore:SyncCore",
|
||||
"//submodules/TelegramCore:TelegramCore",
|
||||
"//submodules/AsyncDisplayKit:AsyncDisplayKit",
|
||||
"//submodules/Display:Display",
|
||||
@ -313,10 +314,12 @@ apple_binary(
|
||||
name = "NotificationServiceBinary",
|
||||
srcs = glob([
|
||||
"NotificationService/**/*.m",
|
||||
"NotificationService/**/*.swift",
|
||||
]),
|
||||
headers = glob([
|
||||
"NotificationService/**/*.h",
|
||||
]),
|
||||
bridging_header = "NotificationService/NotificationService-Bridging-Header.h",
|
||||
configs = notification_service_extension_configs(),
|
||||
swift_compiler_flags = [
|
||||
"-application-extension",
|
||||
@ -336,7 +339,10 @@ apple_binary(
|
||||
deps = [
|
||||
"//submodules/BuildConfig:BuildConfig",
|
||||
"//submodules/MtProtoKit:MtProtoKit#shared",
|
||||
"//submodules/OpenSSLEncryptionProvider:OpenSSLEncryptionProvider",
|
||||
"//submodules/EncryptionProvider:EncryptionProvider",
|
||||
"//submodules/sqlcipher:sqlcipher",
|
||||
#"//submodules/Postbox:Postbox#shared",
|
||||
#"//submodules/SyncCore:SyncCore#shared",
|
||||
],
|
||||
frameworks = [
|
||||
"$SDKROOT/System/Library/Frameworks/Foundation.framework",
|
||||
@ -382,6 +388,7 @@ apple_binary(
|
||||
"//submodules/SSignalKit/SwiftSignalKit:SwiftSignalKit#shared",
|
||||
"//submodules/Postbox:Postbox#shared",
|
||||
"//submodules/TelegramApi:TelegramApi#shared",
|
||||
"//submodules/SyncCore:SyncCore#shared",
|
||||
"//submodules/TelegramCore:TelegramCore#shared",
|
||||
"//submodules/BuildConfig:BuildConfig",
|
||||
"//submodules/OpenSSLEncryptionProvider:OpenSSLEncryptionProvider",
|
||||
|
12
Makefile
12
Makefile
@ -52,6 +52,8 @@ build_arm64: check_env
|
||||
//submodules/Postbox:Postbox#shared,iphoneos-arm64 \
|
||||
//submodules/TelegramApi:TelegramApi#dwarf-and-dsym,shared,iphoneos-arm64 \
|
||||
//submodules/TelegramApi:TelegramApi#shared,iphoneos-arm64 \
|
||||
//submodules/SyncCore:SyncCore#dwarf-and-dsym,shared,iphoneos-arm64 \
|
||||
//submodules/SyncCore:SyncCore#shared,iphoneos-arm64 \
|
||||
//submodules/TelegramCore:TelegramCore#dwarf-and-dsym,shared,iphoneos-arm64 \
|
||||
//submodules/TelegramCore:TelegramCore#shared,iphoneos-arm64 \
|
||||
//submodules/AsyncDisplayKit:AsyncDisplayKit#dwarf-and-dsym,shared,iphoneos-arm64 \
|
||||
@ -80,6 +82,8 @@ build_debug_arm64: check_env
|
||||
//submodules/Postbox:Postbox#shared,iphoneos-arm64 \
|
||||
//submodules/TelegramApi:TelegramApi#dwarf-and-dsym,shared,iphoneos-arm64 \
|
||||
//submodules/TelegramApi:TelegramApi#shared,iphoneos-arm64 \
|
||||
//submodules/SyncCore:SyncCore#dwarf-and-dsym,shared,iphoneos-arm64 \
|
||||
//submodules/SyncCore:SyncCore#shared,iphoneos-arm64 \
|
||||
//submodules/TelegramCore:TelegramCore#dwarf-and-dsym,shared,iphoneos-arm64 \
|
||||
//submodules/TelegramCore:TelegramCore#shared,iphoneos-arm64 \
|
||||
//submodules/AsyncDisplayKit:AsyncDisplayKit#dwarf-and-dsym,shared,iphoneos-arm64 \
|
||||
@ -122,6 +126,8 @@ build_debug_armv7: check_env
|
||||
//submodules/Postbox:Postbox#shared,iphoneos-armv7 \
|
||||
//submodules/TelegramApi:TelegramApi#dwarf-and-dsym,shared,iphoneos-armv7 \
|
||||
//submodules/TelegramApi:TelegramApi#shared,iphoneos-armv7 \
|
||||
//submodules/SyncCore:SyncCore#dwarf-and-dsym,shared,iphoneos-armv7 \
|
||||
//submodules/SyncCore:SyncCore#shared,iphoneos-armv7 \
|
||||
//submodules/TelegramCore:TelegramCore#dwarf-and-dsym,shared,iphoneos-armv7 \
|
||||
//submodules/TelegramCore:TelegramCore#shared,iphoneos-armv7 \
|
||||
//submodules/AsyncDisplayKit:AsyncDisplayKit#dwarf-and-dsym,shared,iphoneos-armv7 \
|
||||
@ -150,6 +156,8 @@ build: check_env
|
||||
//submodules/Postbox:Postbox#shared,iphoneos-arm64,iphoneos-armv7 \
|
||||
//submodules/TelegramApi:TelegramApi#dwarf-and-dsym,shared,iphoneos-arm64,iphoneos-armv7 \
|
||||
//submodules/TelegramApi:TelegramApi#shared,iphoneos-arm64,iphoneos-armv7 \
|
||||
//submodules/SyncCore:SyncCore#dwarf-and-dsym,shared,iphoneos-arm64,iphoneos-armv7 \
|
||||
//submodules/SyncCore:SyncCore#shared,iphoneos-arm64,iphoneos-armv7 \
|
||||
//submodules/TelegramCore:TelegramCore#dwarf-and-dsym,shared,iphoneos-arm64,iphoneos-armv7 \
|
||||
//submodules/TelegramCore:TelegramCore#shared,iphoneos-arm64,iphoneos-armv7 \
|
||||
//submodules/AsyncDisplayKit:AsyncDisplayKit#dwarf-and-dsym,shared,iphoneos-arm64,iphoneos-armv7 \
|
||||
@ -292,6 +300,8 @@ build_buckdebug: check_env
|
||||
//submodules/Postbox:Postbox#shared,iphoneos-arm64 \
|
||||
//submodules/TelegramApi:TelegramApi#dwarf-and-dsym,shared,iphoneos-arm64 \
|
||||
//submodules/TelegramApi:TelegramApi#shared,iphoneos-arm64 \
|
||||
//submodules/SyncCore:SyncCore#dwarf-and-dsym,shared,iphoneos-arm64 \
|
||||
//submodules/SyncCore:SyncCore#shared,iphoneos-arm64 \
|
||||
//submodules/TelegramCore:TelegramCore#dwarf-and-dsym,shared,iphoneos-arm64 \
|
||||
//submodules/TelegramCore:TelegramCore#shared,iphoneos-arm64 \
|
||||
//submodules/AsyncDisplayKit:AsyncDisplayKit#dwarf-and-dsym,shared,iphoneos-arm64 \
|
||||
@ -330,6 +340,8 @@ build_verbose: check_env
|
||||
//submodules/Postbox:Postbox#shared,iphoneos-arm64 \
|
||||
//submodules/TelegramApi:TelegramApi#dwarf-and-dsym,shared,iphoneos-arm64 \
|
||||
//submodules/TelegramApi:TelegramApi#shared,iphoneos-arm64 \
|
||||
//submodules/SyncCore:SyncCore#dwarf-and-dsym,shared,iphoneos-arm64 \
|
||||
//submodules/SyncCore:SyncCore#shared,iphoneos-arm64 \
|
||||
//submodules/TelegramCore:TelegramCore#dwarf-and-dsym,shared,iphoneos-arm64 \
|
||||
//submodules/TelegramCore:TelegramCore#shared,iphoneos-arm64 \
|
||||
//submodules/AsyncDisplayKit:AsyncDisplayKit#dwarf-and-dsym,shared,iphoneos-arm64 \
|
||||
|
@ -38,7 +38,7 @@ class NotificationViewController: UIViewController, UNNotificationContentExtensi
|
||||
|
||||
let appVersion = (Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String) ?? "unknown"
|
||||
|
||||
self.impl = NotificationViewControllerImpl(initializationData: NotificationViewControllerInitializationData(appGroupPath: appGroupUrl.path, apiId: buildConfig.apiId, languagesCategory: languagesCategory, encryptionParameters: encryptionParameters, appVersion: appVersion, bundleData: buildConfig.bundleData(withAppToken: nil)), setPreferredContentSize: { [weak self] size in
|
||||
self.impl = NotificationViewControllerImpl(initializationData: NotificationViewControllerInitializationData(appGroupPath: appGroupUrl.path, apiId: buildConfig.apiId, languagesCategory: languagesCategory, encryptionParameters: encryptionParameters, appVersion: appVersion, bundleData: buildConfig.bundleData(withAppToken: nil, signatureDict: nil)), setPreferredContentSize: { [weak self] size in
|
||||
self?.preferredContentSize = size
|
||||
})
|
||||
}
|
||||
|
@ -1,7 +0,0 @@
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
NSData *MTAesDecrypt(NSData *data, NSData *key, NSData *iv);
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
@ -1,73 +0,0 @@
|
||||
#import "Crypto.h"
|
||||
#import <CommonCrypto/CommonCrypto.h>
|
||||
|
||||
#define AES_BLOCK_SIZE 16
|
||||
|
||||
#define N_WORDS (AES_BLOCK_SIZE / sizeof(unsigned long))
|
||||
typedef struct {
|
||||
unsigned long data[N_WORDS];
|
||||
} aes_block_t;
|
||||
|
||||
static void MyAesIgeDecrypt(const void *inBytes, int length, void *outBytes, const void *key, int keyLength, void *iv) {
|
||||
unsigned char aesIv[AES_BLOCK_SIZE];
|
||||
memcpy(aesIv, iv, AES_BLOCK_SIZE);
|
||||
unsigned char ccIv[AES_BLOCK_SIZE];
|
||||
memcpy(ccIv, iv + AES_BLOCK_SIZE, AES_BLOCK_SIZE);
|
||||
|
||||
assert(((size_t)inBytes | (size_t)outBytes | (size_t)aesIv | (size_t)ccIv) % sizeof(long) ==
|
||||
0);
|
||||
|
||||
CCCryptorRef decryptor = NULL;
|
||||
CCCryptorCreate(kCCDecrypt, kCCAlgorithmAES128, kCCOptionECBMode, key, keyLength, nil, &decryptor);
|
||||
if (decryptor != NULL) {
|
||||
int len;
|
||||
size_t n;
|
||||
|
||||
len = length / AES_BLOCK_SIZE;
|
||||
|
||||
aes_block_t *ivp = (aes_block_t *)(aesIv);
|
||||
aes_block_t *iv2p = (aes_block_t *)(ccIv);
|
||||
|
||||
while (len) {
|
||||
aes_block_t tmp;
|
||||
aes_block_t *inp = (aes_block_t *)inBytes;
|
||||
aes_block_t *outp = (aes_block_t *)outBytes;
|
||||
|
||||
for (n = 0; n < N_WORDS; ++n)
|
||||
tmp.data[n] = inp->data[n] ^ iv2p->data[n];
|
||||
|
||||
size_t dataOutMoved = 0;
|
||||
CCCryptorStatus result = CCCryptorUpdate(decryptor, &tmp, AES_BLOCK_SIZE, outBytes, AES_BLOCK_SIZE, &dataOutMoved);
|
||||
assert(result == kCCSuccess);
|
||||
assert(dataOutMoved == AES_BLOCK_SIZE);
|
||||
|
||||
for (n = 0; n < N_WORDS; ++n)
|
||||
outp->data[n] ^= ivp->data[n];
|
||||
|
||||
ivp = inp;
|
||||
iv2p = outp;
|
||||
|
||||
inBytes += AES_BLOCK_SIZE;
|
||||
outBytes += AES_BLOCK_SIZE;
|
||||
|
||||
--len;
|
||||
}
|
||||
|
||||
memcpy(iv, ivp->data, AES_BLOCK_SIZE);
|
||||
memcpy(iv + AES_BLOCK_SIZE, iv2p->data, AES_BLOCK_SIZE);
|
||||
|
||||
CCCryptorRelease(decryptor);
|
||||
}
|
||||
}
|
||||
|
||||
NSData *MTAesDecrypt(NSData *data, NSData *key, NSData *iv) {
|
||||
assert(key != nil && iv != nil);
|
||||
|
||||
NSMutableData *resultData = [[NSMutableData alloc] initWithLength:data.length];
|
||||
|
||||
unsigned char aesIv[16 * 2];
|
||||
memcpy(aesIv, iv.bytes, iv.length);
|
||||
MyAesIgeDecrypt(data.bytes, (int)data.length, resultData.mutableBytes, key.bytes, (int)key.length, aesIv);
|
||||
|
||||
return resultData;
|
||||
}
|
@ -1,10 +1,34 @@
|
||||
#import "FetchImage.h"
|
||||
|
||||
#import <MTProtoKit/MTProtoKit.h>
|
||||
#import <OpenSSLEncryptionProvider/OpenSSLEncryptionProvider.h>
|
||||
#import <EncryptionProvider/EncryptionProvider.h>
|
||||
|
||||
#import "Serialization.h"
|
||||
|
||||
@interface EmptyEncryptionProvider: NSObject <EncryptionProvider>
|
||||
|
||||
@end
|
||||
|
||||
@implementation EmptyEncryptionProvider
|
||||
|
||||
- (id<MTBignumContext>)createBignumContext {
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (NSData * _Nullable)rsaEncryptWithPublicKey:(NSString *)publicKey data:(NSData *)data {
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (NSData * _Nullable)rsaEncryptPKCS1OAEPWithPublicKey:(NSString *)publicKey data:(NSData *)data {
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (id<MTRsaPublicKey>)parseRSAPublicKey:(NSString *)publicKey {
|
||||
return nil;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@interface InMemoryKeychain : NSObject <MTKeychain> {
|
||||
NSMutableDictionary *_dict;
|
||||
}
|
||||
@ -84,7 +108,7 @@ dispatch_block_t fetchImage(BuildConfig *buildConfig, AccountProxyConnection * _
|
||||
apiEnvironment = [apiEnvironment withUpdatedSocksProxySettings:[[MTSocksProxySettings alloc] initWithIp:proxyConnection.host port:(uint16_t)proxyConnection.port username:proxyConnection.username password:proxyConnection.password secret:proxyConnection.secret]];
|
||||
}
|
||||
|
||||
MTContext *context = [[MTContext alloc] initWithSerialization:serialization encryptionProvider:[[OpenSSLEncryptionProvider alloc] init] apiEnvironment:apiEnvironment isTestingEnvironment:account.isTestingEnvironment useTempAuthKeys:false];
|
||||
MTContext *context = [[MTContext alloc] initWithSerialization:serialization encryptionProvider:[[EmptyEncryptionProvider alloc] init] apiEnvironment:apiEnvironment isTestingEnvironment:account.isTestingEnvironment useTempAuthKeys:false];
|
||||
|
||||
NSDictionary *seedAddressList = @{};
|
||||
|
||||
|
@ -1,6 +1,13 @@
|
||||
#ifndef NotificationService_BridgingHeader_h
|
||||
#define NotificationService_BridgingHeader_h
|
||||
|
||||
#import "Crypto.h"
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <BuildConfig/BuildConfig.h>
|
||||
|
||||
@protocol SyncProvider <NSObject>
|
||||
|
||||
- (void)addIncomingMessageWithRootPath:(NSString * _Nonnull)rootPath accountId:(int64_t)accountId encryptionParameters:(DeviceSpecificEncryptionParameters * _Nonnull)encryptionParameters peerId:(int64_t)peerId messageId:(int32_t)messageId completion:(void (^)(int32_t))completion;
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
|
@ -12,6 +12,8 @@
|
||||
#import "Api.h"
|
||||
#import "FetchImage.h"
|
||||
|
||||
#import "NotificationService-Bridging-Header.h"
|
||||
|
||||
static NSData * _Nullable parseBase64(NSString *string) {
|
||||
string = [string stringByReplacingOccurrencesOfString:@"-" withString:@"+"];
|
||||
string = [string stringByReplacingOccurrencesOfString:@"_" withString:@"/"];
|
||||
@ -32,12 +34,38 @@ static int64_t makePeerId(int32_t namespace, int32_t value) {
|
||||
return (((int64_t)(namespace)) << 32) | ((int64_t)((uint64_t)((uint32_t)value)));
|
||||
}
|
||||
|
||||
@interface ParsedNotificationMessage : NSObject
|
||||
|
||||
@property (nonatomic, readonly) int64_t accountId;
|
||||
@property (nonatomic, readonly) int64_t peerId;
|
||||
@property (nonatomic, readonly) int32_t messageId;
|
||||
|
||||
@end
|
||||
|
||||
@implementation ParsedNotificationMessage
|
||||
|
||||
- (instancetype)initWithAccountId:(int64_t)accountId peerId:(int64_t)peerId messageId:(int64_t)messageId {
|
||||
self = [super init];
|
||||
if (self != nil) {
|
||||
_accountId = accountId;
|
||||
_peerId = peerId;
|
||||
_messageId = messageId;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@interface NotificationService () {
|
||||
NSString * _Nullable _rootPath;
|
||||
NSString * _Nullable _baseAppBundleId;
|
||||
void (^_contentHandler)(UNNotificationContent *);
|
||||
UNMutableNotificationContent * _Nullable _bestAttemptContent;
|
||||
void (^_cancelFetch)(void);
|
||||
|
||||
ParsedNotificationMessage * _Nullable _parsedMessage;
|
||||
NSNumber * _Nullable _updatedUnreadCount;
|
||||
bool _contentReady;
|
||||
}
|
||||
|
||||
@end
|
||||
@ -67,7 +95,21 @@ static int64_t makePeerId(int32_t namespace, int32_t value) {
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)completeWithContent:(UNNotificationContent * _Nonnull)content {
|
||||
- (void)completeWithBestAttemptContent {
|
||||
_contentReady = true;
|
||||
if (_contentReady && _updatedUnreadCount) {
|
||||
[self _internalComplete];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)updateUnreadCount:(int32_t)unreadCount {
|
||||
_updatedUnreadCount = @(unreadCount);
|
||||
if (_contentReady && _updatedUnreadCount) {
|
||||
[self _internalComplete];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)_internalComplete {
|
||||
#ifdef __IPHONE_13_0
|
||||
if (_baseAppBundleId != nil) {
|
||||
BGAppRefreshTaskRequest *request = [[BGAppRefreshTaskRequest alloc] initWithIdentifier:[_baseAppBundleId stringByAppendingString:@".refresh"]];
|
||||
@ -80,14 +122,21 @@ static int64_t makePeerId(int32_t namespace, int32_t value) {
|
||||
}
|
||||
#endif
|
||||
|
||||
if (_contentHandler) {
|
||||
_contentHandler(content);
|
||||
if (_bestAttemptContent && _contentHandler) {
|
||||
if (_updatedUnreadCount != nil) {
|
||||
int32_t unreadCount = (int32_t)[_updatedUnreadCount intValue];
|
||||
if (unreadCount > 0) {
|
||||
_bestAttemptContent.badge = @(unreadCount);
|
||||
}
|
||||
}
|
||||
_contentHandler(_bestAttemptContent);
|
||||
}
|
||||
}
|
||||
|
||||
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
|
||||
if (_rootPath == nil) {
|
||||
[self completeWithContent:request.content];
|
||||
_bestAttemptContent = request.content;
|
||||
[self completeWithBestAttemptContent];
|
||||
return;
|
||||
}
|
||||
|
||||
@ -144,6 +193,17 @@ static int64_t makePeerId(int32_t namespace, int32_t value) {
|
||||
peerId = makePeerId(PeerNamespaceCloudChannel, [channelIdString intValue]);
|
||||
}
|
||||
|
||||
_parsedMessage = [[ParsedNotificationMessage alloc] initWithAccountId:account.accountId peerId:peerId messageId:messageId];
|
||||
|
||||
__weak NotificationService *weakSelf = self;
|
||||
[self addUnreadMessage:_rootPath accountId:account.accountId encryptionParameters:nil peerId:peerId messageId:messageId completion:^(int32_t badge) {
|
||||
__strong NotificationService *strongSelf = weakSelf;
|
||||
if (strongSelf == nil) {
|
||||
return;
|
||||
}
|
||||
[strongSelf updateUnreadCount:badge];
|
||||
}];
|
||||
|
||||
NSString *silentString = decryptedPayload[@"silent"];
|
||||
if ([silentString isKindOfClass:[NSString class]]) {
|
||||
silent = [silentString intValue] != 0;
|
||||
@ -311,9 +371,7 @@ static int64_t makePeerId(int32_t namespace, int32_t value) {
|
||||
_bestAttemptContent.attachments = @[attachment];
|
||||
}
|
||||
}
|
||||
if (_bestAttemptContent != nil) {
|
||||
[self completeWithContent:_bestAttemptContent];
|
||||
}
|
||||
[self completeWithBestAttemptContent];
|
||||
} else {
|
||||
BuildConfig *buildConfig = [[BuildConfig alloc] initWithBaseAppBundleId:_baseAppBundleId];
|
||||
|
||||
@ -343,23 +401,16 @@ static int64_t makePeerId(int32_t namespace, int32_t value) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (strongSelf->_bestAttemptContent != nil) {
|
||||
[strongSelf completeWithContent:strongSelf->_bestAttemptContent];
|
||||
}
|
||||
[strongSelf completeWithBestAttemptContent];
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
} else {
|
||||
if (_bestAttemptContent != nil) {
|
||||
[self completeWithContent:_bestAttemptContent];
|
||||
}
|
||||
[self completeWithBestAttemptContent];
|
||||
}
|
||||
} else {
|
||||
if (_bestAttemptContent != nil) {
|
||||
[self completeWithContent:_bestAttemptContent];
|
||||
}
|
||||
[self completeWithBestAttemptContent];
|
||||
}
|
||||
}
|
||||
|
||||
@ -371,11 +422,20 @@ static int64_t makePeerId(int32_t namespace, int32_t value) {
|
||||
|
||||
if (_contentHandler) {
|
||||
if(_bestAttemptContent) {
|
||||
[self completeWithContent:_bestAttemptContent];
|
||||
_bestAttemptContent = nil;
|
||||
if (_updatedUnreadCount == nil) {
|
||||
_updatedUnreadCount = @(-1);
|
||||
}
|
||||
[self completeWithBestAttemptContent];
|
||||
}
|
||||
_contentHandler = nil;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)addUnreadMessage:(NSString * _Nonnull)rootPath accountId:(int64_t)accountId encryptionParameters:(DeviceSpecificEncryptionParameters * _Nonnull)encryptionParameters peerId:(int64_t)peerId messageId:(int32_t)messageId completion:(void (^)(int32_t))completion {
|
||||
|
||||
if (completion) {
|
||||
completion(-1);
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
4
NotificationService/Sync.h
Normal file
4
NotificationService/Sync.h
Normal file
@ -0,0 +1,4 @@
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <sqlcipher/sqlcipher.h>
|
||||
|
||||
|
1
NotificationService/Sync.m
Normal file
1
NotificationService/Sync.m
Normal file
@ -0,0 +1 @@
|
||||
#import "Sync.h"
|
32
NotificationService/Sync.swift
Normal file
32
NotificationService/Sync.swift
Normal file
@ -0,0 +1,32 @@
|
||||
//import SwiftSignalKit
|
||||
//import Postbox
|
||||
//import SyncCore
|
||||
//import BuildConfig
|
||||
|
||||
@objc(SyncProviderImpl)
|
||||
final class SyncProviderImpl: NSObject {
|
||||
}
|
||||
|
||||
/*@objc(SyncProviderImpl)
|
||||
final class SyncProviderImpl: NSObject, SyncProvider {
|
||||
func addIncomingMessage(withRootPath rootPath: String, accountId: Int64, encryptionParameters: DeviceSpecificEncryptionParameters, peerId: Int64, messageId: Int32, completion: ((Int32) -> Void)!) {
|
||||
let _ = (addIncomingMessageImpl(rootPath: rootPath, accountId: accountId, encryptionParameters: ValueBoxEncryptionParameters(forceEncryptionIfNoSet: false, key: ValueBoxEncryptionParameters.Key(data: encryptionParameters.key)!, salt: ValueBoxEncryptionParameters.Salt(data: encryptionParameters.salt)!), peerId: peerId, messageId: messageId)
|
||||
|> deliverOnMainQueue).start(next: { result in
|
||||
completion(Int32(clamping: result))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
private func addIncomingMessageImpl(rootPath: String, accountId: Int64, encryptionParameters: ValueBoxEncryptionParameters, peerId: Int64, messageId: Int32) -> Signal<Int, NoError> {
|
||||
return accountTransaction(rootPath: rootPath, id: AccountRecordId(rawValue: accountId), encryptionParameters: encryptionParameters, transaction: { transaction -> Int in
|
||||
transaction.countIncomingMessage(id: MessageId(peerId: PeerId(peerId), namespace: Namespaces.Message.Cloud, id: messageId))
|
||||
let totalUnreadState = transaction.getTotalUnreadState()
|
||||
let totalCount = totalUnreadState.count(for: .filtered, in: .chats, with: [
|
||||
.regularChatsAndPrivateGroups,
|
||||
.publicGroups,
|
||||
.channels
|
||||
])
|
||||
return Int(totalCount)
|
||||
})
|
||||
}
|
||||
*/
|
@ -35,7 +35,7 @@ class ShareRootController: UIViewController {
|
||||
|
||||
let appVersion = (Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String) ?? "unknown"
|
||||
|
||||
self.impl = ShareRootControllerImpl(initializationData: ShareRootControllerInitializationData(appGroupPath: appGroupUrl.path, apiId: buildConfig.apiId, languagesCategory: languagesCategory, encryptionParameters: encryptionParameters, appVersion: appVersion, bundleData: buildConfig.bundleData(withAppToken: nil)), getExtensionContext: { [weak self] in
|
||||
self.impl = ShareRootControllerImpl(initializationData: ShareRootControllerInitializationData(appGroupPath: appGroupUrl.path, apiId: buildConfig.apiId, languagesCategory: languagesCategory, encryptionParameters: encryptionParameters, appVersion: appVersion, bundleData: buildConfig.bundleData(withAppToken: nil, signatureDict: nil)), getExtensionContext: { [weak self] in
|
||||
return self?.extensionContext
|
||||
})
|
||||
}
|
||||
|
@ -2,6 +2,7 @@ import Foundation
|
||||
import SwiftSignalKit
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import Contacts
|
||||
import Intents
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
import Foundation
|
||||
import Intents
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import Postbox
|
||||
import SwiftSignalKit
|
||||
import BuildConfig
|
||||
@ -98,7 +99,7 @@ class IntentHandler: INExtension, INSendMessageIntentHandling, INSearchForMessag
|
||||
let deviceSpecificEncryptionParameters = BuildConfig.deviceSpecificEncryptionParameters(rootPath, baseAppBundleId: baseAppBundleId)
|
||||
let encryptionParameters = ValueBoxEncryptionParameters(forceEncryptionIfNoSet: false, key: ValueBoxEncryptionParameters.Key(data: deviceSpecificEncryptionParameters.key)!, salt: ValueBoxEncryptionParameters.Salt(data: deviceSpecificEncryptionParameters.salt)!)
|
||||
|
||||
account = currentAccount(allocateIfNotExists: false, networkArguments: NetworkInitializationArguments(apiId: apiId, languagesCategory: languagesCategory, appVersion: appVersion, voipMaxLayer: 0, appData: .single(buildConfig.bundleData(withAppToken: nil)), encryptionProvider: OpenSSLEncryptionProvider()), supplementary: true, manager: accountManager, rootPath: rootPath, auxiliaryMethods: accountAuxiliaryMethods, encryptionParameters: encryptionParameters)
|
||||
account = currentAccount(allocateIfNotExists: false, networkArguments: NetworkInitializationArguments(apiId: apiId, languagesCategory: languagesCategory, appVersion: appVersion, voipMaxLayer: 0, appData: .single(buildConfig.bundleData(withAppToken: nil, signatureDict: nil)), encryptionProvider: OpenSSLEncryptionProvider()), supplementary: true, manager: accountManager, rootPath: rootPath, auxiliaryMethods: accountAuxiliaryMethods, encryptionParameters: encryptionParameters)
|
||||
|> mapToSignal { account -> Signal<Account?, NoError> in
|
||||
if let account = account {
|
||||
switch account {
|
||||
|
@ -2,6 +2,7 @@ import Foundation
|
||||
import SwiftSignalKit
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import Contacts
|
||||
import Intents
|
||||
|
||||
|
@ -7,15 +7,16 @@ static_library(
|
||||
]),
|
||||
deps = [
|
||||
"//submodules/TelegramAudio:TelegramAudio",
|
||||
"//submodules/AsyncDisplayKit:AsyncDisplayKit#dynamic",
|
||||
"//submodules/AsyncDisplayKit:AsyncDisplayKit#shared",
|
||||
"//submodules/TemporaryCachedPeerDataManager:TemporaryCachedPeerDataManager",
|
||||
"//submodules/DeviceLocationManager:DeviceLocationManager",
|
||||
"//submodules/MediaPlayer:UniversalMediaPlayer",
|
||||
"//submodules/TelegramPresentationData:TelegramPresentationData",
|
||||
"//submodules/SSignalKit/SwiftSignalKit:SwiftSignalKit#dynamic",
|
||||
"//submodules/Postbox:Postbox#dynamic",
|
||||
"//submodules/TelegramCore:TelegramCore#dynamic",
|
||||
"//submodules/WalletCore:WalletCore",
|
||||
"//submodules/SSignalKit/SwiftSignalKit:SwiftSignalKit#shared",
|
||||
"//submodules/Postbox:Postbox#shared",
|
||||
"//submodules/TelegramCore:TelegramCore#shared",
|
||||
"//submodules/SyncCore:SyncCore#shared",
|
||||
"//submodules/WalletCore:WalletCore",
|
||||
],
|
||||
frameworks = [
|
||||
"$SDKROOT/System/Library/Frameworks/Foundation.framework",
|
||||
|
@ -1,6 +1,7 @@
|
||||
import Foundation
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import TelegramPresentationData
|
||||
import TelegramUIPreferences
|
||||
import SwiftSignalKit
|
||||
|
@ -1,6 +1,7 @@
|
||||
import Foundation
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import TextFormat
|
||||
import Display
|
||||
import SwiftSignalKit
|
||||
|
@ -2,6 +2,7 @@ import Foundation
|
||||
import Contacts
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
|
||||
public final class DeviceContactPhoneNumberData: Equatable {
|
||||
public let label: String
|
||||
|
@ -1,6 +1,7 @@
|
||||
import Foundation
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import TelegramUIPreferences
|
||||
import SwiftSignalKit
|
||||
|
||||
|
@ -1,5 +1,6 @@
|
||||
import Foundation
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import Postbox
|
||||
import TelegramUIPreferences
|
||||
import SwiftSignalKit
|
||||
|
@ -1,6 +1,7 @@
|
||||
import Foundation
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import SwiftSignalKit
|
||||
import TelegramUIPreferences
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
import Foundation
|
||||
import UIKit
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import Postbox
|
||||
import SwiftSignalKit
|
||||
import TelegramUIPreferences
|
||||
|
@ -1,6 +1,7 @@
|
||||
import Foundation
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
|
||||
public func isMediaStreamable(message: Message, media: TelegramMediaFile) -> Bool {
|
||||
if message.containsSecretMedia {
|
||||
|
@ -1,5 +1,6 @@
|
||||
import Foundation
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import Postbox
|
||||
import SwiftSignalKit
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
import Foundation
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import SwiftSignalKit
|
||||
import UIKit
|
||||
import AsyncDisplayKit
|
||||
|
@ -2,6 +2,7 @@ import Foundation
|
||||
import UIKit
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import SwiftSignalKit
|
||||
import Display
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
import Foundation
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import SwiftSignalKit
|
||||
import TelegramAudio
|
||||
|
||||
|
@ -1,5 +1,6 @@
|
||||
import Foundation
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import Postbox
|
||||
import TelegramUIPreferences
|
||||
import SwiftSignalKit
|
||||
|
@ -1,6 +1,7 @@
|
||||
import Foundation
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import SwiftSignalKit
|
||||
|
||||
public func storedMessageFromSearchPeer(account: Account, peer: Peer) -> Signal<PeerId, NoError> {
|
||||
|
@ -1,6 +1,7 @@
|
||||
import Foundation
|
||||
import SwiftSignalKit
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import TelegramPresentationData
|
||||
|
||||
public protocol ThemeUpdateManager: class {
|
||||
|
@ -4,6 +4,7 @@ import AsyncDisplayKit
|
||||
import Postbox
|
||||
import SwiftSignalKit
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import Display
|
||||
import TelegramAudio
|
||||
import UniversalMediaPlayer
|
||||
|
@ -1,6 +1,7 @@
|
||||
import Foundation
|
||||
import SwiftSignalKit
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import TelegramPresentationData
|
||||
|
||||
public enum WallpaperUploadManagerStatus {
|
||||
|
@ -8,6 +8,7 @@ static_library(
|
||||
deps = [
|
||||
"//submodules/Postbox:Postbox#shared",
|
||||
"//submodules/TelegramCore:TelegramCore#shared",
|
||||
"//submodules/SyncCore:SyncCore#shared",
|
||||
"//submodules/AsyncDisplayKit:AsyncDisplayKit#shared",
|
||||
"//submodules/Display:Display#shared",
|
||||
"//submodules/AvatarNode:AvatarNode",
|
||||
|
@ -3,6 +3,7 @@ import UIKit
|
||||
import AsyncDisplayKit
|
||||
import Display
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import Postbox
|
||||
import TelegramPresentationData
|
||||
import AvatarNode
|
||||
|
@ -9,6 +9,7 @@ static_library(
|
||||
"//submodules/SSignalKit/SwiftSignalKit:SwiftSignalKit#shared",
|
||||
"//submodules/Postbox:Postbox#shared",
|
||||
"//submodules/TelegramCore:TelegramCore#shared",
|
||||
"//submodules/SyncCore:SyncCore#shared",
|
||||
"//submodules/AsyncDisplayKit:AsyncDisplayKit#shared",
|
||||
"//submodules/Display:Display#shared",
|
||||
"//submodules/YuvConversion:YuvConversion",
|
||||
|
@ -8,6 +8,7 @@ static_library(
|
||||
deps = [
|
||||
"//submodules/AsyncDisplayKit:AsyncDisplayKit#shared",
|
||||
"//submodules/TelegramCore:TelegramCore#shared",
|
||||
"//submodules/SyncCore:SyncCore#shared",
|
||||
"//submodules/Display:Display#shared",
|
||||
"//submodules/TextFormat:TextFormat",
|
||||
"//submodules/Markdown:Markdown",
|
||||
|
@ -1,5 +1,6 @@
|
||||
import Foundation
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import Display
|
||||
import TelegramPresentationData
|
||||
import TextFormat
|
||||
|
@ -9,6 +9,7 @@ static_library(
|
||||
"//submodules/AsyncDisplayKit:AsyncDisplayKit#shared",
|
||||
"//submodules/Display:Display#shared",
|
||||
"//submodules/TelegramCore:TelegramCore#shared",
|
||||
"//submodules/SyncCore:SyncCore#shared",
|
||||
"//submodules/TelegramPresentationData:TelegramPresentationData",
|
||||
"//submodules/AnimationUI:AnimationUI",
|
||||
"//submodules/AppBundle:AppBundle",
|
||||
|
@ -4,6 +4,7 @@ import AsyncDisplayKit
|
||||
import Postbox
|
||||
import Display
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import SwiftSignalKit
|
||||
import TelegramPresentationData
|
||||
import AnimationUI
|
||||
|
@ -5,6 +5,7 @@ import Postbox
|
||||
import Display
|
||||
import ImageIO
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
|
||||
private let roundCorners = { () -> UIImage in
|
||||
let diameter: CGFloat = 60.0
|
||||
|
@ -9,6 +9,7 @@ static_library(
|
||||
"//submodules/SSignalKit/SwiftSignalKit:SwiftSignalKit#shared",
|
||||
"//submodules/Postbox:Postbox#shared",
|
||||
"//submodules/TelegramCore:TelegramCore#shared",
|
||||
"//submodules/SyncCore:SyncCore#shared",
|
||||
"//submodules/TelegramPresentationData:TelegramPresentationData",
|
||||
"//submodules/LocalAuth:LocalAuth",
|
||||
"//submodules/AccountContext:AccountContext",
|
||||
|
@ -3,6 +3,7 @@ import UIKit
|
||||
import Display
|
||||
import AsyncDisplayKit
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import SwiftSignalKit
|
||||
import Postbox
|
||||
import TelegramPresentationData
|
||||
|
@ -4,6 +4,7 @@ import AsyncDisplayKit
|
||||
import Display
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import SwiftSignalKit
|
||||
import PassKit
|
||||
import TelegramPresentationData
|
||||
|
@ -4,6 +4,7 @@ import Display
|
||||
import AsyncDisplayKit
|
||||
import SwiftSignalKit
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import TelegramPresentationData
|
||||
import ItemListUI
|
||||
import PresentationDataUtils
|
||||
|
@ -3,6 +3,7 @@ import UIKit
|
||||
import SwiftSignalKit
|
||||
import Display
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import Postbox
|
||||
import TelegramPresentationData
|
||||
import ProgressNavigationButtonNode
|
||||
|
@ -3,6 +3,7 @@ import UIKit
|
||||
import AsyncDisplayKit
|
||||
import Display
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import Postbox
|
||||
import SwiftSignalKit
|
||||
import TelegramPresentationData
|
||||
|
@ -4,6 +4,7 @@ import AsyncDisplayKit
|
||||
import SwiftSignalKit
|
||||
import Display
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import Postbox
|
||||
import TelegramPresentationData
|
||||
import ProgressNavigationButtonNode
|
||||
|
@ -3,6 +3,7 @@ import UIKit
|
||||
import AsyncDisplayKit
|
||||
import Display
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import Postbox
|
||||
import SwiftSignalKit
|
||||
import TelegramPresentationData
|
||||
|
@ -3,6 +3,7 @@ import UIKit
|
||||
import AsyncDisplayKit
|
||||
import Display
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import SwiftSignalKit
|
||||
import TelegramPresentationData
|
||||
import AccountContext
|
||||
|
@ -4,6 +4,7 @@ import Display
|
||||
import AsyncDisplayKit
|
||||
import SwiftSignalKit
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import AccountContext
|
||||
import AppBundle
|
||||
|
||||
|
@ -4,6 +4,7 @@ import Display
|
||||
import AsyncDisplayKit
|
||||
import SwiftSignalKit
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import AccountContext
|
||||
import TelegramStringFormatting
|
||||
|
||||
|
@ -3,6 +3,7 @@ import UIKit
|
||||
import Display
|
||||
import AsyncDisplayKit
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import SwiftSignalKit
|
||||
import Postbox
|
||||
import TelegramPresentationData
|
||||
|
@ -3,6 +3,7 @@ import UIKit
|
||||
import Display
|
||||
import AsyncDisplayKit
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import SwiftSignalKit
|
||||
import Postbox
|
||||
import TelegramPresentationData
|
||||
|
@ -4,6 +4,7 @@ import AsyncDisplayKit
|
||||
import Display
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import SwiftSignalKit
|
||||
import TelegramPresentationData
|
||||
import ItemListUI
|
||||
|
@ -22,7 +22,6 @@ static_library(
|
||||
"Sources/*.h",
|
||||
]),
|
||||
deps = [
|
||||
"//submodules/PKCS:PKCS",
|
||||
],
|
||||
frameworks = [
|
||||
"$SDKROOT/System/Library/Frameworks/Foundation.framework",
|
||||
|
@ -20,7 +20,7 @@
|
||||
@property (nonatomic, strong, readonly) NSString * _Nonnull appSpecificUrlScheme;
|
||||
|
||||
+ (DeviceSpecificEncryptionParameters * _Nonnull)deviceSpecificEncryptionParameters:(NSString * _Nonnull)rootPath baseAppBundleId:(NSString * _Nonnull)baseAppBundleId;
|
||||
- (NSData * _Nullable)bundleDataWithAppToken:(NSData * _Nullable)appToken;
|
||||
- (NSData * _Nullable)bundleDataWithAppToken:(NSData * _Nullable)appToken signatureDict:(NSDictionary * _Nullable)signatureDict;
|
||||
|
||||
+ (void)getHardwareEncryptionAvailableWithBaseAppBundleId:(NSString * _Nonnull)baseAppBundleId completion:(void (^)(NSData * _Nullable))completion;
|
||||
+ (void)encryptApplicationSecret:(NSData * _Nonnull)secret baseAppBundleId:(NSString * _Nonnull)baseAppBundleId completion:(void (^)(NSData * _Nullable, NSData * _Nullable))completion;
|
||||
|
@ -1,244 +1,6 @@
|
||||
#import "BuildConfig.h"
|
||||
|
||||
#include <mach-o/arch.h>
|
||||
#include <mach-o/loader.h>
|
||||
#include <mach-o/fat.h>
|
||||
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#import <CommonCrypto/CommonCrypto.h>
|
||||
#import <CommonCrypto/CommonDigest.h>
|
||||
|
||||
#import <PKCS/PKCS.h>
|
||||
|
||||
static NSData *sha1(NSData *data) {
|
||||
uint8_t digest[20];
|
||||
CC_SHA1(data.bytes, (CC_LONG)data.length, digest);
|
||||
|
||||
return [[NSData alloc] initWithBytes:digest length:20];
|
||||
}
|
||||
|
||||
static NSString *telegramApplicationSecretKey = @"telegramApplicationSecretKey_v3";
|
||||
|
||||
static uint32_t funcSwap32(uint32_t input)
|
||||
{
|
||||
return OSSwapBigToHostInt32(input);
|
||||
}
|
||||
|
||||
static uint32_t funcNoSwap32(uint32_t input)
|
||||
{
|
||||
return OSSwapLittleToHostInt32(input);
|
||||
}
|
||||
|
||||
/*
|
||||
* Magic numbers used by Code Signing
|
||||
*/
|
||||
enum {
|
||||
kSecCodeMagicRequirement = 0xfade0c00, /* single requirement */
|
||||
kSecCodeMagicRequirementSet = 0xfade0c01, /* requirement set */
|
||||
kSecCodeMagicCodeDirectory = 0xfade0c02, /* CodeDirectory */
|
||||
kSecCodeMagicEmbeddedSignature = 0xfade0cc0, /* single-architecture embedded signature */
|
||||
kSecCodeMagicDetachedSignature = 0xfade0cc1, /* detached multi-architecture signature */
|
||||
kSecCodeMagicEntitlement = 0xfade7171, /* entitlement blob */
|
||||
|
||||
kSecCodeMagicByte = 0xfa /* shared first byte */
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* Structure of an embedded-signature SuperBlob
|
||||
*/
|
||||
typedef struct __BlobIndex {
|
||||
uint32_t type; /* type of entry */
|
||||
uint32_t offset; /* offset of entry */
|
||||
} CS_BlobIndex;
|
||||
|
||||
typedef struct __Blob {
|
||||
uint32_t magic; /* magic number */
|
||||
uint32_t length; /* total length of SuperBlob */
|
||||
} CS_Blob;
|
||||
|
||||
typedef struct __SuperBlob {
|
||||
CS_Blob blob;
|
||||
uint32_t count; /* number of index entries following */
|
||||
CS_BlobIndex index[]; /* (count) entries */
|
||||
/* followed by Blobs in no particular order as indicated by offsets in index */
|
||||
} CS_SuperBlob;
|
||||
|
||||
|
||||
/*
|
||||
* C form of a CodeDirectory.
|
||||
*/
|
||||
typedef struct __CodeDirectory {
|
||||
uint32_t magic; /* magic number (CSMAGIC_CODEDIRECTORY) */
|
||||
uint32_t length; /* total length of CodeDirectory blob */
|
||||
uint32_t version; /* compatibility version */
|
||||
uint32_t flags; /* setup and mode flags */
|
||||
uint32_t hashOffset; /* offset of hash slot element at index zero */
|
||||
uint32_t identOffset; /* offset of identifier string */
|
||||
uint32_t nSpecialSlots; /* number of special hash slots */
|
||||
uint32_t nCodeSlots; /* number of ordinary (code) hash slots */
|
||||
uint32_t codeLimit; /* limit to main image signature range */
|
||||
uint8_t hashSize; /* size of each hash in bytes */
|
||||
uint8_t hashType; /* type of hash (cdHashType* constants) */
|
||||
uint8_t spare1; /* unused (must be zero) */
|
||||
uint8_t pageSize; /* log2(page size in bytes); 0 => infinite */
|
||||
uint32_t spare2; /* unused (must be zero) */
|
||||
/* followed by dynamic content as located by offset fields above */
|
||||
} CS_CodeDirectory;
|
||||
|
||||
static MTPKCS * _Nullable parseSignature(const char* buffer, size_t size) {
|
||||
CS_SuperBlob* sb = (CS_SuperBlob*)buffer;
|
||||
if (OSSwapBigToHostInt32(sb->blob.magic) != kSecCodeMagicEmbeddedSignature)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t count = OSSwapBigToHostInt32(sb->count);
|
||||
|
||||
for (uint32_t i = 0; i < count; i++)
|
||||
{
|
||||
uint32_t offset = OSSwapBigToHostInt32(sb->index[i].offset);
|
||||
|
||||
const CS_Blob* blob = (const CS_Blob*)(buffer + offset);
|
||||
|
||||
if (OSSwapBigToHostInt32(blob->magic) == 0xfade0b01) // signature
|
||||
{
|
||||
printf("Embedded signature, length: %d\n", OSSwapBigToHostInt32(blob->length));
|
||||
|
||||
if (OSSwapBigToHostInt32(blob->length) != 8)
|
||||
{
|
||||
const unsigned char* message = (const unsigned char*)buffer + offset + 8;
|
||||
MTPKCS *result = [MTPKCS parse:message size:(OSSwapBigToHostInt32(blob->length) - 8)];
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
static MTPKCS * _Nullable parseArch(const char* buffer, size_t size) {
|
||||
uint32_t (*swap32)(uint32_t) = funcNoSwap32;
|
||||
|
||||
uint32_t offset = 0;
|
||||
|
||||
const struct mach_header* header = (struct mach_header*)(buffer + offset);
|
||||
|
||||
switch (header->magic) {
|
||||
case MH_CIGAM:
|
||||
swap32 = funcSwap32;
|
||||
case MH_MAGIC:
|
||||
offset += sizeof(struct mach_header);
|
||||
break;
|
||||
case MH_CIGAM_64:
|
||||
swap32 = funcSwap32;
|
||||
case MH_MAGIC_64:
|
||||
offset += sizeof(struct mach_header_64);
|
||||
break;
|
||||
default:
|
||||
return nil;
|
||||
}
|
||||
|
||||
const NXArchInfo *archInfo = NXGetArchInfoFromCpuType(swap32(header->cputype), swap32(header->cpusubtype));
|
||||
if (archInfo != NULL) {
|
||||
printf("Architecture: %s\n", archInfo->name);
|
||||
}
|
||||
|
||||
uint32_t commandCount = swap32(header->ncmds);
|
||||
|
||||
for (uint32_t i = 0; i < commandCount; i++) {
|
||||
const struct load_command* loadCommand = (const struct load_command*)(buffer + offset);
|
||||
uint32_t commandSize = swap32(loadCommand->cmdsize);
|
||||
|
||||
uint32_t commandType = swap32(loadCommand->cmd);
|
||||
if (commandType == LC_CODE_SIGNATURE) {
|
||||
const struct linkedit_data_command* dataCommand = (const struct linkedit_data_command*)(buffer + offset);
|
||||
uint32_t dataOffset = swap32(dataCommand->dataoff);
|
||||
uint32_t dataSize = swap32(dataCommand->datasize);
|
||||
|
||||
return parseSignature(buffer + dataOffset, dataSize);
|
||||
}
|
||||
|
||||
offset += commandSize;
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
static MTPKCS * _Nullable parseFat(const char *buffer, size_t size) {
|
||||
size_t offset = 0;
|
||||
|
||||
const struct fat_header* fatHeader = (const struct fat_header*)(buffer + offset);
|
||||
offset += sizeof(*fatHeader);
|
||||
|
||||
uint32_t archCount = OSSwapBigToHostInt32(fatHeader->nfat_arch);
|
||||
|
||||
for (uint32_t i = 0; i < archCount; i++) {
|
||||
const struct fat_arch* arch = (const struct fat_arch*)(buffer + offset);
|
||||
offset += sizeof(*arch);
|
||||
|
||||
uint32_t archOffset = OSSwapBigToHostInt32(arch->offset);
|
||||
uint32_t archSize = OSSwapBigToHostInt32(arch->size);
|
||||
|
||||
MTPKCS *result = parseArch(buffer + archOffset, archSize);
|
||||
if (result != nil) {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
static MTPKCS * _Nullable parseMachO(const char* buffer, size_t size) {
|
||||
const uint32_t* magic = (const uint32_t*)buffer;
|
||||
|
||||
if (*magic == FAT_CIGAM || *magic == FAT_MAGIC) {
|
||||
return parseFat(buffer, size);
|
||||
} else {
|
||||
return parseArch(buffer, size);
|
||||
}
|
||||
}
|
||||
|
||||
static MTPKCS * _Nullable checkSignature(const char *filename) {
|
||||
char *buffer = NULL;
|
||||
|
||||
int fd = open(filename, O_RDONLY);
|
||||
|
||||
if (fd == -1) {
|
||||
return nil;
|
||||
}
|
||||
|
||||
struct stat st;
|
||||
fstat(fd, &st);
|
||||
|
||||
buffer = mmap(NULL, (size_t)st.st_size, PROT_READ, MAP_FILE|MAP_PRIVATE, fd, 0);
|
||||
|
||||
if (buffer == MAP_FAILED) {
|
||||
if (buffer) {
|
||||
munmap(buffer, (size_t)st.st_size);
|
||||
}
|
||||
if (fd != -1) {
|
||||
close(fd);
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
MTPKCS *result = parseMachO(buffer, (size_t)st.st_size);
|
||||
if (buffer) {
|
||||
munmap(buffer, (size_t)st.st_size);
|
||||
}
|
||||
if (fd != -1) {
|
||||
close(fd);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
API_AVAILABLE(ios(10))
|
||||
@interface LocalPrivateKey : NSObject {
|
||||
SecKeyRef _privateKey;
|
||||
@ -369,32 +131,26 @@ API_AVAILABLE(ios(10))
|
||||
_apiHash = @(APP_CONFIG_API_HASH);
|
||||
_hockeyAppId = @(APP_CONFIG_HOCKEYAPP_ID);
|
||||
|
||||
MTPKCS *signature = checkSignature([[[NSBundle mainBundle] executablePath] UTF8String]);
|
||||
_dataDict = [[NSMutableDictionary alloc] init];
|
||||
|
||||
if (baseAppBundleId != nil) {
|
||||
_dataDict[@"bundleId"] = baseAppBundleId;
|
||||
}
|
||||
if (signature.issuerName != nil) {
|
||||
_dataDict[@"issuerName"] = signature.issuerName;
|
||||
}
|
||||
if (signature.subjectName != nil) {
|
||||
_dataDict[@"name"] = signature.subjectName;
|
||||
}
|
||||
if (signature.data != nil) {
|
||||
_dataDict[@"data"] = [sha1(signature.data) base64EncodedStringWithOptions:0];
|
||||
_dataDict[@"data1"] = [signature.data base64EncodedStringWithOptions:0];
|
||||
}
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (NSData * _Nullable)bundleDataWithAppToken:(NSData * _Nullable)appToken {
|
||||
- (NSData * _Nullable)bundleDataWithAppToken:(NSData * _Nullable)appToken signatureDict:(NSDictionary * _Nullable)signatureDict {
|
||||
NSMutableDictionary *dataDict = [[NSMutableDictionary alloc] initWithDictionary:_dataDict];
|
||||
if (appToken != nil) {
|
||||
dataDict[@"device_token"] = [appToken base64EncodedStringWithOptions:0];
|
||||
dataDict[@"device_token_type"] = @"voip";
|
||||
}
|
||||
if (signatureDict != nil) {
|
||||
for (id<NSCopying> key in signatureDict.allKeys) {
|
||||
dataDict[key] = signatureDict[key];
|
||||
}
|
||||
}
|
||||
NSData *data = [NSJSONSerialization dataWithJSONObject:dataDict options:0 error:nil];
|
||||
return data;
|
||||
}
|
||||
|
20
submodules/BuildConfigExtra/BUCK
Normal file
20
submodules/BuildConfigExtra/BUCK
Normal file
@ -0,0 +1,20 @@
|
||||
load("//Config:buck_rule_macros.bzl", "static_library")
|
||||
|
||||
static_library(
|
||||
name = "BuildConfigExtra",
|
||||
srcs = glob([
|
||||
"Sources/*.m",
|
||||
]),
|
||||
headers = glob([
|
||||
"Sources/*.h",
|
||||
]),
|
||||
exported_headers = glob([
|
||||
"Sources/*.h",
|
||||
]),
|
||||
deps = [
|
||||
"//submodules/PKCS:PKCS",
|
||||
],
|
||||
frameworks = [
|
||||
"$SDKROOT/System/Library/Frameworks/Foundation.framework",
|
||||
],
|
||||
)
|
9
submodules/BuildConfigExtra/Sources/BuildConfigExtra.h
Normal file
9
submodules/BuildConfigExtra/Sources/BuildConfigExtra.h
Normal file
@ -0,0 +1,9 @@
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@interface BuildConfigExtra : NSObject
|
||||
|
||||
- (instancetype _Nonnull)initWithBaseAppBundleId:(NSString * _Nonnull)baseAppBundleId;
|
||||
|
||||
+ (NSDictionary * _Nonnull)signatureDict;
|
||||
|
||||
@end
|
260
submodules/BuildConfigExtra/Sources/BuildConfigExtra.m
Normal file
260
submodules/BuildConfigExtra/Sources/BuildConfigExtra.m
Normal file
@ -0,0 +1,260 @@
|
||||
#import "BuildConfigExtra.h"
|
||||
|
||||
#include <mach-o/arch.h>
|
||||
#include <mach-o/loader.h>
|
||||
#include <mach-o/fat.h>
|
||||
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#import <CommonCrypto/CommonCrypto.h>
|
||||
#import <CommonCrypto/CommonDigest.h>
|
||||
|
||||
#import <PKCS/PKCS.h>
|
||||
|
||||
static NSData *sha1(NSData *data) {
|
||||
uint8_t digest[20];
|
||||
CC_SHA1(data.bytes, (CC_LONG)data.length, digest);
|
||||
|
||||
return [[NSData alloc] initWithBytes:digest length:20];
|
||||
}
|
||||
|
||||
static NSString *telegramApplicationSecretKey = @"telegramApplicationSecretKey_v3";
|
||||
|
||||
static uint32_t funcSwap32(uint32_t input)
|
||||
{
|
||||
return OSSwapBigToHostInt32(input);
|
||||
}
|
||||
|
||||
static uint32_t funcNoSwap32(uint32_t input)
|
||||
{
|
||||
return OSSwapLittleToHostInt32(input);
|
||||
}
|
||||
|
||||
/*
|
||||
* Magic numbers used by Code Signing
|
||||
*/
|
||||
enum {
|
||||
kSecCodeMagicRequirement = 0xfade0c00, /* single requirement */
|
||||
kSecCodeMagicRequirementSet = 0xfade0c01, /* requirement set */
|
||||
kSecCodeMagicCodeDirectory = 0xfade0c02, /* CodeDirectory */
|
||||
kSecCodeMagicEmbeddedSignature = 0xfade0cc0, /* single-architecture embedded signature */
|
||||
kSecCodeMagicDetachedSignature = 0xfade0cc1, /* detached multi-architecture signature */
|
||||
kSecCodeMagicEntitlement = 0xfade7171, /* entitlement blob */
|
||||
|
||||
kSecCodeMagicByte = 0xfa /* shared first byte */
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* Structure of an embedded-signature SuperBlob
|
||||
*/
|
||||
typedef struct __BlobIndex {
|
||||
uint32_t type; /* type of entry */
|
||||
uint32_t offset; /* offset of entry */
|
||||
} CS_BlobIndex;
|
||||
|
||||
typedef struct __Blob {
|
||||
uint32_t magic; /* magic number */
|
||||
uint32_t length; /* total length of SuperBlob */
|
||||
} CS_Blob;
|
||||
|
||||
typedef struct __SuperBlob {
|
||||
CS_Blob blob;
|
||||
uint32_t count; /* number of index entries following */
|
||||
CS_BlobIndex index[]; /* (count) entries */
|
||||
/* followed by Blobs in no particular order as indicated by offsets in index */
|
||||
} CS_SuperBlob;
|
||||
|
||||
|
||||
/*
|
||||
* C form of a CodeDirectory.
|
||||
*/
|
||||
typedef struct __CodeDirectory {
|
||||
uint32_t magic; /* magic number (CSMAGIC_CODEDIRECTORY) */
|
||||
uint32_t length; /* total length of CodeDirectory blob */
|
||||
uint32_t version; /* compatibility version */
|
||||
uint32_t flags; /* setup and mode flags */
|
||||
uint32_t hashOffset; /* offset of hash slot element at index zero */
|
||||
uint32_t identOffset; /* offset of identifier string */
|
||||
uint32_t nSpecialSlots; /* number of special hash slots */
|
||||
uint32_t nCodeSlots; /* number of ordinary (code) hash slots */
|
||||
uint32_t codeLimit; /* limit to main image signature range */
|
||||
uint8_t hashSize; /* size of each hash in bytes */
|
||||
uint8_t hashType; /* type of hash (cdHashType* constants) */
|
||||
uint8_t spare1; /* unused (must be zero) */
|
||||
uint8_t pageSize; /* log2(page size in bytes); 0 => infinite */
|
||||
uint32_t spare2; /* unused (must be zero) */
|
||||
/* followed by dynamic content as located by offset fields above */
|
||||
} CS_CodeDirectory;
|
||||
|
||||
static MTPKCS * _Nullable parseSignature(const char* buffer, size_t size) {
|
||||
CS_SuperBlob* sb = (CS_SuperBlob*)buffer;
|
||||
if (OSSwapBigToHostInt32(sb->blob.magic) != kSecCodeMagicEmbeddedSignature)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t count = OSSwapBigToHostInt32(sb->count);
|
||||
|
||||
for (uint32_t i = 0; i < count; i++)
|
||||
{
|
||||
uint32_t offset = OSSwapBigToHostInt32(sb->index[i].offset);
|
||||
|
||||
const CS_Blob* blob = (const CS_Blob*)(buffer + offset);
|
||||
|
||||
if (OSSwapBigToHostInt32(blob->magic) == 0xfade0b01) // signature
|
||||
{
|
||||
printf("Embedded signature, length: %d\n", OSSwapBigToHostInt32(blob->length));
|
||||
|
||||
if (OSSwapBigToHostInt32(blob->length) != 8)
|
||||
{
|
||||
const unsigned char* message = (const unsigned char*)buffer + offset + 8;
|
||||
MTPKCS *result = [MTPKCS parse:message size:(OSSwapBigToHostInt32(blob->length) - 8)];
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
static MTPKCS * _Nullable parseArch(const char* buffer, size_t size) {
|
||||
uint32_t (*swap32)(uint32_t) = funcNoSwap32;
|
||||
|
||||
uint32_t offset = 0;
|
||||
|
||||
const struct mach_header* header = (struct mach_header*)(buffer + offset);
|
||||
|
||||
switch (header->magic) {
|
||||
case MH_CIGAM:
|
||||
swap32 = funcSwap32;
|
||||
case MH_MAGIC:
|
||||
offset += sizeof(struct mach_header);
|
||||
break;
|
||||
case MH_CIGAM_64:
|
||||
swap32 = funcSwap32;
|
||||
case MH_MAGIC_64:
|
||||
offset += sizeof(struct mach_header_64);
|
||||
break;
|
||||
default:
|
||||
return nil;
|
||||
}
|
||||
|
||||
const NXArchInfo *archInfo = NXGetArchInfoFromCpuType(swap32(header->cputype), swap32(header->cpusubtype));
|
||||
if (archInfo != NULL) {
|
||||
printf("Architecture: %s\n", archInfo->name);
|
||||
}
|
||||
|
||||
uint32_t commandCount = swap32(header->ncmds);
|
||||
|
||||
for (uint32_t i = 0; i < commandCount; i++) {
|
||||
const struct load_command* loadCommand = (const struct load_command*)(buffer + offset);
|
||||
uint32_t commandSize = swap32(loadCommand->cmdsize);
|
||||
|
||||
uint32_t commandType = swap32(loadCommand->cmd);
|
||||
if (commandType == LC_CODE_SIGNATURE) {
|
||||
const struct linkedit_data_command* dataCommand = (const struct linkedit_data_command*)(buffer + offset);
|
||||
uint32_t dataOffset = swap32(dataCommand->dataoff);
|
||||
uint32_t dataSize = swap32(dataCommand->datasize);
|
||||
|
||||
return parseSignature(buffer + dataOffset, dataSize);
|
||||
}
|
||||
|
||||
offset += commandSize;
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
static MTPKCS * _Nullable parseFat(const char *buffer, size_t size) {
|
||||
size_t offset = 0;
|
||||
|
||||
const struct fat_header* fatHeader = (const struct fat_header*)(buffer + offset);
|
||||
offset += sizeof(*fatHeader);
|
||||
|
||||
uint32_t archCount = OSSwapBigToHostInt32(fatHeader->nfat_arch);
|
||||
|
||||
for (uint32_t i = 0; i < archCount; i++) {
|
||||
const struct fat_arch* arch = (const struct fat_arch*)(buffer + offset);
|
||||
offset += sizeof(*arch);
|
||||
|
||||
uint32_t archOffset = OSSwapBigToHostInt32(arch->offset);
|
||||
uint32_t archSize = OSSwapBigToHostInt32(arch->size);
|
||||
|
||||
MTPKCS *result = parseArch(buffer + archOffset, archSize);
|
||||
if (result != nil) {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
static MTPKCS * _Nullable parseMachO(const char* buffer, size_t size) {
|
||||
const uint32_t* magic = (const uint32_t*)buffer;
|
||||
|
||||
if (*magic == FAT_CIGAM || *magic == FAT_MAGIC) {
|
||||
return parseFat(buffer, size);
|
||||
} else {
|
||||
return parseArch(buffer, size);
|
||||
}
|
||||
}
|
||||
|
||||
static MTPKCS * _Nullable checkSignature(const char *filename) {
|
||||
char *buffer = NULL;
|
||||
|
||||
int fd = open(filename, O_RDONLY);
|
||||
|
||||
if (fd == -1) {
|
||||
return nil;
|
||||
}
|
||||
|
||||
struct stat st;
|
||||
fstat(fd, &st);
|
||||
|
||||
buffer = mmap(NULL, (size_t)st.st_size, PROT_READ, MAP_FILE|MAP_PRIVATE, fd, 0);
|
||||
|
||||
if (buffer == MAP_FAILED) {
|
||||
if (buffer) {
|
||||
munmap(buffer, (size_t)st.st_size);
|
||||
}
|
||||
if (fd != -1) {
|
||||
close(fd);
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
MTPKCS *result = parseMachO(buffer, (size_t)st.st_size);
|
||||
if (buffer) {
|
||||
munmap(buffer, (size_t)st.st_size);
|
||||
}
|
||||
if (fd != -1) {
|
||||
close(fd);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@implementation BuildConfigExtra
|
||||
|
||||
+ (NSDictionary * _Nonnull)signatureDict {
|
||||
NSMutableDictionary *dataDict = [[NSMutableDictionary alloc] init];
|
||||
MTPKCS *signature = checkSignature([[[NSBundle mainBundle] executablePath] UTF8String]);
|
||||
if (signature.issuerName != nil) {
|
||||
dataDict[@"issuerName"] = signature.issuerName;
|
||||
}
|
||||
if (signature.subjectName != nil) {
|
||||
dataDict[@"name"] = signature.subjectName;
|
||||
}
|
||||
if (signature.data != nil) {
|
||||
dataDict[@"data"] = [sha1(signature.data) base64EncodedStringWithOptions:0];
|
||||
dataDict[@"data1"] = [signature.data base64EncodedStringWithOptions:0];
|
||||
}
|
||||
return dataDict;
|
||||
}
|
||||
|
||||
@end
|
@ -11,6 +11,7 @@ static_library(
|
||||
"//submodules/Display:Display#shared",
|
||||
"//submodules/Postbox:Postbox#shared",
|
||||
"//submodules/TelegramCore:TelegramCore#shared",
|
||||
"//submodules/SyncCore:SyncCore#shared",
|
||||
"//submodules/TelegramPresentationData:TelegramPresentationData",
|
||||
"//submodules/TelegramUIPreferences:TelegramUIPreferences",
|
||||
"//submodules/AccountContext:AccountContext",
|
||||
|
@ -5,6 +5,7 @@ import Postbox
|
||||
import Display
|
||||
import SwiftSignalKit
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import TelegramPresentationData
|
||||
import ItemListUI
|
||||
import PresentationDataUtils
|
||||
|
@ -4,6 +4,7 @@ import Display
|
||||
import AsyncDisplayKit
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import SwiftSignalKit
|
||||
import TelegramPresentationData
|
||||
import ItemListUI
|
||||
|
@ -4,6 +4,7 @@ import AsyncDisplayKit
|
||||
import Display
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import SwiftSignalKit
|
||||
import TelegramPresentationData
|
||||
import TelegramUIPreferences
|
||||
|
@ -2,6 +2,7 @@ import Foundation
|
||||
import UIKit
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import TelegramPresentationData
|
||||
import MergeLists
|
||||
|
||||
|
@ -2,6 +2,7 @@ import Foundation
|
||||
import UIKit
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import SwiftSignalKit
|
||||
import Display
|
||||
|
||||
|
@ -2,6 +2,7 @@ import Foundation
|
||||
import UIKit
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import SwiftSignalKit
|
||||
import Display
|
||||
import MergeLists
|
||||
|
@ -11,6 +11,7 @@ static_library(
|
||||
"//submodules/Display:Display#shared",
|
||||
"//submodules/Postbox:Postbox#shared",
|
||||
"//submodules/TelegramCore:TelegramCore#shared",
|
||||
"//submodules/SyncCore:SyncCore#shared",
|
||||
"//submodules/ListSectionHeaderNode:ListSectionHeaderNode",
|
||||
"//submodules/HorizontalPeerItem:HorizontalPeerItem",
|
||||
"//submodules/MergeLists:MergeLists",
|
||||
|
@ -5,6 +5,7 @@ import Display
|
||||
import SwiftSignalKit
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import TelegramPresentationData
|
||||
import MergeLists
|
||||
import HorizontalPeerItem
|
||||
|
@ -11,6 +11,7 @@ static_library(
|
||||
"//submodules/Display:Display#shared",
|
||||
"//submodules/Postbox:Postbox#shared",
|
||||
"//submodules/TelegramCore:TelegramCore#shared",
|
||||
"//submodules/SyncCore:SyncCore#shared",
|
||||
"//submodules/TelegramPresentationData:TelegramPresentationData",
|
||||
"//submodules/TelegramUIPreferences:TelegramUIPreferences",
|
||||
"//submodules/AccountContext:AccountContext",
|
||||
|
@ -5,6 +5,7 @@ import ContextUI
|
||||
import AccountContext
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import Display
|
||||
import TelegramUIPreferences
|
||||
import OverlayStatusController
|
||||
|
@ -4,6 +4,7 @@ import Postbox
|
||||
import SwiftSignalKit
|
||||
import Display
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import TelegramPresentationData
|
||||
import TelegramUIPreferences
|
||||
import TelegramBaseController
|
||||
|
@ -4,6 +4,7 @@ import AsyncDisplayKit
|
||||
import Display
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import SwiftSignalKit
|
||||
import TelegramPresentationData
|
||||
import MergeLists
|
||||
|
@ -5,6 +5,7 @@ import Postbox
|
||||
import Display
|
||||
import SwiftSignalKit
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import TelegramPresentationData
|
||||
import ChatListSearchRecentPeersNode
|
||||
import ContextUI
|
||||
|
@ -5,6 +5,7 @@ import Display
|
||||
import SwiftSignalKit
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import TelegramPresentationData
|
||||
import TelegramUIPreferences
|
||||
import MergeLists
|
||||
|
@ -3,6 +3,7 @@ import UIKit
|
||||
import SwiftSignalKit
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
|
||||
enum ChatListSelectionReadOption: Equatable {
|
||||
case all(enabled: Bool)
|
||||
|
@ -5,6 +5,7 @@ import Postbox
|
||||
import Display
|
||||
import SwiftSignalKit
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import TelegramPresentationData
|
||||
import ItemListUI
|
||||
import PresentationDataUtils
|
||||
|
@ -1,6 +1,7 @@
|
||||
import Foundation
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import TelegramPresentationData
|
||||
import TelegramUIPreferences
|
||||
import TelegramStringFormatting
|
||||
|
@ -4,6 +4,7 @@ import Display
|
||||
import AsyncDisplayKit
|
||||
import SwiftSignalKit
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import Postbox
|
||||
import TelegramPresentationData
|
||||
import TelegramUIPreferences
|
||||
|
@ -1,6 +1,7 @@
|
||||
import Foundation
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import TelegramPresentationData
|
||||
import MergeLists
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
import Foundation
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import SwiftSignalKit
|
||||
import Display
|
||||
|
||||
|
@ -3,6 +3,7 @@ import UIKit
|
||||
import AsyncDisplayKit
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import Display
|
||||
import SwiftSignalKit
|
||||
import TelegramPresentationData
|
||||
|
@ -1,6 +1,7 @@
|
||||
import Foundation
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import SwiftSignalKit
|
||||
import Display
|
||||
import MergeLists
|
||||
|
@ -10,6 +10,7 @@ static_library(
|
||||
"//submodules/Display:Display#shared",
|
||||
"//submodules/Postbox:Postbox#shared",
|
||||
"//submodules/TelegramCore:TelegramCore#shared",
|
||||
"//submodules/SyncCore:SyncCore#shared",
|
||||
"//submodules/TelegramPresentationData:TelegramPresentationData",
|
||||
"//submodules/ItemListUI:ItemListUI",
|
||||
"//submodules/AccountContext:AccountContext",
|
||||
|
@ -4,6 +4,7 @@ import Display
|
||||
import SwiftSignalKit
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import TelegramPresentationData
|
||||
import ItemListUI
|
||||
import PresentationDataUtils
|
||||
|
@ -11,6 +11,7 @@ static_library(
|
||||
"//submodules/Display:Display#shared",
|
||||
"//submodules/Postbox:Postbox#shared",
|
||||
"//submodules/TelegramCore:TelegramCore#shared",
|
||||
"//submodules/SyncCore:SyncCore#shared",
|
||||
"//submodules/TelegramPresentationData:TelegramPresentationData",
|
||||
"//submodules/AccountContext:AccountContext",
|
||||
"//submodules/TelegramUIPreferences:TelegramUIPreferences",
|
||||
|
@ -5,6 +5,7 @@ import Postbox
|
||||
import Display
|
||||
import SwiftSignalKit
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import TelegramPresentationData
|
||||
import AppBundle
|
||||
import PhoneNumberFormat
|
||||
|
@ -5,6 +5,7 @@ import ContextUI
|
||||
import AccountContext
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import Display
|
||||
import AlertUI
|
||||
import PresentationDataUtils
|
||||
|
@ -5,6 +5,7 @@ import AsyncDisplayKit
|
||||
import SwiftSignalKit
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import TelegramPresentationData
|
||||
import TelegramUIPreferences
|
||||
import DeviceAccess
|
||||
|
@ -5,6 +5,7 @@ import AsyncDisplayKit
|
||||
import Postbox
|
||||
import SwiftSignalKit
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import TelegramPresentationData
|
||||
import TelegramUIPreferences
|
||||
import DeviceAccess
|
||||
|
@ -4,6 +4,7 @@ import AsyncDisplayKit
|
||||
import UIKit
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import SwiftSignalKit
|
||||
import TelegramPresentationData
|
||||
import TelegramUIPreferences
|
||||
|
@ -5,6 +5,7 @@ import Display
|
||||
import SwiftSignalKit
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import TelegramPresentationData
|
||||
import TelegramUIPreferences
|
||||
import MergeLists
|
||||
|
@ -5,6 +5,7 @@ import AsyncDisplayKit
|
||||
import Postbox
|
||||
import SwiftSignalKit
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import MessageUI
|
||||
import TelegramPresentationData
|
||||
import AccountContext
|
||||
|
@ -4,6 +4,7 @@ import AsyncDisplayKit
|
||||
import UIKit
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import SwiftSignalKit
|
||||
import TelegramPresentationData
|
||||
import TelegramUIPreferences
|
||||
|
@ -11,6 +11,7 @@ static_library(
|
||||
"//submodules/Display:Display#shared",
|
||||
"//submodules/Postbox:Postbox#shared",
|
||||
"//submodules/TelegramCore:TelegramCore#shared",
|
||||
"//submodules/SyncCore:SyncCore#shared",
|
||||
"//submodules/AccountContext:AccountContext",
|
||||
"//submodules/AvatarNode:AvatarNode",
|
||||
"//submodules/TelegramPresentationData:TelegramPresentationData",
|
||||
|
@ -5,6 +5,7 @@ import Postbox
|
||||
import Display
|
||||
import SwiftSignalKit
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import TelegramPresentationData
|
||||
import TelegramUIPreferences
|
||||
import ItemListUI
|
||||
|
@ -6,6 +6,7 @@ import TelegramPresentationData
|
||||
import TextSelectionNode
|
||||
import ReactionSelectionNode
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import SwiftSignalKit
|
||||
|
||||
private let animationDurationFactor: Double = 1.0
|
||||
|
@ -3,6 +3,7 @@ import UIKit
|
||||
import AsyncDisplayKit
|
||||
import Display
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import TelegramPresentationData
|
||||
import TelegramStringFormatting
|
||||
import AppBundle
|
||||
|
@ -10,6 +10,7 @@ static_library(
|
||||
"//submodules/Display:Display#shared",
|
||||
"//submodules/Postbox:Postbox#shared",
|
||||
"//submodules/TelegramCore:TelegramCore#shared",
|
||||
"//submodules/SyncCore:SyncCore#shared",
|
||||
"//submodules/AccountContext:AccountContext",
|
||||
"//submodules/AvatarNode:AvatarNode",
|
||||
"//submodules/TelegramPresentationData:TelegramPresentationData",
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user