Fix Schrödingbug in lspeers.
[doldaconnect.git] / daemon / ui.c
index a2ec720..b372f2f 100644 (file)
@@ -168,6 +168,7 @@ static void notifappend(struct notif *notif, ...);
 struct uiuser *users = NULL;
 struct uidata *actives = NULL;
 struct socket *uisocket = NULL;
+static time_t starttime;
 
 static wchar_t *quoteword(wchar_t *word)
 {
@@ -589,7 +590,7 @@ static void cmd_fnetconnect(struct socket *sk, struct uidata *data, int argc, wc
     args = NULL;
     for(i = 3; i < argc - 1; i += 2)
        newwcspair(argv[i], argv[i + 1], &args);
-    fn = fnetinitconnect(argv[1], buf, args);
+    fn = fnetinitconnect(argv[1], data->userinfo->name, buf, args);
     err = errno;
     free(buf);
     if(fn == NULL)
@@ -640,6 +641,11 @@ static void cmd_disconnect(struct socket *sk, struct uidata *data, int argc, wch
            sq(sk, 0, L"510", L"No such node", NULL);
            return;
        }
+       if(wpfind(fn->args, L"locked") && !((data->userinfo->perms & PERM_ADMIN) || !wcscmp(data->userinfo->name, fn->owner)))
+       {
+           sq(sk, 0, L"502", L"This node is locked and you are neither administrator nor its owner", NULL);
+           return;
+       }
        killfnetnode(fn);
        unlinkfnetnode(fn);
     }
@@ -685,7 +691,7 @@ static void cmd_lspeers(struct socket *sk, struct uidata *data, int argc, wchar_
     } else {
        for(peer = fn->peers; peer != NULL; peer = peer->next)
        {
-           sq(sk, 2 | ((peer->next != NULL)?1:0), L"200", peer->id, peer->nick, NULL);
+           sq(sk, 2 | ((peer->next != NULL)?1:0), L"200", L"%%s", peer->id, L"%%ls", peer->nick, NULL);
            for(i = 0; i < peer->dinum; i++)
            {
                if(peer->peerdi[i].datum->datatype == FNPD_INT)
@@ -698,7 +704,7 @@ static void cmd_lspeers(struct socket *sk, struct uidata *data, int argc, wchar_
                    sq(sk, 2, peer->peerdi[i].datum->id, buf, NULL);
                }
                if((peer->peerdi[i].datum->datatype == FNPD_STR) && (peer->peerdi[i].data.str != NULL))
-                   sq(sk, 2, peer->peerdi[i].datum->id, peer->peerdi[i].data.str, NULL);
+                   sq(sk, 2, peer->peerdi[i].datum->id, L"%%ls", peer->peerdi[i].data.str, NULL);
            }
            sq(sk, 0, NULL);
        }
@@ -1251,7 +1257,7 @@ static void cmd_register(struct socket *sk, struct uidata *data, int argc, wchar
        return;
     }
     for(d2 = actives; d2 != NULL; d2 = d2->next) {
-       if((d2 != data) && d2->regname && !wcscmp(d2->regname, argv[1])) {
+       if((d2 != data) && (d2->userinfo == data->userinfo) && d2->regname && !wcscmp(d2->regname, argv[1])) {
            sq(sk, 0, L"516", L"Name already in use", NULL);
            return;
        }
@@ -1277,12 +1283,12 @@ static void cmd_sendmsg(struct socket *sk, struct uidata *data, int argc, wchar_
     if(argv[1][0] == L'#') {
        rcptid = wcstol(argv[1] + 1, NULL, 0);
        for(rcpt = actives; rcpt != NULL; rcpt = rcpt->next) {
-           if(rcpt->id == rcptid)
+           if((rcpt->userinfo == data->userinfo) && (rcpt->id == rcptid))
                break;
        }
     } else {
        for(rcpt = actives; rcpt != NULL; rcpt = rcpt->next) {
-           if(rcpt->regname && !wcscmp(rcpt->regname, argv[1]))
+           if((rcpt->userinfo == data->userinfo) && rcpt->regname && !wcscmp(rcpt->regname, argv[1]))
                break;
        }
     }
@@ -1304,6 +1310,11 @@ static void cmd_sendmsg(struct socket *sk, struct uidata *data, int argc, wchar_
     sq(sk, 0, L"200", L"Message sent", NULL);
 }
 
+static void cmd_uptime(struct socket *sk, struct uidata *data, int argc, wchar_t **argv)
+{
+    sq(sk, 0, L"200", L"%%i", time(NULL) - starttime, NULL);
+}
+
 #undef haveargs
 #undef havepriv
 
@@ -1342,6 +1353,7 @@ static struct command commands[] =
     {L"transstatus", cmd_transstatus},
     {L"register", cmd_register},
     {L"sendmsg", cmd_sendmsg},
+    {L"uptime", cmd_uptime},
     {NULL, NULL}
 };
 
@@ -2153,6 +2165,7 @@ static int init(int hup)
     }
     if(!hup)
     {
+       starttime = time(NULL);
        if(uisocket != NULL)
            putsock(uisocket);
        if((uisocket = netcstcplisten(confgetint("ui", "port"), 1, uiaccept, NULL)) == NULL)