/*
* Extract variables from the URL.
*/
-void addurls(StrBuf *url)
+void ParseURLParams(StrBuf *url)
{
const char *aptr, *bptr, *eptr, *up;
-/// char *buf;
int len, keylen;
urlcontent *u;
struct wcsession *WCC = WC;
if (WCC->urlstrings == NULL)
WCC->urlstrings = NewHash(1, NULL);
-// buf = (char*) malloc (ulen + 1);
-// memcpy(buf, url, ulen);
-/// buf[ulen] = '\0';
eptr = ChrPtr(url) + StrLength(url);
up = ChrPtr(url);
while ((up < eptr) && (!IsEmptyStr(up))) {
while ((aptr < eptr) && (*aptr != '\0') && (*aptr != '='))
aptr++;
if (*aptr != '=') {
- ///free(buf);
return;
}
- ///*aptr = '\0';
aptr++;
bptr = aptr;
while ((bptr < eptr) && (*bptr != '\0')
&& (*bptr != '&') && (*bptr != '?') && (*bptr != ' ')) {
bptr++;
}
- //*bptr = '\0';
keylen = aptr - up - 1; /* -1 -> '=' */
if(keylen > sizeof(u->url_key)) {
lprintf(1, "URLkey to long! [%s]", up);
up = bptr;
++up;
#ifdef DEBUG_URLSTRINGS
- lprintf(9, "%s = [%ld] %s\n", u->url_key, u->url_data_size, ChrPtr(u->url_data));
+ lprintf(9, "%s = [%ld] %s\n",
+ u->url_key,
+ StrLength(u->url_data),
+ ChrPtr(u->url_data));
#endif
}
- //free(buf);
}
/*
}
+void tmplput_trailing_javascript(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *vContext, int ContextType)
+{
+ struct wcsession *WCC = WC;
+
+ if (WCC != NULL)
+ StrBufAppendTemplate(Target, nArgs, Tokens, vContext, ContextType,
+ WCC->trailing_javascript, 0);
+}
+
/*
* wrap up an HTTP session, closes tags, etc.
*
* print_standard_html_footer should be set to:
- * 0 to transmit only,
- * 1 to append the main menu and closing tags,
- * 2 to append the closing tags only.
+ * 0 - to transmit only,
+ * nonzero - to append the closing tags
*/
void wDumpContent(int print_standard_html_footer)
{
if (print_standard_html_footer) {
- wprintf("</div>\n"); /* end of "text" div */
+ wprintf("</div> <!-- end of 'content' div -->\n");
do_template("trailing", NULL);
}
*/
void msgescputs1( char *strbuf)
{
- StrBuf *OutBuf = NewStrBuf();
+ StrBuf *OutBuf;
if ((strbuf == NULL) || IsEmptyStr(strbuf))
return;
+ OutBuf = NewStrBuf();
StrMsgEscAppend(OutBuf, NULL, strbuf);
StrEscAppend(WC->WBuf, OutBuf, NULL, 0, 0);
FreeStrBuf(&OutBuf);
if (do_htmlhead) {
begin_burst();
- if (!access("static.local/webcit.css", R_OK)) {
- svprintf(HKEY("CSSLOCAL"), WCS_STRING,
- "<link href=\"static.local/webcit.css\" rel=\"stylesheet\" type=\"text/css\">"
- );
- }
do_template("head", NULL);
}
void http_transmit_thing(const char *content_type,
int is_static) {
+#ifndef TECH_PREVIEW
+ lprintf(9, "http_transmit_thing(%s)%s\n",
+ content_type,
+ (is_static ? " (static)" : "")
+ );
+#endif
output_headers(0, 0, 0, 0, 0, is_static);
hprintf("Content-type: %s\r\n"
long i;
svput("BOXTITLE", WCS_STRING, Title);
- do_template("beginbox", NULL);
+ do_template("beginboxx", NULL);
wprintf("<ul class=\"%s\">", Class);
close(fd);
+#ifndef TECH_PREVIEW
lprintf(9, "output_static('%s') %s\n", what, content_type);
+#endif
http_transmit_thing(content_type, 1);
}
if (yesbstr("force_close_session")) {
free(photosrc);
}
+/*
+ * Generic function to output an arbitrary MIME attachment from
+ * message being composed
+ *
+ * partnum The MIME part to be output
+ * filename Fake filename to give
+ * force_download Nonzero to force set the Content-Type: header to "application/octet-stream"
+ */
+void postpart(StrBuf *partnum, StrBuf *filename, int force_download)
+{
+ void *vPart;
+ char content_type[256];
+ wc_attachment *part;
+
+ if (GetHash(WC->attachments, SKEY(partnum), &vPart) &&
+ (vPart != NULL)) {
+ part = (wc_attachment*) vPart;
+ if (force_download) {
+ strcpy(content_type, "application/octet-stream");
+ }
+ else {
+ strncpy(content_type, ChrPtr(part->content_type), sizeof content_type);
+ }
+ output_headers(0, 0, 0, 0, 0, 0);
+ StrBufAppendBufPlain(WC->WBuf, part->data, part->length, 0);
+ http_transmit_thing(content_type, 0);
+ } else {
+ hprintf("HTTP/1.1 404 %s\n", ChrPtr(partnum));
+ output_headers(0, 0, 0, 0, 0, 0);
+ hprintf("Content-Type: text/plain\r\n");
+ wprintf(_("An error occurred while retrieving this part: %s/%s\n"),
+ ChrPtr(partnum), ChrPtr(filename));
+ end_burst();
+ }
+}
+
+
/*
* Generic function to output an arbitrary MIME part from an arbitrary
* message number on the server.
}
}
+/*
+ * Read any MIME part of a message, from the server, into memory.
+ */
+void MimeLoadData(wc_mime_attachment *Mime)
+{
+ char buf[SIZ];
+ off_t bytes;
+//// TODO: is there a chance the contenttype is different to the one we know?
+ serv_printf("DLAT %ld|%s", Mime->msgnum, ChrPtr(Mime->PartNum));
+ serv_getln(buf, sizeof buf);
+ if (buf[0] == '6') {
+ bytes = extract_long(&buf[4], 0);
+
+ if (Mime->Data == NULL)
+ Mime->Data = NewStrBufPlain(NULL, bytes);
+ StrBuf_ServGetBLOB(Mime->Data, bytes);
+
+ }
+ else {
+ FlushStrBuf(Mime->Data);
+ /// TODO XImportant message
+ }
+}
+
/*
* Convenience functions to display a page containing only a string
const StrBuf *Tmpl = sbstr("template");
begin_burst();
output_headers(1, 0, 0, 0, 1, 0);
- DoTemplate(ChrPtr(Tmpl), StrLength(Tmpl), NULL, NULL);
+ DoTemplate(ChrPtr(Tmpl), StrLength(Tmpl), NULL, NULL, 0);
end_burst();
}
/*
* Offer to make any page the user's "start page."
*/
-void offer_start_page(void) {
+void offer_start_page(StrBuf *Target, int nArgs, WCTemplateToken *Token, void *Context, int ContextType) {
wprintf("<a href=\"change_start_page?startpage=");
urlescputs(WC->this_page);
wprintf("\">");
* cbcharset Character set
* length Content length
* encoding MIME encoding type (not needed)
+ * cbid Content ID (not needed)
* userdata Not used here
*/
void upload_handler(char *name, char *filename, char *partnum, char *disp,
void *content, char *cbtype, char *cbcharset,
- size_t length, char *encoding, void *userdata)
+ size_t length, char *encoding, char *cbid, void *userdata)
{
urlcontent *u;
#ifdef DEBUG_URLSTRINGS
Put(WC->urlstrings, u->url_key, strlen(u->url_key), u, free_url);
#ifdef DEBUG_URLSTRINGS
- lprintf(9, "Key: <%s> len: [%ld] Data: <%s>\n", u->url_key, u->url_data_size, u->url_data);
+ lprintf(9, "Key: <%s> len: [%ld] Data: <%s>\n",
+ u->url_key,
+ StrLength(u->url_data),
+ ChrPtr(u->url_data));
#endif
}
* print ajax response footer
*/
void end_ajax_response(void) {
- ///hprintf("\r\n");///// todo: is this right?
wDumpContent(0);
}
wprintf("NO\n");
}
else {
+ memset(buf, 5, 0);
serv_puts("NOOP");
serv_getln(buf, sizeof buf);
if (buf[3] == '*') {
/*
* Entry point for WebCit transaction
*/
-void session_loop(struct httprequest *req)
+void session_loop(HashList *HTTPHeaders, StrBuf *ReqLine, StrBuf *request_method, StrBuf *ReadBuf)
{
- char cmd[1024];
+ const char *pch, *pchs, *pche;
+ void *vLine;
char action[1024];
char arg[8][128];
size_t sizes[10];
char *index[10];
char buf[SIZ];
- char request_method[128];
- char pathname[1024];
- int a, b, nBackDots, nEmpty;
+ int a, nBackDots, nEmpty;
int ContentLength = 0;
- char ContentType[512];
- char *content = NULL;
- char *content_end = NULL;
- struct httprequest *hptr;
+ StrBuf *ContentType = NULL;
+ StrBuf *UrlLine = NULL;
+ StrBuf *content = NULL;
+ const char *content_end = NULL;
char browser_host[256];
char user_agent[256];
int body_start = 0;
char c_httpauth_string[SIZ];
char c_httpauth_user[SIZ];
char c_httpauth_pass[SIZ];
- char cookie[SIZ];
struct wcsession *WCC;
safestrncpy(c_username, "", sizeof c_username);
WCC->upload_length = 0;
WCC->upload = NULL;
WCC->is_mobile = 0;
-
- hptr = req;
- if (hptr == NULL) return;
-
- safestrncpy(cmd, hptr->line, sizeof cmd);
- hptr = hptr->next;
- extract_token(request_method, cmd, 0, ' ', sizeof request_method);
- extract_token(pathname, cmd, 1, ' ', sizeof pathname);
+ WCC->trailing_javascript = NewStrBuf();
/** Figure out the action */
index[0] = action;
nEmpty = 0;
for ( a = 0; a < 9; ++a)
{
- extract_token(index[a], pathname, a + 1, '/', sizes[a]);
+ extract_token(index[a], ChrPtr(ReqLine), a + 1, '/', sizes[a]);
if (strstr(index[a], "?")) *strstr(index[a], "?") = 0;
if (strstr(index[a], "&")) *strstr(index[a], "&") = 0;
if (strstr(index[a], " ")) *strstr(index[a], " ") = 0;
nEmpty++;
}
- while (hptr != NULL) {
- safestrncpy(buf, hptr->line, sizeof buf);
- /* lprintf(9, "HTTP HEADER: %s\n", buf); */
- hptr = hptr->next;
- if (!strncasecmp(buf, "Cookie: webcit=", 15)) {
- safestrncpy(cookie, &buf[15], sizeof cookie);
- cookie_to_stuff(cookie, NULL,
- c_username, sizeof c_username,
- c_password, sizeof c_password,
- c_roomname, sizeof c_roomname);
- }
- else if (!strncasecmp(buf, "Authorization: Basic ", 21)) {
- CtdlDecodeBase64(c_httpauth_string, &buf[21], strlen(&buf[21]));
- extract_token(c_httpauth_user, c_httpauth_string, 0, ':', sizeof c_httpauth_user);
- extract_token(c_httpauth_pass, c_httpauth_string, 1, ':', sizeof c_httpauth_pass);
- }
- else if (!strncasecmp(buf, "Content-length: ", 16)) {
- ContentLength = atoi(&buf[16]);
- }
- else if (!strncasecmp(buf, "Content-type: ", 14)) {
- safestrncpy(ContentType, &buf[14], sizeof ContentType);
- }
- else if (!strncasecmp(buf, "User-agent: ", 12)) {
- safestrncpy(user_agent, &buf[12], sizeof user_agent);
- #ifdef TECH_PREVIEW
- if (is_mobile_ua(&buf[12])) {
- WCC->is_mobile = 1;
- }
- #endif
- }
- else if (!strncasecmp(buf, "X-Forwarded-Host: ", 18)) {
- if (follow_xff) {
- safestrncpy(WCC->http_host, &buf[18], sizeof WCC->http_host);
- }
+ if (GetHash(HTTPHeaders, HKEY("COOKIE"), &vLine) &&
+ (vLine != NULL)){
+ cookie_to_stuff((StrBuf *)vLine, NULL,
+ c_username, sizeof c_username,
+ c_password, sizeof c_password,
+ c_roomname, sizeof c_roomname);
+ }
+ if (GetHash(HTTPHeaders, HKEY("AUTHORIZATION"), &vLine) &&
+ (vLine!=NULL)) {
+ CtdlDecodeBase64(c_httpauth_string, ChrPtr((StrBuf*)vLine), StrLength((StrBuf*)vLine));
+ extract_token(c_httpauth_user, c_httpauth_string, 0, ':', sizeof c_httpauth_user);
+ extract_token(c_httpauth_pass, c_httpauth_string, 1, ':', sizeof c_httpauth_pass);
+ }
+ if (GetHash(HTTPHeaders, HKEY("CONTENT-LENGTH"), &vLine) &&
+ (vLine!=NULL)) {
+ ContentLength = StrToi((StrBuf*)vLine);
+ }
+ if (GetHash(HTTPHeaders, HKEY("CONTENT-TYPE"), &vLine) &&
+ (vLine!=NULL)) {
+ ContentType = (StrBuf*)vLine;
+ }
+ if (GetHash(HTTPHeaders, HKEY("USER-AGENT"), &vLine) &&
+ (vLine!=NULL)) {
+ safestrncpy(user_agent, ChrPtr((StrBuf*)vLine), sizeof user_agent);
+#ifdef TECH_PREVIEW
+ if ((WCC->is_mobile < 0) && is_mobile_ua(&buf[12])) {
+ WCC->is_mobile = 1;
}
- else if (!strncasecmp(buf, "Host: ", 6)) {
- if (IsEmptyStr(WCC->http_host)) {
- safestrncpy(WCC->http_host, &buf[6], sizeof WCC->http_host);
- }
+ else {
+ WCC->is_mobile = 0;
}
- else if (!strncasecmp(buf, "X-Forwarded-For: ", 17)) {
- safestrncpy(browser_host, &buf[17], sizeof browser_host);
- while (num_tokens(browser_host, ',') > 1) {
- remove_token(browser_host, 0, ',');
- }
- striplt(browser_host);
+#endif
+ }
+ if ((follow_xff) &&
+ GetHash(HTTPHeaders, HKEY("X-FORWARDED-HOST"), &vLine) &&
+ (vLine != NULL)) {
+ safestrncpy(WCC->http_host,
+ ChrPtr((StrBuf*)vLine),
+ sizeof WCC->http_host);
+ }
+ if (IsEmptyStr(WCC->http_host) &&
+ GetHash(HTTPHeaders, HKEY("HOST"), &vLine) &&
+ (vLine!=NULL)) {
+ safestrncpy(WCC->http_host,
+ ChrPtr((StrBuf*)vLine),
+ sizeof WCC->http_host);
+
+ }
+ if (GetHash(HTTPHeaders, HKEY("X-FORWARDED-FOR"), &vLine) &&
+ (vLine!=NULL)) {
+ safestrncpy(browser_host,
+ ChrPtr((StrBuf*) vLine),
+ sizeof browser_host);
+ while (num_tokens(browser_host, ',') > 1) {
+ remove_token(browser_host, 0, ',');
}
+ striplt(browser_host);
}
if (ContentLength > 0) {
- int BuffSize;
-
- BuffSize = ContentLength + SIZ;
- content = malloc(BuffSize);
- memset(content, 0, BuffSize);
- snprintf(content, BuffSize, "Content-type: %s\n"
+ content = NewStrBuf();
+ StrBufPrintf(content, "Content-type: %s\n"
"Content-length: %d\n\n",
- ContentType, ContentLength);
+ ChrPtr(ContentType), ContentLength);
/*
hprintf("Content-type: %s\n"
"Content-length: %d\n\n",
ContentType, ContentLength);
*/
- body_start = strlen(content);
+ body_start = StrLength(content);
/** Read the entire input data at once. */
- client_read(&WCC->http_sock, &content[body_start], ContentLength);
-
- if (!strncasecmp(ContentType, "application/x-www-form-urlencoded", 33)) {
- StrBuf *Content;
-
- Content = _NewConstStrBuf(&content[body_start],ContentLength);
- addurls(Content);
- FreeStrBuf(&Content);
- } else if (!strncasecmp(ContentType, "multipart", 9)) {
- content_end = content + ContentLength + body_start;
- mime_parser(content, content_end, *upload_handler, NULL, NULL, NULL, 0);
+ client_read(&WCC->http_sock, content, ReadBuf, ContentLength + body_start);
+
+ if (!strncasecmp(ChrPtr(ContentType), "application/x-www-form-urlencoded", 33)) {
+ StrBufCutLeft(content, body_start);
+ ParseURLParams(content);
+ } else if (!strncasecmp(ChrPtr(ContentType), "multipart", 9)) {
+ content_end = ChrPtr(content) + ContentLength + body_start;
+ mime_parser(ChrPtr(content), content_end, *upload_handler, NULL, NULL, NULL, 0);
}
} else {
content = NULL;
}
/* make a note of where we are in case the user wants to save it */
- safestrncpy(WCC->this_page, cmd, sizeof(WCC->this_page));
+ safestrncpy(WCC->this_page, ChrPtr(ReqLine), sizeof(WCC->this_page));
remove_token(WCC->this_page, 2, ' ');
remove_token(WCC->this_page, 0, ' ');
/* If there are variables in the URL, we must grab them now */
- len = strlen(cmd);
- for (a = 0; a < len; ++a) {
- if ((cmd[a] == '?') || (cmd[a] == '&')) {
- StrBuf *Params;
- for (b = a; b < len; ++b) {
- if (isspace(cmd[b])){
- cmd[b] = 0;
- len = b - 1;
- }
- }
- //cmd[len - a] = '\0';
- Params = _NewConstStrBuf(&cmd[a + 1], len - a);
- addurls(Params);
- FreeStrBuf(&Params);
- cmd[a] = 0;
- len = a - 1;
+ UrlLine = NewStrBufDup(ReqLine);
+ len = StrLength(UrlLine);
+ pch = pchs = ChrPtr(UrlLine);
+ pche = pchs + len;
+ while (pch < pche) {
+ if ((*pch == '?') || (*pch == '&')) {
+ StrBufCutLeft(UrlLine, pch - pchs + 1);
+ ParseURLParams(UrlLine);
+ break;
}
+ pch ++;
}
+ FreeStrBuf(&UrlLine);
/* If it's a "force 404" situation then display the error and bail. */
if (!strcmp(action, "404")) {
/* Static content can be sent without connecting to Citadel. */
is_static = 0;
- for (a=0; a<ndirs; ++a) {
+ for (a=0; a<ndirs && ! is_static; ++a) {
if (!strcasecmp(action, (char*)static_content_dirs[a])) { /* map web to disk location */
is_static = 1;
n_static = a;
get_serv_info(browser_host, user_agent);
if (serv_info.serv_rev_level < MINIMUM_CIT_VERSION) {
+ begin_burst();
wprintf(_("You are connected to a Citadel "
"server running Citadel %d.%02d. \n"
"In order to run this version of WebCit "
MINIMUM_CIT_VERSION / 100,
MINIMUM_CIT_VERSION % 100
);
+ end_burst();
end_webcit_session();
goto SKIP_ALL_THIS_CRAP;
}
}
}
-////////todo: restorte language in this case
+////////todo: restore language in this case
/*
* Functions which can be performed without logging in
*/
goto SKIP_ALL_THIS_CRAP;
}
if (!strcasecmp(action, "freebusy")) {
- do_freebusy(cmd);
+ do_freebusy(ChrPtr(ReqLine));
goto SKIP_ALL_THIS_CRAP;
}
* our session's authentication.
*/
if (!strncasecmp(action, "groupdav", 8)) {
- groupdav_main(req, ContentType, /* do GroupDAV methods */
- ContentLength, content+body_start);
+ groupdav_main(HTTPHeaders,
+ ReqLine, request_method,
+ ContentType, /* do GroupDAV methods */
+ ContentLength, content, body_start);
if (!WCC->logged_in) {
WCC->killthis = 1; /* If not logged in, don't */
} /* keep the session active */
* Automatically send requests with any method other than GET or
* POST to the GroupDAV code as well.
*/
- if ((strcasecmp(request_method, "GET")) && (strcasecmp(request_method, "POST"))) {
- groupdav_main(req, ContentType, /** do GroupDAV methods */
- ContentLength, content+body_start);
+ if ((strcasecmp(ChrPtr(request_method), "GET")) && (strcasecmp(ChrPtr(request_method), "POST"))) {
+ groupdav_main(HTTPHeaders, ReqLine,
+ request_method, ContentType, /** do GroupDAV methods */
+ ContentLength, content, body_start);
if (!WCC->logged_in) {
WCC->killthis = 1; /** If not logged in, don't */
} /** keep the session active */
set_selected_language(ChrPtr(Lang));
go_selected_language(); /* set locale */
}
+ get_preference("default_header_charset", &WCC->DefaultCharset);
}
}
}
SKIP_ALL_THIS_CRAP:
fflush(stdout);
if (content != NULL) {
- free(content);
+ FreeStrBuf(&content);
content = NULL;
}
free_urls();
free(WCC->upload);
WCC->upload_length = 0;
}
+ FreeStrBuf(&WCC->trailing_javascript);
}
1);
}
+void view_postpart(void) {
+ postpart(WC->UrlFragment1,
+ WC->UrlFragment2,
+ 0);
+}
+
+void download_postpart(void) {
+ postpart(WC->UrlFragment1,
+ WC->UrlFragment2,
+ 1);
+}
+
-int ConditionalImportantMesage(WCTemplateToken *Tokens, void *Context)
+int ConditionalImportantMesage(WCTemplateToken *Tokens, void *Context, int ContextType)
{
struct wcsession *WCC = WC;
if (WCC != NULL)
return 0;
}
-void tmplput_importantmessage(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context)
+void tmplput_importantmessage(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
{
struct wcsession *WCC = WC;
if (WCC != NULL) {
+/*
+ StrBufAppendTemplate(Target, nArgs, Tokens, Context, ContextType,
+ WCC->ImportantMessage, 0);
+*/
+ WCC->ImportantMessage[0] = '\0';
StrEscAppend(Target, NULL, WCC->ImportantMessage, 0, 0);
WCC->ImportantMessage[0] = '\0';
}
}
-void tmplput_offer_start_page(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context)
+int ConditionalBstr(WCTemplateToken *Tokens, void *Context, int ContextType)
+{
+ if(Tokens->nParameters == 3)
+ return HaveBstr(Tokens->Params[2]->Start,
+ Tokens->Params[2]->len);
+ else
+ return strcmp(Bstr(Tokens->Params[2]->Start,
+ Tokens->Params[2]->len),
+ Tokens->Params[3]->Start) == 0;
+}
+
+void tmplput_bstr(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+{
+ const StrBuf *Buf = SBstr(Tokens->Params[0]->Start,
+ Tokens->Params[0]->len);
+ if (Buf != NULL)
+ StrBufAppendTemplate(Target, nArgs, Tokens,
+ Context, ContextType,
+ Buf, 1);
+}
+
+
+void tmplput_csslocal(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
{
- offer_start_page();
+ extern StrBuf *csslocal;
+ StrBufAppendBuf(Target,
+ csslocal, 0);
}
+
+
+
+
+
void
InitModule_WEBCIT
(void)
WebcitAddUrlHandler(HKEY("vcardphoto"), display_vcard_photo_img, NEED_URL);
WebcitAddUrlHandler(HKEY("mimepart"), view_mimepart, NEED_URL);
WebcitAddUrlHandler(HKEY("mimepart_download"), download_mimepart, NEED_URL);
+ WebcitAddUrlHandler(HKEY("postpart"), view_postpart, NEED_URL);
+ WebcitAddUrlHandler(HKEY("postpart_download"), download_postpart, NEED_URL);
WebcitAddUrlHandler(HKEY("diagnostics"), diagnostics, NEED_URL);
- RegisterConditional(HKEY("COND:IMPMSG"), 0, ConditionalImportantMesage);
- RegisterNamespace("IMPORTANTMESSAGE", 0, 0, tmplput_importantmessage);
- RegisterNamespace("OFFERSTARTPAGE", 0, 0, tmplput_offer_start_page);
+
+ RegisterConditional(HKEY("COND:IMPMSG"), 0, ConditionalImportantMesage, CTX_NONE);
+ RegisterConditional(HKEY("COND:BSTR"), 1, ConditionalBstr, CTX_NONE);
+ RegisterNamespace("BSTR", 1, 2, tmplput_bstr, CTX_NONE);
+ RegisterNamespace("CSSLOCAL", 0, 0, tmplput_csslocal, CTX_NONE);
+ RegisterNamespace("IMPORTANTMESSAGE", 0, 0, tmplput_importantmessage, CTX_NONE);
+ RegisterNamespace("OFFERSTARTPAGE", 0, 0, offer_start_page, CTX_NONE);
+ RegisterNamespace("TRAILING_JAVASCRIPT", 0, 0, tmplput_trailing_javascript, CTX_NONE);
}