summaryrefslogtreecommitdiff
path: root/sqmail-4.3.07/src/include/srs2.h
blob: e993928c3d13e9b7c3a31f3d98061292ed078c16 (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
#ifndef SRS2_H
#define SRS2_H
#include <stdint.h>
#include <time.h>

/* Adjusted to s/qmail (feh) */

/* Copyright (c) 2004 Shevek (srs@anarres.org)
 * All rights reserved.
 *
 * This file is a part of libsrs2 from http://www.libsrs2.org/
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, under the terms of either the GNU General Public
 * License version 2 or the BSD license, at the discretion of the
 * user. Copies of these licenses have been included in the libsrs2
 * distribution. See the the file called LICENSE for more
 * information.
 */

/* This is ugly, but reasonably safe. */
#undef  TRUE
#define TRUE 1
#undef  FALSE
#define FALSE 0

#define SRSSEP '='
#define SRS0TAG "SRS0"
#define SRS1TAG "SRS1"

/* Error codes */

#define SRS_ERRTYPE_MASK   0xf000
#define SRS_ERRTYPE_NONE   0x0000
#define SRS_ERRTYPE_CONFIG 0x1000
#define SRS_ERRTYPE_INPUT  0x2000
#define SRS_ERRTYPE_SYNTAX 0x4000
#define SRS_ERRTYPE_SRS    0x8000

#define SRS_SUCCESS         (0)
#define SRS_ENOTSRSADDRESS  (1)
#define SRS_ENOTREWRITTEN   (2)

#define SRS_ENOSECRETS        (SRS_ERRTYPE_CONFIG | 1)
#define SRS_ESEPARATORINVALID (SRS_ERRTYPE_CONFIG | 2)

#define SRS_ENOSENDERATSIGN   (SRS_ERRTYPE_INPUT | 1)
#define SRS_EBUFTOOSMALL      (SRS_ERRTYPE_INPUT | 2)

#define SRS_ENOSRS0HOST       (SRS_ERRTYPE_SYNTAX | 1)
#define SRS_ENOSRS0USER       (SRS_ERRTYPE_SYNTAX | 2)
#define SRS_ENOSRS0HASH       (SRS_ERRTYPE_SYNTAX | 3)
#define SRS_ENOSRS0STAMP      (SRS_ERRTYPE_SYNTAX | 4)
#define SRS_ENOSRS1HOST       (SRS_ERRTYPE_SYNTAX | 5)
#define SRS_ENOSRS1USER       (SRS_ERRTYPE_SYNTAX | 6)
#define SRS_ENOSRS1HASH       (SRS_ERRTYPE_SYNTAX | 7)
#define SRS_EBADTIMESTAMPCHAR (SRS_ERRTYPE_SYNTAX | 8)
#define SRS_EHASHTOOSHORT     (SRS_ERRTYPE_SYNTAX | 9)

#define SRS_ETIMESTAMPOUTOFDATE (SRS_ERRTYPE_SRS | 1)
#define SRS_EHASHINVALID      (SRS_ERRTYPE_SRS | 2)

#define SRS_ERROR_TYPE(x) ((x) & SRS_ERRTYPE_MASK)

/* SRS implementation */

#define SRS_IS_SRS_ADDRESS(x) ( \
  (strncasecmp((x),"SRS",3) == 0) && \
  (strchr("01", (x)[3]) != NULL) && \
  (strchr("-+=", (x)[4]) != NULL) \
)

typedef void *(*srs_malloc_t)(size_t);
typedef void *(*srs_realloc_t)(void *,size_t);
typedef void (*srs_free_t)(void *);

typedef int srs_bool;

typedef struct _srs_t {
  /* Rewriting parameters */
//  stralloc cookies;
  char **secrets;
  int numsecrets;
  char separator;

  /* Security parameters */
  int maxage;                /* Maximum allowed age in seconds */
  int hashlen;
  int hashmin;

  /* Behaviour parameters */
  srs_bool alwaysrewrite;    /* Rewrite even into same domain? */
  srs_bool noforward;        /* Never perform forwards rewriting */
  srs_bool noreverse;        /* Never perform reverse rewriting */
  char **neverrewrite;       /* A list of non-rewritten domains */
} srs_t;

/* Interface */
int srs_set_malloc(srs_malloc_t m,srs_realloc_t r,srs_free_t f);
srs_t *srs_new();
void srs_init(srs_t *);
void srs_free(srs_t *);
int srs_forward(srs_t *,char *,int,const char *,const char *);
int srs_forward_alloc(srs_t *,char **,const char *,const char *);
int srs_reverse(srs_t *,char *,int, const char *);
int srs_reverse_alloc(srs_t *,char **,const char *);
const char *srs_strerror(int);
int srs_add_secret(srs_t *,const char *);
const char * srs_get_secret(srs_t *,int);
 /* You probably shouldn't call these. */
int srs_timestamp_create(srs_t *,char *,time_t);
int srs_timestamp_check(srs_t *,const char *);

#define SRS_PARAM_DECLARE(n, t) \
  int srs_set_ ## n (srs_t *srs, t value); \
  t srs_get_ ## n (srs_t *srs);

SRS_PARAM_DECLARE(alwaysrewrite,srs_bool)
SRS_PARAM_DECLARE(separator,char)
SRS_PARAM_DECLARE(maxage,int)
SRS_PARAM_DECLARE(hashlen,int)
SRS_PARAM_DECLARE(hashmin,int)
SRS_PARAM_DECLARE(noforward,srs_bool)
SRS_PARAM_DECLARE(noreverse,srs_bool)

#endif  /* SRS2_H */