Refactor SyncCore

This commit is contained in:
Peter 2019-10-21 16:58:00 +04:00
parent 75aa77faa8
commit 10692a323e
1162 changed files with 12205 additions and 10925 deletions

9
BUCK
View File

@ -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",

View File

@ -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 \

View File

@ -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
})
}

View File

@ -1,7 +0,0 @@
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
NSData *MTAesDecrypt(NSData *data, NSData *key, NSData *iv);
NS_ASSUME_NONNULL_END

View File

@ -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;
}

View File

@ -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 = @{};

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,4 @@
#import <Foundation/Foundation.h>
#import <sqlcipher/sqlcipher.h>

View File

@ -0,0 +1 @@
#import "Sync.h"

View 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)
})
}
*/

View File

@ -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
})
}

View File

@ -2,6 +2,7 @@ import Foundation
import SwiftSignalKit
import Postbox
import TelegramCore
import SyncCore
import Contacts
import Intents

View File

@ -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 {

View File

@ -2,6 +2,7 @@ import Foundation
import SwiftSignalKit
import Postbox
import TelegramCore
import SyncCore
import Contacts
import Intents

View File

@ -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",

View File

@ -1,6 +1,7 @@
import Foundation
import Postbox
import TelegramCore
import SyncCore
import TelegramPresentationData
import TelegramUIPreferences
import SwiftSignalKit

View File

@ -1,6 +1,7 @@
import Foundation
import Postbox
import TelegramCore
import SyncCore
import TextFormat
import Display
import SwiftSignalKit

View File

@ -2,6 +2,7 @@ import Foundation
import Contacts
import Postbox
import TelegramCore
import SyncCore
public final class DeviceContactPhoneNumberData: Equatable {
public let label: String

View File

@ -1,6 +1,7 @@
import Foundation
import Postbox
import TelegramCore
import SyncCore
import TelegramUIPreferences
import SwiftSignalKit

View File

@ -1,5 +1,6 @@
import Foundation
import TelegramCore
import SyncCore
import Postbox
import TelegramUIPreferences
import SwiftSignalKit

View File

@ -1,6 +1,7 @@
import Foundation
import Postbox
import TelegramCore
import SyncCore
import SwiftSignalKit
import TelegramUIPreferences

View File

@ -1,6 +1,7 @@
import Foundation
import UIKit
import TelegramCore
import SyncCore
import Postbox
import SwiftSignalKit
import TelegramUIPreferences

View File

@ -1,6 +1,7 @@
import Foundation
import Postbox
import TelegramCore
import SyncCore
public func isMediaStreamable(message: Message, media: TelegramMediaFile) -> Bool {
if message.containsSecretMedia {

View File

@ -1,5 +1,6 @@
import Foundation
import TelegramCore
import SyncCore
import Postbox
import SwiftSignalKit

View File

@ -1,6 +1,7 @@
import Foundation
import Postbox
import TelegramCore
import SyncCore
import SwiftSignalKit
import UIKit
import AsyncDisplayKit

View File

@ -2,6 +2,7 @@ import Foundation
import UIKit
import Postbox
import TelegramCore
import SyncCore
import SwiftSignalKit
import Display

View File

@ -1,6 +1,7 @@
import Foundation
import Postbox
import TelegramCore
import SyncCore
import SwiftSignalKit
import TelegramAudio

View File

@ -1,5 +1,6 @@
import Foundation
import TelegramCore
import SyncCore
import Postbox
import TelegramUIPreferences
import SwiftSignalKit

View File

@ -1,6 +1,7 @@
import Foundation
import Postbox
import TelegramCore
import SyncCore
import SwiftSignalKit
public func storedMessageFromSearchPeer(account: Account, peer: Peer) -> Signal<PeerId, NoError> {

View File

@ -1,6 +1,7 @@
import Foundation
import SwiftSignalKit
import TelegramCore
import SyncCore
import TelegramPresentationData
public protocol ThemeUpdateManager: class {

View File

@ -4,6 +4,7 @@ import AsyncDisplayKit
import Postbox
import SwiftSignalKit
import TelegramCore
import SyncCore
import Display
import TelegramAudio
import UniversalMediaPlayer

View File

@ -1,6 +1,7 @@
import Foundation
import SwiftSignalKit
import TelegramCore
import SyncCore
import TelegramPresentationData
public enum WallpaperUploadManagerStatus {

View File

@ -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",

View File

@ -3,6 +3,7 @@ import UIKit
import AsyncDisplayKit
import Display
import TelegramCore
import SyncCore
import Postbox
import TelegramPresentationData
import AvatarNode

View File

@ -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",

View File

@ -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",

View File

@ -1,5 +1,6 @@
import Foundation
import TelegramCore
import SyncCore
import Display
import TelegramPresentationData
import TextFormat

View File

@ -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",

View File

@ -4,6 +4,7 @@ import AsyncDisplayKit
import Postbox
import Display
import TelegramCore
import SyncCore
import SwiftSignalKit
import TelegramPresentationData
import AnimationUI

View File

@ -5,6 +5,7 @@ import Postbox
import Display
import ImageIO
import TelegramCore
import SyncCore
private let roundCorners = { () -> UIImage in
let diameter: CGFloat = 60.0

View File

@ -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",

View File

@ -3,6 +3,7 @@ import UIKit
import Display
import AsyncDisplayKit
import TelegramCore
import SyncCore
import SwiftSignalKit
import Postbox
import TelegramPresentationData

View File

@ -4,6 +4,7 @@ import AsyncDisplayKit
import Display
import Postbox
import TelegramCore
import SyncCore
import SwiftSignalKit
import PassKit
import TelegramPresentationData

View File

@ -4,6 +4,7 @@ import Display
import AsyncDisplayKit
import SwiftSignalKit
import TelegramCore
import SyncCore
import TelegramPresentationData
import ItemListUI
import PresentationDataUtils

View File

@ -3,6 +3,7 @@ import UIKit
import SwiftSignalKit
import Display
import TelegramCore
import SyncCore
import Postbox
import TelegramPresentationData
import ProgressNavigationButtonNode

View File

@ -3,6 +3,7 @@ import UIKit
import AsyncDisplayKit
import Display
import TelegramCore
import SyncCore
import Postbox
import SwiftSignalKit
import TelegramPresentationData

View File

@ -4,6 +4,7 @@ import AsyncDisplayKit
import SwiftSignalKit
import Display
import TelegramCore
import SyncCore
import Postbox
import TelegramPresentationData
import ProgressNavigationButtonNode

View File

@ -3,6 +3,7 @@ import UIKit
import AsyncDisplayKit
import Display
import TelegramCore
import SyncCore
import Postbox
import SwiftSignalKit
import TelegramPresentationData

View File

@ -3,6 +3,7 @@ import UIKit
import AsyncDisplayKit
import Display
import TelegramCore
import SyncCore
import SwiftSignalKit
import TelegramPresentationData
import AccountContext

View File

@ -4,6 +4,7 @@ import Display
import AsyncDisplayKit
import SwiftSignalKit
import TelegramCore
import SyncCore
import AccountContext
import AppBundle

View File

@ -4,6 +4,7 @@ import Display
import AsyncDisplayKit
import SwiftSignalKit
import TelegramCore
import SyncCore
import AccountContext
import TelegramStringFormatting

View File

@ -3,6 +3,7 @@ import UIKit
import Display
import AsyncDisplayKit
import TelegramCore
import SyncCore
import SwiftSignalKit
import Postbox
import TelegramPresentationData

View File

@ -3,6 +3,7 @@ import UIKit
import Display
import AsyncDisplayKit
import TelegramCore
import SyncCore
import SwiftSignalKit
import Postbox
import TelegramPresentationData

View File

@ -4,6 +4,7 @@ import AsyncDisplayKit
import Display
import Postbox
import TelegramCore
import SyncCore
import SwiftSignalKit
import TelegramPresentationData
import ItemListUI

View File

@ -22,7 +22,6 @@ static_library(
"Sources/*.h",
]),
deps = [
"//submodules/PKCS:PKCS",
],
frameworks = [
"$SDKROOT/System/Library/Frameworks/Foundation.framework",

View File

@ -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;

View File

@ -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;
}

View 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",
],
)

View File

@ -0,0 +1,9 @@
#import <Foundation/Foundation.h>
@interface BuildConfigExtra : NSObject
- (instancetype _Nonnull)initWithBaseAppBundleId:(NSString * _Nonnull)baseAppBundleId;
+ (NSDictionary * _Nonnull)signatureDict;
@end

View 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

View File

@ -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",

View File

@ -5,6 +5,7 @@ import Postbox
import Display
import SwiftSignalKit
import TelegramCore
import SyncCore
import TelegramPresentationData
import ItemListUI
import PresentationDataUtils

View File

@ -4,6 +4,7 @@ import Display
import AsyncDisplayKit
import Postbox
import TelegramCore
import SyncCore
import SwiftSignalKit
import TelegramPresentationData
import ItemListUI

View File

@ -4,6 +4,7 @@ import AsyncDisplayKit
import Display
import Postbox
import TelegramCore
import SyncCore
import SwiftSignalKit
import TelegramPresentationData
import TelegramUIPreferences

View File

@ -2,6 +2,7 @@ import Foundation
import UIKit
import Postbox
import TelegramCore
import SyncCore
import TelegramPresentationData
import MergeLists

View File

@ -2,6 +2,7 @@ import Foundation
import UIKit
import Postbox
import TelegramCore
import SyncCore
import SwiftSignalKit
import Display

View File

@ -2,6 +2,7 @@ import Foundation
import UIKit
import Postbox
import TelegramCore
import SyncCore
import SwiftSignalKit
import Display
import MergeLists

View File

@ -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",

View File

@ -5,6 +5,7 @@ import Display
import SwiftSignalKit
import Postbox
import TelegramCore
import SyncCore
import TelegramPresentationData
import MergeLists
import HorizontalPeerItem

View File

@ -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",

View File

@ -5,6 +5,7 @@ import ContextUI
import AccountContext
import Postbox
import TelegramCore
import SyncCore
import Display
import TelegramUIPreferences
import OverlayStatusController

View File

@ -4,6 +4,7 @@ import Postbox
import SwiftSignalKit
import Display
import TelegramCore
import SyncCore
import TelegramPresentationData
import TelegramUIPreferences
import TelegramBaseController

View File

@ -4,6 +4,7 @@ import AsyncDisplayKit
import Display
import Postbox
import TelegramCore
import SyncCore
import SwiftSignalKit
import TelegramPresentationData
import MergeLists

View File

@ -5,6 +5,7 @@ import Postbox
import Display
import SwiftSignalKit
import TelegramCore
import SyncCore
import TelegramPresentationData
import ChatListSearchRecentPeersNode
import ContextUI

View File

@ -5,6 +5,7 @@ import Display
import SwiftSignalKit
import Postbox
import TelegramCore
import SyncCore
import TelegramPresentationData
import TelegramUIPreferences
import MergeLists

View File

@ -3,6 +3,7 @@ import UIKit
import SwiftSignalKit
import Postbox
import TelegramCore
import SyncCore
enum ChatListSelectionReadOption: Equatable {
case all(enabled: Bool)

View File

@ -5,6 +5,7 @@ import Postbox
import Display
import SwiftSignalKit
import TelegramCore
import SyncCore
import TelegramPresentationData
import ItemListUI
import PresentationDataUtils

View File

@ -1,6 +1,7 @@
import Foundation
import Postbox
import TelegramCore
import SyncCore
import TelegramPresentationData
import TelegramUIPreferences
import TelegramStringFormatting

View File

@ -4,6 +4,7 @@ import Display
import AsyncDisplayKit
import SwiftSignalKit
import TelegramCore
import SyncCore
import Postbox
import TelegramPresentationData
import TelegramUIPreferences

View File

@ -1,6 +1,7 @@
import Foundation
import Postbox
import TelegramCore
import SyncCore
import TelegramPresentationData
import MergeLists

View File

@ -1,6 +1,7 @@
import Foundation
import Postbox
import TelegramCore
import SyncCore
import SwiftSignalKit
import Display

View File

@ -3,6 +3,7 @@ import UIKit
import AsyncDisplayKit
import Postbox
import TelegramCore
import SyncCore
import Display
import SwiftSignalKit
import TelegramPresentationData

View File

@ -1,6 +1,7 @@
import Foundation
import Postbox
import TelegramCore
import SyncCore
import SwiftSignalKit
import Display
import MergeLists

View File

@ -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",

View File

@ -4,6 +4,7 @@ import Display
import SwiftSignalKit
import Postbox
import TelegramCore
import SyncCore
import TelegramPresentationData
import ItemListUI
import PresentationDataUtils

View File

@ -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",

View File

@ -5,6 +5,7 @@ import Postbox
import Display
import SwiftSignalKit
import TelegramCore
import SyncCore
import TelegramPresentationData
import AppBundle
import PhoneNumberFormat

View File

@ -5,6 +5,7 @@ import ContextUI
import AccountContext
import Postbox
import TelegramCore
import SyncCore
import Display
import AlertUI
import PresentationDataUtils

View File

@ -5,6 +5,7 @@ import AsyncDisplayKit
import SwiftSignalKit
import Postbox
import TelegramCore
import SyncCore
import TelegramPresentationData
import TelegramUIPreferences
import DeviceAccess

View File

@ -5,6 +5,7 @@ import AsyncDisplayKit
import Postbox
import SwiftSignalKit
import TelegramCore
import SyncCore
import TelegramPresentationData
import TelegramUIPreferences
import DeviceAccess

View File

@ -4,6 +4,7 @@ import AsyncDisplayKit
import UIKit
import Postbox
import TelegramCore
import SyncCore
import SwiftSignalKit
import TelegramPresentationData
import TelegramUIPreferences

View File

@ -5,6 +5,7 @@ import Display
import SwiftSignalKit
import Postbox
import TelegramCore
import SyncCore
import TelegramPresentationData
import TelegramUIPreferences
import MergeLists

View File

@ -5,6 +5,7 @@ import AsyncDisplayKit
import Postbox
import SwiftSignalKit
import TelegramCore
import SyncCore
import MessageUI
import TelegramPresentationData
import AccountContext

View File

@ -4,6 +4,7 @@ import AsyncDisplayKit
import UIKit
import Postbox
import TelegramCore
import SyncCore
import SwiftSignalKit
import TelegramPresentationData
import TelegramUIPreferences

View File

@ -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",

View File

@ -5,6 +5,7 @@ import Postbox
import Display
import SwiftSignalKit
import TelegramCore
import SyncCore
import TelegramPresentationData
import TelegramUIPreferences
import ItemListUI

View File

@ -6,6 +6,7 @@ import TelegramPresentationData
import TextSelectionNode
import ReactionSelectionNode
import TelegramCore
import SyncCore
import SwiftSignalKit
private let animationDurationFactor: Double = 1.0

View File

@ -3,6 +3,7 @@ import UIKit
import AsyncDisplayKit
import Display
import TelegramCore
import SyncCore
import TelegramPresentationData
import TelegramStringFormatting
import AppBundle

View File

@ -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