From 317e66ef116b15e854d25124c9e93f3d5cf6f680 Mon Sep 17 00:00:00 2001 From: "Jay Freeman (saurik)" Date: Thu, 24 Dec 2009 20:18:25 +0000 Subject: [PATCH] Upgraded to realistic CGI for PHP. --- LockScreen.mm | 63 +++++++++++++++++++++++++++++++++++++++------------ control | 2 +- makefile | 2 +- 3 files changed, 51 insertions(+), 16 deletions(-) diff --git a/LockScreen.mm b/LockScreen.mm index 5889908..ebe1631 100644 --- a/LockScreen.mm +++ b/LockScreen.mm @@ -986,51 +986,86 @@ MSHook(bool, _ZN7WebCore16MIMETypeRegistry29isSupportedJavaScriptMIMETypeERKNS_6 id client([self client]); NSURLRequest *request([self request]); NSURL *url([request URL]); - NSString *href([url absoluteString]); - NSString *path([href substringFromIndex:13]); - if (path == nil || ![path hasSuffix:@".php"]) + NSString *path([url path]); + if (path == nil || ![path hasSuffix:@".php"]) { [client URLProtocol:self didFailWithError:[NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorResourceUnavailable userInfo:nil]]; + return; + } NSFileManager *manager([NSFileManager defaultManager]); - if (![manager fileExistsAtPath:path]) + if (![manager fileExistsAtPath:path]) { [client URLProtocol:self didFailWithError:[NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorFileDoesNotExist userInfo:nil]]; + return; + } + + NSLog(@"%@::%@", path, [url query]); int fds[2]; _assert(pipe(fds) != -1); pid_t pid(fork()); if (pid == 0) { + setenv("GATEWAY_INTERFACE", "CGI/1.1", true); + setenv("SCRIPT_FILENAME", [path UTF8String], true); + NSString *query([url query]); + if (query != nil) + setenv("QUERY_STRING", [query UTF8String], true); + _assert(dup2(fds[1], 1) != -1); _assert(close(fds[0]) != -1); _assert(close(fds[1]) != -1); - execl("/usr/bin/php", "php", [path UTF8String], NULL); + + execl("/usr/bin/php-cgi", "php-cgi", NULL); exit(1); _assert(false); } _assert(close(fds[1]) != -1); - NSMutableData *data([NSMutableData dataWithCapacity:16*1024]); + CFHTTPMessageRef http(CFHTTPMessageCreateEmpty(kCFAllocatorDefault, FALSE)); + + CFHTTPMessageAppendBytes(http, (const uint8_t *) "HTTP/1.1 200 OK\r\n", 17); if (FILE *file = fdopen(fds[0], "r")) { - char buffer[16*1024]; + uint8_t buffer[16*1024]; read: size_t count(fread(buffer, 1, sizeof(buffer), file)); - if (count != 0) - [data appendBytes:buffer length:count]; + if (count != 0) { + fwrite(buffer, 1, count, stderr); + CFHTTPMessageAppendBytes(http, buffer, count); + } if (count == sizeof(buffer)) goto read; - if (ferror(file)) + if (ferror(file)) { [client URLProtocol:self didFailWithError:[NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorNetworkConnectionLost userInfo:nil]]; + fclose(file); + goto fail; + } fclose(file); } else _assert(close(fds[0])); - NSURLResponse *response([[[NSURLResponse alloc] initWithURL:[request URL] MIMEType:@"text/html" expectedContentLength:-1 textEncodingName:nil] autorelease]); + { + CFStringRef mime(CFHTTPMessageCopyHeaderFieldValue(http, CFSTR("Content-type"))); + if (mime == NULL) { + [client URLProtocol:self didFailWithError:[NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorBadServerResponse userInfo:nil]]; + goto fail; + } + + NSURLResponse *response([[[NSURLResponse alloc] initWithURL:[request URL] MIMEType:(NSString *)mime expectedContentLength:-1 textEncodingName:nil] autorelease]); + CFRelease(mime); + + [client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed]; + + CFDataRef data(CFHTTPMessageCopyBody(http)); + [client URLProtocol:self didLoadData:(NSData *)data]; + CFRelease(data); + + [client URLProtocolDidFinishLoading:self]; + } - [client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed]; - [client URLProtocol:self didLoadData:data]; - [client URLProtocolDidFinishLoading:self]; + fail: + CFRelease(http); } - (void) stopLoading { diff --git a/control b/control index 51914b9..bc539d2 100644 --- a/control +++ b/control @@ -3,7 +3,7 @@ Priority: optional Section: Development Maintainer: Jay Freeman (saurik) Architecture: iphoneos-arm -Version: 0.9.3098M-1 +Version: 0.9.3100-1 Description: framework for managing lock screen plugins Name: Cydget Depends: mobilesubstrate (>= 0.9.2587-1), firmware (>= 2.2), preferenceloader, apr-lib, pcre, cycript (>= 0.9.292-1) diff --git a/makefile b/makefile index 3acf1a1..bbb7b56 100644 --- a/makefile +++ b/makefile @@ -15,7 +15,7 @@ CydgetSettings: CydgetSettings.mm makefile ldid -S $@ WebCycriptLockScreen: LockScreen.mm makefile $(base)/../mobilesubstrate/substrate.h - $(target)g++ -F. -bundle -mthumb -g0 -O2 -Wall -Werror -o $@ $(filter %.mm,$^) -lobjc -I$(base)/../mobilesubstrate $(link) $(flags) -framework CoreGraphics -framework QuartzCore -framework SpringBoardUI -framework WebCore -framework GraphicsServices -framework TelephonyUI -I$(jscore) -iquote$(webcore)/{bindings/js,dom,loader,platform{,/animation,/cf,/network{,/cf},/text},/rendering/style} -iquote$(jscore)/{bytecode,debugger,interpreter,jit,parser,runtime} -lapr-1 -weak_reference_mismatches weak -framework JavaScriptCore -lpcre -DNDEBUG + $(target)g++ -F. -bundle -mthumb -g0 -O2 -Wall -Werror -o $@ $(filter %.mm,$^) -lobjc -I$(base)/../mobilesubstrate $(link) $(flags) -framework CoreGraphics -framework QuartzCore -framework SpringBoardUI -framework WebCore -framework GraphicsServices -framework TelephonyUI -I$(jscore) -iquote$(webcore)/{bindings/js,dom,loader,platform{,/animation,/cf,/network{,/cf},/text},/rendering/style} -iquote$(jscore)/{bytecode,debugger,interpreter,jit,parser,runtime} -lapr-1 -weak_reference_mismatches weak -framework JavaScriptCore -lpcre -DNDEBUG -framework CFNetwork ldid -S $@ extra: -- 2.45.2