@@ -21,10 +21,12 @@ CLASS zcl_oassh DEFINITION
21
21
key_exchange TYPE i VALUE 2 ,
22
22
END OF gc_state .
23
23
DATA mi_client TYPE REF TO if_apc_wsp_client .
24
- DATA mv_buffer TYPE xstring .
24
+ DATA mo_stream TYPE REF TO zcl_oassh_stream .
25
25
DATA mv_state TYPE i .
26
26
27
- METHODS handle .
27
+ METHODS handle
28
+ RAISING
29
+ cx_apc_error .
28
30
METHODS send
29
31
IMPORTING
30
32
!iv_message TYPE xstring
@@ -34,7 +36,7 @@ ENDCLASS.
34
36
35
37
36
38
37
- CLASS zcl_oassh IMPLEMENTATION .
39
+ CLASS ZCL_OASSH IMPLEMENTATION .
38
40
39
41
40
42
METHOD connect .
@@ -44,6 +46,8 @@ CLASS zcl_oassh IMPLEMENTATION.
44
46
45
47
CREATE OBJECT lo_ssh.
46
48
49
+ CREATE OBJECT lo_ssh->mo_stream.
50
+
47
51
ls_frame-frame_type = if_apc_tcp_frame_types=>co_frame_type_fixed_length.
48
52
ls_frame-fixed_length = 1 .
49
53
@@ -61,30 +65,31 @@ CLASS zcl_oassh IMPLEMENTATION.
61
65
METHOD handle .
62
66
63
67
DATA lv_remote_version TYPE string .
64
- DATA lo_stream TYPE REF TO zcl_oassh_stream.
65
68
DATA lv_padding_length TYPE i .
66
69
DATA lv_length TYPE i .
67
70
DATA ls_kexinit TYPE zcl_oassh_message_20=>ty_data.
68
71
69
72
CASE mv_state.
70
73
WHEN gc_state-protocol_version_exchange.
71
- IF mv_buffer CP | *{ cl_abap_codepage=>convert_to( | { cl_abap_char_utilities=>cr_lf }| ) } | .
72
- lv_remote_version = cl_abap_codepage=>convert_from( mv_buffer ).
73
- CLEAR mv_buffer .
74
+ IF mo_stream->get( ) CP | *{ cl_abap_codepage=>convert_to( | { cl_abap_char_utilities=>cr_lf }| ) } | .
75
+ lv_remote_version = cl_abap_codepage=>convert_from( mo_stream->get( ) ).
76
+ mo_stream->clear( ) .
74
77
mv_state = gc_state-key_exchange.
75
78
ENDIF .
76
79
WHEN gc_state-key_exchange.
77
- * todo, check buffer contains a full packet, and return the packet payload
78
80
* https://datatracker.ietf.org/doc/html/rfc4253#section-7
79
81
80
- IF xstrlen ( mv_buffer ) > 4 .
81
- CREATE OBJECT lo_stream EXPORTING iv_hex = mv_buffer .
82
- lv_length = lo_stream->uint32_decode ( ).
83
- IF lo_stream->get_length ( ) = lv_length .
82
+ IF mo_stream->get_length( ) > 4 .
83
+ lv_length = mo_stream->uint32_decode_peek( ) .
84
+ IF mo_stream->get_length ( ) = lv_length .
85
+ mo_stream->uint32_decode ( ).
84
86
* there is no MAC negotiated at this point in time
85
- lv_padding_length = lo_stream->take( 1 ).
86
- ls_kexinit = zcl_oassh_message_20=>parse( lo_stream ).
87
- lo_stream->take( lv_padding_length ).
87
+ lv_padding_length = mo_stream->take( 1 ).
88
+ ls_kexinit = zcl_oassh_message_20=>parse( mo_stream ).
89
+ mo_stream->take( lv_padding_length / 2 ).
90
+
91
+ ls_kexinit-cookie = '11223344556677881122334455667788' . " todo, this should value should be random
92
+ send( zcl_oassh_message_20=>serialize( ls_kexinit )->get( ) ).
88
93
ENDIF .
89
94
ENDIF .
90
95
@@ -94,11 +99,13 @@ CLASS zcl_oassh IMPLEMENTATION.
94
99
95
100
96
101
METHOD if_apc_wsp_event_handler ~on_close .
102
+ BREAK-POINT .
97
103
WRITE / 'on_close' .
98
104
ENDMETHOD .
99
105
100
106
101
107
METHOD if_apc_wsp_event_handler ~on_error .
108
+ BREAK-POINT .
102
109
WRITE / 'on_error' .
103
110
ENDMETHOD .
104
111
@@ -108,17 +115,17 @@ CLASS zcl_oassh IMPLEMENTATION.
108
115
109
116
TRY .
110
117
lv_message = i_message->get_binary( ).
111
- CATCH cx_root.
118
+ mo_stream->append( lv_message ).
119
+ handle( ).
120
+ CATCH cx_root INTO DATA (lx_error ).
121
+ BREAK-POINT .
112
122
ENDTRY .
113
- mv_buffer = mv_buffer && lv_message.
114
-
115
- handle( ).
116
-
117
123
ENDMETHOD .
118
124
119
125
120
126
METHOD if_apc_wsp_event_handler ~on_open .
121
127
DATA lv_xstr TYPE xstring .
128
+ BREAK-POINT .
122
129
123
130
WRITE / 'on_open' .
124
131
@@ -141,8 +148,8 @@ CLASS zcl_oassh IMPLEMENTATION.
141
148
142
149
DATA li_message_manager TYPE REF TO if_apc_wsp_message_manager.
143
150
DATA li_message TYPE REF TO if_apc_wsp_message.
144
- DATA lv_index TYPE i .
145
- DATA lv_hex TYPE xstring .
151
+ DATA lv_index TYPE i .
152
+ DATA lv_hex TYPE xstring .
146
153
147
154
li_message_manager ?= mi_client->get_message_manager( ).
148
155
@@ -158,4 +165,4 @@ CLASS zcl_oassh IMPLEMENTATION.
158
165
ENDDO .
159
166
160
167
ENDMETHOD .
161
- ENDCLASS .
168
+ ENDCLASS .
0 commit comments