Esempio n. 1
0
/** go ahead and read config, contact server and perform command and display */
static int
go(const char* cfgfile, char* svr, int argc, char* argv[])
{
	struct config_file* cfg;
	int fd, ret;
	SSL_CTX* ctx;
	SSL* ssl;

	/* read config */
	if(!(cfg = config_create()))
		fatal_exit("out of memory");
	if(!config_read(cfg, cfgfile, NULL))
		fatal_exit("could not read config file");
	if(!cfg->remote_control_enable)
		log_warn("control-enable is 'no' in the config file.");
	ctx = setup_ctx(cfg);
	
	/* contact server */
	fd = contact_server(svr, cfg, argc>0&&strcmp(argv[0],"status")==0);
	ssl = setup_ssl(ctx, fd);
	
	/* send command */
	ret = go_cmd(ssl, argc, argv);

	SSL_free(ssl);
#ifndef USE_WINSOCK
	close(fd);
#else
	closesocket(fd);
#endif
	SSL_CTX_free(ctx);
	config_delete(cfg);
	return ret;
}
Esempio n. 2
0
/** go ahead and read config, contact server and perform command and display */
static int
go(const char* cfgfile, char* svr, int argc, char* argv[])
{
	struct nsd_options* opt;
	int fd, ret;
	SSL_CTX* ctx;
	SSL* ssl;

	/* read config */
	if(!(opt = nsd_options_create(region_create(xalloc, free)))) {
		fprintf(stderr, "out of memory\n");
		exit(1);
	}
	tsig_init(opt->region);
	if(!parse_options_file(opt, cfgfile, NULL, NULL)) {
		fprintf(stderr, "could not read config file\n");
		exit(1);
	}
	if(!opt->control_enable)
		fprintf(stderr, "warning: control-enable is 'no' in the config file.\n");
	ctx = setup_ctx(opt);

	/* contact server */
	fd = contact_server(svr, opt, argc>0&&strcmp(argv[0],"status")==0);
	ssl = setup_ssl(ctx, fd);

	/* send command */
	ret = go_cmd(ssl, fd, argc, argv);

	if(ssl) SSL_free(ssl);
	close(fd);
	if(ctx) SSL_CTX_free(ctx);
	region_destroy(opt->region);
	return ret;
}
Esempio n. 3
0
/* fonction coupe la connexion.					*/
int connect_server (flrn_char *host, int port) {
    int ret, code;
    int rc,rc2;
    char *trad;
    const char *special;
    flrn_char *tmptrad;

   
    init_connection=1;
    if (host==NULL) {
       special=_("Pas de serveur où se connecter.\n");
       rc=conversion_from_utf8(special, &tmptrad, 0, (size_t)(-1));
       rc2=conversion_to_terminal(tmptrad,&trad,0,(size_t)(-1));
       fputs(trad,stderr);
       if (rc2==0) free(trad);
       if (rc==0) free(tmptrad);
       return -1; 
    }
    if (port==0) port=Options.port;
    rc=conversion_to_utf8(host,&trad,0,(size_t)(-1));
    ret=contact_server(host, port);
    if (rc==0) free(trad);
    if (ret<0) {
       special=_("Échec de la connexion au serveur : %s\n");
       rc=conversion_from_utf8(special, &tmptrad, 0, (size_t)(-1));
       rc2=conversion_to_terminal(tmptrad,&trad,0,(size_t)(-1));
       fprintf(stderr,trad,host);
       if (rc2==0) free(trad);
       if (rc==0) free(tmptrad);
       return -1;
    }
     
    code=return_code();
    init_connection=0;

    if ((code!=200) && (code!=201))
    {
       close (tcp_fd);
       return code;
    }
    server_command_status[CMD_QUIT]=CMD_FLAG_MAXIMAL;
    server_command_status[CMD_MODE_READER]=CMD_FLAG_MAXIMAL;
    server_command_status[CMD_AUTHINFO]=CMD_FLAG_MAXIMAL;
    server_command_status[CMD_POST]=(code==200 ? CMD_FLAG_MAXIMAL : 
    						 CMD_FLAG_TESTED);
    write_command(CMD_MODE_READER, 0, NULL);
    
    ret=return_code();

/* On place juste XMODE READER au cas ou...*/
/* Non nécéssaire (trn4 ne le fait pas) */
/*
    if (ret>400) {
      raw_write_server("XMODE READER\r\n", 14);
      ret=return_code();
    }
*/
    /* Authentification */
    if ((ret<500) && (Options.auth_cmd)) {
        return run_auth_cmd();
    }

    if ((ret<500) && (Options.auth_user)) {
        char *strvar[2];
	strvar[0]="user"; 
	rc=conversion_to_utf8(Options.auth_user,&trad,0,(size_t)(-1));
	strvar[1]=trad;
        write_command(CMD_AUTHINFO,2,strvar);
	if (rc==0) free(trad);
	ret=return_code();
	if ((ret>300) && (ret<400)) {
	   strvar[0]="pass";
	   if (Options.auth_pass) {
	     rc=conversion_to_utf8(Options.auth_pass,&trad,0,(size_t)(-1));
	     strvar[1]=trad;
	   } else {
	     char *strpipo;
	     /* on peut supposer que ça n'arrive que la première fois */
             special=_("Le serveur demande un mot de passe.\n");
             rc=conversion_from_utf8(special, &tmptrad, 0, (size_t)(-1));
             rc2=conversion_to_terminal(tmptrad,&trad,0,(size_t)(-1));
	     fputs(trad,stderr);
             if (rc2==0) free(trad);
             if (rc==0) free(tmptrad);
             special=_("Mot de passe : ");
             rc=conversion_from_utf8(special, &tmptrad, 0, (size_t)(-1));
             rc2=conversion_to_terminal(tmptrad,&trad,0,(size_t)(-1));
	     strpipo=getpass(trad);
             if (rc2==0) free(trad);
             if (rc==0) free(tmptrad);
	     if (strpipo!=NULL) {
		 rc=conversion_from_terminal(strpipo,&(Options.auth_pass),
			 0,(size_t)(-1));
		 if (rc!=0) Options.auth_pass=safe_flstrdup(Options.auth_pass);
		 rc=conversion_to_utf8(Options.auth_pass,&trad,0,(size_t)(-1));
	         strvar[1]=trad;
	     } else {
	         strvar[1]="";
		 rc=1;
	     }
	   }
	   if (Options.auth_pass) {
             write_command(CMD_AUTHINFO,2,strvar);
	     ret=return_code();
	     if (rc==0) free(trad);
	   } else ret=502;
	}
	if (ret==502) code=ret;
    }

    return code;
}