Blame tests/authentication.c

Packit Service 31306d
/*
Packit Service 31306d
This file is distributed in public domain. You can do whatever you want
Packit Service 31306d
with its content.
Packit Service 31306d
*/
Packit Service 31306d
Packit Service 31306d
Packit Service 31306d
#include <stdio.h>
Packit Service 31306d
#include <unistd.h>
Packit Service 31306d
#include <stdlib.h>
Packit Service 31306d
#include <string.h>
Packit Service 31306d
Packit Service 31306d
#include <libssh/libssh.h>
Packit Service 31306d
Packit Service 31306d
#include "tests.h"
Packit Service 31306d
static int auth_kbdint(SSH_SESSION *session){
Packit Service 31306d
    int err=ssh_userauth_kbdint(session,NULL,NULL);
Packit Service 31306d
    char *name,*instruction,*prompt,*ptr;
Packit Service 31306d
    char buffer[128];
Packit Service 31306d
    int i,n;
Packit Service 31306d
    char echo;
Packit Service 31306d
    while (err==SSH_AUTH_INFO){
Packit Service 31306d
        name=ssh_userauth_kbdint_getname(session);
Packit Service 31306d
        instruction=ssh_userauth_kbdint_getinstruction(session);
Packit Service 31306d
        n=ssh_userauth_kbdint_getnprompts(session);
Packit Service 31306d
        if(strlen(name)>0)
Packit Service 31306d
            printf("%s\n",name);
Packit Service 31306d
        if(strlen(instruction)>0)
Packit Service 31306d
            printf("%s\n",instruction);
Packit Service 31306d
        for(i=0;i
Packit Service 31306d
            prompt=ssh_userauth_kbdint_getprompt(session,i,&echo);
Packit Service 31306d
            if(echo){
Packit Service 31306d
                printf("%s",prompt);
Packit Service 31306d
                fgets(buffer,sizeof(buffer),stdin);
Packit Service 31306d
                buffer[sizeof(buffer)-1]=0;
Packit Service 31306d
                if((ptr=strchr(buffer,'\n')))
Packit Service 31306d
                    *ptr=0;
Packit Service 31306d
                ssh_userauth_kbdint_setanswer(session,i,buffer);
Packit Service 31306d
                memset(buffer,0,strlen(buffer));
Packit Service 31306d
            } else {
Packit Service 31306d
                ptr=getpass(prompt);
Packit Service 31306d
                ssh_userauth_kbdint_setanswer(session,i,ptr);
Packit Service 31306d
            }
Packit Service 31306d
        }
Packit Service 31306d
        err=ssh_userauth_kbdint(session,NULL,NULL);
Packit Service 31306d
    }
Packit Service 31306d
    return err;
Packit Service 31306d
}
Packit Service 31306d
Packit Service 31306d
int authenticate (SSH_SESSION *session){
Packit Service 31306d
    int auth=ssh_userauth_autopubkey(session, NULL);
Packit Service 31306d
    char *password;
Packit Service 31306d
    if(auth==SSH_AUTH_ERROR){
Packit Service 31306d
        fprintf(stderr,"Authenticating with pubkey: %s\n",ssh_get_error(session));
Packit Service 31306d
	    return auth;
Packit Service 31306d
    }
Packit Service 31306d
    if(auth!=SSH_AUTH_SUCCESS){
Packit Service 31306d
        auth=auth_kbdint(session);
Packit Service 31306d
        if(auth==SSH_AUTH_ERROR){
Packit Service 31306d
            fprintf(stderr,"authenticating with keyb-interactive: %s\n",
Packit Service 31306d
                    ssh_get_error(session));
Packit Service 31306d
            return auth;
Packit Service 31306d
        }
Packit Service 31306d
    }
Packit Service 31306d
    if(auth!=SSH_AUTH_SUCCESS){
Packit Service 31306d
        password=getpass("Password : ");
Packit Service 31306d
        auth = ssh_userauth_password(session,NULL,password);
Packit Service 31306d
        memset(password,0,strlen(password));
Packit Service 31306d
        if (auth==SSH_AUTH_ERROR){
Packit Service 31306d
            fprintf(stderr,"Authentication with password failed: %s\n",ssh_get_error(session));
Packit Service 31306d
            return auth;
Packit Service 31306d
        }
Packit Service 31306d
    }
Packit Service 31306d
    return auth;
Packit Service 31306d
}