recipient.c
上传用户:xu_441
上传日期:2007-01-04
资源大小:1640k
文件大小:37k
源码类别:

Email客户端

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
  3.  * All rights reserved.
  4.  * Copyright (c) 1983, 1995-1997 Eric P. Allman.  All rights reserved.
  5.  * Copyright (c) 1988, 1993
  6.  * The Regents of the University of California.  All rights reserved.
  7.  *
  8.  * By using this file, you agree to the terms and conditions set
  9.  * forth in the LICENSE file which can be found at the top level of
  10.  * the sendmail distribution.
  11.  *
  12.  */
  13. #ifndef lint
  14. static char id[] = "@(#)$Id: recipient.c,v 8.229 1999/11/28 00:25:41 gshapiro Exp $";
  15. #endif /* ! lint */
  16. #include <sendmail.h>
  17. static void includetimeout __P((void));
  18. static ADDRESS *self_reference __P((ADDRESS *));
  19. /*
  20. **  SENDTOLIST -- Designate a send list.
  21. **
  22. ** The parameter is a comma-separated list of people to send to.
  23. ** This routine arranges to send to all of them.
  24. **
  25. ** Parameters:
  26. ** list -- the send list.
  27. ** ctladdr -- the address template for the person to
  28. ** send to -- effective uid/gid are important.
  29. ** This is typically the alias that caused this
  30. ** expansion.
  31. ** sendq -- a pointer to the head of a queue to put
  32. ** these people into.
  33. ** aliaslevel -- the current alias nesting depth -- to
  34. ** diagnose loops.
  35. ** e -- the envelope in which to add these recipients.
  36. **
  37. ** Returns:
  38. ** The number of addresses actually on the list.
  39. **
  40. ** Side Effects:
  41. ** none.
  42. */
  43. /* q_flags bits inherited from ctladdr */
  44. #define QINHERITEDBITS (QPINGONSUCCESS|QPINGONFAILURE|QPINGONDELAY|QHASNOTIFY)
  45. int
  46. sendtolist(list, ctladdr, sendq, aliaslevel, e)
  47. char *list;
  48. ADDRESS *ctladdr;
  49. ADDRESS **sendq;
  50. int aliaslevel;
  51. register ENVELOPE *e;
  52. {
  53. register char *p;
  54. register ADDRESS *al; /* list of addresses to send to */
  55. char delimiter; /* the address delimiter */
  56. int naddrs;
  57. int i;
  58. char *oldto = e->e_to;
  59. char *bufp;
  60. char buf[MAXNAME + 1];
  61. if (list == NULL)
  62. {
  63. syserr("sendtolist: null list");
  64. return 0;
  65. }
  66. if (tTd(25, 1))
  67. {
  68. dprintf("sendto: %sn   ctladdr=", list);
  69. printaddr(ctladdr, FALSE);
  70. }
  71. /* heuristic to determine old versus new style addresses */
  72. if (ctladdr == NULL &&
  73.     (strchr(list, ',') != NULL || strchr(list, ';') != NULL ||
  74.      strchr(list, '<') != NULL || strchr(list, '(') != NULL))
  75. e->e_flags &= ~EF_OLDSTYLE;
  76. delimiter = ' ';
  77. if (!bitset(EF_OLDSTYLE, e->e_flags) || ctladdr != NULL)
  78. delimiter = ',';
  79. al = NULL;
  80. naddrs = 0;
  81. /* make sure we have enough space to copy the string */
  82. i = strlen(list) + 1;
  83. if (i <= sizeof buf)
  84. {
  85. bufp = buf;
  86. i = sizeof buf;
  87. }
  88. else
  89. bufp = xalloc(i);
  90. (void) strlcpy(bufp, denlstring(list, FALSE, TRUE), i);
  91. #if _FFR_ADDR_TYPE
  92. define(macid("{addr_type}", NULL), "e r", e);
  93. #endif /* _FFR_ADDR_TYPE */
  94. for (p = bufp; *p != ''; )
  95. {
  96. auto char *delimptr;
  97. register ADDRESS *a;
  98. /* parse the address */
  99. while ((isascii(*p) && isspace(*p)) || *p == ',')
  100. p++;
  101. a = parseaddr(p, NULLADDR, RF_COPYALL, delimiter, &delimptr, e);
  102. p = delimptr;
  103. if (a == NULL)
  104. continue;
  105. a->q_next = al;
  106. a->q_alias = ctladdr;
  107. /* arrange to inherit attributes from parent */
  108. if (ctladdr != NULL)
  109. {
  110. ADDRESS *b;
  111. /* self reference test */
  112. if (sameaddr(ctladdr, a))
  113. {
  114. if (tTd(27, 5))
  115. {
  116. dprintf("sendtolist: QSELFREF ");
  117. printaddr(ctladdr, FALSE);
  118. }
  119. ctladdr->q_flags |= QSELFREF;
  120. }
  121. /* check for address loops */
  122. b = self_reference(a);
  123. if (b != NULL)
  124. {
  125. b->q_flags |= QSELFREF;
  126. if (tTd(27, 5))
  127. {
  128. dprintf("sendtolist: QSELFREF ");
  129. printaddr(b, FALSE);
  130. }
  131. if (a != b)
  132. {
  133. if (tTd(27, 5))
  134. {
  135. dprintf("sendtolist: QS_DONTSEND ");
  136. printaddr(a, FALSE);
  137. }
  138. a->q_state = QS_DONTSEND;
  139. b->q_flags |= a->q_flags & QNOTREMOTE;
  140. continue;
  141. }
  142. }
  143. /* full name */
  144. if (a->q_fullname == NULL)
  145. a->q_fullname = ctladdr->q_fullname;
  146. /* various flag bits */
  147. a->q_flags &= ~QINHERITEDBITS;
  148. a->q_flags |= ctladdr->q_flags & QINHERITEDBITS;
  149. /* original recipient information */
  150. a->q_orcpt = ctladdr->q_orcpt;
  151. }
  152. al = a;
  153. }
  154. /* arrange to send to everyone on the local send list */
  155. while (al != NULL)
  156. {
  157. register ADDRESS *a = al;
  158. al = a->q_next;
  159. a = recipient(a, sendq, aliaslevel, e);
  160. naddrs++;
  161. }
  162. e->e_to = oldto;
  163. if (bufp != buf)
  164. free(bufp);
  165. #if _FFR_ADDR_TYPE
  166. define(macid("{addr_type}", NULL), NULL, e);
  167. #endif /* _FFR_ADDR_TYPE */
  168. return naddrs;
  169. }
  170. /*
  171. **  REMOVEFROMLIST -- Remove addresses from a send list.
  172. **
  173. ** The parameter is a comma-separated list of recipients to remove.
  174. ** Note that it only deletes matching addresses.  If those addresses
  175. ** have been expended already in the sendq, it won't mark the
  176. ** expanded recipients as QS_REMOVED.
  177. **
  178. ** Parameters:
  179. ** list -- the list to remove.
  180. ** sendq -- a pointer to the head of a queue to remove
  181. ** these addresses from.
  182. ** e -- the envelope in which to remove these recipients.
  183. **
  184. ** Returns:
  185. ** The number of addresses removed from the list.
  186. **
  187. */
  188. int
  189. removefromlist(list, sendq, e)
  190. char *list;
  191. ADDRESS **sendq;
  192. ENVELOPE *e;
  193. {
  194. char delimiter; /* the address delimiter */
  195. int naddrs;
  196. int i;
  197. char *p;
  198. char *oldto = e->e_to;
  199. char *bufp;
  200. char buf[MAXNAME + 1];
  201. if (list == NULL)
  202. {
  203. syserr("removefromlist: null list");
  204. return 0;
  205. }
  206. if (tTd(25, 1))
  207. dprintf("removefromlist: %sn", list);
  208. /* heuristic to determine old versus new style addresses */
  209. if (strchr(list, ',') != NULL || strchr(list, ';') != NULL ||
  210.     strchr(list, '<') != NULL || strchr(list, '(') != NULL)
  211. e->e_flags &= ~EF_OLDSTYLE;
  212. delimiter = ' ';
  213. if (!bitset(EF_OLDSTYLE, e->e_flags))
  214. delimiter = ',';
  215. naddrs = 0;
  216. /* make sure we have enough space to copy the string */
  217. i = strlen(list) + 1;
  218. if (i <= sizeof buf)
  219. {
  220. bufp = buf;
  221. i = sizeof buf;
  222. }
  223. else
  224. bufp = xalloc(i);
  225. (void) strlcpy(bufp, denlstring(list, FALSE, TRUE), i);
  226. #if _FFR_ADDR_TYPE
  227. define(macid("{addr_type}", NULL), "e r", e);
  228. #endif /* _FFR_ADDR_TYPE */
  229. for (p = bufp; *p != ''; )
  230. {
  231. ADDRESS a; /* parsed address to be removed */
  232. ADDRESS *q;
  233. ADDRESS **pq;
  234. char *delimptr;
  235. /* parse the address */
  236. while ((isascii(*p) && isspace(*p)) || *p == ',')
  237. p++;
  238. if (parseaddr(p, &a, RF_COPYALL,
  239.       delimiter, &delimptr, e) == NULL)
  240. {
  241. p = delimptr;
  242. continue;
  243. }
  244. p = delimptr;
  245. for (pq = sendq; (q = *pq) != NULL; pq = &q->q_next)
  246. {
  247. if (!QS_IS_DEAD(q->q_state) &&
  248.     sameaddr(q, &a))
  249. {
  250. if (tTd(25, 5))
  251. {
  252. dprintf("removefromlist: QS_REMOVED ");
  253. printaddr(&a, FALSE);
  254. }
  255. q->q_state = QS_REMOVED;
  256. naddrs++;
  257. break;
  258. }
  259. }
  260. }
  261. e->e_to = oldto;
  262. if (bufp != buf)
  263. free(bufp);
  264. #if _FFR_ADDR_TYPE
  265. define(macid("{addr_type}", NULL), NULL, e);
  266. #endif /* _FFR_ADDR_TYPE */
  267. return naddrs;
  268. }
  269. /*
  270. **  RECIPIENT -- Designate a message recipient
  271. **
  272. ** Saves the named person for future mailing.
  273. **
  274. ** Parameters:
  275. ** a -- the (preparsed) address header for the recipient.
  276. ** sendq -- a pointer to the head of a queue to put the
  277. ** recipient in.  Duplicate suppression is done
  278. ** in this queue.
  279. ** aliaslevel -- the current alias nesting depth.
  280. ** e -- the current envelope.
  281. **
  282. ** Returns:
  283. ** The actual address in the queue.  This will be "a" if
  284. ** the address is not a duplicate, else the original address.
  285. **
  286. ** Side Effects:
  287. ** none.
  288. */
  289. ADDRESS *
  290. recipient(a, sendq, aliaslevel, e)
  291. register ADDRESS *a;
  292. register ADDRESS **sendq;
  293. int aliaslevel;
  294. register ENVELOPE *e;
  295. {
  296. register ADDRESS *q;
  297. ADDRESS **pq;
  298. register struct mailer *m;
  299. register char *p = NULL;
  300. bool quoted = FALSE; /* set if the addr has a quote bit */
  301. int findusercount = 0;
  302. bool initialdontsend = QS_IS_DEAD(a->q_state);
  303. int i, buflen;
  304. char *buf;
  305. char buf0[MAXNAME + 1]; /* unquoted image of the user name */
  306. e->e_to = a->q_paddr;
  307. m = a->q_mailer;
  308. errno = 0;
  309. if (aliaslevel == 0)
  310. a->q_flags |= QPRIMARY;
  311. if (tTd(26, 1))
  312. {
  313. dprintf("nrecipient (%d): ", aliaslevel);
  314. printaddr(a, FALSE);
  315. }
  316. /* if this is primary, add it to the original recipient list */
  317. if (a->q_alias == NULL)
  318. {
  319. if (e->e_origrcpt == NULL)
  320. e->e_origrcpt = a->q_paddr;
  321. else if (e->e_origrcpt != a->q_paddr)
  322. e->e_origrcpt = "";
  323. }
  324. #if _FFR_GEN_ORCPT
  325. /* set ORCPT DSN arg if not already set */
  326. if (a->q_orcpt == NULL)
  327. {
  328. for (q = a; q->q_alias != NULL; q = q->q_alias)
  329. continue;
  330. /* check for an existing ORCPT */
  331. if (q->q_orcpt != NULL)
  332. a->q_orcpt = q->q_orcpt;
  333. else
  334. {
  335. /* make our own */
  336. bool b = FALSE;
  337. char *qp;
  338. char obuf[MAXLINE];
  339. if (e->e_from.q_mailer != NULL)
  340. p = e->e_from.q_mailer->m_addrtype;
  341. if (p == NULL)
  342. p = "rfc822";
  343. (void) strlcpy(obuf, p, sizeof obuf);
  344. (void) strlcat(obuf, ";", sizeof obuf);
  345. qp = q->q_paddr;
  346. /* FFR: Needs to strip comments from stdin addrs */
  347. /* strip brackets from address */
  348. if (*qp == '<')
  349. {
  350. b = qp[strlen(qp) - 1] == '>';
  351. if (b)
  352. qp[strlen(qp) - 1] = '';
  353. qp++;
  354. }
  355. p = xtextify(denlstring(qp, TRUE, FALSE), NULL);
  356. if (strlcat(obuf, p, sizeof obuf) >= sizeof obuf)
  357. {
  358. /* if too big, don't use it */
  359. obuf[0] = '';
  360. }
  361. /* undo damage */
  362. if (b)
  363. qp[strlen(qp)] = '>';
  364. if (obuf[0] != '')
  365. a->q_orcpt = newstr(obuf);
  366. }
  367. }
  368. #endif /* _FFR_GEN_ORCPT */
  369. /* break aliasing loops */
  370. if (aliaslevel > MaxAliasRecursion)
  371. {
  372. a->q_state = QS_BADADDR;
  373. a->q_status = "5.4.6";
  374. usrerrenh(a->q_status,
  375.   "554 aliasing/forwarding loop broken (%d aliases deep; %d max)",
  376.   aliaslevel, MaxAliasRecursion);
  377. return a;
  378. }
  379. /*
  380. **  Finish setting up address structure.
  381. */
  382. /* get unquoted user for file, program or user.name check */
  383. i = strlen(a->q_user);
  384. if (i >= sizeof buf0)
  385. {
  386. buflen = i + 1;
  387. buf = xalloc(buflen);
  388. }
  389. else
  390. {
  391. buf = buf0;
  392. buflen = sizeof buf0;
  393. }
  394. (void) strlcpy(buf, a->q_user, buflen);
  395. for (p = buf; *p != '' && !quoted; p++)
  396. {
  397. if (*p == '\')
  398. quoted = TRUE;
  399. }
  400. stripquotes(buf);
  401. /* check for direct mailing to restricted mailers */
  402. if (m == ProgMailer)
  403. {
  404. if (a->q_alias == NULL)
  405. {
  406. a->q_state = QS_BADADDR;
  407. a->q_status = "5.7.1";
  408. usrerrenh(a->q_status,
  409.   "550 Cannot mail directly to programs");
  410. }
  411. else if (bitset(QBOGUSSHELL, a->q_alias->q_flags))
  412. {
  413. a->q_state = QS_BADADDR;
  414. a->q_status = "5.7.1";
  415. if (a->q_alias->q_ruser == NULL)
  416. usrerrenh(a->q_status,
  417.   "550 UID %d is an unknown user: cannot mail to programs",
  418.   a->q_alias->q_uid);
  419. else
  420. usrerrenh(a->q_status,
  421.   "550 User %s@%s doesn't have a valid shell for mailing to programs",
  422.   a->q_alias->q_ruser, MyHostName);
  423. }
  424. else if (bitset(QUNSAFEADDR, a->q_alias->q_flags))
  425. {
  426. a->q_state = QS_BADADDR;
  427. a->q_status = "5.7.1";
  428. a->q_rstatus = newstr("550 Unsafe for mailing to programs");
  429. usrerrenh(a->q_status,
  430.   "550 Address %s is unsafe for mailing to programs",
  431.   a->q_alias->q_paddr);
  432. }
  433. }
  434. /*
  435. **  Look up this person in the recipient list.
  436. ** If they are there already, return, otherwise continue.
  437. ** If the list is empty, just add it.  Notice the cute
  438. ** hack to make from addresses suppress things correctly:
  439. ** the QS_DUPLICATE state will be set in the send list.
  440. ** [Please note: the emphasis is on "hack."]
  441. */
  442. for (pq = sendq; (q = *pq) != NULL; pq = &q->q_next)
  443. {
  444. if (sameaddr(q, a) &&
  445.     (bitset(QRCPTOK, q->q_flags) ||
  446.      !bitset(QPRIMARY, q->q_flags)))
  447. {
  448. if (tTd(26, 1))
  449. {
  450. dprintf("%s in sendq: ", a->q_paddr);
  451. printaddr(q, FALSE);
  452. }
  453. if (!bitset(QPRIMARY, q->q_flags))
  454. {
  455. if (!QS_IS_DEAD(a->q_state))
  456. message("duplicate suppressed");
  457. else
  458. q->q_state = QS_DUPLICATE;
  459. q->q_flags |= a->q_flags;
  460. }
  461. else if (bitset(QSELFREF, q->q_flags))
  462. {
  463. q->q_state = a->q_state;
  464. q->q_flags |= a->q_flags;
  465. }
  466. a = q;
  467. goto done;
  468. }
  469. }
  470. /* add address on list */
  471. if (pq != NULL)
  472. {
  473. *pq = a;
  474. a->q_next = NULL;
  475. }
  476. /*
  477. **  Alias the name and handle special mailer types.
  478. */
  479.   trylocaluser:
  480. if (tTd(29, 7))
  481. {
  482. dprintf("at trylocaluser: ");
  483. printaddr(a, FALSE);
  484. }
  485. if (!QS_IS_OK(a->q_state))
  486. goto testselfdestruct;
  487. if (m == InclMailer)
  488. {
  489. a->q_state = QS_INCLUDED;
  490. if (a->q_alias == NULL)
  491. {
  492. a->q_state = QS_BADADDR;
  493. a->q_status = "5.7.1";
  494. usrerrenh(a->q_status,
  495.   "550 Cannot mail directly to :include:s");
  496. }
  497. else
  498. {
  499. int ret;
  500. message("including file %s", a->q_user);
  501. ret = include(a->q_user, FALSE, a, sendq, aliaslevel, e);
  502. if (transienterror(ret))
  503. {
  504. if (LogLevel > 2)
  505. sm_syslog(LOG_ERR, e->e_id,
  506.   "include %s: transient error: %s",
  507.   shortenstring(a->q_user, MAXSHORTSTR),
  508.   errstring(ret));
  509. a->q_state = QS_QUEUEUP;
  510. usrerr("451 4.2.4 Cannot open %s: %s",
  511. shortenstring(a->q_user, MAXSHORTSTR),
  512. errstring(ret));
  513. }
  514. else if (ret != 0)
  515. {
  516. a->q_state = QS_BADADDR;
  517. a->q_status = "5.2.4";
  518. usrerrenh(a->q_status,
  519.   "550 Cannot open %s: %s",
  520.   shortenstring(a->q_user, MAXSHORTSTR),
  521.   errstring(ret));
  522. }
  523. }
  524. }
  525. else if (m == FileMailer)
  526. {
  527. /* check if writable or creatable */
  528. if (a->q_alias == NULL)
  529. {
  530. a->q_state = QS_BADADDR;
  531. a->q_status = "5.7.1";
  532. usrerrenh(a->q_status,
  533.   "550 Cannot mail directly to files");
  534. }
  535. else if (bitset(QBOGUSSHELL, a->q_alias->q_flags))
  536. {
  537. a->q_state = QS_BADADDR;
  538. a->q_status = "5.7.1";
  539. if (a->q_alias->q_ruser == NULL)
  540. usrerrenh(a->q_status,
  541.   "550 UID %d is an unknown user: cannot mail to files",
  542.   a->q_alias->q_uid);
  543. else
  544. usrerrenh(a->q_status,
  545.   "550 User %s@%s doesn't have a valid shell for mailing to files",
  546.   a->q_alias->q_ruser, MyHostName);
  547. }
  548. else if (bitset(QUNSAFEADDR, a->q_alias->q_flags))
  549. {
  550. a->q_state = QS_BADADDR;
  551. a->q_status = "5.7.1";
  552. a->q_rstatus = newstr("550 Unsafe for mailing to files");
  553. usrerrenh(a->q_status,
  554.   "550 Address %s is unsafe for mailing to files",
  555.   a->q_alias->q_paddr);
  556. }
  557. }
  558. /* try aliasing */
  559. if (!quoted && QS_IS_OK(a->q_state) &&
  560.     bitnset(M_ALIASABLE, m->m_flags))
  561. alias(a, sendq, aliaslevel, e);
  562. #if USERDB
  563. /* if not aliased, look it up in the user database */
  564. if (!bitset(QNOTREMOTE, a->q_flags) &&
  565.     QS_IS_SENDABLE(a->q_state) &&
  566.     bitnset(M_CHECKUDB, m->m_flags))
  567. {
  568. if (udbexpand(a, sendq, aliaslevel, e) == EX_TEMPFAIL)
  569. {
  570. a->q_state = QS_QUEUEUP;
  571. if (e->e_message == NULL)
  572. e->e_message = newstr("Deferred: user database error");
  573. if (LogLevel > 8)
  574. sm_syslog(LOG_INFO, e->e_id,
  575.   "deferred: udbexpand: %s",
  576.   errstring(errno));
  577. message("queued (user database error): %s",
  578. errstring(errno));
  579. e->e_nrcpts++;
  580. goto testselfdestruct;
  581. }
  582. }
  583. #endif /* USERDB */
  584. /*
  585. **  If we have a level two config file, then pass the name through
  586. **  Ruleset 5 before sending it off.  Ruleset 5 has the right
  587. **  to send rewrite it to another mailer.  This gives us a hook
  588. **  after local aliasing has been done.
  589. */
  590. if (tTd(29, 5))
  591. {
  592. dprintf("recipient: testing local?  cl=%d, rr5=%lxnt",
  593. ConfigLevel, (u_long) RewriteRules[5]);
  594. printaddr(a, FALSE);
  595. }
  596. if (ConfigLevel >= 2 && RewriteRules[5] != NULL &&
  597.     bitnset(M_TRYRULESET5, m->m_flags) &&
  598.     !bitset(QNOTREMOTE, a->q_flags) &&
  599.     QS_IS_OK(a->q_state))
  600. {
  601. maplocaluser(a, sendq, aliaslevel + 1, e);
  602. }
  603. /*
  604. **  If it didn't get rewritten to another mailer, go ahead
  605. **  and deliver it.
  606. */
  607. if (QS_IS_OK(a->q_state) &&
  608.     bitnset(M_HASPWENT, m->m_flags))
  609. {
  610. auto bool fuzzy;
  611. register struct passwd *pw;
  612. /* warning -- finduser may trash buf */
  613. pw = finduser(buf, &fuzzy);
  614. if (pw == NULL || strlen(pw->pw_name) > MAXNAME)
  615. {
  616. a->q_state = QS_BADADDR;
  617. a->q_status = "5.1.1";
  618. a->q_rstatus = newstr("550 5.1.1 User unknown");
  619. giveresponse(EX_NOUSER, m, NULL, a->q_alias,
  620.      (time_t) 0, e);
  621. }
  622. else
  623. {
  624. char nbuf[MAXNAME + 1];
  625. if (fuzzy)
  626. {
  627. /* name was a fuzzy match */
  628. a->q_user = newstr(pw->pw_name);
  629. if (findusercount++ > 3)
  630. {
  631. a->q_state = QS_BADADDR;
  632. a->q_status = "5.4.6";
  633. usrerrenh(a->q_status,
  634.   "554 aliasing/forwarding loop for %s broken",
  635.   pw->pw_name);
  636. goto done;
  637. }
  638. /* see if it aliases */
  639. (void) strlcpy(buf, pw->pw_name, buflen);
  640. goto trylocaluser;
  641. }
  642. if (strcmp(pw->pw_dir, "/") == 0)
  643. a->q_home = "";
  644. else
  645. a->q_home = newstr(pw->pw_dir);
  646. a->q_uid = pw->pw_uid;
  647. a->q_gid = pw->pw_gid;
  648. a->q_ruser = newstr(pw->pw_name);
  649. a->q_flags |= QGOODUID;
  650. buildfname(pw->pw_gecos, pw->pw_name, nbuf, sizeof nbuf);
  651. if (nbuf[0] != '')
  652. a->q_fullname = newstr(nbuf);
  653. if (!usershellok(pw->pw_name, pw->pw_shell))
  654. {
  655. a->q_flags |= QBOGUSSHELL;
  656. }
  657. if (bitset(EF_VRFYONLY, e->e_flags))
  658. {
  659. /* don't do any more now */
  660. a->q_state = QS_VERIFIED;
  661. }
  662. else if (!quoted)
  663. forward(a, sendq, aliaslevel, e);
  664. }
  665. }
  666. if (!QS_IS_DEAD(a->q_state))
  667. e->e_nrcpts++;
  668.   testselfdestruct:
  669. a->q_flags |= QTHISPASS;
  670. if (tTd(26, 8))
  671. {
  672. dprintf("testselfdestruct: ");
  673. printaddr(a, FALSE);
  674. if (tTd(26, 10))
  675. {
  676. dprintf("SENDQ:n");
  677. printaddr(*sendq, TRUE);
  678. dprintf("----n");
  679. }
  680. }
  681. if (a->q_alias == NULL && a != &e->e_from &&
  682.     QS_IS_DEAD(a->q_state))
  683. {
  684. for (q = *sendq; q != NULL; q = q->q_next)
  685. {
  686. if (!QS_IS_DEAD(q->q_state))
  687. break;
  688. }
  689. if (q == NULL)
  690. {
  691. a->q_state = QS_BADADDR;
  692. a->q_status = "5.4.6";
  693. usrerrenh(a->q_status,
  694.   "554 aliasing/forwarding loop broken");
  695. }
  696. }
  697.   done:
  698. a->q_flags |= QTHISPASS;
  699. if (buf != buf0)
  700. free(buf);
  701. /*
  702. **  If we are at the top level, check to see if this has
  703. **  expanded to exactly one address.  If so, it can inherit
  704. **  the primaryness of the address.
  705. **
  706. **  While we're at it, clear the QTHISPASS bits.
  707. */
  708. if (aliaslevel == 0)
  709. {
  710. int nrcpts = 0;
  711. ADDRESS *only = NULL;
  712. for (q = *sendq; q != NULL; q = q->q_next)
  713. {
  714. if (bitset(QTHISPASS, q->q_flags) &&
  715.     QS_IS_SENDABLE(q->q_state))
  716. {
  717. nrcpts++;
  718. only = q;
  719. }
  720. q->q_flags &= ~QTHISPASS;
  721. }
  722. if (nrcpts == 1)
  723. {
  724. /* check to see if this actually got a new owner */
  725. q = only;
  726. while ((q = q->q_alias) != NULL)
  727. {
  728. if (q->q_owner != NULL)
  729. break;
  730. }
  731. if (q == NULL)
  732. only->q_flags |= QPRIMARY;
  733. }
  734. else if (!initialdontsend && nrcpts > 0)
  735. {
  736. /* arrange for return receipt */
  737. e->e_flags |= EF_SENDRECEIPT;
  738. a->q_flags |= QEXPANDED;
  739. if (e->e_xfp != NULL &&
  740.     bitset(QPINGONSUCCESS, a->q_flags))
  741. fprintf(e->e_xfp,
  742. "%s... expanded to multiple addressesn",
  743. a->q_paddr);
  744. }
  745. }
  746. a->q_flags |= QRCPTOK;
  747. return a;
  748. }
  749. /*
  750. **  FINDUSER -- find the password entry for a user.
  751. **
  752. ** This looks a lot like getpwnam, except that it may want to
  753. ** do some fancier pattern matching in /etc/passwd.
  754. **
  755. ** This routine contains most of the time of many sendmail runs.
  756. ** It deserves to be optimized.
  757. **
  758. ** Parameters:
  759. ** name -- the name to match against.
  760. ** fuzzyp -- an outarg that is set to TRUE if this entry
  761. ** was found using the fuzzy matching algorithm;
  762. ** set to FALSE otherwise.
  763. **
  764. ** Returns:
  765. ** A pointer to a pw struct.
  766. ** NULL if name is unknown or ambiguous.
  767. **
  768. ** Side Effects:
  769. ** may modify name.
  770. */
  771. struct passwd *
  772. finduser(name, fuzzyp)
  773. char *name;
  774. bool *fuzzyp;
  775. {
  776. register struct passwd *pw;
  777. register char *p;
  778. bool tryagain;
  779. if (tTd(29, 4))
  780. dprintf("finduser(%s): ", name);
  781. *fuzzyp = FALSE;
  782. #ifdef HESIOD
  783. /* DEC Hesiod getpwnam accepts numeric strings -- short circuit it */
  784. for (p = name; *p != ''; p++)
  785. if (!isascii(*p) || !isdigit(*p))
  786. break;
  787. if (*p == '')
  788. {
  789. if (tTd(29, 4))
  790. dprintf("failed (numeric input)n");
  791. return NULL;
  792. }
  793. #endif /* HESIOD */
  794. /* look up this login name using fast path */
  795. if ((pw = sm_getpwnam(name)) != NULL)
  796. {
  797. if (tTd(29, 4))
  798. dprintf("found (non-fuzzy)n");
  799. return pw;
  800. }
  801. /* try mapping it to lower case */
  802. tryagain = FALSE;
  803. for (p = name; *p != ''; p++)
  804. {
  805. if (isascii(*p) && isupper(*p))
  806. {
  807. *p = tolower(*p);
  808. tryagain = TRUE;
  809. }
  810. }
  811. if (tryagain && (pw = sm_getpwnam(name)) != NULL)
  812. {
  813. if (tTd(29, 4))
  814. dprintf("found (lower case)n");
  815. *fuzzyp = TRUE;
  816. return pw;
  817. }
  818. #if MATCHGECOS
  819. /* see if fuzzy matching allowed */
  820. if (!MatchGecos)
  821. {
  822. if (tTd(29, 4))
  823. dprintf("not found (fuzzy disabled)n");
  824. return NULL;
  825. }
  826. /* search for a matching full name instead */
  827. for (p = name; *p != ''; p++)
  828. {
  829. if (*p == (SpaceSub & 0177) || *p == '_')
  830. *p = ' ';
  831. }
  832. (void) setpwent();
  833. while ((pw = getpwent()) != NULL)
  834. {
  835. char buf[MAXNAME + 1];
  836. # if 0
  837. if (strcasecmp(pw->pw_name, name) == 0)
  838. {
  839. if (tTd(29, 4))
  840. dprintf("found (case wrapped)n");
  841. break;
  842. }
  843. # endif /* 0 */
  844. buildfname(pw->pw_gecos, pw->pw_name, buf, sizeof buf);
  845. if (strchr(buf, ' ') != NULL && !strcasecmp(buf, name))
  846. {
  847. if (tTd(29, 4))
  848. dprintf("fuzzy matches %sn", pw->pw_name);
  849. message("sending to login name %s", pw->pw_name);
  850. break;
  851. }
  852. }
  853. if (pw != NULL)
  854. *fuzzyp = TRUE;
  855. else if (tTd(29, 4))
  856. dprintf("no fuzzy match foundn");
  857. # if DEC_OSF_BROKEN_GETPWENT /* DEC OSF/1 3.2 or earlier */
  858. endpwent();
  859. # endif /* DEC_OSF_BROKEN_GETPWENT */
  860. return pw;
  861. #else /* MATCHGECOS */
  862. if (tTd(29, 4))
  863. dprintf("not found (fuzzy disabled)n");
  864. return NULL;
  865. #endif /* MATCHGECOS */
  866. }
  867. /*
  868. **  WRITABLE -- predicate returning if the file is writable.
  869. **
  870. ** This routine must duplicate the algorithm in sys/fio.c.
  871. ** Unfortunately, we cannot use the access call since we
  872. ** won't necessarily be the real uid when we try to
  873. ** actually open the file.
  874. **
  875. ** Notice that ANY file with ANY execute bit is automatically
  876. ** not writable.  This is also enforced by mailfile.
  877. **
  878. ** Parameters:
  879. ** filename -- the file name to check.
  880. ** ctladdr -- the controlling address for this file.
  881. ** flags -- SFF_* flags to control the function.
  882. **
  883. ** Returns:
  884. ** TRUE -- if we will be able to write this file.
  885. ** FALSE -- if we cannot write this file.
  886. **
  887. ** Side Effects:
  888. ** none.
  889. */
  890. bool
  891. writable(filename, ctladdr, flags)
  892. char *filename;
  893. ADDRESS *ctladdr;
  894. long flags;
  895. {
  896. uid_t euid;
  897. gid_t egid;
  898. char *user;
  899. if (tTd(44, 5))
  900. dprintf("writable(%s, 0x%lx)n", filename, flags);
  901. /*
  902. **  File does exist -- check that it is writable.
  903. */
  904. if (geteuid() != 0)
  905. {
  906. euid = geteuid();
  907. egid = getegid();
  908. user = NULL;
  909. }
  910. else if (ctladdr != NULL)
  911. {
  912. euid = ctladdr->q_uid;
  913. egid = ctladdr->q_gid;
  914. user = ctladdr->q_user;
  915. }
  916. else if (bitset(SFF_RUNASREALUID, flags))
  917. {
  918. euid = RealUid;
  919. egid = RealGid;
  920. user = RealUserName;
  921. }
  922. else if (FileMailer != NULL && !bitset(SFF_ROOTOK, flags))
  923. {
  924. euid = FileMailer->m_uid;
  925. egid = FileMailer->m_gid;
  926. user = NULL;
  927. }
  928. else
  929. {
  930. euid = egid = 0;
  931. user = NULL;
  932. }
  933. if (!bitset(SFF_ROOTOK, flags))
  934. {
  935. if (euid == 0)
  936. {
  937. euid = DefUid;
  938. user = DefUser;
  939. }
  940. if (egid == 0)
  941. egid = DefGid;
  942. }
  943. if (geteuid() == 0 &&
  944.     (ctladdr == NULL || !bitset(QGOODUID, ctladdr->q_flags)))
  945. flags |= SFF_SETUIDOK;
  946. if (!bitnset(DBS_FILEDELIVERYTOSYMLINK, DontBlameSendmail))
  947. flags |= SFF_NOSLINK;
  948. if (!bitnset(DBS_FILEDELIVERYTOHARDLINK, DontBlameSendmail))
  949. flags |= SFF_NOHLINK;
  950. errno = safefile(filename, euid, egid, user, flags, S_IWRITE, NULL);
  951. return errno == 0;
  952. }
  953. /*
  954. **  INCLUDE -- handle :include: specification.
  955. **
  956. ** Parameters:
  957. ** fname -- filename to include.
  958. ** forwarding -- if TRUE, we are reading a .forward file.
  959. ** if FALSE, it's a :include: file.
  960. ** ctladdr -- address template to use to fill in these
  961. ** addresses -- effective user/group id are
  962. ** the important things.
  963. ** sendq -- a pointer to the head of the send queue
  964. ** to put these addresses in.
  965. ** aliaslevel -- the alias nesting depth.
  966. ** e -- the current envelope.
  967. **
  968. ** Returns:
  969. ** open error status
  970. **
  971. ** Side Effects:
  972. ** reads the :include: file and sends to everyone
  973. ** listed in that file.
  974. **
  975. ** Security Note:
  976. ** If you have restricted chown (that is, you can't
  977. ** give a file away), it is reasonable to allow programs
  978. ** and files called from this :include: file to be to be
  979. ** run as the owner of the :include: file.  This is bogus
  980. ** if there is any chance of someone giving away a file.
  981. ** We assume that pre-POSIX systems can give away files.
  982. **
  983. ** There is an additional restriction that if you
  984. ** forward to a :include: file, it will not take on
  985. ** the ownership of the :include: file.  This may not
  986. ** be necessary, but shouldn't hurt.
  987. */
  988. static jmp_buf CtxIncludeTimeout;
  989. int
  990. include(fname, forwarding, ctladdr, sendq, aliaslevel, e)
  991. char *fname;
  992. bool forwarding;
  993. ADDRESS *ctladdr;
  994. ADDRESS **sendq;
  995. int aliaslevel;
  996. ENVELOPE *e;
  997. {
  998. FILE *volatile fp = NULL;
  999. char *oldto = e->e_to;
  1000. char *oldfilename = FileName;
  1001. int oldlinenumber = LineNumber;
  1002. register EVENT *ev = NULL;
  1003. int nincludes;
  1004. int mode;
  1005. volatile bool maxreached = FALSE;
  1006. register ADDRESS *ca;
  1007. volatile uid_t saveduid, uid;
  1008. volatile gid_t savedgid, gid;
  1009. char *volatile user;
  1010. int rval = 0;
  1011. volatile long sfflags = SFF_REGONLY;
  1012. register char *p;
  1013. bool safechown = FALSE;
  1014. volatile bool safedir = FALSE;
  1015. struct stat st;
  1016. char buf[MAXLINE];
  1017. if (tTd(27, 2))
  1018. dprintf("include(%s)n", fname);
  1019. if (tTd(27, 4))
  1020. dprintf("   ruid=%d euid=%dn",
  1021. (int) getuid(), (int) geteuid());
  1022. if (tTd(27, 14))
  1023. {
  1024. dprintf("ctladdr ");
  1025. printaddr(ctladdr, FALSE);
  1026. }
  1027. if (tTd(27, 9))
  1028. dprintf("include: old uid = %d/%dn",
  1029. (int) getuid(), (int) geteuid());
  1030. if (forwarding)
  1031. sfflags |= SFF_MUSTOWN|SFF_ROOTOK|SFF_NOWLINK;
  1032. /*
  1033. **  If RunAsUser set, won't be able to run programs as user
  1034. **  so mark them as unsafe unless the administrator knows better.
  1035. */
  1036. if ((geteuid() != 0 || RunAsUid != 0) &&
  1037.     !bitnset(DBS_NONROOTSAFEADDR, DontBlameSendmail))
  1038. {
  1039. if (tTd(27, 4))
  1040. dprintf("include: not safe (euid=%d, RunAsUid=%d)n",
  1041. (int) geteuid(), (int) RunAsUid);
  1042. ctladdr->q_flags |= QUNSAFEADDR;
  1043. }
  1044. ca = getctladdr(ctladdr);
  1045. if (ca == NULL ||
  1046.     (ca->q_uid == DefUid && ca->q_gid == 0))
  1047. {
  1048. uid = DefUid;
  1049. gid = DefGid;
  1050. user = DefUser;
  1051. }
  1052. else
  1053. {
  1054. uid = ca->q_uid;
  1055. gid = ca->q_gid;
  1056. user = ca->q_user;
  1057. }
  1058. #if MAILER_SETUID_METHOD != USE_SETUID
  1059. saveduid = geteuid();
  1060. savedgid = getegid();
  1061. if (saveduid == 0)
  1062. {
  1063. if (!DontInitGroups)
  1064. {
  1065. if (initgroups(user, gid) == -1)
  1066. syserr("include: initgroups(%s, %d) failed",
  1067. user, gid);
  1068. }
  1069. else
  1070. {
  1071. GIDSET_T gidset[1];
  1072. gidset[0] = gid;
  1073. if (setgroups(1, gidset) == -1)
  1074. syserr("include: setgroups() failed");
  1075. }
  1076. if (gid != 0 && setgid(gid) < -1)
  1077. syserr("setgid(%d) failure", gid);
  1078. if (uid != 0)
  1079. {
  1080. # if MAILER_SETUID_METHOD == USE_SETEUID
  1081. if (seteuid(uid) < 0)
  1082. syserr("seteuid(%d) failure (real=%d, eff=%d)",
  1083. uid, getuid(), geteuid());
  1084. # endif /* MAILER_SETUID_METHOD == USE_SETEUID */
  1085. # if MAILER_SETUID_METHOD == USE_SETREUID
  1086. if (setreuid(0, uid) < 0)
  1087. syserr("setreuid(0, %d) failure (real=%d, eff=%d)",
  1088. uid, getuid(), geteuid());
  1089. # endif /* MAILER_SETUID_METHOD == USE_SETREUID */
  1090. }
  1091. }
  1092. #endif /* MAILER_SETUID_METHOD != USE_SETUID */
  1093. if (tTd(27, 9))
  1094. dprintf("include: new uid = %d/%dn",
  1095. (int) getuid(), (int) geteuid());
  1096. /*
  1097. **  If home directory is remote mounted but server is down,
  1098. **  this can hang or give errors; use a timeout to avoid this
  1099. */
  1100. if (setjmp(CtxIncludeTimeout) != 0)
  1101. {
  1102. ctladdr->q_state = QS_QUEUEUP;
  1103. errno = 0;
  1104. /* return pseudo-error code */
  1105. rval = E_SM_OPENTIMEOUT;
  1106. goto resetuid;
  1107. }
  1108. if (TimeOuts.to_fileopen > 0)
  1109. ev = setevent(TimeOuts.to_fileopen, includetimeout, 0);
  1110. else
  1111. ev = NULL;
  1112. /* check for writable parent directory */
  1113. p = strrchr(fname, '/');
  1114. if (p != NULL)
  1115. {
  1116. int ret;
  1117. *p = '';
  1118. ret = safedirpath(fname, uid, gid, user,
  1119.   sfflags|SFF_SAFEDIRPATH, 0, 0);
  1120. if (ret == 0)
  1121. {
  1122. /* in safe directory: relax chown & link rules */
  1123. safedir = TRUE;
  1124. sfflags |= SFF_NOPATHCHECK;
  1125. }
  1126. else
  1127. {
  1128. if (bitnset((forwarding ?
  1129.      DBS_FORWARDFILEINUNSAFEDIRPATH :
  1130.      DBS_INCLUDEFILEINUNSAFEDIRPATH),
  1131.     DontBlameSendmail))
  1132. sfflags |= SFF_NOPATHCHECK;
  1133. else if (bitnset((forwarding ?
  1134.   DBS_FORWARDFILEINGROUPWRITABLEDIRPATH :
  1135.   DBS_INCLUDEFILEINGROUPWRITABLEDIRPATH),
  1136.  DontBlameSendmail) &&
  1137.  ret == E_SM_GWDIR)
  1138. {
  1139. setbitn(DBS_GROUPWRITABLEDIRPATHSAFE,
  1140. DontBlameSendmail);
  1141. ret = safedirpath(fname, uid, gid, user,
  1142.   sfflags|SFF_SAFEDIRPATH,
  1143.   0, 0);
  1144. clrbitn(DBS_GROUPWRITABLEDIRPATHSAFE,
  1145. DontBlameSendmail);
  1146. if (ret == 0)
  1147. sfflags |= SFF_NOPATHCHECK;
  1148. else
  1149. sfflags |= SFF_SAFEDIRPATH;
  1150. }
  1151. else
  1152. sfflags |= SFF_SAFEDIRPATH;
  1153. if (ret > E_PSEUDOBASE &&
  1154.     !bitnset((forwarding ?
  1155.       DBS_FORWARDFILEINUNSAFEDIRPATHSAFE :
  1156.       DBS_INCLUDEFILEINUNSAFEDIRPATHSAFE),
  1157.      DontBlameSendmail))
  1158. {
  1159. if (LogLevel >= 12)
  1160. sm_syslog(LOG_INFO, e->e_id,
  1161.   "%s: unsafe directory path, marked unsafe",
  1162.   shortenstring(fname, MAXSHORTSTR));
  1163. ctladdr->q_flags |= QUNSAFEADDR;
  1164. }
  1165. }
  1166. *p = '/';
  1167. }
  1168. /* allow links only in unwritable directories */
  1169. if (!safedir &&
  1170.     !bitnset((forwarding ?
  1171.       DBS_LINKEDFORWARDFILEINWRITABLEDIR :
  1172.       DBS_LINKEDINCLUDEFILEINWRITABLEDIR),
  1173.      DontBlameSendmail))
  1174. sfflags |= SFF_NOLINK;
  1175. rval = safefile(fname, uid, gid, user, sfflags, S_IREAD, &st);
  1176. if (rval != 0)
  1177. {
  1178. /* don't use this :include: file */
  1179. if (tTd(27, 4))
  1180. dprintf("include: not safe (uid=%d): %sn",
  1181. (int) uid, errstring(rval));
  1182. }
  1183. else if ((fp = fopen(fname, "r")) == NULL)
  1184. {
  1185. rval = errno;
  1186. if (tTd(27, 4))
  1187. dprintf("include: open: %sn", errstring(rval));
  1188. }
  1189. else if (filechanged(fname, fileno(fp), &st))
  1190. {
  1191. rval = E_SM_FILECHANGE;
  1192. if (tTd(27, 4))
  1193. dprintf("include: file changed after openn");
  1194. }
  1195. if (ev != NULL)
  1196. clrevent(ev);
  1197. resetuid:
  1198. #if HASSETREUID || USESETEUID
  1199. if (saveduid == 0)
  1200. {
  1201. if (uid != 0)
  1202. {
  1203. # if USESETEUID
  1204. if (seteuid(0) < 0)
  1205. syserr("seteuid(0) failure (real=%d, eff=%d)",
  1206. getuid(), geteuid());
  1207. # else /* USESETEUID */
  1208. if (setreuid(-1, 0) < 0)
  1209. syserr("setreuid(-1, 0) failure (real=%d, eff=%d)",
  1210. getuid(), geteuid());
  1211. if (setreuid(RealUid, 0) < 0)
  1212. syserr("setreuid(%d, 0) failure (real=%d, eff=%d)",
  1213. RealUid, getuid(), geteuid());
  1214. # endif /* USESETEUID */
  1215. }
  1216. (void) setgid(savedgid);
  1217. }
  1218. #endif /* HASSETREUID || USESETEUID */
  1219. if (tTd(27, 9))
  1220. dprintf("include: reset uid = %d/%dn",
  1221. (int) getuid(), (int) geteuid());
  1222. if (rval == E_SM_OPENTIMEOUT)
  1223. usrerr("451 4.4.1 open timeout on %s", fname);
  1224. if (fp == NULL)
  1225. return rval;
  1226. if (fstat(fileno(fp), &st) < 0)
  1227. {
  1228. rval = errno;
  1229. syserr("Cannot fstat %s!", fname);
  1230. (void) fclose(fp);
  1231. return rval;
  1232. }
  1233. /* if path was writable, check to avoid file giveaway tricks */
  1234. safechown = chownsafe(fileno(fp), safedir);
  1235. if (tTd(27, 6))
  1236. dprintf("include: parent of %s is %s, chown is %ssafen",
  1237. fname,
  1238. safedir ? "safe" : "dangerous",
  1239. safechown ? "" : "un");
  1240. /* if no controlling user or coming from an alias delivery */
  1241. if (safechown &&
  1242.     (ca == NULL ||
  1243.      (ca->q_uid == DefUid && ca->q_gid == 0)))
  1244. {
  1245. ctladdr->q_uid = st.st_uid;
  1246. ctladdr->q_gid = st.st_gid;
  1247. ctladdr->q_flags |= QGOODUID;
  1248. }
  1249. if (ca != NULL && ca->q_uid == st.st_uid)
  1250. {
  1251. /* optimization -- avoid getpwuid if we already have info */
  1252. ctladdr->q_flags |= ca->q_flags & QBOGUSSHELL;
  1253. ctladdr->q_ruser = ca->q_ruser;
  1254. }
  1255. else if (!forwarding)
  1256. {
  1257. register struct passwd *pw;
  1258. pw = sm_getpwuid(st.st_uid);
  1259. if (pw == NULL)
  1260. {
  1261. ctladdr->q_uid = st.st_uid;
  1262. ctladdr->q_flags |= QBOGUSSHELL;
  1263. }
  1264. else
  1265. {
  1266. char *sh;
  1267. ctladdr->q_ruser = newstr(pw->pw_name);
  1268. if (safechown)
  1269. sh = pw->pw_shell;
  1270. else
  1271. sh = "/SENDMAIL/ANY/SHELL/";
  1272. if (!usershellok(pw->pw_name, sh))
  1273. {
  1274. if (LogLevel >= 12)
  1275. sm_syslog(LOG_INFO, e->e_id,
  1276.   "%s: user %s has bad shell %s, marked %s",
  1277.   shortenstring(fname, MAXSHORTSTR),
  1278.   pw->pw_name, sh,
  1279.   safechown ? "bogus" : "unsafe");
  1280. if (safechown)
  1281. ctladdr->q_flags |= QBOGUSSHELL;
  1282. else
  1283. ctladdr->q_flags |= QUNSAFEADDR;
  1284. }
  1285. }
  1286. }
  1287. if (bitset(EF_VRFYONLY, e->e_flags))
  1288. {
  1289. /* don't do any more now */
  1290. ctladdr->q_state = QS_VERIFIED;
  1291. e->e_nrcpts++;
  1292. (void) fclose(fp);
  1293. return rval;
  1294. }
  1295. /*
  1296. **  Check to see if some bad guy can write this file
  1297. **
  1298. ** Group write checking could be more clever, e.g.,
  1299. ** guessing as to which groups are actually safe ("sys"
  1300. ** may be; "user" probably is not).
  1301. */
  1302. mode = S_IWOTH;
  1303. if (!bitnset((forwarding ?
  1304.       DBS_GROUPWRITABLEFORWARDFILESAFE :
  1305.       DBS_GROUPWRITABLEINCLUDEFILESAFE),
  1306.      DontBlameSendmail))
  1307. mode |= S_IWGRP;
  1308. if (bitset(mode, st.st_mode))
  1309. {
  1310. if (tTd(27, 6))
  1311. dprintf("include: %s is %s writable, marked unsafen",
  1312. shortenstring(fname, MAXSHORTSTR),
  1313. bitset(S_IWOTH, st.st_mode) ? "world" : "group");
  1314. if (LogLevel >= 12)
  1315. sm_syslog(LOG_INFO, e->e_id,
  1316.   "%s: %s writable %s file, marked unsafe",
  1317.   shortenstring(fname, MAXSHORTSTR),
  1318.   bitset(S_IWOTH, st.st_mode) ? "world" : "group",
  1319.   forwarding ? "forward" : ":include:");
  1320. ctladdr->q_flags |= QUNSAFEADDR;
  1321. }
  1322. /* read the file -- each line is a comma-separated list. */
  1323. FileName = fname;
  1324. LineNumber = 0;
  1325. ctladdr->q_flags &= ~QSELFREF;
  1326. nincludes = 0;
  1327. while (fgets(buf, sizeof buf, fp) != NULL && !maxreached)
  1328. {
  1329. fixcrlf(buf, TRUE);
  1330. LineNumber++;
  1331. if (buf[0] == '#' || buf[0] == '')
  1332. continue;
  1333. /* <sp>#@# introduces a comment anywhere */
  1334. /* for Japanese character sets */
  1335. for (p = buf; (p = strchr(++p, '#')) != NULL; )
  1336. {
  1337. if (p[1] == '@' && p[2] == '#' &&
  1338.     isascii(p[-1]) && isspace(p[-1]) &&
  1339.     (p[3] == '' || (isascii(p[3]) && isspace(p[3]))))
  1340. {
  1341. p[-1] = '';
  1342. break;
  1343. }
  1344. }
  1345. if (buf[0] == '')
  1346. continue;
  1347. e->e_to = NULL;
  1348. message("%s to %s",
  1349. forwarding ? "forwarding" : "sending", buf);
  1350. if (forwarding && LogLevel > 10)
  1351. sm_syslog(LOG_INFO, e->e_id,
  1352.   "forward %.200s => %s",
  1353.   oldto, shortenstring(buf, MAXSHORTSTR));
  1354. nincludes += sendtolist(buf, ctladdr, sendq, aliaslevel + 1, e);
  1355. if (forwarding &&
  1356.     MaxForwardEntries > 0 &&
  1357.     nincludes >= MaxForwardEntries)
  1358. {
  1359. /* just stop reading and processing further entries */
  1360. /* additional: (?)
  1361. ctladdr->q_state = QS_DONTSEND;
  1362. **/
  1363. syserr("Attempt to forward to more then %d addresses (in %s)!",
  1364. MaxForwardEntries,fname);
  1365. maxreached = TRUE;
  1366. }
  1367. }
  1368. if (ferror(fp) && tTd(27, 3))
  1369. dprintf("include: read error: %sn", errstring(errno));
  1370. if (nincludes > 0 && !bitset(QSELFREF, ctladdr->q_flags))
  1371. {
  1372. if (tTd(27, 5))
  1373. {
  1374. dprintf("include: QS_DONTSEND ");
  1375. printaddr(ctladdr, FALSE);
  1376. }
  1377. ctladdr->q_state = QS_DONTSEND;
  1378. }
  1379. (void) fclose(fp);
  1380. FileName = oldfilename;
  1381. LineNumber = oldlinenumber;
  1382. e->e_to = oldto;
  1383. return rval;
  1384. }
  1385. static void
  1386. includetimeout()
  1387. {
  1388. longjmp(CtxIncludeTimeout, 1);
  1389. }
  1390. /*
  1391. **  SENDTOARGV -- send to an argument vector.
  1392. **
  1393. ** Parameters:
  1394. ** argv -- argument vector to send to.
  1395. ** e -- the current envelope.
  1396. **
  1397. ** Returns:
  1398. ** none.
  1399. **
  1400. ** Side Effects:
  1401. ** puts all addresses on the argument vector onto the
  1402. ** send queue.
  1403. */
  1404. void
  1405. sendtoargv(argv, e)
  1406. register char **argv;
  1407. register ENVELOPE *e;
  1408. {
  1409. register char *p;
  1410. while ((p = *argv++) != NULL)
  1411. {
  1412. (void) sendtolist(p, NULLADDR, &e->e_sendqueue, 0, e);
  1413. }
  1414. }
  1415. /*
  1416. **  GETCTLADDR -- get controlling address from an address header.
  1417. **
  1418. ** If none, get one corresponding to the effective userid.
  1419. **
  1420. ** Parameters:
  1421. ** a -- the address to find the controller of.
  1422. **
  1423. ** Returns:
  1424. ** the controlling address.
  1425. **
  1426. ** Side Effects:
  1427. ** none.
  1428. */
  1429. ADDRESS *
  1430. getctladdr(a)
  1431. register ADDRESS *a;
  1432. {
  1433. while (a != NULL && !bitset(QGOODUID, a->q_flags))
  1434. a = a->q_alias;
  1435. return a;
  1436. }
  1437. /*
  1438. **  SELF_REFERENCE -- check to see if an address references itself
  1439. **
  1440. ** The check is done through a chain of aliases.  If it is part of
  1441. ** a loop, break the loop at the "best" address, that is, the one
  1442. ** that exists as a real user.
  1443. **
  1444. ** This is to handle the case of:
  1445. ** awc: Andrew.Chang
  1446. ** Andrew.Chang: awc@mail.server
  1447. ** which is a problem only on mail.server.
  1448. **
  1449. ** Parameters:
  1450. ** a -- the address to check.
  1451. **
  1452. ** Returns:
  1453. ** The address that should be retained.
  1454. */
  1455. static ADDRESS *
  1456. self_reference(a)
  1457. ADDRESS *a;
  1458. {
  1459. ADDRESS *b; /* top entry in self ref loop */
  1460. ADDRESS *c; /* entry that point to a real mail box */
  1461. if (tTd(27, 1))
  1462. dprintf("self_reference(%s)n", a->q_paddr);
  1463. for (b = a->q_alias; b != NULL; b = b->q_alias)
  1464. {
  1465. if (sameaddr(a, b))
  1466. break;
  1467. }
  1468. if (b == NULL)
  1469. {
  1470. if (tTd(27, 1))
  1471. dprintf("t... no self refn");
  1472. return NULL;
  1473. }
  1474. /*
  1475. **  Pick the first address that resolved to a real mail box
  1476. **  i.e has a pw entry.  The returned value will be marked
  1477. **  QSELFREF in recipient(), which in turn will disable alias()
  1478. **  from marking it as QS_IS_DEAD(), which mean it will be used
  1479. **  as a deliverable address.
  1480. **
  1481. **  The 2 key thing to note here are:
  1482. ** 1) we are in a recursive call sequence:
  1483. ** alias->sentolist->recipient->alias
  1484. ** 2) normally, when we return back to alias(), the address
  1485. **    will be marked QS_EXPANDED, since alias() assumes the
  1486. **    expanded form will be used instead of the current address.
  1487. **    This behaviour is turned off if the address is marked
  1488. **    QSELFREF We set QSELFREF when we return to recipient().
  1489. */
  1490. c = a;
  1491. while (c != NULL)
  1492. {
  1493. if (tTd(27, 10))
  1494. dprintf("  %s", c->q_user);
  1495. if (bitnset(M_HASPWENT, c->q_mailer->m_flags))
  1496. {
  1497. if (tTd(27, 2))
  1498. dprintf("t... getpwnam(%s)... ", c->q_user);
  1499. if (sm_getpwnam(c->q_user) != NULL)
  1500. {
  1501. if (tTd(27, 2))
  1502. dprintf("foundn");
  1503. /* ought to cache results here */
  1504. if (sameaddr(b, c))
  1505. return b;
  1506. else
  1507. return c;
  1508. }
  1509. if (tTd(27, 2))
  1510. dprintf("failedn");
  1511. }
  1512. else
  1513. {
  1514. /* if local delivery, compare usernames */
  1515. if (bitnset(M_LOCALMAILER, c->q_mailer->m_flags) &&
  1516.     b->q_mailer == c->q_mailer)
  1517. {
  1518. if (tTd(27, 2))
  1519. dprintf("t... local match (%s)n",
  1520. c->q_user);
  1521. if (sameaddr(b, c))
  1522. return b;
  1523. else
  1524. return c;
  1525. }
  1526. }
  1527. if (tTd(27, 10))
  1528. dprintf("n");
  1529. c = c->q_alias;
  1530. }
  1531. if (tTd(27, 1))
  1532. dprintf("t... cannot break loop for "%s"n", a->q_paddr);
  1533. return NULL;
  1534. }