add fallback user for working dir

This commit is contained in:
Boshi Lian 2018-12-27 01:08:38 +00:00
parent ff020f14ff
commit 2086ca4652
3 changed files with 28 additions and 2 deletions

View file

@ -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"`
}{}
)

View file

@ -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
}

View file

@ -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 {