summaryrefslogtreecommitdiffstats
path: root/src/global/verify.c
blob: 2ce091a5d5758a775ed5322bd4ad181b804ce259 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*++
/* NAME
/*	verify 3
/* SUMMARY
/*	update verify database
/* SYNOPSIS
/*	#include <verify.h>
/*
/*	int	verify_append(queue_id, stats, recipient, relay, dsn,
/*				verify_status)
/*	const char *queue_id;
/*	MSG_STATS *stats;
/*	RECIPIENT *recipient;
/*	const char *relay;
/*	DSN	*dsn;
/*	int	verify_status;
/* DESCRIPTION
/*	This module implements an impedance adaptor between the
/*	verify_clnt interface and the interface expected by the
/*	bounce/defer/sent modules.
/*
/*	verify_append() updates the address verification database
/*	and logs the action to the mailer logfile.
/*
/*	Arguments:
/* .IP queue_id
/*	The message queue id.
/* .IP stats
/*	Time stamps from different message delivery stages
/*	and session reuse count.
/* .IP recipient
/*	Recipient information. See recipient_list(3).
/* .IP relay
/*	Name of the host we're talking to.
/* .IP dsn
/*	Delivery status information. See dsn(3).
/*	The action is one of "deliverable" or "undeliverable".
/* .IP verify_status
/*	One of the following recipient verification status codes:
/* .RS
/* .IP DEL_REQ_RCPT_STAT_OK
/*	Successful delivery.
/* .IP DEL_REQ_RCPT_STAT_DEFER
/*	Temporary delivery error.
/* .IP DEL_REQ_RCPT_STAT_BOUNCE
/*	Hard delivery error.
/* .RE
/* DIAGNOSTICS
/*	A non-zero result means the operation failed.
/*
/*	Fatal: out of memory.
/* BUGS
/*	Should be replaced by routines with an attribute-value based
/*	interface instead of an interface that uses a rigid argument list.
/* LICENSE
/* .ad
/* .fi
/*	The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/*	Wietse Venema
/*	IBM T.J. Watson Research
/*	P.O. Box 704
/*	Yorktown Heights, NY 10598, USA
/*
/*	Wietse Venema
/*	Google, Inc.
/*	111 8th Avenue
/*	New York, NY 10011, USA
/*--*/

/* System library. */

#include <sys_defs.h>
#include <string.h>

/* Utility library. */

#include <msg.h>
#include <vstring.h>
#include <stringops.h>

/* Global library. */

#include <mail_params.h>
#include <mail_proto.h>
#include <verify_clnt.h>
#include <log_adhoc.h>
#include <verify.h>

/* verify_append - update address verification database */

int     verify_append(const char *queue_id, MSG_STATS *stats,
		              RECIPIENT *recipient, const char *relay,
		              DSN *dsn, int vrfy_stat)
{
    int     req_stat;
    DSN     my_dsn = *dsn;

    /*
     * Impedance adaptor between bounce/defer/sent and verify_clnt.
     * 
     * XXX No DSN check; this routine is called from bounce/defer/sent, which
     * know what the DSN initial digit should look like.
     * 
     * XXX vrfy_stat is completely redundant because of dsn.
     */
    if (var_verify_neg_cache || vrfy_stat == DEL_RCPT_STAT_OK) {
	if (recipient->orig_addr[0])
	    req_stat = verify_clnt_update(recipient->orig_addr, vrfy_stat,
					  my_dsn.reason);
	else
	    req_stat = VRFY_STAT_OK;
	/* Two verify updates for one verify request! */
	if (req_stat == VRFY_STAT_OK
	    && strcmp(recipient->address, recipient->orig_addr) != 0)
	    req_stat = verify_clnt_update(recipient->address, vrfy_stat,
					  my_dsn.reason);
    } else {
	my_dsn.action = "undeliverable-but-not-cached";
	req_stat = VRFY_STAT_OK;
    }
    if (req_stat == VRFY_STAT_OK) {
	log_adhoc(queue_id, stats, recipient, relay, dsn, my_dsn.action);
	req_stat = 0;
    } else {
	msg_warn("%s: %s service failure", queue_id, var_verify_service);
	req_stat = -1;
    }
    return (req_stat);
}