mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-01 14:45:29 +00:00
325 lines
7.2 KiB
C
325 lines
7.2 KiB
C
/* -*- Mode: C; tab-width: 4; 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.
|
|
*/
|
|
|
|
#include "cvjscfg.h"
|
|
#include "cvsimple.h"
|
|
#include "prefapi.h"
|
|
#include "mkutils.h"
|
|
#include "netutils.h"
|
|
#include "xpgetstr.h"
|
|
#include "jsapi.h"
|
|
#include "fe_proto.h"
|
|
|
|
static XP_Bool m_GettingConfigFile = FALSE;
|
|
static XP_Bool m_FindProxyInJSC = FALSE;
|
|
static XP_Bool m_TimesUp = FALSE;
|
|
|
|
extern int XP_CONFIG_BLAST_WARNING;
|
|
extern int XP_RECEIVING_PROXY_AUTOCFG;
|
|
extern int XP_AUTOADMIN_MISSING;
|
|
extern int XP_BAD_AUTOCONFIG_NO_FAILOVER;
|
|
extern int XP_GLOBAL_EVEN_SAVED_IS_BAD;
|
|
extern int XP_CONF_LOAD_FAILED_USE_PREV;
|
|
|
|
extern void NET_DisableGetURL(void);
|
|
|
|
PRIVATE int jsc_try_failover(MWContext*);
|
|
PRIVATE XP_Bool jsc_check_for_find_proxy(void);
|
|
extern XP_Bool NET_InitPacfContext(void);
|
|
|
|
PRIVATE void AutoAdminRefreshCallback(void *closure)
|
|
{
|
|
NET_DownloadAutoAdminCfgFile();
|
|
}
|
|
|
|
|
|
/*
|
|
* pref_DownloadDone
|
|
* Sets 'm_GettingConfigFile' to FALSE, and registers a timeout for
|
|
* jsc file polling.
|
|
*/
|
|
PRIVATE void
|
|
pref_DownloadDone(URL_Struct* URL_s, int status, MWContext* window_id)
|
|
{
|
|
int32 minutes = 0;
|
|
|
|
/* Might have been cancelled by a timeout */
|
|
if ( m_GettingConfigFile == FALSE ) {
|
|
return;
|
|
}
|
|
|
|
m_GettingConfigFile = FALSE;
|
|
|
|
if (URL_s->server_status == 0) {
|
|
jsc_try_failover(window_id);
|
|
m_FindProxyInJSC = jsc_check_for_find_proxy();
|
|
}
|
|
|
|
PREF_GetConfigInt("autoadmin.refresh_interval", &minutes);
|
|
if ( minutes > 0 ) {
|
|
FE_SetTimeout((TimeoutCallbackFunction) AutoAdminRefreshCallback,
|
|
NULL, minutes * 60 * 1000);
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
* AutoAdminTimeoutCallback
|
|
*/
|
|
PRIVATE void
|
|
AutoAdminTimeoutCallback(void *closure)
|
|
{
|
|
m_TimesUp = TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
* PREF_DownloadConfigFile
|
|
* Get the global config file and execute it.
|
|
* Called at startup, and at the interval specified by
|
|
* "autoadmin.refresh_interval".
|
|
* The first time we get this file, we need to loop over FEU_StayingAlive().
|
|
* After that, the main event loop will be happening, so we don't loop
|
|
* ourselves, or we'd freeze up the browser.
|
|
*/
|
|
PUBLIC void
|
|
NET_DownloadAutoAdminCfgFile()
|
|
{
|
|
#ifndef MODULAR_NETLIB
|
|
static XP_Bool first_time = TRUE;
|
|
XP_Bool append_email;
|
|
char* email_addr;
|
|
char* url = NULL;
|
|
MWContext* context;
|
|
|
|
#ifdef MOZ_OFFLINE
|
|
if ( NET_IsOffline() ) return;
|
|
#endif
|
|
|
|
if(first_time)
|
|
context = FE_GetInitContext();
|
|
else
|
|
context = XP_FindSomeContext();
|
|
|
|
if ( first_time && (NET_InitPacfContext() == FALSE) ) return;
|
|
|
|
PREF_CopyConfigString("autoadmin.global_config_url", &url);
|
|
|
|
if (( url == NULL ) || (!(*url))) {
|
|
return;
|
|
}
|
|
|
|
if ( !PREF_IsAutoAdminEnabled() ) {
|
|
XP_Bool failover = FALSE;
|
|
PREF_GetConfigBool("autoadmin.failover_to_cached", &failover);
|
|
if ( failover == FALSE ) {
|
|
NET_DisableGetURL();
|
|
}
|
|
FE_Alert(context, XP_GetString(XP_AUTOADMIN_MISSING));
|
|
return;
|
|
}
|
|
|
|
PREF_GetConfigBool("autoadmin.append_emailaddr", &append_email);
|
|
if ( append_email ) {
|
|
StrAllocCat(url, "?");
|
|
PREF_CopyCharPref("mail.identity.useremail", &email_addr);
|
|
if ( email_addr ) {
|
|
StrAllocCat(url, email_addr);
|
|
XP_FREE(email_addr);
|
|
}
|
|
}
|
|
|
|
if ( url && *url ) {
|
|
URL_Struct* url_s = NET_CreateURLStruct(url, NET_SUPER_RELOAD);
|
|
|
|
NET_GetURL(url_s, FO_JAVASCRIPT_CONFIG, context, pref_DownloadDone);
|
|
|
|
m_GettingConfigFile = TRUE;
|
|
|
|
if ( first_time ) {
|
|
int32 seconds;
|
|
first_time = FALSE;
|
|
/* Timeout so we don't hang here */
|
|
PREF_GetConfigInt("autoadmin.timeout", &seconds);
|
|
if ( seconds > 0 ) {
|
|
FE_SetTimeout((TimeoutCallbackFunction) AutoAdminTimeoutCallback,
|
|
NULL, seconds * 1000);
|
|
}
|
|
while ( m_GettingConfigFile && !m_TimesUp ) {
|
|
FEU_StayingAlive();
|
|
}
|
|
if ( m_TimesUp ) {
|
|
/* Give up, cause jsc download to fail */
|
|
pref_DownloadDone(url_s, 0, context);
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
|
|
|
|
/*
|
|
* jsc_save
|
|
*/
|
|
PRIVATE void
|
|
jsc_save_config(char* bytes, int32 num_bytes)
|
|
{
|
|
XP_File fp;
|
|
|
|
if ( bytes == NULL || num_bytes <= 0 ) return;
|
|
|
|
if( (fp = XP_FileOpen("", xpJSConfig, XP_FILE_WRITE)) == NULL ) return;
|
|
|
|
XP_FileWrite(bytes, num_bytes, fp);
|
|
XP_FileClose(fp);
|
|
}
|
|
|
|
|
|
/*
|
|
* jsc_try_failover
|
|
*/
|
|
PRIVATE int
|
|
jsc_try_failover(MWContext* w)
|
|
{
|
|
XP_Bool failover;
|
|
char* bytes = NULL;
|
|
int32 num_bytes;
|
|
XP_StatStruct st;
|
|
XP_File fp = NULL;
|
|
|
|
PREF_GetConfigBool("autoadmin.failover_to_cached", &failover);
|
|
|
|
if ( failover == FALSE ) {
|
|
FE_Alert(w, XP_GetString(XP_BAD_AUTOCONFIG_NO_FAILOVER));
|
|
NET_DisableGetURL();
|
|
return -1;
|
|
}
|
|
|
|
if ( !FE_Confirm(w, XP_GetString(XP_CONF_LOAD_FAILED_USE_PREV)) ) return -1;
|
|
|
|
if (XP_Stat("", &st, xpJSConfig) == -1) goto failed;
|
|
|
|
if ( (fp = XP_FileOpen("", xpJSConfig, XP_FILE_READ)) == NULL ) goto failed;
|
|
|
|
num_bytes = st.st_size;
|
|
|
|
if ( num_bytes <= 0 ) goto failed;
|
|
|
|
bytes = (char *)XP_ALLOC(num_bytes + 1);
|
|
|
|
if ( bytes == NULL ) goto failed;
|
|
|
|
if ( (num_bytes = XP_FileRead(bytes, num_bytes, fp)) <= 0 ) goto failed;
|
|
|
|
bytes[num_bytes] = '\0';
|
|
|
|
#ifdef NEW_PREF_ARCH
|
|
if ( !PREF_EvaluateConfigScript(bytes, num_bytes, NULL, TRUE, TRUE, FALSE) )goto failed;
|
|
#else
|
|
if ( !PREF_EvaluateConfigScript(bytes, num_bytes, NULL, TRUE, TRUE) )goto failed;
|
|
#endif
|
|
|
|
XP_FileClose(fp);
|
|
XP_FREEIF(bytes);
|
|
|
|
return 0;
|
|
|
|
failed:
|
|
FE_Alert(w, XP_GetString(XP_GLOBAL_EVEN_SAVED_IS_BAD));
|
|
if ( fp != NULL ) XP_FileClose(fp);
|
|
XP_FREEIF(bytes);
|
|
return -1;
|
|
}
|
|
|
|
|
|
/*
|
|
* jsc_check_for_find_proxy
|
|
*/
|
|
PRIVATE XP_Bool
|
|
jsc_check_for_find_proxy(void)
|
|
{
|
|
JSObject* globalConfig;
|
|
JSContext* configContext;
|
|
char buf[1024];
|
|
JSBool ok;
|
|
jsval rv;
|
|
|
|
PREF_GetConfigContext(&configContext);
|
|
PREF_GetGlobalConfigObject(&globalConfig);
|
|
|
|
XP_SPRINTF(buf, "typeof(ProxyConfig.FindProxyForURL) == \"function\"");
|
|
ok = JS_EvaluateScript(configContext, globalConfig, buf, strlen(buf), 0, 0,
|
|
&rv);
|
|
|
|
return (ok && JSVAL_IS_BOOLEAN(rv) && JSVAL_TO_BOOLEAN(rv) == JS_TRUE);
|
|
}
|
|
|
|
|
|
/*
|
|
* jsc_complete
|
|
*/
|
|
PRIVATE void
|
|
jsc_complete(void* bytes, int32 num_bytes)
|
|
{
|
|
#ifdef DEBUG_malmer
|
|
extern FILE* real_stderr;
|
|
|
|
fwrite(bytes, sizeof(char), num_bytes, real_stderr);
|
|
#endif
|
|
|
|
if ( bytes ) {
|
|
#ifdef NEW_PREF_ARCH
|
|
PREF_EvaluateConfigScript(bytes, num_bytes, NULL, TRUE, TRUE, FALSE);
|
|
#else
|
|
PREF_EvaluateConfigScript(bytes, num_bytes, NULL, TRUE, TRUE);
|
|
#endif
|
|
} else {
|
|
/* If failover is ok, read the local cached config */
|
|
}
|
|
|
|
/* Need to hash and save to disk here */
|
|
}
|
|
|
|
|
|
/*
|
|
* NET_JavascriptConfig
|
|
*/
|
|
MODULE_PRIVATE NET_StreamClass*
|
|
NET_JavascriptConfig(int fmt, void* data_obj, URL_Struct* URL_s, MWContext* w)
|
|
{
|
|
if ( URL_s == NULL || URL_s->address == NULL ) {
|
|
return NULL;
|
|
}
|
|
|
|
NET_Progress(w, XP_GetString(XP_RECEIVING_PROXY_AUTOCFG));
|
|
|
|
return NET_SimpleStream(fmt, (void*) jsc_complete, URL_s, w);
|
|
}
|
|
|
|
|
|
/*
|
|
* NET_FindProxyInJSC
|
|
*/
|
|
MODULE_PRIVATE XP_Bool
|
|
NET_FindProxyInJSC(void)
|
|
{
|
|
return m_FindProxyInJSC;
|
|
}
|
|
|
|
|