/* * m a n i f e s t o _ x p i _ f n * * Called by pointer from SignArchive(), once for * each file within the directory. This function * is only used for adding to XPI compatible archive * */ static int manifesto_xpi_fn(char *relpath, char *basedir, char *reldir, char *filename, void *arg) { char fullname[FNSIZE]; int count; if (verbosity >= 0) { PR_fprintf(outputFD, "--> %s\n", relpath); } /* extension matching */ if (extensionsGiven) { char *ext = PL_strrchr(relpath, '.'); if (!ext) return 0; if (!PL_HashTableLookup(extensions, ext)) return 0; } count = snprintf(fullname, sizeof(fullname), "%s/%s", basedir, relpath); if (count >= sizeof(fullname)) { return 1; } JzipAdd(fullname, relpath, zipfile, compression_level); return 0; }
/* * S i g n A r c h i v e * * Sign an individual archive tree. A directory * called META-INF is created underneath this. * */ int SignArchive(char *tree, char *keyName, char *zip_file, int javascript, char *meta_file, char *install_script, int _optimize, PRBool recurse) { int status; char tempfn [FNSIZE], fullfn [FNSIZE]; int keyType = rsaKey; metafile = meta_file; optimize = _optimize; /* To create XPI compatible Archive manifesto() must be run before * the zipfile is opened. This is so the signed files are not added * the archive before the crucial rsa/dsa file*/ if (xpi_arc) { manifesto (tree, install_script, recurse); } if (zip_file) { zipfile = JzipOpen(zip_file, NULL /*no comment*/); } /*Sign and add files to the archive normally with manifesto()*/ if (!xpi_arc) { manifesto (tree, install_script, recurse); } if (keyName) { status = create_pk7 (tree, keyName, &keyType); if (status < 0) { PR_fprintf(errorFD, "the tree \"%s\" was NOT SUCCESSFULLY SIGNED\n", tree); errorCount++; exit (ERRX); } } /* Add the rsa/dsa file as the first file in the archive. This is crucial * for a XPInstall compatible archive */ if (xpi_arc) { if (verbosity >= 0) { PR_fprintf(outputFD, "%s \n", XPI_TEXT); } /* rsa/dsa to zip */ sprintf (tempfn, "META-INF/%s.%s", base, (keyType == dsaKey ? "dsa" : "rsa")); sprintf (fullfn, "%s/%s", tree, tempfn); JzipAdd(fullfn, tempfn, zipfile, compression_level); /* Loop through all files & subdirectories, add to archive */ foreach (tree, "", manifesto_xpi_fn, recurse, PR_FALSE /*include dirs */, (void * )NULL); } /* mf to zip */ strcpy (tempfn, "META-INF/manifest.mf"); sprintf (fullfn, "%s/%s", tree, tempfn); JzipAdd(fullfn, tempfn, zipfile, compression_level); /* sf to zip */ sprintf (tempfn, "META-INF/%s.sf", base); sprintf (fullfn, "%s/%s", tree, tempfn); JzipAdd(fullfn, tempfn, zipfile, compression_level); /* Add the rsa/dsa file to the zip archive normally */ if (!xpi_arc) { /* rsa/dsa to zip */ sprintf (tempfn, "META-INF/%s.%s", base, (keyType == dsaKey ? "dsa" : "rsa")); sprintf (fullfn, "%s/%s", tree, tempfn); JzipAdd(fullfn, tempfn, zipfile, compression_level); } JzipClose(zipfile); if (verbosity >= 0) { if (javascript) { PR_fprintf(outputFD, "jarfile \"%s\" signed successfully\n", zip_file); } else { PR_fprintf(outputFD, "tree \"%s\" signed successfully\n", tree); } } return 0; }
/* * m a n i f e s t o _ f n * * Called by pointer from manifesto(), once for * each file within the directory. * */ static int manifesto_fn (char *relpath, char *basedir, char *reldir, char *filename, void *arg) { int use_js; JAR_Digest dig; char fullname [FNSIZE]; if (verbosity >= 0) { PR_fprintf(outputFD, "--> %s\n", relpath); } /* extension matching */ if (extensionsGiven) { char *ext = PL_strrchr(relpath, '.'); if (!ext) return 0; if (!PL_HashTableLookup(extensions, ext)) return 0; } sprintf (fullname, "%s/%s", basedir, relpath); fprintf (mf, "\n"); use_js = 0; if (scriptdir && !PORT_Strcmp (scriptdir, reldir)) use_js++; /* sign non-.js files inside .arc directories using the javascript magic */ if ( (PL_strcaserstr(filename, ".js") != filename + strlen(filename) - 3) && (PL_strcaserstr(reldir, ".arc") == reldir + strlen(filename) - 4)) use_js++; if (use_js) { fprintf (mf, "Name: %s\n", filename); fprintf (mf, "Magic: javascript\n"); if (optimize == 0) fprintf (mf, "javascript.id: %s\n", filename); if (metafile) add_meta (mf, filename); } else { fprintf (mf, "Name: %s\n", relpath); if (metafile) add_meta (mf, relpath); } JAR_digest_file (fullname, &dig); if (optimize == 0) { fprintf (mf, "Digest-Algorithms: MD5 SHA1\n"); fprintf (mf, "MD5-Digest: %s\n", BTOA_DataToAscii (dig.md5, MD5_LENGTH)); } fprintf (mf, "SHA1-Digest: %s\n", BTOA_DataToAscii (dig.sha1, SHA1_LENGTH)); if (!use_js) { JzipAdd(fullname, relpath, zipfile, compression_level); } return 0; }