diff options
Diffstat (limited to 'drive')
| -rw-r--r-- | drive/import.go | 2 | ||||
| -rw-r--r-- | drive/mkdir.go | 5 | ||||
| -rw-r--r-- | drive/share.go | 95 | ||||
| -rw-r--r-- | drive/update.go | 1 | ||||
| -rw-r--r-- | drive/upload.go | 31 | 
5 files changed, 93 insertions, 41 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  } | 
