@@ -273,7 +273,7 @@ func Serve(opts *ServeConfig) {
273273 }
274274
275275 // Register a listener so we can accept a connection
276- listener , err := serverListener (os . Getenv ( EnvUnixSocketDir ))
276+ listener , err := serverListener (unixSocketConfigFromEnv ( ))
277277 if err != nil {
278278 logger .Error ("plugin init error" , "error" , err )
279279 return
@@ -496,12 +496,12 @@ func Serve(opts *ServeConfig) {
496496 }
497497}
498498
499- func serverListener (dir string ) (net.Listener , error ) {
499+ func serverListener (unixSocketCfg UnixSocketConfig ) (net.Listener , error ) {
500500 if runtime .GOOS == "windows" {
501501 return serverListener_tcp ()
502502 }
503503
504- return serverListener_unix (dir )
504+ return serverListener_unix (unixSocketCfg )
505505}
506506
507507func serverListener_tcp () (net.Listener , error ) {
@@ -546,8 +546,8 @@ func serverListener_tcp() (net.Listener, error) {
546546 return nil , errors .New ("Couldn't bind plugin TCP listener" )
547547}
548548
549- func serverListener_unix (dir string ) (net.Listener , error ) {
550- tf , err := os .CreateTemp (dir , "plugin" )
549+ func serverListener_unix (unixSocketCfg UnixSocketConfig ) (net.Listener , error ) {
550+ tf , err := os .CreateTemp (unixSocketCfg . directory , "plugin" )
551551 if err != nil {
552552 return nil , err
553553 }
@@ -569,25 +569,8 @@ func serverListener_unix(dir string) (net.Listener, error) {
569569
570570 // By default, unix sockets are only writable by the owner. Set up a custom
571571 // group owner and group write permissions if configured.
572- if groupString := os .Getenv (EnvUnixSocketGroup ); groupString != "" {
573- groupID , err := strconv .Atoi (groupString )
574- if err != nil {
575- group , err := user .LookupGroup (groupString )
576- if err != nil {
577- return nil , fmt .Errorf ("failed to find group ID from %s=%s environment variable: %w" , EnvUnixSocketGroup , groupString , err )
578- }
579- groupID , err = strconv .Atoi (group .Gid )
580- if err != nil {
581- return nil , fmt .Errorf ("failed to parse %q group's Gid as an integer: %w" , groupString , err )
582- }
583- }
584-
585- err = os .Chown (path , - 1 , groupID )
586- if err != nil {
587- return nil , err
588- }
589-
590- err = os .Chmod (path , 0o660 )
572+ if unixSocketCfg .Group != "" {
573+ err = setGroupWritable (path , unixSocketCfg .Group , 0o660 )
591574 if err != nil {
592575 return nil , err
593576 }
@@ -601,6 +584,32 @@ func serverListener_unix(dir string) (net.Listener, error) {
601584 }, nil
602585}
603586
587+ func setGroupWritable (path , groupString string , mode os.FileMode ) error {
588+ groupID , err := strconv .Atoi (groupString )
589+ if err != nil {
590+ group , err := user .LookupGroup (groupString )
591+ if err != nil {
592+ return fmt .Errorf ("failed to find gid from %q: %w" , groupString , err )
593+ }
594+ groupID , err = strconv .Atoi (group .Gid )
595+ if err != nil {
596+ return fmt .Errorf ("failed to parse %q group's gid as an integer: %w" , groupString , err )
597+ }
598+ }
599+
600+ err = os .Chown (path , - 1 , groupID )
601+ if err != nil {
602+ return err
603+ }
604+
605+ err = os .Chmod (path , mode )
606+ if err != nil {
607+ return err
608+ }
609+
610+ return nil
611+ }
612+
604613// rmListener is an implementation of net.Listener that forwards most
605614// calls to the listener but also removes a file as part of the close. We
606615// use this to cleanup the unix domain socket on close.
0 commit comments