;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;; This is Denemos interface to access the MediaWiki API (http://www.mediawiki.org/wiki/API), which is used for the current Denemo-Website
;;;; Send any question to Nils "Steele" Gey address@hidden
;;;; Currently its only used to create/overwrite a page with a new script.
;;;; It uses the User-Rights System so its very secure. Vandalism in only possible in the same degree as allowed on the website itself.
;;;; All API access is done via (d-HTTP). The C function behind it sends HTTP-POST data to the given Server/Website and returns the HTTP-header and MediaWiki Data.
;;;;
;;;; The basic steps are 1)Login with Username/PW given in Denemos Preferences and 2)Create a HTTP-Cookie .
;;;; After that allowed Manipulation is possible. Currently we create request an Edit-Token and create a new Page.
;;;;
(define (d-UploadRoutine list)
(define command (list-ref list 0))
(define name (list-ref list 1))
(define script (list-ref list 2))
(define initscript (list-ref list 3))
(define menupath (list-ref list 4))
(define label (list-ref list 5))
(define tooltip (list-ref list 6))
(define after (list-ref list 7))
;Some constants. Change these only if the Website moves.
(define HTTPHostname "www.denemo.org") ; don't use http:// . No tailing /
(define HTTPSite "/api.php")
; Prepare Login. Use this only once in (CookieString) because all tokens change on any new login.
(define (LogMeIn)
(d-HTTP ;Parameters are hostname, site, cookies/header and POST-body
HTTPHostname
HTTPSite
"" ; Cookie entrypoint. No Cookie for now.
(string-append "format=json&action=login&lgname=" (scheme-escape(d-GetUserName)) "&lgpassword=" (scheme-escape(d-GetPassword)) ))
)
; Actually logs you in and prepares a HTTP-Cookie you have to use in all other Media-Wiki Actions as third (d-HTTP) parameter.
(define (CookieString)
(define LogMeInReturn (LogMeIn))
; Raise Error. Sorry, I don't know how to make Blocks and if/else does only allow one statement.
(define (RaiseError)
(begin
(d-WarningDialog "Login Error - Please check your username and password in Edit->prefs->misc")
(display "\nLogin Error - Please check your username and password in Denemos Preferences")
;return CookieError
(string-append "CookieError"))
)
; Test if hostname is ok
(if (string-ci=? LogMeInReturn "ERROR")
(display "\nConnection Error - Server unavailable")
;If Server is ok check Login-Data:
(if (string-ci=? (ParseJson LogMeInReturn "result") "Success")
; If login is good go ahead and build the cookie string
(string-append
"Cookie: "(ParseJson LogMeInReturn "cookieprefix")"UserName=" (ParseJson LogMeInReturn "lgusername")
"; "(ParseJson LogMeInReturn "cookieprefix")"UserID=" (ParseJson LogMeInReturn "lguserid")
"; "(ParseJson LogMeInReturn "cookieprefix")"Token=" (ParseJson LogMeInReturn "lgtoken")
"; "(ParseJson LogMeInReturn "cookieprefix")"_session=" (ParseJson LogMeInReturn "sessionid")
"\n")
;else
(RaiseError)
)
)
)
; Prepare request Edit-Token.
; First send d-HTTP, then parse the token, then modify it to the right format.
(define (GetEditToken name CookieStringReturn)
(define (ReceiveRawToken)
(d-HTTP
HTTPHostname
HTTPSite
CookieStringReturn
(string-append "format=json&action=query&prop=info|revisions&intoken=edit&titles="name))
)
;json gives you +\\ @ Tokens end, but you need only +\ which is %2B%5C in url-endcoded format.
(string-append (string-trim-both (string-trim-both (ParseJson (ReceiveRawToken) "edittoken" ) #\\) #\+) "%2B%5C")
)
;This will overwrite the page named like the parameter "name". If it is not existend it will be created.
;Any OverwritePage call has to be made in (d-UploadRoutine)'s body.
(define (OverwritePage CookieStringReturn)
(define (GetLicenseAndBuildString)
;(define license (d-GetUserInput "License" "Please choose a license for your script. For example GPL or LGPL" "GPL")) ; This is gone. Scripts have to be GPL, too.
(define (SiteString) ; Any whitespace will be send, too.
(string-append
"{{Script
|Name = " name "
|Author = " (scheme-escape(d-GetUserName)) "
|Label = " label "
|License = GPL
|Explanation = " tooltip "
|SubLabel = " menupath "
|Version = " DENEMO_VERSION "
}}
=== Script ===
" script "
=== Initscript ===
" initscript "
=== After ===
" after "
")
)
;Send the data to let the API generate a new site!
(d-HTTP
HTTPHostname
HTTPSite
CookieStringReturn
(string-append "action=edit&title=" name "&format=json&summary=" tooltip "&text=" (SiteString) "&token=" (GetEditToken name CookieStringReturn))
)
;Show script in browser
(d-Help (string-append "http://" HTTPHostname "/index.php/" name))
); End of GetLicenseAndBuildString
;check if Login/Building the Cookie was correct
(if (string-ci=? CookieStringReturn "CookieError")
(display "\nAn error occured while performing the task. Thats why the result of your Upload-Command is: ")
(GetLicenseAndBuildString)
)
);;;; End of OverwritePage
;;;; The real action happens here. This is the only place where (CookieString) is called so we have only one Login at all.
(display (OverwritePage (CookieString) )) ;show and execute
) ; End Of (d-UploadRoutine)