diff --git a/CHANGESTODO b/CHANGESTODO index 1660500..9b2d728 100644 --- a/CHANGESTODO +++ b/CHANGESTODO @@ -4,6 +4,12 @@ vim:nosmarttab:syntax=diff | Essentially: whenever you fix something, move that line to the end of file. | - marks bugs & fixes, + marks new features, ? marks issues, * marks big stuff ________________________________________________________________________ +== SERIOUS!!! ========================================================== +¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ +- large submissions into scratchpad can crash the driver + +- configure script fails on libidn now being in glibc +________________________________________________________________________ == NEXT RELEASE ======================================================== ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ - interserver xmpp /me expects no leading newline, but pidgin recently @@ -393,6 +399,8 @@ ________________________________________________________________________ ________________________________________________________________________ == OTHER MAJOR TODOS =================================================== ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ +- occasionally double data sets for psyc://ve.symlynx.com/~nick and nick + + provide a tuning for ACTIVE server-side PING (keepalive) ? see http://about.psyc.eu/Ping for explanations. @@ -1077,6 +1085,9 @@ cel'>< ________________________________________________________________________ == RELEASE INSTALLER =================================================== ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ++ the psyced script could check if psyced.ini has been changed recently + and autorun psyconf? or maybe just spit out a warning.. + - _charset_console can still lead to unexpected convert_charset errors when outputting random data. convert_charset must be non-fatal here! @@ -1564,6 +1575,11 @@ ________________________________________________________________________ look at: http://freshmeat.net/projects/pyvoicechat/ dormant since 2004.. oops ++ tycho proposes /log reply of new messages should not necessarily + show automatically, in case you are connecting with a client on a + mobile phone, especially if you have permanent context subscriptions + flowing into your log nonstop. + > RELAYING + net/spyc needs relaying (without parsing even), see TODO in parse_content() ? relaying doesn't work for psyc clients (xmpp: in particular) @@ -1584,6 +1600,8 @@ ________________________________________________________________________ but some of the old stuff does.. how do we find a proper solution? == DOCUMENTATION ISSUES ================================================ +? should we point to some manuals on how to make and add certificates? + * 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 @@ -1758,9 +1776,6 @@ das sieht doof aus.. gehts auch besser? hmm remain incarnated longer since mails seem to arrive often enough for some users to never leave memory. -+ disallow TLS/SSL connections from localhost to save CPU resources - for useful things - - re-examine everything looking for optimizations.. like, are any lower_case's being called twice etc. or introduce a "lowercased" flag into the driver's string structures *grin* diff --git a/bin/psyconf b/bin/psyconf index e84a32b..33f0a18 100755 --- a/bin/psyconf +++ b/bin/psyconf @@ -16,7 +16,8 @@ psyconf - a configuration tool for PSYCED Usage: psyconf [ ] -The default configuration file used is /etc/psyced.ini +The default configuration file used is either ./psyced.ini +or /etc/psyc/psyced.ini =cut @@ -386,14 +387,23 @@ X my $t = $c{_basic_path_PEM_key}; if ($t) { $t = "$config/$t" unless $t =~ m#^/#; + print STDERR </dev/null the error though... + echo "If the user doesn't exist yet, please make one." fi #while true #do @@ -332,6 +338,7 @@ fi get GROUP "psyc" #while true #do + echo "If such a group doesn't exist yet, please create it now." ask "Which group do you want to run psyced as" GROUP # if `id -Gn $USER | grep $GROUP > /dev/null` # then @@ -371,6 +378,7 @@ done #echo "[server output goes to $RUNTIME_OUTPUT]" ## BUG IN ORDER!!! we dont have $PSYC_PORT yet!!!!! TODO!!111 +## also HOST_IP may be empty RUNTIME_OUTPUT_DIR="$LOG_DIR/$HOST_IP-$PSYC_PORT" RUNTIME_OUTPUT_STDERR="$RUNTIME_OUTPUT_DIR/stderr" RUNTIME_OUTPUT_STDOUT="$RUNTIME_OUTPUT_DIR/stdout" @@ -793,6 +801,7 @@ else echo "[host name resolving disabled (don't start erq).]" fi +## TODO, should be disabled when there is no HOST_IP? get WANT_PORTRULES "y" echo "" @@ -986,7 +995,8 @@ _host_name = $HOST_NAME _host_domain = $DOMAIN_NAME ; Would you like to bind the server to a specific IP address? -; If you do you MUST also provide _host_name and _host_domain +; If you do, you MUST also provide _host_name and _host_domain +; If you leave this empty, psyced will find out at runtime. _host_IP = $HOST_IP ; Nickname for the chatserver. Appears in login message, telnet prompt, diff --git a/makefile b/makefile index 2cba28d..9446db1 100644 --- a/makefile +++ b/makefile @@ -58,3 +58,7 @@ local/all.ls: .links: (cd world;../bin/findlinks */de/* */en/*) >$@ +rights: + find . -type d -exec chmod 755 {} \; + find . -type f -exec chmod 644 {} \; + chmod +x bin/* run/* config/psyced.settings install.sh utility/multipatcher diff --git a/place/babeldos.i b/place/babeldos.i index c09e14a..00ea6d1 100644 --- a/place/babeldos.i +++ b/place/babeldos.i @@ -16,7 +16,10 @@ start(); babel(); -#define CRESET start(); +#define CREATE qInit(ME, 1000, 100); + +// too aggressive to connect babelfish on every reset!! +//efine CRESET start(); inherit NET_PATH "connect"; #include @@ -27,7 +30,6 @@ volatile mixed *current; volatile string krank, buffer; start() { - qInit(ME, 1000, 100); unless (has_con || is_con) { is_con = 1; call_out(#'connect, 0, "babelfish.yahoo.com", 80); diff --git a/run/md5.pl b/run/md5.pl index d19b0f8..cca1319 100755 --- a/run/md5.pl +++ b/run/md5.pl @@ -4,6 +4,8 @@ # (sort of like cgi) with LDMUD. but by now LDMUD knows how # to do MD5 and SHA1 itself, so they are not being used. # +# consult http://about.psyc.eu/spawn for instructions +# use Digest::MD5 qw(md5 md5_hex); $| = 1; diff --git a/run/sha1.pl b/run/sha1.pl index 308c3fd..a1940e0 100755 --- a/run/sha1.pl +++ b/run/sha1.pl @@ -4,6 +4,8 @@ # (sort of like cgi) with LDMUD. but by now LDMUD knows how # to do MD5 and SHA1 itself, so they are not being used. # +# consult http://about.psyc.eu/spawn for instructions +# use Digest::SHA1 qw(sha1 sha1_hex); $| = 1; diff --git a/utility/rkeywordgrep b/utility/rkeywordgrep new file mode 100755 index 0000000..e4adb3d --- /dev/null +++ b/utility/rkeywordgrep @@ -0,0 +1,42 @@ +#!/usr/bin/perl +# +# recursive PSYC keyword (methods, variables) collector --lynx98 +# you may like how it looks after a subsequent sort +# see also http://about.psyc.eu/Rename + +require 'find.pl'; + +$flags = ''; +$flags = shift if $ARGV[0] =~ /^-/; +$verbose = $flags !~ /s/; + +$|=1; +&find($#ARGV >= 0 ? @ARGV : '.'); +print STDERR '=' x 78, "\n" if $verbose; +exit; + + +sub wanted { + ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, + $atime,$mtime,$ctime,$blksize,$blocks) + = lstat; + + return unless /\.[chi]$/ or /\.gen$/; + return if -d _; +# return unless $blocks; # skip symlinks + return if $size < 10; + + if ($verbose) { + $len = length $name; + print STDERR $name, ' ', '=' x (77-$len), "\r" if $len < 77; + } + + if (open(I, $_)) { + while() { + printf "%-41s -\t$name\n", $1 while s/"(_\w+)"/"got"/; + } + close I; + } else { + print STDERR "$name: $!\n"; + } +} diff --git a/world/default/de/plain.textdb b/world/default/de/plain.textdb index c0f94ec..f35a39d 100644 --- a/world/default/de/plain.textdb +++ b/world/default/de/plain.textdb @@ -551,6 +551,9 @@ _request_description _request_open_page |Bitte folgende Seite aufrufen: [_page] +_request_open_page_login +|Bitte öffne [_page_login] um einzuloggen. + _request_open_page_edit |Zur Bearbeitung der Einstellungen bitte folgende Seite aufrufen: |[_page_edit] diff --git a/world/default/en/plain.textdb b/world/default/en/plain.textdb index 4527c01..1faa626 100644 --- a/world/default/en/plain.textdb +++ b/world/default/en/plain.textdb @@ -1,6 +1,18 @@ ## vim:syntax=mail ## Check utf-8: Praise Atatürk! +_failure_unavailable_state +|State module is not available as yet. + +_failure_unknown_glyph +|Unknown modifier glyph encountered. + +_error_illegal_protocol_variable +|You are not allowed to present a variable named [_variable_name]. + +_error_type_degree +|Your value for variable [_variable] does not qualify for a degree. + _error_necessary_nick_local |This command only accepts local nicknames. @@ -1341,7 +1353,7 @@ _notice_link_service _notice_link |[_location] linked to [_identification]. -|You are now connected to this big marshmellow in the sky. +|## You are now connected to this big marshmellow in the sky. _notice_unlink_exit |I wish you good sleep or a fun night-out. diff --git a/world/drivers/ldmud/master/accept.c b/world/drivers/ldmud/master/accept.c index 429a3fb..db63890 100644 --- a/world/drivers/ldmud/master/accept.c +++ b/world/drivers/ldmud/master/accept.c @@ -129,7 +129,7 @@ object connect(int uid, int port, string service) { peerport = pointerp(arg) ? (arg[2]*256 + arg[3]) : 0; if (peerport < 0) peerport = 65536 + peerport; // no support for non-AF_INET nets yet - if (peerport == SPYC_SERVICE) peerport = 0; + if (peerport == PSYC_SERVICE) peerport = 0; # else // as long as the object names don't collide, this is okay too peerport = 65536 + random(9999999); diff --git a/world/net/include/net.h b/world/net/include/net.h index a627c1b..39379b0 100644 --- a/world/net/include/net.h +++ b/world/net/include/net.h @@ -64,7 +64,6 @@ # define NAMEPREP(s) FROM_UTF8(idna_stringprep(TO_UTF8(s), STRINGPREP_NAMEPREP)) # define RESOURCEPREP(s) FROM_UTF8(idna_stringprep(TO_UTF8(s), STRINGPREP_XMPP_RESOURCEPREP)) #else -# echo Warning: using lower_case instead of idna_stringprep! # define NODEPREP(s) lower_case(s) # define NAMEPREP(s) lower_case(s) # define RESOURCEPREP(s) (s) diff --git a/world/net/jabber/mixin_parse.c b/world/net/jabber/mixin_parse.c index 6a63504..1bb6d4f 100644 --- a/world/net/jabber/mixin_parse.c +++ b/world/net/jabber/mixin_parse.c @@ -4,6 +4,10 @@ #include "presence.h" #include +#if !__EFUN_DEFINED__(idna_stringprep) +# echo Warning: idn support as recommended for XMPP is missing from LPC driver. will try lower_case() instead. usually works. +#endif + // necessary to implement a minimum set of commands for remote jabber users // #undef USER_PROGRAM // #undef MYNICK @@ -221,8 +225,10 @@ jabberMsg(XMLNode node, mixed origin, mixed *su, array(mixed) tu) { time[TM_YEAR], time[TM_MON], time[TM_MDAY], time[TM_HOUR], time[TM_MIN], time[TM_SEC]); - if (res == 6 && (res = mktime(time)) != -1) { - vars["_time_place"] = res; //helper["@stamp"]; + if (res == 6) { + // mktime uses month from 0 to 11, december error fixed + time[TM_MON]--; + if ((res = mktime(time)) != -1) vars["_time_place"] = res; } } #endif diff --git a/world/net/jabber/mixin_render.c b/world/net/jabber/mixin_render.c index 865c872..b692b2a 100644 --- a/world/net/jabber/mixin_render.c +++ b/world/net/jabber/mixin_render.c @@ -99,7 +99,7 @@ int msg(string source, string mc, string data, $2["_amount_users_registered"] = helper["@value"]; break; case "users/online": - $2["_amount_users"] = helper["@value"]; + $2["_amount_users_loaded"] = helper["@value"]; break; } } diff --git a/world/net/library.i b/world/net/library.i index 3ef9933..a82aab0 100644 --- a/world/net/library.i +++ b/world/net/library.i @@ -812,10 +812,23 @@ varargs mixed sendmsg(mixed target, string mc, mixed data, vamapping vars, // fall thru case "xmpp": #ifdef SWITCH2PSYC + // maybe we should treat all of this just as if + // no scheme was given (jid treatment below) P4(("LOOKing for %O in %O\n", "psyc://"+u[UHost]+"/", targets)) tmp = targets["psyc://"+u[UHost]+"/"]; - if (tmp) { // && interactive(tmp)) { + if (tmp) { + // are we talking to our own net/root? + // in the past we used interactive() here + unless (clonep(tmp)) { + tmp = summon_person(u[UNick]); + unless (tmp) { + // doesn't have to be an error.. use jid treatment below? + sendmsg(source, "_failure_unavailable_route_place_XMPP", + "Sorry, you can't talk to a local chatroom via XMPP uniform."); + return 0; + } + } PT(("SWITCH2PSYC delivery %O for %O (%s)\n", tmp, target, mc || "0")) // we should very probably generate a redirect here instead! TODO diff --git a/world/net/psyc/active.c b/world/net/psyc/active.c index 80d2d1e..ef2d683 100644 --- a/world/net/psyc/active.c +++ b/world/net/psyc/active.c @@ -70,7 +70,7 @@ int msg(string source, string method, string data, return ::msg(source, method, data, vars, showingLog, target); #else // }}} { - P2(("%O ist nicht interactive\n", ME)) + P2(("%O is not interactive (no network connection)\n", ME)) if (!member(vars, "_source")) vars["_source"] = UNIFORM(source); // this stuff is causing loops and i don't know how to fix it right now diff --git a/world/net/spyc/circuit.c b/world/net/spyc/circuit.c index 1c80fd3..4c0383c 100644 --- a/world/net/spyc/circuit.c +++ b/world/net/spyc/circuit.c @@ -25,7 +25,7 @@ volatile string netloc; // this is completely anti-psyc. it should take mcs as arguments // and look up the actual message from textdb.. FIXME -#define CIRCUITERROR(reason) { debug_message("SPYC CIRCUIT: " reason "\n"); \ +#define CIRCUITERROR(reason) { \ croak("_error_circuit", "circuit error: " \ reason); \ return 0; \ @@ -55,9 +55,12 @@ void feed(string data) { // yes, this is a funny implementation of croak // it does not use msg(). Yes, that is intended varargs mixed croak(string mc, string data, vamapping vars, vamixed source) { + PT(("croak(%O) in %O (%O)\n", mc, ME, query_ip_name())) + unless (data) data = T(mc, ""); binary_message(sprintf("\n%s\n%s\n|\n", mc, data)); - remove_interactive(ME); - destruct(ME); + // right behaviour for all croaks!? + remove_interactive(ME); +// destruct(ME); return 0; } diff --git a/world/net/spyc/parse.c b/world/net/spyc/parse.c index e4972dc..316e61b 100644 --- a/world/net/spyc/parse.c +++ b/world/net/spyc/parse.c @@ -15,21 +15,21 @@ int may_parse_more; array(mixed) tvars; mapping hvars; -// this is completely anti-psyc. it should take mcs as arguments -// and look up the actual message from textdb.. FIXME -#define PARSEERROR(reason) { debug_message("PSYC PARSE ERROR: " reason "\n"); \ - croak("_error_syntax_broken", "Failed parsing: " \ - reason); \ - return 0; \ - } - - +// being faded out in favor of regular croak() +#define PARSEERROR(reason) { \ + croak("_error_syntax_broken", \ + "Failed parsing: " reason); \ + return 0; } + #define DELIM S_GLYPH_PACKET_DELIMITER "\n" #define C_LINEFEED '\n' #define MVAR_GLYPH 0 #define MVAR_STATE 1 #define MVAR_VALUE 2 +#ifndef PSYC_UDP +# define QUIT remove_interactive(ME); return 0; +#endif step(); // prototype @@ -76,9 +76,7 @@ void feed(string data) { // overload this as needed -varargs mixed croak(string mc, string data, vamapping vars, vamixed source) { - return 0; -} +varargs mixed croak(string mc, string data, vamapping vars) { return 0; } // called when a complete packet has arrived @@ -101,16 +99,18 @@ mapping process_header(mixed varops) { case C_GLYPH_MODIFIER_DIMINISH: case C_GLYPH_MODIFIER_QUERY: case C_GLYPH_MODIFIER_ASSIGN: - PARSEERROR("header modifier with glyph other than ':', this is not implemented") - break; + croak("_failure_unavailable_state"); + QUIT default: - PARSEERROR("header modifier with unknown glyph") - break; + croak("_failure_unknown_glyph"); + QUIT } - // FIXME: not every legal varname is a mmp varname + // FIXME: not every legal varname is a routing varname // look at shared_memory("routing") if (!legal_keyword(vname) || abbrev("_INTERNAL", vname)) { - PARSEERROR("illegal varname in header") + croak("_error_illegal_protocol_variable", 0, + ([ "_variable_name": vname ])); + return 0; } } return vars; @@ -158,7 +158,8 @@ void parse_header() { buffer = buffer[1..]; break; default: - PARSEERROR("noglyph") + croak("_error_syntax_expected_routing"); + QUIT } fit = sscanf(buffer, "%.1s%t", vname); if (fit != 1) { @@ -222,6 +223,7 @@ void parse_psyc() { PARSEERROR("negative binary length") } if (strlen(body_buffer) < len) { + // ouch, this is a problem here PARSEERROR("not enough to read binary arg, may not happen") } vvalue = body_buffer[..len-1]; @@ -290,9 +292,9 @@ void parse_content() { } fit = sscanf(body_buffer, "%.1s\n%.0s", method, body_buffer); if (fit != 2 || !legal_keyword(method)) { - croak("_error_illegal_method", - "That's not a valid method name."); - return; // NOTREACHED + croak("_error_illegal_method"); + // "That's not a valid method name."); + return; } // mhmm... why does body_buffer still contain the newline? @@ -359,8 +361,8 @@ void step() { first_response(); step(); } else { - croak("_error_syntax_initialization", - "The new protocol begins with a pipe and a line feed."); + croak("_error_syntax_initialization"); + // "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/twitter/polly.c b/world/net/twitter/polly.c index 2fd03a1..fb9d922 100644 --- a/world/net/twitter/polly.c +++ b/world/net/twitter/polly.c @@ -28,7 +28,7 @@ parse(string body, mapping headers) { P4((body)) //#endif unless (pointerp(wurst = parse_json(body))) { - monitor_report("_failure_network_fetch_twitter_empty", + monitor_report("_failure_network_fetch_twitter_broken", "[_source] failed to parse its timeline"); return; }