Choco OS  V.0.16.9.0
Join to the chocolate world
oc_userman.c
Go to the documentation of this file.
1 
27 #include <oc_userman.h>
28 #include <oc_null.h>
29 #include <oc_system_cfg.h>
30 #include <string.h>
31 
37 #define _________________________________________VARIABLES_SECTION__________________________________________________________________________
38 
39 static bool ModuleEnabledFlag = false;
40 static oC_List(oC_User_t) Users = NULL;
41 static const oC_Allocator_t Allocator = {
42  .Name = "user manager" ,
43 };
44 
45 #undef _________________________________________VARIABLES_SECTION__________________________________________________________________________
46 
47 
53 #define _________________________________________INTERFACE_FUNCTIONS_SECTION________________________________________________________________
54 
55 //==========================================================================================================================================
56 //==========================================================================================================================================
57 oC_ErrorCode_t oC_UserMan_TurnOn( void )
58 {
59  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
60 
61  if(oC_AssignErrorCodeIfFalse(&errorCode , ModuleEnabledFlag == false , oC_ErrorCode_ModuleIsTurnedOn))
62  {
63  Users = oC_List_New(&Allocator,AllocationFlags_NoWait);
64 
65  if(Users)
66  {
67  ModuleEnabledFlag = true;
68  errorCode = oC_ErrorCode_None;
69  oC_User_t root = oC_User_New(&Allocator , AllocationFlags_NoWait , "root" , CFG_STRING_ROOT_PASSWORD , oC_User_Permissions_Root );
70 
71  if(root)
72  {
73  bool added = oC_List_PushBack(Users,root,&Allocator);
74  oC_AssignErrorCodeIfFalse(&errorCode,added,oC_ErrorCode_CannotAddObjectToList);
75  }
76  else
77  {
78  errorCode = oC_ErrorCode_AllocationError;
79  }
80 
81  }
82  else
83  {
84  errorCode = oC_ErrorCode_AllocationError;
85  }
86  }
87 
88  return errorCode;
89 }
90 
91 //==========================================================================================================================================
92 //==========================================================================================================================================
93 oC_ErrorCode_t oC_UserMan_TurnOff( void )
94 {
95  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
96 
97  if(oC_AssignErrorCodeIfFalse(&errorCode , ModuleEnabledFlag == true , oC_ErrorCode_ModuleNotStartedYet))
98  {
99  ModuleEnabledFlag = false;
100  errorCode = oC_ErrorCode_None;
101 
102  oC_List_Foreach(Users,user)
103  {
104  if(oC_User_Delete(&user)==false)
105  {
106  errorCode = oC_ErrorCode_CannotDeleteObject;
107  }
108  }
109  if(oC_List_Delete(Users,AllocationFlags_CanWaitForever) == false)
110  {
111  errorCode = oC_ErrorCode_ReleaseError;
112  }
113  }
114 
115  return errorCode;
116 }
117 
118 //==========================================================================================================================================
119 //==========================================================================================================================================
120 oC_ErrorCode_t oC_UserMan_AddUser( oC_User_t User )
121 {
122  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
123 
124  if(
125  ErrorCondition( ModuleEnabledFlag == true , oC_ErrorCode_ModuleNotStartedYet) &&
126  ErrorCondition( oC_User_IsCorrect(User) , oC_ErrorCode_ObjectNotCorrect ) &&
127  ErrorCondition( !List_Contains((oC_List_t)Users, &User, sizeof(oC_User_t)) , oC_ErrorCode_UserExists ) &&
128  ErrorCondition( iscurroot() || !oC_User_IsRoot(User) , oC_ErrorCode_PermissionDenied ) &&
129  ErrorCondition( 0 != strcmp(oC_User_GetName(User) , "unknown") , oC_ErrorCode_InvalidUserName )
130  )
131  {
132  bool added = oC_List_PushBack(Users, User, &Allocator);
133 
134  if(added)
135  {
136  errorCode = oC_ErrorCode_None;
137  }
138  else
139  {
140  errorCode = oC_ErrorCode_CannotAddObjectToList;
141  }
142  }
143 
144  return errorCode;
145 }
146 
147 //==========================================================================================================================================
148 //==========================================================================================================================================
149 oC_ErrorCode_t oC_UserMan_CreateAndAddUser( const char * Name, const char * Password, oC_User_Permissions_t Permissions )
150 {
151  oC_User_t user = oC_User_New(&Allocator , AllocationFlags_CanWait1Second , Name , Password , Permissions );
152  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
153 
154  if( user == NULL )
155  {
156  errorCode = oC_ErrorCode_WrongParameters;
157  }
158  else
159  {
160  errorCode = oC_UserMan_AddUser(user);
161  }
162 
163  if(oC_ErrorOccur(errorCode) && user != NULL)
164  {
165  oC_User_Delete(&user);
166  }
167 
168  return errorCode;
169 }
170 
171 //==========================================================================================================================================
172 //==========================================================================================================================================
173 oC_ErrorCode_t oC_UserMan_RemoveUser( oC_User_t User )
174 {
175  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
176 
177  if(
178  ErrorCondition( ModuleEnabledFlag == true , oC_ErrorCode_ModuleNotStartedYet) &&
179  ErrorCondition( oC_User_IsCorrect(User) , oC_ErrorCode_ObjectNotCorrect) &&
180  ErrorCondition( User != getcuruser() , oC_ErrorCode_UserInUse) &&
181  ErrorCondition( !oC_User_IsRoot(User) , oC_ErrorCode_CannotRemoveRoot) &&
182  ErrorCondition( oC_User_CheckPermissions(getcuruser(), oC_User_GetPermissions(User)) , oC_ErrorCode_PermissionDenied) &&
183  ErrorCondition( List_Contains((oC_List_t)Users, &User, sizeof(oC_User_t)) , oC_ErrorCode_UserNotExists)
184  )
185  {
186  bool removed = oC_List_RemoveAll(Users,User);
187 
188  if(removed)
189  {
190  errorCode = oC_ErrorCode_None;
191  }
192  else
193  {
194  errorCode = oC_ErrorCode_CannotRemoveObjectFromList;
195  }
196  }
197 
198  return errorCode;
199 }
200 
201 //==========================================================================================================================================
202 //==========================================================================================================================================
203 oC_List(oC_User_t) oC_UserMan_GetList( void )
204 {
205  return Users;
206 }
207 
208 //==========================================================================================================================================
209 //==========================================================================================================================================
210 oC_User_t oC_UserMan_GetRootUser( void )
211 {
212  oC_User_t root = NULL;
213 
215  {
216  oC_List_Foreach(Users,user)
217  {
218  if(oC_User_IsRoot(user))
219  {
220  root = user;
221  }
222  }
223  }
224 
225  return root;
226 }
227 
228 //==========================================================================================================================================
229 //==========================================================================================================================================
230 oC_User_t oC_UserMan_GetUser( const char * Name )
231 {
232  oC_User_t userToReturn = NULL;
233 
234  if(ModuleEnabledFlag && isaddresscorrect(Name))
235  {
236  oC_List_Foreach(Users,user)
237  {
238  if(strcmp(oC_User_GetName(user),Name)==0)
239  {
240  userToReturn = user;
241  break;
242  }
243  }
244  }
245 
246  return userToReturn;
247 }
248 
249 //==========================================================================================================================================
250 //==========================================================================================================================================
251 oC_ErrorCode_t oC_UserMan_Rename( oC_User_t User , const char * NewName )
252 {
253  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
254 
255  if(
256  ErrorCondition( ModuleEnabledFlag == true , oC_ErrorCode_ModuleNotStartedYet) &&
257  ErrorCondition( oC_User_IsCorrect(User) , oC_ErrorCode_ObjectNotCorrect) &&
258  ErrorCondition( User != getcuruser() , oC_ErrorCode_UserInUse) &&
259  ErrorCondition( !oC_User_IsRoot(User) , oC_ErrorCode_PermissionDenied) &&
260  ErrorCondition( oC_User_CheckPermissions(getcuruser(), oC_User_GetPermissions(User)) , oC_ErrorCode_PermissionDenied ) &&
261  ErrorCondition( List_Contains((oC_List_t)Users, &User, sizeof(oC_User_t)) , oC_ErrorCode_UserNotExists) &&
262  ErrorCondition( isaddresscorrect(NewName) , oC_ErrorCode_InvalidUserName) &&
263  ErrorCondition( 0 != strcmp(oC_User_GetName(User), "root") , oC_ErrorCode_PermissionDenied) &&
264  ErrorCondition( 0 != strcmp(NewName , "root") , oC_ErrorCode_PermissionDenied) &&
265  ErrorCondition( 0 != strcmp(NewName , "unknown") , oC_ErrorCode_InvalidUserName)
266  )
267  {
268  if(oC_User_Rename(User, NewName))
269  {
270  errorCode = oC_ErrorCode_None;
271  }
272  else
273  {
274  errorCode = oC_ErrorCode_CannotRenameUser;
275  }
276  }
277 
278  return errorCode;
279 }
280 
281 
282 #undef _________________________________________INTERFACE_FUNCTIONS_SECTION________________________________________________________________
Definition: oc_list.h:63
static bool ModuleEnabledFlag
Definition: oc_memman.c:211
const char * Name
Definition: oc_stdlib.h:161
identifier for allocations
Definition: oc_stdlib.h:159
File with interface for user system manager.
Definition: oc_user.c:43
Definition of the null pointer.
static const oC_Allocator_t Allocator
Definition: oc_eth.c:152
#define NULL
pointer to a zero
Definition: oc_null.h:37