From 2086ca4652999724e0f5e1281c8ae9a67ccbb6b5 Mon Sep 17 00:00:00 2001 From: Boshi Lian Date: Thu, 27 Dec 2018 01:08:38 +0000 Subject: [PATCH] add fallback user for working dir --- sshpiperd/upstream/workingdir/config.go | 1 + sshpiperd/upstream/workingdir/workingdir.go | 12 ++++++++++-- .../upstream/workingdir/workingdir_test.go | 17 +++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/sshpiperd/upstream/workingdir/config.go b/sshpiperd/upstream/workingdir/config.go index 0aa9bc8e..a8a7fe98 100644 --- a/sshpiperd/upstream/workingdir/config.go +++ b/sshpiperd/upstream/workingdir/config.go @@ -5,5 +5,6 @@ var ( WorkingDir string `long:"workingdir" default:"/var/sshpiper" description:"Path to workingdir" env:"SSHPIPERD_WORKINGDIR" ini-name:"workingdir"` AllowBadUsername bool `long:"workingdir-allowbadusername" description:"Disable username check while search the working dir" env:"SSHPIPERD_WORKINGDIR_ALLOWBADUSERNAME" ini-name:"workingdir-allowbadusername"` NoCheckPerm bool `long:"workingdir-nocheckperm" description:"Disable 0400 checking when using files in the working dir" env:"SSHPIPERD_WORKINGDIR_NOCHECKPERM" ini-name:"workingdir-nocheckperm"` + FallbackUSername string `long:"workingdir-fallbackusername" description:"Fallback to a user when user does not exists in directory" env:"SSHPIPERD_WORKINGDIR_FALLBACKUSERNAME" ini-name:"workingdir-fallbackusername"` }{} ) diff --git a/sshpiperd/upstream/workingdir/workingdir.go b/sshpiperd/upstream/workingdir/workingdir.go index accf7c4d..f251d64f 100644 --- a/sshpiperd/upstream/workingdir/workingdir.go +++ b/sshpiperd/upstream/workingdir/workingdir.go @@ -130,7 +130,11 @@ func findUpstreamFromUserfile(conn ssh.ConnMetadata) (net.Conn, *ssh.AuthPipe, e } err := userUpstreamFile.checkPerm(user) - if err != nil { + + if os.IsNotExist(err) && len(config.FallbackUSername) > 0 { + err = nil + user = config.FallbackUSername + } else if err != nil { return nil, nil, err } @@ -184,7 +188,11 @@ func mapPublicKeyFromUserfile(conn ssh.ConnMetadata, key ssh.PublicKey) (signer }() err = userAuthorizedKeysFile.checkPerm(user) - if err != nil { + + if os.IsNotExist(err) && len(config.FallbackUSername) > 0 { + err = nil + user = config.FallbackUSername + } else if err != nil { return nil, err } diff --git a/sshpiperd/upstream/workingdir/workingdir_test.go b/sshpiperd/upstream/workingdir/workingdir_test.go index e869f279..804d5087 100644 --- a/sshpiperd/upstream/workingdir/workingdir_test.go +++ b/sshpiperd/upstream/workingdir/workingdir_test.go @@ -243,10 +243,19 @@ func TestFindUpstreamFromUserfile(t *testing.T) { } t.Logf("testing user not found") + config.FallbackUSername = "" _, _, err = findUpstreamFromUserfile(stubConnMetadata{"nosuchuser"}) if err == nil { t.Fatalf("should return err when finding nosuchuser") } + + t.Logf("testing user not found fallback") + config.FallbackUSername = user + _, _, err = findUpstreamFromUserfile(stubConnMetadata{"nosuchuser"}) + + if err != nil { + t.Fatalf("should return fallbackuser") + } } func TestMapPublicKeyFromUserfile(t *testing.T) { @@ -296,11 +305,19 @@ func TestMapPublicKeyFromUserfile(t *testing.T) { } t.Logf("testing user not found") + config.FallbackUSername = "" _, err = mapPublicKeyFromUserfile(stubConnMetadata{"nosuchuser"}, publicKey) if err == nil { t.Fatalf("should return err when mapping from nosuchuser") } + t.Logf("testing user not found fallback") + config.FallbackUSername = user + _, err = mapPublicKeyFromUserfile(stubConnMetadata{"nosuchuser"}, publicKey) + if err != nil { + t.Fatalf("should return fallbackuser") + } + t.Logf("testing mapping signer") signer, err := mapPublicKeyFromUserfile(stubConnMetadata{user}, privateKey.PublicKey()) if err != nil {