File: proxysslverify.lua

package info (click to toggle)
lua-resty-core 0.1.32-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,268 kB
  • sloc: sh: 207; perl: 143; makefile: 26
file content (140 lines) | stat: -rw-r--r-- 3,695 bytes parent folder | download
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
131
132
133
134
135
136
137
138
139
140
-- Copyright (C) Yichun Zhang (agentzh)


local base = require "resty.core.base"
base.allows_subsystem('http', 'stream')


local ffi = require "ffi"
local C = ffi.C
local ffi_gc = ffi.gc
local ffi_str = ffi.string
local get_request = base.get_request
local error = error
local errmsg = base.get_errmsg_ptr()

local FFI_OK = base.FFI_OK
local FFI_ERROR = base.FFI_ERROR
local subsystem = ngx.config.subsystem
local ngx_phase = ngx.get_phase

local ngx_lua_ffi_proxy_ssl_set_verify_result
local ngx_lua_ffi_proxy_ssl_get_verify_result
local ngx_lua_ffi_proxy_ssl_get_verify_cert
local ngx_lua_ffi_proxy_ssl_free_verify_cert


if subsystem == 'http' then
    ffi.cdef[[
    int ngx_http_lua_ffi_proxy_ssl_set_verify_result(ngx_http_request_t *r,
        int verify_result, char **err);

    int ngx_http_lua_ffi_proxy_ssl_get_verify_result(ngx_http_request_t *r,
        char **err);

    void *ngx_http_lua_ffi_proxy_ssl_get_verify_cert(ngx_http_request_t *r,
        char **err);

    void ngx_http_lua_ffi_proxy_ssl_free_verify_cert(void *cdata);
    ]]

    ngx_lua_ffi_proxy_ssl_set_verify_result =
        C.ngx_http_lua_ffi_proxy_ssl_set_verify_result
    ngx_lua_ffi_proxy_ssl_get_verify_result =
        C.ngx_http_lua_ffi_proxy_ssl_get_verify_result
    ngx_lua_ffi_proxy_ssl_get_verify_cert =
        C.ngx_http_lua_ffi_proxy_ssl_get_verify_cert
    ngx_lua_ffi_proxy_ssl_free_verify_cert =
        C.ngx_http_lua_ffi_proxy_ssl_free_verify_cert



elseif subsystem == 'stream' then
    ffi.cdef[[
    int ngx_stream_lua_ffi_proxy_ssl_set_verify_result(
        ngx_stream_lua_request_t *r, int verify_result, char **err);

    int ngx_stream_lua_ffi_proxy_ssl_get_verify_result(
        ngx_stream_lua_request_t *r, char **err);

    void *ngx_stream_lua_ffi_proxy_ssl_get_verify_cert(
        ngx_stream_lua_request_t *r, char **err);

    void ngx_stream_lua_ffi_proxy_ssl_free_verify_cert(void *cdata);
    ]]

    ngx_lua_ffi_proxy_ssl_set_verify_result =
        C.ngx_stream_lua_ffi_proxy_ssl_set_verify_result
    ngx_lua_ffi_proxy_ssl_get_verify_result =
        C.ngx_stream_lua_ffi_proxy_ssl_get_verify_result
    ngx_lua_ffi_proxy_ssl_get_verify_cert =
        C.ngx_stream_lua_ffi_proxy_ssl_get_verify_cert
    ngx_lua_ffi_proxy_ssl_free_verify_cert =
        C.ngx_stream_lua_ffi_proxy_ssl_free_verify_cert
end


local _M = { version = base.version }


-- return ok, err
function _M.set_verify_result(verify_result)
    local r = get_request()
    if not r then
        error("no request found")
    end

    if ngx_phase() ~= "proxy_ssl_verify" then
        error("API disabled in the current context")
    end

    local rc = ngx_lua_ffi_proxy_ssl_set_verify_result(r, verify_result, errmsg)
    if rc == FFI_OK then
        return true
    end

    return nil, ffi_str(errmsg[0])
end


-- return verify_result, err
function _M.get_verify_result()
    local r = get_request()
    if not r then
        error("no request found")
    end

    if ngx_phase() ~= "proxy_ssl_verify" then
        error("API disabled in the current context")
    end

    local rc = ngx_lua_ffi_proxy_ssl_get_verify_result(r, errmsg)
    if rc == FFI_ERROR then
        return nil, ffi_str(errmsg[0])
    end

    return rc
end


-- return cert, err
function _M.get_verify_cert()
    local r = get_request()
    if not r then
        error("no request found")
    end

    if ngx_phase() ~= "proxy_ssl_verify" then
        error("API disabled in the current context")
    end

    local cert = ngx_lua_ffi_proxy_ssl_get_verify_cert(r, errmsg)
    if cert ~= nil then
        return ffi_gc(cert, ngx_lua_ffi_proxy_ssl_free_verify_cert)
    end

    return nil, ffi_str(errmsg[0])
end


return _M