File service changes: ownership, auth etc (#70)

This commit is contained in:
Janos Dobronszki
2021-02-17 10:47:59 +00:00
committed by GitHub
parent cda77a5c47
commit f62bcadf26
6 changed files with 96 additions and 56 deletions

View File

@@ -78,7 +78,7 @@ jobs:
# publish to github first under micro/services # publish to github first under micro/services
# .npmrc has settings for it # .npmrc has settings for it
- uses: JS-DevTools/npm-publish@v1 - uses: JS-DevTools/npm-publish@v1
if: github.ref == 'refs/heads/master' #if: github.ref == 'refs/heads/master'
with: with:
access: public access: public
package: services/clients/ts/package.json package: services/clients/ts/package.json
@@ -92,7 +92,7 @@ jobs:
sed -i 's/micro/m3o/g' clients/ts/package.json sed -i 's/micro/m3o/g' clients/ts/package.json
- uses: JS-DevTools/npm-publish@v1 - uses: JS-DevTools/npm-publish@v1
if: github.ref == 'refs/heads/master' #if: github.ref == 'refs/heads/master'
with: with:
access: public access: public
package: services/clients/ts/package.json package: services/clients/ts/package.json

View File

@@ -2,8 +2,10 @@ package handler
import ( import (
"context" "context"
"errors"
"strings" "strings"
"github.com/micro/micro/v3/service/auth"
log "github.com/micro/micro/v3/service/logger" log "github.com/micro/micro/v3/service/logger"
"github.com/micro/micro/v3/service/model" "github.com/micro/micro/v3/service/model"
files "github.com/micro/services/files/proto" files "github.com/micro/services/files/proto"
@@ -17,21 +19,37 @@ func NewFiles() *Files {
i := model.ByEquality("project") i := model.ByEquality("project")
i.Order.Type = model.OrderTypeUnordered i.Order.Type = model.OrderTypeUnordered
db := model.NewModel( db := model.New(
model.WithIndexes(i), files.File{},
&model.Options{
Key: "Id",
Indexes: []model.Index{i},
},
) )
db.Register(new(files.File))
return &Files{ return &Files{
db: db, db: db,
} }
} }
func (e *Files) Save(ctx context.Context, req *files.SaveRequest, rsp *files.SaveResponse) error { func (e *Files) Save(ctx context.Context, req *files.SaveRequest, rsp *files.SaveResponse) error {
log.Info("Received Files.Call request") // @todo return proper micro errors
acc, ok := auth.AccountFromContext(ctx)
if !ok {
return errors.New("Files.Save requires authentication")
}
log.Info("Received Files.Save request")
for _, file := range req.Files { for _, file := range req.Files {
err := e.db.Create(file) f := files.File{}
err := e.db.Read(model.QueryEquals("Id", file.Id), &f)
if err != nil && err != model.ErrorNotFound {
return err
}
if f.Owner != acc.ID {
return errors.New("Not authorized")
}
err = e.db.Create(file)
if err != nil { if err != nil {
return err return err
} }
@@ -40,7 +58,7 @@ func (e *Files) Save(ctx context.Context, req *files.SaveRequest, rsp *files.Sav
} }
func (e *Files) List(ctx context.Context, req *files.ListRequest, rsp *files.ListResponse) error { func (e *Files) List(ctx context.Context, req *files.ListRequest, rsp *files.ListResponse) error {
log.Info("Received Files.Call request") log.Info("Received Files.List request")
rsp.Files = []*files.File{} rsp.Files = []*files.File{}
err := e.db.Read(model.QueryEquals("project", req.GetProject()), &rsp.Files) err := e.db.Read(model.QueryEquals("project", req.GetProject()), &rsp.Files)
if err != nil { if err != nil {

View File

@@ -16,7 +16,7 @@ func main() {
) )
// Register handler // Register handler
pb.RegisterFilesHandler(srv.Server(), new(handler.Files)) pb.RegisterFilesHandler(srv.Server(), handler.NewFiles())
// Run service // Run service
if err := srv.Run(); err != nil { if err := srv.Run(); err != nil {

View File

@@ -30,18 +30,21 @@ type File struct {
sizeCache protoimpl.SizeCache sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields unknownFields protoimpl.UnknownFields
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
// A custom string for namespacing purposes // A custom string for namespacing purposes
// eg. files-of-mywebsite.com // eg. files-of-mywebsite.com
Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"` Project string `protobuf:"bytes,2,opt,name=project,proto3" json:"project,omitempty"`
// Name of folder or file. // Name of folder or file.
Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
// Path. Default is '/', ie. top level // Path. Default is '/', ie. top level
Path string `protobuf:"bytes,3,opt,name=path,proto3" json:"path,omitempty"` Path string `protobuf:"bytes,4,opt,name=path,proto3" json:"path,omitempty"`
IsDirectory bool `protobuf:"varint,4,opt,name=isDirectory,proto3" json:"isDirectory,omitempty"` IsDirectory bool `protobuf:"varint,5,opt,name=is_directory,json=isDirectory,proto3" json:"is_directory,omitempty"`
// File contents. Empty for directories. // File contents. Empty for directories.
FileContents string `protobuf:"bytes,5,opt,name=fileContents,proto3" json:"fileContents,omitempty"` FileContents string `protobuf:"bytes,6,opt,name=file_contents,json=fileContents,proto3" json:"file_contents,omitempty"`
Created int64 `protobuf:"varint,6,opt,name=created,proto3" json:"created,omitempty"` Created int64 `protobuf:"varint,7,opt,name=created,proto3" json:"created,omitempty"`
Updated int64 `protobuf:"varint,7,opt,name=updated,proto3" json:"updated,omitempty"` Updated int64 `protobuf:"varint,8,opt,name=updated,proto3" json:"updated,omitempty"`
// owner
Owner string `protobuf:"bytes,9,opt,name=owner,proto3" json:"owner,omitempty"`
} }
func (x *File) Reset() { func (x *File) Reset() {
@@ -76,6 +79,13 @@ func (*File) Descriptor() ([]byte, []int) {
return file_proto_files_proto_rawDescGZIP(), []int{0} return file_proto_files_proto_rawDescGZIP(), []int{0}
} }
func (x *File) GetId() string {
if x != nil {
return x.Id
}
return ""
}
func (x *File) GetProject() string { func (x *File) GetProject() string {
if x != nil { if x != nil {
return x.Project return x.Project
@@ -125,6 +135,13 @@ func (x *File) GetUpdated() int64 {
return 0 return 0
} }
func (x *File) GetOwner() string {
if x != nil {
return x.Owner
}
return ""
}
// The save endpoint lets you batch save text files. // The save endpoint lets you batch save text files.
type SaveRequest struct { type SaveRequest struct {
state protoimpl.MessageState state protoimpl.MessageState
@@ -323,39 +340,41 @@ var File_proto_files_proto protoreflect.FileDescriptor
var file_proto_files_proto_rawDesc = []byte{ var file_proto_files_proto_rawDesc = []byte{
0x0a, 0x11, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x70, 0x72,
0x6f, 0x74, 0x6f, 0x12, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, 0xc2, 0x01, 0x0a, 0x04, 0x46, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, 0xea, 0x01, 0x0a, 0x04, 0x46,
0x69, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x69, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02,
0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a,
0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,
0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52,
0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x73, 0x44, 0x69, 0x72, 0x65, 0x63, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x64, 0x69, 0x72, 0x65,
0x74, 0x6f, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x44, 0x69, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x44,
0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x69, 0x6c, 0x65,
0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52,
0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x0c, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x18, 0x0a,
0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x63, 0x72, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07,
0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74,
0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x22, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65,
0x30, 0x0a, 0x0b, 0x53, 0x61, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09,
0x0a, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x22, 0x30, 0x0a, 0x0b, 0x53, 0x61, 0x76, 0x65, 0x52,
0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18,
0x73, 0x22, 0x0e, 0x0a, 0x0c, 0x53, 0x61, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x46, 0x69,
0x65, 0x22, 0x3b, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x6c, 0x65, 0x52, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, 0x0e, 0x0a, 0x0c, 0x53, 0x61, 0x76,
0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x0a, 0x0b, 0x4c, 0x69, 0x73,
0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a,
0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x31, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65,
0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
0x0a, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x31, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65,
0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18,
0x73, 0x32, 0x6d, 0x0a, 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x53, 0x61, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x46, 0x69,
0x76, 0x65, 0x12, 0x12, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x53, 0x61, 0x76, 0x65, 0x52, 0x6c, 0x65, 0x52, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x32, 0x6d, 0x0a, 0x05, 0x46, 0x69, 0x6c,
0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x53, 0x65, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x53, 0x61, 0x76, 0x65, 0x12, 0x12, 0x2e, 0x66, 0x69, 0x6c,
0x61, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x65, 0x73, 0x2e, 0x53, 0x61, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13,
0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x12, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x53, 0x61, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f,
0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x12, 0x2e,
0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
0x42, 0x0d, 0x5a, 0x0b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x3b, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x62, 0x74, 0x1a, 0x13, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65,
0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x0d, 0x5a, 0x0b, 0x70, 0x72, 0x6f, 0x74,
0x6f, 0x3b, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
} }
var ( var (

View File

@@ -10,18 +10,21 @@ service Files {
} }
message File { message File {
string id = 1;
// A custom string for namespacing purposes // A custom string for namespacing purposes
// eg. files-of-mywebsite.com // eg. files-of-mywebsite.com
string project = 1; string project = 2;
// Name of folder or file. // Name of folder or file.
string name = 2; string name = 3;
// Path. Default is '/', ie. top level // Path. Default is '/', ie. top level
string path = 3; string path = 4;
bool isDirectory = 4; bool is_directory = 5;
// File contents. Empty for directories. // File contents. Empty for directories.
string fileContents = 5; string file_contents = 6;
int64 created = 6; int64 created = 7;
int64 updated = 7; int64 updated = 8;
// owner
string owner = 9;
} }
// The save endpoint lets you batch save text files. // The save endpoint lets you batch save text files.

0
streams/skip Normal file
View File