master-auth.h revision 27712ff41adb9564e946a3f392c90da918c8a2e1
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina#ifndef MASTER_AUTH_H
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina#define MASTER_AUTH_H
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina#include "net.h"
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březinastruct master_service;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina/* Major version changes are not backwards compatible,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina minor version numbers can be ignored. */
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina#define AUTH_MASTER_PROTOCOL_MAJOR_VERSION 1
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina#define AUTH_MASTER_PROTOCOL_MINOR_VERSION 1
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina/* Authentication client process's cookie size */
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina#define MASTER_AUTH_COOKIE_SIZE (128/8)
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina/* LOGIN_MAX_INBUF_SIZE should be based on this. Keep this large enough so that
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina LOGIN_MAX_INBUF_SIZE will be 1024+2 bytes. This is because IMAP ID command's
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina values may be max. 1024 bytes plus 2 for "" quotes. (Although it could be
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina even double of that when value is full of \" quotes, but for now lets not
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina make it too easy to waste memory..) */
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina#define MASTER_AUTH_MAX_DATA_SIZE (1024 + 128 + 33 + 2)
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina#define MASTER_AUTH_ERRMSG_INTERNAL_FAILURE \
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina "Internal error occurred. Refer to server log for more information."
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březinaenum mail_auth_request_flags {
e880949305cee3aca79441fe6113a9d79e7c98f2Jakub Hrozek /* Connection has TLS compression enabled */
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina MAIL_AUTH_REQUEST_FLAG_TLS_COMPRESSION = 0x01
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina};
2a25713afc6beefb11a799903a43f695c5d7a4f9Adam Tkac
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina/* Authentication request. File descriptor may be sent along with the
769347ad4d35d43488eb98f980143495b0db415dStef Walter request. */
769347ad4d35d43488eb98f980143495b0db415dStef Walterstruct master_auth_request {
769347ad4d35d43488eb98f980143495b0db415dStef Walter /* Request tag. Reply is sent back using same tag. */
769347ad4d35d43488eb98f980143495b0db415dStef Walter unsigned int tag;
769347ad4d35d43488eb98f980143495b0db415dStef Walter
769347ad4d35d43488eb98f980143495b0db415dStef Walter /* Authentication process, authentication ID and auth cookie. */
769347ad4d35d43488eb98f980143495b0db415dStef Walter pid_t auth_pid;
769347ad4d35d43488eb98f980143495b0db415dStef Walter unsigned int auth_id;
769347ad4d35d43488eb98f980143495b0db415dStef Walter unsigned int client_pid;
769347ad4d35d43488eb98f980143495b0db415dStef Walter uint8_t cookie[MASTER_AUTH_COOKIE_SIZE];
b76419cf8830440b46c20a15585562343c7b1924Jakub Hrozek
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina /* Local and remote IPs of the connection. The file descriptor
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina itself may be a local socketpair. */
769347ad4d35d43488eb98f980143495b0db415dStef Walter struct ip_addr local_ip, remote_ip;
769347ad4d35d43488eb98f980143495b0db415dStef Walter
769347ad4d35d43488eb98f980143495b0db415dStef Walter uint32_t flags;
769347ad4d35d43488eb98f980143495b0db415dStef Walter
769347ad4d35d43488eb98f980143495b0db415dStef Walter /* request follows this many bytes of client input */
769347ad4d35d43488eb98f980143495b0db415dStef Walter uint32_t data_size;
769347ad4d35d43488eb98f980143495b0db415dStef Walter /* inode of the transferred fd. verified just to be sure that the
769347ad4d35d43488eb98f980143495b0db415dStef Walter correct fd is mapped to the correct struct. */
769347ad4d35d43488eb98f980143495b0db415dStef Walter ino_t ino;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina};
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březinaenum master_auth_status {
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina MASTER_AUTH_STATUS_OK,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina MASTER_AUTH_STATUS_INTERNAL_ERROR
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina};
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březinastruct master_auth_reply {
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina /* tag=0 are notifications from master */
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina unsigned int tag;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina enum master_auth_status status;
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov /* PID of the post-login mail process handling this connection */
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina pid_t mail_pid;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina};
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina/* reply=NULL if the auth lookup was cancelled due to some error */
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březinatypedef void master_auth_callback_t(const struct master_auth_reply *reply,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina void *context);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
65976ea5e9767bfaced81dfb97dc87d59f50b57eSimo Sorcestruct master_auth *
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březinamaster_auth_init(struct master_service *service, const char *path);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březinavoid master_auth_deinit(struct master_auth **auth);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina/* Send an authentication request. The fd contains the file descriptor to
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina transfer, or -1 if no fd is wanted to be transferred. Returns tag which can
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov be used to abort the request (ie. ignore the reply from master).
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov request->tag is ignored. */
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březinavoid master_auth_request(struct master_auth *auth, int fd,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina const struct master_auth_request *request,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina const unsigned char *data,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina master_auth_callback_t *callback,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina void *context, unsigned int *tag_r);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březinavoid master_auth_request_abort(struct master_auth *auth, unsigned int tag);
7c9fe57ad82747a32721ca0a08c5569282f3e0c4Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina#endif
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina