Choco OS  V.0.16.9.0
Join to the chocolate world
oc_user.c
1 
27 #include <oc_user.h>
28 #include <oc_stdlib.h>
29 #include <oc_object.h>
30 #include <oc_md5.h>
31 #include <string.h>
32 #include <oc_memman.h>
33 #include <oc_system.h>
34 #include <oc_system_cfg.h>
35 
41 #define _________________________________________TYPES_SECTION______________________________________________________________________________
42 
43 struct User_t
44 {
45  oC_ObjectControl_t ObjectControl;
46  oC_User_Permissions_t Permissions;
47  char Name[CFG_UINT8_MAX_LOGIN_LENGTH];
48  char Password[CFG_UINT8_MAX_PASSWORD_LENGTH];
49 };
50 
51 #undef _________________________________________TYPES_SECTION______________________________________________________________________________
52 
58 #define _________________________________________FUNCTIONS_SECTION__________________________________________________________________________
59 
60 //==========================================================================================================================================
61 //==========================================================================================================================================
62 oC_User_t oC_User_New( Allocator_t Allocator , AllocationFlags_t Flags , const char * Name , const char * Password , oC_User_Permissions_t Permissions )
63 {
64  oC_User_t user = NULL;
65 
67  {
68  user = kmalloc(sizeof(struct User_t) , Allocator , Flags);
69 
70  if(user)
71  {
72  user->ObjectControl = oC_CountObjectControl(user,oC_ObjectId_User );
73  user->Permissions = Permissions;
74  strncpy(user->Password , md5(Password) , CFG_UINT8_MAX_PASSWORD_LENGTH);
75  strncpy(user->Name , Name , CFG_UINT8_MAX_LOGIN_LENGTH);
76  }
77  }
78 
79  return user;
80 }
81 
82 //==========================================================================================================================================
83 //==========================================================================================================================================
84 bool oC_User_Delete( oC_User_t * User )
85 {
86  bool deleted = false;
87 
88  if(isram(User) && oC_User_IsCorrect(*User))
89  {
90  (*User)->ObjectControl = 0;
91 
92  if(kfree(*User,AllocationFlags_CanWaitForever))
93  {
94  deleted = true;
95  *User = NULL;
96  }
97  }
98 
99  return deleted;
100 }
101 
102 //==========================================================================================================================================
103 //==========================================================================================================================================
104 bool oC_User_IsCorrect( oC_User_t User )
105 {
106  return isram(User) && oC_CheckObjectControl(User,oC_ObjectId_User,User->ObjectControl);
107 }
108 
109 //==========================================================================================================================================
110 //==========================================================================================================================================
111 const char * oC_User_GetName( oC_User_t User )
112 {
113  const char * name = "unknown";
114 
115  if(oC_User_IsCorrect(User))
116  {
117  name = User->Name;
118  }
119 
120  return name;
121 }
122 
123 //==========================================================================================================================================
124 //==========================================================================================================================================
125 bool oC_User_Rename( oC_User_t User , const char * NewName )
126 {
127  bool result = false;
128 
129  if(oC_User_IsCorrect(User) &&
130  !oC_User_IsRoot(User) &&
131  isaddresscorrect(NewName)&&
132  oC_User_CheckPermissions(getcuruser(), User->Permissions)
133  )
134  {
135  strncpy(User->Name, NewName, CFG_UINT8_MAX_LOGIN_LENGTH);
136  result = true;
137  }
138 
139  return result;
140 }
141 
142 //==========================================================================================================================================
143 //==========================================================================================================================================
144 bool oC_User_CheckPassword( oC_User_t User , const char * Password )
145 {
146  bool correct = false;
147 
148  if(oC_User_IsCorrect(User) && strcmp(md5(Password),User->Password) == 0)
149  {
150  correct = true;
151  }
152 
153  return correct;
154 }
155 
156 //==========================================================================================================================================
157 //==========================================================================================================================================
158 bool oC_User_CheckPermissions( oC_User_t User , oC_User_Permissions_t Permissions )
159 {
160  bool correct = false;
161 
162  if(oC_User_IsCorrect(User) &&
163  (Permissions & ~User->Permissions) == 0 )
164  {
165  correct = true;
166  }
167 
168  return correct;
169 }
170 
171 //==========================================================================================================================================
172 //==========================================================================================================================================
173 oC_User_Permissions_t oC_User_GetPermissions( oC_User_t User)
174 {
175  oC_User_Permissions_t permissions = 0;
176 
177  if(oC_User_IsCorrect(User))
178  {
179  permissions = User->Permissions;
180  }
181 
182  return permissions;
183 }
184 
185 //==========================================================================================================================================
186 //==========================================================================================================================================
187 bool oC_User_ModifyPermissions( oC_User_t User , oC_User_Permissions_t Permissions )
188 {
189  bool result = false;
190 
191  if(oC_User_IsCorrect(User) &&
192  0 != strcmp(User->Name, "root") &&
193  oC_User_CheckPermissions(getcuruser(), Permissions) &&
194  !oC_User_IsRoot(User)
195  )
196  {
197  User->Permissions = Permissions;
198  result = true;
199  }
200 
201  return result;
202 }
203 
204 //==========================================================================================================================================
205 //==========================================================================================================================================
206 bool oC_User_IsRoot( oC_User_t User)
207 {
208  return 0 == strcmp(oC_User_GetName(User), "root");
209 }
210 
211 #undef _________________________________________FUNCTIONS_SECTION__________________________________________________________________________
212 
FILE__DESCRIPTION
identifier for allocations
Definition: oc_stdlib.h:159
Definition: oc_user.c:43
The file with helper macros for managing objects.
bool oC_MemMan_IsAddressCorrect(const void *Address)
checks if address is correct - in RAM or in FLASH
Definition: oc_memman.c:1577
uint32_t oC_ObjectControl_t
stores object control value
Definition: oc_object.h:141
The file with interface for user system.
static oC_ObjectControl_t oC_CountObjectControl(void *ObjectPointer, oC_ObjectId_t ObjectId)
counts object control for object
Definition: oc_object.h:168
static bool oC_CheckObjectControl(void *ObjectPointer, oC_ObjectId_t ObjectId, oC_ObjectControl_t ObjectControl)
checks if object control is correct
Definition: oc_object.h:203
The file with memory manager interface.
FILE__DESCRIPTION
static const oC_Allocator_t Allocator
Definition: oc_eth.c:152
#define NULL
pointer to a zero
Definition: oc_null.h:37