Mercurial > hg > rlgwebd
comparison sqlickrypt.c @ 18:59ea628abb81
sqlickrypt.c: add the ability to register new users.
When sqlickrypt is run with the option "register", it expects a
username, password, and email, and adds them to the database if the
username is not already in use.
author | John "Elwin" Edwards <elwin@sdf.org> |
---|---|
date | Mon, 21 May 2012 21:40:56 -0700 |
parents | d3e3d6b4016b |
children | 9d5da43c0e83 |
comparison
equal
deleted
inserted
replaced
17:d3e3d6b4016b | 18:59ea628abb81 |
---|---|
5 #include <sqlite3.h> | 5 #include <sqlite3.h> |
6 #include <unistd.h> | 6 #include <unistd.h> |
7 #include <crypt.h> | 7 #include <crypt.h> |
8 | 8 |
9 #define DATABASE "/dgldir/dgamelaunch.db" | 9 #define DATABASE "/dgldir/dgamelaunch.db" |
10 #define IBUFSIZE 200 | |
10 | 11 |
11 int xcallback(void *targ, int ncols, char **vals, char **colnames) { | 12 int xcallback(void *targ, int ncols, char **vals, char **colnames) { |
12 char *pws; | 13 char *pws; |
13 int j; | 14 int j; |
14 pws = *((char **) targ); | 15 pws = *((char **) targ); |
20 } | 21 } |
21 /* Otherwise, this isn't the first row. */ | 22 /* Otherwise, this isn't the first row. */ |
22 return 0; | 23 return 0; |
23 } | 24 } |
24 | 25 |
25 int main(int argc, char *argv[]) { | 26 /* Simple callback, for checking if there are any matches. */ |
26 char ibuf[160], *uname, *pw, *pwhash = NULL, *comphash; | 27 int searchcallback(void *targ, int ncols, char **vals, char **colnames) { |
28 *((int *) targ) = 1; | |
29 return 0; | |
30 } | |
31 | |
32 int check(char *uname, char *pw) { | |
27 char finduser_sql[160]; | 33 char finduser_sql[160]; |
28 char *cptr; // Utility pointer | 34 char *pwhash = NULL, *comphash; |
35 int status; | |
29 sqlite3 *db; | 36 sqlite3 *db; |
30 int status; | |
31 | 37 |
32 /* Read in the username and password */ | |
33 fgets(ibuf, 160, stdin); | |
34 uname = ibuf; | |
35 pw = strchr(uname, '\n'); | |
36 if (pw == NULL) | |
37 exit(4); /* Truncated */ | |
38 *pw = '\0'; | |
39 pw++; | |
40 fgets(pw, 160 - (pw - ibuf), stdin); | |
41 if (pw[strlen(pw) - 1] == '\n') | |
42 pw[strlen(pw) - 1] = '\0'; | |
43 else | |
44 exit(4); /* Truncated */ | |
45 /* Sanitize the username, because it gets put into a query. */ | |
46 for (cptr = uname; *cptr != '\0'; cptr++) { | |
47 if (!isalnum(*cptr)) { | |
48 exit(4); | |
49 } | |
50 } | |
51 /* Construct the query */ | |
52 strcpy(finduser_sql, "SELECT * FROM dglusers WHERE username='"); | 38 strcpy(finduser_sql, "SELECT * FROM dglusers WHERE username='"); |
53 strncat(finduser_sql, uname, 40); | 39 strncat(finduser_sql, uname, 40); |
54 strcat(finduser_sql, "';"); | 40 strcat(finduser_sql, "';"); |
55 | 41 |
56 status = sqlite3_open(DATABASE, &db); | 42 status = sqlite3_open(DATABASE, &db); |
59 return 1; | 45 return 1; |
60 } | 46 } |
61 sqlite3_exec(db, finduser_sql, xcallback, (void *) &pwhash, NULL); | 47 sqlite3_exec(db, finduser_sql, xcallback, (void *) &pwhash, NULL); |
62 | 48 |
63 sqlite3_close(db); | 49 sqlite3_close(db); |
64 | |
65 /* Now check the password. */ | 50 /* Now check the password. */ |
66 if (pwhash == NULL) { | 51 if (pwhash == NULL) { |
67 return 2; | 52 return 2; |
68 } | 53 } |
69 comphash = crypt(pw, pwhash); | 54 comphash = crypt(pw, pwhash); |
70 if (!strcmp(pwhash, comphash)) | 55 if (!strcmp(pwhash, comphash)) |
71 return 0; | 56 return 0; |
72 return 1; | 57 return 1; |
73 } | 58 } |
59 | |
60 int insertuser(char *uname, char *pw, char *email) { | |
61 char finduser_sql[160]; | |
62 int status; | |
63 sqlite3 *db; | |
64 | |
65 strcpy(finduser_sql, "BEGIN; SELECT * FROM dglusers WHERE username='"); | |
66 strncat(finduser_sql, uname, 40); | |
67 strcat(finduser_sql, "';"); | |
68 | |
69 status = sqlite3_open(DATABASE, &db); | |
70 if (status) { | |
71 sqlite3_close(db); | |
72 return 1; | |
73 } | |
74 status = 0; | |
75 sqlite3_exec(db, finduser_sql, searchcallback, (void *) &status, NULL); | |
76 if (!status) { | |
77 /* FIXME This is ugly, and email is unsanitzed. */ | |
78 strcpy(finduser_sql, "INSERT INTO dglusers (username, password, email) VALUES ('"); | |
79 strncat(finduser_sql, uname, 20); | |
80 strcat(finduser_sql, "', '"); | |
81 strcat(finduser_sql, crypt(pw, pw)); | |
82 strcat(finduser_sql, "', '"); | |
83 strncat(finduser_sql, email, 40); | |
84 strcat(finduser_sql, "');"); | |
85 sqlite3_exec(db, finduser_sql, NULL, NULL, NULL); | |
86 } | |
87 sqlite3_exec(db, "COMMIT;", NULL, NULL, NULL); | |
88 sqlite3_close(db); | |
89 return status; | |
90 } | |
91 | |
92 int main(int argc, char *argv[]) { | |
93 char ibuf[IBUFSIZE], *uname, *pw, *email; | |
94 char *cptr; // Utility pointer | |
95 int status; | |
96 | |
97 /* Read in the username and password */ | |
98 fgets(ibuf, IBUFSIZE, stdin); | |
99 uname = ibuf; | |
100 pw = strchr(uname, '\n'); | |
101 if (pw == NULL) | |
102 exit(4); /* Truncated */ | |
103 *pw = '\0'; | |
104 pw++; | |
105 fgets(pw, IBUFSIZE - (pw - ibuf), stdin); | |
106 if (pw[strlen(pw) - 1] == '\n') | |
107 pw[strlen(pw) - 1] = '\0'; | |
108 else | |
109 exit(4); /* Truncated */ | |
110 if (argc > 1 && !strcmp(argv[1], "register")) { | |
111 email = pw + strlen(pw) + 1; | |
112 fgets(email, IBUFSIZE - (email - ibuf), stdin); | |
113 if (email[strlen(email) - 1] == '\n') | |
114 email[strlen(email) - 1] = '\0'; | |
115 else | |
116 exit(4); | |
117 for (cptr = email; *cptr != '\0'; cptr++) { | |
118 if (!isalnum(*cptr) && !strchr("@._-", *cptr)) { | |
119 exit(4); | |
120 } | |
121 } | |
122 } | |
123 /* Sanitize the username, because it gets put into a query. */ | |
124 for (cptr = uname; *cptr != '\0'; cptr++) { | |
125 if (!isalnum(*cptr)) { | |
126 exit(4); | |
127 } | |
128 } | |
129 if (argc == 1 || !strcmp(argv[1], "check")) | |
130 status = check(uname, pw); | |
131 else if (!strcmp(argv[1], "register")) { | |
132 status = insertuser(uname, pw, email); | |
133 } | |
134 else | |
135 status = 127; | |
136 return status; | |
137 } |