$include $lib/alynna $pubdef : $def DEBUG? prog "?" flag? if $pubdef BaseURL { "http://" "servername" sysparm ":" "wwwport" sysparm }cat $pubdef DispatchURL { "http://" "servername" sysparm ":" "wwwport" sysparm "/ajax" }cat $def SESSIONINFO #0 "@ajaxSessions" $pubdef }w }cat descr swap notify_descriptor $pubdef XHTML { "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">" }w lvar web lvar cgi lvar cookies lvar post lvar session lvar headers $pubdef DEFINE_AJAX_VARS lvar web lvar cgi lvar cookies lvar post lvar session lvar headers $def preload descr httpdata web ! descr get_cgi cgi ! descr get_cookies cookies ! { web @ "postdata" [] dup not if pop else foreach var! tmp tmp @ array_count 1 = if tmp @ 0 [] else tmp @ then repeat then }dict post ! web @ "HeaderData" [] headers ! $pubdef preload descr httpdata web ! descr get_cgi cgi ! descr get_cookies cookies ! { web @ "postdata" [] dup not if pop else foreach var! tmp tmp @ array_count 1 = if tmp @ 0 [] else tmp @ then repeat then }dict post ! web @ "HeaderData" [] headers ! $def associate_session descr get_cookies dup cookies ! "session" [] dup not if pop #-1 else dup session ! "owner" getsession dup ok? not if pop #-1 then then me ! $pubdef associate_session descr get_cookies dup cookies ! "session" [] dup not if pop #-1 else dup session ! "owner" getsession dup ok? not if pop #-1 then then me ! $libdef guid : zeropad[ str:hex int:digits -- str:result ] "0000000000000000" hex @ strcat dup strlen digits @ - strcut swap pop ; : guid[ -- str:guid ] { systime_precise modf swap int itoh "-" rot 65536.0 * int itoh 4 zeropad "-" random 65536 % itoh 4 zeropad "-" random 65536.0 / int itoh 4 zeropad "-" frand 2.0 16.0 pow * int itoh 4 zeropad frand 2.0 16.0 pow * int itoh 4 zeropad frand 2.0 16.0 pow * int itoh 4 zeropad }join ; PUBLIC guid : validateuid[ uid -- out ] uid @ dbref? if uid @ "~ajax/session" getprop dup not if pop "00000000-0000-0000-0000-000000000000" exit then then uid @ string? not if "00000000-0000-0000-0000-000000000000" exit then uid @ ; : getsession[ uid s:p -- x:value ] SESSIONINFO { swap "/" uid @ validateuid "/" p @ }cat getprop ; PUBLIC getsession $libdef getsession : setsession[ uid s:p x:value -- ] SESSIONINFO { swap "/" uid @ validateuid "/" p @ }cat value @ setprop ; PUBLIC setsession $libdef setsession : delsession[ uid s:p ] SESSIONINFO { swap "/" uid @ validateuid "/" p @ }cat remove_prop ; PUBLIC delsession $libdef delsession : newsession[ i:de d:target s:password -- s:uid ] target @ password @ checkpassword if guid var! uid target @ "~ajax/session" uid @ setprop uid @ "owner" target @ setsession uid @ "ip" de @ descripnum setsession uid @ "atime" systime setsession uid @ else "" then ; PUBLIC newsession $libdef newsession : endsession[ uid -- ] var target uid @ dbref? if uid @ target ! target @ "~ajax/session" getprop uid ! else uid @ "owner" getsession target ! then SESSIONINFO { swap "/" uid @ "/" }cat remove_prop target @ "~ajax/session" remove_prop ; PUBLIC endsession $libdef endsession : cgi_encode[ s:in -- s:out ] { 0 var! x begin x ++ x @ in @ strlen > if break then in @ x @ 1 midstr var! c "$&+,/:;=?@ <>#%{}|^~[]`\\\" " c @ (") instr c @ ctoi 32 < c @ ctoi 127 > or or if c @ ctoi itoh "00" swap strcat dup strlen 2 - strcut swap pop "%" swap strcat else c @ then repeat }cat ; PUBLIC cgi_encode $libdef cgi_encode : cgi_decode[ s:in -- s:out ] { 0 var! x begin x ++ x @ in @ strlen > if break then in @ x @ 1 midstr dup "%" strcmp not if pop x ++ in @ x @ 2 midstr htoi itoc x ++ then repeat }cat ; PUBLIC cgi_decode $libdef cgi_decode : get_headers[ i:d -- dict:headers ] d @ httpdata "HeaderData" [] ; PUBLIC get_headers $libdef get_headers : get_cgi[ i:d -- dict:cgi ] { d @ httpdata "CGIParams" [] " " "+" subst "&" explode_array dup if foreach var! txt pop txt @ "=" split cgi_decode swap cgi_decode swap repeat else pop then }dict ; PUBLIC get_cgi $libdef get_cgi : cookies-d2s[ dict:cookies -- string ] { cookies @ foreach "=" swap strcat strcat repeat }array "; " array_join ; PUBLIC cookies-d2s $libdef cookies-d2s : cookies-s2d[ string:cookies -- dict ] { cookies @ "; " explode_array foreach swap pop "=" split repeat } 2 / array_make_dict ; PUBLIC cookies-s2d $libdef cookies-s2d : get_cookies[ i:de -- dict:cookies ] de @ get_headers "Cookie" [] dup string? if cookies-s2d else pop { }dict then ; PUBLIC get_cookies $libdef get_cookies : set_cookie[ s:sess ] { "Set-Cookie: session=" sess @ "; expires=" "%a, %d %b %Y %H:%M:%S GMT\r\n" systime 86400 7 * + timefmt }cat ; PUBLIC set_cookie $libdef set_cookie : clear_cookie { "Set-Cookie: session=; expires=" "%a, %d %b %Y %H:%M:%S GMT\r\n" 1 timefmt }cat ; PUBLIC clear_cookie $libdef clear_cookie : send_headers[ s:cookie ] associate_session descr { "HTTP/1.1 200 OK\r\n" "Server: " version "MUCK/" "MUCK" subst "\r\n" "Connection: close\r\n" "Content-Type: text/html, charset=ISO-8859-1\r\n" "Cache-Control: post-check=0, pre-check=0\r\n" "Pragma: no-cache\r\n" "Expires: %a, %d %b %Y %H:%M:%S GMT\r\n" 1234567890 timefmt "Cache-Control: no-cache, no-store, must-revalidate\r\n" "Last-Modified: %a, %d %b %Y %H:%M:%S GMT\r\n" systime timefmt cookie @ not if ( expire a cookie if we have no session data for it ) cookies @ "session" [] dup if "owner" getsession not if clear_cookie then else pop then then cookie @ dup not if pop then }cat notify_descriptor descr 13 notify_descriptor_char descr 10 notify_descriptor_char ; PUBLIC send_headers $libdef send_headers : keyed_decrypt[ s:input i:de d:target -- s:salt ] input @ base64decode { #0 "@ajax/pubkey" getprop "|" de @ descripnum "|#" target @ int }cat base64encode strdecrypt ; PUBLIC keyed_decrypt $libdef keyed_decrypt : keyed_encrypt[ s:input i:de d:target -- s:output ] input @ { #0 "@ajax/pubkey" getprop "|" de @ descripnum "|#" target @ int }cat base64encode strencrypt base64encode ; PUBLIC keyed_encrypt $libdef keyed_encrypt : sysMessage { #0 "@ajax/sysmessage" getprop dup if "<br />" else pop then me @ if me @ "~ajax/sysmessage" getprop dup if "<br />" else pop then me @ "~ajax/message" getprop dup if "<br />" me @ "~ajax/message" remove_prop else pop then then }cat ; PUBLIC sysMessage $libdef sysMessage : sysMessage_Request[ a:lines -- s:uid ] guid var! uid #0 { "@ajaxtmp/" uid @ }cat lines @ array_put_proplist uid @ ; PUBLIC sysMessage_Request $libdef sysMessage_request : sysMessage_Return[ s:back s:uid -- ] #0 { "@ajaxtmp/" uid @ "/back" }cat back @ setprop ; PUBLIC sysMessage_Return $libdef sysMessage_Return : sysMessage_Response[ -- s:output ] preload cgi @ "uid" [] var! uid { #0 { "@ajaxtmp/" uid @ }cat array_get_proplist "" array_join #0 { "@ajaxtmp/" uid @ "/back" }cat getprop if #0 if "<p><a href='" #0 { "@ajaxtmp/" uid @ "/back" }cat getprop "'>Click here to return</a></p>" then then }cat #0 { "@ajaxtmp/" uid @ "#" }cat remove_prop #0 { "@ajaxtmp/" uid @ }cat remove_prop ; PUBLIC sysMessage_Response $libdef sysMessage_Response : main pop ( descr httpdata debug_line pop ) preload associate_session ( post @ debug_line pop ) "" send_headers session @ if ( If I have a session, keep it current ) session @ "atime" systime setsession then ( For the AJAX queues, because the site checks on modules ) ( Your module will be called with the current user or #-1 if noone is logged into this session ) ( The function 'updated?' will be called. If you return a 1 it will be sent back to the browser for refresh. ) ( Answer 1 if : * You always need updated * You don't always need updated but something changed and you do now Answer for the user sent to the module. If you don't need to be updated, answer 0. ) { post @ "r" [] atoi if ( R=1 for first time refresh, so return the name of every module ) #0 "/@ajax/queue/" array_get_propvals foreach var! module var! modname modname @ repeat else ( when R=0 query each module if it needs refreshed.. ) #0 "/@ajax/queue/" array_get_propvals foreach var! module var! modname me @ module @ "updated?" call if modname @ then repeat then }array ";" array_join descr swap notify_descriptor ;