[UI]Remove mdm
[apps/core/preloaded/lockscreen.git] / src / password-verification.c
1 /*\r
2  * Copyright 2012  Samsung Electronics Co., Ltd\r
3  *\r
4  * Licensed under the Flora License, Version 1.0 (the License);\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  *  http://www.tizenopensource.org/license\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an AS IS BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  */\r
16 \r
17 #include <Elementary.h>\r
18 #include <sys/types.h>\r
19 #include <unistd.h>\r
20 #include <security-server.h>\r
21 #include <vconf.h>\r
22 #include <vconf-keys.h>\r
23 \r
24 #include "log.h"\r
25 #include "password-verification.h"\r
26 \r
27 typedef enum {\r
28         NORMAL_PASSWORD = 0,\r
29         EMPTY_PASSWORD,\r
30         OVERLENGTH_PASSWORD,\r
31 }lockscreen_password_type;\r
32 \r
33 typedef struct {\r
34         unsigned int current_attempt;\r
35         unsigned int max_attempt;\r
36         unsigned int expire_sec;\r
37         int recoverable;\r
38         password_operation_cb callback;\r
39         void *data;\r
40 } lockscreen_password_policy;\r
41 \r
42 static Eina_Bool __password_verification_check_phone_password(void *data, const char *str)\r
43 {\r
44         LOCK_SCREEN_TRACE_DBG("%s : %s\n", __FUNCTION__, str);\r
45 \r
46         lockscreen_password_policy *lock_policy = (lockscreen_password_policy *)data;\r
47 \r
48         int ret = SECURITY_SERVER_API_ERROR_PASSWORD_MISMATCH;\r
49 \r
50         unsigned int current_attempt = 0;\r
51         unsigned int max_attempt = 0;\r
52         unsigned int valid_secs = 0;\r
53 \r
54         if(!lock_policy) {\r
55                 LOCK_SCREEN_TRACE_DBG("lock_policy is NULL");\r
56                 return EINA_FALSE;\r
57         }\r
58 \r
59         ret = security_server_chk_pwd(str, &current_attempt, &max_attempt, &valid_secs);\r
60         LOCK_SCREEN_TRACE_DBG("security_server_chk_pwd => ret:%d current_attempt:%d max_attempt:%d valid_secs:%d",\r
61                 ret, current_attempt, max_attempt, valid_secs);\r
62         lock_policy->current_attempt = current_attempt;\r
63         lock_policy->max_attempt = max_attempt;\r
64         lock_policy->expire_sec = valid_secs;\r
65         if ((ret == SECURITY_SERVER_API_SUCCESS) || (ret == SECURITY_SERVER_API_ERROR_PASSWORD_EXPIRED)) {\r
66                 LOCK_SCREEN_TRACE_DBG("correct password!");\r
67                 return EINA_TRUE;\r
68         } else {\r
69                 LOCK_SCREEN_TRACE_DBG("incorrect password!");\r
70                 return EINA_FALSE;\r
71         }\r
72 }\r
73 \r
74 static lockscreen_password_type __password_verification_check_length(const char *str, int min, int max)\r
75 {\r
76         int len = 0;\r
77 \r
78         if (!str) {\r
79                 return EMPTY_PASSWORD;\r
80         }\r
81 \r
82         len = strlen(str);\r
83 \r
84         LOCK_SCREEN_TRACE_DBG("%s() len : %d", __FUNCTION__, len);\r
85 \r
86         if (len == 0) {\r
87                 return EMPTY_PASSWORD;\r
88         }\r
89 \r
90         if (len < min || len > max) {\r
91                 return OVERLENGTH_PASSWORD;\r
92         }\r
93 \r
94         return NORMAL_PASSWORD;\r
95 }\r
96 \r
97 void *password_verification_policy_create()\r
98 {\r
99         lockscreen_password_policy *password_policy = NULL;\r
100         int ret = 0;\r
101         unsigned int cur_attempt = 0;\r
102         unsigned int max_attempt = 0;\r
103         unsigned int expire_sec = 0;\r
104 \r
105         password_policy = (lockscreen_password_policy *) calloc(1, sizeof(lockscreen_password_policy));\r
106 \r
107         if (!password_policy){\r
108                 return NULL;\r
109         }\r
110 \r
111         ret = security_server_is_pwd_valid(&cur_attempt, &max_attempt, &expire_sec);\r
112         LOCK_SCREEN_TRACE_DBG("policy status:%d, cur_attempt:%d, max_attempt:%d ", ret, cur_attempt, max_attempt);\r
113 \r
114         if(ret == SECURITY_SERVER_API_ERROR_NO_PASSWORD) {\r
115                 password_policy->current_attempt = cur_attempt;\r
116                 password_policy->max_attempt = max_attempt;\r
117                 password_policy->recoverable = EINA_FALSE;\r
118                 password_policy->expire_sec = expire_sec;\r
119         }\r
120 \r
121         return password_policy;\r
122 }\r
123 \r
124 void password_verification_policy_destroy(void *data)\r
125 {\r
126         lockscreen_password_policy *password_policy = (lockscreen_password_policy *)data;\r
127 \r
128         if (!password_policy){\r
129                 return;\r
130         }\r
131 \r
132         free(password_policy);\r
133         password_policy = NULL;\r
134 }\r
135 \r
136 void password_verification_verify(void *data, const char *password)\r
137 {\r
138         lockscreen_password_type password_type = NORMAL_PASSWORD;\r
139         lockscreen_password_policy *password_policy = (lockscreen_password_policy *)data;\r
140 \r
141         if(!password_policy) {\r
142                 LOCK_SCREEN_TRACE_DBG("lock_policy is NULL");\r
143                 return;\r
144         }\r
145         password_type = __password_verification_check_length(password, 4, 16);\r
146         switch(password_type){\r
147                 case NORMAL_PASSWORD:\r
148                         if (__password_verification_check_phone_password(password_policy, password)) {\r
149                                 LOCK_SCREEN_TRACE_DBG("password is right!!!!");\r
150                                 elm_exit();\r
151                         } else {\r
152                                 if(password_policy->callback){\r
153                                         password_policy->callback("", password_policy->data);\r
154                                 }\r
155                         }\r
156                         break;\r
157                 case EMPTY_PASSWORD:\r
158                         password_policy->callback("empty", password_policy->data);\r
159                         break;\r
160                 case OVERLENGTH_PASSWORD:\r
161                         password_policy->callback("overlength", password_policy->data);\r
162                         break;\r
163         }\r
164 }\r
165 \r
166 void password_verification_callback_set(void *data, password_operation_cb callback, void *priv)\r
167 {\r
168         lockscreen_password_policy *password_policy = (lockscreen_password_policy *)data;\r
169 \r
170         if (!password_policy){\r
171                 return;\r
172         }\r
173 \r
174         password_policy->callback = callback;\r
175         password_policy->data = priv;\r
176 }\r