Changeset - d851e72d74a8
[Not reviewed]
default
0 1 0
Nathan Brink (binki) - 16 years ago 2009-07-28 22:05:43
ohnobinki@ohnopublishing.net
fixed some of normaldotcom's pointer misconceptions
1 file changed with 43 insertions and 21 deletions:
0 comments (0 inline, 0 general)
src/server/slavefuncs.c
Show inline comments
 
@@ -12,27 +12,30 @@
 
  but WITHOUT ANY WARRANTY; without even the implied warranty of
 
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
  GNU Affero General Public License for more details.
 

	
 
  You should have received a copy of the GNU Affero General Public License
 
  along with DistRen.  If not, see <http://www.gnu.org/licenses/>.
 
*/
 

	
 
 /*
 
  * Registration on server. Needs attention. Prevent account spamming.
 
  * distrenslave -c username email@example.com
 
 */
 
#include "blendjob.h"
 

	
 
#include <stdio.h>
 
#include <string.h>
 
#include <unistd.h>
 
#include <stdlib.h> /*< malloc(), free() */
 

	
 
int ssh_keygen(){
 
	fprintf(stderr, "We're generating your SSH key. Please be patient.\n");
 
	char *command = "ssh-keygenn"; // append .exe if win32?
 
	char *path_to_command = "/usr/bin/ssh-keygenn";
 
	int ret;
 
	char *cmd[] = { command, "-b", "-o", (char *)0 }; // TODO: Give me the correct args!
 
	ret = execv(path_to_command, cmd); // This path will be absolute for testing, should be relative to install on production
 
	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;
 
	}
 
@@ -82,51 +85,70 @@ int register_user(char *username, char *
 
      buf[readlen] = '\0'; // Null-terminating the end of it again based on how large the data is?
 
      fprintf(stderr, "read \"%s\"\n", buf);
 
    }
 
  execio_close(testrem);
 

	
 
  ssh_keygen(); // generates username.rsa
 

	
 
  /* TODO: Scan distrenslave.conf for !username and !key and replace them with "keyname" and the "username" */
 
  return 1;
 
}
 

	
 

	
 
int login_user(char *username){
 
	// TODO: Why does this segfault???
 
  fprintf(stderr, "Logging you in...");
 
  char *userhost = strcpy(userhost, username);
 
  char *userkey = strcpy(userkey, username);
 
int login_user(char *username)
 
{
 
  char *userhost;
 
  char *userkey;
 
  char buf[10];
 
  struct execio *testrem;
 
  char *execargv[] =
 
    {
 
      "ssh",
 
      
 
      "-i",
 
      (char *)NULL, // Key created from registeruser()
 
      "-p",
 
      "23",
 
      (char *)NULL,// username and hostname
 
      "echo",
 
      "hello", // This should eventually open a non-terminating connection to the server for communication,
 
      
 
      (char *)NULL
 
    };
 
  size_t readlen;
 

	
 
  /*< @TODO remove being tied to protofusion.org for no reason  */
 
  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
 

	
 
  userkey = malloc(strlen(username) + strlen(".rsa") + 1);
 
  if(!userkey)
 
    {
 
      free(userhost);
 
      return 44;
 
    }
 
  
 
  strcpy(userkey, username);
 
  strcat(userkey,".rsa");
 
  fprintf(stderr, "i'm here");
 
  
 
  
 
  fprintf(stderr, "Logging you in to %s using key %s\n", userhost, userkey);
 
  if(fopen(userkey, "r") == NULL){
 
	  fprintf(stderr,"Your key, %s, has not been found! Re-register or somehow regenerate your key! We need a way to regenerate keys coded in, but we don't have the facilities yet!",userkey);
 
	  return 0;
 
  }
 
  char buf[10];
 
  struct execio *testrem;
 
  char *execargv[] =
 
    {
 
  "ssh",
 
  userhost, // username and hostname
 
  "-i",
 
  userkey, // Key created from registeruser()
 
  "-p",
 
  "23",
 
  "echo",
 
  "hello", // This should eventually open a non-terminating connection to the server for communication
 
  (char *)NULL
 
  };
 
  size_t readlen;
 
  fprintf(stderr, "Opening stream:\n", execio_open(&testrem, "ssh", execargv));
 
  buf[9] = '\0'; // null-terminating the array...
 
  while(!execio_read(testrem, buf, 9, &readlen)) // What's with the readlen stuff?
 
    {
 
      if(readlen > 9) {
 
	fprintf(stderr, "!!!! Something is terribly wrong!\n");
 
      }
 
    buf[readlen] = '\0'; // Null-terminating the end of it again based on how large the data is?
 
    fprintf(stderr, "read \"%s\"\n", buf);
 
    }
 
  execio_close(testrem);
 
  return 1; // 1 can be like... error-free login...
0 comments (0 inline, 0 general)