// ============================================================ // COLLAR SYSTEM - LOCK MODUL // Lock/Unlock per PIN, PIN ändern, PERMALOCK (unumkehrbar). // PIN wird nur als SHA1-Hash gespeichert, nie im Klartext. // ============================================================ integer LM_LOCK_TOGGLE = 300; // core -> lock : str=PIN (leer beim Sperren), id=Toucher integer LM_LOCK_SETPIN = 302; // core -> lock : str=NeuePIN, id=Toucher integer LM_LOCK_PERMALOCK = 303; // core -> lock : id=Toucher integer LM_RLV_REFRESH = 500; key OwnerKey() { return (key)llLinksetDataRead("owner_key"); } integer HasRights(key id) { if (id == OwnerKey()) return TRUE; string trustList = llLinksetDataRead("trustees"); if (llSubStringIndex(trustList, (string)id) != -1) return TRUE; if (OwnerKey() == NULL_KEY && id == llGetOwner()) return TRUE; // frei: Trägerin selbst darf return FALSE; } default { state_entry() { if (llLinksetDataRead("pin") == "") llLinksetDataWrite("pin", llSHA1String("0000")); } link_message(integer sender, integer num, string str, key id) { if (num == LM_LOCK_PERMALOCK) { if (!HasRights(id)) return; llLinksetDataWrite("locked", "1"); llLinksetDataWrite("permalocked", "1"); llOwnerSay("Das Collar wurde PERMANENT gesperrt und kann nicht mehr entfernt oder entsperrt werden."); llMessageLinked(LINK_SET, LM_RLV_REFRESH, "", NULL_KEY); return; } if (num == LM_LOCK_SETPIN) { if (!HasRights(id)) return; if (llStringLength(str) < 4) { llRegionSayTo(id, 0, "PIN muss mindestens 4 Zeichen haben."); return; } llLinksetDataWrite("pin", llSHA1String(str)); llRegionSayTo(id, 0, "PIN wurde geändert."); return; } if (num == LM_LOCK_TOGGLE) { if ((integer)llLinksetDataRead("permalocked") == 1) { llRegionSayTo(id, 0, "Dieses Collar ist PERMANENT gesperrt. Es gibt kein Entsperren."); return; } integer locked = (integer)llLinksetDataRead("locked"); if (locked) { // Entsperren -> PIN prüfen if (llSHA1String(str) == llLinksetDataRead("pin")) { llLinksetDataWrite("locked", "0"); llOwnerSay("Das Collar wurde entsperrt."); llMessageLinked(LINK_SET, LM_RLV_REFRESH, "", NULL_KEY); } else { llRegionSayTo(id, 0, "Falsche PIN."); } } else { if (!HasRights(id)) return; llLinksetDataWrite("locked", "1"); llOwnerSay("Das Collar wurde gesperrt."); llMessageLinked(LINK_SET, LM_RLV_REFRESH, "", NULL_KEY); } } } }