Skip to content

Commit

Permalink
Merge pull request tomaz#252 from Daij-Djan/master
Browse files Browse the repository at this point in the history
appledoc now embeds the default templates, installing them on demand only! The CLI is completely self contained
  • Loading branch information
tomaz committed Sep 25, 2012
2 parents 1029408 + 03adcda commit 23e98f6
Show file tree
Hide file tree
Showing 24 changed files with 5,828 additions and 55 deletions.
460 changes: 431 additions & 29 deletions AppledocSettings.plist

Large diffs are not rendered by default.

62 changes: 61 additions & 1 deletion Application/GBAppledocApplication.m
Expand Up @@ -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";
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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]) {
Expand All @@ -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;
}

}
}

Expand Down
132 changes: 132 additions & 0 deletions Common/ThirdParty/DDMinizip/other/crypt.h
@@ -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

0 comments on commit 23e98f6

Please sign in to comment.