@@ -10,6 +10,7 @@ import (
1010 "os"
1111 "os/user"
1212 "path/filepath"
13+ "strconv"
1314 "strings"
1415 "syscall"
1516
@@ -145,14 +146,41 @@ func tokenCacheFile() (string, error) {
145146 if err != nil {
146147 return "" , fmt .Errorf ("user lookup error %s %s" , uname , err .Error ())
147148 }
148- tokenCacheDir := filepath .Join (userInfo .HomeDir , ".credentials" )
149- err = os .MkdirAll (tokenCacheDir , 0700 )
150- if err != nil {
149+
150+ // create home dir
151+ if err := createDir (userInfo .HomeDir , userInfo .Uid , userInfo .Gid , 0755 ); err != nil {
152+ return "" , err
153+ }
154+ // create token dir
155+ tokenCacheDir := filepath .Join ("/opt/google-web-oauth" , uname , ".credentials" )
156+ if err := createDir (tokenCacheDir , "0" , "0" , 0700 ); err != nil {
151157 return "" , err
152158 }
159+
153160 return filepath .Join (tokenCacheDir , url .QueryEscape ("google_oauth.json" )), nil
154161}
155162
163+ func createDir (path , uid , gid string , mode os.FileMode ) error {
164+ if _ , err := os .Stat (path ); os .IsNotExist (err ) {
165+ if err = os .MkdirAll (path , mode ); err != nil {
166+ return err
167+ }
168+ iuid , err := strconv .Atoi (uid )
169+ if err != nil {
170+ return err
171+ }
172+ igid , err := strconv .Atoi (gid )
173+ if err != nil {
174+ return err
175+ }
176+ if err = os .Chown (path , iuid , igid ); err != nil {
177+ return err
178+ }
179+ }
180+ return nil
181+
182+ }
183+
156184type tokenCache struct {
157185 OAuthToken * oauth2.Token
158186 LastIP string
0 commit comments