diff --git a/CHANGESTODO b/CHANGESTODO index a462761..1686729 100644 --- a/CHANGESTODO +++ b/CHANGESTODO @@ -1,11 +1,14 @@ vim:nosmarttab:syntax=diff ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ -This file contains TODO and CHANGES (at EOF) rolled into one. -Essentially: whenever you fix something, move that line to the end of file. -- marks bugs & fixes, + marks new features, ? marks issues, * marks big stuff +| This file contains TODO and CHANGES (at EOF) rolled into one. +| Essentially: whenever you fix something, move that line to the end of file. +| - marks bugs & fixes, + marks new features, ? marks issues, * marks big stuff ________________________________________________________________________ == NEXT RELEASE ======================================================== ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ +- interserver xmpp /me expects no leading newline, but pidgin recently + started sending one + - autorefetch twitter isnt working http/fetch is too complicated. throw out the queue and callback logic. kiss! @@ -21,7 +24,7 @@ ________________________________________________________________________ ________________________________________________________________________ == currently being inspected =========================================== ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ -? /ve/TODO/leave-from-user +- install.sh/configure doesn't *ensure* libidn is available - newbies are allowed to open new owned rooms fippo sagt: ergo brauchst du nen exit-hook der owner löscht wenn der n00b-owner aus dem raum geht @@ -69,6 +72,7 @@ ________________________________________________________________________ ? should /load inform that errors go to the console? +- the ~0 bug ________________________________________________________________________ :_group psyc://psyced.org/@welcome :_source_identification psyc://xxx.no-ip.org/~xxx @@ -94,14 +98,15 @@ In welcome spricht «psyc://xxx.no-ip.org/~0» xxx: it should either ignore firs ________________________________________________________________________ == psyced 1.0 ========================================================== ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ -SPYC (implementation of http://about.psyc.eu/Specification) -* to activate spyc support, defined USE_SPYC - it will attempt to use new syntax on outgoing links by default -* to debug verification, define USE_VERIFICATION -* to spend an extra round trip time negotiating, define USE_FEATURES +> SPYC - net/spyc is buggy and incomplete + (implementation of http://about.psyc.eu/Specification) +_ to activate spyc support, defined USE_SPYC + it will attempt to use new syntax on outgoing links by default +_ to debug verification, define USE_VERIFICATION +_ to spend an extra round trip time negotiating, define USE_FEATURES -INVITE ISSUES +> INVITE ISSUES - remote /invite is shown without uniform, just #nick_place remote invite thus doesn't work for ircers.. beta's lynx invites psyc://psyced.org/~gynx into TEST. @@ -122,7 +127,7 @@ INVITE ISSUES there is a circuit already (should it be a _request!?) - /invite should do remote echo like _message_private, not local -REMOVE NICKNAMES FROM PROTOCOL +> REMOVE NICKNAMES FROM PROTOCOL ? remote uniforms could be passed around in the psyced as parse_uniform arrays rather than as strings. this opens up the possibility to have a stringprepped+lowercased version of the uniform for comparisons. @@ -142,7 +147,7 @@ REMOVE NICKNAMES FROM PROTOCOL nick/alias when a friend (or local?), full uniform when unknown... so all [_nick] should simply be replaced by [_source] etc. ! implementing the latter approach with the uni2nick callback strategy! -AUTOALIASES & ALIASES FOR PLACES +> AUTOALIASES & ALIASES FOR PLACES + /set aliases auto use temporary aliases for people in places, keep them in [r]aliases mappings only, not in v("aliases") @@ -161,7 +166,7 @@ problems that should disappear when we move away from _nick's: friendship requests. eh! where's the uniform!? - remote /topic shows wrong nick -PRESENCE STATUS +> PRESENCE STATUS + all _status_person need to be upgraded to _status_presence with availability etc. - _status_person_present appears as a chat msg for local jabber/server users. @@ -177,7 +182,7 @@ PRESENCE STATUS net/jabber/user#whojarr oops is a roving piker. * see also various PRESENCE boxes -DECENTRALIZED STATE / PERSISTENT CONTEXT SLAVES +> DECENTRALIZED STATE / PERSISTENT CONTEXT SLAVES - do not send revision with every cast + we could use better integration of availability because right now CACHE_PRESENCE doesn't work @@ -203,7 +208,7 @@ DECENTRALIZED STATE / PERSISTENT CONTEXT SLAVES is useful even when we have packet ids in place.. some places it's okay to lose packets if at least the member lists are in sync -GENERIC CONTEXT SUBSCRIBE / PRESENCE FOR ALL +> GENERIC CONTEXT SUBSCRIBE / PRESENCE FOR ALL + krasser rewrite und fusion von raumanwesenheit und buddylists mittels generischer presence.. siehe auch http://about.psyc.eu/presence und.. schwer zu glauben, wir haben heute festgestellt, dass wir subscribe, @@ -219,12 +224,13 @@ see also http://about.psyc.eu/subscription not from own UNI (see #ifdef FRIEND_ECHO) ... or just rewrite it all into context subscription!! -ARCHETYPE PLACES +> ARCHETYPE PLACES ? archetype.gen & other places: current privilege model sux. qAide(), qOwner(), boss(source), v("topic-user") .. how does this fit with confctrl, _duty and qAllowExternal? .. and in some cases you just want to check for isMember +>>> - REGISTERED_USERS_ONLY does not behave properly on IRC port (see also NO_NEWBIES ... clean up and rename?) @@ -305,6 +311,11 @@ ________________________________________________________________________ - place redirection doesn't work for ircII: client still thinks i am in the first room while i get messages from the second room. when i type stuff to the first room, it doesn't even forward to the second. + +- psyced spits out _error_rejected_relay_incoming for hostnames that have + been redirected using SRV. x-net.hu's A record is still being checked. + _psyc._tcp.x-net.hu has SRV record 0 0 14404 psyc.x-net.hu. + ________________________________________________________________________ == MINOR DELEGATES ===================================================== ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ @@ -369,12 +380,12 @@ ________________________________________________________________________ ? generate psyced without cvs support if no cvs installed? ... bzw. git -WINDOWS DISTRIBUTION +> WINDOWS DISTRIBUTION ? how can we compile SRV into erq.exe? do we care? ? which open source installer for win to use? ? what to do about psyconf.. include perl or re-implement psyconf for win? -TWITTER +> TWITTER + resolve redirect-urls before forwarding to subscriptions, that means, calling http/fetch on http://tr.im/whatever urls until it no longer returns a 30x redirection code. [improves privacy btw, since all those @@ -402,7 +413,7 @@ ________________________________________________________________________ ? apply more TAGGING (tagged callbacks also avoid the monster switches) -CIRCUITRY +> CIRCUITRY - _request_circuit_shutdown isnt issued or doesnt arrive or is the disconnected-detection buggy? + net/circuit:pushback TODO: @@ -433,24 +444,24 @@ CIRCUITRY ? what to do when hosts talk faster then we resolve them? see around _error_invalid_host_slow -TRUST1 +> TRUST1 - _request_circuit_trust needs to check some challenge, or it can be tricked by replay. so for now only use it over safe networks!! ? generic SASL for xmpp, psyc and irc? -TRUST2 +> TRUST2 ? TRUSTED_HOSTS are permitted to relay, this allows all users from that host to relay.. not so cool. + the trust implementation needs to learn to distinguish host trust and person trust, yet understand the interaction and develop maths for it -SCHEMES AND SERVICES +> SCHEMES AND SERVICES + allow for icq: rather than xmpp:XXX@icq etc. + implement *.service.* and *.scheme.* etc according to http://about.psyc.eu/Directory_Service - so that mailto: works for any server + move the .psyc.eu suffix into a #define + implement forward-to-mailto-when-offline as a generic forwarding feature -FOLLOW INVITES +> FOLLOW INVITES + /set follow all|friends|none allow your friends to invite you (and make you follow) into a room so that they can immediately start talking to a group of people like @@ -461,6 +472,7 @@ FOLLOW INVITES create a subchannel of your self context, containing only the friends you want to have a conversation with, and poof you can start talking! +>>> - ok, x@y notation sollte mind. dots im host überprüfen, wenn nicht sogar leading # In BuHa fragt el_presidente: inseln? @@ -470,13 +482,15 @@ FOLLOW INVITES C:xmpp:euirc · euirc does not resolve In BuHa fragt el_presidente: was soll da passieren? -- improve handling of "Minusport" outgoing stuff: - reject and handle _failures -? suspend flag on error? like this: when you receive errors, that a user or a +> ERROR HANDLING +- reject and handle _failures + suspend flag on error? like this: when you receive errors, that a user or a host could not be reached, then the castmsg'ing entity could flag this candidate as 'suspended' or 'temporarily unreachable' - and automatically change this status with the first sign of life from that entity or server. this would save friendship status and room presence across downtimes. + : added PPL_NOTIFY_INACTIVE to peers.h but actually this needs a more + generic solution for all contexts. see krasser rewrite. ? uni.c kümmert sich nicht um castmsg(), weswegen presence zurecht immer zur UNI gehen, aber leider auch raumcasts. im falle von jabber UNRs @@ -494,7 +508,7 @@ fritz: fritz zuckt. fippo: TAGGING koennte dieses problem bald loesen wie denn? was würde reply() anders machen? -PRESENCE +> PRESENCE - eigene mood & availability erscheinen nicht im showStatus (description schon, aber das war's noch nicht) - irc access receives _status_away notices for each message they send to a @@ -509,42 +523,8 @@ PRESENCE man kann eine passende _notice machen und wird sogar als friend gelistet - persistent_presence does not store description and mood - gmail hat irgendwelche anderen probleme... -- heute nachmittag stand auf dem schirm: - oops schließt mit Dir Freundschaft. - TAV möchte mit Dir Freundschaft schließen. - bin mir ziemlich sicher, dass es keinen lokalen oops gibt.. es handelt sich - um eine fehlerhafte doppelte darstellung vom TAV alias ohne sein @gmail.com!? - einige stunden später: - Du bist mit oops bereits befreundet. - TAV möchte mit Dir Freundschaft schließen. - ? mir scheint das passiert nicht mehr.. - wenn "bereits befreundet" ausgegeben wird, geht auch ne textmeldung an - tav auf gmail raus. eine die es in jabberland nicht gibt. das wär okay - wenn wir keinen bug hätten..... - * also eigentlich sollte da ein "meinetwegen bist du subscribed" rausgehen - weshalb wir nur noch das display an unseren user unterdruecken muessten - hier ein ausschnitt aus der rawlog.. - -» S:xmpp:64.233.166.129:-26112 -« C:xmpp:gmail.com - - -« C:xmpp:gmail.com - - ..man beachte, die newlines nach type='subscribed'/> wurden scheinbar - wirklich gesendet, aber vermutlich harmlos. dass gmail einen subscribe - abschickt für jemanden mit dem man schon längst befreundet ist, dass ist - wohl das problem. vermutlich ein dirty hack im umgang mit herkömmlichen - jabber servern welcher bei uns aber doofe effekte hat. was tun? genau - genommen müsste man errors zurückschicken, aber das wird die gmail-user - nicht glücklich stimmen.. sonst? einfach verwerfen? na gut - ... hmm würde es reichen dafür ausserhalb des switch display=0 zu setzen - und nur im fall von PPL_NOTIFY_PENDING display=1 einzuschalten? - * man sollte wirklich mal von wem kompetentes auf gmail-seite den - subscription state checken lassen. ich vermute, die lassen - gaim-b0rkedness raus in die welt. -- ouch!! ganz schlimm.. es ist kein gmail-only problem! +>>> +- unnecessary refriendship requests wenn ich mit Alias: xmpp:symlynx@example.ccc.de = JYNX /friend mache kommt: symlynx schließt mit Dir Freundschaft. JYNX möchte mit Dir Freundschaft schließen. @@ -581,7 +561,7 @@ JYNX möchte mit Dir Freundschaft schließen. - falls /set entersilent off so erhalten bleibt, dokumentieren -PROGRAMMABLE USER IDENTIFICATIONS & MULTIPLE CLIENT INTERFACES +> PROGRAMMABLE USER IDENTIFICATIONS & MULTIPLE CLIENT INTERFACES - experimental rename fails sometimes: Attempt to rename to existing object '~nautilutz' possible fix: separate user identity from user access interface @@ -602,7 +582,7 @@ PROGRAMMABLE USER IDENTIFICATIONS & MULTIPLE CLIENT INTERFACES a UNI server in c++ anyway... ;) ? consider also what CONTEXT CHANNEL requirements the new identity has -WHITELISTING & BLACKLISTING on the SERVER TRUST WEB +> WHITELISTING & BLACKLISTING on the SERVER TRUST WEB + enable the #ifdef such that dialback from new hosts is not automatically replied to, but a _request_trust_manual is sent to the monitor. see also http://about.psyc.eu/Talk:Encryption @@ -622,7 +602,7 @@ WHITELISTING & BLACKLISTING on the SERVER TRUST WEB when the server tells you about things that have happened automatically, like an automatic blacklisting. _info_adopt_trust or something. -CHARSET +> CHARSET + ensure UTF-8 at parsing time on all inputs so we can a) remove the action limitation: - when an umlaut appears in speakaction, then the entire line is not @@ -639,7 +619,7 @@ CHARSET so it is still necessary that CONSOLE_CHARSET learns to be easy about it == PSYC 1.0alpha ======================================================= -THE BIG METHOD RENAME +> THE BIG METHOD RENAME - shouldn't all _tag_reply be renamed into the more generic _tag_relay ? i mean.. pushback setting _tag_reply is semantically wrong whereas setting _tag_relay makes sense. the MMP spec has abandoned _tag_reply @@ -662,7 +642,7 @@ THE BIG METHOD RENAME should have the same names as the entries in psyced.ini if equivalent. + after /unsub and /unfriend we should also have /unset -COMPACT METHODS and KEYWORD INHERITANCE +> COMPACT METHODS and KEYWORD INHERITANCE nothing can be as fast as fixing the method inheritance at psyc parsing time. since we have to patch compact methods into long methods anyway, we know all the methods the muve can handle - so we can handle inheritance before passing @@ -677,6 +657,7 @@ clients). example: in fact.. we can even simplify all abbrev() calls into mere == comparisons or switches in our muve code, because they will never be needed! +>>> - when a _target does not comply to the rules, a message needs to be replied to with an error. currently however, handling falls thru to rootMsg() like this: @@ -688,13 +669,13 @@ or switches in our muve code, because they will never be needed! - should ignored people receive an echo for the sake of not being distinguishable from not ignored people? yes... but is a nasty change to do -TYPE CHECKING AT PARSING TIME +> TYPE CHECKING AT PARSING TIME - unless trustworthy > 4 all incoming vars should be checked for legal content, like chars in actions etc.. or maybe switch over the varnames and fix the obvious candidates.. if a method is non-standard (we will be aware of this by 1.0) we should check each var mentioned in the body. -PSYC protokoll verbessern, dass implementationen einfach sein können: +> PSYC protokoll verbessern, dass implementationen einfach sein können: + die lookup_identification queue in place/basic ist vermutlich nicht notwendig, da (a) clients den zutritt zu einem raum von ihrer UNI vermitteln lassen können und (b) scripte ihre informationen für einen @@ -724,7 +705,7 @@ PSYC protokoll verbessern, dass implementationen einfach sein können: dadurch die queues in net/circuit vereinfachen? unwahrscheinlich, aber man könnte nochmal seinen grips drauf ansetzen. -HISTORY +> HISTORY + add timestamp search to lastlog.c, add timestamp-based /history and /log commands, maybe remove v("new") code. then again, it's quite efficient. see person.h for details. @@ -748,7 +729,7 @@ ________________________________________________________________________ ? _nick_local and coolname are shown, but cannot be identified -localMUC: +> localMUC: - MUC member list may be incorrect after psyced server restart.. we should probably castmsg all local leaves at shutdown - when entering places from XMPP-S2S own id appears both @@ -765,7 +746,7 @@ localMUC: still causing problems ? M1: apparently something in psyced's MUC implementation is making mcabber crash :( -remoteMUC: +> remoteMUC: - whispering in remote MUCs: xmpp:psyc@conference.jabber.org sagt Dir: test would be nice to see the nickname at least.. ;) @@ -775,6 +756,7 @@ remoteMUC: or actually implement it? looks so stupid on telnet when typing ... then again, telnet is the only protocol that could use that.. scrapped +>>> - "asks" kommt blöd.. entweder visiblespeakaction immer, oder gar nicht (implement visiblespeakaction in net/jabber) - ausserdem wird kein asks erzeugt wenn jabberisten fragen stellen @@ -791,6 +773,12 @@ remoteMUC: ________________________________________________________________________ == JABBER CLIENT ISSUES (...experimental is justified...) ============== ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ +- display twitter notices somehow + +- when 'localhost' is chosen as server name, psyced will append invalid + dot and space in jabber output: + test@localhost. /(null) + ? XMPP: connecting to psyced.org with psi pops up a profile window everytime ? XMPP: first reply to a stranger's remote psyc message did not show up in psi ? neulich wurde 'stanly' beim runterfahren von psi nicht aus dem MUC genommen. @@ -798,7 +786,7 @@ ________________________________________________________________________ MUC meldungen. ob der fehler bei psi oder uns liegt, k.A. ... is this still happening with the new fixes? -ASTERISK IN XMPP: UNIFORMS +> ASTERISK IN XMPP: UNIFORMS - tjgillies: meebo doesn't let you put * in MUC name AFAIK the xmpp: uri does not forbid * from the URI RFC thus meebo should be incorrect here. we'll have to talk to them.. @@ -812,6 +800,7 @@ ASTERISK IN XMPP: UNIFORMS - is psi having a problem with this, too? +>>> - accurate availability values from friends aren't stored and delivered - re-subscribe isn't properly handled (so we do friend(0) earlier instead) @@ -1234,7 +1223,7 @@ ________________________________________________________________________ fippo hotzenplotzt: möglich ? problem: how to allow remote XMPP MUC users to filter web inspection notices? -PROFILES +> PROFILES ! depend on DECENTRALIZED STATE to get to the next stadium of coolness - exposed lists aren't properly sorted by expose level. a maximum expose should automatically put a friend or group at the top of the profile list etc. @@ -1250,6 +1239,7 @@ PROFILES by channels - so we have a chance to multicast changes to our profile to the intended people and don't have complexity explosion in user data for this. +>>> - Invalid password error in tn/server appears indented w/o LF + provide textdb editing mechanisms: @@ -1293,7 +1283,7 @@ PROFILES ? _subject in jabber messages wird ignoriert. was machen wir damit? -library/dns ... geht derzeit sowieso nicht ohne erq. erq muss sein! +> ERQ - an mehreren stellen verlassen wir uns darauf, dass __ERQ_MAX_SEND__ undefiniert sein wird wenn erq beim hochfahren nicht gefunden wurde, aber wenn ich ldmud mit -N aufrufe wird __ERQ_MAX_SEND__ trotzdem @@ -1301,6 +1291,7 @@ library/dns ... geht derzeit sowieso nicht ohne erq. erq muss sein! + es gibt neue localhost selbstresolver switche, das müsste mehrere if localhost abfragen im bisherigen code unnötig machen. optimization TODO +>>> - don't accept connections during shutdown sequence should work by returning 0 from master:connect() - reorder shutdown? why do we see _notice_place_leave_reload_server @@ -1407,14 +1398,6 @@ javascript:popnoresize('http://sport.ard.de/php/sportticker/?event_art=6&ticker= + spoof tester script in perl- oder pypsyc, welches gespoofte oder fehler- hafte meldungen zu erzeugen versucht um w() und co dicht zu kriegen -sollten wir wieder eine "Too deep recursion" im raumbereich haben -könnte es ein fall sein für diese kleine vermutung: - wenn QUIET_REMOTE_MEMBERS nicht defined ist, ist - isValidRelay(vars["_source_relay"]) in place/basic.c:47 bei einem - _failure_unsuccessful_delivery true, weil im _source_relay der - raum selbst steht. und dann so weiter, da der user nie aus _u - verschwindet - + support for transfer/sharing of user data between servers. when a new server is started using the .o files of an existing server, each loaded user object should be aware, that it is *not* the entity that *made* @@ -1441,18 +1424,18 @@ könnte es ein fall sein für diese kleine vermutung: trying to intantiate ridiculous objects? (no extensions outside static?) see also http://about.psyc.eu/Web_Attack ________________________________________________________________________ -* GOTCHAs +> GOTCHAs ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ! When the /topic command makes funny errors, then your room has a custom cmd() and doesn't pass vars over. It should use ON_COMMAND instead! ________________________________________________________________________ -* PSYC FUTURES see also http://about.psyc.eu/Category:Vapor +> PSYC FUTURES see also http://about.psyc.eu/Category:Vapor ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ + http://about.psyc.eu/Hashtags + http://about.psyc.eu/Follower ________________________________________________________________________ -* TOYS IN THE ATTIC +> TOYS IN THE ATTIC ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ - In welcome spricht Igramul: hmm... the "+list" command made xchat crash man sollte dazu sagen, dass er danach gesagt hat, dass es ein @@ -1482,7 +1465,7 @@ mapping rvars msg(source, mc, data, vars, rvars); wenn ein msg() signalisieren will, dass die nachricht abgearbeitet ist, gibt es return 0 statt return rvars durch. ist das alles, oder fehlt was? ________________________________________________________________________ -* GATEBOT / IRCGATE / etc +> GATEBOT / IRCGATE / etc ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ - /m freenode:symlynx hey Sorry, _message_private is not supported by the IRC gateway. @@ -1588,7 +1571,7 @@ ________________________________________________________________________ mobile phone, especially if you have permanent context subscriptions flowing into your log nonstop. -RELAYING +> RELAYING + net/spyc needs relaying (without parsing even), see TODO in parse_content() ? relaying doesn't work for psyc clients (xmpp: in particular) works for localhost clients @@ -1608,26 +1591,14 @@ RELAYING but some of the old stuff does.. how do we find a proper solution? == DOCUMENTATION ISSUES ================================================ -ich habs.. jede datei definiert am anfang in welche kategorie sie gehört.. +* ich habs.. jede datei definiert am anfang in welche kategorie sie gehört.. "library" "user" "server" "language" etc... und jede funktion kann sich dann mit /** library: this stuff.. */ woanders einordnen.. jetzt brauchen wir ne dokuware die sowas kann, und jemand der die dokummentare reinschreibt.. -> doxygen-1.3.9.1.src.tar.gz (2649K)... definitiv kein aufwand, sowas... == RELEASE ANNOUNCEMENT ================================================ -REDIRECT: http://about.psyc.eu/Release_Announcement .. außerdem: - -? Netzeitung.de könnten man beschwatzen schonmal nen echten psyc feed - zu liefern.. am besten wenn sie einen stabilen 0.99 server installieren. - oder sie führen einfach dpa2psyc aus. - -? http://en.wikipedia.org/wiki/Chat und ff. strotzen vor Fehlern.. - erbarmt sich jemand? und ausserdem.. http://en.wikipedia.org/wiki/PSYC - man kann sich ja an http://de.wikipedia.org/wiki/PSYC orientieren :) - -- "CSpace could be the 7th, component of the open office suite, see the - discussion on the mailinglist of Open office developers for July 2006" - they must be kidding!!!! +* REDIRECT: http://about.psyc.eu/Release_Announcement == COMPETITION ========================================================= + man könnte die kollegen bitten gemäß forschertradition unter "other @@ -1666,7 +1637,7 @@ http://freshmeat.net/projects/boo/ mixgerät aus active, server und circuit erstmal ein temporäres newct.c machen ________________________________________________________________________ -UNDER CONSTRUCTION: (offene baustellen im LPC code) +== UNDER CONSTRUCTION: (offene baustellen im LPC code) ================= ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ - file transfers between local jabber clients - file transfers between jabber clients and gateways @@ -1765,7 +1736,7 @@ das sieht doof aus.. gehts auch besser? hmm + dns_rresolve should panic when discovering fake PTRs and suchlike blacklist_report() ? :) -SHOW STATUS? +> SHOW STATUS? ? is the following stuff superceded by DECENTRALIZED STATE? ? _status_flags aus der auswahl _members _topic _configuration und _limit_history bei _request_enter mitgeben, damit showStatus dann die @@ -1777,6 +1748,7 @@ SHOW STATUS? same way + "/set verbose on" gibt (unter anderem) mehr statuskram beim einloggen aus.. +>>> ? filter + /msg: auto tmp-friend status ? hierzu müsste man wohl einen status "bekannter" in ppl einfügen @@ -1821,7 +1793,7 @@ SHOW STATUS? - psyctext() hängt sich auf wenn ein [ nicht wieder mit ] geschlossen wird -SPAM / FLOOD CONTROL +> SPAM / FLOOD CONTROL + connect flood protection (against icaruz from XX.XX.XX.XX) 1. introduce #define MAX_CONNECTIONS_FROM_ONE_IP 2. warn admins via monitor when MAX_CONNECTIONS_FROM_ONE_IP * 70% @@ -1939,7 +1911,7 @@ ________________________________________________________________________ psyc textdb directory tree.. ? user.c puts host, not ip, into v("ip") - makes sense? -FROM MEDITATION ON PDEV: +> FROM MEDITATION ON PDEV: + elaborate availability/presence features, even before "logon" ? do we want var change notifications on psyc parse level so that the protocol does not need to issue messages for every minor event? @@ -1949,6 +1921,9 @@ FROM MEDITATION ON PDEV: + unls wie psycbiff melden sich für bestimmte methodenfamilien an == REAL PSYC ROUTING =================================================== +? wie unterscheide ich member und subroute? +falls du es überhaupt brauchst daran, dass subroute seine members definiert. + =_members sepp frida alex +_members p2puser +_members uwe anton fippo @@ -1961,10 +1936,8 @@ aber casten braucht man nur an die router, die übrig bleiben. und der p2puser ist ein sonderfall: er will von allen direkt angenachrichtet werden ohne router dazwischen.. --> wie unterscheide ich member und subroute? -falls du es überhaupt brauchst daran, dass subroute seine members definiert. - == P2P ROUTING ========================================================= +* Kademlia Möglicherweise interessant ist eine P2P-artige Form von Routing, basierend auf Kademlia ( siehe http://de.wikipedia.org/wiki/Kademlia ) + Auth via Public Keys. Man sendet Nachrichten an einen (gehashten ?) Publickey @@ -1986,7 +1959,7 @@ schaffen oder muss man freigiebiger mit der Information sein? TODO: edit-funktionen, etc -> oder gleich den eingebauten zeileneditor ed() von lpmud verwenden (telnet only) -threads: +> threads: + jeder Message noch eine threadID geben (in-reply-to): man numeriert die msgs durch und ein reply trägt noch den _tag von seinem vorgänger.. oder so...? @@ -2012,7 +1985,7 @@ threads: ? psyc clients as persistent java applets (ie channel, signed ns applet) -TIME - rewrite of all time outputs: +> TIME - rewrite of all time outputs: + handle timezones + introduce global psyc time? ? seconds since 2000-01-01 0:0 GMT or -- still lets you say "in an hour" @@ -2021,6 +1994,7 @@ TIME - rewrite of all time outputs: too bad it cant be done in perl + add date/weekday for /log messages older than 24h +>>> ? finish up /connect with password ? wenn man per psyc ne message an xx schickt, gilt der anschliessend @@ -2129,7 +2103,7 @@ thoughts from buddy-heggy.txt: - logged_on should be gone ________________________________________________________________________ -DRIVER TODO: +> DRIVER TODO: ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ * moved to psyclpc/TODO file @@ -2137,7 +2111,7 @@ DRIVER TODO: - unless (checkVar(&key, &value)) return; - psyc/library ________________________________________________________________________ -PERLPSYC TODO: +> PERLPSYC TODO: ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ - FORK - negotiation muss sowohl blocking als auch nonblocking funktionieren. per @@ -2148,7 +2122,7 @@ PERLPSYC TODO: konfigurieren können. md5 überprüft dann die legitimität der nachricht. oder wir implementieren das auf serverconnect-ebene.. hmmm -sonst noch evtl anguckenswert +> sonst noch evtl anguckenswert + http://search.cpan.org/~sparsons/Net-Dev-Syslog-0.8.0/Syslog.pm + http://freshmeat.net/projects/yeemp/ GPG over SSL, UTF8 etc. ? http://freshmeat.net/projects/xchatosd/ X11 OSD hihi @@ -2163,14 +2137,14 @@ sonst noch evtl anguckenswert - checkout the fileshare stuff in perlpsyc/bin/ ________________________________________________________________________ -PSYC SPEC TODO: +> PSYC SPEC TODO: ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ + option to receive rendered messages instead of templates ( as in ve:w() ) + option to not receive templates for standard messages? + standardized way to select language? ________________________________________________________________________ -MISCELLANEOUS STUFF: +> MISCELLANEOUS STUFF: ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ? irc-notify suckt, aber als reines client-interface kann man es doch eigentlich erlauben? ison polling nervt, kann man hoffentlich vermeiden, @@ -2198,10 +2172,11 @@ Similar Projexx: http://freshmeat.net/projects/ymsgr/ == HINTS: Multicast (see also COMPETITION) ============================= +? reliable multicast library? From: Gerd Flaig -> Was brauchen wir in der Praxis also? Eine reliable Multicast -> Implementation in PSYC einbinden (müsste ja heutzutage ne fertige -> Library sein zum Aufrufen), [..] + > Was brauchen wir in der Praxis also? Eine reliable Multicast + > Implementation in PSYC einbinden (müsste ja heutzutage ne fertige + > Library sein zum Aufrufen), [..] nach so etwas suche ich schon eine ganze Weile, habe aber bisher nur im OCaml-Umfeld eine Implementierung gefunden (genaue URL habe ich nicht mehr, irgendwo unter http://caml.inria.fr/), die aber wohl noch @@ -2212,27 +2187,19 @@ stabile Bibliothek entsteht. wer kann ich das mal ansehen? http://www.junglemonkey.net/emcast/ -und ausserdem... erste gedanken an multicasting bei den jabbers: - http://www.jabber.org/jeps/jep-0033.html -es geht erstmal nur um eine syntax zwischen client und server -was der server dann tut ist weiterhin unicast... oder? -neuerdings erste gedanken bei den jabbers an raeume, die raeume joinen, -was eine rudimentaere Form von effizenter Verteilung sein mag, jedoch -ohne conferencing control - == DOC: HOW TO PORT TO MUD ============================================= -> #define MUD -> #undef _flag_enable_routing_UDP will force psyc to use tcp only -> #define NO_EXTERNAL_LOGINS if you want -> #define CONFIG_PATH to where your /local/ is -> #define TEXT_PATH to where you want to put /default/* +* #define MUD + > #undef _flag_enable_routing_UDP will force psyc to use tcp only + > #define NO_EXTERNAL_LOGINS if you want + > #define CONFIG_PATH to where your /local/ is + > #define TEXT_PATH to where you want to put /default/* if you care to define SERVER_HOST, please do so in local.h, not in net.h same goes for DEFAULT_USER_OBJECT. if you need to fake the library #include "/net/gl-psyc/simulated.h" in your local.h ________________________________________________________________________ -LOOKING INTO PIKE: +> LOOKING INTO PIKE: ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ irc bot in pike: http://caudiumforge.net/anoncvs.rxml http://cvsweb.caudiumforge.net/cgi-bin/cvsweb.cgi/sugor/?cvsroot=sugor @@ -3984,4 +3951,13 @@ irc/user - handle root messages jabber/* - deal with < and > in status updates - +group/master +- don't use local objects as they may get replaced and zeroed + use local uniforms instead (fixes some strange ghost membership fx) +usercmd ++ _failure_necessary_variable for _request_do_presence that + doesn't provide _availability (just provides _mood for example) +- tycho: Availability degree is not checked by server and can + be negative, like -5. +user +- psyc client _examine was falling thru to _HTML output, added return; diff --git a/bin/todo2csv b/bin/todo2csv new file mode 100755 index 0000000..5d28f6b --- /dev/null +++ b/bin/todo2csv @@ -0,0 +1,100 @@ +#!/usr/bin/perl +# parse the historic CHANGESTODO.txt file and produce +# a "tab seperated values" CSV according to csv2trac format: +# +# Each line in the CSV file needs to have the following entries +# type text -- the ticket purpose +# time integer -- the time it was created +# changetime integer +# component text +# severity text +# priority text +# owner text -- who is this ticket assigned to +# reporter text +# cc text -- email addresses to notify +# url text -- url related to this ticket +# version text -- +# milestone text -- +# status text +# resolution text +# summary text -- one-line summary +# description text -- problem description (long) +# keywords text + +use locale; + +my $changestodofile = shift or die 'Please provide path to CHANGESTODO.txt'; +open(I, "/usr/bin/expand $changestodofile |") + or die "Failed to /usr/bin/expand $changestodofile"; + +print < 'defect', + '+' => 'enhancement', + '*' => 'task', + '?' => 'question', # needs to be added by trac-admin +); + +sub output { + return unless $first; + my $t = $types{$type}; + die 'no type' unless $t; + $summary = ($first && $sub) ? "$sub: $first" : ($first || $sub); + die 'expand failed' if $summary =~ /\t/ or $text =~ /\t/; +# $summary =~ s/\t/ /gm; +# $text =~ s/\t/ /gm; + $text =~ s/\n/\\n/gm; + my $mytime = 1234567890; + print <; # skip first line +while () { + next if /^[_¯]+$/; + next if /^\|/; + if ( /^== (.+) =====/ ) { + &output; + $headline = $1; + undef $sub; + next; + } + if ( /^(-|\+|\?|\*) (.+)$/ ) { + &output; + $type = $1; + $first = "$1 $2"; + next; + } + if ( /^\> (.+)$/ ) { + &output; + $sub = $1; +# print STDERR $_; + next; + } + if ( /^\>\>\>/ ) { + &output; + undef $sub; + next; + } + if ( /^=+$/ ) { + &output; + exit; + } +# if ( /^ (.+)$/ or /^\t(.+)$/ ) { +# $text .= $1; +# next; +# } + $text .= $_; +# print STDERR; +} + diff --git a/config/gentoo/psyced/Makefile b/config/gentoo/psyced/Makefile index 8212fd3..ac48e7e 100644 --- a/config/gentoo/psyced/Makefile +++ b/config/gentoo/psyced/Makefile @@ -9,7 +9,7 @@ # emerge. From nothing. fischerspooner rocks. -lynX P=psyced -V=20090303 +V=20090617 # this part can be executed once the ebuild is in portage diff --git a/config/gentoo/psyclpc/Makefile b/config/gentoo/psyclpc/Makefile index 879770f..723b91e 100644 --- a/config/gentoo/psyclpc/Makefile +++ b/config/gentoo/psyclpc/Makefile @@ -9,7 +9,7 @@ # emerge. From nothing. fischerspooner rocks. -lynX P=psyclpc -V=20080707 +V=20090321 # this part can be executed once the ebuild is in portage diff --git a/place/de_en.c b/place/de_en.c new file mode 100644 index 0000000..6028949 --- /dev/null +++ b/place/de_en.c @@ -0,0 +1,8 @@ +#define NAME "de_en" +#define TRANSLATION "de_en" + +#ifdef ADMINISTRATORS +# define PLACE_OWNED ADMINISTRATORS +#endif + +#include "babeldos.i" diff --git a/world/default/de/plain.textdb b/world/default/de/plain.textdb index 937adb6..c0f94ec 100644 --- a/world/default/de/plain.textdb +++ b/world/default/de/plain.textdb @@ -744,6 +744,9 @@ _error_illegal_password_size _error_necessary_registration |Tut mir Leid, das geht erst nach Registrierung. +_failure_necessary_variable +|Unvollständige Anfrage. + _error_necessary_nick_place |Du kannst hier nicht einfach hereinlaufen ohne einen anständigen Spitznamen! diff --git a/world/default/en/jabber.textdb b/world/default/en/jabber.textdb index 70bf913..3b69c56 100644 --- a/world/default/en/jabber.textdb +++ b/world/default/en/jabber.textdb @@ -366,28 +366,28 @@ _notice_place_leave | _status_presence_here -|[_XML_description_presence]<[_INTERNAL_mood_jabber]/> +|[_INTERNAL_XML_description_presence]<[_INTERNAL_mood_jabber]/> _status_presence_here_talkative -|chat[_XML_description_presence]<[_INTERNAL_mood_jabber]/> +|chat[_INTERNAL_XML_description_presence]<[_INTERNAL_mood_jabber]/> _status_presence_here_busy -|dnd[_XML_description_presence]<[_INTERNAL_mood_jabber]/> +|dnd[_INTERNAL_XML_description_presence]<[_INTERNAL_mood_jabber]/> _status_presence_away -|away[_XML_description_presence]<[_INTERNAL_mood_jabber]/> +|away[_INTERNAL_XML_description_presence]<[_INTERNAL_mood_jabber]/> _status_presence_absent_vacation -|xa[_XML_description_presence]<[_INTERNAL_mood_jabber]/> +|xa[_INTERNAL_XML_description_presence]<[_INTERNAL_mood_jabber]/> _status_presence_absent -|[_XML_description_presence]<[_INTERNAL_mood_jabber]/> +|[_INTERNAL_XML_description_presence]<[_INTERNAL_mood_jabber]/> _status_presence_here_quiet | _notice_presence_here -|[_XML_description_presence]<[_INTERNAL_mood_jabber]/> +|[_INTERNAL_XML_description_presence]<[_INTERNAL_mood_jabber]/> _notice_presence_here_plain | @@ -396,19 +396,19 @@ _notice_presence_here_quiet | _notice_presence_here_talkative -|chat[_XML_description_presence]<[_INTERNAL_mood_jabber]/> +|chat[_INTERNAL_XML_description_presence]<[_INTERNAL_mood_jabber]/> _notice_presence_here_busy -|dnd[_XML_description_presence]<[_INTERNAL_mood_jabber]/> +|dnd[_INTERNAL_XML_description_presence]<[_INTERNAL_mood_jabber]/> _notice_presence_away -|away[_XML_description_presence]<[_INTERNAL_mood_jabber]/> +|away[_INTERNAL_XML_description_presence]<[_INTERNAL_mood_jabber]/> _notice_presence_absent_vacation -|xa[_XML_description_presence]<[_INTERNAL_mood_jabber]/> +|xa[_INTERNAL_XML_description_presence]<[_INTERNAL_mood_jabber]/> _notice_presence_absent -|[_XML_description_presence]<[_INTERNAL_mood_jabber]/> +|[_INTERNAL_XML_description_presence]<[_INTERNAL_mood_jabber]/> _notice_person_absent_netburp |xa{_notice_person_absent_netburp} diff --git a/world/default/en/plain.textdb b/world/default/en/plain.textdb index c326565..4527c01 100644 --- a/world/default/en/plain.textdb +++ b/world/default/en/plain.textdb @@ -626,7 +626,10 @@ _failure_filter_strangers |[_nick] has not enabled messages from strangers. _failure_necessary_registration -|[_nick_target] cannot handle friendships yet. +|[_nick_target] is no registered user yet. + +_failure_necessary_variable +|Your request is incomplete. _failure_unsuccessful_delivery |Could not establish a circuit to [_host] to deliver a [_method_relay] to [_source]. diff --git a/world/net/group/master.c b/world/net/group/master.c index 10121f7..2711a52 100644 --- a/world/net/group/master.c +++ b/world/net/group/master.c @@ -30,6 +30,10 @@ #include #include +#ifdef BETA +# define ENFORCE_UNIFORM +#endif + #ifdef CONTEXT_STATE // {{{ # define HEADER_ONLY # include "../state.c" @@ -98,7 +102,7 @@ castmsg(source, mc, data, vars) { #endif // }}} P2(("%O castmsg(%O,%O,%O..) for %O\n", ME, source,mc,data, _routes)) - D3(P2(("%O vars = %O\n", ME, vars))) + D4(P2(("%O vars = %O\n", ME, vars))) // _context is an MMP variable, so we use it internally with objectp vars["_context"] = ME; @@ -114,11 +118,11 @@ castmsg(source, mc, data, vars) { foreach (route, noa : _routes) { #if defined(TIDILY) && defined(MEMBERS_BY_SOURCE) - P3(("place:each(%O,t=%O,s=%O,mc=%O,d=%O,v=%O)\n", + P4(("place:each(%O,t=%O,s=%O,mc=%O,d=%O,v=%O)\n", mappingp(noa) ? sizeof(noa) : noa, route, source, mc, data, vars)) #else - P3(("place:each(%O,t=%O,s=%O,mc=%O,d=%O,v=%O)\n", + P4(("place:each(%O,t=%O,s=%O,mc=%O,d=%O,v=%O)\n", noa, route, source, mc, data, vars)) #endif // if (route == source) return; // skip sender @@ -191,6 +195,9 @@ protected load(file) { remove_member(source, origin) { mixed t; +#ifdef ENFORCE_UNIFORM + if (objectp(source)) source = psyc_name(source); +#endif P2(("%O remove_member(%O, %O)\n", ME, source, origin)) if (origin && ( #if 1 //defined(TIDILY) && defined(MEMBERS_BY_SOURCE) @@ -241,10 +248,23 @@ jabberisten die freundschaft zum user#fippo entfernte: P2(("%O encountered unnecessary remove of %O from %O\n", ME, source, _routes)) } + P3(("%O -> _routes = %O\n", ME, _routes)) } insert_member(source, origin) { mixed t; + +#ifdef ENFORCE_UNIFORM + // when storing objects into _routes stupid things can happen: + // when a user is created, all her local friends are cloned and + // placed into her context. if one of those local friends logs in + // under different access a different user object is created - + // the old one is destroyed and, guess what, this context mapping + // is not updated. always using uniforms is a way to solve this + // problem. + // + if (objectp(source)) source = psyc_name(source); +#endif P2(("%O insert_member(%O, %O)\n", ME, source, origin)) if (objectp(origin) && (t = origin->qOrigin())) { #ifdef FORK @@ -279,6 +299,7 @@ insert_member(source, origin) { // would be nice to do it here, but that's not correct //revision += 1; #endif + P3(("%O -> _routes = %O\n", ME, _routes)) } // code duplicaton is faster than others diff --git a/world/net/include/peers.h b/world/net/include/peers.h index abc9916..1af43a3 100644 --- a/world/net/include/peers.h +++ b/world/net/include/peers.h @@ -48,10 +48,11 @@ #define PPL_NOTIFY_DEFAULT PPL_NOTIFY_IMMEDIATE #define PPL_NOTIFY_DELAYED '6' #define PPL_NOTIFY_DELAYED_MORE '4' -#define PPL_NOTIFY_FRIEND PPL_NOTIFY_DELAYED_MORE +#define PPL_NOTIFY_INACTIVE '3' // delivery returned error +#define PPL_NOTIFY_FRIEND PPL_NOTIFY_INACTIVE #define PPL_NOTIFY_MUTE '2' -#define PPL_NOTIFY_PENDING '1' // friendship request sent -#define PPL_NOTIFY_OFFERED '0' // friendship request received +#define PPL_NOTIFY_PENDING '1' // _outgoing friendship request sent +#define PPL_NOTIFY_OFFERED '0' // _incoming friendship req received #define PPL_NOTIFY_NONE ' ' #define TIME_DELAY_NOTIFY (60 * 3) // 3 minutes diff --git a/world/net/irc/user.c b/world/net/irc/user.c index 862f06d..275cd1c 100644 --- a/world/net/irc/user.c +++ b/world/net/irc/user.c @@ -846,7 +846,14 @@ logon() { // but i guess it is indeed appropriate to make it clear how very much // different we are from a regular irc server. // - reply(RPL_ISUPPORT, "PSYC=.99 ALIAS AVAILABILITY FRIEND HISTORY MOOD SHOUT SSET STATUS SUBSCRIBE THREAD TRUST PREFIX= CHANTYPES=# CHANMODES= NICKLEN="+ (string)MAX_UNIFORM_LEN +" CHANNELLEN="+ (string)MAX_UNIFORM_LEN +" CASEMAPPING=ascii TOPICLEN=4404 KICKLEN=4404 AWAYLEN=4404 MAXTARGETS=1 CHARSET="+ (v("charset")||SYSTEM_CHARSET) +" NETWORK=" SERVER_HOST " CTCP=PRESENCE,TS UNIFORMS=psyc,xmpp :are supported by this server"); + // reduced TOPICLEN etc from 4404 to 444 because of the 512 limit + // which some legacy clients really require. in fact, since we are + // very lax on uniform length here, it could be possible to attack + // irc clients in a psyc room using suitably long uniforms etc. + // solutions are either a uniform length limit in chatrooms or + // forced autoalias for ircers. + // + reply(RPL_ISUPPORT, "PSYC=.99 ALIAS AVAILABILITY FRIEND HISTORY MOOD SHOUT SSET STATUS SUBSCRIBE THREAD TRUST PREFIX= CHANTYPES=# CHANMODES= NICKLEN="+ (string)MAX_UNIFORM_LEN +" CHANNELLEN="+ (string)MAX_UNIFORM_LEN +" CASEMAPPING=ascii TOPICLEN=444 KICKLEN=444 AWAYLEN=444 MAXTARGETS=1 CHARSET="+ (v("charset")||SYSTEM_CHARSET) +" NETWORK=" SERVER_HOST " CTCP=PRESENCE,TS UNIFORMS=psyc,xmpp :are supported by this server"); // // MAXCHANNELS vs CHANLIMIT - we currently only have a limit on subs // STD? what the hell is STD? diff --git a/world/net/jabber/common.c b/world/net/jabber/common.c index 2f2141b..7a26c02 100644 --- a/world/net/jabber/common.c +++ b/world/net/jabber/common.c @@ -300,7 +300,7 @@ render(string mc, string data, mapping vars, mixed source) { // if this kind of problem recurrs, we should quote every // single damn variable if (vars["_description_presence"]) - vars["_XML_description_presence"] = + vars["_INTERNAL_XML_description_presence"] = xmlquote(vars["_description_presence"]); if (stringp(data)) data = xmlquote(data); else if (vars["_action"]) diff --git a/world/net/jabber/gateway.c b/world/net/jabber/gateway.c index 7cc3565..828c330 100644 --- a/world/net/jabber/gateway.c +++ b/world/net/jabber/gateway.c @@ -340,7 +340,7 @@ jabberMsg(XMLNode node) { if (node["/connection-timeout"]) { /* ignore it */ } else if (node["/system-shutdown"]) { - P1(("%O: counterpart is doing a system shutdown", ME)) + P1(("%O: counterpart is doing a system shutdown\n", ME)) /* ignore it */ } else { P0(("stream error in %O: %O\n", ME, node)) diff --git a/world/net/jabber/mixin_parse.c b/world/net/jabber/mixin_parse.c index bdd2e28..6a63504 100644 --- a/world/net/jabber/mixin_parse.c +++ b/world/net/jabber/mixin_parse.c @@ -185,6 +185,9 @@ jabberMsg(XMLNode node, mixed origin, mixed *su, array(mixed) tu) { } PT(("input¹ %O\n", body)) if (stringp(body) && strlen(body)) { +#ifdef BETA + if (body[0] == '\n') body = body[1..]; +#endif if (body[0] == cmdchar) { // '/ /usr' notation is a USER_PROGRAM feature // so we have to redo it here @@ -550,7 +553,7 @@ jabberMsg(XMLNode node, mixed origin, mixed *su, array(mixed) tu) { vars["_description_presence"] = (node["/status"] && node["/status"][Cdata]) ? node["/status"][Cdata] : ""; // "Get psyced!"; - vars["_XML_description_presence"] = + vars["_INTERNAL_XML_description_presence"] = xmlquote(vars["_description_presence"]); vars["_INTERNAL_mood_jabber"] = "neutral"; sendmsg(o, "_notice_presence_absent", 0, @@ -695,7 +698,7 @@ jabberMsg(XMLNode node, mixed origin, mixed *su, array(mixed) tu) { vars["_description_presence"] = (node["/status"] && node["/status"][Cdata]) ? node["/status"][Cdata] : ""; // "Get psyced!"; - vars["_XML_description_presence"] = + vars["_INTERNAL_XML_description_presence"] = xmlquote(vars["_description_presence"]); vars["_degree_availability"] = jabber2avail[node["/show"] && node["/show"][Cdata]]; diff --git a/world/net/jabber/mixin_render.c b/world/net/jabber/mixin_render.c index 79c1376..865c872 100644 --- a/world/net/jabber/mixin_render.c +++ b/world/net/jabber/mixin_render.c @@ -9,7 +9,8 @@ int msg(string source, string mc, string data, mapping vars, int showingLog, string target) { mixed t; - switch (mc){ + switch (mc) { + case "_status_description_time": case "_status_person_away": case "_status_person_present": case "_status_person_present_implied": diff --git a/world/net/jabber/user.c b/world/net/jabber/user.c index a0e7ef2..7d74c5b 100644 --- a/world/net/jabber/user.c +++ b/world/net/jabber/user.c @@ -129,6 +129,7 @@ msg(source, mc, data, mapping vars, showingLog) { mc = "_notice_place_leave"; } switch (mc) { + case "_status_description_time": case "_status_person_present": case "_status_person_present_implied": case "_status_person_absent": @@ -250,7 +251,7 @@ showFriends() { "_INTERNAL_target_jabber" : myjid, "_INTERNAL_source_jabber" : mkjid(person), "_description_presence" : "", // TODO: get these from state - "_XML_description_presence" : "", + "_INTERNAL_XML_description_presence" : "", "_INTERNAL_mood_jabber" : "neutral" ])); } @@ -572,15 +573,16 @@ iq(XMLNode node) { P3(("+++ %O IQ node %O\n", ME, node)) iqchild = getiqchild(node); - unless(iqchild) switch(node["@type"]) { - case "get": - case "set": - case "result": - case "error": - break; + unless (iqchild && mappingp(iqchild)) switch(node["@type"]) { + case "get": + case "set": + case "result": + case "error": + P1(("%O got empty iq %O\n", ME, node)) + return; default: P1(("%O got invalid iq %O\n", ME, node)) - return; + return; } helper = iqchild; diff --git a/world/net/library.i b/world/net/library.i index d04dcce..3ef9933 100644 --- a/world/net/library.i +++ b/world/net/library.i @@ -794,7 +794,12 @@ varargs mixed sendmsg(mixed target, string mc, mixed data, vamapping vars, showingLog, source, u); #endif case 0: -#ifdef DEVELOPMENT +#if 0 //def DEVELOPMENT + // we get here when doing remote messaging + // in xmpp.. and in fact, in net/jabber we + // don't *know* which scheme needs to be + // used. + // raise_error("scheme 0 is a bug\n"); // // TODO: we had this error, and maybe it's diff --git a/world/net/library/profiles.html b/world/net/library/profiles.html index 62a1556..6d5854c 100644 --- a/world/net/library/profiles.html +++ b/world/net/library/profiles.html @@ -71,7 +71,7 @@ _flag_uniform_verbatimverbatimuniform _flag_visibilityvisibility _gendersexgendergender -_identificationidpsyc_idPSYCIDpsycID +_identificationidpsyc_idpsycID _identification_otherotherid _identification_scheme_AIMaimidaim_idaimChatID _identification_scheme_ICQicqidicq_idicqChatID diff --git a/world/net/library/profiles.i b/world/net/library/profiles.i index b523ad2..aa33926 100644 --- a/world/net/library/profiles.i +++ b/world/net/library/profiles.i @@ -94,7 +94,6 @@ volatile mapping psyc2jCard = ([ "_affiliation" : "%s", "_date_birth" : "%s", "_description_public" : "%s", - "_identification" : "%s", "_identification_scheme_XMPP" : "%s", "_identification_scheme_mailto" : "%s", "_name_family" : "%s", @@ -133,7 +132,6 @@ volatile mapping jCard2psyc = ([ "TEL/NUMBER" : "_contact_telephone", "BDAY" : "_date_birth", "DESC" : "_description_public", - "PSYCID" : "_identification", "JABBERID" : "_identification_scheme_XMPP", "EMAIL/USERID" : "_identification_scheme_mailto", "N/FAMILY" : "_name_family", diff --git a/world/net/library/profiles.pl b/world/net/library/profiles.pl index 7ecfbb8..3e00cd0 100644 --- a/world/net/library/profiles.pl +++ b/world/net/library/profiles.pl @@ -377,7 +377,8 @@ FOAF icqChatID PSYC _identification jProf psyc_id -jCard PSYCID +# I'm afraid adding a PSYCID field will not be well-recepted by some apps +#jCard PSYCID FOAF psycID PSYC _identification_other diff --git a/world/net/library/share.c b/world/net/library/share.c index a3845bb..195be99 100644 --- a/world/net/library/share.c +++ b/world/net/library/share.c @@ -24,11 +24,11 @@ volatile mapping share = ([ #ifdef JABBER_PATH # ifndef _flag_disable_module_presence "jabber2avail": ([ - 0 : AVAILABILITY_HERE, "chat" : AVAILABILITY_TALKATIVE, - "dnd" : AVAILABILITY_BUSY, - "away" : AVAILABILITY_DO_NOT_DISTURB, - "xa" : AVAILABILITY_AWAY + 0 : AVAILABILITY_HERE, + "dnd" : AVAILABILITY_BUSY, // dnd? + "away" : AVAILABILITY_DO_NOT_DISTURB, // nearby? + "xa" : AVAILABILITY_AWAY // "not available" ]), // map to http://www.jabber.org/jeps/jep-0107.html although that // is more like good ole mud feelings diff --git a/world/net/person.c b/world/net/person.c index 2b80bc0..309260e 100644 --- a/world/net/person.c +++ b/world/net/person.c @@ -1011,34 +1011,10 @@ case "_set_password": // TODO? add support for integer _service means multiple // catch-all clients possible. do we want this? if (vars["_service"]) { - // oh. we let it suggest a *different* location? - // interesting. why don't we also do this for clients? - // and who is using this code anyway? linkDel(vars["_service"]); linkSet(vars["_service"], vars["_location"], source); return 0; } -#if 0 - if (vars["_password"]) { -#ifndef VOLATILE - // obviously similar code in usercmd:set() - if (!v("password") && - (t = legal_password(vars["_password"], - MYNICK))) { - ME->pr(t[0], t[1]); // TODO - return; - } - // why do we check password here again - // if we are just after a checkPassword? - // what are we doing here? -#endif - } else if (ONLINE && - v("locations")[0] != source) { - sendmsg(source, - "_error_status_person_connected"); - return 0; - } -#else // this code should also run for _service, but it // needs a reorg t = v("locations")[0]; @@ -1058,7 +1034,6 @@ case "_set_password": // now we leave the old client circuit // to die off.. let's hope that's safe } -#endif #ifdef _flag_disable_module_trust unless(stringp(source)) { m_delete(v("locations"), 0); @@ -1370,6 +1345,10 @@ case "_request_execute": // this should be renamed into _context but // that cannot be done before _context is // renamed into _channel .. hehe + // + // also this would be the perfect place to + // make a distinction between _focus and _group + // if we wanted to.. actually, no, we want _context if (stringp(t = vars["_focus"] || vars["_group"])) { // check if the uniform is one of diff --git a/world/net/place/archetype.gen b/world/net/place/archetype.gen index 7d23e52..cc24c61 100644 --- a/world/net/place/archetype.gen +++ b/world/net/place/archetype.gen @@ -768,6 +768,7 @@ insert_member(source, mc, data, vars, ni, neu, again) { # else // only this code runs vars["_duty"] = "member"; + // why not _role instead of _duty? # endif #endif // OWNED // we are also echoing his vars back to the requestor @@ -1150,6 +1151,8 @@ msg(source, mc, data, mapping vars) { || abbrev("_request_invitation", mc)) { mc = "_notice_place"+mc[8..]; #ifdef PLACE_TOPIC + // hm, this doesn't just go back to the new + // person.. it is resent to all.. if (v("topic") &&! abbrev("_request_leave", mc)) vars["_topic"] = v("topic"); #endif diff --git a/world/net/psyc/parse.i b/world/net/psyc/parse.i index 9a9e1a5..7f149be 100644 --- a/world/net/psyc/parse.i +++ b/world/net/psyc/parse.i @@ -57,7 +57,7 @@ volatile string lastvar, mod, origin_unl; volatile array(mixed) list; volatile mapping hash; volatile int l = 0; -volatile int pongtime, routing = 1; +volatile int reject = 0, pongtime; //, routing; #ifndef PSYC_TCP // resolved UNL of remote server (psyc://hostname or psyc://hostname:port) @@ -129,7 +129,7 @@ int restart() { // delete other stuff too buffer = ""; mc = 0; - routing = 1; // unused as yet +// routing = 1; // unused as yet #ifdef SYSTEM_SECRET checkpack = vcheck = 0; ctrust = trustworthy; @@ -191,17 +191,22 @@ private int conclude() { // to also store the list in pvars, but since i'm generally // doubtful if this is the right way to go, i'll leave it to // a later day.. TODO - // hooray, we get to check some variable families for sanity + // hooray, we get to check some var type families for sanity } else if (abbrev("_degree", lastvar)) { - // allow for unset degree '-' - if (!stringp(cvars[lastvar]) || (cvars[lastvar] != "-" && - !sscanf(cvars[lastvar], "%1d", cvars[lastvar]))) { - P1(("%O failed to parse %O: %O\n", ME, - lastvar, cvars[lastvar])) + mixed t = cvars[lastvar]; + // allow for unset degree '-' ? not unless we know what for. + if ((intp(t) && t>=0) || sscanf(t, "%1d", cvars[lastvar])) { + // accept + if (mod != ":") pvars[lastvar] = cvars[lastvar]; + } else { + reject++; + P1(("%O failed to parse %O: %O\n", ME, lastvar, t)) + croak("_error_type_degree", + "Your value for variable [_variable] does not qualify for a degree.", + ([ "_variable": lastvar ])); m_delete(cvars, lastvar); - if (mod != ":") m_delete(pvars, lastvar); + //if (mod != ":") m_delete(pvars, lastvar); } - else if (mod != ":") pvars[lastvar] = cvars[lastvar]; } else if (abbrev("_list", lastvar)) { // _tab // we only get here if the _list has one or zero members #ifdef PARANOID @@ -293,7 +298,7 @@ vamixed parse(string a) { // to put the mmp variable state away somewhere // and go fetch the psyc variable state for the current // source/target pair from somewhere else. TODO - routing = 0; // unused as yet +// routing = 0; // unused as yet } else switch(a[0]) { case ':': unless (SCANFIT) { @@ -576,6 +581,12 @@ vamixed getdata(string a) { // a runtime error (but it's still better to fix it!) next_input_to(#'parse); # endif + if (reject) { + // packet has been rejected by parser for semantic reasons + reject = 0; + restart(); + return 1; + } if (!t || trustworthy > 5) { deliver(0, 0, mc, buffer, cvars); } else unless (u = parse_uniform(t)) { @@ -1110,6 +1121,7 @@ vamixed startParse(string a) { restart(); if (isServer()) greet(); } +// new syntax is so broken, we should not pretend to support it yet FIXME # if defined(SPYC_PATH) && defined(USE_SPYC) else if (a == "|") { // new S_GLYPH_PACKET_DELIMITER object o = clone_object(SPYC_PATH "server"); @@ -1152,7 +1164,7 @@ vamixed startParse(string a) { else { PT(("PSYC startParse got %O from %O\n", a, query_ip_number())) croak("_error_syntax_initialization", - "The protocol begins with a dot on a line by itself."); + "The old protocol begins with a dot on a line by itself."); // experiencing a loop here, because some implementations // try immediate reconnect. idea: in most places where we // QUIT we should put the tcp link on hold instead, and diff --git a/world/net/spyc/parse.c b/world/net/spyc/parse.c index d33422f..e4972dc 100644 --- a/world/net/spyc/parse.c +++ b/world/net/spyc/parse.c @@ -360,7 +360,7 @@ void step() { step(); } else { croak("_error_syntax_initialization", - "The protocol begins with a pipe and a line feed."); + "The new protocol begins with a pipe and a line feed."); } break; default: // uhm... if we ever get here this is the programmers fault diff --git a/world/net/user.c b/world/net/user.c index 595f2fa..6d5abe9 100644 --- a/world/net/user.c +++ b/world/net/user.c @@ -793,6 +793,7 @@ case "_status_description_place": "_source_relay": source, "_uniform_style": vars["_uniform_style"] ]) + vars); + return 1; case "_HTML": // client wants HTML if (v("locations")[0]) sendmsg(v("locations")[0], @@ -802,6 +803,7 @@ case "_status_description_place": "_source_relay": source, "_uniform_style": vars["_uniform_style"] ])); + return 1; case "_surf": // we're doing a /surf, so stop here return 1; @@ -814,7 +816,7 @@ case "_status_description_place": // hmmm.. well, that's how psyc to client happens here mc = "_list"+ mc[7..]; w(mc+"_on", data, ([ // used by irc whois.. - "_source_relay": source, + "_source_relay": source, "_tag_reply": t, "_nick" : vars["_nick"] || vars["_nick_place"], "_name_public" : vars["_name_public"] || "", "_action_motto" : vars["_action_motto"] || "", @@ -822,8 +824,8 @@ case "_status_description_place": ])); listDescription(vars, 1); w(mc+"_off", 0, ([ - "_source_relay": source, - "_nick" : vars["_nick"] ])); + "_source_relay": source, "_tag_reply": t, + "_nick" : vars["_nick"] ])); return 1; case "_status_place_members_none_automatic": if (beQuiet != -1) { diff --git a/world/net/usercmd.i b/world/net/usercmd.i index c90d962..bffc9e7 100644 --- a/world/net/usercmd.i +++ b/world/net/usercmd.i @@ -914,7 +914,7 @@ cmd(a, args, dest, command) { if (member(places, (t = sizeof(args) < 2 ? place : args[1]))) { m_delete(places, t); } - // fall thru + // fall thru case "unenter": // and the protocol should follow.. unenter! case "leave": case "part": @@ -1001,7 +1001,7 @@ cmd(a, args, dest, command) { break; case "notice": t2 = "_message_private_annotate"; - // fall thru + // fall thru case "msg": case "tell": case "m": @@ -1020,7 +1020,7 @@ cmd(a, args, dest, command) { "Usage: /more. See also /tell and /talk."); break; } - // fall thru + // fall thru case "q": case "query": case "talk": @@ -1046,18 +1046,6 @@ cmd(a, args, dest, command) { return 1; } break; - // experimental new way to log out without logging out. - // may very well not work as planned - case "det": - case "detach": - //availability = AVAILABILITY_OFFLINE; - remove_interactive(ME); - //break; - // used to fall thru to declare myself offline as well.. - // now you have to declare yourself offline manually - // no you don't. if availability isn't offline the - // disconnect() handler will clean you out! - // fall thru #endif #ifndef _flag_disable_module_friendship case "shout": @@ -1068,8 +1056,21 @@ cmd(a, args, dest, command) { "Usage: /shout "); break; # ifndef _flag_disable_module_presence - case "presence": - showMyPresence(1); + // experimental new way to log out without logging out. + // may very well not work as planned + // detach for psyc clients: _do_presence offline + _unlink + case "det": + case "detach": + //availability = AVAILABILITY_OFFLINE; + remove_interactive(ME); + //break; + // used to fall thru to declare myself offline as well.. + // now you have to declare yourself offline manually + // no you don't. if availability isn't offline the + // disconnected() handler will clean you out! + // ok let's do it manually.. see if we get in trouble later. + availability = AVAILABILITY_OFFLINE; + // yes v("availability") is retained.. maybe useful later return 1; case "offline": announce(AVAILABILITY_OFFLINE, 1, 1, ARGS(1)); @@ -1157,6 +1158,9 @@ cmd(a, args, dest, command) { // this command is normally accessed as /mynick // as it behaves similarely to /me return motto(ARGS(1)); + case "presence": + showMyPresence(1); + return 1; # endif /* _flag_disable_module_presence */ case "cancel": case "can": @@ -1590,7 +1594,7 @@ case "_message": tell(vars["_person"], data, 0, vars["_action"], 0); return 1; } - // else.. fall thru + // else.. fall thru case "_message_public": case "_public": case "_speak": @@ -1630,6 +1634,7 @@ case "_leave": , 1, vars["_flag"]); return 1; case "_invite": + // _focus has been taken care of beforehand in person.c if (t = vars["_person"]) { unless (place) return w("_error_status_place_none", "You aren't in a room"); @@ -1637,6 +1642,21 @@ case "_invite": return invite(t, vars); } return 0; +case "_subscribe_permanent": +case "_subscribe_temporary": +case "_subscribe": + if (t = vars["_group"] || vars["_focus"]) { + subscribe(family == "_subscribe_permanent" ? + SUBSCRIBE_PERMANENT : SUBSCRIBE_TEMPORARY, t); + return 1; + } + return 0; +case "_unsubscribe": + if (t = vars["_group"] || vars["_focus"]) { + subscribe(SUBSCRIBE_NOT, t); + return 1; + } + return 0; case "_remove_register": case "_register_remove": // to go // unregister a user? only if you are trustworthy! @@ -1746,17 +1766,25 @@ case "_friend": // tmp return 1; #ifndef _flag_disable_module_presence case "_presence": - P3(("%O with %O\n", mc, vars)) - if ((t = vars["_degree_mood"]) && intp(t)) - vSet("mood", mood = t); - if ((t = vars["_degree_availability"]) && intp(t)) { - announce(t, !vars["_degree_automation"], + // parser takes care of checking _degree type + if (t = vars["_degree_mood"]) { +// if (! sscanf(t, "%1d", t)) { +// w("_warning_usage_mood"); +// return 1; +// } + vSet("mood", mood = t); + } + if (t = vars["_degree_availability"]) { +// if (! sscanf(t, "%1d", t)) +// w("_warning_usage_availability"); +// else + announce(t, !vars["_degree_automation"], 1, vars["_description_presence"]); return 1; } - P1(("got invalid %O: %O, %O\n", mc, vars, data)) - // complain about missing args? - return 0; + P1(("got invalid %O: %O, %O in %O\n", mc, vars, data, ME)) + w("_failure_necessary_variable"); + return 1; #endif // _flag_disable_module_presence case "_list_peers_JSON": listAcq(PPL_JSON); @@ -1773,7 +1801,7 @@ case "_unlink": case "_exit": // so this is some kind of ugly hack not to be used.. huh? announce(AVAILABILITY_OFFLINE); - // fall thru + // fall thru case "_quit": // bye(vars["_reason"]); quit();