Send new, versioned connect stanza.
[doldaconnect.git] / daemon / ui.c
index d77efa7..2bd5a9d 100644 (file)
@@ -355,7 +355,7 @@ static void cmd_connect(struct socket *sk, struct uidata *data, int argc, wchar_
            return;
        }
     }
-    sq(sk, 0, L"200", L"%Dolda Connect daemon v%s", VERSION, NULL);
+    sq(sk, 0, L"201", L"1", L"1", L"%Dolda Connect daemon v%s", VERSION, NULL);
 }
 
 static void cmd_notfound(struct socket *sk, struct uidata *data, int argc, wchar_t **argv)
@@ -389,7 +389,7 @@ static void cmd_lsauth(struct socket *sk, struct uidata *data, int argc, wchar_t
     prev = NULL;
     for(mech = mechs; mech != NULL; mech = mech->next)
     {
-       if(mech->enabled)
+       if(mech->enabled && authavailable(mech, sk))
        {
            if(prev != NULL)
                sq(sk, 1, L"200", prev->name, NULL);
@@ -438,7 +438,7 @@ static void cmd_login(struct socket *sk, struct uidata *data, int argc, wchar_t
        return;
     }
     free(buf);
-    switch(authenticate(data->auth, NULL))
+    switch(authenticate(data->auth, sk, NULL))
     {
     case AUTH_SUCCESS:
        data->userinfo = finduser(data->username);
@@ -512,7 +512,7 @@ static void cmd_pass(struct socket *sk, struct uidata *data, int argc, wchar_t *
        sq(sk, 0, L"507", L"Data not expected", NULL);
        return;
     }
-    switch(authenticate(data->auth, buf))
+    switch(authenticate(data->auth, sk, buf))
     {
     case AUTH_SUCCESS:
        data->userinfo = finduser(data->username);
@@ -2132,7 +2132,7 @@ static void preinit(int hup)
     
     if(!hup)
     {
-       newuser(L"default", 0);
+       newuser(L"default", PERM_DISALLOW);
     } else {
        for(user = users; user != NULL; user = user->next)
        {
@@ -2226,6 +2226,8 @@ static int init(int hup)
 {
     struct uiuser *user, *next;
     struct sockaddr_un *un;
+    struct passwd *pwd;
+    wchar_t *wcsname;
     
     if(hup)
     {
@@ -2254,6 +2256,29 @@ static int init(int hup)
        GCBREG(newfncb, newfnetnode, NULL);
        GCBREG(newtransfercb, newtransfernotify, NULL);
     }
+    if(getuid() != 0)
+    {
+       for(user = users; user != NULL; user = user->next)
+       {
+           if(wcscmp(user->name, L"default"))
+               break;
+       }
+       if(!user)
+       {
+           if((pwd = getpwuid(getuid())) == NULL)
+           {
+               flog(LOG_CRIT, "could not get login info: %s", strerror(errno));
+               return(1);
+           }
+           if((wcsname = icmbstowcs(pwd->pw_name, NULL)) == NULL)
+           {
+               flog(LOG_CRIT, "could not convert user name into wcs: %s", strerror(errno));
+               return(1);
+           }
+           newuser(wcsname, ~PERM_DISALLOW);
+           free(wcsname);
+       }
+    }
     return(0);
 }