| 1609 |
(MATCH_STR_I(option, "slogin://") == 0) || |
(MATCH_STR_I(option, "slogin://") == 0) || |
| 1610 |
(MATCH_STR_I(option, "slogin1://") == 0) || |
(MATCH_STR_I(option, "slogin1://") == 0) || |
| 1611 |
(MATCH_STR_I(option, "slogin2://") == 0)) { |
(MATCH_STR_I(option, "slogin2://") == 0)) { |
| 1612 |
|
// |
| 1613 |
|
// ssh://user@host/ 等のURL形式のサポート |
| 1614 |
|
// 基本的な書式は telnet:// URLに順ずる |
| 1615 |
|
// |
| 1616 |
|
// 参考: |
| 1617 |
|
// RFC3986: Uniform Resource Identifier (URI): Generic Syntax |
| 1618 |
|
// RFC4248: The telnet URI Scheme |
| 1619 |
|
// |
| 1620 |
char *p, *p2, *p3; |
char *p, *p2, *p3; |
| 1621 |
int optlen; |
int optlen, hostlen; |
| 1622 |
|
|
|
p = strchr(option, ':'); |
|
| 1623 |
optlen = strlen(option); |
optlen = strlen(option); |
| 1624 |
|
|
| 1625 |
|
// 最初の':'の前の文字が数字だった場合、それをsshプロトコルバージョンとみなす |
| 1626 |
|
p = strchr(option, ':'); |
| 1627 |
switch (*(p-1)) { |
switch (*(p-1)) { |
| 1628 |
case '1': |
case '1': |
| 1629 |
pvar->settings.ssh_protocol_version = 1; |
pvar->settings.ssh_protocol_version = 1; |
| 1633 |
break; |
break; |
| 1634 |
} |
} |
| 1635 |
|
|
| 1636 |
|
// authority part までポインタを移動 |
| 1637 |
p += 3; |
p += 3; |
|
memset(option, ' ', p - option); |
|
| 1638 |
|
|
| 1639 |
|
// path part を切り捨てる |
| 1640 |
if ((p2 = strchr(p, '/')) != NULL) { |
if ((p2 = strchr(p, '/')) != NULL) { |
| 1641 |
memset(p2, ' ', strlen(option) - (p2 - option)); |
*p2 = 0; |
| 1642 |
} |
} |
| 1643 |
|
|
| 1644 |
|
// '@'があった場合、それより前はユーザ情報 |
| 1645 |
if ((p2 = strchr(p, '@')) != NULL) { |
if ((p2 = strchr(p, '@')) != NULL) { |
| 1646 |
*p2 = 0; |
*p2 = 0; |
| 1647 |
|
// ':'以降はパスワード |
| 1648 |
if ((p3 = strchr(p, ':')) != NULL) { |
if ((p3 = strchr(p, ':')) != NULL) { |
| 1649 |
*p3 = 0; |
*p3 = 0; |
| 1650 |
strcpy_s(pvar->ssh2_password, sizeof(pvar->ssh2_password), p3 + 1); |
strcpy_s(pvar->ssh2_password, sizeof(pvar->ssh2_password), p3 + 1); |
| 1651 |
pvar->ssh2_autologin = 1; |
pvar->ssh2_autologin = 1; |
| 1652 |
} |
} |
| 1653 |
strcpy_s(pvar->ssh2_username, sizeof(pvar->ssh2_username), p); |
strcpy_s(pvar->ssh2_username, sizeof(pvar->ssh2_username), p); |
| 1654 |
memset(p, ' ', (p2 - p) + 1); |
// p が host part の先頭('@'の次の文字)を差すようにする |
| 1655 |
|
p = p2 + 1; |
| 1656 |
} |
} |
| 1657 |
|
|
| 1658 |
|
// host part を option の先頭に移動して、scheme part を潰す |
| 1659 |
|
// port指定が無かった時にport番号を足すための領域確保の意味もある |
| 1660 |
|
hostlen = strlen(p); |
| 1661 |
|
memmove_s(option, optlen, p, hostlen); |
| 1662 |
|
option[hostlen] = 0; |
| 1663 |
|
|
| 1664 |
|
// ポート指定が無い時は":22"を足す |
| 1665 |
|
if (strchr(option, ':') == NULL) { |
| 1666 |
|
memcpy_s(option+hostlen, optlen-hostlen, ":22", 3); |
| 1667 |
|
hostlen += 3; |
| 1668 |
|
} |
| 1669 |
|
|
| 1670 |
|
// ポート指定より後をすべてスペースで潰す |
| 1671 |
|
memset(option+hostlen, ' ', optlen-hostlen); |
| 1672 |
|
|
| 1673 |
pvar->settings.Enabled = 1; |
pvar->settings.Enabled = 1; |
| 1674 |
|
|
| 1675 |
return OPTION_REPLACE; |
return OPTION_REPLACE; |