| User * getMySQLUser(char * user, DB * db)␊ |
| {␊ |
| ␉char q[512];␊ |
| char q2[512];␊ |
| ␉int strp = 0;␊ |
| ␉MYSQL_RES *result;␊ |
| ␉MYSQL_ROW row;␊ |
|
| ␉strp += strlen(db->dbtable);␊ |
| ␉strncpy(q + strp, " WHERE login = '", 16);␊ |
| ␉strp += 16;␊ |
| ␉strncpy(q + strp, user, strlen(user));␊ |
| ␉strp += strlen(user);␊ |
| ␉mysql_real_escape_string(con, q2, user, strlen(user));␊ |
| ␉strncpy(q + strp, q2, strlen(q2));␊ |
| ␉strp += strlen(q2);␊ |
| ␉strncpy(q + strp, "' LIMIT 1", 9);␊ |
| ␉if (mysql_query(con, q))␊ |
| ␉if (mysql_query(con, q) > 0)␊ |
| ␉{␊ |
| ␉␉mysql_close(con);␊ |
| ␉␉free(u);␊ |
| ␉␉return NULL;␊ |
| ␉}␊ |
| ␊ |
| ␉result = mysql_store_result(con);␊ |
| ␉␊ |
| ␉if (result == 0)␊ |
| ␉{␊ |
| ␉␉mysql_close(con);␊ |
| ␉␉free(u);␊ |
| ␉␉return NULL;␊ |
| ␉}␉␊ |
| ␉row = mysql_fetch_row(result);␊ |
| ␊ |
| ␉u->user = user;␊ |
| ␉u->password = row[0];␊ |
| ␉if (row != NULL)␊ |
| ␉{␊ |
| ␉␉u->user = user;␊ |
| ␉␉u->password = row[0];␊ |
| ␉} else {␊ |
| ␉␉mysql_free_result(result);␊ |
| ␉␉mysql_close(con);␊ |
| free(u);␊ |
| ␉␉return NULL;␊ |
| ␉}␊ |
| ␉if (strcmp(row[1], "") != 0)␊ |
| ␉␉u->otp = row[1];␊ |
| ␊ |
|
| ␉int ik = 0;␊ |
| ␉int i;␊ |
| ␉int nibs[2];␊ |
| ␉int retcode = 1;␊ |
| ␉char buf10[256];␊ |
| ␉char buf16[256];␊ |
| ␉time_t now = time(NULL);␊ |
|
| ␉//db = readConfig(getenv("OTPCONFIG"));␊ |
| ␉db = readConfig("/etc/apache2/configotp");␊ |
| ␉user = getMySQLUser(user_name, db);␊ |
| ␉if (user == NULL)␊ |
| ␉{␊ |
| ␉␉free(db);␊ |
| exit(1);␊ |
| ␉}␊ |
| ␉// if user does not have a OTP set - just verify password␊ |
| ␉if (user->otp == NULL) ␊ |
| ␉{␊ |
| ␉␉hash("SHA1", user_passwd, strlen(user_passwd), outHash);␊ |
| ␉␉ret = b64encode(outHash, 20);␊ |
| ␉␉if (strcmp(ret, user->password) == 0)␊ |
| ␉␉␉exit(0);␊ |
| ␉␉␉retcode = 0;␊ |
| ␉␉else␊ |
| ␉␉␉exit(1);␊ |
| ␉␉␉retcode = 1;␊ |
| ␉␉free(db);␊ |
| free(user);␊ |
| ␉␉exit(retcode);␊ |
| ␉} else {␊ |
| ␉␉// password should be in the form {OTP}{PASSWORD}␊ |
| ␉␉// ie 123456password␊ |
| ␉␉if (strlen(user_passwd) < 7) // 6 OTP digits and 1 char for password␊ |
| ␉␉{␊ |
| ␉␉␉printf("password not long enough!");␊ |
| ␉␉␉free(db);␊ |
| ␉␉␉free(user);␊ |
| ␉␉␉exit(1);␊ |
| ␉␉}␊ |
| ␉␉for(keylen = 0; keylen < sizeof(newkey) && user->otp[ik] != '\0'; keylen++)␊ |
|
| ␉␉ret2 = b64encode(outHash, 20);␊ |
| ␉␉if (strcmp(ret2, user->password) == 0 && strcmp(buf10, inotp) == 0)␊ |
| ␉␉{␊ |
| ␉␉␉free(user);␊ |
| ␉␉␉free(db);␊ |
| ␉␉␉exit(0);␊ |
| ␉␉} else {␊ |
| ␉␉␉free(user);␊ |
| ␉␉␉free(db);␊ |
| ␉␉␉exit(1);␊ |
| ␉␉}␊ |
| ␉}␊ |