continues cmd_neonserv_adduser.c
[NeonServV5.git] / cmd_neonserv_adduser.c
1
2 /*
3 * argv[0] - nick / *auth
4 * argv[1] - chan access
5 */
6 static AUTHLOOKUP_CALLBACK(neonserv_cmd_adduser_auth_lookup);
7 static USERAUTH_CALLBACK(neonserv_cmd_adduser_nick_lookup);
8 static void neonserv_cmd_adduser_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nick, char *auth, int access);
9
10 struct neonserv_cmd_adduser_cache {
11     struct ClientSocket *client, *textclient;
12     struct UserNode *user;
13     struct ChanNode *chan;
14     int access;
15     char *nick;
16 };
17
18 static CMD_BIND(neonserv_cmd_adduser) {
19     int caccess;
20     MYSQL_RES *res;
21     MYSQL_ROW row;
22     check_mysql();
23     //check acccess
24     caccess = atoi(argv[1]);
25     if(caccess <= 0 || caccess > 500) {
26         reply(getTextBot(), user, "NS_INVALID_ACCESS", caccess);
27         return;
28     }
29     //check own access
30     if(argv[0][0] == '*') {
31         //we've got an auth
32         argv[0]++;
33         printf_mysql_query("SELECT `user_user` FROM `users` WHERE `user_user` = '%s'", escape_string(argv[0]));
34         res = mysql_use();
35         if ((row = mysql_fetch_row(res)) != NULL) {
36             neonserv_cmd_adduser_async1(client, getTextBot(), user, chan, argv[0], row[0], caccess);
37         } else {
38             //we need to create a new user...
39             //but first lookup the auth to check if it really exists
40             struct neonserv_cmd_adduser_cache *cache = malloc(sizeof(*cache));
41             if (!cache) {
42                 perror("malloc() failed");
43                 return;
44             }
45             cache->client = client;
46             cache->textclient = getTextBot();
47             cache->user = user;
48             cache->chan = chan;
49             cache->access = caccess;
50             cache->nick = strdup(argv[0]);
51             lookup_authname(argv[0], neonserv_cmd_adduser_auth_lookup, cache);
52         }
53     } else {
54         struct UserNode *cuser = getUserByNick(argv[0]);
55         if(!cuser) {
56             cuser = createTempUser(argv[0]);
57             cuser->flags |= USERFLAG_ISTMPUSER;
58         }
59         if(cuser->flags & USERFLAG_ISAUTHED) {
60             neonserv_cmd_adduser_async1(client, getTextBot(), user, chan, argv[0], cuser->auth, caccess);
61         } else {
62             struct neonserv_cmd_adduser_cache *cache = malloc(sizeof(*cache));
63             if (!cache) {
64                 perror("malloc() failed");
65                 return;
66             }
67             cache->client = client;
68             cache->textclient = getTextBot();
69             cache->user = user;
70             cache->chan = chan;
71             cache->access = caccess;
72             cache->nick = strdup(argv[0]);
73             get_userauth(cuser, neonserv_cmd_adduser_nick_lookup, cache);
74         }
75     }
76 }
77
78 static AUTHLOOKUP_CALLBACK(neonserv_cmd_adduser_auth_lookup) {
79     struct neonserv_cmd_adduser_cache *cache = data;
80     if(!exists) {
81         //AUTH_DOES_NOT_EXIST
82         reply(cache->textclient, cache->user, "NS_AUTH_UNKNOWN", cache->nick);
83     } else
84         neonserv_cmd_adduser_async1(cache->client, cache->textclient, cache->user, cache->chan, cache->nick, auth, cache->access);
85     free(cache->nick);
86     free(cache);
87 }
88
89 static USERAUTH_CALLBACK(neonserv_cmd_adduser_nick_lookup) {
90     struct neonserv_cmd_adduser_cache *cache = data;
91     if(!user) {
92         //USER_DOES_NOT_EXIST
93         reply(cache->textclient, cache->user, "NS_USER_UNKNOWN", cache->nick);
94     }
95     else if(!(user->flags & USERFLAG_ISAUTHED)) {
96         //USER_NOT_AUTHED
97         reply(cache->textclient, cache->user, "NS_USER_NEED_AUTH", cache->nick);
98     }
99     else
100         neonserv_cmd_adduser_async1(cache->client, cache->textclient, cache->user, cache->chan, user->nick, user->auth, cache->access);
101     free(cache->nick);
102     free(cache);
103 }
104
105 static void neonserv_cmd_adduser_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nick, char *auth, int caccess) {
106     //we've got a valid auth now...
107     int userid;
108     printf_mysql_query("SELECT `user_id` FROM `users` WHERE `user_user` = '%s'", escape_string(auth));
109     res = mysql_use();
110     if ((row = mysql_fetch_row(res)) != NULL) {
111         userid = atoi(res[0]);
112     } else {
113         printf_mysql_query("INSERT INTO `users` (`user_user`) VALUES ('%s')", escape_string(auth));
114         userid = (int) mysql_insert_id(mysql_conn);
115     }
116     putsock(client, "PRIVMSG %s :%s: [%d] %s   %d", chan->name, nick, userid, auth, caccess);
117 }