mirror of
				https://github.com/filebrowser/filebrowser.git
				synced 2025-11-04 03:12:57 +00:00 
			
		
		
		
	Put search and command in the same file
Former-commit-id: ec4d0fe64d8ecd06411c54d269c7a046448ba8b0 [formerly 4d08a0093ba6fe20a8c377596a43674751b455be] [formerly aa20a96198a064a352448e01ecb828a71fb2691f [formerly 2d82967b44109f257579059b46856bc4136a637c]] Former-commit-id: 8e64e961f6132daf323cb7a5c62f421cdfa8d94e [formerly 9367098494f6bc0c38bb7e27ed11a06cfc47982a] Former-commit-id: 6625f650cf28818b3b7cdec029c9eb4add3da228
This commit is contained in:
		
							parent
							
								
									d962ac060a
								
							
						
					
					
						commit
						3acc23cc18
					
				
							
								
								
									
										116
									
								
								search.go
									
									
									
									
									
								
							
							
						
						
									
										116
									
								
								search.go
									
									
									
									
									
								
							@ -1,116 +0,0 @@
 | 
			
		||||
package filemanager
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"os"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/gorilla/websocket"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type searchOptions struct {
 | 
			
		||||
	CaseInsensitive bool
 | 
			
		||||
	Terms           []string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func parseSearch(value string) *searchOptions {
 | 
			
		||||
	opts := &searchOptions{
 | 
			
		||||
		CaseInsensitive: strings.Contains(value, "case:insensitive"),
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// removes the options from the value
 | 
			
		||||
	value = strings.Replace(value, "case:insensitive", "", -1)
 | 
			
		||||
	value = strings.Replace(value, "case:sensitive", "", -1)
 | 
			
		||||
	value = strings.TrimSpace(value)
 | 
			
		||||
 | 
			
		||||
	if opts.CaseInsensitive {
 | 
			
		||||
		value = strings.ToLower(value)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// if the value starts with " and finishes what that character, we will
 | 
			
		||||
	// only search for that term
 | 
			
		||||
	if value[0] == '"' && value[len(value)-1] == '"' {
 | 
			
		||||
		unique := strings.TrimPrefix(value, "\"")
 | 
			
		||||
		unique = strings.TrimSuffix(unique, "\"")
 | 
			
		||||
 | 
			
		||||
		opts.Terms = []string{unique}
 | 
			
		||||
		return opts
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	opts.Terms = strings.Split(value, " ")
 | 
			
		||||
	return opts
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// search searches for a file or directory.
 | 
			
		||||
func search(c *RequestContext, w http.ResponseWriter, r *http.Request) (int, error) {
 | 
			
		||||
	// Upgrades the connection to a websocket and checks for errors.
 | 
			
		||||
	conn, err := upgrader.Upgrade(w, r, nil)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
	defer conn.Close()
 | 
			
		||||
 | 
			
		||||
	var (
 | 
			
		||||
		value   string
 | 
			
		||||
		search  *searchOptions
 | 
			
		||||
		message []byte
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	// Starts an infinite loop until a valid command is captured.
 | 
			
		||||
	for {
 | 
			
		||||
		_, message, err = conn.ReadMessage()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return http.StatusInternalServerError, err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if len(message) != 0 {
 | 
			
		||||
			value = string(message)
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	search = parseSearch(value)
 | 
			
		||||
	scope := strings.TrimPrefix(r.URL.Path, "/")
 | 
			
		||||
	scope = "/" + scope
 | 
			
		||||
	scope = string(c.User.FileSystem) + scope
 | 
			
		||||
	scope = strings.Replace(scope, "\\", "/", -1)
 | 
			
		||||
	scope = filepath.Clean(scope)
 | 
			
		||||
 | 
			
		||||
	err = filepath.Walk(scope, func(path string, f os.FileInfo, err error) error {
 | 
			
		||||
		if search.CaseInsensitive {
 | 
			
		||||
			path = strings.ToLower(path)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		path = strings.TrimPrefix(path, scope)
 | 
			
		||||
		path = strings.TrimPrefix(path, "/")
 | 
			
		||||
		path = strings.Replace(path, "\\", "/", -1)
 | 
			
		||||
		is := false
 | 
			
		||||
 | 
			
		||||
		for _, term := range search.Terms {
 | 
			
		||||
			if is {
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if strings.Contains(path, term) {
 | 
			
		||||
				if !c.User.Allowed(path) {
 | 
			
		||||
					return nil
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				is = true
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if !is {
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return conn.WriteMessage(websocket.TextMessage, []byte(path))
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return http.StatusInternalServerError, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 0, nil
 | 
			
		||||
}
 | 
			
		||||
@ -3,6 +3,7 @@ package filemanager
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"os"
 | 
			
		||||
	"os/exec"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"strings"
 | 
			
		||||
@ -133,3 +134,109 @@ func command(c *RequestContext, w http.ResponseWriter, r *http.Request) (int, er
 | 
			
		||||
 | 
			
		||||
	return 0, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type searchOptions struct {
 | 
			
		||||
	CaseInsensitive bool
 | 
			
		||||
	Terms           []string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func parseSearch(value string) *searchOptions {
 | 
			
		||||
	opts := &searchOptions{
 | 
			
		||||
		CaseInsensitive: strings.Contains(value, "case:insensitive"),
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// removes the options from the value
 | 
			
		||||
	value = strings.Replace(value, "case:insensitive", "", -1)
 | 
			
		||||
	value = strings.Replace(value, "case:sensitive", "", -1)
 | 
			
		||||
	value = strings.TrimSpace(value)
 | 
			
		||||
 | 
			
		||||
	if opts.CaseInsensitive {
 | 
			
		||||
		value = strings.ToLower(value)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// if the value starts with " and finishes what that character, we will
 | 
			
		||||
	// only search for that term
 | 
			
		||||
	if value[0] == '"' && value[len(value)-1] == '"' {
 | 
			
		||||
		unique := strings.TrimPrefix(value, "\"")
 | 
			
		||||
		unique = strings.TrimSuffix(unique, "\"")
 | 
			
		||||
 | 
			
		||||
		opts.Terms = []string{unique}
 | 
			
		||||
		return opts
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	opts.Terms = strings.Split(value, " ")
 | 
			
		||||
	return opts
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// search searches for a file or directory.
 | 
			
		||||
func search(c *RequestContext, w http.ResponseWriter, r *http.Request) (int, error) {
 | 
			
		||||
	// Upgrades the connection to a websocket and checks for errors.
 | 
			
		||||
	conn, err := upgrader.Upgrade(w, r, nil)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
	defer conn.Close()
 | 
			
		||||
 | 
			
		||||
	var (
 | 
			
		||||
		value   string
 | 
			
		||||
		search  *searchOptions
 | 
			
		||||
		message []byte
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	// Starts an infinite loop until a valid command is captured.
 | 
			
		||||
	for {
 | 
			
		||||
		_, message, err = conn.ReadMessage()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return http.StatusInternalServerError, err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if len(message) != 0 {
 | 
			
		||||
			value = string(message)
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	search = parseSearch(value)
 | 
			
		||||
	scope := strings.TrimPrefix(r.URL.Path, "/")
 | 
			
		||||
	scope = "/" + scope
 | 
			
		||||
	scope = string(c.User.FileSystem) + scope
 | 
			
		||||
	scope = strings.Replace(scope, "\\", "/", -1)
 | 
			
		||||
	scope = filepath.Clean(scope)
 | 
			
		||||
 | 
			
		||||
	err = filepath.Walk(scope, func(path string, f os.FileInfo, err error) error {
 | 
			
		||||
		if search.CaseInsensitive {
 | 
			
		||||
			path = strings.ToLower(path)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		path = strings.TrimPrefix(path, scope)
 | 
			
		||||
		path = strings.TrimPrefix(path, "/")
 | 
			
		||||
		path = strings.Replace(path, "\\", "/", -1)
 | 
			
		||||
		is := false
 | 
			
		||||
 | 
			
		||||
		for _, term := range search.Terms {
 | 
			
		||||
			if is {
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if strings.Contains(path, term) {
 | 
			
		||||
				if !c.User.Allowed(path) {
 | 
			
		||||
					return nil
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				is = true
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if !is {
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return conn.WriteMessage(websocket.TextMessage, []byte(path))
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return http.StatusInternalServerError, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 0, nil
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user