aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drive/import.go2
-rw-r--r--drive/mkdir.go5
-rw-r--r--drive/share.go95
-rw-r--r--drive/update.go1
-rw-r--r--drive/upload.go31
-rw-r--r--gdrive.go48
-rw-r--r--handlers_drive.go23
7 files changed, 135 insertions, 70 deletions
diff --git a/drive/import.go b/drive/import.go
index 258f828..a3d8b3b 100644
--- a/drive/import.go
+++ b/drive/import.go
@@ -13,7 +13,6 @@ type ImportArgs struct {
Out io.Writer
Progress io.Writer
Path string
- Share bool
Parents []string
}
@@ -39,7 +38,6 @@ func (self *Drive) Import(args ImportArgs) error {
Path: args.Path,
Parents: args.Parents,
Mime: toMimes[0],
- Share: args.Share,
})
if err != nil {
return err
diff --git a/drive/mkdir.go b/drive/mkdir.go
index ad358a4..f6f0641 100644
--- a/drive/mkdir.go
+++ b/drive/mkdir.go
@@ -12,7 +12,6 @@ type MkdirArgs struct {
Out io.Writer
Name string
Parents []string
- Share bool
}
func (self *Drive) Mkdir(args MkdirArgs) error {
@@ -36,9 +35,5 @@ func (self *Drive) mkdir(args MkdirArgs) (*drive.File, error) {
return nil, fmt.Errorf("Failed to create directory: %s", err)
}
- //if args.Share {
- // self.share(TODO)
- //}
-
return f, nil
}
diff --git a/drive/share.go b/drive/share.go
index 43655df..291512a 100644
--- a/drive/share.go
+++ b/drive/share.go
@@ -3,6 +3,7 @@ package drive
import (
"io"
"fmt"
+ "text/tabwriter"
"google.golang.org/api/drive/v3"
)
@@ -13,17 +14,9 @@ type ShareArgs struct {
Type string
Email string
Discoverable bool
- Revoke bool
}
-func (self *Drive) Share(args ShareArgs) (err error) {
- if args.Revoke {
- err = self.deletePermissions(args)
- if err != nil {
- return fmt.Errorf("Failed delete permissions: %s", err)
- }
- }
-
+func (self *Drive) Share(args ShareArgs) error {
permission := &drive.Permission{
AllowFileDiscovery: args.Discoverable,
Role: args.Role,
@@ -31,32 +24,86 @@ func (self *Drive) Share(args ShareArgs) (err error) {
EmailAddress: args.Email,
}
- p, err := self.service.Permissions.Create(args.FileId, permission).Do()
+ _, err := self.service.Permissions.Create(args.FileId, permission).Do()
+ if err != nil {
+ return fmt.Errorf("Failed to share file: %s", err)
+ }
+
+ fmt.Fprintf(args.Out, "Granted %s permission to %s\n", args.Role, args.Type)
+ return nil
+}
+
+type RevokePermissionArgs struct {
+ Out io.Writer
+ FileId string
+ PermissionId string
+}
+
+func (self *Drive) RevokePermission(args RevokePermissionArgs) error {
+ err := self.service.Permissions.Delete(args.FileId, args.PermissionId).Do()
if err != nil {
- return fmt.Errorf("Failed share file: %s", err)
+ fmt.Errorf("Failed to revoke permission: %s", err)
+ return err
}
- fmt.Fprintln(args.Out, p)
- return
+ fmt.Fprintf(args.Out, "Permission revoked\n")
+ return nil
+}
+
+type ListPermissionsArgs struct {
+ Out io.Writer
+ FileId string
}
-func (self *Drive) deletePermissions(args ShareArgs) error {
- permList, err := self.service.Permissions.List(args.FileId).Do()
+func (self *Drive) ListPermissions(args ListPermissionsArgs) error {
+ permList, err := self.service.Permissions.List(args.FileId).Fields("permissions(id,role,type,domain,emailAddress,allowFileDiscovery)").Do()
if err != nil {
+ fmt.Errorf("Failed to list permissions: %s", err)
return err
}
- for _, p := range permList.Permissions {
- // Skip owner permissions
- if p.Role == "owner" {
- continue
- }
+ printPermissions(printPermissionsArgs{
+ out: args.Out,
+ permissions: permList.Permissions,
+ })
+ return nil
+}
+
+func (self *Drive) shareAnyoneReader(fileId string) error {
+ permission := &drive.Permission{
+ Role: "reader",
+ Type: "anyone",
+ }
- err := self.service.Permissions.Delete(args.FileId, p.Id).Do()
- if err != nil {
- return err
- }
+ _, err := self.service.Permissions.Create(fileId, permission).Do()
+ if err != nil {
+ return fmt.Errorf("Failed to share file: %s", err)
}
return nil
}
+
+type printPermissionsArgs struct {
+ out io.Writer
+ permissions []*drive.Permission
+}
+
+func printPermissions(args printPermissionsArgs) {
+ w := new(tabwriter.Writer)
+ w.Init(args.out, 0, 0, 3, ' ', 0)
+
+ fmt.Fprintln(w, "Id\tType\tRole\tEmail\tDomain\tDiscoverable")
+
+ for _, p := range args.permissions {
+ fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s\t%s\n",
+ p.Id,
+ p.Type,
+ p.Role,
+ p.EmailAddress,
+ p.Domain,
+ formatBool(p.AllowFileDiscovery),
+ )
+ }
+
+ w.Flush()
+}
diff --git a/drive/update.go b/drive/update.go
index bd9fb4c..c4ee341 100644
--- a/drive/update.go
+++ b/drive/update.go
@@ -19,7 +19,6 @@ type UpdateArgs struct {
Parents []string
Mime string
Recursive bool
- Share bool
ChunkSize int64
}
diff --git a/drive/upload.go b/drive/upload.go
index 4f237ca..898e3cd 100644
--- a/drive/upload.go
+++ b/drive/upload.go
@@ -43,7 +43,16 @@ func (self *Drive) Upload(args UploadArgs) error {
f, rate, err := self.uploadFile(args)
fmt.Fprintf(args.Out, "Uploaded %s at %s/s, total %s\n", f.Id, formatSize(rate, false), formatSize(f.Size, false))
- return err
+
+ if args.Share {
+ err = self.shareAnyoneReader(f.Id)
+ if err != nil {
+ return err
+ }
+
+ fmt.Fprintf(args.Out, "File is readable by anyone at %s\n", f.WebContentLink)
+ }
+ return nil
}
func (self *Drive) uploadRecursive(args UploadArgs) error {
@@ -76,7 +85,6 @@ func (self *Drive) uploadDirectory(args UploadArgs) error {
Out: args.Out,
Name: srcFileInfo.Name(),
Parents: args.Parents,
- Share: args.Share,
})
if err != nil {
return err
@@ -142,7 +150,7 @@ func (self *Drive) uploadFile(args UploadArgs) (*drive.File, int64, error) {
fmt.Fprintf(args.Out, "Uploading %s\n", args.Path)
started := time.Now()
- f, err := self.service.Files.Create(dstFile).Fields("id", "name", "size", "md5Checksum").Media(srcReader, chunkSize).Do()
+ f, err := self.service.Files.Create(dstFile).Fields("id", "name", "size", "md5Checksum", "webContentLink").Media(srcReader, chunkSize).Do()
if err != nil {
return nil, 0, fmt.Errorf("Failed to upload file: %s", err)
}
@@ -164,7 +172,7 @@ type UploadStreamArgs struct {
Progress io.Writer
}
-func (self *Drive) UploadStream(args UploadStreamArgs) (err error) {
+func (self *Drive) UploadStream(args UploadStreamArgs) error {
if args.ChunkSize > intMax() - 1 {
return fmt.Errorf("Chunk size is to big, max chunk size for this computer is %d", intMax() - 1)
}
@@ -189,7 +197,7 @@ func (self *Drive) UploadStream(args UploadStreamArgs) (err error) {
fmt.Fprintf(args.Out, "Uploading %s\n", dstFile.Name)
started := time.Now()
- f, err := self.service.Files.Create(dstFile).Fields("id", "name", "size").Media(srcReader, chunkSize).Do()
+ f, err := self.service.Files.Create(dstFile).Fields("id", "name", "size", "webContentLink").Media(srcReader, chunkSize).Do()
if err != nil {
return fmt.Errorf("Failed to upload file: %s", err)
}
@@ -198,8 +206,13 @@ func (self *Drive) UploadStream(args UploadStreamArgs) (err error) {
rate := calcRate(f.Size, started, time.Now())
fmt.Fprintf(args.Out, "Uploaded %s at %s/s, total %s\n", f.Id, formatSize(rate, false), formatSize(f.Size, false))
- //if args.Share {
- // self.Share(TODO)
- //}
- return
+ if args.Share {
+ err = self.shareAnyoneReader(f.Id)
+ if err != nil {
+ return err
+ }
+
+ fmt.Fprintf(args.Out, "File is readable by anyone at %s\n", f.WebContentLink)
+ }
+ return nil
}
diff --git a/gdrive.go b/gdrive.go
index 3b85a73..b600418 100644
--- a/gdrive.go
+++ b/gdrive.go
@@ -230,12 +230,6 @@ func main() {
Patterns: []string{"--mime"},
Description: "Force mime type",
},
- cli.BoolFlag{
- Name: "share",
- Patterns: []string{"--share"},
- Description: "Share file",
- OmitValue: true,
- },
cli.IntFlag{
Name: "chunksize",
Patterns: []string{"--chunksize"},
@@ -273,12 +267,6 @@ func main() {
Patterns: []string{"-p", "--parent"},
Description: "Parent id of created directory, can be specified multiple times to give many parents",
},
- cli.BoolFlag{
- Name: "share",
- Patterns: []string{"--share"},
- Description: "Share created directory",
- OmitValue: true,
- },
),
},
},
@@ -289,12 +277,6 @@ func main() {
FlagGroups: cli.FlagGroups{
cli.NewFlagGroup("global", globalFlags...),
cli.NewFlagGroup("options",
- cli.BoolFlag{
- Name: "discoverable",
- Patterns: []string{"--discoverable"},
- Description: "Make file discoverable by search engines",
- OmitValue: true,
- },
cli.StringFlag{
Name: "role",
Patterns: []string{"--role"},
@@ -313,15 +295,37 @@ func main() {
Description: "The email address of the user or group to share the file with. Requires 'user' or 'group' as type",
},
cli.BoolFlag{
+ Name: "discoverable",
+ Patterns: []string{"--discoverable"},
+ Description: "Make file discoverable by search engines",
+ OmitValue: true,
+ },
+ cli.BoolFlag{
Name: "revoke",
Patterns: []string{"--revoke"},
- Description: "Delete all sharing permissions",
+ Description: "Delete all sharing permissions (owner roles will be skipped)",
OmitValue: true,
},
),
},
},
&cli.Handler{
+ Pattern: "[global] share list <fileId>",
+ Description: "List files permissions",
+ Callback: shareListHandler,
+ FlagGroups: cli.FlagGroups{
+ cli.NewFlagGroup("global", globalFlags...),
+ },
+ },
+ &cli.Handler{
+ Pattern: "[global] share revoke <fileId> <permissionId>",
+ Description: "Revoke permission",
+ Callback: shareRevokeHandler,
+ FlagGroups: cli.FlagGroups{
+ cli.NewFlagGroup("global", globalFlags...),
+ },
+ },
+ &cli.Handler{
Pattern: "[global] delete [options] <id>",
Description: "Delete file or directory",
Callback: deleteHandler,
@@ -611,12 +615,6 @@ func main() {
Description: "Hide progress",
OmitValue: true,
},
- cli.BoolFlag{
- Name: "share",
- Patterns: []string{"--share"},
- Description: "Share file",
- OmitValue: true,
- },
),
},
},
diff --git a/handlers_drive.go b/handlers_drive.go
index b994df5..de929a4 100644
--- a/handlers_drive.go
+++ b/handlers_drive.go
@@ -145,7 +145,6 @@ func updateHandler(ctx cli.Context) {
Name: args.String("name"),
Parents: args.StringSlice("parent"),
Mime: args.String("mime"),
- Share: args.Bool("share"),
Progress: progressWriter(args.Bool("noProgress")),
ChunkSize: args.Int64("chunksize"),
})
@@ -168,7 +167,6 @@ func importHandler(ctx cli.Context) {
Out: os.Stdout,
Path: args.String("path"),
Parents: args.StringSlice("parent"),
- Share: args.Bool("share"),
Progress: progressWriter(args.Bool("noProgress")),
})
checkErr(err)
@@ -204,7 +202,6 @@ func mkdirHandler(ctx cli.Context) {
Out: os.Stdout,
Name: args.String("name"),
Parents: args.StringSlice("parent"),
- Share: args.Bool("share"),
})
checkErr(err)
}
@@ -218,7 +215,25 @@ func shareHandler(ctx cli.Context) {
Type: args.String("type"),
Email: args.String("email"),
Discoverable: args.Bool("discoverable"),
- Revoke: args.Bool("revoke"),
+ })
+ checkErr(err)
+}
+
+func shareListHandler(ctx cli.Context) {
+ args := ctx.Args()
+ err := newDrive(args).ListPermissions(drive.ListPermissionsArgs{
+ Out: os.Stdout,
+ FileId: args.String("fileId"),
+ })
+ checkErr(err)
+}
+
+func shareRevokeHandler(ctx cli.Context) {
+ args := ctx.Args()
+ err := newDrive(args).RevokePermission(drive.RevokePermissionArgs{
+ Out: os.Stdout,
+ FileId: args.String("fileId"),
+ PermissionId: args.String("permissionId"),
})
checkErr(err)
}