-
-
Notifications
You must be signed in to change notification settings - Fork 477
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Feature(socks5): support abstract namespace unix sock #436
base: main
Are you sure you want to change the base?
Feature(socks5): support abstract namespace unix sock #436
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for bringing the abstract namespace unix sock feature to the socks5 module!
It overall looks good to me. Just a small question.
@@ -26,14 +26,21 @@ type Socks5 struct { | |||
} | |||
|
|||
func NewSocks5(addr, user, pass string) (*Socks5, error) { | |||
unix := len(addr) > 0 && addr[0] == '/' |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
unix := len(addr) > 0 && addr[0] == '/' | |
unix := len(addr) > 0 && (addr[0] == '/' || addr[0] == '@' || addr[0] == 0x00) |
Just wondering why not ^?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You pass the url.path from url instance when url.host is empty. If we use the format like socks5:///@test, the address passed to NewSocks will be /@test, which requires additional processing logic. and for len(address)>2, it is only for a more safe in case the out of index error. The approach here checks if the first char after / is @ or null(0x00), and remove the leading /, since it will cause error.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
And the reason we can’t avoid using socks5:/// is the string before @ will be parsed as username/password whenever is has valid user:pass or not. The @ char will be omitted by parser.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh I see. that makes sense. But I think such hack adjustment might be better to add here in the parseSocks5
function:
Lines 123 to 132 in ec85410
func parseSocks5(u *url.URL) (proxy.Proxy, error) { | |
address, username := u.Host, u.User.Username() | |
password, _ := u.User.Password() | |
// Socks5 over UDS | |
if address == "" { | |
address = u.Path | |
} | |
return proxy.NewSocks5(address, username, password) | |
} |
And NewSocks5
func should keep its straightforwardness. what do you think?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It makes sense, in this case, the unix check logic may also move to parser function as well. And I will need to make a new arg for unix flag for NewSocks5 , else it will need redundant code to test if the address is unix or not.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, it sounds good
In golang, we can add
@
or use0x0
as prefix to the unix addr for using Linux abstract namespace.But the current unix processing logic can't not parse it, it only supports the filesystem socket type.
This PR should fix this.