forked from cadence/breezewiki
		
	Add strict_proxy option to proxy links to images
Default true.
This commit is contained in:
		
							parent
							
								
									3505925f7e
								
							
						
					
					
						commit
						78399a3474
					
				
					 2 changed files with 29 additions and 9 deletions
				
			
		| 
						 | 
					@ -20,7 +20,8 @@
 | 
				
			||||||
    (canonical_origin . "")
 | 
					    (canonical_origin . "")
 | 
				
			||||||
    (debug . "false")
 | 
					    (debug . "false")
 | 
				
			||||||
    (instance_is_official . "false") ; please don't turn this on, or you will make me very upset
 | 
					    (instance_is_official . "false") ; please don't turn this on, or you will make me very upset
 | 
				
			||||||
    (port . "10416")))
 | 
					    (port . "10416")
 | 
				
			||||||
 | 
					    (strict_proxy . "true")))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define config
 | 
					(define config
 | 
				
			||||||
  (make-hasheq
 | 
					  (make-hasheq
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -30,9 +30,9 @@
 | 
				
			||||||
           (aside (@ (role "region") (class "portable-infobox pi-theme-wikia pi-layout-default"))
 | 
					           (aside (@ (role "region") (class "portable-infobox pi-theme-wikia pi-layout-default"))
 | 
				
			||||||
                  (h2 (@ (class "pi-item pi-title") (data-source "title"))
 | 
					                  (h2 (@ (class "pi-item pi-title") (data-source "title"))
 | 
				
			||||||
                      "Infobox Title")
 | 
					                      "Infobox Title")
 | 
				
			||||||
                  (figure (@ (class "pi-item pi-image") (data-sourec "image"))
 | 
					                  (figure (@ (class "pi-item pi-image") (data-source "image"))
 | 
				
			||||||
                          (a (@ (href "https://static.wiki.nocookie.net/nice-image.png") (class "image image-thumbnail") (title ""))
 | 
					                          (a (@ (href "https://static.wikia.nocookie.net/nice-image.png") (class "image image-thumbnail") (title ""))
 | 
				
			||||||
                             (img (@ (src "https://static.wiki.nocookie.net/nice-image-thumbnail.png") (class "pi-image-thumbnail")))))
 | 
					                             (img (@ (src "https://static.wikia.nocookie.net/nice-image-thumbnail.png") (class "pi-image-thumbnail")))))
 | 
				
			||||||
                  (div (@ (class "pi-item pi-data") (data-source "description"))
 | 
					                  (div (@ (class "pi-item pi-data") (data-source "description"))
 | 
				
			||||||
                       (h3 (@ (class "pi-data-label"))
 | 
					                       (h3 (@ (class "pi-data-label"))
 | 
				
			||||||
                           "Description")
 | 
					                           "Description")
 | 
				
			||||||
| 
						 | 
					@ -64,7 +64,7 @@
 | 
				
			||||||
  (check-equal? (preprocess-html-wiki "<figure class=\"thumb tright\" style=\"width: 150px\"><a class=\"image\"><img></a><noscript><a><img></a></noscript><figcaption class=\"thumbcaption\"> 	<p class=\"caption\">Caption text.</p></figcaption></figure>")
 | 
					  (check-equal? (preprocess-html-wiki "<figure class=\"thumb tright\" style=\"width: 150px\"><a class=\"image\"><img></a><noscript><a><img></a></noscript><figcaption class=\"thumbcaption\"> 	<p class=\"caption\">Caption text.</p></figcaption></figure>")
 | 
				
			||||||
                "<figure class=\"thumb tright\" style=\"width: 150px\"><a class=\"image\"><img></a><noscript><a><img></a></noscript><figcaption class=\"thumbcaption\"><span class=\"caption\">Caption text.</span></figcaption></figure>"))
 | 
					                "<figure class=\"thumb tright\" style=\"width: 150px\"><a class=\"image\"><img></a><noscript><a><img></a></noscript><figcaption class=\"thumbcaption\"><span class=\"caption\">Caption text.</span></figcaption></figure>"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define (update-tree-wiki tree wikiname)
 | 
					(define (update-tree-wiki tree wikiname #:strict-proxy? strict-proxy?)
 | 
				
			||||||
  (update-tree
 | 
					  (update-tree
 | 
				
			||||||
   (λ (element element-type attributes children)
 | 
					   (λ (element element-type attributes children)
 | 
				
			||||||
     ;; replace whole element?
 | 
					     ;; replace whole element?
 | 
				
			||||||
| 
						 | 
					@ -142,7 +142,7 @@
 | 
				
			||||||
                (curry u
 | 
					                (curry u
 | 
				
			||||||
                       (λ (v) (and (eq? element-type 'a)
 | 
					                       (λ (v) (and (eq? element-type 'a)
 | 
				
			||||||
                                   (has-class? "image" v)))
 | 
					                                   (has-class? "image" v)))
 | 
				
			||||||
                       (λ (v) (dict-update attributes 'rel (λ (s)
 | 
					                       (λ (v) (dict-update v 'rel (λ (s)
 | 
				
			||||||
                                                             (list (string-append (car s) " noreferrer")))
 | 
					                                                             (list (string-append (car s) " noreferrer")))
 | 
				
			||||||
                                           '(""))))
 | 
					                                           '(""))))
 | 
				
			||||||
                ; proxy images from inline styles
 | 
					                ; proxy images from inline styles
 | 
				
			||||||
| 
						 | 
					@ -154,6 +154,13 @@
 | 
				
			||||||
                                            "url("
 | 
					                                            "url("
 | 
				
			||||||
                                            (u-proxy-url url)
 | 
					                                            (u-proxy-url url)
 | 
				
			||||||
                                            ")")))))
 | 
					                                            ")")))))
 | 
				
			||||||
 | 
					                ; and also their links, if strict-proxy is set
 | 
				
			||||||
 | 
					                (curry u
 | 
				
			||||||
 | 
					                       (λ (v)
 | 
				
			||||||
 | 
					                         (and strict-proxy?
 | 
				
			||||||
 | 
					                              (eq? element-type 'a)
 | 
				
			||||||
 | 
					                              (has-class? "image-thumbnail" v)))
 | 
				
			||||||
 | 
					                       (λ (v) (attribute-maybe-update 'href u-proxy-url v)))
 | 
				
			||||||
                ; proxy images from src attributes
 | 
					                ; proxy images from src attributes
 | 
				
			||||||
                (curry attribute-maybe-update 'src u-proxy-url)
 | 
					                (curry attribute-maybe-update 'src u-proxy-url)
 | 
				
			||||||
                ; don't lazyload images
 | 
					                ; don't lazyload images
 | 
				
			||||||
| 
						 | 
					@ -176,7 +183,7 @@
 | 
				
			||||||
               children))]))
 | 
					               children))]))
 | 
				
			||||||
   tree))
 | 
					   tree))
 | 
				
			||||||
(module+ test
 | 
					(module+ test
 | 
				
			||||||
  (define transformed (update-tree-wiki wiki-document "test"))
 | 
					  (define transformed (update-tree-wiki wiki-document "test" #:strict-proxy? #t))
 | 
				
			||||||
  ; check that wikilinks are changed to be local
 | 
					  ; check that wikilinks are changed to be local
 | 
				
			||||||
  (check-equal? (get-attribute 'href (bits->attributes
 | 
					  (check-equal? (get-attribute 'href (bits->attributes
 | 
				
			||||||
                                      ((query-selector
 | 
					                                      ((query-selector
 | 
				
			||||||
| 
						 | 
					@ -201,7 +208,19 @@
 | 
				
			||||||
  (check-equal? (let* ([alternative ((query-selector (λ (t a c) (has-class? "iframe-alternative" a)) transformed))]
 | 
					  (check-equal? (let* ([alternative ((query-selector (λ (t a c) (has-class? "iframe-alternative" a)) transformed))]
 | 
				
			||||||
                       [link ((query-selector (λ (t a c) (eq? t 'a)) alternative))])
 | 
					                       [link ((query-selector (λ (t a c) (eq? t 'a)) alternative))])
 | 
				
			||||||
                  (get-attribute 'href (bits->attributes link)))
 | 
					                  (get-attribute 'href (bits->attributes link)))
 | 
				
			||||||
                "https://example.com/iframe-src"))
 | 
					                "https://example.com/iframe-src")
 | 
				
			||||||
 | 
					  ; check that images are proxied
 | 
				
			||||||
 | 
					  (check-equal? (get-attribute 'src (bits->attributes
 | 
				
			||||||
 | 
					                                     ((query-selector
 | 
				
			||||||
 | 
					                                       (λ (t a c) (eq? t 'img))
 | 
				
			||||||
 | 
					                                       transformed))))
 | 
				
			||||||
 | 
					                "/proxy?dest=https%3A%2F%2Fstatic.wikia.nocookie.net%2Fnice-image-thumbnail.png")
 | 
				
			||||||
 | 
					  ; check that links to images are proxied
 | 
				
			||||||
 | 
					  (check-equal? (get-attribute 'href (bits->attributes
 | 
				
			||||||
 | 
					                                      ((query-selector
 | 
				
			||||||
 | 
					                                        (λ (t a c) (and (eq? t 'a) (has-class? "image-thumbnail" a)))
 | 
				
			||||||
 | 
					                                        transformed))))
 | 
				
			||||||
 | 
					                "/proxy?dest=https%3A%2F%2Fstatic.wikia.nocookie.net%2Fnice-image.png"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define (page-wiki req)
 | 
					(define (page-wiki req)
 | 
				
			||||||
  (define wikiname (path/param-path (first (url-path (request-uri req)))))
 | 
					  (define wikiname (path/param-path (first (url-path (request-uri req)))))
 | 
				
			||||||
| 
						 | 
					@ -230,7 +249,7 @@
 | 
				
			||||||
           (next-dispatcher)
 | 
					           (next-dispatcher)
 | 
				
			||||||
           (response-handler
 | 
					           (response-handler
 | 
				
			||||||
            (define body
 | 
					            (define body
 | 
				
			||||||
              (generate-wiki-page source-url wikiname title (update-tree-wiki page wikiname)))
 | 
					              (generate-wiki-page source-url wikiname title (update-tree-wiki page wikiname #:strict-proxy? (config-true? 'strict_proxy))))
 | 
				
			||||||
            (define redirect-msg ((query-selector (attribute-selector 'class "redirectMsg") body)))
 | 
					            (define redirect-msg ((query-selector (attribute-selector 'class "redirectMsg") body)))
 | 
				
			||||||
            (define headers (if redirect-msg
 | 
					            (define headers (if redirect-msg
 | 
				
			||||||
                                (let* ([dest (get-attribute 'href (bits->attributes ((query-selector (λ (t a c) (eq? t 'a)) redirect-msg))))]
 | 
					                                (let* ([dest (get-attribute 'href (bits->attributes ((query-selector (λ (t a c) (eq? t 'a)) redirect-msg))))]
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue