feat(session): default user override

resolves #447
This commit is contained in:
Jan De Dobbeleer 2021-02-24 09:04:04 +01:00 committed by Jan De Dobbeleer
parent 1a907f3c48
commit 58f1789415
3 changed files with 116 additions and 60 deletions

View file

@ -39,8 +39,13 @@ properties below. Only used when a value is set, making the above properties obs
## Template Properties ## Template Properties
- `.UserName`: `string` - the current user's name - `.UserName`: `string` - the current user's name
- `.DefaultUserName`: - the default user name (set with the `POSH_SESSION_DEFAULT_USER` env var or `default_user_name` property)
- `.ComputerName`: `string` - the current computer's name - `.ComputerName`: `string` - the current computer's name
- `.SSHSession`: `boolean` - active SSH session or not - `.SSHSession`: `boolean` - active SSH session or not
- `.Root`: `boolean` - are you a root/admin user or not - `.Root`: `boolean` - are you a root/admin user or not
## Environmnent Variables
- `POSH_SESSION_DEFAULT_USER` - used to override the hardcoded `default_user_name` property
[colors]: /docs/configure#colors [colors]: /docs/configure#colors

View file

@ -9,9 +9,11 @@ type session struct {
props *properties props *properties
env environmentInfo env environmentInfo
UserName string UserName string
DefaultUserName string
ComputerName string ComputerName string
SSHSession bool SSHSession bool
Root bool Root bool
templateText string
} }
const ( const (
@ -29,12 +31,26 @@ const (
SSHIcon Property = "ssh_icon" SSHIcon Property = "ssh_icon"
// DefaultUserName holds the default user of the platform // DefaultUserName holds the default user of the platform
DefaultUserName Property = "default_user_name" DefaultUserName Property = "default_user_name"
defaultUserEnvVar = "POSH_SESSION_DEFAULT_USER"
) )
func (s *session) enabled() bool { func (s *session) enabled() bool {
s.UserName = s.getUserName() s.UserName = s.getUserName()
s.ComputerName = s.getComputerName()
s.SSHSession = s.activeSSHSession()
s.DefaultUserName = s.getDefaultUser()
segmentTemplate := s.props.getString(SegmentTemplate, "")
if segmentTemplate != "" {
s.Root = s.env.isRunningAsRoot()
template := &textTemplate{
Template: segmentTemplate,
Context: s,
}
s.templateText = template.render()
return len(s.templateText) > 0
}
showDefaultUser := s.props.getBool(DisplayDefault, true) showDefaultUser := s.props.getBool(DisplayDefault, true)
defaultUser := s.props.getString(DefaultUserName, "")
if !showDefaultUser && defaultUser == s.UserName { if !showDefaultUser && defaultUser == s.UserName {
return false return false
} }
@ -51,16 +67,8 @@ func (s *session) init(props *properties, env environmentInfo) {
} }
func (s *session) getFormattedText() string { func (s *session) getFormattedText() string {
s.ComputerName = s.getComputerName() if len(s.templateText) > 0 {
s.SSHSession = s.activeSSHSession() return s.templateText
segmentTemplate := s.props.getString(SegmentTemplate, "")
if segmentTemplate != "" {
s.Root = s.env.isRunningAsRoot()
template := &textTemplate{
Template: segmentTemplate,
Context: s,
}
return template.render()
} }
separator := "" separator := ""
if s.props.getBool(DisplayHost, true) && s.props.getBool(DisplayUser, true) { if s.props.getBool(DisplayHost, true) && s.props.getBool(DisplayUser, true) {
@ -98,6 +106,14 @@ func (s *session) getUserName() string {
return username return username
} }
func (s *session) getDefaultUser() string {
user := s.env.getenv(defaultUserEnvVar)
if len(user) == 0 {
user = s.props.getString(DefaultUserName, "")
}
return user
}
func (s *session) activeSSHSession() bool { func (s *session) activeSSHSession() bool {
keys := []string{ keys := []string{
"SSH_CONNECTION", "SSH_CONNECTION",

View file

@ -14,6 +14,7 @@ type sessionArgs struct {
connection string connection string
client string client string
sshIcon string sshIcon string
defaultUserName string
} }
func setupSession(args *sessionArgs) session { func setupSession(args *sessionArgs) session {
@ -23,6 +24,7 @@ func setupSession(args *sessionArgs) session {
env.On("getRuntimeGOOS", nil).Return(args.goos) env.On("getRuntimeGOOS", nil).Return(args.goos)
env.On("getenv", "SSH_CONNECTION").Return(args.connection) env.On("getenv", "SSH_CONNECTION").Return(args.connection)
env.On("getenv", "SSH_CLIENT").Return(args.client) env.On("getenv", "SSH_CLIENT").Return(args.client)
env.On("getenv", defaultUserEnvVar).Return(args.defaultUserName)
props := &properties{ props := &properties{
values: map[Property]interface{}{ values: map[Property]interface{}{
UserInfoSeparator: args.userInfoSeparator, UserInfoSeparator: args.userInfoSeparator,
@ -155,8 +157,10 @@ func TestActiveSSHSessionActiveBoth(t *testing.T) {
func TestSessionSegmentTemplate(t *testing.T) { func TestSessionSegmentTemplate(t *testing.T) {
cases := []struct { cases := []struct {
Case string Case string
ExpectedEnabled bool
ExpectedString string ExpectedString string
UserName string UserName string
DefaultUserName string
ComputerName string ComputerName string
SSHSession bool SSHSession bool
Root bool Root bool
@ -168,12 +172,14 @@ func TestSessionSegmentTemplate(t *testing.T) {
ComputerName: "company-laptop", ComputerName: "company-laptop",
UserName: "john", UserName: "john",
Template: "{{.UserName}}{{if .ComputerName}}@{{.ComputerName}}{{end}}", Template: "{{.UserName}}{{if .ComputerName}}@{{.ComputerName}}{{end}}",
ExpectedEnabled: true,
}, },
{ {
Case: "user only", Case: "user only",
ExpectedString: "john", ExpectedString: "john",
UserName: "john", UserName: "john",
Template: "{{.UserName}}{{if .ComputerName}}@{{.ComputerName}}{{end}}", Template: "{{.UserName}}{{if .ComputerName}}@{{.ComputerName}}{{end}}",
ExpectedEnabled: true,
}, },
{ {
Case: "user with ssh", Case: "user with ssh",
@ -182,6 +188,7 @@ func TestSessionSegmentTemplate(t *testing.T) {
SSHSession: true, SSHSession: true,
ComputerName: "remote", ComputerName: "remote",
Template: "{{.UserName}}{{if .SSHSession}} on {{.ComputerName}}{{end}}", Template: "{{.UserName}}{{if .SSHSession}} on {{.ComputerName}}{{end}}",
ExpectedEnabled: true,
}, },
{ {
Case: "user without ssh", Case: "user without ssh",
@ -190,6 +197,7 @@ func TestSessionSegmentTemplate(t *testing.T) {
SSHSession: false, SSHSession: false,
ComputerName: "remote", ComputerName: "remote",
Template: "{{.UserName}}{{if .SSHSession}} on {{.ComputerName}}{{end}}", Template: "{{.UserName}}{{if .SSHSession}} on {{.ComputerName}}{{end}}",
ExpectedEnabled: true,
}, },
{ {
Case: "user with root and ssh", Case: "user with root and ssh",
@ -199,6 +207,7 @@ func TestSessionSegmentTemplate(t *testing.T) {
ComputerName: "remote", ComputerName: "remote",
Root: true, Root: true,
Template: "{{if .Root}}super {{end}}{{.UserName}}{{if .SSHSession}} on {{.ComputerName}}{{end}}", Template: "{{if .Root}}super {{end}}{{.UserName}}{{if .SSHSession}} on {{.ComputerName}}{{end}}",
ExpectedEnabled: true,
}, },
{ {
Case: "no template", Case: "no template",
@ -207,6 +216,29 @@ func TestSessionSegmentTemplate(t *testing.T) {
SSHSession: true, SSHSession: true,
ComputerName: "remote", ComputerName: "remote",
Root: true, Root: true,
ExpectedEnabled: true,
},
{
Case: "default user not equal",
ExpectedString: "john",
UserName: "john",
DefaultUserName: "jack",
SSHSession: true,
ComputerName: "remote",
Root: true,
Template: "{{if ne .DefaultUserName .UserName}}{{.UserName}}{{end}}",
ExpectedEnabled: true,
},
{
Case: "default user equal",
ExpectedString: "",
UserName: "john",
DefaultUserName: "john",
SSHSession: true,
ComputerName: "remote",
Root: true,
Template: "{{if ne .DefaultUserName .UserName}}{{.UserName}}{{end}}",
ExpectedEnabled: false,
}, },
} }
@ -222,6 +254,7 @@ func TestSessionSegmentTemplate(t *testing.T) {
env.On("getenv", "SSH_CONNECTION").Return(SSHSession) env.On("getenv", "SSH_CONNECTION").Return(SSHSession)
env.On("getenv", "SSH_CLIENT").Return(SSHSession) env.On("getenv", "SSH_CLIENT").Return(SSHSession)
env.On("isRunningAsRoot", nil).Return(tc.Root) env.On("isRunningAsRoot", nil).Return(tc.Root)
env.On("getenv", defaultUserEnvVar).Return(tc.DefaultUserName)
props := &properties{ props := &properties{
values: map[Property]interface{}{ values: map[Property]interface{}{
SegmentTemplate: tc.Template, SegmentTemplate: tc.Template,
@ -231,7 +264,9 @@ func TestSessionSegmentTemplate(t *testing.T) {
env: env, env: env,
props: props, props: props,
} }
_ = session.enabled() assert.Equal(t, tc.ExpectedEnabled, session.enabled(), tc.Case)
if tc.ExpectedEnabled {
assert.Equal(t, tc.ExpectedString, session.string(), tc.Case) assert.Equal(t, tc.ExpectedString, session.string(), tc.Case)
} }
}
} }