pull/105/head
			
			
		
		
							parent
							
								
									73d51a2563
								
							
						
					
					
						commit
						191d007678
					
				|  | @ -1,11 +1,12 @@ | |||
| #ifndef __TS_CONST_H__ | ||||
| #define __TS_CONST_H__ | ||||
| 
 | ||||
| #define TS_WEB_URL L"http://teleport.eomsoft.net/"
 | ||||
| #define TS_BBS_URL L"http://bbs.eomsoft.net/"
 | ||||
| #define TS_TRAY_MSG L"Teleport助手正常工作中" | ||||
| 
 | ||||
| #define TS_HTTP_RPC_PORT		50022 | ||||
| #define TS_HTTP_RPC_HOST		"127.0.0.1" | ||||
| 
 | ||||
| #endif // __TS_CONST_H__
 | ||||
| #ifndef __TS_CONST_H__ | ||||
| #define __TS_CONST_H__ | ||||
| 
 | ||||
| #define TS_WEB_URL L"http://teleport.eomsoft.net/"
 | ||||
| #define TS_BBS_URL L"http://bbs.eomsoft.net/"
 | ||||
| #define TS_TRAY_MSG L"Teleport助手正常工作中" | ||||
| 
 | ||||
| #define TS_HTTP_RPC_PORT		50022 | ||||
| //#define TS_HTTP_RPC_HOST		"127.0.0.1"
 | ||||
| #define TS_HTTP_RPC_HOST		"localhost" | ||||
| 
 | ||||
| #endif // __TS_CONST_H__
 | ||||
|  |  | |||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -1,47 +1,47 @@ | |||
| #include "base_env.h" | ||||
| 
 | ||||
| TppEnvBase::TppEnvBase() | ||||
| {} | ||||
| 
 | ||||
| TppEnvBase::~TppEnvBase() | ||||
| {} | ||||
| 
 | ||||
| bool TppEnvBase::init(TPP_INIT_ARGS* args) | ||||
| { | ||||
| 	if (NULL == args) | ||||
| 	{ | ||||
| 		EXLOGE("invalid init args(1).\n"); | ||||
| 		return false; | ||||
| 	} | ||||
| 
 | ||||
| 	EXLOG_USE_LOGGER(args->logger); | ||||
| 
 | ||||
| 	exec_path = args->exec_path; | ||||
| 	etc_path = args->etc_path; | ||||
| 	replay_path = args->replay_path; | ||||
| 
 | ||||
| 	take_session = args->func_take_session; | ||||
| 	free_session = args->func_free_session; | ||||
| 	session_begin = args->func_session_begin; | ||||
| 	session_end = args->func_session_end; | ||||
| 
 | ||||
| 	if (NULL == take_session || NULL == free_session || NULL == session_begin || NULL == session_end) | ||||
| 	{ | ||||
| 		EXLOGE("invalid init args(2).\n"); | ||||
| 		return false; | ||||
| 	} | ||||
| 
 | ||||
| 	if (NULL == args->cfg) | ||||
| 	{ | ||||
| 		EXLOGE("invalid init args(3).\n"); | ||||
| 		return false; | ||||
| 	} | ||||
| 
 | ||||
| 	if (!_on_init(args)) | ||||
| 	{ | ||||
| 		EXLOGE("invalid init args(4).\n"); | ||||
| 		return false; | ||||
| 	} | ||||
| 
 | ||||
| 	return true; | ||||
| } | ||||
| #include "base_env.h" | ||||
| 
 | ||||
| TppEnvBase::TppEnvBase() | ||||
| {} | ||||
| 
 | ||||
| TppEnvBase::~TppEnvBase() | ||||
| {} | ||||
| 
 | ||||
| bool TppEnvBase::init(TPP_INIT_ARGS* args) | ||||
| { | ||||
| 	if (NULL == args) | ||||
| 	{ | ||||
| 		EXLOGE("invalid init args(1).\n"); | ||||
| 		return false; | ||||
| 	} | ||||
| 
 | ||||
| 	EXLOG_USE_LOGGER(args->logger); | ||||
| 
 | ||||
| 	exec_path = args->exec_path; | ||||
| 	etc_path = args->etc_path; | ||||
| 	replay_path = args->replay_path; | ||||
| 
 | ||||
| 	get_session = args->func_get_connect_info; | ||||
| 	free_session = args->func_free_connect_info; | ||||
| 	session_begin = args->func_session_begin; | ||||
| 	session_end = args->func_session_end; | ||||
| 
 | ||||
| 	if (NULL == get_session || NULL == free_session || NULL == session_begin || NULL == session_end) | ||||
| 	{ | ||||
| 		EXLOGE("invalid init args(2).\n"); | ||||
| 		return false; | ||||
| 	} | ||||
| 
 | ||||
| 	if (NULL == args->cfg) | ||||
| 	{ | ||||
| 		EXLOGE("invalid init args(3).\n"); | ||||
| 		return false; | ||||
| 	} | ||||
| 
 | ||||
| 	if (!_on_init(args)) | ||||
| 	{ | ||||
| 		EXLOGE("invalid init args(4).\n"); | ||||
| 		return false; | ||||
| 	} | ||||
| 
 | ||||
| 	return true; | ||||
| } | ||||
|  |  | |||
|  | @ -1,28 +1,28 @@ | |||
| #ifndef __TS_BASE_ENV_H__ | ||||
| #define __TS_BASE_ENV_H__ | ||||
| 
 | ||||
| #include "protocol_interface.h" | ||||
| 
 | ||||
| class TppEnvBase | ||||
| { | ||||
| public: | ||||
| 	TppEnvBase(); | ||||
| 	virtual ~TppEnvBase(); | ||||
| 
 | ||||
| 	bool init(TPP_INIT_ARGS* args); | ||||
| 
 | ||||
| public: | ||||
| 	ex_wstr exec_path; | ||||
| 	ex_wstr etc_path;	// 配置文件、SSH服务器的私钥文件的存放路径
 | ||||
| 	ex_wstr replay_path; | ||||
| 
 | ||||
| 	TPP_TAKE_SESSION_FUNC take_session; | ||||
| 	TPP_FREE_SESSION_FUNC free_session; | ||||
| 	TPP_SESSION_BEGIN_FUNC session_begin; | ||||
| 	TPP_SESSION_END_FUNC session_end; | ||||
| 
 | ||||
| protected: | ||||
| 	virtual bool _on_init(TPP_INIT_ARGS* args) = 0; | ||||
| }; | ||||
| 
 | ||||
| #endif // __TS_BASE_ENV_H__
 | ||||
| #ifndef __TS_BASE_ENV_H__ | ||||
| #define __TS_BASE_ENV_H__ | ||||
| 
 | ||||
| #include "protocol_interface.h" | ||||
| 
 | ||||
| class TppEnvBase | ||||
| { | ||||
| public: | ||||
| 	TppEnvBase(); | ||||
| 	virtual ~TppEnvBase(); | ||||
| 
 | ||||
| 	bool init(TPP_INIT_ARGS* args); | ||||
| 
 | ||||
| public: | ||||
| 	ex_wstr exec_path; | ||||
| 	ex_wstr etc_path;	// 配置文件、SSH服务器的私钥文件的存放路径
 | ||||
| 	ex_wstr replay_path; | ||||
| 
 | ||||
| 	TPP_GET_CONNNECT_INFO_FUNC get_session; | ||||
| 	TPP_FREE_CONNECT_INFO_FUNC free_session; | ||||
| 	TPP_SESSION_BEGIN_FUNC session_begin; | ||||
| 	TPP_SESSION_END_FUNC session_end; | ||||
| 
 | ||||
| protected: | ||||
| 	virtual bool _on_init(TPP_INIT_ARGS* args) = 0; | ||||
| }; | ||||
| 
 | ||||
| #endif // __TS_BASE_ENV_H__
 | ||||
|  |  | |||
|  | @ -16,7 +16,7 @@ TppRecBase::~TppRecBase() | |||
| { | ||||
| } | ||||
| 
 | ||||
| void TppRecBase::begin(const wchar_t* base_path, const wchar_t* base_fname, int record_id, const TPP_SESSION_INFO* info) | ||||
| void TppRecBase::begin(const wchar_t* base_path, const wchar_t* base_fname, int record_id, const TPP_CONNECT_INFO* info) | ||||
| { | ||||
| 	m_start_time = ex_get_tick_count(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,76 +1,97 @@ | |||
| #ifndef __TS_BASE_RECORD_H__ | ||||
| #define __TS_BASE_RECORD_H__ | ||||
| 
 | ||||
| #include "base_env.h" | ||||
| #include "ts_membuf.h" | ||||
| #include "protocol_interface.h" | ||||
| 
 | ||||
| #include <ex.h> | ||||
| 
 | ||||
| #define MAX_SIZE_PER_FILE 4194304  // 4M = 1024*1024*4
 | ||||
| 
 | ||||
| #pragma pack(push,1) | ||||
| 
 | ||||
| // 录像文件头
 | ||||
| typedef struct TS_RECORD_HEADER | ||||
| { | ||||
| 	ex_u32 magic;		// "TPPR" 标志 TelePort Protocol Record
 | ||||
| 	ex_u16 ver;			// 录像文件版本,目前为2
 | ||||
| 	ex_u16 protocol;	// 协议:1=RDP, 2=SSH, 3=Telnet
 | ||||
| 	ex_u64 timestamp;	// 本次录像的起始时间(UTC时间戳)
 | ||||
| 	ex_u32 packages;	// 总包数
 | ||||
| 	ex_u32 time_ms;		// 总耗时(毫秒)
 | ||||
| 	ex_u16 width;		// 初始屏幕尺寸:宽
 | ||||
| 	ex_u16 height;		// 初始屏幕尺寸:高
 | ||||
| 	ex_u16 file_count;	// 数据文件总数
 | ||||
| 	ex_u32 file_size;	// 所有数据文件的总大小(不包括每个数据文件的头,即4字节的每文件大小)
 | ||||
| 	char account[16];	// teleport账号
 | ||||
| 	char username[16];	// 远程主机用户名
 | ||||
| 	char ip[18]; | ||||
| 	ex_u16 port; | ||||
| 
 | ||||
| 	// RDP专有
 | ||||
| 	ex_u8 rdp_security;	// 0 = RDP, 1 = TLS
 | ||||
| 
 | ||||
| 	ex_u8 reserve[128 - 4 - 2 - 2 - 8 - 4 - 4 - 2 - 2 - 2 - 4 - 16 - 16 - 18 - 2 - 1];	// 保留
 | ||||
| }TS_RECORD_HEADER; | ||||
| 
 | ||||
| // 一个数据包的头
 | ||||
| typedef struct TS_RECORD_PKG | ||||
| { | ||||
| 	ex_u8 type;			// 包的数据类型
 | ||||
| 	ex_u32 size;		// 这个包的总大小(不含包头)
 | ||||
| 	ex_u32 time_ms;		// 这个包距起始时间的时间差(毫秒,意味着一个连接不能持续超过49天)
 | ||||
| 	ex_u8 reserve[3];	// 保留
 | ||||
| }TS_RECORD_PKG; | ||||
| 
 | ||||
| #pragma pack(pop) | ||||
| 
 | ||||
| class TppRecBase | ||||
| { | ||||
| public: | ||||
| 	TppRecBase(); | ||||
| 	virtual ~TppRecBase(); | ||||
| 
 | ||||
| 	void begin(const wchar_t* base_path, const wchar_t* base_fname, int record_id, const TPP_SESSION_INFO* info); | ||||
| 	void end(void); | ||||
| 
 | ||||
| 	virtual void record(ex_u8 type, const ex_u8* data, size_t size) = 0; | ||||
| 
 | ||||
| protected: | ||||
| 	virtual void _on_begin(const TPP_SESSION_INFO* info) = 0; | ||||
| 	virtual void _on_end(void) = 0; | ||||
| 
 | ||||
| protected: | ||||
| 	int m_protocol; | ||||
| 
 | ||||
| 	ex_wstr m_base_path;		// 录像文件基础路径,例如 /usr/local/eom/teleport/data/replay/ssh/123,数字编号是内部附加的,作为本次会话录像文件的目录名称
 | ||||
| 	ex_wstr m_base_fname;		// 录像文件的文件名,不含扩展名部分,内部会以此为基础合成文件全名,并将录像文件存放在 m_base_path 指向的目录中
 | ||||
| 
 | ||||
| 	ex_u64 m_start_time; | ||||
| 	ex_u64 m_last_time; | ||||
| 
 | ||||
| 	MemBuffer m_cache; | ||||
| }; | ||||
| 
 | ||||
| #endif // __TS_BASE_RECORD_H__
 | ||||
| #ifndef __TS_BASE_RECORD_H__ | ||||
| #define __TS_BASE_RECORD_H__ | ||||
| 
 | ||||
| #include "base_env.h" | ||||
| #include "ts_membuf.h" | ||||
| #include "protocol_interface.h" | ||||
| 
 | ||||
| #include <ex.h> | ||||
| 
 | ||||
| #define MAX_SIZE_PER_FILE 4194304  // 4M = 1024*1024*4
 | ||||
| 
 | ||||
| #pragma pack(push,1) | ||||
| 
 | ||||
| // 录像文件头(随着录像数据写入,会改变的部分)
 | ||||
| typedef struct TS_RECORD_HEADER_INFO | ||||
| { | ||||
| 	ex_u32 packages;	// 总包数
 | ||||
| 	ex_u32 time_ms;		// 总耗时(毫秒)
 | ||||
| 	ex_u32 file_size;	// 数据总大小(不包括文件头)
 | ||||
| }TS_RECORD_HEADER_INFO; | ||||
| 
 | ||||
| // 录像文件头(固定不变部分)
 | ||||
| typedef struct TS_RECORD_HEADER_BASIC | ||||
| { | ||||
| 	ex_u32 magic;		// "TPPR" 标志 TelePort Protocol Record
 | ||||
| 	ex_u16 ver;			// 录像文件版本,目前为3
 | ||||
| 
 | ||||
| 	ex_u16 protocol_type;		// 协议:1=RDP, 2=SSH, 3=Telnet
 | ||||
| 	ex_u16 protocol_sub_type;	// 子协议:100=RDP, 200=SSH, 201=SFTP, 300=Telnet
 | ||||
| 	ex_u64 timestamp;	// 本次录像的起始时间(UTC时间戳)
 | ||||
| 	ex_u16 width;		// 初始屏幕尺寸:宽
 | ||||
| 	ex_u16 height;		// 初始屏幕尺寸:高
 | ||||
| 	char user_name[32];	// teleport账号
 | ||||
| 	char account_name[32];	// 远程主机用户名
 | ||||
| 
 | ||||
| 	char real_remote_host_ip[40];	// 远程主机IP
 | ||||
| 	char remote_host_ip[40];	// 远程主机IP
 | ||||
| 	ex_u16 remote_host_port;	// 远程主机端口
 | ||||
| 
 | ||||
| 	char client_ip[40];		// 客户端IP
 | ||||
| 
 | ||||
| 	// RDP专有
 | ||||
| 	ex_u8 rdp_security;	// 0 = RDP, 1 = TLS
 | ||||
| 
 | ||||
| 	ex_u8 reserve[256 - 4 - 2 - 2 - 2 - 8 - 2 - 2 - 32 - 32 - 40 - 2 - 40 - 40 - 1 - 12];	// 保留,其中,最后12B是为header-info留出的空间
 | ||||
| }TS_RECORD_HEADER_BASIC; | ||||
| #define ts_record_header_basic_size sizeof(TS_RECORD_HEADER_BASIC) | ||||
| 
 | ||||
| typedef struct TS_RECORD_HEADER | ||||
| { | ||||
| 	TS_RECORD_HEADER_INFO info; | ||||
| 	TS_RECORD_HEADER_BASIC basic; | ||||
| }TS_RECORD_HEADER; | ||||
| 
 | ||||
| // header部分(header-info + header-basic) = 256B
 | ||||
| #define ts_record_header_size sizeof(TS_RECORD_HEADER) | ||||
| 
 | ||||
| 
 | ||||
| // 一个数据包的头
 | ||||
| typedef struct TS_RECORD_PKG | ||||
| { | ||||
| 	ex_u8 type;			// 包的数据类型
 | ||||
| 	ex_u32 size;		// 这个包的总大小(不含包头)
 | ||||
| 	ex_u32 time_ms;		// 这个包距起始时间的时间差(毫秒,意味着一个连接不能持续超过49天)
 | ||||
| 	ex_u8 reserve[3];	// 保留
 | ||||
| }TS_RECORD_PKG; | ||||
| 
 | ||||
| #pragma pack(pop) | ||||
| 
 | ||||
| class TppRecBase | ||||
| { | ||||
| public: | ||||
| 	TppRecBase(); | ||||
| 	virtual ~TppRecBase(); | ||||
| 
 | ||||
| 	void begin(const wchar_t* base_path, const wchar_t* base_fname, int record_id, const TPP_CONNECT_INFO* info); | ||||
| 	void end(void); | ||||
| 
 | ||||
| 	virtual void record(ex_u8 type, const ex_u8* data, size_t size) = 0; | ||||
| 
 | ||||
| protected: | ||||
| 	virtual void _on_begin(const TPP_CONNECT_INFO* info) = 0; | ||||
| 	virtual void _on_end(void) = 0; | ||||
| 
 | ||||
| protected: | ||||
| 	int m_protocol; | ||||
| 
 | ||||
| 	ex_wstr m_base_path;		// 录像文件基础路径,例如 /usr/local/eom/teleport/data/replay/ssh/123,数字编号是内部附加的,作为本次会话录像文件的目录名称
 | ||||
| 	ex_wstr m_base_fname;		// 录像文件的文件名,不含扩展名部分,内部会以此为基础合成文件全名,并将录像文件存放在 m_base_path 指向的目录中
 | ||||
| 
 | ||||
| 	ex_u64 m_start_time; | ||||
| 	ex_u64 m_last_time; | ||||
| 
 | ||||
| 	MemBuffer m_cache; | ||||
| }; | ||||
| 
 | ||||
| #endif // __TS_BASE_RECORD_H__
 | ||||
|  |  | |||
|  | @ -1,73 +1,75 @@ | |||
| #ifndef __TP_PROTOCOL_INTERFACE_H__ | ||||
| #define __TP_PROTOCOL_INTERFACE_H__ | ||||
| 
 | ||||
| #include "ts_const.h" | ||||
| #include <ex.h> | ||||
| 
 | ||||
| #ifdef EX_OS_WIN32 | ||||
| #	ifdef TPP_EXPORTS | ||||
| #		define TPP_API __declspec(dllexport) | ||||
| #	else | ||||
| #		define TPP_API __declspec(dllimport) | ||||
| #	endif | ||||
| #else | ||||
| #	define TPP_API | ||||
| #endif | ||||
| 
 | ||||
| typedef struct TPP_SESSION_INFO | ||||
| { | ||||
| 	char* sid; | ||||
| 	char* account_name;	// 申请本次连接的用户名
 | ||||
| 	char* host_ip; | ||||
| 	char* user_name; | ||||
| 	char* user_auth; | ||||
| 	char* user_param; | ||||
| 	int host_port; | ||||
| 	int protocol; | ||||
| 	int auth_id; | ||||
| 	int auth_mode; | ||||
| 	int sys_type; | ||||
| 	int ref_count;	// 这个session可以被take_session()多少次
 | ||||
| 	ex_u64 ticket_start; | ||||
| }TPP_SESSION_INFO; | ||||
| 
 | ||||
| typedef TPP_SESSION_INFO* (*TPP_TAKE_SESSION_FUNC)(const char* sid); | ||||
| typedef void(*TPP_FREE_SESSION_FUNC)(TPP_SESSION_INFO* info); | ||||
| typedef bool(*TPP_SESSION_BEGIN_FUNC)(const TPP_SESSION_INFO* info, int* db_id); | ||||
| typedef bool(*TPP_SESSION_END_FUNC)(int db_id, int ret); | ||||
| 
 | ||||
| 
 | ||||
| typedef struct TPP_INIT_ARGS | ||||
| { | ||||
| 	ExLogger* logger; | ||||
| 	ex_wstr exec_path; | ||||
| 	ex_wstr etc_path; | ||||
| 	ex_wstr replay_path; | ||||
| 	ExIniFile* cfg; | ||||
| 
 | ||||
| 	TPP_TAKE_SESSION_FUNC func_take_session; | ||||
| 	TPP_FREE_SESSION_FUNC func_free_session; | ||||
| 	TPP_SESSION_BEGIN_FUNC func_session_begin; | ||||
| 	TPP_SESSION_END_FUNC func_session_end; | ||||
| }TPP_INIT_ARGS; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" | ||||
| { | ||||
| #endif | ||||
| 
 | ||||
| 	TPP_API ex_rv tpp_init(TPP_INIT_ARGS* init_args); | ||||
| 	TPP_API ex_rv tpp_start(void); | ||||
| 	TPP_API ex_rv tpp_stop(void); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| typedef ex_rv (*TPP_INIT_FUNC)(TPP_INIT_ARGS* init_args); | ||||
| typedef ex_rv (*TPP_START_FUNC)(void); | ||||
| typedef ex_rv (*TPP_STOP_FUNC)(void); | ||||
| 
 | ||||
| #endif // __TP_PROTOCOL_INTERFACE_H__
 | ||||
| #ifndef __TP_PROTOCOL_INTERFACE_H__ | ||||
| #define __TP_PROTOCOL_INTERFACE_H__ | ||||
| 
 | ||||
| #include "ts_const.h" | ||||
| #include <ex.h> | ||||
| 
 | ||||
| #ifdef EX_OS_WIN32 | ||||
| #	ifdef TPP_EXPORTS | ||||
| #		define TPP_API __declspec(dllexport) | ||||
| #	else | ||||
| #		define TPP_API __declspec(dllimport) | ||||
| #	endif | ||||
| #else | ||||
| #	define TPP_API | ||||
| #endif | ||||
| 
 | ||||
| typedef struct TPP_CONNECT_INFO | ||||
| { | ||||
| 	char* sid; | ||||
| 	char* user_name;		// 申请本次连接的用户名
 | ||||
| 	char* real_remote_host_ip;	// 真正的远程主机IP(如果是直接连接模式,则与remote_host_ip相同)
 | ||||
| 	char* remote_host_ip;	// 要连接的远程主机的IP(如果是端口映射模式,则为路由主机的IP)
 | ||||
| 	char* account_name;		// 远程主机的账号
 | ||||
| 	char* account_secret;	// 远程主机账号的密码(或者私钥)
 | ||||
| 	char* user_param; | ||||
| 	int remote_host_port;	// 要连接的远程主机的端口(如果是端口映射模式,则为路由主机的端口)
 | ||||
| 	int protocol_type; | ||||
| 	int protocol_sub_type; | ||||
| 	//int auth_id;
 | ||||
| 	int auth_type; | ||||
| 	int sys_type; | ||||
| 	int ref_count;			// 这个连接信息的引用计数,如果创建的连接信息从来未被使用,则超过60秒后自动销毁
 | ||||
| 	ex_u64 ticket_start;	// 此连接信息的创建时间(用于超时未使用就销毁的功能)
 | ||||
| }TPP_CONNECT_INFO; | ||||
| 
 | ||||
| typedef TPP_CONNECT_INFO* (*TPP_GET_CONNNECT_INFO_FUNC)(const char* sid); | ||||
| typedef void(*TPP_FREE_CONNECT_INFO_FUNC)(TPP_CONNECT_INFO* info); | ||||
| typedef bool(*TPP_SESSION_BEGIN_FUNC)(const TPP_CONNECT_INFO* info, int* db_id); | ||||
| typedef bool(*TPP_SESSION_END_FUNC)(const char* sid, int db_id, int ret); | ||||
| 
 | ||||
| 
 | ||||
| typedef struct TPP_INIT_ARGS | ||||
| { | ||||
| 	ExLogger* logger; | ||||
| 	ex_wstr exec_path; | ||||
| 	ex_wstr etc_path; | ||||
| 	ex_wstr replay_path; | ||||
| 	ExIniFile* cfg; | ||||
| 
 | ||||
| 	TPP_GET_CONNNECT_INFO_FUNC func_get_connect_info; | ||||
| 	TPP_FREE_CONNECT_INFO_FUNC func_free_connect_info; | ||||
| 	TPP_SESSION_BEGIN_FUNC func_session_begin; | ||||
| 	TPP_SESSION_END_FUNC func_session_end; | ||||
| }TPP_INIT_ARGS; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" | ||||
| { | ||||
| #endif | ||||
| 
 | ||||
| 	TPP_API ex_rv tpp_init(TPP_INIT_ARGS* init_args); | ||||
| 	TPP_API ex_rv tpp_start(void); | ||||
| 	TPP_API ex_rv tpp_stop(void); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| typedef ex_rv (*TPP_INIT_FUNC)(TPP_INIT_ARGS* init_args); | ||||
| typedef ex_rv (*TPP_START_FUNC)(void); | ||||
| typedef ex_rv (*TPP_STOP_FUNC)(void); | ||||
| 
 | ||||
| #endif // __TP_PROTOCOL_INTERFACE_H__
 | ||||
|  |  | |||
|  | @ -3,18 +3,18 @@ | |||
| 
 | ||||
| //#include "ts_types.h"
 | ||||
| 
 | ||||
| // #define TS_RDP_PROXY_PORT		3389
 | ||||
| // #define TS_RDP_PROXY_HOST		"0.0.0.0"
 | ||||
| // 
 | ||||
| // #define TS_SSH_PROXY_PORT		22
 | ||||
| // #define TS_SSH_PROXY_HOST		"0.0.0.0"
 | ||||
| // 
 | ||||
| // #define TS_TELNET_PROXY_PORT		23
 | ||||
| // #define TS_TELNET_PROXY_HOST		"0.0.0.0"
 | ||||
| #define TS_RDP_PROXY_PORT		52089 | ||||
| #define TS_RDP_PROXY_HOST		"0.0.0.0" | ||||
| 
 | ||||
| #define TS_SSH_PROXY_PORT		52189 | ||||
| #define TS_SSH_PROXY_HOST		"0.0.0.0" | ||||
| 
 | ||||
| #define TS_TELNET_PROXY_PORT	52389 | ||||
| #define TS_TELNET_PROXY_HOST	"0.0.0.0" | ||||
| 
 | ||||
| #define TS_HTTP_RPC_PORT		52080 | ||||
| #define TS_HTTP_RPC_HOST		"127.0.0.1" | ||||
| //#define TS_HTTP_RPC_HOST		"0.0.0.0"
 | ||||
| //#define TS_HTTP_RPC_HOST		"127.0.0.1"
 | ||||
| #define TS_HTTP_RPC_HOST		"localhost" | ||||
| 
 | ||||
| 
 | ||||
| #define TS_RDP_PROTOCOL_RDP          0 | ||||
|  |  | |||
|  | @ -128,8 +128,8 @@ bool TsEnv::init(bool load_config) | |||
| 	else | ||||
| 	{ | ||||
| 		ex_wstr2astr(tmp, rpc_bind_ip); | ||||
| 		if (rpc_bind_ip == "localhost") | ||||
| 			rpc_bind_ip = "127.0.0.1"; | ||||
| 		//if (rpc_bind_ip == "localhost")
 | ||||
| 		//	rpc_bind_ip = "127.0.0.1";
 | ||||
| 	} | ||||
| 
 | ||||
| 	if (!ps->GetInt(L"bind-port", rpc_bind_port)) | ||||
|  |  | |||
|  | @ -647,181 +647,3 @@ void TsHttpRpc::_rpc_func_enc(const Json::Value& json_param, ex_astr& buf) | |||
| 	jr_data["c"] = cipher_text; | ||||
| 	_create_json_ret(buf, TPE_OK, jr_data); | ||||
| } | ||||
| 
 | ||||
| #if 0 | ||||
| void TsHttpRpc::_rpc_func_get_auth_id(const ex_astr& func_args, ex_astr& buf) | ||||
| { | ||||
| 	// 获取所有的或者指定主机的认证ID
 | ||||
| 	// 入参: {"host":"host-ip-address"} 或者 无
 | ||||
| 	// 示例: {"host":"123.45.67.89"}
 | ||||
| 	//   host: 要查询的主机的IP地址
 | ||||
| 	// 返回:
 | ||||
| 	//   data域为一个列表,其中每一个元素为一组键值对。
 | ||||
| 	//      
 | ||||
| 	//   错误返回: {"code":1234}
 | ||||
| 
 | ||||
| 	Json::Reader jreader; | ||||
| 	Json::Value jsRoot; | ||||
| 
 | ||||
| 	AuthInfo2Vec ret; | ||||
| 
 | ||||
| 	if (0 == func_args.length()) | ||||
| 	{ | ||||
| 		if (!g_db.get_auth_id_list_by_all(ret)) | ||||
| 		{ | ||||
| 			_create_json_ret(buf, TSR_DATA_LEN_ZERO); | ||||
| 			return; | ||||
| 		} | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		if (!jreader.parse(func_args.c_str(), jsRoot)) | ||||
| 		{ | ||||
| 			_create_json_ret(buf, TSR_INVALID_JSON_FORMAT); | ||||
| 			return; | ||||
| 		} | ||||
| 		if (jsRoot.isArray()) | ||||
| 		{ | ||||
| 			_create_json_ret(buf, TSR_INVALID_JSON_PARAM); | ||||
| 			return; | ||||
| 		} | ||||
| 
 | ||||
| 		ex_astr host_ip; | ||||
| 
 | ||||
| 		if (jsRoot["host"].isNull() || !jsRoot["host"].isString()) | ||||
| 		{ | ||||
| 			_create_json_ret(buf, TSR_INVALID_JSON_PARAM); | ||||
| 			return; | ||||
| 		} | ||||
| 
 | ||||
| 		host_ip = jsRoot["host"].asCString(); | ||||
| 		if (host_ip.length() == 0) | ||||
| 		{ | ||||
| 			_create_json_ret(buf, TSR_INVALID_JSON_PARAM); | ||||
| 			return; | ||||
| 		} | ||||
| 
 | ||||
| 		if (!g_db.get_auth_id_list_by_ip(host_ip, ret)) | ||||
| 		{ | ||||
| 			_create_json_ret(buf, TSR_DATA_LEN_ZERO); | ||||
| 			return; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (ret.size() == 0) | ||||
| 	{ | ||||
| 		_create_json_ret(buf, TSR_DATA_LEN_ZERO); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	//EXLOGV("encrypt: [%s]=>[%s]\n", plain_text.c_str(), cipher_text.c_str());
 | ||||
| 
 | ||||
| 	Json::Value jr_root; | ||||
| 	jr_root["code"] = TSR_OK; | ||||
| 
 | ||||
| 	int i = 0; | ||||
| 	AuthInfo2Vec::iterator it = ret.begin(); | ||||
| 	for (; it != ret.end(); ++it) | ||||
| 	{ | ||||
| 		jr_root["data"][i]["auth_id"] = (*it).auth_id; | ||||
| 		jr_root["data"][i]["host_id"] = (*it).host_id; | ||||
| 		jr_root["data"][i]["host_ip"] = (*it).host_ip; | ||||
| 		jr_root["data"][i]["protocol"] = (*it).pro_type; | ||||
| 		jr_root["data"][i]["auth_mode"] = (*it).auth_mode; | ||||
| 		jr_root["data"][i]["host_status"] = (*it).host_lock; | ||||
| 
 | ||||
| 		i++; | ||||
| 	} | ||||
| 
 | ||||
| 	_create_json_ret(buf, jr_root); | ||||
| } | ||||
| 
 | ||||
| void TsHttpRpc::_rpc_func_get_auth_info(const ex_astr& func_args, ex_astr& buf) | ||||
| { | ||||
| 	// 获取所有的或者指定主机的认证INFO
 | ||||
| 	// 入参: {"host":"host-ip-address"} 或者 无
 | ||||
| 	// 示例: {"host":"123.45.67.89"}
 | ||||
| 	//   host: 要查询的主机的IP地址
 | ||||
| 	// 返回:
 | ||||
| 	//   data域为一个列表,其中每一个元素为一组键值对。
 | ||||
| 	//      
 | ||||
| 	//   错误返回: {"code":1234}
 | ||||
| 
 | ||||
| 	Json::Reader jreader; | ||||
| 	Json::Value jsRoot; | ||||
| 
 | ||||
| 	AuthInfo3Vec ret; | ||||
| 
 | ||||
| 	if (0 == func_args.length()) | ||||
| 	{ | ||||
| 		if (!g_db.get_auth_info_list_by_all(ret)) | ||||
| 		{ | ||||
| 			_create_json_ret(buf, TSR_DATA_LEN_ZERO); | ||||
| 			return; | ||||
| 		} | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		if (!jreader.parse(func_args.c_str(), jsRoot)) | ||||
| 		{ | ||||
| 			_create_json_ret(buf, TSR_INVALID_JSON_FORMAT); | ||||
| 			return; | ||||
| 		} | ||||
| 		if (jsRoot.isArray()) | ||||
| 		{ | ||||
| 			_create_json_ret(buf, TSR_INVALID_JSON_PARAM); | ||||
| 			return; | ||||
| 		} | ||||
| 
 | ||||
| 		ex_astr host_ip; | ||||
| 
 | ||||
| 		if (jsRoot["host"].isNull() || !jsRoot["host"].isString()) | ||||
| 		{ | ||||
| 			_create_json_ret(buf, TSR_INVALID_JSON_PARAM); | ||||
| 			return; | ||||
| 		} | ||||
| 
 | ||||
| 		host_ip = jsRoot["host"].asCString(); | ||||
| 		if (host_ip.length() == 0) | ||||
| 		{ | ||||
| 			_create_json_ret(buf, TSR_INVALID_JSON_PARAM); | ||||
| 			return; | ||||
| 		} | ||||
| 
 | ||||
| 		if (!g_db.get_auth_info_list_by_ip(host_ip, ret)) | ||||
| 		{ | ||||
| 			_create_json_ret(buf, TSR_DATA_LEN_ZERO); | ||||
| 			return; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (ret.size() == 0) | ||||
| 	{ | ||||
| 		_create_json_ret(buf, TSR_DATA_LEN_ZERO); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	//EXLOGV("encrypt: [%s]=>[%s]\n", plain_text.c_str(), cipher_text.c_str());
 | ||||
| 
 | ||||
| 	Json::Value jr_root; | ||||
| 	jr_root["code"] = TSR_OK; | ||||
| 
 | ||||
| 	int i = 0; | ||||
| 	AuthInfo3Vec::iterator it = ret.begin(); | ||||
| 	for (; it != ret.end(); ++it) | ||||
| 	{ | ||||
| 		jr_root["data"][i]["host_id"] = (*it).host_id; | ||||
| 		jr_root["data"][i]["host_ip"] = (*it).host_ip; | ||||
| 		jr_root["data"][i]["username"] = (*it).host_user_name; | ||||
| 		jr_root["data"][i]["password"] = (*it).host_user_pwd; | ||||
| 		jr_root["data"][i]["auth_mode"] = (*it).auth_mode; | ||||
| 		jr_root["data"][i]["key_id"] = (*it).cert_id; | ||||
| 		jr_root["data"][i]["key_pri"] = (*it).cert_pri; | ||||
| 		jr_root["data"][i]["key_pub"] = (*it).cert_pub; | ||||
| 
 | ||||
| 		i++; | ||||
| 	} | ||||
| 
 | ||||
| 	_create_json_ret(buf, jr_root); | ||||
| } | ||||
| #endif | ||||
|  |  | |||
|  | @ -9,32 +9,34 @@ | |||
| 
 | ||||
| bool g_exit_flag = false; | ||||
| 
 | ||||
| TPP_SESSION_INFO* tpp_take_session(const char* sid) | ||||
| TPP_CONNECT_INFO* tpp_get_session(const char* sid) | ||||
| { | ||||
| 	TS_SESSION_INFO sinfo; | ||||
| 	bool ret = g_session_mgr.take_session(sid, sinfo); | ||||
| 	if (!ret) | ||||
| 		return NULL; | ||||
| 
 | ||||
| 	TPP_SESSION_INFO* info = (TPP_SESSION_INFO*)calloc(1, sizeof(TPP_SESSION_INFO)); | ||||
| 	TPP_CONNECT_INFO* info = (TPP_CONNECT_INFO*)calloc(1, sizeof(TPP_CONNECT_INFO)); | ||||
| 
 | ||||
| 	info->sid = (char*)calloc(1, sinfo.sid.length() + 1); | ||||
| 	ex_strcpy(info->sid, sinfo.sid.length() + 1, sinfo.sid.c_str()); | ||||
| 	info->account_name = (char*)calloc(1, sinfo.account_name.length() + 1); | ||||
| 	ex_strcpy(info->account_name, sinfo.account_name.length() + 1, sinfo.account_name.c_str()); | ||||
| 	info->host_ip = (char*)calloc(1, sinfo.host_ip.length() + 1); | ||||
| 	ex_strcpy(info->host_ip, sinfo.host_ip.length() + 1, sinfo.host_ip.c_str()); | ||||
| 	info->real_remote_host_ip = (char*)calloc(1, sinfo.host_ip.length() + 1); | ||||
| 	ex_strcpy(info->real_remote_host_ip, sinfo.host_ip.length() + 1, sinfo.host_ip.c_str()); | ||||
| 	info->remote_host_ip = (char*)calloc(1, sinfo.host_ip.length() + 1); | ||||
| 	ex_strcpy(info->remote_host_ip, sinfo.host_ip.length() + 1, sinfo.host_ip.c_str()); | ||||
| 	info->user_name = (char*)calloc(1, sinfo.user_name.length() + 1); | ||||
| 	ex_strcpy(info->user_name, sinfo.user_name.length() + 1, sinfo.user_name.c_str()); | ||||
| 	info->user_auth = (char*)calloc(1, sinfo.user_auth.length() + 1); | ||||
| 	ex_strcpy(info->user_auth, sinfo.user_auth.length() + 1, sinfo.user_auth.c_str()); | ||||
| 	info->account_secret = (char*)calloc(1, sinfo.user_auth.length() + 1); | ||||
| 	ex_strcpy(info->account_secret, sinfo.user_auth.length() + 1, sinfo.user_auth.c_str()); | ||||
| 	info->user_param = (char*)calloc(1, sinfo.user_param.length() + 1); | ||||
| 	ex_strcpy(info->user_param, sinfo.user_param.length() + 1, sinfo.user_param.c_str()); | ||||
| 
 | ||||
| 	info->auth_id = sinfo.auth_id; | ||||
| 	info->host_port = sinfo.host_port; | ||||
| 	info->protocol = sinfo.protocol; | ||||
| 	info->auth_mode = sinfo.auth_mode; | ||||
| 	//info->auth_id = sinfo.auth_id;
 | ||||
| 	info->remote_host_port = sinfo.host_port; | ||||
| 	info->protocol_type = sinfo.protocol; | ||||
| 	info->auth_type= sinfo.auth_mode; | ||||
| 	info->sys_type = sinfo.sys_type; | ||||
| 	info->ref_count = sinfo.ref_count; | ||||
| 	info->ticket_start = sinfo.ticket_start; | ||||
|  | @ -42,21 +44,22 @@ TPP_SESSION_INFO* tpp_take_session(const char* sid) | |||
| 	return info; | ||||
| } | ||||
| 
 | ||||
| void tpp_free_session(TPP_SESSION_INFO* info) | ||||
| void tpp_free_session(TPP_CONNECT_INFO* info) | ||||
| { | ||||
| 	if (NULL == info) | ||||
| 		return; | ||||
| 
 | ||||
| 	free(info->sid); | ||||
| 	free(info->account_name); | ||||
| 	free(info->host_ip); | ||||
| 	free(info->user_name); | ||||
| 	free(info->user_auth); | ||||
| 	free(info->real_remote_host_ip); | ||||
| 	free(info->remote_host_ip); | ||||
| 	free(info->account_name); | ||||
| 	free(info->account_secret); | ||||
| 	free(info->user_param); | ||||
| 	free(info); | ||||
| } | ||||
| 
 | ||||
| bool tpp_session_begin(const TPP_SESSION_INFO* info, int* db_id) | ||||
| bool tpp_session_begin(const TPP_CONNECT_INFO* info, int* db_id) | ||||
| { | ||||
| 	if (NULL == info || NULL == db_id) | ||||
| 		return false; | ||||
|  | @ -79,9 +82,9 @@ bool tpp_session_begin(const TPP_SESSION_INFO* info, int* db_id) | |||
| 	return ts_web_rpc_session_begin(sinfo, *db_id); | ||||
| } | ||||
| 
 | ||||
| bool tpp_session_end(int db_id, int ret) | ||||
| bool tpp_session_end(const char* sid, int db_id, int ret) | ||||
| { | ||||
| 	return ts_web_rpc_session_end(db_id, ret); | ||||
| 	return ts_web_rpc_session_end(sid, db_id, ret); | ||||
| } | ||||
| 
 | ||||
| typedef struct TPP_LIB | ||||
|  |  | |||
|  | @ -105,7 +105,7 @@ ex_rv TsSessionManager::request_session( | |||
| 	return EXRV_FAILED; | ||||
| } | ||||
| 
 | ||||
| bool TsSessionManager::take_session(const ex_astr& sid, TS_SESSION_INFO& info) | ||||
| bool TsSessionManager::get_session(const ex_astr& sid, TS_SESSION_INFO& info) | ||||
| { | ||||
| 	ExThreadSmartLock locker(m_lock); | ||||
| 
 | ||||
|  | @ -129,12 +129,12 @@ bool TsSessionManager::take_session(const ex_astr& sid, TS_SESSION_INFO& info) | |||
| 	info.ref_count = it->second->ref_count; | ||||
| 	info.ticket_start = it->second->ticket_start; | ||||
| 
 | ||||
| 	it->second->ref_count--; | ||||
| 	if (it->second->ref_count <= 0) | ||||
| 	{ | ||||
| 		delete it->second; | ||||
| 		m_sessions.erase(it); | ||||
| 	} | ||||
| 	it->second->ref_count++; | ||||
| // 	if (it->second->ref_count <= 0)
 | ||||
| // 	{
 | ||||
| // 		delete it->second;
 | ||||
| // 		m_sessions.erase(it);
 | ||||
| // 	}
 | ||||
| 
 | ||||
| 	return true; | ||||
| } | ||||
|  |  | |||
|  | @ -1,73 +1,73 @@ | |||
| #ifndef __TS_SESSION_H__ | ||||
| #define __TS_SESSION_H__ | ||||
| 
 | ||||
| #include "../common/ts_const.h" | ||||
| #include "../common/protocol_interface.h" | ||||
| 
 | ||||
| #include <ex.h> | ||||
| 
 | ||||
| typedef struct TS_SESSION_INFO | ||||
| { | ||||
| 	ex_astr sid; | ||||
| 	ex_astr account_name;	// 申请本次连接的用户名
 | ||||
| 
 | ||||
| 	int auth_id; | ||||
| 	ex_astr host_ip; | ||||
| 	int host_port; | ||||
| 	int protocol; | ||||
| 	ex_astr user_name; | ||||
| 	ex_astr user_auth; | ||||
| 	ex_astr user_param; | ||||
| 	int auth_mode; | ||||
| 	int sys_type; | ||||
| 
 | ||||
| 	int ref_count;	// 这个session可以被take_session()多少次
 | ||||
| 	ex_u64 ticket_start; | ||||
| }TS_SESSION_INFO; | ||||
| 
 | ||||
| typedef std::map<ex_astr, TS_SESSION_INFO*> ts_sessiones; | ||||
| 
 | ||||
| class TsSessionManager : public ExThreadBase | ||||
| { | ||||
| public: | ||||
| 	TsSessionManager(); | ||||
| 	~TsSessionManager(); | ||||
| 
 | ||||
| 	// 申请一个session-id。
 | ||||
| 	ex_rv request_session( | ||||
| 		ex_astr& sid,	// 返回的session-id
 | ||||
| 		ex_astr account_name, | ||||
| 		int auth_id, | ||||
| 		const ex_astr& host_ip, // 要连接的主机IP
 | ||||
| 		int host_port,  // 要连接的主机端口
 | ||||
| 		int sys_type,   // 主机操作系统类型
 | ||||
| 		int protocol,  // 要使用的协议,1=rdp, 2=ssh
 | ||||
| 		const ex_astr& user_name, // 认证信息中的用户名
 | ||||
| 		const ex_astr& user_auth, // 认证信息,密码或私钥
 | ||||
| 		const ex_astr& user_param, //
 | ||||
| 		int auth_mode // 认证方式,1=password,2=private-key
 | ||||
| 	); | ||||
| 
 | ||||
| 	// 根据sid得到session信息,然后被查询的sid被从session管理器列表中移除
 | ||||
| 	bool take_session(const ex_astr& sid, TS_SESSION_INFO& info); | ||||
| 
 | ||||
| protected: | ||||
| 	// 线程循环
 | ||||
| 	void _thread_loop(void); | ||||
| 	// 设置停止标志,让线程能够正常结束
 | ||||
| 	void _set_stop_flag(void); | ||||
| 
 | ||||
| private: | ||||
| 	bool _add_session(ex_astr& sid, TS_SESSION_INFO* info); | ||||
| 	void _gen_session_id(ex_astr& sid, const TS_SESSION_INFO* info, int len); | ||||
| 	void _check_sessions(void); | ||||
| 
 | ||||
| private: | ||||
| 	ExThreadLock m_lock; | ||||
| 	ts_sessiones m_sessions; | ||||
| }; | ||||
| 
 | ||||
| extern TsSessionManager g_session_mgr; | ||||
| 
 | ||||
| #endif // __TS_SESSION_H__
 | ||||
| 
 | ||||
| #ifndef __TS_SESSION_H__ | ||||
| #define __TS_SESSION_H__ | ||||
| 
 | ||||
| #include "../common/ts_const.h" | ||||
| #include "../common/protocol_interface.h" | ||||
| 
 | ||||
| #include <ex.h> | ||||
| 
 | ||||
| typedef struct TS_SESSION_INFO | ||||
| { | ||||
| 	ex_astr sid; | ||||
| 	ex_astr account_name;	// 申请本次连接的用户名
 | ||||
| 
 | ||||
| 	//int auth_id;
 | ||||
| 	ex_astr host_ip; | ||||
| 	int host_port; | ||||
| 	int protocol; | ||||
| 	ex_astr user_name; | ||||
| 	ex_astr user_auth; | ||||
| 	ex_astr user_param; | ||||
| 	int auth_mode; | ||||
| 	int sys_type; | ||||
| 
 | ||||
| 	int ref_count; | ||||
| 	ex_u64 ticket_start; | ||||
| }TS_SESSION_INFO; | ||||
| 
 | ||||
| typedef std::map<ex_astr, TS_SESSION_INFO*> ts_sessiones; | ||||
| 
 | ||||
| class TsSessionManager : public ExThreadBase | ||||
| { | ||||
| public: | ||||
| 	TsSessionManager(); | ||||
| 	~TsSessionManager(); | ||||
| 
 | ||||
| 	// 申请一个session-id。
 | ||||
| 	ex_rv request_session( | ||||
| 		ex_astr& sid,	// 返回的session-id
 | ||||
| 		ex_astr account_name, | ||||
| 		int auth_id, | ||||
| 		const ex_astr& host_ip, // 要连接的主机IP
 | ||||
| 		int host_port,  // 要连接的主机端口
 | ||||
| 		int sys_type,   // 主机操作系统类型
 | ||||
| 		int protocol,  // 要使用的协议,1=rdp, 2=ssh
 | ||||
| 		const ex_astr& user_name, // 认证信息中的用户名
 | ||||
| 		const ex_astr& user_auth, // 认证信息,密码或私钥
 | ||||
| 		const ex_astr& user_param, //
 | ||||
| 		int auth_mode // 认证方式,1=password,2=private-key
 | ||||
| 	); | ||||
| 
 | ||||
| 	// 根据sid得到session信息
 | ||||
| 	bool get_session(const ex_astr& sid, TS_SESSION_INFO& info); | ||||
| 
 | ||||
| protected: | ||||
| 	// 线程循环
 | ||||
| 	void _thread_loop(void); | ||||
| 	// 设置停止标志,让线程能够正常结束
 | ||||
| 	void _set_stop_flag(void); | ||||
| 
 | ||||
| private: | ||||
| 	bool _add_session(ex_astr& sid, TS_SESSION_INFO* info); | ||||
| 	void _gen_session_id(ex_astr& sid, const TS_SESSION_INFO* info, int len); | ||||
| 	void _check_sessions(void); | ||||
| 
 | ||||
| private: | ||||
| 	ExThreadLock m_lock; | ||||
| 	ts_sessiones m_sessions; | ||||
| }; | ||||
| 
 | ||||
| extern TsSessionManager g_session_mgr; | ||||
| 
 | ||||
| #endif // __TS_SESSION_H__
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -144,8 +144,11 @@ bool ts_web_rpc_session_begin(TS_SESSION_INFO& info, int& record_id) | |||
| } | ||||
| 
 | ||||
| //session ½áÊø
 | ||||
| bool ts_web_rpc_session_end(int record_id, int ret_code) | ||||
| bool ts_web_rpc_session_end(const char* sid, int record_id, int ret_code) | ||||
| { | ||||
| 	// TODO: 对指定的sid相关的会话的引用计数减一(但减到0时销毁)
 | ||||
| 
 | ||||
| 
 | ||||
| 	Json::FastWriter json_writer; | ||||
| 	Json::Value jreq; | ||||
| 	jreq["method"] = "session_end"; | ||||
|  |  | |||
|  | @ -14,7 +14,7 @@ int ts_web_rpc_get_conn_info(int conn_id, Json::Value& jret); | |||
| // 记录会话的开始
 | ||||
| bool ts_web_rpc_session_begin(TS_SESSION_INFO& info, int& record_id); | ||||
| //session 结束
 | ||||
| bool ts_web_rpc_session_end(int id, int ret_code); | ||||
| bool ts_web_rpc_session_end(const char* sid, int id, int ret_code); | ||||
| 
 | ||||
| 
 | ||||
| #endif // __TS_WEB_RPC_H__
 | ||||
|  |  | |||
|  | @ -1,4 +1,5 @@ | |||
| #include "ssh_recorder.h" | ||||
| #include <teleport_const.h> | ||||
| 
 | ||||
| static ex_u8 TPP_RECORD_MAGIC[4] = { 'T', 'P', 'P', 'R' }; | ||||
| 
 | ||||
|  | @ -7,9 +8,8 @@ TppSshRec::TppSshRec() | |||
| 	m_cmd_cache.reserve(MAX_SIZE_PER_FILE); | ||||
| 
 | ||||
| 	memset(&m_head, 0, sizeof(TS_RECORD_HEADER)); | ||||
| 	memcpy((ex_u8*)(&m_head.magic), TPP_RECORD_MAGIC, sizeof(ex_u32)); | ||||
| 	m_head.ver = 0x02; | ||||
| 	m_head.protocol = TS_PROXY_PROTOCOL_SSH; | ||||
| 	memcpy((ex_u8*)(&m_head.basic.magic), TPP_RECORD_MAGIC, sizeof(ex_u32)); | ||||
| 	m_head.basic.ver = 0x02; | ||||
| } | ||||
| 
 | ||||
| TppSshRec::~TppSshRec() | ||||
|  | @ -17,19 +17,22 @@ TppSshRec::~TppSshRec() | |||
| 	end(); | ||||
| } | ||||
| 
 | ||||
| void TppSshRec::_on_begin(const TPP_SESSION_INFO* info) | ||||
| void TppSshRec::_on_begin(const TPP_CONNECT_INFO* info) | ||||
| { | ||||
| 	if (NULL == info) | ||||
| 		return; | ||||
| 	m_head.timestamp = time(NULL); | ||||
| 	m_head.port = info->host_port; | ||||
| 	m_head.basic.timestamp = time(NULL); | ||||
| 	m_head.basic.protocol_type = info->protocol_type; | ||||
| 	m_head.basic.protocol_sub_type = info->protocol_sub_type; | ||||
| 	m_head.basic.remote_host_port = info->remote_host_port; | ||||
| 	// 	memcpy(m_head.account, info.account_name.c_str(), info.account_name.length() > 15 ? 15 : info.account_name.length());
 | ||||
| 	// 	memcpy(m_head.username, info.user_name.c_str(), info.user_name.length() > 15 ? 15 : info.user_name.length());
 | ||||
| 	// 	memcpy(m_head.ip, info.host_ip.c_str(), info.host_ip.length() > 17 ? 17 : info.host_ip.length());
 | ||||
| 
 | ||||
| 	memcpy(m_head.account, info->account_name, strlen(info->account_name) > 15 ? 15 : strlen(info->account_name)); | ||||
| 	memcpy(m_head.username, info->user_name, strlen(info->user_name) > 15 ? 15 : strlen(info->user_name)); | ||||
| 	memcpy(m_head.ip, info->host_ip, strlen(info->host_ip) > 17 ? 17 : strlen(info->host_ip)); | ||||
| 	memcpy(m_head.basic.account_name, info->account_name, strlen(info->account_name) >= 31 ? 31 : strlen(info->account_name)); | ||||
| 	memcpy(m_head.basic.user_name, info->user_name, strlen(info->user_name) >= 31 ? 31 : strlen(info->user_name)); | ||||
| 	memcpy(m_head.basic.real_remote_host_ip, info->real_remote_host_ip, strlen(info->real_remote_host_ip) >= 39 ? 39 : strlen(info->real_remote_host_ip)); | ||||
| 	memcpy(m_head.basic.remote_host_ip, info->remote_host_ip, strlen(info->remote_host_ip) >= 39 ? 39 : strlen(info->remote_host_ip)); | ||||
| } | ||||
| 
 | ||||
| void TppSshRec::_on_end(void) | ||||
|  | @ -42,7 +45,7 @@ void TppSshRec::_on_end(void) | |||
| 
 | ||||
| 	// ¸üÐÂÍ·ÐÅÏ¢
 | ||||
| 	//m_head.timestamp = m_start_time;
 | ||||
| 	m_head.time_ms = (ex_u32)(m_last_time - m_start_time); | ||||
| 	m_head.info.time_ms = (ex_u32)(m_last_time - m_start_time); | ||||
| 
 | ||||
| 	ex_wstr fname = m_base_path; | ||||
| 	ex_path_join(fname, false, m_base_fname.c_str(), NULL); | ||||
|  | @ -64,7 +67,7 @@ void TppSshRec::record(ex_u8 type, const ex_u8* data, size_t size) | |||
| { | ||||
| 	if (data == NULL || 0 == size) | ||||
| 		return; | ||||
| 	m_head.packages++; | ||||
| 	m_head.info.packages++; | ||||
| 
 | ||||
| 	if (sizeof(TS_RECORD_PKG) + size + m_cache.size() > m_cache.buffer_size()) | ||||
| 		_save_to_data_file(); | ||||
|  | @ -86,8 +89,8 @@ void TppSshRec::record(ex_u8 type, const ex_u8* data, size_t size) | |||
| 
 | ||||
| void TppSshRec::record_win_size_startup(int width, int height) | ||||
| { | ||||
| 	m_head.width = width; | ||||
| 	m_head.height = height; | ||||
| 	m_head.basic.width = width; | ||||
| 	m_head.basic.height = height; | ||||
| } | ||||
| 
 | ||||
| void TppSshRec::record_win_size_change(int width, int height) | ||||
|  | @ -127,7 +130,7 @@ void TppSshRec::record_command(const ex_astr cmd) | |||
| bool TppSshRec::_save_to_data_file(void) | ||||
| { | ||||
| 	wchar_t _str_file_id[24] = { 0 }; | ||||
| 	ex_wcsformat(_str_file_id, 24, L".%03d", m_head.file_count); | ||||
| 	ex_wcsformat(_str_file_id, 24, L".%03d", 0);// m_head.file_count);
 | ||||
| 
 | ||||
| 	ex_wstr fname = m_base_path; | ||||
| 	ex_path_join(fname, false, m_base_fname.c_str(), NULL); | ||||
|  | @ -148,8 +151,8 @@ bool TppSshRec::_save_to_data_file(void) | |||
| 	fflush(f); | ||||
| 	fclose(f); | ||||
| 
 | ||||
| 	m_head.file_count++; | ||||
| 	m_head.file_size += m_cache.size(); | ||||
| 	//m_head.file_count++;
 | ||||
| 	//m_head.file_size += m_cache.size();
 | ||||
| 
 | ||||
| 	m_cache.empty(); | ||||
| 	return true; | ||||
|  |  | |||
|  | @ -1,72 +1,72 @@ | |||
| #ifndef __TPP_SSH_RECORDER_H__ | ||||
| #define __TPP_SSH_RECORDER_H__ | ||||
| 
 | ||||
| #include "../../common/base_record.h" | ||||
| 
 | ||||
| #define TS_RECORD_TYPE_SSH_TERM_SIZE		0x01		// 终端大小(行数与列数)
 | ||||
| #define TS_RECORD_TYPE_SSH_DATA				0x02		// 用于展示的数据内容
 | ||||
| 
 | ||||
| #pragma pack(push,1) | ||||
| 
 | ||||
| // 录像文件头
 | ||||
| // typedef struct TS_RECORD_HEADER
 | ||||
| // {
 | ||||
| // 	ex_u32 magic;		// "TPPR" 标志 TelePort Protocol Record
 | ||||
| // 	ex_u64 timestamp;	// 本次录像的起始时间(UTC时间戳)
 | ||||
| // 	ex_u32 packages;	// 总包数
 | ||||
| // 	ex_u32 time_ms;		// 总耗时(毫秒)
 | ||||
| // 	ex_u16 width;		// 初始屏幕尺寸:宽
 | ||||
| // 	ex_u16 height;		// 初始屏幕尺寸:高
 | ||||
| // 	ex_u16 file_count;	// 数据文件总数
 | ||||
| // 	ex_u32 file_size;	// 所有数据文件的总大小(不包括每个数据文件的头,即4字节的每文件大小)
 | ||||
| // 	char account[16];	// teleport账号
 | ||||
| // 	char username[16];	// 远程主机用户名
 | ||||
| // 	char ip[18];
 | ||||
| // 	ex_u16 port;
 | ||||
| // 
 | ||||
| // 	ex_u8 reserve[128 - 4 - 8 - 4 - 4 - 2 - 2 - 2 - 4 - 16 - 16 - 18 - 2];	// 保留
 | ||||
| // }TS_RECORD_HEADER;
 | ||||
| // 
 | ||||
| // // 一个数据包的头
 | ||||
| // typedef struct TS_RECORD_PKG
 | ||||
| // {
 | ||||
| // 	ex_u8 type;			// 包的数据类型
 | ||||
| // 	ex_u32 size;		// 这个包的总大小(不含包头)
 | ||||
| // 	ex_u32 time_ms;		// 这个包距起始时间的时间差(毫秒,意味着一个连接不能持续超过49天)
 | ||||
| // 	ex_u8 reserve[3];	// 保留
 | ||||
| // }TS_RECORD_PKG;
 | ||||
| 
 | ||||
| // 记录窗口大小改变的数据包
 | ||||
| typedef struct TS_RECORD_WIN_SIZE | ||||
| { | ||||
| 	ex_u16 width; | ||||
| 	ex_u16 height; | ||||
| }TS_RECORD_WIN_SIZE; | ||||
| 
 | ||||
| #pragma pack(pop) | ||||
| 
 | ||||
| class TppSshRec : public TppRecBase | ||||
| { | ||||
| public: | ||||
| 	TppSshRec(); | ||||
| 	virtual ~TppSshRec(); | ||||
| 
 | ||||
| 	void record(ex_u8 type, const ex_u8* data, size_t size); | ||||
| 	void record_win_size_startup(int width, int height); | ||||
| 	void record_win_size_change(int width, int height); | ||||
| 	void record_command(const ex_astr cmd); | ||||
| 
 | ||||
| protected: | ||||
| 	void _on_begin(const TPP_SESSION_INFO* info); | ||||
| 	void _on_end(void); | ||||
| 
 | ||||
| 	bool _save_to_data_file(void); | ||||
| 	bool _save_to_cmd_file(void); | ||||
| 
 | ||||
| protected: | ||||
| 	TS_RECORD_HEADER m_head; | ||||
| 
 | ||||
| 	MemBuffer m_cmd_cache; | ||||
| }; | ||||
| 
 | ||||
| #endif // __TPP_SSH_RECORDER_H__
 | ||||
| #ifndef __TPP_SSH_RECORDER_H__ | ||||
| #define __TPP_SSH_RECORDER_H__ | ||||
| 
 | ||||
| #include "../../common/base_record.h" | ||||
| 
 | ||||
| #define TS_RECORD_TYPE_SSH_TERM_SIZE		0x01		// 终端大小(行数与列数)
 | ||||
| #define TS_RECORD_TYPE_SSH_DATA				0x02		// 用于展示的数据内容
 | ||||
| 
 | ||||
| #pragma pack(push,1) | ||||
| 
 | ||||
| // 录像文件头
 | ||||
| // typedef struct TS_RECORD_HEADER
 | ||||
| // {
 | ||||
| // 	ex_u32 magic;		// "TPPR" 标志 TelePort Protocol Record
 | ||||
| // 	ex_u64 timestamp;	// 本次录像的起始时间(UTC时间戳)
 | ||||
| // 	ex_u32 packages;	// 总包数
 | ||||
| // 	ex_u32 time_ms;		// 总耗时(毫秒)
 | ||||
| // 	ex_u16 width;		// 初始屏幕尺寸:宽
 | ||||
| // 	ex_u16 height;		// 初始屏幕尺寸:高
 | ||||
| // 	ex_u16 file_count;	// 数据文件总数
 | ||||
| // 	ex_u32 file_size;	// 所有数据文件的总大小(不包括每个数据文件的头,即4字节的每文件大小)
 | ||||
| // 	char account[16];	// teleport账号
 | ||||
| // 	char username[16];	// 远程主机用户名
 | ||||
| // 	char ip[18];
 | ||||
| // 	ex_u16 port;
 | ||||
| // 
 | ||||
| // 	ex_u8 reserve[128 - 4 - 8 - 4 - 4 - 2 - 2 - 2 - 4 - 16 - 16 - 18 - 2];	// 保留
 | ||||
| // }TS_RECORD_HEADER;
 | ||||
| // 
 | ||||
| // // 一个数据包的头
 | ||||
| // typedef struct TS_RECORD_PKG
 | ||||
| // {
 | ||||
| // 	ex_u8 type;			// 包的数据类型
 | ||||
| // 	ex_u32 size;		// 这个包的总大小(不含包头)
 | ||||
| // 	ex_u32 time_ms;		// 这个包距起始时间的时间差(毫秒,意味着一个连接不能持续超过49天)
 | ||||
| // 	ex_u8 reserve[3];	// 保留
 | ||||
| // }TS_RECORD_PKG;
 | ||||
| 
 | ||||
| // 记录窗口大小改变的数据包
 | ||||
| typedef struct TS_RECORD_WIN_SIZE | ||||
| { | ||||
| 	ex_u16 width; | ||||
| 	ex_u16 height; | ||||
| }TS_RECORD_WIN_SIZE; | ||||
| 
 | ||||
| #pragma pack(pop) | ||||
| 
 | ||||
| class TppSshRec : public TppRecBase | ||||
| { | ||||
| public: | ||||
| 	TppSshRec(); | ||||
| 	virtual ~TppSshRec(); | ||||
| 
 | ||||
| 	void record(ex_u8 type, const ex_u8* data, size_t size); | ||||
| 	void record_win_size_startup(int width, int height); | ||||
| 	void record_win_size_change(int width, int height); | ||||
| 	void record_command(const ex_astr cmd); | ||||
| 
 | ||||
| protected: | ||||
| 	void _on_begin(const TPP_CONNECT_INFO* info); | ||||
| 	void _on_end(void); | ||||
| 
 | ||||
| 	bool _save_to_data_file(void); | ||||
| 	bool _save_to_cmd_file(void); | ||||
| 
 | ||||
| protected: | ||||
| 	TS_RECORD_HEADER m_head; | ||||
| 
 | ||||
| 	MemBuffer m_cmd_cache; | ||||
| }; | ||||
| 
 | ||||
| #endif // __TPP_SSH_RECORDER_H__
 | ||||
|  |  | |||
|  | @ -3,6 +3,7 @@ | |||
| #include "tpp_env.h" | ||||
| 
 | ||||
| #include <algorithm> | ||||
| #include <teleport_const.h> | ||||
| 
 | ||||
| SshSession::SshSession(SshProxy *proxy, ssh_session sess_client) : | ||||
| 	ExThreadBase("ssh-session-thread"), | ||||
|  | @ -10,10 +11,10 @@ SshSession::SshSession(SshProxy *proxy, ssh_session sess_client) : | |||
| 	m_cli_session(sess_client), | ||||
| 	m_srv_session(NULL) | ||||
| { | ||||
| 	m_retcode = SESS_STAT_RUNNING; | ||||
| 	m_retcode = TP_SESS_STAT_RUNNING; | ||||
| 	m_db_id = 0; | ||||
| 
 | ||||
| 	m_auth_mode = TS_AUTH_MODE_PASSWORD; | ||||
| 	m_auth_type = TP_AUTH_TYPE_PASSWORD; | ||||
| 
 | ||||
| 	m_is_first_server_data = true; | ||||
| 	m_is_sftp = false; | ||||
|  | @ -71,7 +72,7 @@ void SshSession::_set_stop_flag(void) { | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| bool SshSession::_on_session_begin(const TPP_SESSION_INFO* info) | ||||
| bool SshSession::_on_session_begin(const TPP_CONNECT_INFO* info) | ||||
| { | ||||
| 	if (!g_ssh_env.session_begin(info, &m_db_id)) | ||||
| 	{ | ||||
|  | @ -91,10 +92,10 @@ bool SshSession::_on_session_end(void) | |||
| 		EXLOGD("[ssh] session ret-code: %d\n", m_retcode); | ||||
| 
 | ||||
| 		// 如果会话过程中没有发生错误,则将其状态改为结束,否则记录下错误值
 | ||||
| 		if (m_retcode == SESS_STAT_RUNNING) | ||||
| 			m_retcode = SESS_STAT_END; | ||||
| 		if (m_retcode == TP_SESS_STAT_RUNNING) | ||||
| 			m_retcode = TP_SESS_STAT_END; | ||||
| 
 | ||||
| 		g_ssh_env.session_end(m_db_id, m_retcode); | ||||
| 		g_ssh_env.session_end(m_sid.c_str(), m_db_id, m_retcode); | ||||
| 	} | ||||
| 
 | ||||
| 	return true; | ||||
|  | @ -227,43 +228,43 @@ int SshSession::_on_auth_password_request(ssh_session session, const char *user, | |||
| 	EXLOGV("[ssh] authenticating, session-id: %s\n", _this->m_sid.c_str()); | ||||
| 
 | ||||
| 	int protocol = 0; | ||||
| 	TPP_SESSION_INFO* sess_info = g_ssh_env.take_session(_this->m_sid.c_str()); | ||||
| 	TPP_CONNECT_INFO* sess_info = g_ssh_env.get_session(_this->m_sid.c_str()); | ||||
| 
 | ||||
| 	if (NULL == sess_info) { | ||||
| 		EXLOGW("[ssh] try to get login-info from ssh-sftp-session.\n"); | ||||
| //		EXLOGW("[ssh] try to get login-info from ssh-sftp-session.\n");
 | ||||
| 		// 尝试从sftp连接记录中获取连接信息(一个ssh会话如果成为sftp会话,内部会将连接信息记录下来备用)
 | ||||
| 		TS_SFTP_SESSION_INFO sftp_info; | ||||
| 		if (!_this->m_proxy->get_sftp_session_info(_this->m_sid, sftp_info)) { | ||||
| //		TS_SFTP_SESSION_INFO sftp_info;
 | ||||
| //		if (!_this->m_proxy->get_sftp_session_info(_this->m_sid, sftp_info)) {
 | ||||
| 			EXLOGE("[ssh] no such session: %s\n", _this->m_sid.c_str()); | ||||
| 			_this->m_have_error = true; | ||||
| 			_this->m_retcode = SESS_STAT_ERR_AUTH_DENIED; | ||||
| 			_this->m_retcode = TP_SESS_STAT_ERR_AUTH_DENIED; | ||||
| 			return SSH_AUTH_DENIED; | ||||
| 		} | ||||
| 
 | ||||
| 		_this->m_server_ip = sftp_info.host_ip; | ||||
| 		_this->m_server_port = sftp_info.host_port; | ||||
| 		_this->m_auth_mode = sftp_info.auth_mode; | ||||
| 		_this->m_user_name = sftp_info.user_name; | ||||
| 		_this->m_user_auth = sftp_info.user_auth; | ||||
| 		protocol = TS_PROXY_PROTOCOL_SSH; | ||||
| 
 | ||||
| 		// 因为是从sftp会话得来的登录数据,因此限制本会话只能用于sftp,不允许再使用shell了。
 | ||||
| 		_this->_enter_sftp_mode(); | ||||
| //		}
 | ||||
| // 
 | ||||
| // 		_this->m_remote_host_ip = sftp_info.host_ip;
 | ||||
| // 		_this->m_remote_host_port = sftp_info.host_port;
 | ||||
| // 		_this->m_auth_type = sftp_info.auth_mode;
 | ||||
| // 		_this->m_account_name = sftp_info.user_name;
 | ||||
| // 		_this->m_account_secret = sftp_info.user_auth;
 | ||||
| // 		protocol = TP_PROTOCOL_TYPE_SSH;
 | ||||
| // 
 | ||||
| // 		// 因为是从sftp会话得来的登录数据,因此限制本会话只能用于sftp,不允许再使用shell了。
 | ||||
| // 		_this->_enter_sftp_mode();
 | ||||
| 	} | ||||
| 	else { | ||||
| 		_this->m_server_ip = sess_info->host_ip; | ||||
| 		_this->m_server_port = sess_info->host_port; | ||||
| 		_this->m_auth_mode = sess_info->auth_mode; | ||||
| 		_this->m_user_name = sess_info->user_name; | ||||
| 		_this->m_user_auth = sess_info->user_auth; | ||||
| 		protocol = sess_info->protocol; | ||||
| 		_this->m_remote_host_ip = sess_info->remote_host_ip; | ||||
| 		_this->m_remote_host_port = sess_info->remote_host_port; | ||||
| 		_this->m_auth_type = sess_info->auth_type; | ||||
| 		_this->m_account_name = sess_info->account_name; | ||||
| 		_this->m_account_secret = sess_info->account_secret; | ||||
| 		protocol = sess_info->protocol_type; | ||||
| 	} | ||||
| 
 | ||||
| 	if (protocol != TS_PROXY_PROTOCOL_SSH) { | ||||
| 	if (protocol != TP_PROTOCOL_TYPE_SSH) { | ||||
| 		g_ssh_env.free_session(sess_info); | ||||
| 		EXLOGE("[ssh] session '%s' is not for SSH.\n", _this->m_sid.c_str()); | ||||
| 		_this->m_have_error = true; | ||||
| 		_this->m_retcode = SESS_STAT_ERR_AUTH_DENIED; | ||||
| 		_this->m_retcode = TP_SESS_STAT_ERR_AUTH_DENIED; | ||||
| 		return SSH_AUTH_DENIED; | ||||
| 	} | ||||
| 
 | ||||
|  | @ -271,7 +272,7 @@ int SshSession::_on_auth_password_request(ssh_session session, const char *user, | |||
| 	{ | ||||
| 		g_ssh_env.free_session(sess_info); | ||||
| 		_this->m_have_error = true; | ||||
| 		_this->m_retcode = SESS_STAT_ERR_AUTH_DENIED; | ||||
| 		_this->m_retcode = TP_SESS_STAT_ERR_AUTH_DENIED; | ||||
| 		return SSH_AUTH_DENIED; | ||||
| 	} | ||||
| 
 | ||||
|  | @ -279,18 +280,18 @@ int SshSession::_on_auth_password_request(ssh_session session, const char *user, | |||
| 	sess_info = NULL; | ||||
| 
 | ||||
| 	// 现在尝试根据session-id获取得到的信息,连接并登录真正的SSH服务器
 | ||||
| 	EXLOGV("[ssh] try to connect to real SSH server %s:%d\n", _this->m_server_ip.c_str(), _this->m_server_port); | ||||
| 	EXLOGV("[ssh] try to connect to real SSH server %s:%d\n", _this->m_remote_host_ip.c_str(), _this->m_remote_host_port); | ||||
| 	_this->m_srv_session = ssh_new(); | ||||
| 	ssh_options_set(_this->m_srv_session, SSH_OPTIONS_HOST, _this->m_server_ip.c_str()); | ||||
| 	int port = (int)_this->m_server_port; | ||||
| 	ssh_options_set(_this->m_srv_session, SSH_OPTIONS_HOST, _this->m_remote_host_ip.c_str()); | ||||
| 	int port = (int)_this->m_remote_host_port; | ||||
| 	ssh_options_set(_this->m_srv_session, SSH_OPTIONS_PORT, &port); | ||||
| #ifdef EX_DEBUG | ||||
| 	// 	int flag = SSH_LOG_FUNCTIONS;
 | ||||
| 	// 	ssh_options_set(_this->m_srv_session, SSH_OPTIONS_LOG_VERBOSITY, &flag);
 | ||||
| #endif | ||||
| 
 | ||||
| 	if (_this->m_auth_mode != TS_AUTH_MODE_NONE) | ||||
| 		ssh_options_set(_this->m_srv_session, SSH_OPTIONS_USER, _this->m_user_name.c_str()); | ||||
| 	if (_this->m_auth_type != TP_AUTH_TYPE_NONE) | ||||
| 		ssh_options_set(_this->m_srv_session, SSH_OPTIONS_USER, _this->m_account_name.c_str()); | ||||
| 
 | ||||
| //#ifdef EX_DEBUG
 | ||||
| //	// 	int _timeout_us = 500000000; // 5 sec.
 | ||||
|  | @ -303,9 +304,9 @@ int SshSession::_on_auth_password_request(ssh_session session, const char *user, | |||
| 	int rc = 0; | ||||
| 	rc = ssh_connect(_this->m_srv_session); | ||||
| 	if (rc != SSH_OK) { | ||||
| 		EXLOGE("[ssh] can not connect to real SSH server %s:%d. [%d]%s\n", _this->m_server_ip.c_str(), _this->m_server_port, rc, ssh_get_error(_this->m_srv_session)); | ||||
| 		EXLOGE("[ssh] can not connect to real SSH server %s:%d. [%d]%s\n", _this->m_remote_host_ip.c_str(), _this->m_remote_host_port, rc, ssh_get_error(_this->m_srv_session)); | ||||
| 		_this->m_have_error = true; | ||||
| 		_this->m_retcode = SESS_STAT_ERR_CONNECT; | ||||
| 		_this->m_retcode = TP_SESS_STAT_ERR_CONNECT; | ||||
| 		return SSH_AUTH_ERROR; | ||||
| 	} | ||||
| 
 | ||||
|  | @ -324,7 +325,7 @@ int SshSession::_on_auth_password_request(ssh_session session, const char *user, | |||
| // 	}
 | ||||
| 
 | ||||
| 
 | ||||
| 	if (_this->m_auth_mode == TS_AUTH_MODE_PASSWORD) { | ||||
| 	if (_this->m_auth_type == TP_AUTH_TYPE_PASSWORD) { | ||||
| 		// 优先尝试交互式登录(SSHv2推荐)
 | ||||
| 		int retry_count = 0; | ||||
| 		rc = ssh_userauth_kbdint(_this->m_srv_session, NULL, NULL); | ||||
|  | @ -351,11 +352,11 @@ int SshSession::_on_auth_password_request(ssh_session session, const char *user, | |||
| 				const char* prompt = ssh_userauth_kbdint_getprompt(_this->m_srv_session, iprompt, &echo); | ||||
| 				EXLOGV("[ssh] interactive login prompt: %s\n", prompt); | ||||
| 
 | ||||
| 				rc = ssh_userauth_kbdint_setanswer(_this->m_srv_session, iprompt, _this->m_user_auth.c_str()); | ||||
| 				rc = ssh_userauth_kbdint_setanswer(_this->m_srv_session, iprompt, _this->m_account_secret.c_str()); | ||||
| 				if (rc < 0) { | ||||
| 					EXLOGE("[ssh] invalid password for interactive mode to login to real SSH server %s:%d.\n", _this->m_server_ip.c_str(), _this->m_server_port); | ||||
| 					EXLOGE("[ssh] invalid password for interactive mode to login to real SSH server %s:%d.\n", _this->m_remote_host_ip.c_str(), _this->m_remote_host_port); | ||||
| 					_this->m_have_error = true; | ||||
| 					_this->m_retcode = SESS_STAT_ERR_AUTH_DENIED; | ||||
| 					_this->m_retcode = TP_SESS_STAT_ERR_AUTH_DENIED; | ||||
| 					return SSH_AUTH_ERROR; | ||||
| 				} | ||||
| 			} | ||||
|  | @ -373,7 +374,7 @@ int SshSession::_on_auth_password_request(ssh_session session, const char *user, | |||
| 		} | ||||
| 
 | ||||
| 		// 不支持交互式登录,则尝试密码方式
 | ||||
| 		rc = ssh_userauth_password(_this->m_srv_session, NULL, _this->m_user_auth.c_str()); | ||||
| 		rc = ssh_userauth_password(_this->m_srv_session, NULL, _this->m_account_secret.c_str()); | ||||
| 		if (rc == SSH_AUTH_SUCCESS) { | ||||
| 			EXLOGW("[ssh] logon with password mode.\n"); | ||||
| 			_this->m_is_logon = true; | ||||
|  | @ -383,17 +384,17 @@ int SshSession::_on_auth_password_request(ssh_session session, const char *user, | |||
| 			EXLOGD("[ssh] failed to login with password mode, got %d.\n", rc); | ||||
| 		} | ||||
| 
 | ||||
| 		EXLOGE("[ssh] can not use password mode or interactive mode ot login to real SSH server %s:%d.\n", _this->m_server_ip.c_str(), _this->m_server_port); | ||||
| 		EXLOGE("[ssh] can not use password mode or interactive mode ot login to real SSH server %s:%d.\n", _this->m_remote_host_ip.c_str(), _this->m_remote_host_port); | ||||
| 		_this->m_have_error = true; | ||||
| 		_this->m_retcode = SESS_STAT_ERR_AUTH_DENIED; | ||||
| 		_this->m_retcode = TP_SESS_STAT_ERR_AUTH_DENIED; | ||||
| 		return SSH_AUTH_ERROR; | ||||
| 	} | ||||
| 	else if (_this->m_auth_mode == TS_AUTH_MODE_PRIVATE_KEY) { | ||||
| 	else if (_this->m_auth_type == TP_AUTH_TYPE_PRIVATE_KEY) { | ||||
| 		ssh_key key = NULL; | ||||
| 		if (SSH_OK != ssh_pki_import_privkey_base64(_this->m_user_auth.c_str(), NULL, NULL, NULL, &key)) { | ||||
| 		if (SSH_OK != ssh_pki_import_privkey_base64(_this->m_account_secret.c_str(), NULL, NULL, NULL, &key)) { | ||||
| 			EXLOGE("[ssh] can not import private-key for auth.\n"); | ||||
| 			_this->m_have_error = true; | ||||
| 			_this->m_retcode = SESS_STAT_ERR_BAD_SSH_KEY; | ||||
| 			_this->m_retcode = TP_SESS_STAT_ERR_BAD_SSH_KEY; | ||||
| 			return SSH_AUTH_ERROR; | ||||
| 		} | ||||
| 
 | ||||
|  | @ -406,19 +407,19 @@ int SshSession::_on_auth_password_request(ssh_session session, const char *user, | |||
| 			return SSH_AUTH_SUCCESS; | ||||
| 		} | ||||
| 		else { | ||||
| 			EXLOGE("[ssh] failed to use private-key to login to real SSH server %s:%d.\n", _this->m_server_ip.c_str(), _this->m_server_port); | ||||
| 			EXLOGE("[ssh] failed to use private-key to login to real SSH server %s:%d.\n", _this->m_remote_host_ip.c_str(), _this->m_remote_host_port); | ||||
| 			_this->m_have_error = true; | ||||
| 			_this->m_retcode = SESS_STAT_ERR_AUTH_DENIED; | ||||
| 			_this->m_retcode = TP_SESS_STAT_ERR_AUTH_DENIED; | ||||
| 			return SSH_AUTH_ERROR; | ||||
| 		} | ||||
| 	} | ||||
| 	else if (_this->m_auth_mode == TS_AUTH_MODE_NONE) { | ||||
| 	else if (_this->m_auth_type == TP_AUTH_TYPE_NONE) { | ||||
| 		return SSH_AUTH_ERROR; | ||||
| 	} | ||||
| 	else { | ||||
| 		EXLOGE("[ssh] invalid auth mode.\n"); | ||||
| 		_this->m_have_error = true; | ||||
| 		_this->m_retcode = SESS_STAT_ERR_AUTH_DENIED; | ||||
| 		_this->m_retcode = TP_SESS_STAT_ERR_AUTH_DENIED; | ||||
| 		return SSH_AUTH_ERROR; | ||||
| 	} | ||||
| } | ||||
|  | @ -1017,7 +1018,7 @@ int SshSession::_on_client_channel_subsystem_request(ssh_session session, ssh_ch | |||
| 	// 目前只支持SFTP子系统
 | ||||
| 	if (strcmp(subsystem, "sftp") != 0) { | ||||
| 		EXLOGE("[ssh] support `sftp` subsystem only, but got `%s`.\n", subsystem); | ||||
| 		_this->m_retcode = SESS_STAT_ERR_UNSUPPORT_PROTOCOL; | ||||
| 		_this->m_retcode = TP_SESS_STAT_ERR_UNSUPPORT_PROTOCOL; | ||||
| 		return SSH_ERROR; | ||||
| 	} | ||||
| 
 | ||||
|  | @ -1044,7 +1045,7 @@ int SshSession::_on_client_channel_subsystem_request(ssh_session session, ssh_ch | |||
| void SshSession::_enter_sftp_mode(void) { | ||||
| 	if (!m_is_sftp) { | ||||
| 		m_is_sftp = true; | ||||
| 		m_proxy->add_sftp_session_info(m_sid, m_server_ip, m_server_port, m_user_name, m_user_auth, m_auth_mode); | ||||
| 		m_proxy->add_sftp_session_info(m_sid, m_remote_host_ip, m_remote_host_port, m_account_name, m_account_secret, m_auth_type); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  | @ -1066,7 +1067,7 @@ int SshSession::_on_server_channel_data(ssh_session session, ssh_channel channel | |||
| 	TS_SSH_CHANNEL_INFO *info = _this->_get_cli_channel(channel); | ||||
| 	if (NULL == info || NULL == info->channel) { | ||||
| 		EXLOGE("[ssh] when receive server channel data, not found client channel.\n"); | ||||
| 		_this->m_retcode = SESS_STAT_ERR_INTERNAL; | ||||
| 		_this->m_retcode = TP_SESS_STAT_ERR_INTERNAL; | ||||
| 		return SSH_ERROR; | ||||
| 	} | ||||
| 
 | ||||
|  | @ -1110,9 +1111,9 @@ int SshSession::_on_server_channel_data(ssh_session session, ssh_channel channel | |||
| 			char buf[256] = { 0 }; | ||||
| 
 | ||||
| 			const char *auth_mode = NULL; | ||||
| 			if (_this->m_auth_mode == TS_AUTH_MODE_PASSWORD) | ||||
| 			if (_this->m_auth_type == TP_AUTH_TYPE_PASSWORD) | ||||
| 				auth_mode = "password"; | ||||
| 			else if (_this->m_auth_mode == TS_AUTH_MODE_PRIVATE_KEY) | ||||
| 			else if (_this->m_auth_type == TP_AUTH_TYPE_PRIVATE_KEY) | ||||
| 				auth_mode = "private-key"; | ||||
| 			else | ||||
| 				auth_mode = "unknown"; | ||||
|  | @ -1125,8 +1126,8 @@ int SshSession::_on_server_channel_data(ssh_session session, ssh_channel channel | |||
| 				"  - authroized by %s\r\n"\ | ||||
| 				"=============================================\r\n"\ | ||||
| 				"\r\n", | ||||
| 				_this->m_server_ip.c_str(), | ||||
| 				_this->m_server_port, auth_mode | ||||
| 				_this->m_remote_host_ip.c_str(), | ||||
| 				_this->m_remote_host_port, auth_mode | ||||
| 				); | ||||
| 
 | ||||
| 			int buf_len = strlen(buf); | ||||
|  |  | |||
|  | @ -55,7 +55,7 @@ public: | |||
| 
 | ||||
| protected: | ||||
| 	// ¼Ì³Ð×Ô TppSessionBase
 | ||||
| 	bool _on_session_begin(const TPP_SESSION_INFO* info); | ||||
| 	bool _on_session_begin(const TPP_CONNECT_INFO* info); | ||||
| 	bool _on_session_end(void); | ||||
| 
 | ||||
| 
 | ||||
|  | @ -102,11 +102,11 @@ private: | |||
| 	ex_u16 m_client_port; | ||||
| 
 | ||||
| 	ex_astr m_sid; | ||||
| 	ex_astr m_server_ip; | ||||
| 	ex_u16 m_server_port; | ||||
| 	ex_astr m_user_name; | ||||
| 	ex_astr m_user_auth; | ||||
| 	int m_auth_mode; | ||||
| 	ex_astr m_remote_host_ip; | ||||
| 	ex_u16 m_remote_host_port; | ||||
| 	ex_astr m_account_name; | ||||
| 	ex_astr m_account_secret; | ||||
| 	int m_auth_type; | ||||
| 
 | ||||
| 	bool m_is_first_server_data; | ||||
| 	bool m_is_sftp; | ||||
|  |  | |||
|  | @ -1,6 +1,8 @@ | |||
| #include "ssh_proxy.h" | ||||
| #include "tpp_env.h" | ||||
| 
 | ||||
| #include <teleport_const.h> | ||||
| 
 | ||||
| TPP_API ex_rv tpp_init(TPP_INIT_ARGS* init_args) | ||||
| { | ||||
| #ifdef EX_OS_UNIX | ||||
|  | @ -11,7 +13,7 @@ TPP_API ex_rv tpp_init(TPP_INIT_ARGS* init_args) | |||
| #endif | ||||
| 
 | ||||
| 	if (!g_ssh_env.init(init_args)) | ||||
| 		return TSR_FAILED; | ||||
| 		return TPE_FAILED; | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
|  | @ -19,9 +21,9 @@ TPP_API ex_rv tpp_init(TPP_INIT_ARGS* init_args) | |||
| TPP_API ex_rv tpp_start(void) | ||||
| { | ||||
| 	if (!g_ssh_proxy.init()) | ||||
| 		return TSR_FAILED; | ||||
| 		return TPE_FAILED; | ||||
| 	if (!g_ssh_proxy.start()) | ||||
| 		return TSR_FAILED; | ||||
| 		return TPE_FAILED; | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
|  |  | |||
|  | @ -68,7 +68,7 @@ | |||
|       <WarningLevel>Level3</WarningLevel> | ||||
|       <Optimization>Disabled</Optimization> | ||||
|       <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;TPP_EXPORTS;LIBSSH_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||||
|       <AdditionalIncludeDirectories>..\..\..\..\common\libex\include;..\..\..\..\external\libssh-win-static\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | ||||
|       <AdditionalIncludeDirectories>..\..\..\..\common\teleport;..\..\..\..\common\libex\include;..\..\..\..\external\libssh-win-static\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | ||||
|       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> | ||||
|     </ClCompile> | ||||
|     <Link> | ||||
|  | @ -86,7 +86,7 @@ | |||
|       <FunctionLevelLinking>true</FunctionLevelLinking> | ||||
|       <IntrinsicFunctions>true</IntrinsicFunctions> | ||||
|       <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;TPP_EXPORTS;LIBSSH_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||||
|       <AdditionalIncludeDirectories>..\..\..\..\common\libex\include;..\..\..\..\external\libssh-win-static\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | ||||
|       <AdditionalIncludeDirectories>..\..\..\..\common\teleport;..\..\..\..\common\libex\include;..\..\..\..\external\libssh-win-static\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | ||||
|       <RuntimeLibrary>MultiThreaded</RuntimeLibrary> | ||||
|     </ClCompile> | ||||
|     <Link> | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Apex Liu
						Apex Liu