diff --git a/sesman/libscp/libscp_connection.c b/sesman/libscp/libscp_connection.c index ead3b66a..1d6f5312 100644 --- a/sesman/libscp/libscp_connection.c +++ b/sesman/libscp/libscp_connection.c @@ -32,32 +32,14 @@ //extern struct log_config* s_log; -struct SCP_CONNECTION * -scp_connection_create(int sck) +struct trans * +scp_trans_create(int sck) { - struct SCP_CONNECTION *conn; - - conn = g_new(struct SCP_CONNECTION, 1); - - if (0 == conn) + struct trans *result = trans_create(TRANS_MODE_TCP, 8192, 8192); + if (result != NULL) { - LOG(LOG_LEVEL_ERROR, "[connection:%d] connection create: malloc error", __LINE__); - return 0; + result->sck = sck; } - conn->in_sck = sck; - make_stream(conn->in_s); - init_stream(conn->in_s, 8196); - make_stream(conn->out_s); - init_stream(conn->out_s, 8196); - - return conn; -} - -void -scp_connection_destroy(struct SCP_CONNECTION *c) -{ - free_stream(c->in_s); - free_stream(c->out_s); - g_free(c); + return result; } diff --git a/sesman/libscp/libscp_connection.h b/sesman/libscp/libscp_connection.h index 2da868d8..459639da 100644 --- a/sesman/libscp/libscp_connection.h +++ b/sesman/libscp/libscp_connection.h @@ -31,22 +31,18 @@ /** * - * @brief creates a new connection + * @brief creates a new SCP transport object * @param sck the connection socket * - * @return a struct SCP_CONNECTION* object on success, NULL otherwise + * This is a convenience function which calls trans_create() with the + * correct parameters. + * + * Returned object can be freed with trans_delete() + * + * @return a struct trans* object on success, NULL otherwise * */ -struct SCP_CONNECTION * -scp_connection_create(int sck); - -/** - * - * @brief destroys a struct SCP_CONNECTION* object - * @param c the object to be destroyed - * - */ -void -scp_connection_destroy(struct SCP_CONNECTION *c); +struct trans * +scp_trans_create(int sck); #endif diff --git a/sesman/libscp/libscp_types.h b/sesman/libscp/libscp_types.h index 51a175eb..41fbc640 100644 --- a/sesman/libscp/libscp_types.h +++ b/sesman/libscp/libscp_types.h @@ -64,13 +64,6 @@ exhaustion attempts (CVE-2020-4044) */ #define SCP_MAX_MESSAGE_SIZE 8192 -struct SCP_CONNECTION -{ - int in_sck; - struct stream *in_s; - struct stream *out_s; -}; - struct SCP_SESSION { tui8 type; diff --git a/sesman/libscp/libscp_v0.h b/sesman/libscp/libscp_v0.h index e486e438..0048ae43 100644 --- a/sesman/libscp/libscp_v0.h +++ b/sesman/libscp/libscp_v0.h @@ -29,6 +29,9 @@ #include "libscp.h" +/*TODO : Replace this (unused) function with something that can be used + * by xrdp_mm.c and sesrun.c */ +#if 0 /* client API */ /** * @@ -40,6 +43,7 @@ */ enum SCP_CLIENT_STATES_E scp_v0c_connect(struct SCP_CONNECTION *c, struct SCP_SESSION *s); +#endif /* server API */ /** diff --git a/sesman/libscp/libscp_v1c.c b/sesman/libscp/libscp_v1c.c index 95d21382..5842b23c 100644 --- a/sesman/libscp/libscp_v1c.c +++ b/sesman/libscp/libscp_v1c.c @@ -35,18 +35,16 @@ #include static enum SCP_CLIENT_STATES_E -_scp_v1c_check_response(struct SCP_CONNECTION *c, struct SCP_SESSION *s); +_scp_v1c_check_response(struct trans *t, struct SCP_SESSION *s); /* client API */ /* 001 */ enum SCP_CLIENT_STATES_E -scp_v1c_connect(struct SCP_CONNECTION *c, struct SCP_SESSION *s) +scp_v1c_connect(struct trans *t, struct SCP_SESSION *s) { tui8 sz; - tui32 size; - - init_stream(c->out_s, c->out_s->size); - init_stream(c->in_s, c->in_s->size); + int size; + struct stream *out_s = t->out_s; size = (19 + 17 + 4 + g_strlen(s->hostname) + g_strlen(s->username) + g_strlen(s->password)); @@ -60,94 +58,100 @@ scp_v1c_connect(struct SCP_CONNECTION *c, struct SCP_SESSION *s) size = size + 16; } + init_stream(out_s, size); + /* sending request */ /* header */ - out_uint32_be(c->out_s, 1); /* version */ - out_uint32_be(c->out_s, size); - out_uint16_be(c->out_s, SCP_COMMAND_SET_DEFAULT); - out_uint16_be(c->out_s, 1); + out_uint32_be(out_s, 1); /* version */ + out_uint32_be(out_s, size); + out_uint16_be(out_s, SCP_COMMAND_SET_DEFAULT); + out_uint16_be(out_s, 1); /* body */ - out_uint8(c->out_s, s->type); - out_uint16_be(c->out_s, s->height); - out_uint16_be(c->out_s, s->width); - out_uint8(c->out_s, s->bpp); - out_uint8(c->out_s, s->rsr); - out_uint8p(c->out_s, s->locale, 17); - out_uint8(c->out_s, s->addr_type); + out_uint8(out_s, s->type); + out_uint16_be(out_s, s->height); + out_uint16_be(out_s, s->width); + out_uint8(out_s, s->bpp); + out_uint8(out_s, s->rsr); + out_uint8p(out_s, s->locale, 17); + out_uint8(out_s, s->addr_type); if (s->addr_type == SCP_ADDRESS_TYPE_IPV4) { - out_uint32_be(c->out_s, s->ipv4addr); + out_uint32_be(out_s, s->ipv4addr); } else if (s->addr_type == SCP_ADDRESS_TYPE_IPV6) { - out_uint8p(c->out_s, s->ipv6addr, 16); + out_uint8p(out_s, s->ipv6addr, 16); } sz = g_strlen(s->hostname); - out_uint8(c->out_s, sz); - out_uint8p(c->out_s, s->hostname, sz); + out_uint8(out_s, sz); + out_uint8p(out_s, s->hostname, sz); sz = g_strlen(s->username); - out_uint8(c->out_s, sz); - out_uint8p(c->out_s, s->username, sz); + out_uint8(out_s, sz); + out_uint8p(out_s, s->username, sz); sz = g_strlen(s->password); - out_uint8(c->out_s, sz); - out_uint8p(c->out_s, s->password, sz); + out_uint8(out_s, sz); + out_uint8p(out_s, s->password, sz); + s_mark_end(out_s); - if (0 != scp_tcp_force_send(c->in_sck, c->out_s->data, size)) + if (0 != trans_force_write(t)) { return SCP_CLIENT_STATE_NETWORK_ERR; } /* wait for response */ - return _scp_v1c_check_response(c, s); + return _scp_v1c_check_response(t, s); } /* 004 */ enum SCP_CLIENT_STATES_E -scp_v1c_resend_credentials(struct SCP_CONNECTION *c, struct SCP_SESSION *s) +scp_v1c_resend_credentials(struct trans *t, struct SCP_SESSION *s) { + struct stream *out_s = t->out_s; tui8 sz; - tui32 size; - - init_stream(c->out_s, c->out_s->size); - init_stream(c->in_s, c->in_s->size); + int size; size = 12 + 2 + g_strlen(s->username) + g_strlen(s->password); + init_stream(out_s, size); + /* sending request */ /* header */ - out_uint32_be(c->out_s, 1); /* version */ - out_uint32_be(c->out_s, size); - out_uint16_be(c->out_s, SCP_COMMAND_SET_DEFAULT); - out_uint16_be(c->out_s, 4); + out_uint32_be(out_s, 1); /* version */ + out_uint32_be(out_s, size); + out_uint16_be(out_s, SCP_COMMAND_SET_DEFAULT); + out_uint16_be(out_s, 4); /* body */ sz = g_strlen(s->username); - out_uint8(c->out_s, sz); - out_uint8p(c->out_s, s->username, sz); + out_uint8(out_s, sz); + out_uint8p(out_s, s->username, sz); sz = g_strlen(s->password); - out_uint8(c->out_s, sz); - out_uint8p(c->out_s, s->password, sz); + out_uint8(out_s, sz); + out_uint8p(out_s, s->password, sz); + s_mark_end(out_s); - if (0 != scp_tcp_force_send(c->in_sck, c->out_s->data, size)) + if (0 != trans_force_write(t)) { return SCP_CLIENT_STATE_NETWORK_ERR; } /* wait for response */ - return _scp_v1c_check_response(c, s); + return _scp_v1c_check_response(t, s); } /* 041 */ enum SCP_CLIENT_STATES_E -scp_v1c_get_session_list(struct SCP_CONNECTION *c, int *scount, +scp_v1c_get_session_list(struct trans *t, int *scount, struct SCP_DISCONNECTED_SESSION **s) { + struct stream *in_s = t->in_s; + struct stream *out_s = t->out_s; tui32 version = 1; - tui32 size = 12; + int size = 12; tui16 cmd = 41; tui32 sescnt = 0; /* total session number */ tui32 sestmp = 0; /* additional total session number */ @@ -158,15 +162,16 @@ scp_v1c_get_session_list(struct SCP_CONNECTION *c, int *scount, int idx; struct SCP_DISCONNECTED_SESSION *ds = 0; - init_stream(c->out_s, c->out_s->size); + init_stream(out_s, 64); /* we request session list */ - out_uint32_be(c->out_s, version); /* version */ - out_uint32_be(c->out_s, size); /* size */ - out_uint16_be(c->out_s, SCP_COMMAND_SET_DEFAULT); /* cmdset */ - out_uint16_be(c->out_s, cmd); /* cmd */ + out_uint32_be(out_s, version); /* version */ + out_uint32_be(out_s, size); /* size */ + out_uint16_be(out_s, SCP_COMMAND_SET_DEFAULT); /* cmdset */ + out_uint16_be(out_s, cmd); /* cmd */ + s_mark_end(out_s); - if (0 != scp_tcp_force_send(c->in_sck, c->out_s->data, size)) + if (0 != trans_force_write(t)) { return SCP_CLIENT_STATE_NETWORK_ERR; } @@ -174,15 +179,15 @@ scp_v1c_get_session_list(struct SCP_CONNECTION *c, int *scount, do { /* then we wait for server response */ - init_stream(c->in_s, c->in_s->size); + init_stream(in_s, 8); - if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, 8)) + if (0 != trans_force_read(t, 8)) { g_free(ds); return SCP_CLIENT_STATE_NETWORK_ERR; } - in_uint32_be(c->in_s, version); + in_uint32_be(t->in_s, version); if (version != 1) { @@ -190,7 +195,7 @@ scp_v1c_get_session_list(struct SCP_CONNECTION *c, int *scount, return SCP_CLIENT_STATE_VERSION_ERR; } - in_uint32_be(c->in_s, size); + in_uint32_be(t->in_s, size); if (size < 12) { @@ -198,15 +203,15 @@ scp_v1c_get_session_list(struct SCP_CONNECTION *c, int *scount, return SCP_CLIENT_STATE_SIZE_ERR; } - init_stream(c->in_s, c->in_s->size); + init_stream(t->in_s, size - 8); - if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, size - 8)) + if (0 != trans_force_read(t, size - 8)) { g_free(ds); return SCP_CLIENT_STATE_NETWORK_ERR; } - in_uint16_be(c->in_s, cmd); + in_uint16_be(in_s, cmd); if (cmd != SCP_COMMAND_SET_DEFAULT) { @@ -214,7 +219,7 @@ scp_v1c_get_session_list(struct SCP_CONNECTION *c, int *scount, return SCP_CLIENT_STATE_SEQUENCE_ERR; } - in_uint16_be(c->in_s, cmd); + in_uint16_be(in_s, cmd); if (cmd != 42) { @@ -225,7 +230,7 @@ scp_v1c_get_session_list(struct SCP_CONNECTION *c, int *scount, if (firstpkt) { firstpkt = 0; - in_uint32_be(c->in_s, sescnt); + in_uint32_be(in_s, sescnt); sestmp = sescnt; ds = g_new(struct SCP_DISCONNECTED_SESSION, sescnt); @@ -237,37 +242,37 @@ scp_v1c_get_session_list(struct SCP_CONNECTION *c, int *scount, } else { - in_uint32_be(c->in_s, sestmp); + in_uint32_be(in_s, sestmp); } - in_uint8(c->in_s, continued); - in_uint8(c->in_s, pktcnt); + in_uint8(in_s, continued); + in_uint8(in_s, pktcnt); for (idx = 0; idx < pktcnt; idx++) { - in_uint32_be(c->in_s, (ds[totalcnt]).SID); /* session id */ - in_uint8(c->in_s, (ds[totalcnt]).type); - in_uint16_be(c->in_s, (ds[totalcnt]).height); - in_uint16_be(c->in_s, (ds[totalcnt]).width); - in_uint8(c->in_s, (ds[totalcnt]).bpp); - in_uint8(c->in_s, (ds[totalcnt]).idle_days); - in_uint8(c->in_s, (ds[totalcnt]).idle_hours); - in_uint8(c->in_s, (ds[totalcnt]).idle_minutes); + in_uint32_be(in_s, (ds[totalcnt]).SID); /* session id */ + in_uint8(in_s, (ds[totalcnt]).type); + in_uint16_be(in_s, (ds[totalcnt]).height); + in_uint16_be(in_s, (ds[totalcnt]).width); + in_uint8(in_s, (ds[totalcnt]).bpp); + in_uint8(in_s, (ds[totalcnt]).idle_days); + in_uint8(in_s, (ds[totalcnt]).idle_hours); + in_uint8(in_s, (ds[totalcnt]).idle_minutes); - in_uint16_be(c->in_s, (ds[totalcnt]).conn_year); - in_uint8(c->in_s, (ds[totalcnt]).conn_month); - in_uint8(c->in_s, (ds[totalcnt]).conn_day); - in_uint8(c->in_s, (ds[totalcnt]).conn_hour); - in_uint8(c->in_s, (ds[totalcnt]).conn_minute); - in_uint8(c->in_s, (ds[totalcnt]).addr_type); + in_uint16_be(in_s, (ds[totalcnt]).conn_year); + in_uint8(in_s, (ds[totalcnt]).conn_month); + in_uint8(in_s, (ds[totalcnt]).conn_day); + in_uint8(in_s, (ds[totalcnt]).conn_hour); + in_uint8(in_s, (ds[totalcnt]).conn_minute); + in_uint8(in_s, (ds[totalcnt]).addr_type); if ((ds[totalcnt]).addr_type == SCP_ADDRESS_TYPE_IPV4) { - in_uint32_be(c->in_s, (ds[totalcnt]).ipv4addr); + in_uint32_be(in_s, (ds[totalcnt]).ipv4addr); } else if ((ds[totalcnt]).addr_type == SCP_ADDRESS_TYPE_IPV6) { - in_uint8a(c->in_s, (ds[totalcnt]).ipv6addr, 16); + in_uint8a(in_s, (ds[totalcnt]).ipv6addr, 16); } totalcnt++; @@ -285,66 +290,69 @@ scp_v1c_get_session_list(struct SCP_CONNECTION *c, int *scount, /* 043 */ enum SCP_CLIENT_STATES_E -scp_v1c_select_session(struct SCP_CONNECTION *c, struct SCP_SESSION *s, +scp_v1c_select_session(struct trans *t, struct SCP_SESSION *s, SCP_SID sid) { + struct stream *in_s = t->in_s; + struct stream *out_s = t->out_s; tui32 version = 1; - tui32 size = 16; + int size = 16; tui16 cmd = 43; - init_stream(c->out_s, c->out_s->size); + init_stream(out_s, 64); /* sending our selection */ - out_uint32_be(c->out_s, version); /* version */ - out_uint32_be(c->out_s, size); /* size */ - out_uint16_be(c->out_s, SCP_COMMAND_SET_DEFAULT); /* cmdset */ - out_uint16_be(c->out_s, cmd); /* cmd */ + out_uint32_be(out_s, version); /* version */ + out_uint32_be(out_s, size); /* size */ + out_uint16_be(out_s, SCP_COMMAND_SET_DEFAULT); /* cmdset */ + out_uint16_be(out_s, cmd); /* cmd */ - out_uint32_be(c->out_s, sid); + out_uint32_be(out_s, sid); + s_mark_end(out_s); - if (0 != scp_tcp_force_send(c->in_sck, c->out_s->data, size)) + if (0 != trans_force_write(t)) { return SCP_CLIENT_STATE_NETWORK_ERR; } /* waiting for response.... */ - init_stream(c->in_s, c->in_s->size); + init_stream(in_s, 8); - if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, 8)) + if (0 != trans_force_read(t, 8)) { return SCP_CLIENT_STATE_NETWORK_ERR; } - in_uint32_be(c->in_s, version); + in_uint32_be(in_s, version); if (version != 1) { return SCP_CLIENT_STATE_VERSION_ERR; } - in_uint32_be(c->in_s, size); + in_uint32_be(in_s, size); if (size < 12) { return SCP_CLIENT_STATE_SIZE_ERR; } - init_stream(c->in_s, c->in_s->size); + init_stream(in_s, size - 8); /* read the rest of the packet */ - if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, size - 8)) + if (0 != trans_force_read(t, size - 8)) { return SCP_CLIENT_STATE_NETWORK_ERR; } - in_uint16_be(c->in_s, cmd); + in_uint16_be(in_s, cmd); if (cmd != SCP_COMMAND_SET_DEFAULT) { return SCP_CLIENT_STATE_SEQUENCE_ERR; } - in_uint16_be(c->in_s, cmd); + in_uint16_be(in_s, cmd); if (cmd != 46) { @@ -352,7 +360,7 @@ scp_v1c_select_session(struct SCP_CONNECTION *c, struct SCP_SESSION *s, } /* session display */ - in_uint16_be(c->in_s, (s->display)); + in_uint16_be(in_s, (s->display)); /*we don't need to return any data other than the display */ /*because we already sent that */ @@ -361,21 +369,23 @@ scp_v1c_select_session(struct SCP_CONNECTION *c, struct SCP_SESSION *s, /* 044 */ enum SCP_CLIENT_STATES_E -scp_v1c_select_session_cancel(struct SCP_CONNECTION *c) +scp_v1c_select_session_cancel(struct trans *t) { + struct stream *out_s = t->out_s; tui32 version = 1; tui32 size = 12; tui16 cmd = 44; - init_stream(c->out_s, c->out_s->size); + init_stream(out_s, 64); /* sending our selection */ - out_uint32_be(c->out_s, version); /* version */ - out_uint32_be(c->out_s, size); /* size */ - out_uint16_be(c->out_s, SCP_COMMAND_SET_DEFAULT); /* cmdset */ - out_uint16_be(c->out_s, cmd); /* cmd */ + out_uint32_be(out_s, version); /* version */ + out_uint32_be(out_s, size); /* size */ + out_uint16_be(out_s, SCP_COMMAND_SET_DEFAULT); /* cmdset */ + out_uint16_be(out_s, cmd); /* cmd */ + s_mark_end(out_s); - if (0 != scp_tcp_force_send(c->in_sck, c->out_s->data, size)) + if (0 != trans_force_write(t)) { return SCP_CLIENT_STATE_NETWORK_ERR; } @@ -384,49 +394,50 @@ scp_v1c_select_session_cancel(struct SCP_CONNECTION *c) } static enum SCP_CLIENT_STATES_E -_scp_v1c_check_response(struct SCP_CONNECTION *c, struct SCP_SESSION *s) +_scp_v1c_check_response(struct trans *t, struct SCP_SESSION *s) { + struct stream *in_s = t->in_s; tui32 version; - tui32 size; + int size; tui16 cmd; tui16 dim; - init_stream(c->in_s, c->in_s->size); + init_stream(in_s, 64); - if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, 8)) + if (0 != trans_force_read(t, 8)) { return SCP_CLIENT_STATE_NETWORK_ERR; } - in_uint32_be(c->in_s, version); + in_uint32_be(in_s, version); if (version != 1) { return SCP_CLIENT_STATE_VERSION_ERR; } - in_uint32_be(c->in_s, size); + in_uint32_be(in_s, size); - init_stream(c->in_s, c->in_s->size); + init_stream(in_s, size - 8); /* read the rest of the packet */ - if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, size - 8)) + if (0 != trans_force_read(t, size - 8)) { return SCP_CLIENT_STATE_NETWORK_ERR; } - in_uint16_be(c->in_s, cmd); + in_uint16_be(in_s, cmd); if (cmd != SCP_COMMAND_SET_DEFAULT) { return SCP_CLIENT_STATE_SEQUENCE_ERR; } - in_uint16_be(c->in_s, cmd); + in_uint16_be(in_s, cmd); if (cmd == 2) /* connection denied */ { - in_uint16_be(c->in_s, dim); + in_uint16_be(in_s, dim); if (s->errstr != 0) { @@ -440,14 +451,14 @@ _scp_v1c_check_response(struct SCP_CONNECTION *c, struct SCP_SESSION *s) return SCP_CLIENT_STATE_INTERNAL_ERR; } - in_uint8a(c->in_s, s->errstr, dim); + in_uint8a(in_s, s->errstr, dim); (s->errstr)[dim] = '\0'; return SCP_CLIENT_STATE_CONNECTION_DENIED; } else if (cmd == 3) /* resend usr/pwd */ { - in_uint16_be(c->in_s, dim); + in_uint16_be(in_s, dim); if (s->errstr != 0) { @@ -461,14 +472,14 @@ _scp_v1c_check_response(struct SCP_CONNECTION *c, struct SCP_SESSION *s) return SCP_CLIENT_STATE_INTERNAL_ERR; } - in_uint8a(c->in_s, s->errstr, dim); + in_uint8a(in_s, s->errstr, dim); (s->errstr)[dim] = '\0'; return SCP_CLIENT_STATE_RESEND_CREDENTIALS; } else if (cmd == 20) /* password change */ { - in_uint16_be(c->in_s, dim); + in_uint16_be(in_s, dim); if (s->errstr != 0) { @@ -482,14 +493,14 @@ _scp_v1c_check_response(struct SCP_CONNECTION *c, struct SCP_SESSION *s) return SCP_CLIENT_STATE_INTERNAL_ERR; } - in_uint8a(c->in_s, s->errstr, dim); + in_uint8a(in_s, s->errstr, dim); (s->errstr)[dim] = '\0'; return SCP_CLIENT_STATE_PWD_CHANGE_REQ; } else if (cmd == 30) /* display */ { - in_uint16_be(c->in_s, s->display); + in_uint16_be(in_s, s->display); return SCP_CLIENT_STATE_OK; } diff --git a/sesman/libscp/libscp_v1c.h b/sesman/libscp/libscp_v1c.h index 8ee6df08..7d11adca 100644 --- a/sesman/libscp/libscp_v1c.h +++ b/sesman/libscp/libscp_v1c.h @@ -32,32 +32,32 @@ /* client API */ /* 001 */ enum SCP_CLIENT_STATES_E -scp_v1c_connect(struct SCP_CONNECTION *c, struct SCP_SESSION *s); +scp_v1c_connect(struct trans *t, struct SCP_SESSION *s); /* 004 */ enum SCP_CLIENT_STATES_E -scp_v1c_resend_credentials(struct SCP_CONNECTION *c, struct SCP_SESSION *s); +scp_v1c_resend_credentials(struct trans *t, struct SCP_SESSION *s); /* 021 */ enum SCP_CLIENT_STATES_E -scp_v1c_pwd_change(struct SCP_CONNECTION *c, char *newpass); +scp_v1c_pwd_change(struct trans *t, char *newpass); /* 022 */ enum SCP_CLIENT_STATES_E -scp_v1c_pwd_change_cancel(struct SCP_CONNECTION *c); +scp_v1c_pwd_change_cancel(struct trans *t); /* 041 */ enum SCP_CLIENT_STATES_E -scp_v1c_get_session_list(struct SCP_CONNECTION *c, int *scount, +scp_v1c_get_session_list(struct trans *t, int *scount, struct SCP_DISCONNECTED_SESSION **s); /* 043 */ enum SCP_CLIENT_STATES_E -scp_v1c_select_session(struct SCP_CONNECTION *c, struct SCP_SESSION *s, +scp_v1c_select_session(struct trans *t, struct SCP_SESSION *s, SCP_SID sid); /* 044 */ enum SCP_CLIENT_STATES_E -scp_v1c_select_session_cancel(struct SCP_CONNECTION *c); +scp_v1c_select_session_cancel(struct trans *t); #endif diff --git a/sesman/libscp/libscp_v1c_mng.c b/sesman/libscp/libscp_v1c_mng.c index d528d37a..12efe846 100644 --- a/sesman/libscp/libscp_v1c_mng.c +++ b/sesman/libscp/libscp_v1c_mng.c @@ -37,18 +37,17 @@ //extern struct log_config* s_log; static enum SCP_CLIENT_STATES_E -_scp_v1c_mng_check_response(struct SCP_CONNECTION *c, struct SCP_SESSION *s); +_scp_v1c_mng_check_response(struct trans *t, struct SCP_SESSION *s); /* client API */ /* 001 */ enum SCP_CLIENT_STATES_E -scp_v1c_mng_connect(struct SCP_CONNECTION *c, struct SCP_SESSION *s) +scp_v1c_mng_connect(struct trans *t, struct SCP_SESSION *s) { - tui8 sz; - tui32 size; + struct stream *out_s = t->out_s; - init_stream(c->out_s, c->out_s->size); - init_stream(c->in_s, c->in_s->size); + tui8 sz; + int size; size = (12 + 4 + g_strlen(s->hostname) + g_strlen(s->username) + g_strlen(s->password)); @@ -62,56 +61,60 @@ scp_v1c_mng_connect(struct SCP_CONNECTION *c, struct SCP_SESSION *s) size = size + 16; } + init_stream(out_s, size); + /* sending request */ /* header */ - out_uint32_be(c->out_s, 1); /* version */ - out_uint32_be(c->out_s, size); - out_uint16_be(c->out_s, SCP_COMMAND_SET_MANAGE); - out_uint16_be(c->out_s, SCP_CMD_MNG_LOGIN); + out_uint32_be(out_s, 1); /* version */ + out_uint32_be(out_s, size); + out_uint16_be(out_s, SCP_COMMAND_SET_MANAGE); + out_uint16_be(out_s, SCP_CMD_MNG_LOGIN); /* data */ sz = g_strlen(s->username); - out_uint8(c->out_s, sz); - out_uint8p(c->out_s, s->username, sz); + out_uint8(out_s, sz); + out_uint8p(out_s, s->username, sz); sz = g_strlen(s->password); - out_uint8(c->out_s, sz); - out_uint8p(c->out_s, s->password, sz); + out_uint8(out_s, sz); + out_uint8p(out_s, s->password, sz); /* address */ - out_uint8(c->out_s, s->addr_type); + out_uint8(out_s, s->addr_type); if (s->addr_type == SCP_ADDRESS_TYPE_IPV4) { - out_uint32_be(c->out_s, s->ipv4addr); + out_uint32_be(out_s, s->ipv4addr); } else { - out_uint8p(c->out_s, s->ipv6addr, 16); + out_uint8p(out_s, s->ipv6addr, 16); } /* hostname */ sz = g_strlen(s->hostname); - out_uint8(c->out_s, sz); - out_uint8p(c->out_s, s->hostname, sz); + out_uint8(out_s, sz); + out_uint8p(out_s, s->hostname, sz); - if (0 != scp_tcp_force_send(c->in_sck, c->out_s->data, size)) + if (0 != trans_force_write(t)) { LOG(LOG_LEVEL_WARNING, "[v1c_mng:%d] connection aborted: network error", __LINE__); return SCP_CLIENT_STATE_NETWORK_ERR; } /* wait for response */ - return _scp_v1c_mng_check_response(c, s); + return _scp_v1c_mng_check_response(t, s); } /* 004 */ enum SCP_CLIENT_STATES_E -scp_v1c_mng_get_session_list(struct SCP_CONNECTION *c, int *scount, +scp_v1c_mng_get_session_list(struct trans *t, int *scount, struct SCP_DISCONNECTED_SESSION **s) { + struct stream *in_s = t->in_s; + struct stream *out_s = t->out_s; tui32 version = 1; - tui32 size = 12; + int size = 12; tui16 cmd = SCP_CMD_MNG_LIST_REQ; /* request session list */ tui32 sescnt = 0; /* total session number */ tui32 sestmp = 0; /* additional total session number */ @@ -123,15 +126,16 @@ scp_v1c_mng_get_session_list(struct SCP_CONNECTION *c, int *scount, struct SCP_DISCONNECTED_SESSION *ds = 0; // tui8 addr[16]; - init_stream(c->out_s, c->out_s->size); + init_stream(out_s, 64); /* we request session list */ - out_uint32_be(c->out_s, version); /* version */ - out_uint32_be(c->out_s, size); /* size */ - out_uint16_be(c->out_s, SCP_COMMAND_SET_MANAGE); /* cmdset */ - out_uint16_be(c->out_s, cmd); /* cmd */ + out_uint32_be(out_s, version); /* version */ + out_uint32_be(out_s, size); /* size */ + out_uint16_be(out_s, SCP_COMMAND_SET_MANAGE); /* cmdset */ + out_uint16_be(out_s, cmd); /* cmd */ + s_mark_end(out_s); - if (0 != scp_tcp_force_send(c->in_sck, c->out_s->data, size)) + if (0 != trans_force_write(t)) { LOG(LOG_LEVEL_WARNING, "[v1c_mng:%d] connection aborted: network error", __LINE__); return SCP_CLIENT_STATE_NETWORK_ERR; @@ -140,16 +144,16 @@ scp_v1c_mng_get_session_list(struct SCP_CONNECTION *c, int *scount, do { /* then we wait for server response */ - init_stream(c->in_s, c->in_s->size); + init_stream(in_s, 8); - if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, 8)) + if (0 != trans_force_read(t, 8)) { LOG(LOG_LEVEL_WARNING, "[v1c_mng:%d] connection aborted: network error", __LINE__); g_free(ds); return SCP_CLIENT_STATE_NETWORK_ERR; } - in_uint32_be(c->in_s, version); + in_uint32_be(in_s, version); if (version != 1) { @@ -158,7 +162,7 @@ scp_v1c_mng_get_session_list(struct SCP_CONNECTION *c, int *scount, return SCP_CLIENT_STATE_VERSION_ERR; } - in_uint32_be(c->in_s, size); + in_uint32_be(in_s, size); if (size < 12) { @@ -167,16 +171,16 @@ scp_v1c_mng_get_session_list(struct SCP_CONNECTION *c, int *scount, return SCP_CLIENT_STATE_SIZE_ERR; } - init_stream(c->in_s, c->in_s->size); + init_stream(in_s, size); - if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, size - 8)) + if (0 != trans_force_read(t, size - 8)) { LOG(LOG_LEVEL_WARNING, "[v1c_mng:%d] connection aborted: network error", __LINE__); g_free(ds); return SCP_CLIENT_STATE_NETWORK_ERR; } - in_uint16_be(c->in_s, cmd); + in_uint16_be(in_s, cmd); if (cmd != SCP_COMMAND_SET_MANAGE) { @@ -185,7 +189,7 @@ scp_v1c_mng_get_session_list(struct SCP_CONNECTION *c, int *scount, return SCP_CLIENT_STATE_SEQUENCE_ERR; } - in_uint16_be(c->in_s, cmd); + in_uint16_be(in_s, cmd); if (cmd != SCP_CMD_MNG_LIST) /* session list */ { @@ -197,7 +201,7 @@ scp_v1c_mng_get_session_list(struct SCP_CONNECTION *c, int *scount, if (firstpkt) { firstpkt = 0; - in_uint32_be(c->in_s, sescnt); + in_uint32_be(in_s, sescnt); sestmp = sescnt; if (0 == sescnt) @@ -220,38 +224,38 @@ scp_v1c_mng_get_session_list(struct SCP_CONNECTION *c, int *scount, } else { - in_uint32_be(c->in_s, sestmp); + in_uint32_be(in_s, sestmp); } - in_uint8(c->in_s, continued); - in_uint8(c->in_s, pktcnt); + in_uint8(in_s, continued); + in_uint8(in_s, pktcnt); for (idx = 0; idx < pktcnt; idx++) { - in_uint32_be(c->in_s, (ds[totalcnt]).SID); /* session id */ - in_uint8(c->in_s, (ds[totalcnt]).type); - in_uint16_be(c->in_s, (ds[totalcnt]).height); - in_uint16_be(c->in_s, (ds[totalcnt]).width); - in_uint8(c->in_s, (ds[totalcnt]).bpp); - in_uint8(c->in_s, (ds[totalcnt]).idle_days); - in_uint8(c->in_s, (ds[totalcnt]).idle_hours); - in_uint8(c->in_s, (ds[totalcnt]).idle_minutes); + in_uint32_be(in_s, (ds[totalcnt]).SID); /* session id */ + in_uint8(in_s, (ds[totalcnt]).type); + in_uint16_be(in_s, (ds[totalcnt]).height); + in_uint16_be(in_s, (ds[totalcnt]).width); + in_uint8(in_s, (ds[totalcnt]).bpp); + in_uint8(in_s, (ds[totalcnt]).idle_days); + in_uint8(in_s, (ds[totalcnt]).idle_hours); + in_uint8(in_s, (ds[totalcnt]).idle_minutes); - in_uint16_be(c->in_s, (ds[totalcnt]).conn_year); - in_uint8(c->in_s, (ds[totalcnt]).conn_month); - in_uint8(c->in_s, (ds[totalcnt]).conn_day); - in_uint8(c->in_s, (ds[totalcnt]).conn_hour); - in_uint8(c->in_s, (ds[totalcnt]).conn_minute); - in_uint8(c->in_s, (ds[totalcnt]).addr_type); + in_uint16_be(in_s, (ds[totalcnt]).conn_year); + in_uint8(in_s, (ds[totalcnt]).conn_month); + in_uint8(in_s, (ds[totalcnt]).conn_day); + in_uint8(in_s, (ds[totalcnt]).conn_hour); + in_uint8(in_s, (ds[totalcnt]).conn_minute); + in_uint8(in_s, (ds[totalcnt]).addr_type); if ((ds[totalcnt]).addr_type == SCP_ADDRESS_TYPE_IPV4) { - in_uint32_be(c->in_s, (ds[totalcnt]).ipv4addr); + in_uint32_be(in_s, (ds[totalcnt]).ipv4addr); } if ((ds[totalcnt]).addr_type == SCP_ADDRESS_TYPE_IPV6) { - in_uint8a(c->in_s, (ds[totalcnt]).ipv6addr, 16); + in_uint8a(in_s, (ds[totalcnt]).ipv6addr, 16); } totalcnt++; @@ -362,23 +366,24 @@ scp_v1c_select_session_cancel(struct SCP_CONNECTION* c) }*/ static enum SCP_CLIENT_STATES_E -_scp_v1c_mng_check_response(struct SCP_CONNECTION *c, struct SCP_SESSION *s) +_scp_v1c_mng_check_response(struct trans *t, struct SCP_SESSION *s) { + struct stream *in_s = t->in_s; tui32 version; - tui32 size; + int size; tui16 cmd; tui8 dim; char buf[257]; - init_stream(c->in_s, c->in_s->size); + init_stream(in_s, 8); - if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, 8)) + if (0 != trans_force_read(t, 8)) { LOG(LOG_LEVEL_WARNING, "[v1c_mng:%d] connection aborted: network error", __LINE__); return SCP_CLIENT_STATE_NETWORK_ERR; } - in_uint32_be(c->in_s, version); + in_uint32_be(in_s, version); if (version != 1) { @@ -386,18 +391,18 @@ _scp_v1c_mng_check_response(struct SCP_CONNECTION *c, struct SCP_SESSION *s) return SCP_CLIENT_STATE_VERSION_ERR; } - in_uint32_be(c->in_s, size); + in_uint32_be(in_s, size); - init_stream(c->in_s, c->in_s->size); + init_stream(in_s, size - 8); /* read the rest of the packet */ - if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, size - 8)) + if (0 != trans_force_read(t, size - 8)) { LOG(LOG_LEVEL_WARNING, "[v1c_mng:%d] connection aborted: network error", __LINE__); return SCP_CLIENT_STATE_NETWORK_ERR; } - in_uint16_be(c->in_s, cmd); + in_uint16_be(in_s, cmd); if (cmd != SCP_COMMAND_SET_MANAGE) { @@ -405,7 +410,7 @@ _scp_v1c_mng_check_response(struct SCP_CONNECTION *c, struct SCP_SESSION *s) return SCP_CLIENT_STATE_SEQUENCE_ERR; } - in_uint16_be(c->in_s, cmd); + in_uint16_be(in_s, cmd); if (cmd == SCP_CMD_MNG_LOGIN_ALLOW) /* connection ok */ { @@ -414,9 +419,9 @@ _scp_v1c_mng_check_response(struct SCP_CONNECTION *c, struct SCP_SESSION *s) } else if (cmd == SCP_CMD_MNG_LOGIN_DENY) /* connection denied */ { - in_uint8(c->in_s, dim); + in_uint8(in_s, dim); buf[dim] = '\0'; - in_uint8a(c->in_s, buf, dim); + in_uint8a(in_s, buf, dim); scp_session_set_errstr(s, buf); LOG(LOG_LEVEL_INFO, "[v1c_mng:%d] connection denied: %s", __LINE__, s->errstr); diff --git a/sesman/libscp/libscp_v1c_mng.h b/sesman/libscp/libscp_v1c_mng.h index 3ec32ec2..b39da625 100644 --- a/sesman/libscp/libscp_v1c_mng.h +++ b/sesman/libscp/libscp_v1c_mng.h @@ -32,7 +32,7 @@ /* client API */ /* 001 */ enum SCP_CLIENT_STATES_E -scp_v1c_mng_connect(struct SCP_CONNECTION *c, struct SCP_SESSION *s); +scp_v1c_mng_connect(struct trans *t, struct SCP_SESSION *s); /* 004 * / enum SCP_CLIENT_STATES_E @@ -49,7 +49,7 @@ scp_v1c_pwd_change_cancel(struct SCP_CONNECTION* c); /* 041 */ enum SCP_CLIENT_STATES_E -scp_v1c_mng_get_session_list(struct SCP_CONNECTION *c, int *scount, +scp_v1c_mng_get_session_list(struct trans *t, int *scount, struct SCP_DISCONNECTED_SESSION **s); #endif diff --git a/sesman/libscp/libscp_v1s.h b/sesman/libscp/libscp_v1s.h index ed0cecf3..30e56203 100644 --- a/sesman/libscp/libscp_v1s.h +++ b/sesman/libscp/libscp_v1s.h @@ -80,9 +80,11 @@ enum SCP_SERVER_STATES_E scp_v1s_connection_error(struct trans *t, const char *error); /* 040 */ +#if 0 enum SCP_SERVER_STATES_E scp_v1s_list_sessions(struct SCP_CONNECTION *c, int sescnt, struct SCP_DISCONNECTED_SESSION *ds, SCP_SID *sid); +#endif enum SCP_SERVER_STATES_E scp_v1s_list_sessions40(struct trans *t); diff --git a/sesman/libscp/libscp_v1s_mng.c b/sesman/libscp/libscp_v1s_mng.c index 021273c0..a5ae4398 100644 --- a/sesman/libscp/libscp_v1s_mng.c +++ b/sesman/libscp/libscp_v1s_mng.c @@ -37,7 +37,7 @@ //extern struct log_config* s_log; static enum SCP_SERVER_STATES_E -_scp_v1s_mng_check_response(struct SCP_CONNECTION *c, struct SCP_SESSION *s); +_scp_v1s_mng_check_response(struct trans *t, struct SCP_SESSION *s); /** * Reads a uint8 followed by a string into a buffer @@ -217,51 +217,56 @@ scp_v1s_mng_accept(struct trans *atrans, struct SCP_SESSION **s) /* 002 */ enum SCP_SERVER_STATES_E -scp_v1s_mng_allow_connection(struct SCP_CONNECTION *c, struct SCP_SESSION *s) +scp_v1s_mng_allow_connection(struct trans *t, struct SCP_SESSION *s) { - init_stream(c->out_s, c->out_s->size); + struct stream *out_s = t->out_s; + init_stream(out_s, 64); - out_uint32_be(c->out_s, 1); + out_uint32_be(out_s, 1); /* packet size: 4 + 4 + 2 + 2 */ /* version + size + cmdset + cmd */ - out_uint32_be(c->out_s, 12); - out_uint16_be(c->out_s, SCP_COMMAND_SET_MANAGE); - out_uint16_be(c->out_s, SCP_CMD_MNG_LOGIN_ALLOW); + out_uint32_be(out_s, 12); + out_uint16_be(out_s, SCP_COMMAND_SET_MANAGE); + out_uint16_be(out_s, SCP_CMD_MNG_LOGIN_ALLOW); + s_mark_end(out_s); - if (0 != scp_tcp_force_send(c->in_sck, c->out_s->data, 12)) + if (0 != trans_write_copy(t)) { return SCP_SERVER_STATE_NETWORK_ERR; } - return _scp_v1s_mng_check_response(c, s); + return _scp_v1s_mng_check_response(t, s); } /* 003 */ enum SCP_SERVER_STATES_E -scp_v1s_mng_deny_connection(struct SCP_CONNECTION *c, const char *reason) +scp_v1s_mng_deny_connection(struct trans *t, const char *reason) { int rlen; - init_stream(c->out_s, c->out_s->size); + struct stream *out_s = t->out_s; /* forcing message not to exceed 64k */ rlen = g_strlen(reason); - if (rlen > 65535) + if (rlen > 65535 - 64) { - rlen = 65535; + rlen = 65535 - 64; } - out_uint32_be(c->out_s, 1); + init_stream(out_s, rlen + 64); + + out_uint32_be(out_s, 1); /* packet size: 4 + 4 + 2 + 2 + 2 + strlen(reason)*/ /* version + size + cmdset + cmd + msglen + msg */ - out_uint32_be(c->out_s, rlen + 14); - out_uint16_be(c->out_s, SCP_COMMAND_SET_MANAGE); - out_uint16_be(c->out_s, SCP_CMD_MNG_LOGIN_DENY); - out_uint16_be(c->out_s, rlen); - out_uint8p(c->out_s, reason, rlen); + out_uint32_be(out_s, rlen + 14); + out_uint16_be(out_s, SCP_COMMAND_SET_MANAGE); + out_uint16_be(out_s, SCP_CMD_MNG_LOGIN_DENY); + out_uint16_be(out_s, rlen); + out_uint8p(out_s, reason, rlen); + s_mark_end(out_s); - if (0 != scp_tcp_force_send(c->in_sck, c->out_s->data, rlen + 14)) + if (0 != trans_write_copy(t)) { return SCP_SERVER_STATE_NETWORK_ERR; } @@ -271,7 +276,7 @@ scp_v1s_mng_deny_connection(struct SCP_CONNECTION *c, const char *reason) /* 006 */ enum SCP_SERVER_STATES_E -scp_v1s_mng_list_sessions(struct SCP_CONNECTION *c, struct SCP_SESSION *s, +scp_v1s_mng_list_sessions(struct trans *t, struct SCP_SESSION *s, int sescnt, struct SCP_DISCONNECTED_SESSION *ds) { tui32 version = 1; @@ -283,6 +288,8 @@ scp_v1s_mng_list_sessions(struct SCP_CONNECTION *c, struct SCP_SESSION *s, int pidx; struct SCP_DISCONNECTED_SESSION *cds; + struct stream *out_s = t->out_s; + /* calculating the number of packets to send */ if (sescnt == 0) { @@ -301,33 +308,33 @@ scp_v1s_mng_list_sessions(struct SCP_CONNECTION *c, struct SCP_SESSION *s, for (idx = 0; idx < pktcnt; idx++) { /* ok, we send session session list */ - init_stream(c->out_s, c->out_s->size); + init_stream(out_s, 64 + (SCP_SERVER_MAX_LIST_SIZE * 40)); /* size: ver+size+cmdset+cmd+sescnt+continue+count */ size = 4 + 4 + 2 + 2 + 4 + 1 + 1; /* header */ - s_push_layer(c->out_s, channel_hdr, 8); - out_uint16_be(c->out_s, SCP_COMMAND_SET_MANAGE); - out_uint16_be(c->out_s, cmd); + s_push_layer(out_s, channel_hdr, 8); + out_uint16_be(out_s, SCP_COMMAND_SET_MANAGE); + out_uint16_be(out_s, cmd); /* session count */ - out_uint32_be(c->out_s, sescnt); + out_uint32_be(out_s, sescnt); /* setting the continue flag */ if ((idx + 1)*SCP_SERVER_MAX_LIST_SIZE >= sescnt) { - out_uint8(c->out_s, 0); + out_uint8(out_s, 0); /* setting session count for this packet */ pidx = sescnt - (idx * SCP_SERVER_MAX_LIST_SIZE); - out_uint8(c->out_s, pidx); + out_uint8(out_s, pidx); } else { - out_uint8(c->out_s, 1); + out_uint8(out_s, 1); /* setting session count for this packet */ pidx = SCP_SERVER_MAX_LIST_SIZE; - out_uint8(c->out_s, pidx); + out_uint8(out_s, pidx); } /* adding session descriptors */ @@ -337,52 +344,53 @@ scp_v1s_mng_list_sessions(struct SCP_CONNECTION *c, struct SCP_SESSION *s, cds = ds + ((idx) * SCP_SERVER_MAX_LIST_SIZE) + sidx; /* session data */ - out_uint32_be(c->out_s, cds->SID); /* session id */ - out_uint8(c->out_s, cds->type); - out_uint16_be(c->out_s, cds->height); - out_uint16_be(c->out_s, cds->width); - out_uint8(c->out_s, cds->bpp); - out_uint8(c->out_s, cds->idle_days); - out_uint8(c->out_s, cds->idle_hours); - out_uint8(c->out_s, cds->idle_minutes); + out_uint32_be(out_s, cds->SID); /* session id */ + out_uint8(out_s, cds->type); + out_uint16_be(out_s, cds->height); + out_uint16_be(out_s, cds->width); + out_uint8(out_s, cds->bpp); + out_uint8(out_s, cds->idle_days); + out_uint8(out_s, cds->idle_hours); + out_uint8(out_s, cds->idle_minutes); size += 13; - out_uint16_be(c->out_s, cds->conn_year); - out_uint8(c->out_s, cds->conn_month); - out_uint8(c->out_s, cds->conn_day); - out_uint8(c->out_s, cds->conn_hour); - out_uint8(c->out_s, cds->conn_minute); - out_uint8(c->out_s, cds->addr_type); + out_uint16_be(out_s, cds->conn_year); + out_uint8(out_s, cds->conn_month); + out_uint8(out_s, cds->conn_day); + out_uint8(out_s, cds->conn_hour); + out_uint8(out_s, cds->conn_minute); + out_uint8(out_s, cds->addr_type); size += 7; if (cds->addr_type == SCP_ADDRESS_TYPE_IPV4) { - in_uint32_be(c->out_s, cds->ipv4addr); + in_uint32_be(out_s, cds->ipv4addr); size += 4; } else if (cds->addr_type == SCP_ADDRESS_TYPE_IPV6) { - in_uint8a(c->out_s, cds->ipv6addr, 16); + in_uint8a(out_s, cds->ipv6addr, 16); size += 16; } } - s_pop_layer(c->out_s, channel_hdr); - out_uint32_be(c->out_s, version); - out_uint32_be(c->out_s, size); + s_mark_end(out_s); + s_pop_layer(out_s, channel_hdr); + out_uint32_be(out_s, version); + out_uint32_be(out_s, size); - if (0 != scp_tcp_force_send(c->in_sck, c->out_s->data, size)) + if (0 != trans_force_write(t)) { LOG(LOG_LEVEL_WARNING, "[v1s_mng:%d] connection aborted: network error", __LINE__); return SCP_SERVER_STATE_NETWORK_ERR; } } - return _scp_v1s_mng_check_response(c, s); + return _scp_v1s_mng_check_response(t, s); } static enum SCP_SERVER_STATES_E -_scp_v1s_mng_check_response(struct SCP_CONNECTION *c, struct SCP_SESSION *s) +_scp_v1s_mng_check_response(struct trans *t, struct SCP_SESSION *s) { tui32 version; int size; @@ -390,15 +398,17 @@ _scp_v1s_mng_check_response(struct SCP_CONNECTION *c, struct SCP_SESSION *s) // tui8 dim; // char buf[257]; - init_stream(c->in_s, c->in_s->size); + struct stream *in_s = t->in_s; - if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, 8)) + init_stream(in_s, 64); + + if (0 != trans_force_read(t, 8)) { LOG(LOG_LEVEL_WARNING, "[v1s_mng:%d] connection aborted: network error", __LINE__); return SCP_SERVER_STATE_NETWORK_ERR; } - in_uint32_be(c->in_s, version); + in_uint32_be(in_s, version); if (version != 1) { @@ -406,7 +416,7 @@ _scp_v1s_mng_check_response(struct SCP_CONNECTION *c, struct SCP_SESSION *s) return SCP_SERVER_STATE_VERSION_ERR; } - in_uint32_be(c->in_s, size); + in_uint32_be(in_s, size); /* Check the message is big enough for the header, the command set, and * the command (but not too big) */ @@ -416,18 +426,16 @@ _scp_v1s_mng_check_response(struct SCP_CONNECTION *c, struct SCP_SESSION *s) return SCP_SERVER_STATE_SIZE_ERR; } - init_stream(c->in_s, size - 8); + init_stream(in_s, size - 8); /* read the rest of the packet */ - if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, size - 8)) + if (0 != trans_force_read(t, size - 8)) { LOG(LOG_LEVEL_WARNING, "[v1s_mng:%d] connection aborted: network error", __LINE__); return SCP_SERVER_STATE_NETWORK_ERR; } - c->in_s->end = c->in_s->data + (size - 8); - - in_uint16_be(c->in_s, cmd); + in_uint16_be(in_s, cmd); if (cmd != SCP_COMMAND_SET_MANAGE) { @@ -435,7 +443,7 @@ _scp_v1s_mng_check_response(struct SCP_CONNECTION *c, struct SCP_SESSION *s) return SCP_SERVER_STATE_SEQUENCE_ERR; } - in_uint16_be(c->in_s, cmd); + in_uint16_be(in_s, cmd); if (cmd == SCP_CMD_MNG_LIST_REQ) /* request session list */ { diff --git a/sesman/libscp/libscp_v1s_mng.h b/sesman/libscp/libscp_v1s_mng.h index f8563d03..6f9483c0 100644 --- a/sesman/libscp/libscp_v1s_mng.h +++ b/sesman/libscp/libscp_v1s_mng.h @@ -50,7 +50,7 @@ scp_v1s_mng_accept(struct trans *atrans, struct SCP_SESSION **s); */ /* 002 */ enum SCP_SERVER_STATES_E -scp_v1s_mng_allow_connection(struct SCP_CONNECTION *c, struct SCP_SESSION *s); +scp_v1s_mng_allow_connection(struct trans *atrans, struct SCP_SESSION *s); /** * @@ -61,7 +61,7 @@ scp_v1s_mng_allow_connection(struct SCP_CONNECTION *c, struct SCP_SESSION *s); */ /* 003 */ enum SCP_SERVER_STATES_E -scp_v1s_mng_deny_connection(struct SCP_CONNECTION *c, const char *reason); +scp_v1s_mng_deny_connection(struct trans *atrans, const char *reason); /** * @@ -71,7 +71,7 @@ scp_v1s_mng_deny_connection(struct SCP_CONNECTION *c, const char *reason); */ /* 006 */ enum SCP_SERVER_STATES_E -scp_v1s_mng_list_sessions(struct SCP_CONNECTION *c, struct SCP_SESSION *s, +scp_v1s_mng_list_sessions(struct trans *atrans, struct SCP_SESSION *s, int sescnt, struct SCP_DISCONNECTED_SESSION *ds); // SCP_SID* sid); diff --git a/sesman/scp.c b/sesman/scp.c index 94c8155a..774d71fa 100644 --- a/sesman/scp.c +++ b/sesman/scp.c @@ -51,19 +51,19 @@ scp_process(struct trans *t) { /* starts processing an scp v0 connection */ LOG_DEVEL(LOG_LEVEL_DEBUG, "accept ok, go on with scp v0"); - scp_v0_process(t, sdata); + result = scp_v0_process(t, sdata); } else { LOG_DEVEL(LOG_LEVEL_DEBUG, "accept ok, go on with scp v1"); - scp_v1_process(t, sdata); + result = scp_v1_process(t, sdata); } break; case SCP_SERVER_STATE_START_MANAGE: /* starting a management session */ LOG(LOG_LEVEL_INFO, "starting a sesman management session..."); - scp_v1_mng_process_msg(t, sdata); + result = scp_v1_mng_process_msg(t, sdata); break; case SCP_SERVER_STATE_VERSION_ERR: case SCP_SERVER_STATE_SIZE_ERR: diff --git a/sesman/scp_v1_mng.c b/sesman/scp_v1_mng.c index 9594e8a5..1ae13476 100644 --- a/sesman/scp_v1_mng.c +++ b/sesman/scp_v1_mng.c @@ -37,8 +37,8 @@ extern struct config_sesman *g_cfg; /* in sesman.c */ static void parseCommonStates(enum SCP_SERVER_STATES_E e, const char *f); /******************************************************************************/ -void -scp_v1_mng_process(struct SCP_CONNECTION *c, struct SCP_SESSION *s) +enum SCP_SERVER_STATES_E +scp_v1_mng_process_msg(struct trans *atrans, struct SCP_SESSION *s) { long data; enum SCP_SERVER_STATES_E e; @@ -51,24 +51,24 @@ scp_v1_mng_process(struct SCP_CONNECTION *c, struct SCP_SESSION *s) if (!data) { - scp_v1s_mng_deny_connection(c, "Login failed"); + scp_v1s_mng_deny_connection(atrans, "Login failed"); LOG(LOG_LEVEL_INFO, "[MNG] Login failed for user %s. Connection terminated", s->username); auth_end(data); - return; + return SCP_SERVER_STATE_END; } /* testing if login is allowed */ if (0 == access_login_mng_allowed(s->username)) { - scp_v1s_mng_deny_connection(c, "Access to Terminal Server not allowed."); + scp_v1s_mng_deny_connection(atrans, "Access to Terminal Server not allowed."); LOG(LOG_LEVEL_INFO, "[MNG] User %s not allowed on TS. Connection terminated", s->username); auth_end(data); - return; + return SCP_SERVER_STATE_END; } - e = scp_v1s_mng_allow_connection(c, s); + e = scp_v1s_mng_allow_connection(atrans, s); end = 1; @@ -89,7 +89,7 @@ scp_v1_mng_process(struct SCP_CONNECTION *c, struct SCP_SESSION *s) LOG(LOG_LEVEL_INFO, "No sessions on Terminal Server"); } - e = scp_v1s_mng_list_sessions(c, s, scount, slist); + e = scp_v1s_mng_list_sessions(atrans, s, scount, slist); g_free(slist); break; default: @@ -102,12 +102,7 @@ scp_v1_mng_process(struct SCP_CONNECTION *c, struct SCP_SESSION *s) /* cleanup */ auth_end(data); -} - -void -scp_v1_mng_process_msg(struct trans *atrans, struct SCP_SESSION *s) -{ - // JAY TODO + return SCP_SERVER_STATE_END; } static void parseCommonStates(enum SCP_SERVER_STATES_E e, const char *f) diff --git a/sesman/scp_v1_mng.h b/sesman/scp_v1_mng.h index 61ff05e0..b738de2f 100644 --- a/sesman/scp_v1_mng.h +++ b/sesman/scp_v1_mng.h @@ -30,15 +30,11 @@ /** * * @brief processes the stream using scp version 1 - * @param in_sck connection socket - * @param in_s input stream - * @param out_s output stream + * @param atrans incoming transport + * @param s incoming session details * */ -void -scp_v1_mng_process(struct SCP_CONNECTION *c, struct SCP_SESSION *s); - -void +enum SCP_SERVER_STATES_E scp_v1_mng_process_msg(struct trans *atrans, struct SCP_SESSION *s); #endif diff --git a/sesman/tools/sesadmin.c b/sesman/tools/sesadmin.c index b8949301..0db30bb4 100644 --- a/sesman/tools/sesadmin.c +++ b/sesman/tools/sesadmin.c @@ -38,8 +38,8 @@ char cmnd[257]; char serv[257]; char port[257]; -void cmndList(struct SCP_CONNECTION *c); -void cmndKill(struct SCP_CONNECTION *c, struct SCP_SESSION *s); +void cmndList(struct trans *t); +void cmndKill(struct trans *t, struct SCP_SESSION *s); void cmndHelp(void); int inputSession(struct SCP_SESSION *s); @@ -48,7 +48,7 @@ unsigned int menuSelect(unsigned int choices); int main(int argc, char **argv) { struct SCP_SESSION *s; - struct SCP_CONNECTION *c; + struct trans *t; enum SCP_CLIENT_STATES_E e; //int end; int idx; @@ -136,7 +136,7 @@ int main(int argc, char **argv) } s = scp_session_create(); - c = scp_connection_create(sock); + t = scp_trans_create(sock); LOG_DEVEL(LOG_LEVEL_DEBUG, "Connecting to %s:%s with user %s (%s)", serv, port, user, pass); @@ -151,7 +151,7 @@ int main(int argc, char **argv) scp_session_set_username(s, user); scp_session_set_password(s, pass); - e = scp_v1c_mng_connect(c, s); + e = scp_v1c_mng_connect(t, s); if (SCP_CLIENT_STATE_OK != e) { @@ -160,16 +160,16 @@ int main(int argc, char **argv) if (0 == g_strncmp(cmnd, "list", 5)) { - cmndList(c); + cmndList(t); } else if (0 == g_strncmp(cmnd, "kill:", 5)) { - cmndKill(c, s); + cmndKill(t, s); } g_tcp_close(sock); scp_session_destroy(s); - scp_connection_destroy(c); + trans_delete(t); log_end(); return 0; @@ -203,14 +203,14 @@ print_session(const struct SCP_DISCONNECTED_SESSION *s) s->conn_minute); } -void cmndList(struct SCP_CONNECTION *c) +void cmndList(struct trans *t) { struct SCP_DISCONNECTED_SESSION *dsl; enum SCP_CLIENT_STATES_E e; int scnt; int idx; - e = scp_v1c_mng_get_session_list(c, &scnt, &dsl); + e = scp_v1c_mng_get_session_list(t, &scnt, &dsl); if (e != SCP_CLIENT_STATE_LIST_OK) { @@ -233,7 +233,7 @@ void cmndList(struct SCP_CONNECTION *c) g_free(dsl); } -void cmndKill(struct SCP_CONNECTION *c, struct SCP_SESSION *s) +void cmndKill(struct trans *t, struct SCP_SESSION *s) { } diff --git a/sesman/tools/sestest.c b/sesman/tools/sestest.c index 9d9d45af..43045b29 100644 --- a/sesman/tools/sestest.c +++ b/sesman/tools/sestest.c @@ -37,7 +37,7 @@ int main(int argc, char **argv) { char buf[256]; struct SCP_SESSION *s; - struct SCP_CONNECTION *c; + struct trans *t; /*struct SCP_DISCONNECTED_SESSION ds;*/ struct SCP_DISCONNECTED_SESSION *dsl; enum SCP_CLIENT_STATES_E e; @@ -62,7 +62,7 @@ int main(int argc, char **argv) } s = scp_session_create(); - c = scp_connection_create(sock); + t = scp_trans_create(sock); if (0 != g_tcp_connect(sock, "localhost", "3350")) { @@ -105,7 +105,7 @@ int main(int argc, char **argv) s.errstr=0;*/ end = 0; - e = scp_v1c_connect(c, s); + e = scp_v1c_connect(t, s); while (!end) { @@ -117,7 +117,7 @@ int main(int argc, char **argv) break; case SCP_CLIENT_STATE_SESSION_LIST: g_printf("OK : session list needed\n"); - e = scp_v1c_get_session_list(c, &scnt, &dsl); + e = scp_v1c_get_session_list(t, &scnt, &dsl); break; case SCP_CLIENT_STATE_LIST_OK: g_printf("OK : selecting a session:\n"); @@ -131,7 +131,7 @@ int main(int argc, char **argv) } sel = menuSelect(scnt); - e = scp_v1c_select_session(c, s, dsl[sel - 1].SID); + e = scp_v1c_select_session(t, s, dsl[sel - 1].SID); g_printf("\n return: %d \n", e); break; case SCP_CLIENT_STATE_RESEND_CREDENTIALS: @@ -152,7 +152,7 @@ int main(int argc, char **argv) } scp_session_set_password(s, buf); - e = scp_v1c_resend_credentials(c, s); + e = scp_v1c_resend_credentials(t, s); break; case SCP_CLIENT_STATE_CONNECTION_DENIED: g_printf("ERR: connection denied: %s\n", s->errstr); @@ -175,7 +175,7 @@ int main(int argc, char **argv) g_tcp_close(sock); scp_session_destroy(s); - scp_connection_destroy(c); + trans_delete(t); /*free_stream(c.in_s); free_stream(c.out_s);*/