зеркало из https://github.com/mozilla/pjs.git
946 строки
26 KiB
C
946 строки
26 KiB
C
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
*
|
|
* The contents of this file are subject to the Netscape Public License
|
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
* http://www.mozilla.org/NPL/
|
|
*
|
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
* for the specific language governing rights and limitations under the
|
|
* NPL.
|
|
*
|
|
* The Initial Developer of this code under the NPL is Netscape
|
|
* Communications Corporation. Portions created by Netscape are
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
* Reserved.
|
|
*/
|
|
/**********************************************************************
|
|
e_kit_parser.c
|
|
By Daniel Malmer
|
|
**********************************************************************/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <ctype.h>
|
|
|
|
#include <errno.h>
|
|
#include <assert.h>
|
|
|
|
#include "xp_md5.h"
|
|
#include "sec.h"
|
|
|
|
#define OUTPUT_FILENAME "Netscape.lock"
|
|
|
|
static char buf[BUFSIZ];
|
|
|
|
int verbose = 0;
|
|
|
|
int fatal_errors = 0;
|
|
int lineno;
|
|
|
|
#define CHUNKSIZE 64;
|
|
|
|
char* output_buf = NULL;
|
|
int output_max_size = 0;
|
|
|
|
struct mapping;
|
|
|
|
typedef int validation_func(char*);
|
|
typedef void processing_func(struct mapping*, char*);
|
|
|
|
struct mapping {
|
|
char* token;
|
|
char* resource;
|
|
validation_func* validate;
|
|
processing_func* process;
|
|
char* desens[5];
|
|
};
|
|
|
|
extern void error(char*);
|
|
extern void warn(char*);
|
|
|
|
extern void default_handler(struct mapping*, char*);
|
|
extern void boolean_handler(struct mapping*, char*);
|
|
extern void menu_handler(struct mapping*, char*);
|
|
extern void proxy_handler(struct mapping*, char*);
|
|
extern void windoze_handler(struct mapping*, char*);
|
|
extern void mac_handler(struct mapping*, char*);
|
|
|
|
extern int boolean_validate(char*);
|
|
extern int number_validate(char*);
|
|
extern int user_agent_validate(char*);
|
|
extern int proxy_type_validate(char*);
|
|
|
|
extern void append_to_output_file(char*);
|
|
extern int matches(char* str1, char* str2);
|
|
|
|
struct proxy {
|
|
char* name;
|
|
char* resource;
|
|
char* host;
|
|
char* port;
|
|
};
|
|
|
|
struct proxy proxies[] = {
|
|
{"ftp_proxy", "ftp", NULL, NULL},
|
|
{"gopher_proxy", "gopher", NULL, NULL},
|
|
{"http_proxy", "http", NULL, NULL},
|
|
{"wais_proxy", "wais", NULL, NULL},
|
|
{"https_proxy", "https", NULL, NULL},
|
|
};
|
|
|
|
#define NUM_PROXIES (sizeof(proxies)/sizeof(proxies[0]))
|
|
|
|
struct mapping mappings[] = {
|
|
{"logo button url", ".logoButtonUrl", NULL, default_handler, {NULL}},
|
|
{"home page", ".homePage", NULL, default_handler,
|
|
{"*general_prefs*startupFrame*startupBox.home",
|
|
"*general_prefs*startupFrame*startupBox.blank",
|
|
"*general_prefs*startupFrame*startupBox.homeText",
|
|
}
|
|
},
|
|
{"nntp_server", ".nntpServer", NULL, default_handler,
|
|
{"*mailnews_prefs*newsFrame*newshostText"}
|
|
},
|
|
{"smtp_server", ".smtpServer", NULL, default_handler,
|
|
{"*mailnews_prefs*outMailFrame*smtpText"}
|
|
},
|
|
{"pop_server", ".popServer", NULL, default_handler,
|
|
{"*mailnews_prefs*inMailFrame*srvrText"}
|
|
},
|
|
{"autoload home page", ".autoloadHomePage", boolean_validate, default_handler,
|
|
{"*general_prefs*startupFrame*startupBox.home",
|
|
"*general_prefs*startupFrame*startupBox.blank"
|
|
}
|
|
},
|
|
{"leave on server", ".leaveOnServer", boolean_validate, boolean_handler,
|
|
{"*mailnews_prefs*inMailFrame*msgRemove",
|
|
"*mailnews_prefs*inMailFrame*msgLeave"
|
|
}
|
|
},
|
|
{"proxy type", ".proxyMode", proxy_type_validate, default_handler,
|
|
{"*network_prefs*proxiesFrame*manualToggle",
|
|
"*network_prefs*proxiesFrame*autoToggle",
|
|
"*network_prefs*proxiesFrame*noProxiesToggle"},
|
|
},
|
|
{"ftp_proxy", ".ftpProxy", NULL, proxy_handler, {NULL}},
|
|
{"gopher_proxy", ".gopherProxy", NULL, proxy_handler, {NULL}},
|
|
{"http_proxy", ".httpProxy", NULL, proxy_handler, {NULL}},
|
|
{"wais_proxy", ".waisProxy", NULL, proxy_handler, {NULL}},
|
|
{"https_proxy", ".httpsProxy", NULL, proxy_handler, {NULL}},
|
|
{"ftp_proxyport", ".ftpProxyPort", number_validate, proxy_handler, {NULL}},
|
|
{"gopher_proxyport", ".gopherProxyPort", number_validate, proxy_handler, {NULL}},
|
|
{"http_proxyport", ".httpProxyPort", number_validate, proxy_handler, {NULL}},
|
|
{"news_proxyport", ".newsProxyPort", number_validate, proxy_handler, {NULL}},
|
|
{"wais_proxyport", ".waisProxyPort", number_validate, proxy_handler, {NULL}},
|
|
{"https_proxyport", ".httpsProxyPort", number_validate, proxy_handler, {NULL}},
|
|
{"socks_server", ".socksServer", NULL, default_handler,
|
|
{"*proxiesFrame*socksText"}
|
|
},
|
|
{"socks_serverport", ".socksServerPort", number_validate, default_handler,
|
|
{"*proxiesFrame*socksPort"}
|
|
},
|
|
{"no_proxy", ".noProxy", NULL, default_handler,
|
|
{"*proxiesFrame*noText"}
|
|
},
|
|
{"auto config url", ".autoconfigUrl", NULL, default_handler,
|
|
{"*network_prefs*proxiesFrame*locationText"}
|
|
},
|
|
{"user agent", ".userAgent", user_agent_validate, default_handler, {NULL}},
|
|
{"x animation file", ".animationFile", NULL, default_handler, {NULL}},
|
|
{"button 1", "*urlBar*inetIndex.labelString", NULL, default_handler, {NULL}},
|
|
{"button 2", "*urlBar*inetWhite.labelString", NULL, default_handler, {NULL}},
|
|
{"button 3", "*urlBar*inetYellow.labelString", NULL, default_handler, {NULL}},
|
|
{"button 4", "*urlBar*whatsNew.labelString", NULL, default_handler, {NULL}},
|
|
{"button 5", "*urlBar*whatsCool.labelString", NULL, default_handler, {NULL}},
|
|
{"button 1 url", ".inetIndexBUrl", NULL, default_handler, {NULL}},
|
|
{"button 2 url", ".inetWhiteBUrl", NULL, default_handler, {NULL}},
|
|
{"button 3 url", ".inetYellowBUrl", NULL, default_handler, {NULL}},
|
|
{"button 4 url", ".whatsNewBUrl", NULL, default_handler, {NULL}},
|
|
{"button 5 url", ".whatsCoolBUrl", NULL, default_handler, {NULL}},
|
|
{"directory 1", "*menuBar*inetIndex", NULL, menu_handler, {NULL}},
|
|
{"directory 2", "*menuBar*inetWhite", NULL, menu_handler, {NULL}},
|
|
{"directory 3", "*menuBar*inetSearch", NULL, menu_handler, {NULL}},
|
|
{"directory 4", "*menuBar*whatsNew", NULL, menu_handler, {NULL}},
|
|
{"directory 5", "*menuBar*whatsCool", NULL, menu_handler, {NULL}},
|
|
{"directory 6", "*menuBar*directoryMenu6", NULL, menu_handler, {NULL}},
|
|
{"directory 7", "*menuBar*directoryMenu7", NULL, menu_handler, {NULL}},
|
|
{"directory 8", "*menuBar*directoryMenu8", NULL, menu_handler, {NULL}},
|
|
{"directory 9", "*menuBar*directoryMenu9", NULL, menu_handler, {NULL}},
|
|
{"directory 10", "*menuBar*directoryMenu10", NULL, menu_handler, {NULL}},
|
|
{"directory 11", "*menuBar*directoryMenu11", NULL, menu_handler, {NULL}},
|
|
{"directory 12", "*menuBar*directoryMenu12", NULL, menu_handler, {NULL}},
|
|
{"directory 13", "*menuBar*directoryMenu13", NULL, menu_handler, {NULL}},
|
|
{"directory 14", "*menuBar*directoryMenu14", NULL, menu_handler, {NULL}},
|
|
{"directory 15", "*menuBar*directoryMenu15", NULL, menu_handler, {NULL}},
|
|
{"directory 16", "*menuBar*directoryMenu16", NULL, menu_handler, {NULL}},
|
|
{"directory 17", "*menuBar*directoryMenu17", NULL, menu_handler, {NULL}},
|
|
{"directory 18", "*menuBar*directoryMenu18", NULL, menu_handler, {NULL}},
|
|
{"directory 19", "*menuBar*directoryMenu19", NULL, menu_handler, {NULL}},
|
|
{"directory 20", "*menuBar*directoryMenu20", NULL, menu_handler, {NULL}},
|
|
{"directory 21", "*menuBar*directoryMenu21", NULL, menu_handler, {NULL}},
|
|
{"directory 22", "*menuBar*directoryMenu22", NULL, menu_handler, {NULL}},
|
|
{"directory 23", "*menuBar*directoryMenu23", NULL, menu_handler, {NULL}},
|
|
{"directory 24", "*menuBar*directoryMenu24", NULL, menu_handler, {NULL}},
|
|
{"directory 25", "*menuBar*directoryMenu25", NULL, menu_handler, {NULL}},
|
|
{"directory 1 url", ".netscapeUrl", NULL, default_handler, {NULL}},
|
|
{"directory 2 url", ".whatsNewUrl", NULL, default_handler, {NULL}},
|
|
{"directory 3 url", ".whatsCoolUrl", NULL, default_handler, {NULL}},
|
|
{"directory 4 url", ".directoryMenu4Url", NULL, default_handler, {NULL}},
|
|
{"directory 5 url", ".galleriaUrl", NULL, default_handler, {NULL}},
|
|
{"directory 6 url", ".inetIndexUrl", NULL, default_handler, {NULL}},
|
|
{"directory 7 url", ".inetSearchUrl", NULL, default_handler, {NULL}},
|
|
{"directory 8 url", ".inetWhiteUrl", NULL, default_handler, {NULL}},
|
|
{"directory 9 url", ".inetAboutUrl", NULL, default_handler, {NULL}},
|
|
{"directory 10 url", ".directoryMenu10Url", NULL, default_handler, {NULL}},
|
|
{"directory 11 url", ".directoryMenu11Url", NULL, default_handler, {NULL}},
|
|
{"directory 12 url", ".directoryMenu12Url", NULL, default_handler, {NULL}},
|
|
{"directory 13 url", ".directoryMenu13Url", NULL, default_handler, {NULL}},
|
|
{"directory 14 url", ".directoryMenu14Url", NULL, default_handler, {NULL}},
|
|
{"directory 15 url", ".directoryMenu15Url", NULL, default_handler, {NULL}},
|
|
{"directory 16 url", ".directoryMenu16Url", NULL, default_handler, {NULL}},
|
|
{"directory 17 url", ".directoryMenu17Url", NULL, default_handler, {NULL}},
|
|
{"directory 18 url", ".directoryMenu18Url", NULL, default_handler, {NULL}},
|
|
{"directory 19 url", ".directoryMenu19Url", NULL, default_handler, {NULL}},
|
|
{"directory 20 url", ".directoryMenu20Url", NULL, default_handler, {NULL}},
|
|
{"directory 21 url", ".directoryMenu21Url", NULL, default_handler, {NULL}},
|
|
{"directory 22 url", ".directoryMenu22Url", NULL, default_handler, {NULL}},
|
|
{"directory 23 url", ".directoryMenu23Url", NULL, default_handler, {NULL}},
|
|
{"directory 24 url", ".directoryMenu24Url", NULL, default_handler, {NULL}},
|
|
{"directory 25 url", ".directoryMenu25Url", NULL, default_handler, {NULL}},
|
|
{"directory 1 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"directory 2 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"directory 3 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"directory 4 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"directory 5 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"directory 6 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"directory 7 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"directory 8 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"directory 9 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"directory 10 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"directory 11 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"directory 12 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"directory 13 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"directory 14 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"directory 15 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"directory 16 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"directory 17 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"directory 18 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"directory 19 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"directory 20 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"directory 21 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"directory 22 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"directory 23 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"directory 24 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"directory 25 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"help 1", "*menuBar*manual", NULL, menu_handler, {NULL}},
|
|
{"help 2", "*menuBar*relnotes", NULL, menu_handler, {NULL}},
|
|
{"help 3", "*menuBar*productInfo", NULL, menu_handler, {NULL}},
|
|
{"help 4", "*menuBar*feedback", NULL, menu_handler, {NULL}},
|
|
{"help 5", "*menuBar*intl", NULL, menu_handler, {NULL}},
|
|
{"help 6", "*menuBar*abourSecurity", NULL, menu_handler, {NULL}},
|
|
{"help 7", "*menuBar*helpMenu7", NULL, menu_handler, {NULL}},
|
|
{"help 8", "*menuBar*registration", NULL, menu_handler, {NULL}},
|
|
{"help 9", "*menuBar*upgrade", NULL, menu_handler, {NULL}},
|
|
{"help 10", "*menuBar*services", NULL, menu_handler, {NULL}},
|
|
{"help 11", "*menuBar*aboutUsenet", NULL, menu_handler, {NULL}},
|
|
{"help 12", "*menuBar*aboutPlugins", NULL, menu_handler, {NULL}},
|
|
{"help 13", "*menuBar*helpMenu13", NULL, menu_handler, {NULL}},
|
|
{"help 14", "*menuBar*helpMenu14", NULL, menu_handler, {NULL}},
|
|
{"help 15", "*menuBar*helpMenu15", NULL, menu_handler, {NULL}},
|
|
{"help 16", "*menuBar*helpMenu16", NULL, menu_handler, {NULL}},
|
|
{"help 17", "*menuBar*helpMenu17", NULL, menu_handler, {NULL}},
|
|
{"help 18", "*menuBar*helpMenu18", NULL, menu_handler, {NULL}},
|
|
{"help 19", "*menuBar*helpMenu19", NULL, menu_handler, {NULL}},
|
|
{"help 20", "*menuBar*helpMenu20", NULL, menu_handler, {NULL}},
|
|
{"help 21", "*menuBar*helpMenu21", NULL, menu_handler, {NULL}},
|
|
{"help 22", "*menuBar*helpMenu22", NULL, menu_handler, {NULL}},
|
|
{"help 23", "*menuBar*helpMenu23", NULL, menu_handler, {NULL}},
|
|
{"help 24", "*menuBar*helpMenu24", NULL, menu_handler, {NULL}},
|
|
{"help 25", "*menuBar*helpMenu25", NULL, menu_handler, {NULL}},
|
|
{"help 1 url", ".manualUrl", NULL, default_handler, {NULL}},
|
|
{"help 2 url", ".relnotesUrl", NULL, default_handler, {NULL}},
|
|
{"help 3 url", ".productInfoUrl", NULL, default_handler, {NULL}},
|
|
{"help 4 url", ".feedbackUrl", NULL, default_handler, {NULL}},
|
|
{"help 5 url", ".intlUrl", NULL, default_handler, {NULL}},
|
|
{"help 6 url", ".aboutSecurityUrl", NULL, default_handler, {NULL}},
|
|
{"help 7 url", ".helpMenu7Url", NULL, default_handler, {NULL}},
|
|
{"help 8 url", ".registrationUrl", NULL, default_handler, {NULL}},
|
|
{"help 9 url", ".upgradeUrl", NULL, default_handler, {NULL}},
|
|
{"help 10 url", ".servicesUrl", NULL, default_handler, {NULL}},
|
|
{"help 11 url", ".aboutUsenetUrl", NULL, default_handler, {NULL}},
|
|
{"help 12 url", ".aboutpluginsUrl", NULL, default_handler, {NULL}},
|
|
{"help 13 url", ".helpMenu13Url", NULL, default_handler, {NULL}},
|
|
{"help 14 url", ".helpMenu14Url", NULL, default_handler, {NULL}},
|
|
{"help 15 url", ".helpMenu15Url", NULL, default_handler, {NULL}},
|
|
{"help 16 url", ".helpMenu16Url", NULL, default_handler, {NULL}},
|
|
{"help 17 url", ".helpMenu17Url", NULL, default_handler, {NULL}},
|
|
{"help 18 url", ".helpMenu18Url", NULL, default_handler, {NULL}},
|
|
{"help 19 url", ".helpMenu19Url", NULL, default_handler, {NULL}},
|
|
{"help 20 url", ".helpMenu20Url", NULL, default_handler, {NULL}},
|
|
{"help 21 url", ".helpMenu21Url", NULL, default_handler, {NULL}},
|
|
{"help 22 url", ".helpMenu22Url", NULL, default_handler, {NULL}},
|
|
{"help 23 url", ".helpMenu23Url", NULL, default_handler, {NULL}},
|
|
{"help 24 url", ".helpMenu24Url", NULL, default_handler, {NULL}},
|
|
{"help 25 url", ".helpMenu25Url", NULL, default_handler, {NULL}},
|
|
{"help 1 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"help 2 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"help 3 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"help 4 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"help 5 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"help 6 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"help 7 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"help 8 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"help 9 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"help 10 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"help 11 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"help 12 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"help 13 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"help 14 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"help 15 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"help 16 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"help 17 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"help 18 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"help 19 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"help 20 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"help 21 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"help 22 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"help 23 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"help 24 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
{"help 25 prompt", NULL, NULL, windoze_handler, {NULL}},
|
|
};
|
|
|
|
#define NUM_MAPPINGS (sizeof(mappings)/sizeof(mappings[0]))
|
|
|
|
|
|
/*
|
|
* boolean_validate
|
|
*/
|
|
int
|
|
boolean_validate(char* arg)
|
|
{
|
|
if ( !matches(arg, "yes") &&
|
|
!matches(arg, "no") &&
|
|
!matches(arg, "true") &&
|
|
!matches(arg, "false") ) {
|
|
error("Valid values are 'yes', 'no', 'true' or 'false'.");
|
|
return 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
/*
|
|
* number_validate
|
|
*/
|
|
int
|
|
number_validate(char* arg)
|
|
{
|
|
char* ptr;
|
|
|
|
for ( ptr = arg; *ptr != '\0'; ptr++ ) {
|
|
if ( !isdigit(*ptr) ) {
|
|
error("Value must be a number.");
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
/*
|
|
* proxy_type_validate
|
|
*/
|
|
int
|
|
proxy_type_validate(char* arg)
|
|
{
|
|
if ( matches(arg, "none") ||
|
|
matches(arg, "0") ) {
|
|
strcpy(arg, "0");
|
|
return 1;
|
|
}
|
|
|
|
if ( matches(arg, "manual") ||
|
|
matches(arg, "1") ) {
|
|
strcpy(arg, "1");
|
|
return 1;
|
|
}
|
|
|
|
if ( matches(arg, "automatic") ||
|
|
matches(arg, "2") ) {
|
|
strcpy(arg, "2");
|
|
return 1;
|
|
}
|
|
|
|
error("Valid values are 'None', 'Manual', 'Automatic', or 0-2.");
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
/*
|
|
* user_agent_validate
|
|
*/
|
|
int
|
|
user_agent_validate(char* arg)
|
|
{
|
|
char* ptr;
|
|
|
|
if ( strlen(arg) > 10 ) {
|
|
error("User Agent strings are limited to 10 characters or less.");
|
|
return 0;
|
|
}
|
|
|
|
for ( ptr = arg; *ptr != '\0'; ptr++ ) {
|
|
if ( !isalnum(*ptr) && *ptr != '-' && *ptr != '_' ) {
|
|
error("User Agent strings consist of alphanumerics, '-', and '_'.");
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
/*
|
|
* usage
|
|
*/
|
|
void
|
|
usage(char* progname)
|
|
{
|
|
fprintf(stderr, "Usage: %s filename\n", progname);
|
|
}
|
|
|
|
|
|
/*
|
|
* warn
|
|
*/
|
|
void
|
|
warn(char* msg)
|
|
{
|
|
fprintf(stderr, "Warning: Line %d: %s\n", lineno, msg);
|
|
}
|
|
|
|
|
|
/*
|
|
* error
|
|
*/
|
|
void
|
|
error(char* msg)
|
|
{
|
|
fatal_errors++;
|
|
fprintf(stderr, "Error: Line %d: %s\n", lineno, msg);
|
|
}
|
|
|
|
|
|
/*
|
|
* is_blank
|
|
* Returns True if the line has nothing on it except for whitespace.
|
|
*/
|
|
int
|
|
is_blank(char* line)
|
|
{
|
|
assert(line);
|
|
|
|
while ( *line && isspace(*line) ) line++;
|
|
|
|
return ( *line == '\0' );
|
|
}
|
|
|
|
|
|
/*
|
|
* is_comment
|
|
* Returns True if the line is a comment.
|
|
* Comments begin with the '#' character.
|
|
* Comments can only appear on lines by themselves.
|
|
*/
|
|
int
|
|
is_comment(char* line)
|
|
{
|
|
assert(line);
|
|
|
|
while ( *line && isspace(*line) ) line++;
|
|
|
|
return ( *line == '#' );
|
|
}
|
|
|
|
|
|
/*
|
|
* is_section
|
|
*/
|
|
int
|
|
is_section(char* line)
|
|
{
|
|
for ( ; isspace(*line); line++ ) ;
|
|
|
|
if ( *line != '[' ) return 0;
|
|
|
|
for ( ; *line != ']' && *line != '\0'; line++ ) ;
|
|
|
|
if ( *line != ']' ) return 0;
|
|
|
|
for ( line++; *line != '\0'; line++ ) if (!isspace(*line)) return 0;
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
/*
|
|
* get_left_side
|
|
*/
|
|
char*
|
|
get_left_side(char* line)
|
|
{
|
|
char* left_side;
|
|
char* ptr;
|
|
|
|
assert(line);
|
|
|
|
if ( !strchr(line, '=') ) {
|
|
error("Missing '='.");
|
|
return NULL;
|
|
}
|
|
|
|
while ( *line && isspace(*line) ) line++;
|
|
|
|
left_side = strdup(line);
|
|
|
|
for ( ptr = strchr(left_side, '='); *ptr == '=' || isspace(*ptr); ptr-- ) {
|
|
*ptr = '\0';
|
|
}
|
|
|
|
return left_side;
|
|
}
|
|
|
|
|
|
/*
|
|
* get_right_side
|
|
*/
|
|
char*
|
|
get_right_side(char* line)
|
|
{
|
|
char* right_side;
|
|
char* ptr;
|
|
|
|
assert(line);
|
|
|
|
for ( ptr = strchr(line, '=') + 1; isspace(*ptr); ptr++ ) ;
|
|
|
|
right_side = ptr;
|
|
|
|
if ( right_side[0] != '\0' ) {
|
|
for ( ptr = strchr(right_side, '\0') - 1; isspace(*ptr); ptr-- ) {
|
|
*ptr = '\0';
|
|
}
|
|
}
|
|
|
|
if ( right_side[0] == '"' || *ptr == '"' ) {
|
|
if ( right_side[0] == '"' && *ptr == '"' ) {
|
|
right_side++;
|
|
*ptr = '\0';
|
|
} else {
|
|
error("Unbalanced quotation mark.");
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
return strdup(right_side);
|
|
}
|
|
|
|
|
|
/*
|
|
* default_handler
|
|
*/
|
|
void
|
|
default_handler(struct mapping* mapping, char* right_side)
|
|
{
|
|
int i;
|
|
assert(mapping);
|
|
|
|
sprintf(buf, "Netscape%s: %s\n", mapping->resource, right_side);
|
|
append_to_output_file(buf);
|
|
|
|
for ( i = 0; mapping->desens[i] != NULL; i++ ) {
|
|
sprintf(buf, "Netscape%s.sensitive: False\n", mapping->desens[i]);
|
|
append_to_output_file(buf);
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
* windoze_handler
|
|
*/
|
|
void
|
|
windoze_handler(struct mapping* mapping, char* right_side)
|
|
{
|
|
static int warned = 0;
|
|
|
|
if ( !warned ) {
|
|
warn("Menu prompts are ignored on this platform.");
|
|
warned = 1;
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
* mac_handler
|
|
*/
|
|
void
|
|
mac_handler(struct mapping* mapping, char* right_side)
|
|
{
|
|
warn("Ignoring rule used only on Macintosh platform.");
|
|
}
|
|
|
|
|
|
/*
|
|
* boolean_handler
|
|
* The right side has been validated, so it should only be
|
|
* 'yes', 'no', 'true', or 'false'.
|
|
*/
|
|
void
|
|
boolean_handler(struct mapping* mapping, char* right_side)
|
|
{
|
|
if ( matches(right_side, "true") || matches(right_side, "yes") ) {
|
|
default_handler(mapping, "True");
|
|
} else {
|
|
default_handler(mapping, "False");
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
* get_mnemonic
|
|
*/
|
|
char
|
|
get_mnemonic(char* str)
|
|
{
|
|
char mnemonic = '\0';
|
|
char* ptr;
|
|
|
|
for ( ptr = str; *ptr != '\0'; ptr++, str++ ) {
|
|
if ( *ptr == '&' ) {
|
|
ptr++;
|
|
if ( *ptr != '&' ) mnemonic = *ptr;
|
|
}
|
|
*str = *ptr;
|
|
}
|
|
|
|
*str = *ptr;
|
|
|
|
return mnemonic;
|
|
}
|
|
|
|
|
|
/*
|
|
* menu_handler
|
|
*/
|
|
void
|
|
menu_handler(struct mapping* mapping, char* right_side)
|
|
{
|
|
char mnemonic = get_mnemonic(right_side);
|
|
|
|
sprintf(buf, "Netscape%s.labelString: %s\n", mapping->resource, right_side);
|
|
append_to_output_file(buf);
|
|
|
|
if ( mnemonic ) {
|
|
sprintf(buf, "Netscape%s.mnemonic: %c\n", mapping->resource, mnemonic);
|
|
append_to_output_file(buf);
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
* proxy_handler
|
|
*/
|
|
void
|
|
proxy_handler(struct mapping* mapping, char* right_side)
|
|
{
|
|
int i;
|
|
|
|
for ( i = 0; i < NUM_PROXIES; i++ ) {
|
|
if ( strstr(mapping->token, proxies[i].name) ) {
|
|
if ( strstr(mapping->token, "proxyport") ) {
|
|
proxies[i].port = strdup(right_side);
|
|
} else {
|
|
proxies[i].host = strdup(right_side);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
* handle_rule
|
|
*/
|
|
void
|
|
handle_rule(struct mapping* mapping, char* line)
|
|
{
|
|
char* right_side = get_right_side(line);
|
|
|
|
if ( right_side == NULL ) return;
|
|
|
|
if ( mapping->validate == NULL || mapping->validate(right_side) == 1 ) {
|
|
assert(mapping->process);
|
|
mapping->process(mapping, right_side);
|
|
}
|
|
|
|
free(right_side);
|
|
}
|
|
|
|
|
|
/*
|
|
* matches
|
|
*/
|
|
int
|
|
matches(char* str1, char* str2)
|
|
{
|
|
assert(str1);
|
|
assert(str2);
|
|
|
|
for ( ; *str1 && *str2; str1++, str2++ ) {
|
|
if ( tolower(*str1) != tolower(*str2) ) return 0;
|
|
}
|
|
|
|
return ( *str1 == '\0' && *str2 == '\0' );
|
|
}
|
|
|
|
|
|
/*
|
|
* process_input_line
|
|
*/
|
|
void
|
|
process_input_line(char* line)
|
|
{
|
|
int i;
|
|
char* left_side;
|
|
|
|
if ( is_blank(line) ||
|
|
is_comment(line) ||
|
|
is_section(line) ) return;
|
|
|
|
*strchr(line, '\n') = '\0';
|
|
|
|
left_side = get_left_side(line);
|
|
if ( left_side == NULL ) return;
|
|
|
|
for ( i = 0; i < NUM_MAPPINGS; i++ ) {
|
|
if ( matches(left_side, mappings[i].token) ) {
|
|
handle_rule(&(mappings[i]), line);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( i == NUM_MAPPINGS ) {
|
|
sprintf(buf, "Unrecognized token '%s'.", left_side);
|
|
error(buf);
|
|
}
|
|
|
|
free(left_side);
|
|
}
|
|
|
|
|
|
/*
|
|
* append_to_output_file
|
|
*/
|
|
void
|
|
append_to_output_file(char* line)
|
|
{
|
|
while ( output_buf == NULL ||
|
|
strlen(output_buf) + strlen(line) >= output_max_size ) {
|
|
output_max_size+= CHUNKSIZE;
|
|
output_buf = (char*) realloc(output_buf, output_max_size);
|
|
}
|
|
|
|
strcat(output_buf, line);
|
|
}
|
|
|
|
|
|
/*
|
|
* obscure
|
|
*/
|
|
void
|
|
obscure(char* buf)
|
|
{
|
|
int i;
|
|
static int offset = 0;
|
|
int len = buf ? strlen(buf) : 0;
|
|
|
|
for ( i = 0; i < len; i++, offset++ ) {
|
|
buf[i]+= ( 40 + (offset % 10) );
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
* write_hash
|
|
*/
|
|
void
|
|
write_hash(FILE* file)
|
|
{
|
|
sprintf(buf, "! %s\n", XP_Md5PCPrintable(output_buf, strlen(output_buf)));
|
|
|
|
if ( verbose ) {
|
|
printf("Hash is '%s'", buf);
|
|
}
|
|
|
|
obscure(buf);
|
|
|
|
if ( fwrite(buf, sizeof(char), strlen(buf), file) != strlen(buf) ) {
|
|
perror("fwrite");
|
|
exit(errno);
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
* write_output_file
|
|
*/
|
|
void
|
|
write_output_file(void)
|
|
{
|
|
FILE* output_file;
|
|
|
|
if ( fatal_errors ) {
|
|
fprintf(stderr, "No output file created due to error%s.\n",
|
|
fatal_errors == 1 ? "" : "s");
|
|
return;
|
|
}
|
|
|
|
if ( output_buf == NULL ) return;
|
|
|
|
if ( (output_file = fopen(OUTPUT_FILENAME, "w")) == NULL ) {
|
|
perror(OUTPUT_FILENAME);
|
|
exit(errno);
|
|
}
|
|
|
|
write_hash(output_file);
|
|
|
|
obscure(output_buf);
|
|
|
|
if ( fwrite(output_buf, sizeof(char), strlen(output_buf), output_file) !=
|
|
strlen(output_buf) ) {
|
|
perror(OUTPUT_FILENAME);
|
|
exit(errno);
|
|
}
|
|
|
|
if ( fclose(output_file) == -1 ) {
|
|
perror(OUTPUT_FILENAME);
|
|
exit(errno);
|
|
}
|
|
|
|
fprintf(stderr, "Wrote '%s'\n", OUTPUT_FILENAME);
|
|
}
|
|
|
|
|
|
/*
|
|
* output_proxies
|
|
*/
|
|
void
|
|
output_proxies(void)
|
|
{
|
|
int i;
|
|
|
|
for ( i = 0; i < NUM_PROXIES; i++ ) {
|
|
if ( proxies[i].host && proxies[i].port ) {
|
|
sprintf(buf, "Netscape.%sProxy: %s:%s\n", proxies[i].resource,
|
|
proxies[i].host,
|
|
proxies[i].port);
|
|
append_to_output_file(buf);
|
|
|
|
sprintf(buf, "Netscape*proxiesBox*%sText.sensitive: False\n",
|
|
proxies[i].resource);
|
|
append_to_output_file(buf);
|
|
sprintf(buf, "Netscape*proxiesBox*%sPort.sensitive: False\n",
|
|
proxies[i].resource);
|
|
append_to_output_file(buf);
|
|
|
|
continue;
|
|
}
|
|
if ( proxies[i].host && !proxies[i].port ) {
|
|
sprintf(buf, "Specified %s without %s_port\n", proxies[i].name,
|
|
proxies[i].name);
|
|
error(buf);
|
|
}
|
|
if ( !proxies[i].host && proxies[i].port ) {
|
|
sprintf(buf, "Specified %s_port without %s\n", proxies[i].name,
|
|
proxies[i].name);
|
|
error(buf);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
* main
|
|
*/
|
|
int
|
|
main(int argc, char* argv[])
|
|
{
|
|
FILE* file;
|
|
char* filename;
|
|
|
|
switch ( argc ) {
|
|
case 2:
|
|
verbose = 0;
|
|
filename = argv[1];
|
|
break;
|
|
#ifdef DEBUG
|
|
case 3:
|
|
if ( !strcmp(argv[1], "-v") ) {
|
|
verbose = 1;
|
|
filename = argv[2];
|
|
} else {
|
|
usage(argv[0]);
|
|
exit(1);
|
|
}
|
|
break;
|
|
#endif
|
|
default:
|
|
usage(argv[0]);
|
|
exit(1);
|
|
break;
|
|
}
|
|
|
|
if ( (file = fopen(filename, "r")) == NULL ) {
|
|
perror(filename);
|
|
exit(errno);
|
|
}
|
|
|
|
append_to_output_file("! e-kit v2.0b1\n");
|
|
|
|
for ( lineno = 1; fgets(buf, sizeof(buf), file) != NULL; lineno++ ) {
|
|
if ( !strchr(buf, '\n') ) {
|
|
warn("Line too long. Ignored.");
|
|
} else {
|
|
process_input_line(buf);
|
|
}
|
|
}
|
|
|
|
output_proxies();
|
|
|
|
write_output_file();
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
#ifdef HPUX
|
|
/*
|
|
* pull_in_MD5_HashBuf
|
|
* Doesn't get linked in otherwise.
|
|
* You can use this if the '-u MD5_HashBuf' flag
|
|
* isn't supported.
|
|
*/
|
|
static void
|
|
pull_in_MD5_HashBuf(void)
|
|
{
|
|
MD5_HashBuf(0, 0, 0);
|
|
}
|
|
#endif
|
|
|
|
|