Initial import from FreeBSD RELENG_4:
[dragonfly.git] / lib / libtacplus / taclib_private.h
1 /*-
2  * Copyright (c) 1998, 2001, Juniper Networks, Inc.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  *
26  *      $FreeBSD: src/lib/libtacplus/taclib_private.h,v 1.1.1.1.6.1 2002/10/09 08:50:42 pst Exp $
27  */
28
29 #ifndef TACLIB_PRIVATE_H
30 #define TACLIB_PRIVATE_H
31
32 #include "taclib.h"
33
34 /* Defaults */
35 #define PATH_TACPLUS_CONF       "/etc/tacplus.conf"
36 #define TACPLUS_PORT            49
37 #define TIMEOUT                 3       /* In seconds */
38
39 /* Limits */
40 #define BODYSIZE        8150            /* Maximum message body size */
41 #define ERRSIZE         128             /* Maximum error message length */
42 #define MAXCONFLINE     1024            /* Maximum config file line length */
43 #define MAXSERVERS      10              /* Maximum number of servers to try */
44 #define MAXAVPAIRS      255             /* Maximum number of AV pairs */
45
46 /* Protocol constants. */
47 #define HDRSIZE         12              /* Size of message header */
48
49 /* Protocol version number */
50 #define TAC_VER_MAJOR           0xc             /* Major version number */
51
52 /* Protocol packet types */
53 #define TAC_AUTHEN              0x01            /* Authentication */
54 #define TAC_AUTHOR              0x02            /* Authorization */
55 #define TAC_ACCT                0x03            /* Accouting */
56
57 /* Protocol header flags */
58 #define TAC_UNENCRYPTED         0x01
59 #define TAC_SINGLE_CONNECT      0x04
60
61 struct tac_server {
62         struct sockaddr_in addr;        /* Address of server */
63         char            *secret;        /* Shared secret */
64         int              timeout;       /* Timeout in seconds */
65         int              flags;
66 };
67
68 /*
69  * An optional string of bytes specified by the client for inclusion in
70  * a request.  The data is always a dynamically allocated copy that
71  * belongs to the library.  It is copied into the request packet just
72  * before sending the request.
73  */
74 struct clnt_str {
75         void            *data;
76         size_t           len;
77 };
78
79 /*
80  * An optional string of bytes from a server response.  The data resides
81  * in the response packet itself, and must not be freed.
82  */
83 struct srvr_str {
84         const void      *data;
85         size_t           len;
86 };
87
88 struct tac_authen_start {
89         u_int8_t        action;
90         u_int8_t        priv_lvl;
91         u_int8_t        authen_type;
92         u_int8_t        service;
93         u_int8_t        user_len;
94         u_int8_t        port_len;
95         u_int8_t        rem_addr_len;
96         u_int8_t        data_len;
97         unsigned char   rest[1];
98 };
99
100 struct tac_authen_reply {
101         u_int8_t        status;
102         u_int8_t        flags;
103         u_int16_t       msg_len;
104         u_int16_t       data_len;
105         unsigned char   rest[1];
106 };
107
108 struct tac_authen_cont {
109         u_int16_t       user_msg_len;
110         u_int16_t       data_len;
111         u_int8_t        flags;
112         unsigned char   rest[1];
113 };
114
115 struct tac_author_request {
116         u_int8_t        authen_meth;
117         u_int8_t        priv_lvl;
118         u_int8_t        authen_type;
119         u_int8_t        service;
120         u_int8_t        user_len;
121         u_int8_t        port_len;
122         u_int8_t        rem_addr_len;
123         u_int8_t        av_cnt;
124         unsigned char   rest[1];
125 };
126
127 struct tac_author_response {
128         u_int8_t        status;
129         u_int8_t        av_cnt;
130         u_int16_t       msg_len;
131         u_int16_t       data_len;
132         unsigned char   rest[1];
133 };
134
135 struct tac_msg {
136         u_int8_t        version;
137         u_int8_t        type;
138         u_int8_t        seq_no;
139         u_int8_t        flags;
140         u_int8_t        session_id[4];
141         u_int32_t       length;
142         union {
143                 struct tac_authen_start authen_start;
144                 struct tac_authen_reply authen_reply;
145                 struct tac_authen_cont authen_cont;
146                 struct tac_author_request author_request;
147                 struct tac_author_response author_response;
148                 unsigned char body[BODYSIZE];
149         } u;
150 };
151
152 struct tac_handle {
153         int              fd;            /* Socket file descriptor */
154         struct tac_server servers[MAXSERVERS];  /* Servers to contact */
155         int              num_servers;   /* Number of valid server entries */
156         int              cur_server;    /* Server we are currently using */
157         int              single_connect;        /* Use a single connection */
158         int              last_seq_no;
159         char             errmsg[ERRSIZE];       /* Most recent error message */
160
161         struct clnt_str  user;
162         struct clnt_str  port;
163         struct clnt_str  rem_addr;
164         struct clnt_str  data;
165         struct clnt_str  user_msg;
166         struct clnt_str  avs[MAXAVPAIRS];
167
168         struct tac_msg   request;
169         struct tac_msg   response;
170
171         int              srvr_pos;      /* Scan position in response body */
172         struct srvr_str  srvr_msg;
173         struct srvr_str  srvr_data;
174         struct srvr_str  srvr_avs[MAXAVPAIRS];
175 };
176
177 #endif