From: pk910 Date: Wed, 17 Aug 2011 05:19:00 +0000 (+0200) Subject: added first command requesting asynchronous data (adduser) X-Git-Tag: v5.3~531 X-Git-Url: http://git.pk910.de/?p=NeonServV5.git;a=commitdiff_plain;h=155620f8da656265315732e3379a9dd87e555806 added first command requesting asynchronous data (adduser) --- diff --git a/UserNode.c b/UserNode.c index dbec20f..d85cceb 100644 --- a/UserNode.c +++ b/UserNode.c @@ -197,7 +197,23 @@ struct UserNode* createTempUser(const char *mask) { strcpy(user->ident, &cmask[ii]); ii = i+1; } else if(cmask[i] == '\0') { - if(user == NULL) return NULL; + if(user == NULL) { + //nick only + user = malloc(sizeof(*user)); + if (!user) + { + perror("malloc() failed"); + return NULL; + } + strcpy(user->nick, cmask); + user->created = time(0); + user->ident[0] = 0; + user->host[0] = 0; + user->realname[0] = 0; + user->flags = 0; + user->channel = NULL; + return user; + } strcpy(user->host, &cmask[ii]); } } diff --git a/cmd_neonserv_adduser.c b/cmd_neonserv_adduser.c new file mode 100644 index 0000000..13ff1b8 --- /dev/null +++ b/cmd_neonserv_adduser.c @@ -0,0 +1,101 @@ + +/* +* argv[0] - nick/*auth +* argv[1] - chan access +*/ +static AUTHLOOKUP_CALLBACK(neonserv_cmd_adduser_auth_lookup); +static USERAUTH_CALLBACK(neonserv_cmd_adduser_nick_lookup); +static void neonserv_cmd_adduser_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nick, char *auth, int access); + +struct neonserv_cmd_adduser_cache { + struct ClientSocket *client, *textclient; + struct UserNode *user; + struct ChanNode *chan; + int access; + char *nick; +}; + +static CMD_BIND(neonserv_cmd_adduser) { + int access; + MYSQL_RES *res; + MYSQL_ROW row; + check_mysql(); + //check acccess + access = atoi(argv[1]); + if(argv[0][0] == '*') { + //we've got an auth + argv[0]++; + printf_mysql_query("SELECT `user_user` FROM `users` WHERE `user_user` = '%s'", escape_string(argv[0])); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) { + neonserv_cmd_adduser_async1(client, getTextBot(), user, chan, argv[0], row[0], access); + } else { + //we need to create a new user... + //but first lookup the auth to check if it really exists + struct neonserv_cmd_adduser_cache *cache = malloc(sizeof(*cache)); + if (!user) { + perror("malloc() failed"); + return; + } + cache->client = client; + cache->textclient = getTextBot(); + cache->user = user; + cache->chan = chan; + cache->access = access; + cache->nick = strdup(argv[0]); + lookup_authname(argv[0], neonserv_cmd_adduser_auth_lookup, cache); + } + } else { + struct UserNode *user = getUserByNick(argv[0]); + if(!user) { + user = createTempUser(from); + user->flags |= USERFLAG_ISTMPUSER; + } + if(user->flags & USERFLAG_ISAUTHED) { + neonserv_cmd_adduser_async1(client, getTextBot(), user, chan, argv[0], user->auth, access); + } else { + struct neonserv_cmd_adduser_cache *cache = malloc(sizeof(*cache)); + if (!user) { + perror("malloc() failed"); + return; + } + cache->client = client; + cache->textclient = getTextBot(); + cache->user = user; + cache->chan = chan; + cache->access = access; + cache->nick = strdup(argv[0]); + lookup_authname(argv[0], neonserv_cmd_adduser_nick_lookup, cache); + get_userauth(user, command_checked_auth, data); + } + } +} + +static AUTHLOOKUP_CALLBACK(neonserv_cmd_adduser_auth_lookup) { + struct neonserv_cmd_adduser_cache *cache = data; + if(!exists) { + //AUTH_DOES_NOT_EXIST + } else + neonserv_cmd_adduser_async1(cache->client, cache->textclient, cache->user, cache->chan, cache->nick, auth, cache->access); + free(cache->nick); + free(cache); +} + +static USERAUTH_CALLBACK(neonserv_cmd_adduser_nick_lookup) { + struct neonserv_cmd_adduser_cache *cache = data; + if(!user) { + //USER_DOES_NOT_EXIST + } + else if(!(user->flags & USERFLAG_ISAUTHED)) { + //USER_NOT_AUTHED + } + else + neonserv_cmd_adduser_async1(cache->client, cache->textclient, cache->user, cache->chan, user->nick, user->auth, cache->access); + free(cache->nick); + free(cache); +} + +static void neonserv_cmd_adduser_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nick, char *auth, int access) { + //we've got a valid auth now... + putsock(client, "PRIVMSG %s :%s: %s", chan->name, nick, auth); +}