summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/gliderlabs/ssh/agent.go
diff options
context:
space:
mode:
authortechknowlogick <techknowlogick@gitea.io>2019-07-06 21:28:09 -0400
committerGitHub <noreply@github.com>2019-07-06 21:28:09 -0400
commitd0ec940dd7b79876c91288be54e8fd62eb42fe54 (patch)
treefb378674d89e02aeca8de4b399c32ffc31f81a93 /vendor/github.com/gliderlabs/ssh/agent.go
parentc44f0b1c760855f578d2e5ce6fafbf9cba97da4f (diff)
downloadgitea-d0ec940dd7b79876c91288be54e8fd62eb42fe54.tar.gz
gitea-d0ec940dd7b79876c91288be54e8fd62eb42fe54.zip
switch to use gliderlabs/ssh for builtin server (#7250)
resolves git conflicts from #3896 (credit to @belak, in case github doesn't keep original author during squash) Co-Authored-By: Matti Ranta <techknowlogick@gitea.io>
Diffstat (limited to 'vendor/github.com/gliderlabs/ssh/agent.go')
-rw-r--r--vendor/github.com/gliderlabs/ssh/agent.go83
1 files changed, 83 insertions, 0 deletions
diff --git a/vendor/github.com/gliderlabs/ssh/agent.go b/vendor/github.com/gliderlabs/ssh/agent.go
new file mode 100644
index 0000000000..d8dcb9a0a4
--- /dev/null
+++ b/vendor/github.com/gliderlabs/ssh/agent.go
@@ -0,0 +1,83 @@
+package ssh
+
+import (
+ "io"
+ "io/ioutil"
+ "net"
+ "path"
+ "sync"
+
+ gossh "golang.org/x/crypto/ssh"
+)
+
+const (
+ agentRequestType = "auth-agent-req@openssh.com"
+ agentChannelType = "auth-agent@openssh.com"
+
+ agentTempDir = "auth-agent"
+ agentListenFile = "listener.sock"
+)
+
+// contextKeyAgentRequest is an internal context key for storing if the
+// client requested agent forwarding
+var contextKeyAgentRequest = &contextKey{"auth-agent-req"}
+
+// SetAgentRequested sets up the session context so that AgentRequested
+// returns true.
+func SetAgentRequested(ctx Context) {
+ ctx.SetValue(contextKeyAgentRequest, true)
+}
+
+// AgentRequested returns true if the client requested agent forwarding.
+func AgentRequested(sess Session) bool {
+ return sess.Context().Value(contextKeyAgentRequest) == true
+}
+
+// NewAgentListener sets up a temporary Unix socket that can be communicated
+// to the session environment and used for forwarding connections.
+func NewAgentListener() (net.Listener, error) {
+ dir, err := ioutil.TempDir("", agentTempDir)
+ if err != nil {
+ return nil, err
+ }
+ l, err := net.Listen("unix", path.Join(dir, agentListenFile))
+ if err != nil {
+ return nil, err
+ }
+ return l, nil
+}
+
+// ForwardAgentConnections takes connections from a listener to proxy into the
+// session on the OpenSSH channel for agent connections. It blocks and services
+// connections until the listener stop accepting.
+func ForwardAgentConnections(l net.Listener, s Session) {
+ sshConn := s.Context().Value(ContextKeyConn).(gossh.Conn)
+ for {
+ conn, err := l.Accept()
+ if err != nil {
+ return
+ }
+ go func(conn net.Conn) {
+ defer conn.Close()
+ channel, reqs, err := sshConn.OpenChannel(agentChannelType, nil)
+ if err != nil {
+ return
+ }
+ defer channel.Close()
+ go gossh.DiscardRequests(reqs)
+ var wg sync.WaitGroup
+ wg.Add(2)
+ go func() {
+ io.Copy(conn, channel)
+ conn.(*net.UnixConn).CloseWrite()
+ wg.Done()
+ }()
+ go func() {
+ io.Copy(channel, conn)
+ channel.CloseWrite()
+ wg.Done()
+ }()
+ wg.Wait()
+ }(conn)
+ }
+}