Age Owner Branch data TLA Line data Source code
1 : : /*-------------------------------------------------------------------------
2 : : *
3 : : * ssl_passphrase_func.c
4 : : *
5 : : * Loadable PostgreSQL module fetch an ssl passphrase for the server cert.
6 : : * instead of calling an external program. This implementation just hands
7 : : * back the configured password rot13'd.
8 : : *
9 : : *-------------------------------------------------------------------------
10 : : */
11 : :
12 : : #include "postgres.h"
13 : :
14 : : #include <float.h>
15 : : #include <stdio.h>
16 : :
17 : : #include "libpq/libpq.h"
18 : : #include "libpq/libpq-be.h"
19 : : #include "utils/guc.h"
20 : :
1481 andrew@dunslane.net 21 :CBC 15 : PG_MODULE_MAGIC;
22 : :
23 : : static char *ssl_passphrase = NULL;
24 : :
25 : : /* callback function */
26 : : static int rot13_passphrase(char *buf, int size, int rwflag, void *userdata);
27 : :
28 : : /* hook function to set the callback */
29 : : static void set_rot13(SSL_CTX *context, bool isServerStart);
30 : :
31 : : /*
32 : : * Module load callback
33 : : */
34 : : void
35 : 15 : _PG_init(void)
36 : : {
37 : : /* Define custom GUC variable. */
38 : 15 : DefineCustomStringVariable("ssl_passphrase.passphrase",
39 : : "passphrase before transformation",
40 : : NULL,
41 : : &ssl_passphrase,
42 : : NULL,
43 : : PGC_SIGHUP,
44 : : 0, /* no flags required */
45 : : NULL,
46 : : NULL,
47 : : NULL);
48 : :
783 tgl@sss.pgh.pa.us 49 : 15 : MarkGUCPrefixReserved("ssl_passphrase");
50 : :
1481 andrew@dunslane.net 51 [ + - ]: 15 : if (ssl_passphrase)
52 : 15 : openssl_tls_init_hook = set_rot13;
53 : 15 : }
54 : :
55 : : static void
56 : 15 : set_rot13(SSL_CTX *context, bool isServerStart)
57 : : {
58 : : /* warn if the user has set ssl_passphrase_command */
1431 tgl@sss.pgh.pa.us 59 [ + + ]: 15 : if (ssl_passphrase_command[0])
1481 andrew@dunslane.net 60 [ + - ]: 8 : ereport(WARNING,
61 : : (errmsg("ssl_passphrase_command setting ignored by ssl_passphrase_func module")));
62 : :
63 : 15 : SSL_CTX_set_default_passwd_cb(context, rot13_passphrase);
64 : 15 : }
65 : :
66 : : static int
67 : 15 : rot13_passphrase(char *buf, int size, int rwflag, void *userdata)
68 : : {
69 : :
70 [ - + ]: 15 : Assert(ssl_passphrase != NULL);
1343 peter@eisentraut.org 71 : 15 : strlcpy(buf, ssl_passphrase, size);
1481 andrew@dunslane.net 72 [ + + ]: 119 : for (char *p = buf; *p; p++)
73 : : {
74 : 104 : char c = *p;
75 : :
76 [ + + + + : 104 : if ((c >= 'a' && c <= 'm') || (c >= 'A' && c <= 'M'))
+ + + + ]
77 : 46 : *p = c + 13;
78 [ + + - + : 58 : else if ((c >= 'n' && c <= 'z') || (c >= 'N' && c <= 'Z'))
+ + + - ]
79 : 44 : *p = c - 13;
80 : : }
81 : :
82 : 15 : return strlen(buf);
83 : : }
|