I have tried those functions, but I can't get any information about ipforwads. 
I send the part of the code with this mail. I would like to know where to use 
those functions to get the information what I need.







At 2012-08-23 15:58:22,"Andreas Schneider" <[email protected]> wrote:
>On Tuesday 21 August 2012 15:35:49 you wrote:
>> Hi,
>
>Hi,
>
>> I have written a ssh server program  based on libssh. It can achieve the
>> basic functions of the server. Now I want to join ssh port forwarding in
>> the program.But I do not know how to achieve the response of port
>> forwarding requests.Will libssh support response port forwarding the
>> request sent by the client?I would like to ask how to achieve and are there
>> some similar examples?
>
>there is no documentation for this code.
>
>See
>
>ssh_message_channel_request_open_originator()
>ssh_message_channel_request_open_originator_port()
>ssh_message_channel_request_open_destination()
>ssh_message_channel_request_open_destination_port()
>
>The to accecpt the request. The rest is up to you to connect the local socket 
>to the ssh channel.
>
>
>       -- andreas
>
>-- 
>Andreas Schneider                   GPG-ID: F33E3FC6
>www.cryptomilk.org                [email protected]
>
>
void* work_main(void *arg)
{
        ssh_session session = NULL;
        ssh_session client_session = NULL;
        ssh_message message = NULL;
        sftp_session sftp_client_session = NULL;
        sftp_session sftp_server_session = NULL;
        ssh_channel chan = 0;
        int auth = 0;
        int sftp_flag = 0;
        int shell = 0;
        ssh_channel channel = NULL;
        int ret = 0;
        int is_auth = 0;
        int subtype;
        //start time
        long login_timeout = g_config_val->login_timeout;
        proxy_session *p_proxy_session = 0;

        proxy_auth_info *proxyauth_info = 0;
        device_auth_info *deviceauth_info = 0;
        struct in_addr addr1;
        int i;

        session = (ssh_session) arg;

        ret = ssh_handle_key_exchange(session);
        if (ret != SSH_OK)
        {
                ERROR(
                                "session[%ld] work_main: 
ssh_handle_key_exchange error.(workmain.c)(%s)\n",
                                p_proxy_session->id, ssh_get_error(session));
                ret = SSHPROXY_SEVKEYEX_ERROR;
                goto END;
        }


        do
        {

                PRINT("session[%ld] login time: login timeout: %lds\n",
                                p_proxy_session->id, login_timeout);
//              message = ssh_message_get(session);
                message = ssh_message_get_with_timeout(session, login_timeout);

                //check whether login is time out
                if (message == -1)
                {
                        DEBUG("session[%ld] login is time 
out!.(work_main,workmain.c)\n",
                                        p_proxy_session->id);
                        ret = SSHPROXY_LOGINTIMEOUT_ERROR;
                        goto END;
                }
                
                if (!message)
                        break;
                switch (ssh_message_type(message))
                {
                case SSH_REQUEST_AUTH:
                        subtype = ssh_message_subtype(message);
                        switch (subtype)
                        {
                        case SSH_AUTH_METHOD_PASSWORD:
                                DEBUG(
                                                "session[%ld]:User %s, Pass 
%s\n",
                                                p_proxy_session->id, 
ssh_message_auth_user(message), ssh_message_auth_password(message));

                                //session state: 16 get client username and 
password
                                proxy_session_set_state(p_proxy_session,
                                                PROXY_SESSION_STATE_AUTH);

                                

                                if 
(auth_password_t(proxyauth_info,deviceauth_info,p_proxy_session))
                                {
                                        DEBUG(
                                                        "username = 
%s\npassword = %s\n",
                                                        
deviceauth_info->username, deviceauth_info->password);
                                        DEBUG("hostip = %s\nport = %d\n",
                                                        
deviceauth_info->deviceip, deviceauth_info->port);
                                        DEBUG("device_index = %d\n");

                                        auth = 1;
                                        ssh_message_auth_reply_success(message, 
0);


                                        break;
                                }
                                //fixme exit password error
                                else
                                {
                                        is_auth = 1;
                                        break;
                                }
                        case SSH_AUTH_METHOD_NONE:
                        default:
                                ssh_message_auth_set_methods(message, 
SSH_AUTH_METHOD_PASSWORD);
                                ssh_message_reply_default(message);
                                break;
                        }
                        break;
                default:
                        ssh_message_reply_default(message);
                        break;
                }
                ssh_message_free(message);
                PRINT("session[%ld] auth: %d\n", p_proxy_session->id, auth);
                if (is_auth == 1)
                        break;
        } while (!auth);

        if (!auth)
        {
                ERROR("session[%ld] work_main: authentication 
error.(workmain.c)(%s)\n",
                                p_proxy_session->id, ssh_get_error(session));
                ret = SSHPROXY_SEVAUTH_ERROR;
                goto END;
        }


        do
        {
                message = ssh_message_get(session);
                
                if (message)
                {
                        if (ssh_message_type(message) == 
SSH_REQUEST_CHANNEL_OPEN
                                        && ssh_message_subtype(message) == 
SSH_CHANNEL_SESSION)
                        {
                                chan = 
ssh_message_channel_request_open_reply_accept(message);
                                ssh_message_free(message);
                                break;
                        }
                        else
                        {
                                ssh_message_reply_default(message);
                                ssh_message_free(message);
                        }
                }
                else
                {
                        break;
                }
        } while (!chan);

        if (!chan)
        {
                ERROR(
                                "session[%ld] workmain: request a channel 
failed.(workmain.c)(%s)\n",
                                p_proxy_session->id, ssh_get_error(session));
                ret = SSHPROXY_SEVCHANNEL_ERROR;
                goto END;
        }

        
        /* wait for a shell */
        do
        {
                message = ssh_message_get(session);
                //check whether session is time out
                if (proxy_session_is_timeout(p_proxy_session)
                                || proxy_session_is_killed(p_proxy_session))
                {
                        DEBUG("session[%ld] is time 
out!(work_main,workmain.c)\n",
                                        p_proxy_session->id);
                        ret = SSHPROXY_SESSIONTIMEOUT_ERROR;
                        goto END;
                }
                if (message != NULL)
                {
                        if (ssh_message_type(message) == SSH_REQUEST_CHANNEL)
                        {
                                subtype = ssh_message_subtype(message);
                                if (subtype == SSH_CHANNEL_REQUEST_SHELL)
                                {
                                        shell = 1;
                                        
ssh_message_channel_request_reply_success(message);
                                        
                                        printf("originator = 
%d",ssh_message_channel_request_open_originator(message));

                                        ssh_message_free(message);
                                        break;
                                }
                                else if (subtype == SSH_CHANNEL_REQUEST_PTY)
                                {
                                        
ssh_message_channel_request_reply_success(message);

                                        printf("originator = 
%d",ssh_message_channel_request_open_originator(message));

                                        ssh_message_free(message);
                                        continue;
                                }
                                else if (subtype == 
SSH_CHANNEL_REQUEST_SUBSYSTEM)
                                {

                        
                                        printf("originator = 
%d",ssh_message_channel_request_open_originator(message));

                                        if 
(!strcmp(ssh_message_channel_request_subsystem(message),
                                                        "sftp"))
                                        {
                                                
ssh_message_channel_request_reply_success(message);
                                                ssh_message_free(message);
                                                sftp_flag = 1;
                                                shell = 1;
                                                break;
                                        }
                                        else
                                        {
                                                ERROR(
                                                                "session[%ld] 
subsystem unknown:%s\n",
                                                                
p_proxy_session->id, ssh_message_channel_request_subsystem(message));
                                        }
                                }
                                else if (subtype == SSH_CHANNEL_REQUEST_EXEC)
                                {
                                        
ssh_message_channel_request_reply_success(message);
                                        //xxx:delete
                                        printf("originator = 
%d",ssh_message_channel_request_open_originator(message));
                                }
                        }
                        ssh_message_reply_default(message);
                        ssh_message_free(message);
                }
                else
                {
                        break;
                }
        } while (!shell);

        if (!shell)
        {
                ERROR("session[%ld] workmain: request shell 
failed.(workmain.c)(%s)\n",
                                p_proxy_session->id, ssh_get_error(session));
                ret = SSHPROXY_SEVSHELL_ERROR;
                goto END;
        }

        

        if (sftp_flag == 1)
        {
                INFO("session[%ld] is SFTP session.\n", p_proxy_session->id);
                INFO("SFTP session[%ld] connects the remote server...\n",
                                p_proxy_session->id);
                proxy_session_delete(g_proxy_mod_ssh, p_proxy_session);
                p_proxy_session = proxy_session_add(g_proxy_mod_sftp);

                if (p_proxy_session == 0)
                {
                        ERROR(
                                        "SFTP session work_main: 
proxy_session_add SFTP Failed.(workmain.c)\n");
                        goto END;
                }
                else
                {
                        
                        inet_aton(deviceauth_info->deviceip,&addr1);
                        p_proxy_session->device_ip = addr1.s_addr;
                        proxy_session_db_log_update(p_proxy_session,0,0,0);
                        DEBUG(
                                        "SFTP session[%ld]: client ip(%d), 
client port(%d)\n",
                                        p_proxy_session->id, 
p_proxy_session->client_ip, p_proxy_session->client_port);
                }

                sftp_server_session = sftp_server_new(session, chan);
                for (i = 0; i < 10; i++)
                {
                        ret = sftp_server_init(sftp_server_session);
                        if (ret && ret != -2)
                        {
                                ERROR(
                                                "SFTP session[%ld] workmain: 
sftp_server_init error.(workmain.c)(%s)\n",
                                                p_proxy_session->id, 
ssh_get_error(session));
                                //                      ssh_free(session);
                                goto END;
                        }
                        if (ret == 0)
                        {
                                break;
                        }
                }

                if (i == 10)
                {
                        ERROR(
                                        "SFTP session[%ld] workmain: 
sftp_server_init error.(workmain.c)(%s)\n",
                                        p_proxy_session->id, 
ssh_get_error(session));
                        //                      ssh_free(session);
                        goto END;
                }
                

                ret = connect_sftp_server(&sftp_client_session, p_proxy_session,
                                deviceauth_info);
                if (ret != SSH_OK)
                {
                        ERROR(
                                        "SFTP session[%ld] workmain: 
connect_sftp_server error.(workmain.c)\n",
                                        p_proxy_session->id);
                        goto END;
                }

                

                sftp_proxy_loop(sftp_server_session, sftp_client_session,
                                p_proxy_session);
//              sftp_proxy_loop_new(sftp_server_session, sftp_client_session);
//              sftp_free(sftp_server_session);
//              sftp_free(sftp_client_session);
        }
        else
        {
                

                ret = connect_ssh_server(&client_session, &channel, 
p_proxy_session,
                                deviceauth_info);
                if (ret != SSHPROXY_OK)
                {
                        ERROR(
                                        "SSH session[%ld] workmain: 
connect_ssh_server error.(workmain.c)\n",
                                        p_proxy_session->id);
                        goto END;
                }

                
                DEBUG(
                                "SSH session[%ld]: device IP(%d), device 
port(%d).\n",
                                p_proxy_session->id, 
p_proxy_session->device_ip, p_proxy_session->device_port);

                INFO("SSH session[%ld] connects the remote server OK.\n",
                                p_proxy_session->id);
                //session state:64 connect the device OK.
                proxy_session_set_state(p_proxy_session, 64);
                ssh_proxy_loop(client_session, channel, session, chan, 
p_proxy_session);
        }

        END:
        //session state: 240 start to close the session and clean the resources
        if (p_proxy_session != NULL)
        {
                proxy_session_set_state(p_proxy_session, 240);

                if (sftp_flag == 1)
                {
                        INFO("SFTP session[%ld] starts to finalize...\n",
                                        p_proxy_session->id);

                        if (sftp_client_session != NULL)
                        {
                                client_session = sftp_client_session->session;
                                sftp_free(sftp_client_session);
                                if (client_session != NULL)
                                {
                                        ssh_disconnect(client_session);
                                        ssh_free(client_session);
                                }
                        }

                        sftp_free(sftp_server_session);
                        ssh_disconnect(session);
                        ssh_free(session);
                        INFO("SFTP session[%ld] finalizes OK.\n", 
p_proxy_session->id);
                }
                else
                {
                        INFO("SSH session[%ld] starts to finalize...\n",
                                        p_proxy_session->id);
                        if (client_session != NULL)
                        {
                                ssh_disconnect(client_session);
                                ssh_free(client_session);
                        }
                        ssh_disconnect(session);
                        ssh_free(session);
                        INFO("SSH session[%ld] starts to finalize...\n",
                                        p_proxy_session->id);
                }

                if (sftp_flag == 1)
                {
                        unsigned long id_tmp = p_proxy_session->id;
                        INFO("SFTP session[%ld] is deleting from the session 
list.\n",
                                        p_proxy_session->id);
                        proxy_session_delete(g_proxy_mod_sftp, p_proxy_session);
                        INFO("SFTP session[%ld] deleted OK.\n", id_tmp);
                        INFO("######### SFTP SESSION EXIT #########\n");
                }
                else
                {
                        unsigned long id_tmp = p_proxy_session->id;
                        INFO("SSH session[%ld] is deleting from the session 
list.\n",
                                        p_proxy_session->id);
                        proxy_session_delete(g_proxy_mod_ssh, p_proxy_session);
                        INFO("SSH session[%ld] deleted OK.\n", id_tmp);
                        INFO("######### SSH SESSION EXIT #########\n");
                }
        }
        proxy_auth_proxyinfo_destroy(proxyauth_info);
        proxy_auth_deviceinfo_destroy(deviceauth_info);

        return NULL;
}





Reply via email to