2 * Copyright 2012 Samsung Electronics Co., Ltd
\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
8 * http://www.tizenopensource.org/license
\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
17 #include <Elementary.h>
\r
18 #include <sys/types.h>
\r
20 #include <security-server.h>
\r
22 #include <vconf-keys.h>
\r
25 #include "password-verification.h"
\r
28 NORMAL_PASSWORD = 0,
\r
30 OVERLENGTH_PASSWORD,
\r
31 }lockscreen_password_type;
\r
34 unsigned int current_attempt;
\r
35 unsigned int max_attempt;
\r
36 unsigned int expire_sec;
\r
38 password_operation_cb callback;
\r
40 } lockscreen_password_policy;
\r
42 static Eina_Bool __password_verification_check_phone_password(void *data, const char *str)
\r
44 LOCK_SCREEN_TRACE_DBG("%s : %s\n", __FUNCTION__, str);
\r
46 lockscreen_password_policy *lock_policy = (lockscreen_password_policy *)data;
\r
48 int ret = SECURITY_SERVER_API_ERROR_PASSWORD_MISMATCH;
\r
50 unsigned int current_attempt = 0;
\r
51 unsigned int max_attempt = 0;
\r
52 unsigned int valid_secs = 0;
\r
55 LOCK_SCREEN_TRACE_DBG("lock_policy is NULL");
\r
59 ret = security_server_chk_pwd(str, ¤t_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
69 LOCK_SCREEN_TRACE_DBG("incorrect password!");
\r
74 static lockscreen_password_type __password_verification_check_length(const char *str, int min, int max)
\r
79 return EMPTY_PASSWORD;
\r
84 LOCK_SCREEN_TRACE_DBG("%s() len : %d", __FUNCTION__, len);
\r
87 return EMPTY_PASSWORD;
\r
90 if (len < min || len > max) {
\r
91 return OVERLENGTH_PASSWORD;
\r
94 return NORMAL_PASSWORD;
\r
97 void *password_verification_policy_create()
\r
99 lockscreen_password_policy *password_policy = NULL;
\r
101 unsigned int cur_attempt = 0;
\r
102 unsigned int max_attempt = 0;
\r
103 unsigned int expire_sec = 0;
\r
105 password_policy = (lockscreen_password_policy *) calloc(1, sizeof(lockscreen_password_policy));
\r
107 if (!password_policy){
\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
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
121 return password_policy;
\r
124 void password_verification_policy_destroy(void *data)
\r
126 lockscreen_password_policy *password_policy = (lockscreen_password_policy *)data;
\r
128 if (!password_policy){
\r
132 free(password_policy);
\r
133 password_policy = NULL;
\r
136 void password_verification_verify(void *data, const char *password)
\r
138 lockscreen_password_type password_type = NORMAL_PASSWORD;
\r
139 lockscreen_password_policy *password_policy = (lockscreen_password_policy *)data;
\r
141 if(!password_policy) {
\r
142 LOCK_SCREEN_TRACE_DBG("lock_policy is NULL");
\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
152 if(password_policy->callback){
\r
153 password_policy->callback("", password_policy->data);
\r
157 case EMPTY_PASSWORD:
\r
158 password_policy->callback("empty", password_policy->data);
\r
160 case OVERLENGTH_PASSWORD:
\r
161 password_policy->callback("overlength", password_policy->data);
\r
166 void password_verification_callback_set(void *data, password_operation_cb callback, void *priv)
\r
168 lockscreen_password_policy *password_policy = (lockscreen_password_policy *)data;
\r
170 if (!password_policy){
\r
174 password_policy->callback = callback;
\r
175 password_policy->data = priv;
\r