added first command requesting asynchronous data (adduser)
authorpk910 <philipp@zoelle1.de>
Wed, 17 Aug 2011 05:19:00 +0000 (07:19 +0200)
committerpk910 <philipp@zoelle1.de>
Wed, 17 Aug 2011 05:19:00 +0000 (07:19 +0200)
UserNode.c
cmd_neonserv_adduser.c [new file with mode: 0644]

index dbec20f4fd707247808374c980171256f530c34e..d85cceb9a4fc4e7ee0e86c0ecdeab18668e45d47 100644 (file)
@@ -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 (file)
index 0000000..13ff1b8
--- /dev/null
@@ -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);
+}