Postfix3.3.1
tlsproxy_state.c
[詳解]
1 /*++
2 /* NAME
3 /* tlsproxy_state 3
4 /* SUMMARY
5 /* Postfix SMTP server
6 /* SYNOPSIS
7 /* #include <tlsproxy.h>
8 /*
9 /* TLSP_STATE *tlsp_state_create(service, plaintext_stream)
10 /* const char *service;
11 /* VSTREAM *plaintext_stream;
12 /*
13 /* void tlsp_state_free(state)
14 /* TLSP_STATE *state;
15 /* DESCRIPTION
16 /* This module provides TLSP_STATE constructor and destructor
17 /* routines.
18 /*
19 /* tlsp_state_create() initializes session context.
20 /*
21 /* tlsp_state_free() destroys session context.
22 /*
23 /* Arguments:
24 /* .IP service
25 /* The service name for the TLS library. This argument is copied.
26 /* The destructor will automatically destroy the string.
27 /* .IP plaintext_stream
28 /* The VSTREAM between postscreen(8) and tlsproxy(8).
29 /* The destructor will automatically close the stream.
30 /* .PP
31 /* Other structure members are set by the application. The
32 /* text below describes how the TLSP_STATE destructor
33 /* disposes of them.
34 /* .IP plaintext_buf
35 /* NBBIO for plaintext I/O.
36 /* The destructor will automatically turn off read/write/timeout
37 /* events and destroy the NBBIO.
38 /* .IP ciphertext_fd
39 /* The file handle for the remote SMTP client socket.
40 /* The destructor will automatically turn off read/write events
41 /* and close the file handle.
42 /* .IP ciphertext_timer
43 /* The destructor will automatically turn off this time event.
44 /* .IP timeout
45 /* Time limit for plaintext and ciphertext I/O.
46 /* .IP remote_endpt
47 /* Printable remote endpoint name.
48 /* The destructor will automatically destroy the string.
49 /* .IP server_id
50 /* TLS session cache identifier.
51 /* The destructor will automatically destroy the string.
52 /* DIAGNOSTICS
53 /* All errors are fatal.
54 /* LICENSE
55 /* .ad
56 /* .fi
57 /* The Secure Mailer license must be distributed with this software.
58 /* AUTHOR(S)
59 /* Wietse Venema
60 /* IBM T.J. Watson Research
61 /* P.O. Box 704
62 /* Yorktown Heights, NY 10598, USA
63 /*--*/
64 
65  /*
66  * System library.
67  */
68 #include <sys_defs.h>
69 
70  /*
71  * Utility library.
72  */
73 #include <msg.h>
74 #include <mymalloc.h>
75 #include <nbbio.h>
76 
77  /*
78  * Master library.
79  */
80 #include <mail_server.h>
81 
82  /*
83  * TLS library.
84  */
85 #ifdef USE_TLS
86 #define TLS_INTERNAL /* XXX */
87 #include <tls.h>
88 
89  /*
90  * Application-specific.
91  */
92 #include <tlsproxy.h>
93 
94 /* tlsp_state_create - create TLS proxy state object */
95 
96 TLSP_STATE *tlsp_state_create(const char *service,
97  VSTREAM *plaintext_stream)
98 {
99  TLSP_STATE *state = (TLSP_STATE *) mymalloc(sizeof(*state));
100 
101  state->flags = TLSP_FLAG_DO_HANDSHAKE;
102  state->service = mystrdup(service);
103  state->plaintext_stream = plaintext_stream;
104  state->plaintext_buf = 0;
105  state->ciphertext_fd = -1;
106  state->ciphertext_timer = 0;
107  state->timeout = -1;
108  state->remote_endpt = 0;
109  state->server_id = 0;
110  state->tls_context = 0;
111 
112  return (state);
113 }
114 
115 /* tlsp_state_free - destroy state objects, connection and events */
116 
117 void tlsp_state_free(TLSP_STATE *state)
118 {
119  myfree(state->service);
120  if (state->plaintext_buf) /* turns off plaintext events */
121  nbbio_free(state->plaintext_buf);
123  if (state->ciphertext_fd >= 0) {
125  (void) close(state->ciphertext_fd);
126  }
127  if (state->ciphertext_timer)
128  event_cancel_timer(state->ciphertext_timer, (void *) state);
129  if (state->remote_endpt) {
130  msg_info("DISCONNECT %s", state->remote_endpt);
131  myfree(state->remote_endpt);
132  }
133  if (state->server_id)
134  myfree(state->server_id);
135  if (state->tls_context)
136  tls_free_context(state->tls_context);
137  myfree((void *) state);
138 }
139 
140 #endif
void myfree(void *ptr)
Definition: mymalloc.c:207
char * mystrdup(const char *str)
Definition: mymalloc.c:225
int flags
Definition: tlsproxy.h:26
VSTREAM * plaintext_stream
Definition: tlsproxy.h:29
TLSP_STATE * tlsp_state_create(const char *, VSTREAM *)
char * remote_endpt
Definition: tlsproxy.h:34
int timeout
Definition: tlsproxy.h:33
void nbbio_free(NBBIO *np)
Definition: nbbio.c:363
void event_server_disconnect(VSTREAM *stream)
Definition: event_server.c:335
char * service
Definition: tlsproxy.h:28
TLS_SESS_STATE * tls_context
Definition: tlsproxy.h:36
void tlsp_state_free(TLSP_STATE *)
#define TLSP_FLAG_DO_HANDSHAKE
Definition: tlsproxy.h:40
EVENT_NOTIFY_FN ciphertext_timer
Definition: tlsproxy.h:32
NBBIO * plaintext_buf
Definition: tlsproxy.h:30
void event_disable_readwrite(int fd)
Definition: events.c:839
int event_cancel_timer(EVENT_NOTIFY_TIME_FN callback, void *context)
Definition: events.c:965
char * server_id
Definition: tlsproxy.h:35
int ciphertext_fd
Definition: tlsproxy.h:31
void * mymalloc(ssize_t len)
Definition: mymalloc.c:150
void msg_info(const char *fmt,...)
Definition: msg.c:199