Permalink
Browse files

Merge pull request #252 from Daij-Djan/master

appledoc now embeds the default templates, installing them on demand only! The CLI is completely self contained
  • Loading branch information...
2 parents 1029408 + 03adcda commit 23e98f6f04dfc3a1868e6845b2ddadf6296dc472 @tomaz committed Sep 25, 2012
View
Oops, something went wrong.
@@ -16,6 +16,8 @@
#import "GBApplicationSettingsProvider.h"
#import "GBAppledocApplication.h"
#import "DDXcodeProjectFile.h"
+#import "DDEmbeddedDataReader.h"
+#import "DDZipReader.h"
static NSString *kGBArgInputPath = @"input";
static NSString *kGBArgOutputPath = @"output";
@@ -422,6 +424,52 @@ - (void)validateSettingsAndArguments:(NSArray *)arguments {
}
}
+- (BOOL)extractShippedTemplatesToPath:(NSString *)path {
+ path = [path stringByExpandingTildeInPath];
+
+ //read embedded data
+ NSData *data = [DDEmbeddedDataReader embeddedDataFromSegment:@"__ZIP" inSection:@"__templates" error:nil];
+ if(!data) {
+ NSLog( @"Error: extractShippedTemplatesToPath called, but no data embeded" );
+ return NO;
+ }
+
+ //get a path
+ NSString *p = [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]];
+
+ //write the data
+ BOOL br = [data writeToFile:p atomically:NO];
+ if(!br) {
+ NSLog( @"Error: extractShippedTemplatesToPath failed write data to tmp path %@", p );
+ return NO;
+ }
+
+ //open the zip
+ DDZipReader *reader = [[DDZipReader alloc] init];
+ br = [reader openZipFile:p];
+ if(!br) {
+ NSLog( @"Error: extractShippedTemplatesToPath failed to open the zip at %@", p );
+ return NO;
+ }
+
+ //extract
+ br = [reader unzipFileTo:path flattenStructure:NO];
+ if(!br) {
+ NSLog( @"Error: extractShippedTemplatesToPath failed to unzip the zip from %@ TO %@", p, path );
+ return NO;
+ }
+
+ //close and remove the temp
+ [reader closeZipFile];
+ br = [[NSFileManager defaultManager] removeItemAtPath:p error:nil];
+ if(!br) {
+ NSLog( @"Error: extractShippedTemplatesToPath failed to rm %@", p );
+ return NO;
+ }
+
+ return YES;
+}
+
- (BOOL)validateTemplatesPath:(NSString *)path error:(NSError **)error {
// Validates the given templates path contains all required template files. If not, it returns the reason through the error argument and returns NO. Note that we only do simple "path exist and is directory" tests here, each object that requires templates at the given path will do it's own validation later on and will report errors if it finds something missing.
BOOL isDirectory = NO;
@@ -528,7 +576,7 @@ - (void)injectGlobalSettingsFromArguments:(NSArray *)arguments {
self.templatesFound = YES;
return;
}
-
+
#ifdef COMPILE_TIME_DEFAULT_TEMPLATE_PATH
path = COMPILE_TIME_DEFAULT_TEMPLATE_PATH;
if ([self validateTemplatesPath:path error:nil]) {
@@ -538,6 +586,18 @@ - (void)injectGlobalSettingsFromArguments:(NSArray *)arguments {
return;
}
#endif
+
+ //if we got here, there is NO templates installed which we can find.
+ //IF we have embedded data though, we can get THAT and install it
+ path = @"~/.appledoc";
+ [self extractShippedTemplatesToPath:path];
+ if ([self validateTemplatesPath:path error:nil]) {
+ [self overrideSettingsWithGlobalSettingsFromPath:path];
+ self.settings.templatesPath = path;
+ self.templatesFound = YES;
+ return;
+ }
+
}
}
@@ -0,0 +1,132 @@
+/* crypt.h -- base code for crypt/uncrypt ZIPfile
+
+
+ Version 1.01e, February 12th, 2005
+
+ Copyright (C) 1998-2005 Gilles Vollant
+
+ This code is a modified version of crypting code in Infozip distribution
+
+ The encryption/decryption parts of this source code (as opposed to the
+ non-echoing password parts) were originally written in Europe. The
+ whole source package can be freely distributed, including from the USA.
+ (Prior to January 2000, re-export from the US was a violation of US law.)
+
+ This encryption code is a direct transcription of the algorithm from
+ Roger Schlafly, described by Phil Katz in the file appnote.txt. This
+ file (appnote.txt) is distributed with the PKZIP program (even in the
+ version without encryption capabilities).
+
+ If you don't need crypting in your application, just define symbols
+ NOCRYPT and NOUNCRYPT.
+
+ This code support the "Traditional PKWARE Encryption".
+
+ The new AES encryption added on Zip format by Winzip (see the page
+ http://www.winzip.com/aes_info.htm ) and PKWare PKZip 5.x Strong
+ Encryption is not supported.
+*/
+
+#define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8))
+
+/***********************************************************************
+ * Return the next byte in the pseudo-random sequence
+ */
+static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab)
+{
+ unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an
+ * unpredictable manner on 16-bit systems; not a problem
+ * with any known compiler so far, though */
+
+ temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2;
+ return (int)(((temp * (temp ^ 1)) >> 8) & 0xff);
+}
+
+/***********************************************************************
+ * Update the encryption keys with the next byte of plain text
+ */
+static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int c)
+{
+ (*(pkeys+0)) = CRC32((*(pkeys+0)), c);
+ (*(pkeys+1)) += (*(pkeys+0)) & 0xff;
+ (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1;
+ {
+ register int keyshift = (int)((*(pkeys+1)) >> 24);
+ (*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift);
+ }
+ return c;
+}
+
+
+/***********************************************************************
+ * Initialize the encryption keys and the random header according to
+ * the given password.
+ */
+static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab)
+{
+ *(pkeys+0) = 305419896L;
+ *(pkeys+1) = 591751049L;
+ *(pkeys+2) = 878082192L;
+ while (*passwd != '\0') {
+ update_keys(pkeys,pcrc_32_tab,(int)*passwd);
+ passwd++;
+ }
+}
+
+#define zdecode(pkeys,pcrc_32_tab,c) \
+ (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab)))
+
+#define zencode(pkeys,pcrc_32_tab,c,t) \
+ (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c))
+
+#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED
+
+#define RAND_HEAD_LEN 12
+ /* "last resort" source for second part of crypt seed pattern */
+# ifndef ZCR_SEED2
+# define ZCR_SEED2 3141592654UL /* use PI as default pattern */
+# endif
+
+static int crypthead(passwd, buf, bufSize, pkeys, pcrc_32_tab, crcForCrypting)
+ const char *passwd; /* password string */
+ unsigned char *buf; /* where to write header */
+ int bufSize;
+ unsigned long* pkeys;
+ const unsigned long* pcrc_32_tab;
+ unsigned long crcForCrypting;
+{
+ int n; /* index in random header */
+ int t; /* temporary */
+ int c; /* random byte */
+ unsigned char header[RAND_HEAD_LEN-2]; /* random header */
+ static unsigned calls = 0; /* ensure different random header each time */
+
+ if (bufSize<RAND_HEAD_LEN)
+ return 0;
+
+ /* First generate RAND_HEAD_LEN-2 random bytes. We encrypt the
+ * output of rand() to get less predictability, since rand() is
+ * often poorly implemented.
+ */
+ if (++calls == 1)
+ {
+ srand((unsigned)(time(NULL) ^ ZCR_SEED2));
+ }
+ init_keys(passwd, pkeys, pcrc_32_tab);
+ for (n = 0; n < RAND_HEAD_LEN-2; n++)
+ {
+ c = (rand() >> 7) & 0xff;
+ header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t);
+ }
+ /* Encrypt random header (last two bytes is high word of crc) */
+ init_keys(passwd, pkeys, pcrc_32_tab);
+ for (n = 0; n < RAND_HEAD_LEN-2; n++)
+ {
+ buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t);
+ }
+ buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t);
+ buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t);
+ return n;
+}
+
+#endif
Oops, something went wrong.

0 comments on commit 23e98f6

Please sign in to comment.