aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/Makefile9
-rw-r--r--tests/authentication.c74
-rw-r--r--tests/connection.c31
-rw-r--r--tests/test_tunnel.c76
-rw-r--r--tests/tests.h8
5 files changed, 198 insertions, 0 deletions
diff --git a/tests/Makefile b/tests/Makefile
new file mode 100644
index 00000000..bebfe5b6
--- /dev/null
+++ b/tests/Makefile
@@ -0,0 +1,9 @@
+all: test_tunnel
+CFLAGS=-I../include/ -g -Wall
+LDFLAGS=-lssh -L../libssh/.libs
+
+test_tunnel: test_tunnel.o authentication.o connection.o
+ gcc -o $@ $^ $(LDFLAGS)
+
+clean:
+ rm -f *.o test_tunnel
diff --git a/tests/authentication.c b/tests/authentication.c
new file mode 100644
index 00000000..00abd052
--- /dev/null
+++ b/tests/authentication.c
@@ -0,0 +1,74 @@
+/*
+This file is distributed in public domain. You can do whatever you want
+with its content.
+*/
+
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <libssh/libssh.h>
+
+#include "tests.h"
+static int auth_kbdint(SSH_SESSION *session){
+ int err=ssh_userauth_kbdint(session,NULL,NULL);
+ char *name,*instruction,*prompt,*ptr;
+ char buffer[128];
+ int i,n;
+ char echo;
+ while (err==SSH_AUTH_INFO){
+ name=ssh_userauth_kbdint_getname(session);
+ instruction=ssh_userauth_kbdint_getinstruction(session);
+ n=ssh_userauth_kbdint_getnprompts(session);
+ if(strlen(name)>0)
+ printf("%s\n",name);
+ if(strlen(instruction)>0)
+ printf("%s\n",instruction);
+ for(i=0;i<n;++i){
+ prompt=ssh_userauth_kbdint_getprompt(session,i,&echo);
+ if(echo){
+ printf("%s",prompt);
+ fgets(buffer,sizeof(buffer),stdin);
+ buffer[sizeof(buffer)-1]=0;
+ if((ptr=strchr(buffer,'\n')))
+ *ptr=0;
+ ssh_userauth_kbdint_setanswer(session,i,buffer);
+ memset(buffer,0,strlen(buffer));
+ } else {
+ ptr=getpass(prompt);
+ ssh_userauth_kbdint_setanswer(session,i,ptr);
+ }
+ }
+ err=ssh_userauth_kbdint(session,NULL,NULL);
+ }
+ return err;
+}
+
+int authenticate (SSH_SESSION *session){
+ int auth=ssh_userauth_autopubkey(session);
+ char *password;
+ if(auth==SSH_AUTH_ERROR){
+ fprintf(stderr,"Authenticating with pubkey: %s\n",ssh_get_error(session));
+ return auth;
+ }
+ if(auth!=SSH_AUTH_SUCCESS){
+ auth=auth_kbdint(session);
+ if(auth==SSH_AUTH_ERROR){
+ fprintf(stderr,"authenticating with keyb-interactive: %s\n",
+ ssh_get_error(session));
+ return auth;
+ }
+ }
+ if(auth!=SSH_AUTH_SUCCESS){
+ password=getpass("Password : ");
+ auth = ssh_userauth_password(session,NULL,password);
+ memset(password,0,strlen(password));
+ if (auth==SSH_AUTH_ERROR){
+ fprintf(stderr,"Authentication with password failed: %s\n",ssh_get_error(session));
+ return auth;
+ }
+ }
+ return auth;
+}
diff --git a/tests/connection.c b/tests/connection.c
new file mode 100644
index 00000000..889c5117
--- /dev/null
+++ b/tests/connection.c
@@ -0,0 +1,31 @@
+/*
+This file is distributed in public domain. You can do whatever you want
+with its content.
+*/
+
+#include <libssh/libssh.h>
+#include <stdio.h>
+#include "tests.h"
+SSH_OPTIONS *set_opts(int argc, char **argv){
+ SSH_OPTIONS *options=ssh_options_new();
+ char *host=NULL;
+ if(ssh_options_getopt(options,&argc, argv)){
+ fprintf(stderr,"error parsing command line :%s\n",ssh_get_error(options));
+ return NULL;
+ }
+ int i;
+ while((i=getopt(argc,argv,""))!=-1){
+ switch(i){
+ default:
+ fprintf(stderr,"unknown option %c\n",optopt);
+ }
+ }
+ if(optind < argc)
+ host=argv[optind++];
+ if(host==NULL){
+ fprintf(stderr,"must provide an host name\n");
+ return NULL;
+ }
+ ssh_options_set_host(options,host);
+ return options;
+}
diff --git a/tests/test_tunnel.c b/tests/test_tunnel.c
new file mode 100644
index 00000000..5d1e7534
--- /dev/null
+++ b/tests/test_tunnel.c
@@ -0,0 +1,76 @@
+/*
+This file is distributed in public domain. You can do whatever you want
+with its content.
+*/
+#include <libssh/libssh.h>
+#include <stdio.h>
+#include <string.h>
+#include "tests.h"
+#define ECHO_PORT 7
+void do_connect(SSH_SESSION *session){
+ int error=ssh_connect(session);
+ if(error != SSH_OK){
+ fprintf(stderr,"Error at connection :%s\n",ssh_get_error(session));
+ return;
+ }
+ printf("Connected\n");
+ ssh_is_server_known(session);
+ // we don't care what happens here
+ error=authenticate(session);
+ if(error != SSH_AUTH_SUCCESS){
+ fprintf(stderr,"Error at authentication :%s\n",ssh_get_error(session));
+ return;
+ }
+ printf("Authenticated\n");
+ CHANNEL *channel=channel_new(session);
+ error=channel_open_forward(channel,"localhost",ECHO_PORT,"localhost",42);
+ if(error!=SSH_OK){
+ fprintf(stderr,"Error when opening forward:%s\n",ssh_get_error(session));
+ return;
+ }
+ printf("Forward opened\n");
+ int i=0;
+ char string[20];
+ char buffer[20];
+ for(i=0;i<2000;++i){
+ sprintf(string,"%d\n",i);
+ channel_write(channel,string,strlen(string));
+ do {
+ error=channel_poll(channel,0);
+ //if(error < strlen(string))
+ //usleep(10);
+ } while(error < strlen(string) && error >= 0);
+ if(error>0){
+ error=channel_read_nonblocking(channel,buffer,strlen(string),0);
+ if(error>=0){
+ if(memcmp(buffer,string,strlen(string))!=0){
+ fprintf(stderr,"Problem with answer: wanted %s got %s\n",string,buffer);
+ } else {
+ printf(".");
+ fflush(stdout);
+ }
+ }
+
+ }
+ if(error==-1){
+ fprintf(stderr,"Channel reading error : %s\n",ssh_get_error(session));
+ break;
+ }
+ }
+ printf("\nChannel test finished\n");
+ channel_close(channel);
+ channel_free(channel);
+}
+
+int main(int argc, char **argv){
+ SSH_OPTIONS *options=set_opts(argc, argv);
+ SSH_SESSION *session=ssh_new();
+ if(options==NULL){
+ return 1;
+ }
+ ssh_set_options(session,options);
+ do_connect(session);
+ ssh_disconnect(session);
+ ssh_finalize();
+ return 0;
+}
diff --git a/tests/tests.h b/tests/tests.h
new file mode 100644
index 00000000..dd001f1f
--- /dev/null
+++ b/tests/tests.h
@@ -0,0 +1,8 @@
+/*
+This file is distributed in public domain. You can do whatever you want
+with its content.
+*/
+#include <libssh/libssh.h>
+int authenticate (SSH_SESSION *session);
+SSH_OPTIONS *set_opts(int argc, char **argv);
+