All pastes #538202 Raw Edit

Stuff

public text v1 · immutable
·published 2007-06-04 23:42 UTC
rendered paste body
//JoomlaSL Server Code written by GP Runo 
//Released under GNU/GPL License
//Copyrights J. van Veen/GP Runo 
//For more information about SL-services, go to http://www.syntheticworlds.eu

list entryList;
list sessionList;
key userkey;
key setupID;

string initmessage; 
string operatemessage; string exitmessage; 
string sitetitle; string url;
string setupNotecardName="JoomlaSL Setup";

integer md5key; integer updatedb; string channelnr;
integer setupNotecardLine;
integer setupInitialized=0;
integer stridelengthUser = 6;
integer stridelengthSession = 6;
integer serverchannel;
list allowedTerminals;
list allowedAdmins;
key authkey="";

    initSetup() {
    llSetStatus(STATUS_BLOCK_GRAB, TRUE);
    setupNotecardLine = 0;
    setupID = llGetNotecardLine(setupNotecardName,setupNotecardLine);        
    }
    
    integer checkAuth(key id,string type) {
        if(type=="allowedTerminals") {
        integer i;
           for (i=0; i<llGetListLength(allowedTerminals);i++) {
                if(llList2String(allowedTerminals,i)==id) {
                //Console session is valid, now get authkey
                authkey = llList2String(sessionList, entryExists("session",id)+1);
                return TRUE;    
                }
            }
        return FALSE;  
        }  
        else if(type=="allowedAdmins") {
        integer i;
           for (i=0; i<llGetListLength(allowedAdmins);i++) {
                if(llList2String(allowedAdmins,i)==(string)id) {
                return TRUE;    
                }
            }
        return FALSE;  
        }  
        else {
        return FALSE;
        }
    }
    
    //return the user's session information in a list. First search for the terminalid, then fill a templist with all within the stride
    list getSession(key terminalid) {
    list tempList=[];
    integer i;
    integer pos = entryExists("session",terminalid);
        for(i = pos; i <= (pos + stridelengthSession); i++) {
        tempList+=llList2String(sessionList,i);   
        }
    return tempList; 
    }
    
    string generatePW(float uniqueness) {
    list primewords = ["alpha","beta","gamma","zulu","bravo","cappa","tango"];
    string randomWord = llList2String(primewords,(integer)llFrand(llGetListLength(primewords))); 
    string randomNumber = (string)llRound(llFrand(uniqueness)); 
    return (randomWord+randomNumber);   
    }

    integer entryExists(string searchArg, string searchFor) {
    integer index;
        if (searchArg == "username") {
        index = llListFindList( entryList,[searchFor]);
        }
        else if (searchArg == "id") {
        index = llListFindList( entryList, [(key)searchFor]);
        } 
        else if (searchArg == "session") {
        index = llListFindList( sessionList, [searchFor]);
        } 
    return index;
    }
    
    integer addEntry(string username, string id, string password,string mail, string userborn, string userpayment) {
        if(entryExists("id",id)  < 0) {
        entryList += [username,id,llMD5String(password,md5key),mail,userborn,userpayment];
        entryList = llListSort(entryList, stridelengthUser, TRUE);
        return TRUE;
        }  
        else {  
        return FALSE;   
        } 
    }

    integer removeEntry(string searchArg, string firstElement) {  
        if (searchArg=="entryList") {
        integer atIndex = entryExists("username",firstElement);
            if (atIndex!=-1) {
            entryList = llDeleteSubList(entryList, atIndex, (atIndex+(stridelengthUser - 1)));   
            return TRUE; 
            }
        }
        if (searchArg=="sessionList") {
        integer atIndex = entryExists("session",firstElement);
            if (atIndex!=-1) {
            sessionList = llDeleteSubList(sessionList, atIndex, (atIndex+(stridelengthSession - 1)));   
            return TRUE; 
            }
        }
    return FALSE;
    }
    
    integer updateEntry(string username, string entry, string value) {
    list templist = [value];
    integer atIndex = entryExists("username",username);
        if (atIndex!=-1) { 
            if(entry=="password") {
            entryList = llListReplaceList(entryList,templist,atIndex+2,atIndex+2);  
            return TRUE;
            }   
            else if(entry=="mail") {
            entryList = llListReplaceList(entryList,templist,atIndex+3,atIndex+3);  
            return TRUE;
            }
        return FALSE;
        }
    return FALSE; 
    }


default {
    
    state_entry() {
        if(setupInitialized==0) {
        initSetup();
        } 
        else {
        state offline;    
        }
    }
        
    dataserver(key query_id, string data) {
        if(query_id == setupID) {
            setupInitialized=1;
            if(data != EOF) {
                list tmp = llParseString2List(data, ["="], []);
                string setting = llList2String(tmp,0);
                if (setting == "md5key") {
                md5key=llList2Integer(tmp,1);
                }
                else if (setting == "updatedb") {
                updatedb=llList2Integer(tmp,1);
                }
                else if (setting == "sitetitle") {
                sitetitle=llList2String(tmp,1); 
                }
                else if (setting == "url") {
                url=llList2String(tmp,1);
                }
                else if (setting == "serverchannel") {
                serverchannel=llList2Integer(tmp,1);
                }
                else if (setting == "initmessage") {
                initmessage=llList2String(tmp,1);
                }
                else if (setting == "operatemessage") {
                operatemessage=llList2String(tmp,1);
                }
                else if (setting == "exitmessage") {
                exitmessage=llList2String(tmp,1);
                }
                else if (setting == "allowedTerminals") {
                allowedTerminals = llCSV2List(llList2String(tmp,1));
                }
                else if (setting == "allowedAdmins") {
                allowedAdmins = llCSV2List(llList2String(tmp,1));
                }
                setupID = llGetNotecardLine(setupNotecardName,++setupNotecardLine); 
            }
            else {
            llOwnerSay("Settings retrieved, server is operational...");  
            state offline;
            }
        }
    }   
}
  
//There are 4 authentication levels: 
//AUTH1:No authentication(needed to create a session)
//AUTH2:Admin authentication(Admins from not verified terminals)
//AUTH3:Terminal authentication(valid terminalrequests from standard users)
//AUTH4:Terminal/Admin authentication(valid terminalrequests from administrators)

state offline {
   
    state_entry() {
    llSetText(initmessage, <1,1,1>, 1);       
    }
    
    touch_start( integer num ) {
        userkey = llDetectedKey(0);
//*******************************************************AUTH2*******************************************************        
        if(checkAuth(userkey,"allowedAdmins")) {
        llSetText(operatemessage, <1,1,1>, 1);
        state online;
        }
        else {
        llInstantMessage(userkey,"Only valid administrators may control the JoomlaSL server!");    
        }
    }    
}

state online {   
    state_entry() {
    llListen(serverchannel, "JoomlaSL terminal", NULL_KEY, "" );  
    }
    
    listen( integer channel, string name, key id, string message ) { 
//*******************************************************AUTH1*******************************************************
    list elements = llParseString2List(message, [" "], []);  
    string command = llList2String(elements,0);
    integer nrparams = llGetListLength(elements) - 1;
        //Initial session command from the console
        if (command == "startSession") {
            if(nrparams == 6) {
            integer i;
                //Session-entry looks like: [consoleid, userkey, username, born, payinfo, channelid]
                sessionList += [(string)id];
                for(i=1; i <= nrparams;i++) {
                sessionList +=[llList2String(elements,i)];
                }
            }
            else {
            llSay(0,"\nErrorcode 1: Failed to start a new session!\nThe administrator will be informed about the problem...");     
            }
        }
        
    //Match an incoming request from a console with the available sessiondata
    list sessionUser = getSession(id);
    string username = llList2String(sessionUser,2) + " " + llList2String(sessionUser,3);
    string userkey = llList2String(sessionUser,1);
    string userborn = llList2String(sessionUser,4);
    string userpay = llList2String(sessionUser,5);
    channelnr = llList2String(sessionUser,6);
//*******************************************************AUTH2*******************************************************
        if(checkAuth(userkey,"allowedAdmins")) {
            if (command == "consoleid") {
            llInstantMessage(userkey,(string)id);    
            }
            if (command == "serverid") {
            llInstantMessage(userkey,llGetKey());    
            }
        }
        
//*******************************************************AUTH3*******************************************************
        if(checkAuth(id,"allowedTerminals")) {
            
            if (command =="endSession") {
                if(!removeEntry("sessionList",(string)id)) {
                llSay(0,"\nErrorcode 2: Failed to delete session!\nThe administrator will be informed about the problem...");     
                }
            }
            
            if (command == "help") {
            string helpString;    
            integer atIndex = entryExists("username",username);    
            helpString = "\n====User options===\n";
            helpString+= "/"+ channelnr + " community___________________Go to our community webpage\n";
            helpString+= "/"+ channelnr + " avkeyreq___________________Request your personal key\n";            
                if (atIndex==-1) {
                helpString+= "/"+ channelnr + " register PARAM1(optional) PARAM2_______Register for our webservices. PARAM1=password, PARAM2=email-address\n";
                }
                else {
                helpString+= "/"+ channelnr + " update password PARAM1______Change your password. PARAM1 is the new password\n";    
                helpString+= "/"+ channelnr + " update mail PARAM1___________Changes your email-address. PARAM1 is the new address\n";
                }
            llInstantMessage(userkey,helpString);
            }
        
            else if (command == "register") {
                if(nrparams == 2) {
                //username, userkey, password, email, born, payinfo
                    if(addEntry(username, userkey, llList2String(elements,1),llList2String(elements,2), userborn, userpay)) {
                    llInstantMessage(userkey,"\nThank you for registering!\nYour username is: "+username+"\nYour password will be: "+llList2String(elements,1)+"\nYou can use this info to login at our community website now...\n");   
                    llLoadURL(userkey,sitetitle,url); 
                    }  
                    else {
                    llInstantMessage(userkey,"\nYou are allready registered...");      
                    }
                }
                else if(nrparams == 1) {
                    string genPW = generatePW(666);
                    if(addEntry(username, userkey, genPW,llList2String(elements,1), userborn, userpay)) {
                    llInstantMessage(userkey,"\nThank you for registering!\nYour username is: "+username+"\nYour password will be: "+genPW+"\nYou can use this info to login at our community website now...\n");   
                    llLoadURL(userkey,sitetitle,url); 
                    }  
                    else {
                    llInstantMessage(userkey,"\nYou are allready registered...");      
                    }    
                }
                else {
                llInstantMessage(llList2String(sessionUser,1),"Please enter one or two parameters...");    
                }  
            } 
            
            else if (command == "update") {
                if (nrparams == 2) {
                    if (updateEntry(username, llList2String(elements,1),llMD5String(llList2String(elements,2),md5key))) {
                    llInstantMessage(userkey,"Password updated..."); 
                    }
                    else {
                    llInstantMessage(userkey,"You have to register first");     
                    }
                }
                else {
                llInstantMessage(userkey,"Please enter a valid password(no spaces)...");    
                }
            }   
            
            else if (command == "community") {
                if (nrparams == 0) {
                llLoadURL(userkey, sitetitle, url); 
                }
                else {
                llInstantMessage(userkey,"Don't use parameters please...");    
                    }   
            }
            
            if(command =="avkeyreq") {
            llInstantMessage(userkey,(string)userkey);
            }
            
            
//*******************************************************AUTH4*******************************************************
            if(checkAuth(authkey,"allowedAdmins")) {
                        
                if(command == "members") {
                integer len = llGetListLength(entryList);
                integer i; integer j;
                string memberString;
                memberString = "\n--- Username --- avkey --- md5pw --- email --- birthdate --- payinfo ---";
                    for( i = 0; i < len; i=i + stridelengthUser) { 
                        for (j = i; j < i+stridelengthUser;j++) {
                            if(j==i) {
                            memberString += "\n--- " + llList2String(entryList, j) + " --- ";   
                            }  
                            else {  
                            memberString += llList2String(entryList, j) + " -- ";   
                            }
                        }
                    }
                llInstantMessage(userkey,memberString+"\nTotal members: " + (string)(len / stridelengthUser) ); 
                }
  
                else if(command == "membersreset") {
                entryList = llDeleteSubList(entryList, 0, llGetListLength(entryList));
                llInstantMessage(userkey,"Memberlist is empty now...");
                }
                
                else if(command == "serverreset") {
                llInstantMessage(userkey,"Server has been reset");    
                llResetScript();    
                }
            
                else if(command == "remove") {
                    if(nrparams == 2) {
                        if (removeEntry("entryList",llList2String(elements,1) + " " + llList2String(elements,2))) {
                        llOwnerSay("Entry removed...");    
                        }
                        else {
                        llInstantMessage(userkey,"User not found...");    
                        } 
                    }  
                    else {
                    llOwnerSay("Enter a valid username please...");    
                    }        
                }
            
                else if(command == "find") {
                    if(nrparams == 2) {
                    integer found=entryExists("username",(llList2String(elements,1) + " " + llList2String(elements,2)));
                        if(found >=0) {
                        integer i;    
                        string memberstring;
                            for(i = found;i< (found + stridelengthUser); i++) {
                            memberstring += llList2String(entryList, i) + " -- ";      
                            }        
                            llInstantMessage(userkey,"Entry found:\n" + memberstring);    
                        }
                        else {
                        llOwnerSay("User not found...");    
                        }      
                    }
                    else {
                    llOwnerSay("Enter a valid username please");    
                    }
                }
//*******************************************************Communication with XMLRPC link*******************************************************         
                else if (command == "channelreq") {
                    llOwnerSay("Retrieving XMLRPC-channel..."); 
                    llMessageLinked(LINK_ALL_OTHERS, 0, "channelreq", NULL_KEY);   
                }
                else if (command == "channelreset") {
                    llOwnerSay("Resetting XMLRPC-channel...");    
                    llMessageLinked(2, 0, "channelreset", NULL_KEY);
                }
                else if (command == "linkreq") {
                    llOwnerSay("Retrieving XMLRPC link-number...");    
                    llMessageLinked(LINK_ALL_OTHERS, 0, "linkreq", NULL_KEY);
                }
//********************************************************************************************************************************************                
                else if (command == "clearbans") {
                llResetLandBanList();
                llInstantMessage(userkey,"All bans removed...");
                }
            
                else if (command == "clearpass") {
                llResetLandPassList();
                llInstantMessage(userkey,"All passage privileges removed...");
                }
                
                else if (command == "memoryheap") {
                llInstantMessage(userkey,(string)llGetFreeMemory());    
                }
            
            //if (command == "tempban") {
             //   if(nrparams == 2) {    
            //    llAddToLandBanList(llDetectedKey(i),1.0);
             //   }
             //   else {
             //       
             //   }
            //}  
        
                else if (command == "help") {
                string helpString = "\n====Admin options===\n";
                helpString+= "/"+ channelnr + " visitorsreset_________Remove all visitors\n";
                helpString+= "/"+ channelnr + " membersreset________Remove all members\n";
                helpString+= "/"+ channelnr + " serverreset________Reset all server settings(removes ALL stored data!)\n";   
                helpString+= "/"+ channelnr + " visitors_____________Show all visitors\n";
                helpString+= "/"+ channelnr + " members____________Show all members\n";
                helpString+= "/"+ channelnr + " find PARAM1_________Search for specific member\n";
                helpString+= "/"+ channelnr + " remove PARAM1______Remove specific member\n";
                helpString+= "/"+ channelnr + " channelreq__________Show all available XMLRPC channels\n";
                helpString+= "/"+ channelnr + " linkreq__________Show the XMLRPC link-channels\n";
                helpString+= "/"+ channelnr + " consoleid__________Show the current console-ID\n";
                helpString+= "/"+ channelnr + " serverid__________Show the server-ID\n";
                helpString+= "/"+ channelnr + " memoryheap__________Show the memory-heap footprint\n";
                helpString+= "/"+ channelnr + " clearbans____________Clear all bans\n";
                helpString+= "/"+ channelnr + " clearpass____________Clear all passage privileges\n";
                llInstantMessage(userkey,helpString);
                }
            } 
        }
        else {
        llInstantMessage(userkey,"\nTerminal not authenticated!\nUse \"/" + channelnr + " consoleid\" to identify 
        this console(administrators only)");    
        }
        
        if(command!="endSession") {    
        llInstantMessage(userkey,"\nType '/"+ channelnr + " help' for a list of available commands");   
        }  
    }
    
    //XMLRPC-authentication request
    link_message(integer sender_num, integer num, string str, key id) { 
    list request= llCSV2List(str);
    integer userpos = entryExists("username",llList2String(request,0));
        if(userpos >= 0) {
            if(llList2String(request,1) == llList2String(entryList,(userpos + 2))) {
            string authString="1,"+llList2String(entryList,userpos+1)+","+llList2String(entryList,userpos+3)+","+llList2String(entryList,userpos+4)+","+llList2String(entryList,userpos+5); 
            llMessageLinked(sender_num, 0, authString, NULL_KEY); 
            } 
            else {
            llMessageLinked(sender_num, 0, "wp", NULL_KEY);
            }
        }  
        else {
        llMessageLinked(sender_num, 0, "wu", NULL_KEY);
        }
    } 
 
    touch_start( integer num ) {
    userkey = llDetectedKey(0);
//*******************************************************AUTH2*******************************************************        
        if(checkAuth(userkey,"allowedAdmins")) {   
        llSetText(exitmessage, <1,1,1>, 1);
        sessionList=[];
        llSleep(1);
        llSetText(initmessage, <1,1,1>, 1);
        state default;    
        }
        else {
        llInstantMessage(userkey,"Only valid administrators may control the JoomlaSL server!");    
        }
    }
}