1: /*************************************************************************
2: * (C) 2010 AITNET ltd - Sofia/Bulgaria - <misho@aitbg.com>
3: * by Michael Pounov <misho@openbsd-bg.org>
4: *
5: * $Author: misho $
6: * $Id: aitpwd.h,v 1.1.2.1 2012/09/18 08:17:59 misho Exp $
7: *
8: **************************************************************************
9: The ELWIX and AITNET software is distributed under the following
10: terms:
11:
12: All of the documentation and software included in the ELWIX and AITNET
13: Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
14:
15: Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
16: by Michael Pounov <misho@elwix.org>. All rights reserved.
17:
18: Redistribution and use in source and binary forms, with or without
19: modification, are permitted provided that the following conditions
20: are met:
21: 1. Redistributions of source code must retain the above copyright
22: notice, this list of conditions and the following disclaimer.
23: 2. Redistributions in binary form must reproduce the above copyright
24: notice, this list of conditions and the following disclaimer in the
25: documentation and/or other materials provided with the distribution.
26: 3. All advertising materials mentioning features or use of this software
27: must display the following acknowledgement:
28: This product includes software developed by Michael Pounov <misho@elwix.org>
29: ELWIX - Embedded LightWeight unIX and its contributors.
30: 4. Neither the name of AITNET nor the names of its contributors
31: may be used to endorse or promote products derived from this software
32: without specific prior written permission.
33:
34: THIS SOFTWARE IS PROVIDED BY AITNET AND CONTRIBUTORS ``AS IS'' AND
35: ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
36: IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
37: ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
38: FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
39: DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
40: OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
41: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
42: LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
43: OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
44: SUCH DAMAGE.
45: */
46: #ifndef __AITPWD_H
47: #define __AITPWD_H
48:
49:
50: #include <time.h>
51:
52:
53: struct tagAcctDB {
54: unsigned short db_ver;
55: unsigned char db_lock;
56: unsigned char db_wrap;
57:
58: unsigned int db_rmin;
59: unsigned int db_rmax;
60: uint64_t db_rsize;
61:
62: uint64_t db_since;
63:
64: int db_h; /* optional */
65: } __packed;
66:
67: /* Search callback function, compare to match argument to record match ...
68: * (return: -1 error, 0 not match or 1 match)
69: */
70: typedef int (*cb_acct_f)(void * /*current db_record*/, void * /*argument*/);
71:
72:
73: struct tagUser {
74: ait_val_t usr_name;
75: ait_val_t usr_pass;
76: ait_val_t usr_uid;
77: ait_val_t usr_gid;
78: ait_val_t usr_class;
79: ait_val_t usr_change;
80: ait_val_t usr_expire;
81: ait_val_t usr_realm;
82: ait_val_t usr_home;
83: ait_val_t usr_shell;
84:
85: SLIST_ENTRY(tagCfg) usr_next;
86: RB_ENTRY(tagCfg) usr_node;
87: };
88:
89: typedef struct tagUser * passwd_t;
90:
91: typedef enum { ALL = -1,
92: Username,
93: Password,
94: UID,
95: GID,
96: Class,
97: Change,
98: Expire,
99: Realm,
100: Home,
101: Shell
102: } passwd_attr_t;
103:
104:
105: #if 0
106: /*
107: * CreatePasswd() Create secrets from memory
108: * @csPasswdName = New filename for secrets
109: * @ppwd = Users array element
110: * return: 0 ok; -1 error:: can`t save new file
111: */
112: int CreatePasswd(const char *csPasswdName, passwd_t * __restrict ppwd);
113: /*
114: * LoadPasswd() Load secrets from file
115: * @csPasswdName = Filename of secrets
116: * @ppwd = Users array element
117: * return: 0 ok; -1 error:: can`t load file
118: */
119: int LoadPasswd(const char *csPasswdName, passwd_t * __restrict ppwd);
120: /*
121: * UnloadPasswd() Unload secrets from memory and free resources
122: * @ppwd = Users array element
123: */
124: void UnloadPasswd(passwd_t * __restrict ppwd);
125:
126:
127: // pwd_GetErrno() Get error code of last operation
128: inline int pwd_GetErrno();
129: // pwd_GetError() Get error text of last operation
130: inline const char *pwd_GetError();
131: // pwd_Delimiter() Operate with file delimiter, if delim == 0 only get current
132: inline unsigned char pwd_GetDelim(unsigned char delim);
133:
134:
135: /*
136: * ReadPasswd() Read from file and add new item to user array
137: * @f = file resource
138: * @ppwd = User array
139: * return: 0 ok; -1 error:: can`t allocate memory
140: */
141: int ReadPasswd(FILE *f, passwd_t * __restrict ppwd);
142: /*
143: * WritePasswd() Write to file from items in array
144: * @f = file resource
145: * @ppwd = User array
146: * return: 0 ok; -1 error:: can`t write to file
147: */
148: int WritePasswd(FILE *f, passwd_t * __restrict ppwd);
149:
150:
151: /*
152: * pwdCleanStr() Free strings in passwd_t value
153: * @pwd = User object
154: * return: none
155: */
156: inline void pwdCleanStr(passwd_t __restrict pwd);
157: /*
158: * pwdFreeValue() Free passwd_t value
159: * @ppwd = User object
160: * @idx = Index of attribute, if ALL == idx is free all structure
161: * return: 0 ok, -1 error
162: */
163: inline int pwdFreeValue(passwd_t * __restrict ppwd, passwd_attr_t idx);
164: /*
165: * pwdSetValue() Set passwd_t value
166: * @ppwd = User object
167: * @idx = Index of attribute, if ALL == idx clean User object and set username!
168: * @Value = Value to set
169: * return: number of fields in passwd_t; -1 error:: can`t set passwd_t
170: */
171: inline int pwdSetValue(passwd_t * __restrict ppwd, passwd_attr_t idx, unsigned char *Value);
172: /*
173: * pwdGetValue() Get passwd_t value
174: * @pwd = User object
175: * @idx = Index of attribute, if ALL == idx is error!
176: * @Value = Value to get
177: * @valLen = Size of Value string
178: * return: number of fields in passwd_t; -1 error:: can`t get passwd_t
179: */
180: inline int pwdGetValue(passwd_t __restrict pwd, passwd_attr_t idx, unsigned char *Value, int valLen);
181:
182:
183: /*
184: * pwd_FindAttribute() Find by attribute position in user array
185: * @pwd = User array
186: * @idx = Index of attribute, if ALL == idx return number of user array elements
187: * @csAttr = User attribute
188: * return: 0 not found item; -1 error: null parameters; >0 position in array + 1
189: */
190: inline int pwd_FindAttribute(passwd_t __restrict pwd, passwd_attr_t idx, const unsigned char *csAttr);
191: /*
192: * pwd_SetAttribute() Set user in array or add new user if not exists
193: * @ppwd = User array
194: * @idx = Index of attribute to set
195: * @val = User structure for setup
196: * return: 0 nothing changed, -1 error: not enough memory; 1 find and update item; 2 added new item
197: */
198: int pwd_SetAttribute(passwd_t * __restrict ppwd, passwd_attr_t idx, passwd_t val);
199: /*
200: * pwd_GetAttribute() Get user from array, set username in val
201: * @pwd = User array
202: * @idx = Index of attribute to get, if idx == ALL return full element items
203: * @val = User structure
204: * return: 0 not found, -1 error; >0 found at position in array + 1
205: */
206: int pwd_GetAttribute(passwd_t __restrict pwd, passwd_attr_t idx, passwd_t val);
207: /*
208: * pwd_UnsetAttribute() Unset user from array and free resources!
209: * @ppwd = User array
210: * @idx = Index of attribute to unset, if idx == ALL unset(delete) all items in element
211: * @val = User structure
212: * return: 0 item not found, -1 error: null parameters; >0 number of elements leave in array
213: */
214: int pwd_UnsetAttribute(passwd_t * __restrict ppwd, passwd_attr_t idx, passwd_t val);
215: /*
216: * pwd_Authenticate() Authenticate user, set username and password in val
217: * @pwd = User array
218: * @val = User structure for authenticate, set username & password
219: after authentication fill other fields if exists
220: * return: 0 not found, -1 error; >0 found at position in array + 1
221: */
222: int pwd_Authenticate(passwd_t __restrict pwd, passwd_t val);
223:
224:
225: /*
226: * pwd_openAcct() Open accounting aDat binary database
227: * @csName - DB name
228: * @minR - Minimum records in database
229: * @maxR - Maximum records in database(round-robin db), if 0 unlimited grow
230: * @recSize - Size of record element
231: * @wrapR - If maxR >0 give ability to wrap round-robin db
232: * return: NULL error or !=NULL opened db handle
233: */
234: struct tagAcctDB *pwd_openAcct(const char *csName, unsigned int minR, unsigned int maxR,
235: size_t recSize, unsigned char wrapR);
236: /*
237: * pwd_closeAcct() Close accounting aDat binary database
238: * @db - DB handle
239: * return: none
240: */
241: void pwd_closeAcct(struct tagAcctDB ** __restrict db);
242: /*
243: * pwd_writeAcct() Write accounting record to aDat binary database
244: * @db - DB handle
245: * @posR - At position number, if db is unlimited grow (-1) write at last free record
246: * @rec - Record data
247: * return: -1 error or 0 ok
248: */
249: int pwd_writeAcct(struct tagAcctDB * __restrict db, unsigned int posR, void *rec);
250: /*
251: * pwd_readAcct() Read accounting record from aDat binary database
252: * @db - DB handle
253: * @posR - From position number
254: * @rec - Record data buffer
255: * @recsize - Record data buffer size
256: * return: -1 error or 0 ok
257: */
258: int pwd_readAcct(struct tagAcctDB * __restrict db, unsigned int posR, void *rec, int recsize);
259:
260: /*
261: * pwd_findAcct() Find accounting record from aDat binary database
262: * @db - DB handle
263: * @from - From position
264: * @to - To position, if 0 search to end-of-file
265: * @func - Check for match callback function
266: * @arg - Argument passthrough to callback as argument for search
267: * return: -1 error, 0 not found or >1 founded at position! (p.s:start from 1)
268: */
269: int64_t pwd_findAcct(struct tagAcctDB * __restrict db, unsigned int from, unsigned int to,
270: cb_acct_f func, void *arg);
271: #endif
272:
273:
274: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>