| 40 |
{ |
{ |
| 41 |
(void)userdata; |
(void)userdata; |
| 42 |
|
|
| 43 |
log_common("Authenticating user %s pwd %s\n", user, password); |
log_common("Authenticating user %s pwd %s", user, password); |
| 44 |
if (strcmp(user, USER) == 0 && strcmp(password, PASSWORD) == 0) |
if (strcmp(user, USER) == 0 && strcmp(password, PASSWORD) == 0) |
| 45 |
{ |
{ |
| 46 |
authenticated = 1; |
authenticated = 1; |
| 47 |
log_common("Authenticated\n"); |
log_common("Authenticated"); |
| 48 |
return SSH_AUTH_SUCCESS; |
return SSH_AUTH_SUCCESS; |
| 49 |
} |
} |
| 50 |
if (tries >= 3) |
if (tries >= 3) |
| 51 |
{ |
{ |
| 52 |
log_error("Too many authentication tries\n"); |
log_error("Too many authentication tries"); |
| 53 |
ssh_disconnect(session); |
ssh_disconnect(session); |
| 54 |
error = 1; |
error = 1; |
| 55 |
return SSH_AUTH_DENIED; |
return SSH_AUTH_DENIED; |
| 69 |
(void)px; |
(void)px; |
| 70 |
(void)py; |
(void)py; |
| 71 |
(void)userdata; |
(void)userdata; |
| 72 |
log_common("Allocated terminal\n"); |
log_common("Allocated terminal"); |
| 73 |
return 0; |
return 0; |
| 74 |
} |
} |
| 75 |
|
|
| 78 |
(void)session; |
(void)session; |
| 79 |
(void)channel; |
(void)channel; |
| 80 |
(void)userdata; |
(void)userdata; |
| 81 |
log_common("Allocated shell\n"); |
log_common("Allocated shell"); |
| 82 |
return 0; |
return 0; |
| 83 |
} |
} |
| 84 |
|
|
| 94 |
if (SSH_channel != NULL) |
if (SSH_channel != NULL) |
| 95 |
return NULL; |
return NULL; |
| 96 |
|
|
| 97 |
log_common("Allocated session channel\n"); |
log_common("Allocated session channel"); |
| 98 |
SSH_channel = ssh_channel_new(session); |
SSH_channel = ssh_channel_new(session); |
| 99 |
ssh_callbacks_init(&channel_cb); |
ssh_callbacks_init(&channel_cb); |
| 100 |
ssh_set_channel_callbacks(SSH_channel, &channel_cb); |
ssh_set_channel_callbacks(SSH_channel, &channel_cb); |
| 128 |
|
|
| 129 |
if (ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_HOSTKEY, SSH_HOST_RSA_KEY_FILE) < 0) |
if (ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_HOSTKEY, SSH_HOST_RSA_KEY_FILE) < 0) |
| 130 |
{ |
{ |
| 131 |
log_error("Error loading SSH RSA key: %s\n", SSH_HOST_RSA_KEY_FILE); |
log_error("Error loading SSH RSA key: %s", SSH_HOST_RSA_KEY_FILE); |
| 132 |
} |
} |
| 133 |
else |
else |
| 134 |
{ |
{ |
| 136 |
} |
} |
| 137 |
if (ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_HOSTKEY, SSH_HOST_ED25519_KEY_FILE) < 0) |
if (ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_HOSTKEY, SSH_HOST_ED25519_KEY_FILE) < 0) |
| 138 |
{ |
{ |
| 139 |
log_error("Error loading SSH ED25519 key: %s\n", SSH_HOST_ED25519_KEY_FILE); |
log_error("Error loading SSH ED25519 key: %s", SSH_HOST_ED25519_KEY_FILE); |
| 140 |
} |
} |
| 141 |
else |
else |
| 142 |
{ |
{ |
| 144 |
} |
} |
| 145 |
if (ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_HOSTKEY, SSH_HOST_ECDSA_KEY_FILE) < 0) |
if (ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_HOSTKEY, SSH_HOST_ECDSA_KEY_FILE) < 0) |
| 146 |
{ |
{ |
| 147 |
log_error("Error loading SSH ECDSA key: %s\n", SSH_HOST_ECDSA_KEY_FILE); |
log_error("Error loading SSH ECDSA key: %s", SSH_HOST_ECDSA_KEY_FILE); |
| 148 |
} |
} |
| 149 |
else |
else |
| 150 |
{ |
{ |
| 153 |
|
|
| 154 |
if (!ssh_key_valid) |
if (!ssh_key_valid) |
| 155 |
{ |
{ |
| 156 |
log_error("Error: no valid SSH host key\n"); |
log_error("Error: no valid SSH host key"); |
| 157 |
ssh_bind_free(sshbind); |
ssh_bind_free(sshbind); |
| 158 |
return -1; |
return -1; |
| 159 |
} |
} |
| 163 |
ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_HOSTKEY_ALGORITHMS, "+ssh-ed25519,ecdsa-sha2-nistp256,ssh-rsa") < 0 || |
ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_HOSTKEY_ALGORITHMS, "+ssh-ed25519,ecdsa-sha2-nistp256,ssh-rsa") < 0 || |
| 164 |
ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_LOG_VERBOSITY, &ssh_log_level) < 0) |
ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_LOG_VERBOSITY, &ssh_log_level) < 0) |
| 165 |
{ |
{ |
| 166 |
log_error("Error setting SSH bind options: %s\n", ssh_get_error(sshbind)); |
log_error("Error setting SSH bind options: %s", ssh_get_error(sshbind)); |
| 167 |
ssh_bind_free(sshbind); |
ssh_bind_free(sshbind); |
| 168 |
return -1; |
return -1; |
| 169 |
} |
} |
| 170 |
|
|
| 171 |
if (ssh_bind_listen(sshbind) < 0) |
if (ssh_bind_listen(sshbind) < 0) |
| 172 |
{ |
{ |
| 173 |
log_error("Error listening at SSH server port: %s\n", ssh_get_error(sshbind)); |
log_error("Error listening at SSH server port: %s", ssh_get_error(sshbind)); |
| 174 |
ssh_bind_free(sshbind); |
ssh_bind_free(sshbind); |
| 175 |
return -1; |
return -1; |
| 176 |
} |
} |
| 193 |
ssh_timeout = 60; // second |
ssh_timeout = 60; // second |
| 194 |
if (ssh_options_set(session, SSH_OPTIONS_TIMEOUT, &ssh_timeout) < 0) |
if (ssh_options_set(session, SSH_OPTIONS_TIMEOUT, &ssh_timeout) < 0) |
| 195 |
{ |
{ |
| 196 |
log_error("Error setting SSH options: %s\n", ssh_get_error(session)); |
log_error("Error setting SSH options: %s", ssh_get_error(session)); |
| 197 |
ssh_disconnect(session); |
ssh_disconnect(session); |
| 198 |
_exit(1); |
_exit(1); |
| 199 |
} |
} |
| 200 |
|
|
| 201 |
if (ssh_handle_key_exchange(session)) |
if (ssh_handle_key_exchange(session)) |
| 202 |
{ |
{ |
| 203 |
log_error("ssh_handle_key_exchange: %s\n", ssh_get_error(session)); |
log_error("ssh_handle_key_exchange: %s", ssh_get_error(session)); |
| 204 |
ssh_disconnect(session); |
ssh_disconnect(session); |
| 205 |
_exit(1); |
_exit(1); |
| 206 |
} |
} |
| 216 |
r = ssh_event_dopoll(event, -1); |
r = ssh_event_dopoll(event, -1); |
| 217 |
if (r == SSH_ERROR) |
if (r == SSH_ERROR) |
| 218 |
{ |
{ |
| 219 |
log_error("Error : %s\n", ssh_get_error(session)); |
log_error("Error : %s", ssh_get_error(session)); |
| 220 |
ssh_disconnect(session); |
ssh_disconnect(session); |
| 221 |
_exit(1); |
_exit(1); |
| 222 |
} |
} |
| 224 |
|
|
| 225 |
if (error) |
if (error) |
| 226 |
{ |
{ |
| 227 |
log_error("Error, exiting loop\n"); |
log_error("Error, exiting loop"); |
| 228 |
_exit(1); |
_exit(1); |
| 229 |
} |
} |
| 230 |
else |
else |
| 231 |
{ |
{ |
| 232 |
log_common("Authenticated and got a channel\n"); |
log_common("Authenticated and got a channel"); |
| 233 |
} |
} |
| 234 |
|
|
| 235 |
ssh_timeout = 0; |
ssh_timeout = 0; |
| 236 |
if (ssh_options_set(session, SSH_OPTIONS_TIMEOUT, &ssh_timeout) < 0) |
if (ssh_options_set(session, SSH_OPTIONS_TIMEOUT, &ssh_timeout) < 0) |
| 237 |
{ |
{ |
| 238 |
log_error("Error setting SSH options: %s\n", ssh_get_error(session)); |
log_error("Error setting SSH options: %s", ssh_get_error(session)); |
| 239 |
ssh_disconnect(session); |
ssh_disconnect(session); |
| 240 |
_exit(1); |
_exit(1); |
| 241 |
} |
} |
| 242 |
|
|
| 243 |
snprintf(buf, sizeof(buf), "Hello, welcome to the Sample SSH proxy.\r\nPlease select your destination: "); |
snprintf(buf, sizeof(buf), "Hello, welcome to the Sample SSH proxy.\nPlease select your destination: "); |
| 244 |
ssh_channel_write(SSH_channel, buf, (uint32_t)strlen(buf)); |
ssh_channel_write(SSH_channel, buf, (uint32_t)strlen(buf)); |
| 245 |
do |
do |
| 246 |
{ |
{ |
| 261 |
} |
} |
| 262 |
else |
else |
| 263 |
{ |
{ |
| 264 |
log_error("Error: %s\n", ssh_get_error(session)); |
log_error("Error: %s", ssh_get_error(session)); |
| 265 |
_exit(1); |
_exit(1); |
| 266 |
} |
} |
| 267 |
} while (i > 0); |
} while (i > 0); |
| 268 |
snprintf(buf, sizeof(buf), "Trying to connect to \"%s\"\r\n", host); |
snprintf(buf, sizeof(buf), "Trying to connect to \"%s\"\n", host); |
| 269 |
ssh_channel_write(SSH_channel, buf, (uint32_t)strlen(buf)); |
ssh_channel_write(SSH_channel, buf, (uint32_t)strlen(buf)); |
| 270 |
log_common("%s", buf); |
log_common("%s", buf); |
| 271 |
|
|
| 274 |
|
|
| 275 |
_exit(0); |
_exit(0); |
| 276 |
case -1: |
case -1: |
| 277 |
log_error("Failed to fork\n"); |
log_error("Failed to fork"); |
| 278 |
break; |
break; |
| 279 |
} |
} |
| 280 |
} |
} |
| 281 |
else |
else |
| 282 |
{ |
{ |
| 283 |
log_error("%s\n", ssh_get_error(sshbind)); |
log_error("%s", ssh_get_error(sshbind)); |
| 284 |
} |
} |
| 285 |
|
|
| 286 |
/* Since the session has been passed to a child fork, do some cleaning |
/* Since the session has been passed to a child fork, do some cleaning |