Annotation of libaitcfg/inc/aitpwd.h, revision 1.1.2.3
1.1.2.1 misho 1: /*************************************************************************
2: * (C) 2010 AITNET ltd - Sofia/Bulgaria - <misho@aitbg.com>
3: * by Michael Pounov <misho@openbsd-bg.org>
4: *
5: * $Author: misho $
1.1.2.3 ! misho 6: * $Id: aitpwd.h,v 1.1.2.2 2012/09/18 08:44:19 misho Exp $
1.1.2.1 misho 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 {
1.1.2.3 ! misho 74: int usr_fields;
! 75:
1.1.2.1 misho 76: ait_val_t usr_name;
77: ait_val_t usr_pass;
78: ait_val_t usr_uid;
79: ait_val_t usr_gid;
80: ait_val_t usr_class;
81: ait_val_t usr_change;
82: ait_val_t usr_expire;
83: ait_val_t usr_realm;
84: ait_val_t usr_home;
85: ait_val_t usr_shell;
86:
1.1.2.3 ! misho 87: SLIST_ENTRY(tagUser) usr_next;
! 88: RB_ENTRY(tagUser) usr_node;
1.1.2.1 misho 89: };
1.1.2.2 misho 90: typedef struct tagPWD {
91: pthread_mutex_t pwd_mtx;
1.1.2.1 misho 92:
1.1.2.2 misho 93: struct tagUser *slh_first;
94: struct tagUser *rbh_root;
95: } pwd_root_t;
96: #define PWD_LOCK(x) pthread_mutex_lock(&(x)->pwd_mtx)
97: #define PWD_UNLOCK(x) pthread_mutex_unlock(&(x)->pwd_mtx)
98:
99: #define PWD_ISEMPTY(x) RB_EMPTY((x))
1.1.2.1 misho 100:
101: typedef enum { ALL = -1,
102: Username,
103: Password,
104: UID,
105: GID,
106: Class,
107: Change,
108: Expire,
109: Realm,
110: Home,
111: Shell
112: } passwd_attr_t;
113:
114:
115: /*
1.1.2.2 misho 116: * cfgInitPasswd() - Init password root
117: *
118: * @pwd = Password root
119: * return: -1 error or 0 ok
120: */
121: int cfgInitPasswd(pwd_root_t * __restrict pwd);
1.1.2.1 misho 122: /*
1.1.2.2 misho 123: * cfgLoadPasswd() - Load passwords from file
124: *
125: * @pwdName = Passwords filename
126: * @pwd = Password root
127: * return: -1 error or 0 ok
128: */
129: int cfgLoadPasswd(const char *pwdName, pwd_root_t * __restrict pwd);
1.1.2.1 misho 130: /*
1.1.2.2 misho 131: * cfgClearPasswd() - Clear passwords and free resources
132: *
133: * @cfg = Password root
134: * return: none
135: */
136: void cfgClearPasswd(pwd_root_t * __restrict pwd);
137: /*
138: * cfgUnloadPasswd() - Unload passwords from memory and destroy resources
139: *
140: * @pwd = Password root
141: * return: none
142: */
143: void cfgUnloadPasswd(pwd_root_t * __restrict pwd);
144: /*
145: * cfgCreatePasswd() - Create password file from memory
146: *
147: * @pwdName = New password filename
148: * @pwd = Password root
149: * return: -1 error or 0 ok
150: */
151: int cfgCreatePasswd(const char *pwdName, pwd_root_t * __restrict pwd);
1.1.2.1 misho 152:
1.1.2.3 ! misho 153: /*
! 154: * cfgReadPasswd() - Read file and add new item at password root
! 155: *
! 156: * @f = File resource
! 157: * @pwd = Password root
! 158: * return: -1 error or 0 ok
! 159: */
! 160: int cfgReadPasswd(FILE *f, pwd_root_t * __restrict pwd);
! 161: /*
! 162: * cfgWritePasswd() - Write passwords from memory
! 163: *
! 164: * @f = File handle
! 165: * @pwd = Password root
! 166: * return: -1 error or 0 ok
! 167: */
! 168: int cfgWritePasswd(FILE *f, pwd_root_t * __restrict pwd);
! 169:
1.1.2.2 misho 170: #if 0
1.1.2.1 misho 171: /*
172: * ReadPasswd() Read from file and add new item to user array
173: * @f = file resource
174: * @ppwd = User array
175: * return: 0 ok; -1 error:: can`t allocate memory
176: */
177: int ReadPasswd(FILE *f, passwd_t * __restrict ppwd);
178: /*
179: * WritePasswd() Write to file from items in array
180: * @f = file resource
181: * @ppwd = User array
182: * return: 0 ok; -1 error:: can`t write to file
183: */
184: int WritePasswd(FILE *f, passwd_t * __restrict ppwd);
185:
186:
187: /*
188: * pwdCleanStr() Free strings in passwd_t value
189: * @pwd = User object
190: * return: none
191: */
192: inline void pwdCleanStr(passwd_t __restrict pwd);
193: /*
194: * pwdFreeValue() Free passwd_t value
195: * @ppwd = User object
196: * @idx = Index of attribute, if ALL == idx is free all structure
197: * return: 0 ok, -1 error
198: */
199: inline int pwdFreeValue(passwd_t * __restrict ppwd, passwd_attr_t idx);
200: /*
201: * pwdSetValue() Set passwd_t value
202: * @ppwd = User object
203: * @idx = Index of attribute, if ALL == idx clean User object and set username!
204: * @Value = Value to set
205: * return: number of fields in passwd_t; -1 error:: can`t set passwd_t
206: */
207: inline int pwdSetValue(passwd_t * __restrict ppwd, passwd_attr_t idx, unsigned char *Value);
208: /*
209: * pwdGetValue() Get passwd_t value
210: * @pwd = User object
211: * @idx = Index of attribute, if ALL == idx is error!
212: * @Value = Value to get
213: * @valLen = Size of Value string
214: * return: number of fields in passwd_t; -1 error:: can`t get passwd_t
215: */
216: inline int pwdGetValue(passwd_t __restrict pwd, passwd_attr_t idx, unsigned char *Value, int valLen);
217:
218:
219: /*
220: * pwd_FindAttribute() Find by attribute position in user array
221: * @pwd = User array
222: * @idx = Index of attribute, if ALL == idx return number of user array elements
223: * @csAttr = User attribute
224: * return: 0 not found item; -1 error: null parameters; >0 position in array + 1
225: */
226: inline int pwd_FindAttribute(passwd_t __restrict pwd, passwd_attr_t idx, const unsigned char *csAttr);
227: /*
228: * pwd_SetAttribute() Set user in array or add new user if not exists
229: * @ppwd = User array
230: * @idx = Index of attribute to set
231: * @val = User structure for setup
232: * return: 0 nothing changed, -1 error: not enough memory; 1 find and update item; 2 added new item
233: */
234: int pwd_SetAttribute(passwd_t * __restrict ppwd, passwd_attr_t idx, passwd_t val);
235: /*
236: * pwd_GetAttribute() Get user from array, set username in val
237: * @pwd = User array
238: * @idx = Index of attribute to get, if idx == ALL return full element items
239: * @val = User structure
240: * return: 0 not found, -1 error; >0 found at position in array + 1
241: */
242: int pwd_GetAttribute(passwd_t __restrict pwd, passwd_attr_t idx, passwd_t val);
243: /*
244: * pwd_UnsetAttribute() Unset user from array and free resources!
245: * @ppwd = User array
246: * @idx = Index of attribute to unset, if idx == ALL unset(delete) all items in element
247: * @val = User structure
248: * return: 0 item not found, -1 error: null parameters; >0 number of elements leave in array
249: */
250: int pwd_UnsetAttribute(passwd_t * __restrict ppwd, passwd_attr_t idx, passwd_t val);
251: /*
252: * pwd_Authenticate() Authenticate user, set username and password in val
253: * @pwd = User array
254: * @val = User structure for authenticate, set username & password
255: after authentication fill other fields if exists
256: * return: 0 not found, -1 error; >0 found at position in array + 1
257: */
258: int pwd_Authenticate(passwd_t __restrict pwd, passwd_t val);
259:
260:
261: /*
262: * pwd_openAcct() Open accounting aDat binary database
263: * @csName - DB name
264: * @minR - Minimum records in database
265: * @maxR - Maximum records in database(round-robin db), if 0 unlimited grow
266: * @recSize - Size of record element
267: * @wrapR - If maxR >0 give ability to wrap round-robin db
268: * return: NULL error or !=NULL opened db handle
269: */
270: struct tagAcctDB *pwd_openAcct(const char *csName, unsigned int minR, unsigned int maxR,
271: size_t recSize, unsigned char wrapR);
272: /*
273: * pwd_closeAcct() Close accounting aDat binary database
274: * @db - DB handle
275: * return: none
276: */
277: void pwd_closeAcct(struct tagAcctDB ** __restrict db);
278: /*
279: * pwd_writeAcct() Write accounting record to aDat binary database
280: * @db - DB handle
281: * @posR - At position number, if db is unlimited grow (-1) write at last free record
282: * @rec - Record data
283: * return: -1 error or 0 ok
284: */
285: int pwd_writeAcct(struct tagAcctDB * __restrict db, unsigned int posR, void *rec);
286: /*
287: * pwd_readAcct() Read accounting record from aDat binary database
288: * @db - DB handle
289: * @posR - From position number
290: * @rec - Record data buffer
291: * @recsize - Record data buffer size
292: * return: -1 error or 0 ok
293: */
294: int pwd_readAcct(struct tagAcctDB * __restrict db, unsigned int posR, void *rec, int recsize);
295:
296: /*
297: * pwd_findAcct() Find accounting record from aDat binary database
298: * @db - DB handle
299: * @from - From position
300: * @to - To position, if 0 search to end-of-file
301: * @func - Check for match callback function
302: * @arg - Argument passthrough to callback as argument for search
303: * return: -1 error, 0 not found or >1 founded at position! (p.s:start from 1)
304: */
305: int64_t pwd_findAcct(struct tagAcctDB * __restrict db, unsigned int from, unsigned int to,
306: cb_acct_f func, void *arg);
307: #endif
308:
309:
310: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>