📄 qmail-inject.c
字号:
void dobody(h)stralloc *h;{ put(h->s,h->len);}stralloc torecip = {0};token822_alloc tr = {0};void dorecip(s)char *s;{ if (!quote2(&torecip,s)) die_nomem(); switch(token822_parse(&tr,&torecip,&hfbuf)) { case -1: die_nomem(); case 0: substdio_puts(subfderr,"qmail-inject: fatal: unable to parse address: "); substdio_puts(subfderr,s); substdio_putsflush(subfderr,"\n"); perm(); } token822_reverse(&tr); rwgeneric(&tr); rwappend(&tr,&reciplist);}stralloc defaultfrom = {0};token822_alloc df = {0};void defaultfrommake(){ char *fullname; fullname = env_get("QMAILNAME"); if (!fullname) fullname = env_get("MAILNAME"); if (!fullname) fullname = env_get("NAME"); if (!token822_ready(&df,20)) die_nomem(); df.len = 0; df.t[df.len].type = TOKEN822_ATOM; df.t[df.len].s = "From"; df.t[df.len].slen = 4; ++df.len; df.t[df.len].type = TOKEN822_COLON; ++df.len; if (fullname && !flagnamecomment) { df.t[df.len].type = TOKEN822_QUOTE; df.t[df.len].s = fullname; df.t[df.len].slen = str_len(fullname); ++df.len; df.t[df.len].type = TOKEN822_LEFT; ++df.len; } df.t[df.len].type = mailusertokentype; df.t[df.len].s = mailuser; df.t[df.len].slen = str_len(mailuser); ++df.len; if (mailhost) { df.t[df.len].type = TOKEN822_AT; ++df.len; df.t[df.len].type = TOKEN822_ATOM; df.t[df.len].s = mailhost; df.t[df.len].slen = str_len(mailhost); ++df.len; } if (fullname && !flagnamecomment) { df.t[df.len].type = TOKEN822_RIGHT; ++df.len; } if (fullname && flagnamecomment) { df.t[df.len].type = TOKEN822_COMMENT; df.t[df.len].s = fullname; df.t[df.len].slen = str_len(fullname); ++df.len; } if (token822_unparse(&defaultfrom,&df,LINELEN) != 1) die_nomem(); doordie(&defaultfrom,token822_parse(&df,&defaultfrom,&hfbuf)); doordie(&defaultfrom,token822_addrlist(&hfrewrite,&hfaddr,&df,rwsender)); if (token822_unparse(&defaultfrom,&hfrewrite,LINELEN) != 1) die_nomem();}stralloc defaultreturnpath = {0};token822_alloc drp = {0};stralloc hackedruser = {0};char strnum[FMT_ULONG];void dodefaultreturnpath(){ if (!stralloc_copys(&hackedruser,mailruser)) die_nomem(); if (flaghackmess) { if (!stralloc_cats(&hackedruser,"-")) die_nomem(); if (!stralloc_catb(&hackedruser,strnum,fmt_ulong(strnum,(unsigned long) starttime))) die_nomem(); if (!stralloc_cats(&hackedruser,".")) die_nomem(); if (!stralloc_catb(&hackedruser,strnum,fmt_ulong(strnum,(unsigned long) getpid()))) die_nomem(); } if (flaghackrecip) if (!stralloc_cats(&hackedruser,"-")) die_nomem(); if (!token822_ready(&drp,10)) die_nomem(); drp.len = 0; drp.t[drp.len].type = TOKEN822_ATOM; drp.t[drp.len].s = "Return-Path"; drp.t[drp.len].slen = 11; ++drp.len; drp.t[drp.len].type = TOKEN822_COLON; ++drp.len; drp.t[drp.len].type = TOKEN822_QUOTE; drp.t[drp.len].s = hackedruser.s; drp.t[drp.len].slen = hackedruser.len; ++drp.len; if (mailrhost) { drp.t[drp.len].type = TOKEN822_AT; ++drp.len; drp.t[drp.len].type = TOKEN822_ATOM; drp.t[drp.len].s = mailrhost; drp.t[drp.len].slen = str_len(mailrhost); ++drp.len; } if (token822_unparse(&defaultreturnpath,&drp,LINELEN) != 1) die_nomem(); doordie(&defaultreturnpath,token822_parse(&drp,&defaultreturnpath,&hfbuf)); doordie(&defaultreturnpath ,token822_addrlist(&hfrewrite,&hfaddr,&drp,rwreturn)); if (token822_unparse(&defaultreturnpath,&hfrewrite,LINELEN) != 1) die_nomem();}int flagmft = 0;stralloc mft = {0};struct constmap mapmft;void mft_init(){ char *x; int r; x = env_get("QMAILMFTFILE"); if (!x) return; r = control_readfile(&mft,x,0); if (r == -1) die_read(); /*XXX*/ if (!r) return; if (!constmap_init(&mapmft,mft.s,mft.len,0)) die_nomem(); flagmft = 1;}void finishmft(){ int i; static stralloc sa = {0}; static stralloc sa2 = {0}; if (!flagmft) return; if (htypeseen[H_MAILFOLLOWUPTO]) return; for (i = 0;i < tocclist.len;++i) if (constmap(&mapmft,tocclist.sa[i].s,tocclist.sa[i].len)) break; if (i == tocclist.len) return; puts("Mail-Followup-To: "); i = tocclist.len; while (i--) { if (!stralloc_copy(&sa,&tocclist.sa[i])) die_nomem(); if (!stralloc_0(&sa)) die_nomem(); if (!quote2(&sa2,sa.s)) die_nomem(); put(sa2.s,sa2.len); if (i) puts(",\n "); } puts("\n");}void finishheader(){ flagresent = htypeseen[H_R_SENDER] || htypeseen[H_R_FROM] || htypeseen[H_R_REPLYTO] || htypeseen[H_R_TO] || htypeseen[H_R_CC] || htypeseen[H_R_BCC] || htypeseen[H_R_DATE] || htypeseen[H_R_MESSAGEID]; if (!sender.s) dodefaultreturnpath(); if (!flagqueue) { static stralloc sa = {0}; static stralloc sa2 = {0}; if (!stralloc_copy(&sa,&sender)) die_nomem(); if (!stralloc_0(&sa)) die_nomem(); if (!quote2(&sa2,sa.s)) die_nomem(); puts("Return-Path: <"); put(sa2.s,sa2.len); puts(">\n"); } /* could check at this point whether there are any recipients */ if (flagqueue) if (qmail_open(&qqt) == -1) die_qqt(); if (flagresent) { if (!htypeseen[H_R_DATE]) { if (!newfield_datemake(starttime)) die_nomem(); puts("Resent-"); put(newfield_date.s,newfield_date.len); } if (!htypeseen[H_R_MESSAGEID]) { if (!newfield_msgidmake(control_idhost.s,control_idhost.len,starttime)) die_nomem(); puts("Resent-"); put(newfield_msgid.s,newfield_msgid.len); } if (!htypeseen[H_R_FROM]) { defaultfrommake(); puts("Resent-"); put(defaultfrom.s,defaultfrom.len); } if (!htypeseen[H_R_TO] && !htypeseen[H_R_CC]) puts("Resent-Cc: recipient list not shown: ;\n"); } else { if (!htypeseen[H_DATE]) { if (!newfield_datemake(starttime)) die_nomem(); put(newfield_date.s,newfield_date.len); } if (!htypeseen[H_MESSAGEID]) { if (!newfield_msgidmake(control_idhost.s,control_idhost.len,starttime)) die_nomem(); put(newfield_msgid.s,newfield_msgid.len); } if (!htypeseen[H_FROM]) { defaultfrommake(); put(defaultfrom.s,defaultfrom.len); } if (!htypeseen[H_TO] && !htypeseen[H_CC]) puts("Cc: recipient list not shown: ;\n"); finishmft(); } savedh_print();}void getcontrols(){ static stralloc sa = {0}; char *x; mft_init(); if (chdir(auto_qmail) == -1) die_chdir(); if (control_init() == -1) die_read(); if (control_rldef(&control_defaultdomain,"control/defaultdomain",1,"defaultdomain") != 1) die_read(); x = env_get("QMAILDEFAULTDOMAIN"); if (x) if (!stralloc_copys(&control_defaultdomain,x)) die_nomem(); if (!stralloc_copys(&sa,".")) die_nomem(); if (!stralloc_cat(&sa,&control_defaultdomain)) die_nomem(); doordie(&sa,token822_parse(&defaultdomain,&sa,&defaultdomainbuf)); if (control_rldef(&control_defaulthost,"control/defaulthost",1,"defaulthost") != 1) die_read(); x = env_get("QMAILDEFAULTHOST"); if (x) if (!stralloc_copys(&control_defaulthost,x)) die_nomem(); if (!stralloc_copys(&sa,"@")) die_nomem(); if (!stralloc_cat(&sa,&control_defaulthost)) die_nomem(); doordie(&sa,token822_parse(&defaulthost,&sa,&defaulthostbuf)); if (control_rldef(&control_plusdomain,"control/plusdomain",1,"plusdomain") != 1) die_read(); x = env_get("QMAILPLUSDOMAIN"); if (x) if (!stralloc_copys(&control_plusdomain,x)) die_nomem(); if (!stralloc_copys(&sa,".")) die_nomem(); if (!stralloc_cat(&sa,&control_plusdomain)) die_nomem(); doordie(&sa,token822_parse(&plusdomain,&sa,&plusdomainbuf));
//读入idhost,idhost用来指定哟间中Message-ID:头字段的主机名
/*
例如:idhost值为linuxfane.com
那么邮件头中如下:
Message-ID:<1234567890.12345.qmail@linuxfane.com>;
如果idhost值为rainbow.linuxfane.com
那么邮件头中如下:
Message-ID:<1234567890.12345.qmail@rainbow.linuxfane.com>;
*/ if (control_rldef(&control_idhost,"control/idhost",1,"idhost") != 1) die_read(); x = env_get("QMAILIDHOST"); if (x) if (!stralloc_copys(&control_idhost,x)) die_nomem();}#define RECIP_DEFAULT 1#define RECIP_ARGS 2#define RECIP_HEADER 3#define RECIP_AH 4void main(argc,argv)int argc;char **argv;{ int i; int opt; int recipstrategy; sig_pipeignore(); starttime = now(); qmopts = env_get("QMAILINJECT"); if (qmopts) while (*qmopts) switch(*qmopts++) { case 'c': flagnamecomment = 1; break; case 's': flagdeletesender = 1; break; case 'f': flagdeletefrom = 1; break; case 'i': flagdeletemessid = 1; break; case 'r': flaghackrecip = 1; break; case 'm': flaghackmess = 1; break; } mailhost = env_get("QMAILHOST"); if (!mailhost) mailhost = env_get("MAILHOST"); mailrhost = env_get("QMAILSHOST"); if (!mailrhost) mailrhost = mailhost; mailuser = env_get("QMAILUSER"); if (!mailuser) mailuser = env_get("MAILUSER"); if (!mailuser) mailuser = env_get("USER"); if (!mailuser) mailuser = env_get("LOGNAME"); if (!mailuser) mailuser = "anonymous"; mailusertokentype = TOKEN822_ATOM; if (quote_need(mailuser,str_len(mailuser))) mailusertokentype = TOKEN822_QUOTE; mailruser = env_get("QMAILSUSER"); if (!mailruser) mailruser = mailuser; for (i = 0;i < H_NUM;++i) htypeseen[i] = 0; recipstrategy = RECIP_DEFAULT; flagqueue = 1; getcontrols(); if (!saa_readyplus(&hrlist,1)) die_nomem(); if (!saa_readyplus(&tocclist,1)) die_nomem(); if (!saa_readyplus(&hrrlist,1)) die_nomem(); if (!saa_readyplus(&reciplist,1)) die_nomem(); while ((opt = getopt(argc,argv,"aAhHnNf:")) != opteof) switch(opt) { case 'a': recipstrategy = RECIP_ARGS; break; case 'A': recipstrategy = RECIP_DEFAULT; break; case 'h': recipstrategy = RECIP_HEADER; break; case 'H': recipstrategy = RECIP_AH; break; case 'n': flagqueue = 0; break; case 'N': flagqueue = 1; break; case 'f': if (!quote2(&sender,optarg)) die_nomem(); doordie(&sender,token822_parse(&envs,&sender,&envsbuf)); token822_reverse(&envs); rwgeneric(&envs); token822_reverse(&envs); if (token822_unquote(&sender,&envs) != 1) die_nomem(); break; case '?': default: perm(); } argc -= optind; argv += optind; if (recipstrategy == RECIP_DEFAULT) recipstrategy = (*argv ? RECIP_ARGS : RECIP_HEADER); if (recipstrategy != RECIP_HEADER) while (*argv) dorecip(*argv++); flagrh = (recipstrategy != RECIP_ARGS); if (headerbody(subfdin,doheaderfield,finishheader,dobody) == -1) die_read(); exitnicely();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -