/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef SIGNTOOL_H
#define SIGNTOOL_H

#define DJN_TEST

#include <stdio.h>
#include <string.h>
#include <errno.h>

#include "prprf.h"
#include "prio.h"
#include "secutil.h"
#include "ocsp.h"
#include "jar.h"
#include "jarfile.h"
#include "secpkcs7.h"
#include "pk11func.h"
#include "secmod.h"
#include "plhash.h"
#include "nss.h"

#ifdef _UNIX
#include <unistd.h>
#endif

/**********************************************************************
 * General Defines
 */
#define JAR_BASE_END JAR_BASE + 100
#define ERRX (-1)  /* the exit code used on failure */
#define FNSIZE 256 /* the maximum length for filenames */
#define MAX_RSA_KEY_SIZE 4096
#define DEFAULT_RSA_KEY_SIZE 1024
#define MANIFEST "manifest.mf"
#define DEFAULT_X509_BASENAME "x509"
#define DEFAULT_COMMON_NAME "Signtool " NSS_VERSION " Testing Certificate"
#define CREATOR "Signtool (signtool " NSS_VERSION ")"
#define BREAKAGE "PLEASE DO NOT EDIT THIS FILE. YOU WILL BREAK IT."
#define MIN_COMPRESSION_LEVEL (-1)
#define MAX_COMPRESSION_LEVEL 9
#define DEFAULT_COMPRESSION_LEVEL (-1) /* zlib understands this to be default*/
#define STDIN_BUF_SIZE 160
#define PROGRAM_NAME "signtool"
#define LONG_PROGRAM_NAME "Signing Tool"
#define DEFAULT_BASE_NAME "zigbert"
#define TMP_OUTPUT "signtool.tmp"
#define XPI_TEXT "Creating XPI Compatible Archive"

/***************************************************************
 * Main Task Functions
 */
int GenerateCert(char *nickname, int keysize, char *token);
int ListCerts(char *key, int list_certs);
int VerifyJar(char *filename);
int SignArchive(char *tree, char *keyName, char *zip_file, int javascript,
                char *meta_file, char *install_script, int _optimize, PRBool recurse);
int SignAllArc(char *jartree, char *keyName, int javascript, char *metafile,
               char *install_script, int optimize, PRBool recurse);
int InlineJavaScript(char *dir, PRBool recurse);
int JarWho(char *filename);
void JarListModules(void);

/**************************************************************
 * Utility Functions
 */
CERTCertDBHandle *OpenCertDB(PRBool readOnly);

int RemoveAllArc(char *tree);
void VerifyCertDir(char *dir, char *keyName);
int InitCrypto(char *cert_dir, PRBool readOnly);
int foreach (char *dirname, char *prefix,
             int (*fn)(char *filename, char *dirname, char *basedir, char *base, void *arg),
             PRBool recurse, PRBool includeDirs, void *arg);
void print_error(int i);
void give_help(int status);
const char *secErrorString(long code);
void displayVerifyLog(CERTVerifyLog *log);
void Usage(void);
void LongUsage(void);
char *chop(char *);
void out_of_memory(void);
void FatalError(char *msg);
char *get_default_cert_dir(void);
SECItem *password_hardcode(void *arg, void *handle);
char *pk11_password_hardcode(PK11SlotInfo *slot, PRBool retry, void *arg);
int rm_dash_r(char *path);
char *pr_fgets(char *buf, int size, PRFileDesc *file);

/*****************************************************************
 * Global Variables (*gag*)
 */
extern char *password;           /* the password passed in on the command line */
extern PLHashTable *excludeDirs; /* directory entry to skip while recursing */
extern int no_time;
extern int xpi_arc;
extern char *base; /* basename of ".rsa" and ".sf" files */
extern long *mozilla_event_queue;
extern char *progName;          /* argv[0] */
extern PLHashTable *extensions; /* only sign files with this extension */
extern PRBool extensionsGiven;
extern char *scriptdir;
extern int compression_level;
extern PRFileDesc *outputFD, *errorFD;
extern int verbosity;
extern int errorCount;
extern int warningCount;
extern secuPWData pwdata;

#endif /* SIGNTOOL_H */
