diff --git a/src/server/slavefuncs.c b/src/server/slavefuncs.c --- a/src/server/slavefuncs.c +++ b/src/server/slavefuncs.c @@ -17,11 +17,6 @@ along with DistRen. If not, see . */ - /* - * Registration on server. Needs attention. Prevent account spamming. - * distrenslave -c username email@example.com - */ - #include "protocol.h" #include "asprintf.h" #include "slavefuncs.h" @@ -164,167 +159,12 @@ int curlpost(char *filename, char *url){ return 0; } -/** Generates a SSH key with ssh-keygen */ -int ssh_keygen(){ - /* Checks to see if the keys are already present. */ - int status; - struct stat buffer; - status = stat(SYSCONFDIR "/distren.id_rsa", &buffer); - if(status != -1){ - fprintf(stderr, "***Please delete etc/distren.id_rsa and etc/distren.id_rsa.pub to register.\n"); - return 0; - } - - /* start execio code */ - char *command = "ssh-keygen"; // @TODO: append .exe if win32? - int ret; - char *cmd[] = { command, "-q", "-f", SYSCONFDIR "/distren.id_rsa", "-N", "", (char *)NULL }; // TODO: Give me the correct args! - char buf[10]; - struct execio *testrem; - size_t readlen; - ret = execio_open(&testrem, command, cmd); // @TODO: This path will be absolute for testing, should be relative to install on production - buf[9] = '\0'; - while(!execio_read(testrem, buf, 9, &readlen)) - { - if(readlen > 9) { - fprintf(stderr, "Something is terribly wrong!\n"); - } - buf[readlen] = '\0'; - fprintf(stderr, "read \"%s\"\n", buf); - } - execio_close(testrem); - /* end execio code */ - - // Supposedly execio returns 1 if it has bad args. - if(ret == 1){ - fprintf(stderr, "Generating your key failed. Ensure that ssh-keygen is present!\n"); // Use different executor that searches the path? there is one... - return 0; - } - else{ - fprintf(stderr,"We successfully generated your key! Yay!\n"); - return 1; - } -return 0; -} - -/** Registers the user on the DistRen server */ -int register_user(char *username, char *email) -{ - -/* Note: this code moved here from after the useradd code, so useradd doesn't happen if there is an existing key, etc */ - fprintf(stderr,"Preparing to download setup key...\n"); - curlget("http://protofusion.org/distren/keys/setup_rsa", SYSCONFDIR "/setup_rsa"); // Grabs key to use for setup login - - /* puts the person's username in the conf */ - if(conf_replace(username) == 0){ - fprintf(stderr, "Failed!\n"); - return 0; - } - - /* generates keys for login, @TODO: pub key must somehow be sent to the server. */ - if(ssh_keygen() == 0){ - fprintf(stderr, "Failed!\n"); - return 0; - } - - /* - * All created user accounts should be sandboxed accordingly, requiring a different skel, and the default shell to be rbash. Also, - * a custom path defined in the .bashrc of the skel is needed. - */ - int ret; - char buf[10]; - struct execio *testrem; - char *execargv[] = - { - "ssh", - "distren_setup@protofusion.org", - "-i", - SYSCONFDIR "/setup_rsa", - "-p", - "23", - "newuser", - "-M", - "-c", - email, - "-d", - "/home/distren", - "--gid", - "541", - username, - (char *)NULL - }; - size_t readlen; - ret = execio_open(&testrem, "ssh", execargv); // TODO: Grab returns from this someday. - buf[9] = '\0'; - while(!execio_read(testrem, buf, 9, &readlen)) - { - if(readlen > 9) { - fprintf(stderr, "!!!! Something is terribly wrong!\n"); - } - buf[readlen] = '\0'; - fprintf(stderr, "read \"%s\"\n", buf); - } - execio_close(testrem); - - /* @TODO: Parse the output buffer or something to check when user creation fails due to duplicate users. This is pretty important. */ - if(ret == 1){ - fprintf(stderr, "Unable to log you in. Ensure that ssh is present on your system.\n"); // Use different executor that searches the path? there is one... - return 0; - } - else{ - fprintf(stderr,"Logged in successfully!\n"); - return 1; - } - - return 0; // 0 is fai -} /** Logs the user into the server after ensuring that keys exist */ int login_user(char *username) { - char *userhost; - userhost = malloc(strlen(username) + strlen("@protofusion.org") + 1); - if(!userhost) - return 43; - strcpy(userhost, username); - strcat(userhost, "@protofusion.org"); // Throws @protofusion.org after the username - - char buf[10]; - struct execio *testrem; - char *execargv[] = - { - "ssh", - userhost,// username and hostname - "-i", - SYSCONFDIR "/distren.id_rsa", - "-p", - "23", - "echo", - "hello", // This should eventually open a non-terminating connection to the server for communication, - - (char *)NULL - }; - size_t readlen; - fprintf(stderr, "Logging you in to %s\n", userhost); - int status; - struct stat buffer; - status = stat(SYSCONFDIR "/distren.id_rsa", &buffer); - if(status == -1){ - fprintf(stderr,"Your key has not been found! Re-register or somehow regenerate your key!\nWe need a way to regenerate keys coded in, but we don't have the facilities yet!\n"); - return 0; - } - execio_open(&testrem, "ssh", execargv); // TODO: Grab returns from this someday - buf[9] = '\0'; // null-terminating the array... - while(!execio_read(testrem, buf, 9, &readlen)) - { - if(readlen > 9) { - fprintf(stderr, "Something is terribly wrong!\n"); - } - buf[readlen] = '\0'; - fprintf(stderr, "read \"%s\"\n", buf); - } - execio_close(testrem); - return 1; // 1 means success + // @TODO: Put some telnet-style auth code here + return 1; // success } /** Replaces !username with a username in the slave's conf file */