forked from cadence/breezewiki
		
	Proxy stylesheets too under strict_proxy
This also refactors the configuration system to use make-parameter, because dynamic binding allows for testing code more easily.
This commit is contained in:
		
							parent
							
								
									78399a3474
								
							
						
					
					
						commit
						e6eabe9cf4
					
				
					 3 changed files with 69 additions and 36 deletions
				
			
		| 
						 | 
					@ -1,6 +1,9 @@
 | 
				
			||||||
#lang racket/base
 | 
					#lang racket/base
 | 
				
			||||||
(require net/http-easy
 | 
					(require racket/string
 | 
				
			||||||
         "config.rkt")
 | 
					         net/http-easy
 | 
				
			||||||
 | 
					         "config.rkt"
 | 
				
			||||||
 | 
					         "xexpr-utils.rkt"
 | 
				
			||||||
 | 
					         "url-utils.rkt")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(provide
 | 
					(provide
 | 
				
			||||||
 ; timeout durations for http-easy requests
 | 
					 ; timeout durations for http-easy requests
 | 
				
			||||||
| 
						 | 
					@ -50,7 +53,11 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define (generate-wiki-page source-url wikiname title content)
 | 
					(define (generate-wiki-page source-url wikiname title content)
 | 
				
			||||||
  (define (required-styles origin)
 | 
					  (define (required-styles origin)
 | 
				
			||||||
    (map (λ (dest-path) (format dest-path origin))
 | 
					    (map (λ (dest-path)
 | 
				
			||||||
 | 
					           (define url (format dest-path origin))
 | 
				
			||||||
 | 
					           (if (config-true? 'strict_proxy)
 | 
				
			||||||
 | 
					               (u-proxy-url url)
 | 
				
			||||||
 | 
					               url))
 | 
				
			||||||
         '(#;"~a/load.php?lang=en&modules=skin.fandomdesktop.styles&only=styles&skin=fandomdesktop"
 | 
					         '(#;"~a/load.php?lang=en&modules=skin.fandomdesktop.styles&only=styles&skin=fandomdesktop"
 | 
				
			||||||
           #;"~a/load.php?lang=en&modules=ext.gadget.dungeonsWiki%2CearthWiki%2Csite-styles%2Csound-styles&only=styles&skin=fandomdesktop"
 | 
					           #;"~a/load.php?lang=en&modules=ext.gadget.dungeonsWiki%2CearthWiki%2Csite-styles%2Csound-styles&only=styles&skin=fandomdesktop"
 | 
				
			||||||
           #;"~a/load.php?lang=en&modules=site.styles&only=styles&skin=fandomdesktop"
 | 
					           #;"~a/load.php?lang=en&modules=site.styles&only=styles&skin=fandomdesktop"
 | 
				
			||||||
| 
						 | 
					@ -82,4 +89,16 @@
 | 
				
			||||||
                                    ,content))
 | 
					                                    ,content))
 | 
				
			||||||
                          ,(application-footer source-url)))))))
 | 
					                          ,(application-footer source-url)))))))
 | 
				
			||||||
(module+ test
 | 
					(module+ test
 | 
				
			||||||
  (check-not-false (xexp->html (generate-wiki-page "" "test" "test" '(template)))))
 | 
					  (define page
 | 
				
			||||||
 | 
					    (parameterize ([(config-parameter 'strict_proxy) "true"])
 | 
				
			||||||
 | 
					      (generate-wiki-page "" "test" "test" '(template))))
 | 
				
			||||||
 | 
					  ; check the page is a valid xexp
 | 
				
			||||||
 | 
					  (check-not-false (xexp->html page))
 | 
				
			||||||
 | 
					  ; check the stylesheet is proxied
 | 
				
			||||||
 | 
					  (check-true (string-prefix?
 | 
				
			||||||
 | 
					               (get-attribute 'href
 | 
				
			||||||
 | 
					                              (bits->attributes
 | 
				
			||||||
 | 
					                               ((query-selector
 | 
				
			||||||
 | 
					                                 (λ (t a c) (eq? t 'link))
 | 
				
			||||||
 | 
					                                 page))))
 | 
				
			||||||
 | 
					               "/proxy?dest=https%3A%2F%2Ftest.fandom.com")))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,16 +4,20 @@
 | 
				
			||||||
         ini)
 | 
					         ini)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(provide
 | 
					(provide
 | 
				
			||||||
 | 
					 config-parameter
 | 
				
			||||||
 config-true?
 | 
					 config-true?
 | 
				
			||||||
 config-get)
 | 
					 config-get)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define-runtime-path path-config "../config.ini")
 | 
					(define-runtime-path path-config "../config.ini")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define (config-parameter key)
 | 
				
			||||||
 | 
					  (hash-ref config key))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define (config-true? key)
 | 
					(define (config-true? key)
 | 
				
			||||||
  (not (member (hash-ref config key) '("" "false"))))
 | 
					  (not (member ((config-parameter key)) '("" "false"))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define (config-get key)
 | 
					(define (config-get key)
 | 
				
			||||||
  (hash-ref config key))
 | 
					  ((config-parameter key)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define default-config
 | 
					(define default-config
 | 
				
			||||||
  '((application_name . "BreezeWiki")
 | 
					  '((application_name . "BreezeWiki")
 | 
				
			||||||
| 
						 | 
					@ -23,35 +27,43 @@
 | 
				
			||||||
    (port . "10416")
 | 
					    (port . "10416")
 | 
				
			||||||
    (strict_proxy . "true")))
 | 
					    (strict_proxy . "true")))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define loaded-alist
 | 
				
			||||||
 | 
					  (with-handlers
 | 
				
			||||||
 | 
					    ([exn:fail:filesystem:errno?
 | 
				
			||||||
 | 
					      (λ (exn)
 | 
				
			||||||
 | 
					        (begin0
 | 
				
			||||||
 | 
					            '()
 | 
				
			||||||
 | 
					          (displayln "note: config file not detected, using defaults")))]
 | 
				
			||||||
 | 
					     [exn:fail:contract?
 | 
				
			||||||
 | 
					      (λ (exn)
 | 
				
			||||||
 | 
					        (begin0
 | 
				
			||||||
 | 
					            '()
 | 
				
			||||||
 | 
					          (displayln "note: config file empty or missing [] section, using defaults")))])
 | 
				
			||||||
 | 
					    (define l
 | 
				
			||||||
 | 
					      (hash->list
 | 
				
			||||||
 | 
					       (hash-ref
 | 
				
			||||||
 | 
					        (ini->hash
 | 
				
			||||||
 | 
					         (call-with-input-file path-config
 | 
				
			||||||
 | 
					           (λ (in)
 | 
				
			||||||
 | 
					             (read-ini in))))
 | 
				
			||||||
 | 
					        '||)))
 | 
				
			||||||
 | 
					    (begin0
 | 
				
			||||||
 | 
					        l
 | 
				
			||||||
 | 
					      (printf "note: ~a items loaded from config file~n" (length l)))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define combined-alist (append default-config loaded-alist))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define config
 | 
					(define config
 | 
				
			||||||
  (make-hasheq
 | 
					  (make-hasheq
 | 
				
			||||||
   (append
 | 
					   (map (λ (pair)
 | 
				
			||||||
    default-config
 | 
					          (cons (car pair) (make-parameter (cdr pair))))
 | 
				
			||||||
    (with-handlers
 | 
					        combined-alist)))
 | 
				
			||||||
      ([exn:fail:filesystem:errno?
 | 
					 | 
				
			||||||
        (λ (exn)
 | 
					 | 
				
			||||||
          (begin0
 | 
					 | 
				
			||||||
              '()
 | 
					 | 
				
			||||||
            (displayln "note: config file not detected, using defaults")))]
 | 
					 | 
				
			||||||
       [exn:fail:contract?
 | 
					 | 
				
			||||||
        (λ (exn)
 | 
					 | 
				
			||||||
          (begin0
 | 
					 | 
				
			||||||
              '()
 | 
					 | 
				
			||||||
            (displayln "note: config file empty or missing [] section, using defaults")))])
 | 
					 | 
				
			||||||
      (define l
 | 
					 | 
				
			||||||
        (hash->list
 | 
					 | 
				
			||||||
         (hash-ref
 | 
					 | 
				
			||||||
          (ini->hash
 | 
					 | 
				
			||||||
           (call-with-input-file path-config
 | 
					 | 
				
			||||||
             (λ (in)
 | 
					 | 
				
			||||||
               (read-ini in))))
 | 
					 | 
				
			||||||
          '||)))
 | 
					 | 
				
			||||||
      (begin0
 | 
					 | 
				
			||||||
          l
 | 
					 | 
				
			||||||
        (printf "note: ~a items loaded from config file~n" (length l)))))))
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
(when (config-true? 'debug)
 | 
					(when (config-true? 'debug)
 | 
				
			||||||
  ; all values here are optimised for maximum prettiness
 | 
					  ; all values here are optimised for maximum prettiness
 | 
				
			||||||
  (parameterize ([pretty-print-columns 80])
 | 
					  (parameterize ([pretty-print-columns 80])
 | 
				
			||||||
    (display "config: ")
 | 
					    (display "config: ")
 | 
				
			||||||
    (pretty-write (hash->list config))))
 | 
					    (pretty-write (sort
 | 
				
			||||||
 | 
					                   (hash->list (make-hasheq combined-alist))
 | 
				
			||||||
 | 
					                   symbol<?
 | 
				
			||||||
 | 
					                   #:key car))))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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 #:strict-proxy? strict-proxy?)
 | 
					(define (update-tree-wiki tree wikiname)
 | 
				
			||||||
  (update-tree
 | 
					  (update-tree
 | 
				
			||||||
   (λ (element element-type attributes children)
 | 
					   (λ (element element-type attributes children)
 | 
				
			||||||
     ;; replace whole element?
 | 
					     ;; replace whole element?
 | 
				
			||||||
| 
						 | 
					@ -154,10 +154,10 @@
 | 
				
			||||||
                                            "url("
 | 
					                                            "url("
 | 
				
			||||||
                                            (u-proxy-url url)
 | 
					                                            (u-proxy-url url)
 | 
				
			||||||
                                            ")")))))
 | 
					                                            ")")))))
 | 
				
			||||||
                ; and also their links, if strict-proxy is set
 | 
					                ; and also their links, if strict_proxy is set
 | 
				
			||||||
                (curry u
 | 
					                (curry u
 | 
				
			||||||
                       (λ (v)
 | 
					                       (λ (v)
 | 
				
			||||||
                         (and strict-proxy?
 | 
					                         (and (config-true? 'strict_proxy)
 | 
				
			||||||
                              (eq? element-type 'a)
 | 
					                              (eq? element-type 'a)
 | 
				
			||||||
                              (has-class? "image-thumbnail" v)))
 | 
					                              (has-class? "image-thumbnail" v)))
 | 
				
			||||||
                       (λ (v) (attribute-maybe-update 'href u-proxy-url v)))
 | 
					                       (λ (v) (attribute-maybe-update 'href u-proxy-url v)))
 | 
				
			||||||
| 
						 | 
					@ -183,7 +183,9 @@
 | 
				
			||||||
               children))]))
 | 
					               children))]))
 | 
				
			||||||
   tree))
 | 
					   tree))
 | 
				
			||||||
(module+ test
 | 
					(module+ test
 | 
				
			||||||
  (define transformed (update-tree-wiki wiki-document "test" #:strict-proxy? #t))
 | 
					  (define transformed
 | 
				
			||||||
 | 
					    (parameterize ([(config-parameter 'strict_proxy) "true"])
 | 
				
			||||||
 | 
					      (update-tree-wiki wiki-document "test")))
 | 
				
			||||||
  ; 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
 | 
				
			||||||
| 
						 | 
					@ -249,7 +251,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 #:strict-proxy? (config-true? 'strict_proxy))))
 | 
					              (generate-wiki-page source-url wikiname title (update-tree-wiki page wikiname)))
 | 
				
			||||||
            (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