@@ -31,10 +31,11 @@
31 31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define WIKI_BUTTONS 0x008 /* Allow sub-menu buttons */
32 32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define WIKI_NOBADLINKS 0x010 /* Ignore broken hyperlinks */
33 33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define WIKI_LINKSONLY 0x020 /* No markup. Only decorate links */
34 34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define WIKI_NEWLINE 0x040 /* Honor \n - break lines at each \n */
35 35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define WIKI_MARKDOWNLINKS 0x080 /* Resolve hyperlinks as in markdown */
36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define WIKI_SAFE 0x100 /* Make the result safe for embedding */
36 37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
37 38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
38 39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
39 40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
40 41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** These are the only markup attributes allowed.
@@ -1744,13 +1745,10 @@
1744 1745 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Renderer renderer;
1745 1746 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1746 1747 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memset(&renderer, 0, sizeof(renderer));
1747 1748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
renderer.renderFlags = flags;
1748 1749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
renderer.state = ALLOW_WIKI|AT_NEWLINE|AT_PARAGRAPH|flags;
1749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( flags & WIKI_NOBLOCK ){
1750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- renderer.state |= INLINE_MARKUP_ONLY;
1751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
1752 1750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( flags & WIKI_INLINE ){
1753 1751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
renderer.wantAutoParagraph = 0;
1754 1752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
1755 1753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
renderer.wantAutoParagraph = 1;
1756 1754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -1818,22 +1816,22 @@
1818 1816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** --safe Do "safe-html" rendering.
1819 1817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
1820 1818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void test_markdown_render(void){
1821 1819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob in, out;
1822 1820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i;
1821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bSafe = 0;
1823 1822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_find_and_open_repository(OPEN_OK_NOT_FOUND|OPEN_SUBSTITUTE,0);
1824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( find_option("safe",0,0)!=0 ){
1825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- safe_html_enable(1);
1826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
1823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bSafe = find_option("safe",0,0)!=0;
1827 1824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
verify_all_options();
1828 1825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=2; i<g.argc; i++){
1829 1826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_zero(&out);
1830 1827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_read_from_file(&in, g.argv[i], ExtFILE);
1831 1828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.argc>3 ){
1832 1829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_print("<!------ %h ------->\n", g.argv[i]);
1833 1830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1834 1831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
markdown_to_html(&in, 0, &out);
1832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( bSafe ) safe_html(&out);
1835 1833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_write_to_file(&out, "-");
1836 1834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&in);
1837 1835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&out);
1838 1836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1839 1837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -2509,20 +2507,10 @@
2509 2507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(pBlob, "</%s>", aMarkup[e].zName);
2510 2508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2511 2509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}while( e!=eEnd && p->n>0 );
2512 2510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2513 2511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
2514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
2515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Enable or disable the "safe-html" feature. When enabled, the
2516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** HTML generated by Markdown is adjusted so that it cannot cause
2517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** problems when embedded in a larger document.
2518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
2519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int safeHtml = 0;
2520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- void safe_html_enable(int v){
2521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- safeHtml = v;
2522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
2523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
2524 2512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
2525 2513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Append HTML text to a Blob object.
2526 2514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
2527 2515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If safe-html is enabled then the appended text is modified
2528 2516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** changed in the following ways:
@@ -2553,14 +2541,10 @@
2553 2541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i, j, n;
2554 2542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
HtmlTagStack s;
2555 2543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ParsedMarkup markup;
2556 2544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
2557 2545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nHtml<=0 ) return;
2558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !safeHtml ){
2559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(pBlob, zHtml, nHtml);
2560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return;
2561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
2562 2546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cLast = zHtml[nHtml];
2563 2547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zHtml[nHtml] = 0;
2564 2548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
html_tagstack_init(&s);
2565 2549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
2566 2550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
i = 0;
@@ -2586,10 +2570,12 @@
2586 2570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2587 2571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
parseMarkup(&markup, zHtml+j);
2588 2572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( markup.iCode==MARKUP_INVALID ){
2589 2573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(pBlob, "<span class='error'><%.*s></span>",
2590 2574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
n-2, zHtml+j+1);
2575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( (markup.iType & MUTYPE_Nested)==0 || markup.iCode==MARKUP_P ){
2576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ renderMarkup(pBlob, &markup);
2591 2577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
2592 2578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( markup.endTag ){
2593 2579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
html_tagstack_pop(&s, pBlob, markup.iCode);
2594 2580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
2595 2581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
renderMarkup(pBlob, &markup);
@@ -2601,10 +2587,42 @@
2601 2587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
html_tagstack_pop(&s, pBlob, 0);
2602 2588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
html_tagstack_clear(&s);
2603 2589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zHtml[nHtml] = cLast;
2604 2590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2605 2591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
2592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
2593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The input blob consists of HTML. Convert it into "safe HTML". Safe
2594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** HTML has no potentially disruptive elements (ex: <script>, <style>)
2595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** and it is embeddable, meaning that it won't close any outer elements
2596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** from the script in which it is embedded, nor will it leave any open
2597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** elements to affect the tail of the outer script.
2598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
2599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void safe_html(Blob *in){
2600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob out;
2601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *z = blob_str(in);
2602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int n = blob_size(in);
2603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int k;
2604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_init(&out, 0, 0);
2605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( fossil_isspace(z[0]) ){ z++; n--; }
2606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(k=n-1; k>5 && fossil_isspace(z[k]); k--){}
2607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fossil_strnicmp(z, "<div",4)==0 && !fossil_isalpha(z[4])
2609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && fossil_strnicmp(z+k-5, "</div>",6)==0
2610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
2611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* The input contains an outer <div>...</div>. Preserve the
2612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** full scope of that <div>. */
2613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int m = html_tag_length(z);
2614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ k -= 5;
2615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&out, z, m);
2616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ safe_html_append(&out, z+m, k-m);
2617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&out, z+k, n-k);
2618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
2619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ safe_html_append(&out, z, n);
2620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(in);
2622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *in = out;
2623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2606 2624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
2607 2625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
2608 2626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** COMMAND: test-safe-html
2609 2627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
2610 2628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Usage: %fossil test-safe-html FILE ...
@@ -2614,21 +2632,18 @@
2614 2632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** standard output.
2615 2633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
2616 2634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void test_safe_html_cmd(void){
2617 2635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i;
2618 2636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob x;
2619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Blob y;
2620 2637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=2; i<g.argc; i++){
2621 2638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *z;
2622 2639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int n;
2623 2640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_read_from_file(&x, g.argv[i], ExtFILE);
2624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_init(&y, 0, 0);
2625 2641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_terminate(&x);
2626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- safe_html_append(&y, blob_buffer(&x), blob_size(&x));
2627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_reset(&x);
2628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- z = blob_str(&y);
2629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- n = blob_size(&y);
2642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ safe_html(&x);
2643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ z = blob_str(&x);
2644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ n = blob_size(&x);
2630 2645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( n>0 && (z[n-1]=='\n' || z[n-1]=='\r') ) n--;
2631 2646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_print("%.*s\n", n, z);
2632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_reset(&y);
2647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&x);
2633 2648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2634 2649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2635 2650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!