| 
					
					
						
							
						
					
					
				 | 
				@ -11,6 +11,7 @@ import ( | 
			
		
		
	
		
			
				 | 
				 | 
					"github.com/h2non/filetype" | 
				 | 
				 | 
					"github.com/h2non/filetype" | 
			
		
		
	
		
			
				 | 
				 | 
					"io" | 
				 | 
				 | 
					"io" | 
			
		
		
	
		
			
				 | 
				 | 
					"log" | 
				 | 
				 | 
					"log" | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
					"strings" | 
			
		
		
	
		
			
				 | 
				 | 
					"time" | 
				 | 
				 | 
					"time" | 
			
		
		
	
		
			
				 | 
				 | 
				) | 
				 | 
				 | 
				) | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
						
							
						
					
					
				 | 
				@ -51,10 +52,12 @@ func (s *FileService) List(ctx context.Context, filter models.FileFilter) ([]*mo | 
			
		
		
	
		
			
				 | 
				 | 
					if filter.Public != nil { | 
				 | 
				 | 
					if filter.Public != nil { | 
			
		
		
	
		
			
				 | 
				 | 
						if *filter.Public == false { | 
				 | 
				 | 
						if *filter.Public == false { | 
			
		
		
	
		
			
				 | 
				 | 
							if filter.Author == nil || *filter.Author == "" { | 
				 | 
				 | 
							if filter.Author == nil || *filter.Author == "" { | 
			
		
		
	
		
			
				 | 
				 | 
								return nil, ErrPrivateNoAuthor | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
								if token == nil { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
									return nil, ErrUnauthorized | 
			
		
		
	
		
			
				 | 
				 | 
								} | 
				 | 
				 | 
								} | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
							if !token.PermittedUser(*filter.Author, "member", "file.list") { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
								filter.Author = &token.UserID | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
							} else if !token.PermittedUser(*filter.Author, "member", "file.list") { | 
			
		
		
	
		
			
				 | 
				 | 
								return nil, ErrUnauthorized | 
				 | 
				 | 
								return nil, ErrUnauthorized | 
			
		
		
	
		
			
				 | 
				 | 
							} | 
				 | 
				 | 
							} | 
			
		
		
	
		
			
				 | 
				 | 
						} | 
				 | 
				 | 
						} | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
						
							
						
					
					
				 | 
				@ -125,17 +128,53 @@ func (s *FileService) Edit(ctx context.Context, id string, name *string, public | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
					err = s.authService.CheckPermission(ctx, "edit", file) | 
				 | 
				 | 
					err = s.authService.CheckPermission(ctx, "edit", file) | 
			
		
		
	
		
			
				 | 
				 | 
					if err != nil { | 
				 | 
				 | 
					if err != nil { | 
			
		
		
	
		
			
				 | 
				 | 
						if !file.Public { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
							return nil, repositories.ErrNotFound | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
						} | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
						return nil, err | 
				 | 
				 | 
						return nil, err | 
			
		
		
	
		
			
				 | 
				 | 
					} | 
				 | 
				 | 
					} | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
					return s.files.Update(ctx, *file, models.FileUpdate{ | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
					file, err = s.files.Update(ctx, *file, models.FileUpdate{ | 
			
		
		
	
		
			
				 | 
				 | 
						Name:   name, | 
				 | 
				 | 
						Name:   name, | 
			
		
		
	
		
			
				 | 
				 | 
						Public: public, | 
				 | 
				 | 
						Public: public, | 
			
		
		
	
		
			
				 | 
				 | 
					}) | 
				 | 
				 | 
					}) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
					if err != nil { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
						return nil, err | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
					} | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
					s.changeService.Submit(ctx, models.ChangeModelFile, "edit", file.Public, changekeys.Listed(file), file) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
					return file, nil | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				} | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				func (s *FileService) Remove(ctx context.Context, id string) (*models.File, error) { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
					file, err := s.files.Find(ctx, id) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
					if err != nil { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
						return nil, err | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
					} | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
					err = s.authService.CheckPermission(ctx, "remove", file) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
					if err != nil { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
						return nil, err | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
					} | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
					if file.Kind == "upload" { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
						split := strings.Split(file.URL, "/") | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
						name := split[len(split)-1] | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
						if strings.HasPrefix(name, "U") { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
							err := s.space.RemoveFile(name) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
							if err != nil { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
								log.Printf("Failed to remove file %s for id %s: %s", name, id, err) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
							} | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
						} | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
					} | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
					err = s.files.Delete(ctx, *file) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
					if err != nil { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
						return nil, err | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
					} | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
					s.changeService.Submit(ctx, models.ChangeModelFile, "remove", file.Public, changekeys.Listed(file), file) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
					return file, nil | 
			
		
		
	
		
			
				 | 
				 | 
				} | 
				 | 
				 | 
				} | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				// concatReader is a quick and dirty reader for reading the head and the file.
 | 
				 | 
				 | 
				// concatReader is a quick and dirty reader for reading the head and the file.
 | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
					
				 | 
				
  |