denemo-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Denemo-devel] New Upload script


From: Jeremiah Benham
Subject: Re: [Denemo-devel] New Upload script
Date: Tue, 25 Aug 2009 11:14:35 -0500
User-agent: Mutt/1.5.18 (2008-05-17)

On Tue, Aug 25, 2009 at 11:55:25AM +0200, Nils wrote:
> It seems that the last uploadscript had two errors. Here is the new one which 
> works again.
> 
> Jeremiah, is my Savannah-account allowed to have write-access for Denemo's 
> GIT?


I think you do. You have to do the logged git though. 

Jeremiah

> 
> Nils

> ;;;;;;;;;;;;;;;;;;;;;;;;;;
> ;;;; 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 ===                        
> <syntaxhighlight lang=\"scheme\">
> " script "
> </syntaxhighlight>
>                       
> === Initscript === 
> <syntaxhighlight lang=\"scheme\">
> " initscript "
> </syntaxhighlight>
>                       
> === After === 
> <syntaxhighlight lang=\"scheme\">
> " after "
> </syntaxhighlight>
> ")
>                       )
>                       
>                       ;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)

> _______________________________________________
> Denemo-devel mailing list
> address@hidden
> http://lists.gnu.org/mailman/listinfo/denemo-devel





reply via email to

[Prev in Thread] Current Thread [Next in Thread]