1111 ================ SFTP Protocol options =====================
1212| [ ] Private key file path: |
1313| [EDIT....................................................] |
14+ | [ ] Custom subsystem request: |
15+ | [EDIT....................................................] |
1416| Max read block size, bytes: [9999999] |
1517| Max write block size, bytes: [9999999] |
1618| [ ] Enable TCP_NODELAY option |
@@ -26,15 +28,16 @@ class ProtocolOptionsSFTP : protected BaseDialog
2628{
2729 int _i_ok = -1 , _i_cancel = -1 ;
2830 int _i_privkey_enable = -1 , _i_privkey_path = -1 ;
31+ int _i_use_custom_subsystem = -1 , _i_custom_subsystem = -1 ;
2932 int _i_max_read_block_size = -1 , _i_max_write_block_size = -1 ;
3033 int _i_tcp_nodelay = -1 , _i_tcp_quickack = -1 ;
3134 // int _i_enable_sandbox = -1;
3235
33- bool _keypath_enabled = true , _ok_enabled = true ;
36+ bool _keypath_enabled = true , _subsystem_enabled = true , _ok_enabled = true ;
3437
3538 void UpdateEnableds (bool due_privkey_enable_clicked)
3639 {
37- bool ok_enabled = true , keypath_enabled = false ;
40+ bool ok_enabled = true , keypath_enabled = false , subsystem_enabled = false ;
3841 if (IsCheckedDialogControl (_i_privkey_enable)) {
3942 ok_enabled = false ;
4043 keypath_enabled = true ;
@@ -54,6 +57,16 @@ class ProtocolOptionsSFTP : protected BaseDialog
5457 }
5558 }
5659
60+ subsystem_enabled = IsCheckedDialogControl (_i_use_custom_subsystem);
61+
62+ if (ok_enabled && subsystem_enabled) {
63+ std::string str;
64+ TextFromDialogControl (_i_privkey_path, str);
65+ if (str.empty ()) {
66+ ok_enabled = false ;
67+ }
68+ }
69+
5770 if (ok_enabled != _ok_enabled) {
5871 _ok_enabled = ok_enabled;
5972 SetEnabledDialogControl (_i_ok, ok_enabled);
@@ -63,6 +76,12 @@ class ProtocolOptionsSFTP : protected BaseDialog
6376 _keypath_enabled = keypath_enabled;
6477 SetEnabledDialogControl (_i_privkey_path, keypath_enabled);
6578 }
79+
80+ if (subsystem_enabled != _subsystem_enabled) {
81+ _subsystem_enabled= subsystem_enabled;
82+ SetEnabledDialogControl (_i_custom_subsystem, subsystem_enabled);
83+ }
84+
6685 }
6786
6887 LONG_PTR DlgProc (int msg, int param1, LONG_PTR param2)
@@ -74,8 +93,8 @@ class ProtocolOptionsSFTP : protected BaseDialog
7493#endif
7594
7695 if ( msg == DN_INITDIALOG
77- || (msg == DN_BTNCLICK && param1 == _i_privkey_enable)
78- || (msg == DN_EDITCHANGE && param1 == _i_privkey_path) ) {
96+ || (msg == DN_BTNCLICK && ( param1 == _i_privkey_enable || param1 == _i_use_custom_subsystem) )
97+ || (msg == DN_EDITCHANGE && ( param1 == _i_privkey_path || param1 == _i_custom_subsystem) ) ) {
7998 UpdateEnableds (msg == DN_BTNCLICK && param1 == _i_privkey_enable);
8099 }
81100
@@ -85,12 +104,19 @@ class ProtocolOptionsSFTP : protected BaseDialog
85104public:
86105 ProtocolOptionsSFTP ()
87106 {
88- _di.Add (DI_DOUBLEBOX, 3 ,1 ,64 ,10 , 0 , MSFTPOptionsTitle);
107+ _di.Add (DI_DOUBLEBOX, 3 ,1 ,64 ,12 , 0 , MSFTPOptionsTitle);
108+
89109 _di.SetLine (2 );
90110 _i_privkey_enable = _di.AddAtLine (DI_CHECKBOX, 5 ,62 , 0 , MSFTPPrivateKeyPath);
91111 _di.NextLine ();
92112 _i_privkey_path = _di.AddAtLine (DI_EDIT, 5 ,62 , 0 , " " );
93113
114+ _di.NextLine ();
115+ _i_use_custom_subsystem = _di.AddAtLine (DI_CHECKBOX, 5 ,62 , 0 , MSFTPCustomSubsystem);
116+ _di.NextLine ();
117+ _i_custom_subsystem = _di.AddAtLine (DI_EDIT, 5 ,62 , 0 , " " );
118+
119+
94120 _di.NextLine ();
95121 _di.AddAtLine (DI_TEXT, 5 ,50 , 0 , MSFTPMaxReadBlockSize);
96122 _i_max_read_block_size = _di.AddAtLine (DI_FIXEDIT, 51 ,60 , DIF_MASKEDIT, " 32768" , " 9999999999" );
@@ -129,7 +155,8 @@ class ProtocolOptionsSFTP : protected BaseDialog
129155 LongLongToDialogControl (_i_max_write_block_size, std::max ((int )512 , sc.GetInt (" MaxWriteBlock" , 32768 )));
130156 SetCheckedDialogControl (_i_tcp_nodelay, sc.GetInt (" TcpNoDelay" , 0 ) != 0 );
131157 SetCheckedDialogControl (_i_tcp_quickack, sc.GetInt (" TcpQuickAck" , 0 ) != 0 );
132-
158+ SetCheckedDialogControl (_i_use_custom_subsystem, sc.GetInt (" UseCustomSubsystem" , 0 ) != 0 );
159+ TextToDialogControl (_i_custom_subsystem, sc.GetString (" CustomSubsystem" ));
133160 // SetCheckedDialogControl(_i_enable_sandbox, sc.GetInt("Sandbox", 0) != 0);
134161 if (Show (L" ProtocolOptionsSFTP" , 6 , 2 ) == _i_ok) {
135162 sc.SetInt (" PrivKeyEnable" , IsCheckedDialogControl (_i_privkey_enable) ? 1 : 0 );
@@ -140,6 +167,10 @@ class ProtocolOptionsSFTP : protected BaseDialog
140167 sc.SetInt (" MaxWriteBlock" , std::max ((int )512 , (int )LongLongFromDialogControl (_i_max_write_block_size)));
141168 sc.SetInt (" TcpNoDelay" , IsCheckedDialogControl (_i_tcp_nodelay) ? 1 : 0 );
142169 sc.SetInt (" TcpQuickAck" , IsCheckedDialogControl (_i_tcp_quickack) ? 1 : 0 );
170+ sc.SetInt (" UseCustomSubsystem" , IsCheckedDialogControl (_i_use_custom_subsystem) ? 1 : 0 );
171+ TextFromDialogControl (_i_custom_subsystem, str);
172+ sc.SetString (" CustomSubsystem" , str);
173+
143174 // sc.SetInt("Sandbox", IsCheckedDialogControl(_i_enable_sandbox) ? 1 : 0);
144175 options = sc.Serialize ();
145176 }
0 commit comments