|
@@ -14,6 +14,7 @@
|
|
|
#import "PureLayout.h"
|
|
|
#import "UIColor+Additions.h"
|
|
|
#import <CoreFoundation/CoreFoundation.h>
|
|
|
+#import "Reachability.h"
|
|
|
//electra
|
|
|
|
|
|
#import "NSTask.h"
|
|
@@ -128,6 +129,164 @@ bool jailbreak_has_run = false;
|
|
|
|
|
|
@implementation ViewController
|
|
|
|
|
|
+#define NB [NSBundle mainBundle]
|
|
|
+#define UD [NSUserDefaults standardUserDefaults]
|
|
|
+#define FM [NSFileManager defaultManager]
|
|
|
+#define LAST_UPDATE_CHECK @"lastSelfUpdateCheck"
|
|
|
+
|
|
|
+#define UPDATE_CHECK_FREQUENCY @"updateCheckFrequency"
|
|
|
+#define NOW_STRING [df stringFromDate:[NSDate date]]
|
|
|
+#define CHECK_FREQ [UD integerForKey:UPDATE_CHECK_FREQUENCY]
|
|
|
+
|
|
|
+- (void)_updateDateCheck
|
|
|
+{
|
|
|
+ NSDateFormatter *df = [[NSDateFormatter alloc] init];
|
|
|
+ [df setDateFormat:@"MMddyy_HHmmss"];
|
|
|
+ NSString *newDate = [df stringFromDate:[NSDate date]];
|
|
|
+ [UD setObject:newDate forKey:LAST_UPDATE_CHECK];
|
|
|
+}
|
|
|
+- (NSString *)_lastCheckDate
|
|
|
+{
|
|
|
+ return [UD objectForKey:LAST_UPDATE_CHECK];
|
|
|
+}
|
|
|
+
|
|
|
+- (NSString *)updatePlist {
|
|
|
+
|
|
|
+ return [[ViewController documentsFolder] stringByAppendingPathComponent:@"meridian.plist"];
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+-(BOOL)_shouldCheckUpdate
|
|
|
+{
|
|
|
+ // return true;
|
|
|
+
|
|
|
+ if (![FM fileExistsAtPath:[self updatePlist]])
|
|
|
+ {
|
|
|
+ return YES;
|
|
|
+ }
|
|
|
+
|
|
|
+ NSDateFormatter *df = [[NSDateFormatter alloc] init];
|
|
|
+ [df setDateFormat:@"MMddyy_HHmmss"];
|
|
|
+ NSDate *myDate = [df dateFromString: [self _lastCheckDate]];
|
|
|
+ NSDate *now = [df dateFromString:NOW_STRING];
|
|
|
+ double timeSinceDate = [now timeIntervalSinceDate:myDate];
|
|
|
+
|
|
|
+ double minutes = (timeSinceDate / 60);
|
|
|
+
|
|
|
+ NSLog(@"minutes: %g",minutes ); //minutes since check
|
|
|
+
|
|
|
+ if (minutes > CHECK_FREQ) //FIXME change to higher value!!!
|
|
|
+ {
|
|
|
+ [self _updateDateCheck];
|
|
|
+ return YES;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return NO;
|
|
|
+}
|
|
|
+
|
|
|
++ (NSString *)documentsFolder
|
|
|
+{
|
|
|
+ NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
|
|
|
+ return [paths objectAtIndex:0];
|
|
|
+}
|
|
|
+
|
|
|
+- (NSURL *)remotePathURL { return [NSURL URLWithString:@"https://nitosoft.com/ATV4/backr00m/meridian.plist"]; };
|
|
|
+
|
|
|
+//us.scw.afctwoadd
|
|
|
+
|
|
|
++ (void)validateFile:(NSString *)inputFile withChecksum:(NSString *)checksum completion:(void(^)(BOOL valid))completeBlock
|
|
|
+{
|
|
|
+ //LOG_SELF;
|
|
|
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
|
|
|
+ NSTask *sslTask = [[NSTask alloc] init];
|
|
|
+ NSPipe *sspipe = [[NSPipe alloc] init];
|
|
|
+ NSFileHandle *ssh = [sspipe fileHandleForReading];
|
|
|
+
|
|
|
+ [sslTask setLaunchPath:@"/usr/bin/openssl"];
|
|
|
+
|
|
|
+ [sslTask setArguments:[NSArray arrayWithObjects:@"sha1", inputFile, nil]];
|
|
|
+ [sslTask setStandardOutput:sspipe];
|
|
|
+ [sslTask setStandardError:sspipe];
|
|
|
+ [sslTask launch];
|
|
|
+
|
|
|
+ NSData *outData = [ssh readDataToEndOfFile];
|
|
|
+
|
|
|
+ [sslTask waitUntilExit];
|
|
|
+
|
|
|
+ NSString *outputString = [[[NSString alloc] initWithData:outData
|
|
|
+ encoding:NSASCIIStringEncoding]
|
|
|
+ stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
|
|
|
+
|
|
|
+ //example outputString: SHA1(~/Documents/Tether/AppleTV2,1_4.3_8F455_Restore.ipsw)= b6a2b0baae79daf95f75044c12946839c662d01d
|
|
|
+
|
|
|
+ //b6a2b0baae79daf95f75044c12946839c662d01d cleaned up
|
|
|
+ NSString *outputSHA = [[[outputString componentsSeparatedByString:@"="] lastObject] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ NSLog(@"sha1: %@ against: %@", outputSHA, checksum);
|
|
|
+ if ([outputSHA isEqualToString:checksum])
|
|
|
+ {
|
|
|
+ sslTask = nil;
|
|
|
+ sspipe = nil;
|
|
|
+ completeBlock(YES);
|
|
|
+ }
|
|
|
+ sslTask = nil;
|
|
|
+ sspipe = nil;
|
|
|
+ completeBlock(NO);
|
|
|
+ });
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+- (void)checkForUpdate //change update check to look for a typedef int rather than bool, then we can say 0 == update nitotv 1 = update essential 2 = both -1 = none?
|
|
|
+{
|
|
|
+ @autoreleasepool {
|
|
|
+ if ([self _shouldCheckUpdate] == FALSE)
|
|
|
+ {
|
|
|
+ NSLog(@"checked within the last %li minutes!!!", (long)CHECK_FREQ);
|
|
|
+ //return nil;
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ BOOL internetAvailable = [Reachability isInternetReachable];
|
|
|
+ if (internetAvailable == TRUE)
|
|
|
+ {
|
|
|
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
|
|
|
+ NSDictionary *theDict = [NSDictionary dictionaryWithContentsOfURL:[self remotePathURL]];
|
|
|
+
|
|
|
+ //lastUpdated
|
|
|
+ //bootstrapInfo
|
|
|
+ //meridianToolsInfo
|
|
|
+ //electraToolsInfo
|
|
|
+
|
|
|
+ //version
|
|
|
+ //link
|
|
|
+ //SHA1
|
|
|
+
|
|
|
+ NSLog(@"science bro: %@", theDict);
|
|
|
+
|
|
|
+ });
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+// NSArray *updateArray = [packageManagement basicEssentialUpdatesAvailable];
|
|
|
+// if ([updateArray count] > 0)
|
|
|
+// {
|
|
|
+// [[NSNotificationCenter defaultCenter] postNotificationName:@"CheckForUpdate" object:updateArray userInfo:nil];
|
|
|
+// //return updateArray;
|
|
|
+// }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //return nil;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+- (void)checkForUpdatedPayloads {
|
|
|
+
|
|
|
+
|
|
|
+}
|
|
|
|
|
|
+ (instancetype)currentViewController {
|
|
|
return currentViewController;
|
|
@@ -581,7 +740,7 @@ bool jailbreak_has_run = false;
|
|
|
|
|
|
//if you want to run anything post process on device you can do it here for diagnostic purposes.
|
|
|
|
|
|
- /*
|
|
|
+
|
|
|
execprog("/bin/ps", (const char **)&(const char *[]) {
|
|
|
"/bin/ps",
|
|
|
"awwwx",
|
|
@@ -591,10 +750,10 @@ bool jailbreak_has_run = false;
|
|
|
execprog("/usr/bin/ls", (const char **)&(const char *[]) {
|
|
|
"/usr/bin/ls",
|
|
|
"-alR",
|
|
|
- "/private/etc",
|
|
|
+ "/usr",
|
|
|
NULL
|
|
|
});
|
|
|
- */
|
|
|
+
|
|
|
/*
|
|
|
execprog("/bin/bash", (const char **)&(const char *[]) {
|
|
|
"/bin/bash",
|