modules/ircparty/ircparty.c File Reference

#include <eggdrop/eggdrop.h>
#include "ircparty.h"

Go to the source code of this file.

Functions

EXPORT_SCOPE int ircparty_LTX_start (egg_module_t *modinfo)
static int ircparty_close (int why)
static int got_join (partymember_t *p, int idx, char *cmd, int nargs, char *args[])
static int got_part (partymember_t *p, int idx, char *cmd, int nargs, char *args[])
static int got_quit (partymember_t *p, int idx, char *cmd, int nargs, char *args[])
static int got_privmsg (partymember_t *p, int idx, char *cmd, int nargs, char *args[])
static int got_who (partymember_t *p, int idx, char *cmd, int nargs, char *args[])
static int got_mode (partymember_t *p, int idx, char *cmd, int nargs, char *args[])
static int irc_on_newclient (void *client_data, int idx, int newidx, const char *peer_ip, int peer_port)
static int irc_on_read (void *client_data, int idx, char *data, int len)
static int irc_on_eof (void *client_data, int idx, int err, const char *errmsg)
static int irc_on_delete (event_owner_t *owner, void *client_data)
static int irc_pm_delete (event_owner_t *owner, void *client_data)
static int ident_result (void *client_data, const char *ip, int port, const char *reply)
static int dns_result (void *client_data, const char *ip, char **hosts)
static int process_results (irc_session_t *session)
int irc_init ()
static void kill_session (irc_session_t *session)
static void irc_greet (irc_session_t *session)

Variables

static const char rcsid [] = "$Id: ircparty.c,v 1.21 2007-11-06 00:05:40 sven Exp $"
irc_config_t irc_config = {0}
static config_var_t irc_config_vars []
partyline_event_t irc_party_handler
static int irc_idx = -1
static int irc_port = 0
static bind_table_tBT_ircparty = NULL
static bind_list_t ircparty_binds []
static event_owner_t irc_generic_owner
static event_owner_t irc_sock_owner
static event_owner_t irc_pm_owner
static sockbuf_handler_t server_handler
static sockbuf_handler_t client_handler


Function Documentation

static int dns_result ( void *  client_data,
const char *  ip,
char **  hosts 
) [static]

Definition at line 171 of file ircparty.c.

References irc_session_t::dns_id, irc_session_t::host, and process_results().

00172 {
00173   irc_session_t *session = client_data;
00174   const char *host;
00175 
00176   session->dns_id = -1;
00177   if (!hosts || !hosts[0]) host = ip;
00178   else host = hosts[0];
00179 
00180   session->host = strdup(host);
00181   process_results(session);
00182   return(0);
00183 }

static int got_join ( partymember_t p,
int  idx,
char *  cmd,
int  nargs,
char *  args[] 
) [static]

Definition at line 216 of file ircparty.c.

References egg_iprintf(), partymember::nick, and partychan_join_name().

00217 {
00218   if (nargs != 1 || strlen(args[0]) < 2) egg_iprintf(idx, ":eggdrop.bot 461 %s JOIN :Not enough parameters.\r\n", p->nick);
00219   else partychan_join_name(args[0]+1, p, 0);
00220   return(0);
00221 }

static int got_mode ( partymember_t p,
int  idx,
char *  cmd,
int  nargs,
char *  args[] 
) [static]

Definition at line 230 of file ircparty.c.

References egg_iprintf(), and partymember::nick.

00231 {
00232   if (nargs != 1) return(0);
00233   if (*args[0] == '#') egg_iprintf(idx, ":eggdrop.bot 324 %s %s +tn\r\n", p->nick, args[0]);
00234   else egg_iprintf(idx, ":eggdrop.bot 221 %s +i\r\n", p->nick);
00235   return(0);
00236 }

static int got_part ( partymember_t p,
int  idx,
char *  cmd,
int  nargs,
char *  args[] 
) [static]

Definition at line 223 of file ircparty.c.

References egg_iprintf(), partymember::nick, and partychan_part_name().

00224 {
00225   if (nargs != 1 || strlen(args[0]) < 2) egg_iprintf(idx, ":eggdrop.bot 461 %s PART :Not enough parameters.\r\n", p->nick);
00226   else partychan_part_name(args[0]+1, p, args[1]);
00227   return(0);
00228 }

static int got_privmsg ( partymember_t p,
int  idx,
char *  cmd,
int  nargs,
char *  args[] 
) [static]

Definition at line 238 of file ircparty.c.

References egg_iprintf(), partymember::nick, NULL, partychan_lookup_name(), partyline_on_input(), partymember_lookup(), partymember_msg(), and user_entity.

00239 {
00240   if (nargs != 2) {
00241     egg_iprintf(idx, ":eggdrop.bot 461 %s PRIVMSG :Not enough parameters.\r\n", p->nick);
00242     return(0);
00243   }
00244 
00245   if (*args[0] == '#') {
00246     partychan_t *chan = partychan_lookup_name(args[0]+1);
00247     if (!chan) egg_iprintf(idx, ":eggdrop.bot 401 %s %s :No such nick/channel\r\n", p->nick, args[0]);
00248     else partyline_on_input(partychan_lookup_name(args[0]+1), p, args[1], -1);
00249   }
00250   else {
00251     botnet_entity_t src = user_entity(p);
00252 
00253     partymember_t *dest = partymember_lookup(args[0], NULL, -1);
00254     if (!dest) egg_iprintf(idx, ":eggdrop.bot 401 %s %s :No such nick/channel\r\n", p->nick, args[0]);
00255     else partymember_msg(dest, &src, args[1], -1);
00256   }
00257   return(0);
00258 }

static int got_quit ( partymember_t p,
int  idx,
char *  cmd,
int  nargs,
char *  args[] 
) [static]

Definition at line 283 of file ircparty.c.

References sockbuf_delete().

00284 {
00285   sockbuf_delete(idx);
00286   return(0);
00287 }

static int got_who ( partymember_t p,
int  idx,
char *  cmd,
int  nargs,
char *  args[] 
) [static]

Definition at line 260 of file ircparty.c.

References egg_iprintf(), partychan_member::flags, partymember::host, partymember::ident, LOG_MISC, partychan::members, partymember::nick, partychan::nmembers, partychan_member::p, PARTY_DELETED, partychan_lookup_name(), and putlog().

00261 {
00262   partychan_t *chan;
00263   partychan_member_t *m;
00264   partymember_t *q;
00265   int i;
00266 
00267   if (nargs != 1 || strlen(args[0]) < 2) return(0);
00268   chan = partychan_lookup_name(args[0]+1);
00269   if (!chan) return(0);
00270 
00271   for (i = 0; i < chan->nmembers; i++) {
00272     m = chan->members+i;
00273     if (chan->members[i].flags & PARTY_DELETED) continue;
00274     q = m->p;
00275     egg_iprintf(idx, ":eggdrop.bot 352 %s %s %s %s eggdrop.bot %s H :0 real name\r\n", p->nick, args[0], q->ident, q->host, q->nick);
00276     putlog(LOG_MISC, "ircpartylog", ":eggdrop.bot 352 %s %s %s %s eggdrop.bot %s H :0 real name\r\n", p->nick, args[0], q->ident, q->host, q->nick);
00277   }
00278 
00279   egg_iprintf(idx, ":eggdrop.bot 315 %s %s :End of /WHO list.\r\n", p->nick, args[0]);
00280   return(0);
00281 }

static int ident_result ( void *  client_data,
const char *  ip,
int  port,
const char *  reply 
) [static]

Definition at line 160 of file ircparty.c.

References irc_session_t::ident, irc_session_t::ident_id, and process_results().

00161 {
00162   irc_session_t *session = client_data;
00163 
00164   session->ident_id = -1;
00165   if (reply) session->ident = strdup(reply);
00166   else session->ident = strdup("~ircparty");
00167   process_results(session);
00168   return(0);
00169 }

static void irc_greet ( irc_session_t session  )  [static]

Definition at line 208 of file ircparty.c.

References egg_iprintf(), irc_session_t::idx, and irc_session_t::nick.

Referenced by irc_on_read().

00209 {
00210   egg_iprintf(session->idx, ":eggdrop.bot 001 %s :Welcome to the Eggdrop Partyline!\r\n", session->nick);
00211   egg_iprintf(session->idx, ":eggdrop.bot 375 %s :Message of the Day\r\n", session->nick);
00212   egg_iprintf(session->idx, ":eggdrop.bot 372 %s :There isn't one.\r\n", session->nick);
00213   egg_iprintf(session->idx, ":eggdrop.bot 376 %s :End of /MOTD command.\r\n", session->nick);
00214 }

int irc_init (  ) 

Definition at line 106 of file ircparty.c.

References bind_add_list(), BIND_STACKABLE, bind_table_add(), egg_server(), irc_idx, irc_port, MATCH_MASK, NULL, irc_config_t::port, sockbuf_set_handler(), and irc_config_t::vhost.

Referenced by ircparty_LTX_start().

00107 {
00108   BT_ircparty = bind_table_add("ircparty", 5, "PisiS", MATCH_MASK, BIND_STACKABLE); /* DDD */
00109   bind_add_list("ircparty", ircparty_binds);
00110   /* Open our listening socket. */
00111   irc_idx = egg_server(irc_config.vhost, irc_config.port, &irc_port);
00112   sockbuf_set_handler(irc_idx, &server_handler, NULL, NULL);
00113   return(0);
00114 }

static int irc_on_delete ( event_owner_t owner,
void *  client_data 
) [static]

Definition at line 363 of file ircparty.c.

References kill_session(), NULL, irc_session_t::party, and partymember_delete().

00364 {
00365   irc_session_t *session = client_data;
00366 
00367   if (session->party) {
00368     partymember_delete(session->party, NULL, "Deleted!");
00369     session->party = NULL;
00370   }
00371   kill_session(session);
00372   return(0);
00373 }

static int irc_on_eof ( void *  client_data,
int  idx,
int  err,
const char *  errmsg 
) [static]

Definition at line 336 of file ircparty.c.

References NULL, irc_session_t::party, partymember_delete(), and sockbuf_delete().

00337 {
00338   irc_session_t *session = client_data;
00339 
00340   if (session->party) {
00341     if (!err) errmsg = "Client disconnected";
00342     else if (!errmsg) errmsg = "Unknown error";
00343     partymember_delete(session->party, NULL, errmsg);
00344     /* This will call our on_quit handler which will delete the sockbuf
00345      * which will call our on_delete handler which will kill the session.
00346      * Summery: All the data is gone, don't touch any of the variables */
00347   } else {
00348     sockbuf_delete(idx);
00349   }
00350   return(0);
00351 }

static int irc_on_newclient ( void *  client_data,
int  idx,
int  newidx,
const char *  peer_ip,
int  peer_port 
) [static]

Definition at line 128 of file ircparty.c.

References irc_session_t::dns_id, dns_result(), egg_dns_reverse(), egg_ident_lookup(), egg_iprintf(), irc_session_t::flags, irc_session_t::ident_id, ident_result(), irc_session_t::idx, irc_session_t::ip, irc_port, linemode_on(), NULL, irc_session_t::port, sockbuf_set_handler(), sockbuf_write(), socktimer_on(), irc_session_t::state, STATE_RESOLVE, STATE_UNREGISTERED, irc_config_t::stealth, and STEALTH_LOGIN.

00129 {
00130   irc_session_t *session;
00131 
00132   session = calloc(1, sizeof(*session));
00133   session->ip = strdup(peer_ip);
00134   session->port = peer_port;
00135   session->idx = newidx;
00136 
00137   sockbuf_set_handler(newidx, &client_handler, session, &irc_sock_owner);
00138   socktimer_on(newidx, 60, 0, NULL, NULL, &irc_generic_owner);
00139   linemode_on(newidx);
00140 
00141   /* Stealth logins are where we don't say anything until we know they
00142    * are a valid user. */
00143   if (irc_config.stealth) {
00144     session->state = STATE_RESOLVE;
00145     session->flags |= STEALTH_LOGIN;
00146   }
00147   else {
00148     egg_iprintf(newidx, ":eggdrop.bot NOTICE AUTH :*** Hello %s/%d!\r\n", peer_ip, peer_port);
00149     sockbuf_write(newidx, ":eggdrop.bot NOTICE AUTH :*** Don't forget to use the /PASS command to send your password in addition to normal registration!\r\n", -1);
00150     session->state = STATE_UNREGISTERED;
00151   }
00152 
00153   /* Start lookups. */
00154   session->ident_id = egg_ident_lookup(peer_ip, peer_port, irc_port, -1, ident_result, session, &irc_generic_owner);
00155   session->dns_id = egg_dns_reverse(peer_ip, -1, dns_result, session, &irc_generic_owner);
00156 
00157   return(0);
00158 }

static int irc_on_read ( void *  client_data,
int  idx,
char *  data,
int  len 
) [static]

Definition at line 289 of file ircparty.c.

References irc_msg::args, bind_check(), irc_msg::cmd, egg_iprintf(), irc_session_t::host, irc_session_t::ident, irc_session_t::idx, irc_session_t::ip, irc_greet(), irc_msg_cleanup(), irc_msg_parse(), LOG_MISC, irc_msg::nargs, irc_session_t::nick, NULL, irc_session_t::party, partychan_join_name(), partymember_new(), irc_session_t::pass, putlog(), sockbuf_delete(), sockbuf_write(), socktimer_off(), irc_session_t::state, STATE_PARTYLINE, STATE_UNREGISTERED, str_redup(), irc_session_t::user, and user_lookup_authed().

00290 {
00291   irc_session_t *session = client_data;
00292   irc_msg_t msg;
00293   int i;
00294 
00295   irc_msg_parse(data, &msg);
00296   putlog(LOG_MISC, "ircpartylog", "%d, '%s'", msg.nargs, msg.cmd);
00297   for (i = 0; i < msg.nargs; i++) {
00298     putlog(LOG_MISC, "ircpartylog", "--> '%s'", msg.args[i]);
00299   }
00300 
00301   switch (session->state) {
00302     case STATE_PARTYLINE:
00303       bind_check(BT_ircparty, NULL, msg.cmd, session->party, idx, msg.cmd, msg.nargs, msg.args);
00304       break;
00305     case STATE_UNREGISTERED:
00306       if (!msg.cmd) break;
00307       if (!strcasecmp(msg.cmd, "nick") && msg.nargs == 1) {
00308         if (session->nick) egg_iprintf(session->idx, ":%s NICK %s\r\n", session->nick, msg.args[0]);
00309         str_redup(&session->nick, msg.args[0]);
00310       }
00311       else if (!strcasecmp(msg.cmd, "pass") && msg.nargs == 1) {
00312         str_redup(&session->pass, msg.args[0]);
00313       }
00314       else break;
00315       if (session->nick && session->pass) {
00316         session->user = user_lookup_authed(session->nick, session->pass);
00317         if (!session->user) {
00318           sockbuf_write(session->idx, ":eggdrop.bot NOTICE AUTH :*** Invalid username/password.\r\n", -1);
00319           sockbuf_delete(session->idx);
00320           break;
00321         }
00322         free(session->pass);
00323         session->pass = NULL;
00324         session->party = partymember_new(-1, session->user, NULL, session->nick, session->ident ? session->ident : "~ircparty", session->host ? session->host : session->ip, &irc_party_handler, session, &irc_pm_owner);
00325         session->state = STATE_PARTYLINE;
00326         irc_greet(session);
00327         socktimer_off(idx);
00328         partychan_join_name("*", session->party, 0);
00329       }
00330       break;
00331   }
00332   irc_msg_cleanup(&msg);
00333   return(0);
00334 }

static int irc_pm_delete ( event_owner_t owner,
void *  client_data 
) [static]

Definition at line 353 of file ircparty.c.

References irc_session_t::idx, NULL, irc_session_t::party, and sockbuf_delete().

00354 {
00355   irc_session_t *session = client_data;
00356 
00357   session->party = NULL;
00358   sockbuf_delete(session->idx);
00359 
00360   return 0;
00361 }

static int ircparty_close ( int  why  )  [static]

Definition at line 375 of file ircparty.c.

References config_get_root(), config_root, config_unlink_table(), irc_idx, NULL, and sockbuf_delete().

Referenced by ircparty_LTX_start().

00376 {
00377   void *config_root;
00378 
00379   config_root = config_get_root("eggdrop");
00380   config_unlink_table(irc_config_vars, config_root, "ircparty", 0, NULL);
00381 
00382   sockbuf_delete(irc_idx);
00383   return(0);
00384 }

int ircparty_LTX_start ( egg_module_t modinfo  ) 

Definition at line 386 of file ircparty.c.

References egg_module::author, egg_module::close_func, config_get_root(), config_link_table(), config_root, config_update_table(), egg_module::description, irc_init(), ircparty_close(), event_owner_b::module, egg_module::name, NULL, and egg_module::version.

00387 {
00388   void *config_root;
00389 
00390   irc_generic_owner.module = irc_sock_owner.module = irc_pm_owner.module = modinfo;
00391 
00392   modinfo->name = "ircparty";
00393   modinfo->author = "eggdev";
00394   modinfo->version = "1.0.0";
00395   modinfo->description = "irc client support for the partyline";
00396   modinfo->close_func = ircparty_close;
00397 
00398   /* Set defaults. */
00399   memset(&irc_config, 0, sizeof(irc_config));
00400 
00401   /* Link our vars in. */
00402   config_root = config_get_root("eggdrop");
00403   config_link_table(irc_config_vars, config_root, "ircparty", 0, NULL);
00404   config_update_table(irc_config_vars, config_root, "ircparty", 0, NULL);
00405 
00406   irc_init();
00407   return(0);
00408 }

static void kill_session ( irc_session_t session  )  [static]

Definition at line 116 of file ircparty.c.

References irc_session_t::dns_id, egg_dns_cancel(), egg_ident_cancel(), irc_session_t::host, irc_session_t::ident, irc_session_t::ident_id, irc_session_t::ip, irc_session_t::nick, and irc_session_t::pass.

00117 {
00118   if (session->ident_id != -1) egg_ident_cancel(session->ident_id, 0);
00119   if (session->dns_id != -1) egg_dns_cancel(session->dns_id, 0);
00120   if (session->ip) free(session->ip);
00121   if (session->host) free(session->host);
00122   if (session->ident) free(session->ident);
00123   if (session->nick) free(session->nick);
00124   if (session->pass) free(session->pass);
00125   free(session);
00126 }

static int process_results ( irc_session_t session  )  [static]

Definition at line 185 of file ircparty.c.

References irc_session_t::flags, irc_session_t::host, irc_session_t::ident, irc_session_t::idx, irc_session_t::party, partyline_update_info(), sockbuf_delete(), sockbuf_write(), irc_session_t::state, STATE_PARTYLINE, STATE_UNREGISTERED, STEALTH_LOGIN, and user_lookup_by_irchost().

00186 {
00187   char fakehost[512];
00188 
00189   if (!session->ident || !session->host) return(0);
00190 
00191   if (session->state == STATE_PARTYLINE) {
00192     partyline_update_info(session->party, session->ident, session->host);
00193     return(0);
00194   }
00195   if (session->flags & STEALTH_LOGIN) {
00196     snprintf(fakehost, sizeof(fakehost), "-ircparty!%s@%s", session->ident, session->host);
00197     fakehost[sizeof(fakehost)-1] = 0;
00198     if (!user_lookup_by_irchost(fakehost)) {
00199       sockbuf_delete(session->idx);
00200       return(0);
00201     }
00202     sockbuf_write(session->idx, ":eggdrop.bot NOTICE AUTH :*** Don't forget to use the /PASS command to send your password in addition to normal registration!\r\n", -1);
00203     session->state = STATE_UNREGISTERED;
00204   }
00205   return(0);
00206 }


Variable Documentation

bind_table_t* BT_ircparty = NULL [static]

Definition at line 45 of file ircparty.c.

Initial value:

 {
  "ircparty",
  NULL, irc_on_eof, NULL,
  irc_on_read, NULL
}

Definition at line 100 of file ircparty.c.

Definition at line 28 of file ircparty.c.

Initial value:

 {
  {"vhost", &irc_config.vhost, CONFIG_STRING},
  {"port", &irc_config.port, CONFIG_INT},
  {"stealth", &irc_config.stealth, CONFIG_INT},
  {0}
}

Definition at line 30 of file ircparty.c.

Initial value:

 {
  "ircparty", 0,
  0, 0,
  0
}

Definition at line 76 of file ircparty.c.

int irc_idx = -1 [static]

Definition at line 43 of file ircparty.c.

Referenced by irc_init(), and ircparty_close().

Definition at line 35 of file events.c.

Initial value:

 {
  "ircparty", 0,
  0, 0,
  irc_pm_delete
}

Definition at line 88 of file ircparty.c.

int irc_port = 0 [static]

Definition at line 44 of file ircparty.c.

Referenced by irc_init(), and irc_on_newclient().

Initial value:

 {
  "ircparty", 0,
  0, 0,
  irc_on_delete
}

Definition at line 82 of file ircparty.c.

Initial value:

 {
  {NULL, "PRIVMSG", got_privmsg},
  {NULL, "JOIN", got_join},
  {NULL, "PART", got_part},
  {NULL, "QUIT", got_quit},
  {NULL, "MODE", got_mode},
  {NULL, "WHO", got_who},
  {0}
}

Definition at line 66 of file ircparty.c.

const char rcsid[] = "$Id: ircparty.c,v 1.21 2007-11-06 00:05:40 sven Exp $" [static]

Definition at line 21 of file ircparty.c.

Initial value:

 {
  "ircparty server",
  NULL, NULL, irc_on_newclient,
  NULL, NULL
}

Definition at line 94 of file ircparty.c.


Generated on Sun Nov 30 18:43:36 2008 for eggdrop1.9 by  doxygen 1.5.6