From a5548bb776ca465a4115ccf62c13ec6d743c7952 Mon Sep 17 00:00:00 2001
From: Graham Steffaniak
Date: Wed, 20 Nov 2024 18:15:30 -0600
Subject: [PATCH] v0.3.0 release
---
.gitignore | 1 +
CHANGELOG.md | 35 +-
Dockerfile | 8 +-
Dockerfile.playwright | 2 +-
README.md | 63 +-
backend/auth/auth.go | 2 +-
backend/auth/hook.go | 5 +-
backend/auth/json.go | 5 +-
backend/auth/none.go | 2 +-
backend/auth/proxy.go | 2 +-
backend/cmd/dist/.gitignore | 4 -
backend/cmd/root.go | 96 +-
backend/cmd/rules.go | 3 +-
backend/cmd/rules_add.go | 5 +-
backend/filebrowser | Bin 0 -> 12325124 bytes
backend/files/file.go | 577 +++---
backend/files/file_test.go | 5 +-
backend/files/indexing.go | 160 +-
backend/files/indexing_test.go | 23 +-
backend/files/search.go | 183 +-
backend/files/search_test.go | 182 +-
backend/files/sync.go | 104 +-
backend/files/sync_test.go | 138 +-
backend/fileutils/copy.go | 2 +-
backend/frontend/dist | 1 -
backend/frontend/package-lock.json | 6 -
backend/go.mod | 35 +-
backend/go.sum | 120 +-
backend/http/api.go | 121 ++
backend/http/auth.go | 232 +--
backend/http/data.go | 75 -
backend/http/embed/.gitignore | 1 +
backend/http/http.go | 85 -
backend/http/middleware.go | 291 +++
backend/http/middleware_test.go | 252 +++
backend/http/preview.go | 125 +-
backend/http/preview_enum.go | 100 -
backend/http/public.go | 112 +-
backend/http/public_test.go | 137 --
backend/http/raw.go | 50 +-
backend/http/resource.go | 411 +++--
backend/http/router.go | 186 ++
backend/http/search.go | 76 +-
backend/http/settings.go | 57 +-
backend/http/share.go | 110 +-
backend/http/static.go | 161 +-
backend/http/users.go | 238 ++-
backend/http/utils.go | 37 -
.../Screenshot 2024-11-18 at 2.16.29 PM.png | Bin 0 -> 73659 bytes
backend/rules/rules_test.go | 23 -
backend/settings/config.go | 11 +-
backend/settings/dir_test.go | 4 +-
backend/settings/settings.go | 37 +-
backend/settings/storage.go | 5 +-
backend/settings/structs.go | 27 +-
backend/storage/bolt/users.go | 17 +-
backend/storage/storage.go | 6 +-
backend/swagger/docs/docs.go | 1602 +++++++++++++++++
backend/swagger/docs/swagger.json | 1576 ++++++++++++++++
backend/swagger/docs/swagger.yaml | 1056 +++++++++++
backend/{rules => users}/rules.go | 14 +-
backend/users/storage.go | 45 +-
backend/users/users.go | 58 +-
backend/utils/main.go | 62 +-
docs/configuration.md | 1 +
docs/getting_started.md | 2 -
docs/migration.md | 5 +-
docs/roadmap.md | 15 +-
frontend/package.json | 2 +-
frontend/public/index.html | 39 +-
frontend/public/manifest.json | 2 +-
frontend/src/api/commands.js | 6 +-
frontend/src/api/files.js | 110 +-
frontend/src/api/index.js | 12 +-
frontend/src/api/pub.js | 89 -
frontend/src/api/public.js | 74 +
frontend/src/api/search.js | 17 +-
frontend/src/api/settings.js | 8 +-
frontend/src/api/share.js | 32 +-
frontend/src/api/users.js | 51 +-
frontend/src/api/utils.js | 42 +-
frontend/src/components/Breadcrumbs.vue | 11 +-
frontend/src/components/Search.vue | 115 +-
frontend/src/components/files/ListingItem.vue | 56 +-
frontend/src/components/prompts/ActionApi.vue | 111 ++
frontend/src/components/prompts/Copy.vue | 34 +-
frontend/src/components/prompts/CreateApi.vue | 122 ++
frontend/src/components/prompts/Delete.vue | 6 +-
.../src/components/prompts/DeleteUser.vue | 8 +-
frontend/src/components/prompts/FileList.vue | 10 +-
frontend/src/components/prompts/Info.vue | 8 +-
frontend/src/components/prompts/Move.vue | 54 +-
frontend/src/components/prompts/NewDir.vue | 8 +-
frontend/src/components/prompts/NewFile.vue | 6 +-
frontend/src/components/prompts/Prompts.vue | 4 +
frontend/src/components/prompts/Rename.vue | 10 +-
frontend/src/components/prompts/Share.vue | 38 +-
frontend/src/components/prompts/Upload.vue | 2 +-
.../src/components/settings/Permissions.vue | 4 +
frontend/src/components/settings/UserForm.vue | 1 -
frontend/src/components/sidebar/General.vue | 43 +-
frontend/src/components/sidebar/Settings.vue | 2 +-
frontend/src/css/base.css | 44 +
frontend/src/css/dashboard.css | 2 +-
frontend/src/css/mobile.css | 8 -
frontend/src/i18n/en.json | 4 +-
frontend/src/notify/message.js | 34 +-
frontend/src/router/index.ts | 24 +-
frontend/src/store/getters.js | 30 +-
frontend/src/store/modules/upload.js | 8 +-
frontend/src/store/mutations.js | 14 +-
frontend/src/store/state.js | 1 +
frontend/src/utils/auth.js | 77 +-
frontend/src/utils/constants.js | 8 +-
frontend/src/utils/download.js | 6 +-
frontend/src/utils/upload.js | 8 +-
frontend/src/utils/url.js | 70 +-
frontend/src/views/Files.vue | 19 +-
frontend/src/views/Settings.vue | 35 +-
frontend/src/views/Share.vue | 103 +-
frontend/src/views/bars/Default.vue | 32 +-
frontend/src/views/bars/EditorBar.vue | 2 +-
frontend/src/views/files/Editor.vue | 6 +-
frontend/src/views/files/ListingView.vue | 33 +-
frontend/src/views/files/Preview.vue | 178 +-
frontend/src/views/settings/Api.vue | 167 ++
frontend/src/views/settings/Global.vue | 6 +-
frontend/src/views/settings/Profile.vue | 6 +-
frontend/src/views/settings/Shares.vue | 12 +-
frontend/src/views/settings/User.vue | 28 +-
frontend/src/views/settings/Users.vue | 4 +-
frontend/vite.config.ts | 2 +-
makefile | 32 +-
133 files changed, 8433 insertions(+), 2899 deletions(-)
delete mode 100644 backend/cmd/dist/.gitignore
create mode 100755 backend/filebrowser
delete mode 120000 backend/frontend/dist
delete mode 100644 backend/frontend/package-lock.json
create mode 100644 backend/http/api.go
delete mode 100644 backend/http/data.go
create mode 100644 backend/http/embed/.gitignore
delete mode 100644 backend/http/http.go
create mode 100644 backend/http/middleware.go
create mode 100644 backend/http/middleware_test.go
delete mode 100644 backend/http/preview_enum.go
delete mode 100644 backend/http/public_test.go
create mode 100644 backend/http/router.go
create mode 100755 backend/myfolder/subfolder/Screenshot 2024-11-18 at 2.16.29 PM.png
delete mode 100644 backend/rules/rules_test.go
create mode 100644 backend/swagger/docs/docs.go
create mode 100644 backend/swagger/docs/swagger.json
create mode 100644 backend/swagger/docs/swagger.yaml
rename backend/{rules => users}/rules.go (83%)
delete mode 100644 docs/getting_started.md
delete mode 100644 frontend/src/api/pub.js
create mode 100644 frontend/src/api/public.js
create mode 100644 frontend/src/components/prompts/ActionApi.vue
create mode 100644 frontend/src/components/prompts/CreateApi.vue
create mode 100644 frontend/src/views/settings/Api.vue
diff --git a/.gitignore b/.gitignore
index da3c6c32..9162da20 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,6 +13,7 @@ rice-box.go
/backend/*.cov
/backend/test_config.yaml
/backend/srv
+/backend/http/dist
.DS_Store
node_modules
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 13f053ea..c8ca3190 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,33 @@
All notable changes to this project will be documented in this file. For commit guidelines, please refer to [Standard Version](https://github.com/conventional-changelog/standard-version).
+## v0.3.0
+
+ This Release focuses on the API and making it more accessible for developers to access functions without the UI.
+
+ **New Features**:
+ - You can now long-live api tokens to interact with API from the user settings page.
+ - These tokens have the same permissions as your user.
+ - Helpful swagger page for API usage.
+ - Some API's were refactored for friendlier API usage, moving some attributes to parameters and first looking for a api token, then using the stored cookie if none is found. This allows for all api requests from swagger page to work without a token.
+ - Add file size to search preview! Should have been in last release... sorry!
+
+ **Notes**:
+ - Replaced backend http framework with go standard library.
+ - Right-click Context menu can target the item that was right-clicked. To fully address https://github.com/gtsteffaniak/filebrowser/issues/214
+ - adjusted settings menu for mobile, always shows all available cards rather than grayed out cards that need to be clicked.
+ - longer and more cryptographically secure share links based on UUID rather than base64.
+
+ **Bugfixes**:
+ - Fixed ui bug with shares with password.
+ - Fixes baseurl related bugs https://github.com/gtsteffaniak/filebrowser/pull/228 Thanks @SimLV
+ - Fixed empty directory load issue.
+ - Fixed image preview cutoff on mobile.
+ - Fixed issue introduced in v0.2.10 where new files and folders were not showing up on ui
+ - Fixed preview issue where preview would not load after viewing video files.
+ - Fixed sorting issue where files were not sorted by name by default.
+ - Fixed copy file prompt issue
+
## v0.2.10
**New Features**:
@@ -15,9 +42,9 @@ All notable changes to this project will be documented in this file. For commit
- Fixed issue searching "smaller than" actually returned files "larger than"
**Notes**:
- - Memory usage from index is reduced by ~40%
- - Indexing time has increased 2x due to the extra processing time required to calculate directory sizes.
- - File size calcuations use 1024 base vs previous 1000 base (matching windows explorer)
+ - Memory usage from index is reduced by ~40%
+ - Indexing time has increased 2x due to the extra processing time required to calculate directory sizes.
+ - File size calculations use 1024 base vs previous 1000 base (matching windows explorer)
## v0.2.9
@@ -40,7 +67,7 @@ All notable changes to this project will be documented in this file. For commit
## v0.2.8
-- **Feature**: New gallary view scaling options (closes [#141](https://github.com/gtsteffaniak/filebrowser/issues/141))
+- **Feature**: New gallery view scaling options (closes [#141](https://github.com/gtsteffaniak/filebrowser/issues/141))
- **Change**: Refactored backend files functions
- **Change**: Improved UI response to filesystem changes
- **Change**: Added frontend tests for deployment integrity
diff --git a/Dockerfile b/Dockerfile
index 49a31790..f6137d1e 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,8 +1,10 @@
-FROM golang:1.22-alpine AS base
+FROM golang:1.23-alpine AS base
ARG VERSION
ARG REVISION
WORKDIR /app
COPY ./backend ./
+#RUN swag init --output swagger/docs
+RUN ln -s swagger /usr/local/go/src/
RUN go build -ldflags="-w -s \
-X 'github.com/gtsteffaniak/filebrowser/version.Version=${VERSION}' \
-X 'github.com/gtsteffaniak/filebrowser/version.CommitSHA=${REVISION}'" \
@@ -19,5 +21,7 @@ FROM alpine:latest
ENV FILEBROWSER_NO_EMBEDED="true"
RUN apk --no-cache add ca-certificates mailcap
COPY --from=base /app/filebrowser* ./
-COPY --from=nbuild /app/dist/ ./frontend/dist/
+# exposing default port for auto discovery.
+EXPOSE 80
+COPY --from=nbuild /app/dist/ ./http/dist/
ENTRYPOINT [ "./filebrowser" ]
diff --git a/Dockerfile.playwright b/Dockerfile.playwright
index c8ffaf2a..a792362e 100644
--- a/Dockerfile.playwright
+++ b/Dockerfile.playwright
@@ -1,4 +1,4 @@
-FROM golang:1.22-alpine AS base
+FROM golang:1.23-alpine AS base
WORKDIR /app
COPY ./backend ./
RUN go build -ldflags="-w -s" -o filebrowser .
diff --git a/README.md b/README.md
index 164c09bf..034a7a3f 100644
--- a/README.md
+++ b/README.md
@@ -10,41 +10,43 @@
> [!WARNING]
-> Starting with v0.2.0, *ALL* configuration is done via `filebrowser.yaml`
-> Configuration file.
-> Starting with v0.2.4 *ALL* share links need to be re-created (due to
-> security fix).
+> Starting with `v0.3.0` API routes have been slightly altered for friendly usage outside of the UI.
+> If on windows, please use docker. The windows binary is unstable and may not work.
-FileBrowser Quantum is a fork of the filebrowser opensource project with the
-following changes:
+FileBrowser Quantum is a fork of the file browser opensource project with the following changes:
1. [x] Efficiently indexed files
- Real-time search results as you type
- Search Works with more type filters
- Enhanced interactive results page.
- 2. [x] Revamped and simplified GUI navbar and sidebar menu.
+ - file/folder sizes are shown in the response
+ 1. [x] Revamped and simplified GUI navbar and sidebar menu.
- Additional compact view mode as well as refreshed view mode
styles.
- 3. [x] Revamped and simplified configuration via `filebrowser.yml` config file.
- 4. [x] Faster listing browsing
+ 1. [x] Revamped and simplified configuration via `filebrowser.yml` config file.
+ 1. [x] Better listing browsing
- Switching view modes is instant
+ - Folder sizes are shown as well
- Changing Sort order is instant
- The entire directory is loaded in 1/3 the time
+ 1. Developer API support
+ - Can create long-live API Tokens.
+ - Helpful Swagger page available at `/swagger` endpoint.
## About
-FileBrowser Quantum provides a file managing interface within a specified directory
+FileBrowser Quantum provides a file-managing interface within a specified directory
and can be used to upload, delete, preview, rename, and edit your files.
It allows the creation of multiple users and each user can have its
directory.
This repository is a fork of the original [filebrowser](https://github.com/filebrowser/filebrowser)
with a collection of changes that make this program work better in terms of
-aesthetics and performance. Improved search, simplified ui
+aesthetics and performance. Improved search, simplified UI
(without removing features) and more secure and up-to-date
build are just a few examples.
-FileBrowser Quantum differs significantly to the original.
+FileBrowser Quantum differs significantly from the original.
There are hundreds of thousands of lines changed and they are generally
no longer compatible with each other. This has been intentional -- the
focus of this fork is on a few key principles:
@@ -68,10 +70,9 @@ action panel. If the action is available based on context, it will show up as
a popup menu.
-
-
-
-
+
+
+
## Install
@@ -89,7 +90,6 @@ docker run -it -v /path/to/folder:/srv -p 80:80 gtstef/filebrowser
- with local storage
```
-version: '3.7'
services:
filebrowser:
volumes:
@@ -105,7 +105,6 @@ services:
- with network share
```
-version: '3.7'
services:
filebrowser:
volumes:
@@ -121,7 +120,7 @@ volumes:
driver_opts:
type: cifs
o: "username=admin,password=password,rw" # enter valid info here
- device: "//192.168.1.100/share/" # enter valid hinfo here
+ device: "//192.168.1.100/share/" # enter valid info here
```
@@ -135,10 +134,24 @@ Not using docker (not recommended), download your binary from releases and run w
There are very few commands available. There are 3 actions done via command line:
-1. Running the program, as shown on install step. Only argument used is the config file, if you choose to override default "filebrowser.yaml"
+1. Running the program, as shown on the install step. The only argument used is the config file, if you choose to override default "filebrowser.yaml"
2. Checking the version info via `./filebrowser version`
3. Updating the DB, which currently only supports adding users via `./filebrowser set -u username,password [-a] [-s "example/scope"]`
+## API Usage
+
+FileBrowser Quantum comes with a swagger page that can be accessed from the API section of settings or by going to `/swagger` to see the full list:
+
+
+
+You use the token as a bearer token. For example in postman:
+
+Successful Request:
+
+Failed Request
+
+
+
## Configuration
All configuration is now done via a single configuration file:
@@ -149,11 +162,12 @@ View the [Configuration Help Page](./docs/configuration.md) for available
configuration options and other help.
-## Migration from filebrowser/filebrowser
+## Migration from the original filebrowser
If you currently use the original filebrowser but want to try using this.
-I recommend you start fresh without reusing the database. If you want to
-migrate your existing database to FileBrowser Quantum, visit the [migration
+I would recommend that you start fresh without reusing the database. However,
+If you want to migrate your existing database to FileBrowser Quantum,
+visit the [migration
readme](./docs/migration.md)
## Comparison Chart
@@ -185,7 +199,8 @@ Multiple users | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Single sign-on support | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ |
LDAP sign-on support | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ |
2FA sign-on support | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ |
-Long-live API key support | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ |
+Long-live API key support | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ |
+API documentation page | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ |
Mobile App | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ |
open source? | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ |
tags support | ❌ | ❌ | ❌ | ✅ | ❌ | ✅ |
diff --git a/backend/auth/auth.go b/backend/auth/auth.go
index a1121c6f..3df1a955 100644
--- a/backend/auth/auth.go
+++ b/backend/auth/auth.go
@@ -9,7 +9,7 @@ import (
// Auther is the authentication interface.
type Auther interface {
// Auth is called to authenticate a request.
- Auth(r *http.Request, usr users.Store) (*users.User, error)
+ Auth(r *http.Request, userStore *users.Storage) (*users.User, error)
// LoginPage indicates if this auther needs a login page.
LoginPage() bool
}
diff --git a/backend/auth/hook.go b/backend/auth/hook.go
index 3351d507..75297b95 100644
--- a/backend/auth/hook.go
+++ b/backend/auth/hook.go
@@ -30,7 +30,7 @@ type HookAuth struct {
}
// Auth authenticates the user via a json in content body.
-func (a *HookAuth) Auth(r *http.Request, usr users.Store) (*users.User, error) {
+func (a *HookAuth) Auth(r *http.Request, usr *users.Storage) (*users.User, error) {
var cred hookCred
if r.Body == nil {
@@ -51,7 +51,6 @@ func (a *HookAuth) Auth(r *http.Request, usr users.Store) (*users.User, error) {
if err != nil {
return nil, err
}
-
switch action {
case "auth":
u, err := a.SaveUser()
@@ -187,7 +186,7 @@ func (a *HookAuth) SaveUser() (*users.User, error) {
func (a *HookAuth) GetUser(d *users.User) *users.User {
// adds all permissions when user is admin
isAdmin := d.Perm.Admin
- perms := settings.Permissions{
+ perms := users.Permissions{
Admin: isAdmin,
Execute: isAdmin || d.Perm.Execute,
Create: isAdmin || d.Perm.Create,
diff --git a/backend/auth/json.go b/backend/auth/json.go
index e05547de..cc082597 100644
--- a/backend/auth/json.go
+++ b/backend/auth/json.go
@@ -23,7 +23,7 @@ type JSONAuth struct {
}
// Auth authenticates the user via a json in content body.
-func (a JSONAuth) Auth(r *http.Request, usr users.Store) (*users.User, error) {
+func (a JSONAuth) Auth(r *http.Request, userStore *users.Storage) (*users.User, error) {
config := &settings.Config
var cred jsonCred
@@ -47,8 +47,7 @@ func (a JSONAuth) Auth(r *http.Request, usr users.Store) (*users.User, error) {
return nil, os.ErrPermission
}
}
-
- u, err := usr.Get(config.Server.Root, cred.Username)
+ u, err := userStore.Get(config.Server.Root, cred.Username)
if err != nil || !users.CheckPwd(cred.Password, u.Password) {
return nil, os.ErrPermission
}
diff --git a/backend/auth/none.go b/backend/auth/none.go
index 0d6a9691..bc2a53c4 100644
--- a/backend/auth/none.go
+++ b/backend/auth/none.go
@@ -14,7 +14,7 @@ const MethodNoAuth = "noauth"
type NoAuth struct{}
// Auth uses authenticates user 1.
-func (a NoAuth) Auth(r *http.Request, usr users.Store) (*users.User, error) {
+func (a NoAuth) Auth(r *http.Request, usr *users.Storage) (*users.User, error) {
return usr.Get(settings.Config.Server.Root, uint(1))
}
diff --git a/backend/auth/proxy.go b/backend/auth/proxy.go
index 522618b0..a5e6cd1a 100644
--- a/backend/auth/proxy.go
+++ b/backend/auth/proxy.go
@@ -19,7 +19,7 @@ type ProxyAuth struct {
}
// Auth authenticates the user via an HTTP header.
-func (a ProxyAuth) Auth(r *http.Request, usr users.Store) (*users.User, error) {
+func (a ProxyAuth) Auth(r *http.Request, usr *users.Storage) (*users.User, error) {
username := r.Header.Get(a.Header)
user, err := usr.Get(settings.Config.Server.Root, username)
if err == errors.ErrNotExist {
diff --git a/backend/cmd/dist/.gitignore b/backend/cmd/dist/.gitignore
deleted file mode 100644
index 86d0cb27..00000000
--- a/backend/cmd/dist/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-# Ignore everything in this directory
-*
-# Except this file
-!.gitignore
\ No newline at end of file
diff --git a/backend/cmd/root.go b/backend/cmd/root.go
index f5a892fa..68f33cd8 100644
--- a/backend/cmd/root.go
+++ b/backend/cmd/root.go
@@ -1,20 +1,11 @@
package cmd
import (
- "crypto/tls"
"flag"
"fmt"
- "io/fs"
"log"
- "net"
- "net/http"
"os"
- "os/signal"
- "strconv"
"strings"
- "syscall"
-
- "embed"
"github.com/gtsteffaniak/filebrowser/diskcache"
"github.com/gtsteffaniak/filebrowser/files"
@@ -22,29 +13,15 @@ import (
"github.com/gtsteffaniak/filebrowser/img"
"github.com/gtsteffaniak/filebrowser/settings"
"github.com/gtsteffaniak/filebrowser/storage"
+ "github.com/gtsteffaniak/filebrowser/swagger/docs"
+ "github.com/swaggo/swag"
+
"github.com/gtsteffaniak/filebrowser/users"
- "github.com/gtsteffaniak/filebrowser/utils"
"github.com/gtsteffaniak/filebrowser/version"
)
-//go:embed dist/*
-var assets embed.FS
-
-var (
- nonEmbededFS = os.Getenv("FILEBROWSER_NO_EMBEDED") == "true"
-)
-
-type dirFS struct {
- http.Dir
-}
-
-func (d dirFS) Open(name string) (fs.File, error) {
- return d.Dir.Open(name)
-}
-
func getStore(config string) (*storage.Storage, bool) {
// Use the config file (global flag)
- log.Printf("Using Config file : %v", config)
settings.Initialize(config)
store, hasDB, err := storage.InitializeDb(settings.Config.Server.Database)
if err != nil {
@@ -146,12 +123,16 @@ func StartFilebrowser() {
database = fmt.Sprintf("Creating new database : %v", settings.Config.Server.Database)
}
log.Printf("Initializing FileBrowser Quantum (%v)\n", version.Version)
- log.Println("Embeded frontend :", !nonEmbededFS)
+ log.Printf("Using Config file : %v", configPath)
+ log.Println("Embeded frontend :", os.Getenv("FILEBROWSER_NO_EMBEDED") != "true")
log.Println(database)
log.Println("Sources :", settings.Config.Server.Root)
- log.Print("Indexing interval : ", indexingInterval)
+ log.Println("Indexing interval :", indexingInterval)
serverConfig := settings.Config.Server
+ swagInfo := docs.SwaggerInfo
+ swagInfo.BasePath = serverConfig.BaseURL
+ swag.Register(docs.SwaggerInfo.InstanceName(), swagInfo)
// initialize indexing and schedule indexing ever n minutes (default 5)
go files.InitializeIndex(serverConfig.IndexingInterval, serverConfig.Indexing)
if err := rootCMD(store, &serverConfig); err != nil {
@@ -159,13 +140,6 @@ func StartFilebrowser() {
}
}
-func cleanupHandler(listener net.Listener, c chan os.Signal) { //nolint:interfacer
- sig := <-c
- log.Printf("Caught signal %s: shutting down.", sig)
- listener.Close()
- os.Exit(0)
-}
-
func rootCMD(store *storage.Storage, serverConfig *settings.Server) error {
if serverConfig.NumImageProcessors < 1 {
log.Fatal("Image resize workers count could not be < 1")
@@ -186,57 +160,7 @@ func rootCMD(store *storage.Storage, serverConfig *settings.Server) error {
// No-op cache if no cacheDir is specified
fileCache = diskcache.NewNoOp()
}
+ fbhttp.StartHttp(imgSvc, store, fileCache)
- fbhttp.SetupEnv(store, serverConfig, fileCache)
-
- _, err := os.Stat(serverConfig.Root)
- utils.CheckErr(fmt.Sprint("cmd os.Stat ", serverConfig.Root), err)
- var listener net.Listener
- address := serverConfig.Address + ":" + strconv.Itoa(serverConfig.Port)
- switch {
- case serverConfig.Socket != "":
- listener, err = net.Listen("unix", serverConfig.Socket)
- utils.CheckErr("net.Listen", err)
- err = os.Chmod(serverConfig.Socket, os.FileMode(0666)) // socket-perm
- utils.CheckErr("os.Chmod", err)
- case serverConfig.TLSKey != "" && serverConfig.TLSCert != "":
- cer, err := tls.LoadX509KeyPair(serverConfig.TLSCert, serverConfig.TLSKey) //nolint:govet
- utils.CheckErr("tls.LoadX509KeyPair", err)
- listener, err = tls.Listen("tcp", address, &tls.Config{
- MinVersion: tls.VersionTLS12,
- Certificates: []tls.Certificate{cer}},
- )
- utils.CheckErr("tls.Listen", err)
- default:
- listener, err = net.Listen("tcp", address)
- utils.CheckErr("net.Listen", err)
- }
- sigc := make(chan os.Signal, 1)
- signal.Notify(sigc, os.Interrupt, syscall.SIGTERM)
- go cleanupHandler(listener, sigc)
- if !nonEmbededFS {
- assetsFs, err := fs.Sub(assets, "dist")
- if err != nil {
- log.Fatal("Could not embed frontend. Does backend/cmd/dist exist? Must be built and exist first")
- }
- handler, err := fbhttp.NewHandler(imgSvc, assetsFs)
- utils.CheckErr("fbhttp.NewHandler", err)
- defer listener.Close()
- log.Println("Listening on", listener.Addr().String())
- //nolint: gosec
- if err := http.Serve(listener, handler); err != nil {
- log.Fatalf("Could not start server on port %d: %v", serverConfig.Port, err)
- }
- } else {
- assetsFs := dirFS{Dir: http.Dir("frontend/dist")}
- handler, err := fbhttp.NewHandler(imgSvc, assetsFs)
- utils.CheckErr("fbhttp.NewHandler", err)
- defer listener.Close()
- log.Println("Listening on", listener.Addr().String())
- //nolint: gosec
- if err := http.Serve(listener, handler); err != nil {
- log.Fatalf("Could not start server on port %d: %v", serverConfig.Port, err)
- }
- }
return nil
}
diff --git a/backend/cmd/rules.go b/backend/cmd/rules.go
index bfa2e6a1..dec58a68 100644
--- a/backend/cmd/rules.go
+++ b/backend/cmd/rules.go
@@ -6,7 +6,6 @@ import (
"github.com/spf13/cobra"
"github.com/spf13/pflag"
- "github.com/gtsteffaniak/filebrowser/rules"
"github.com/gtsteffaniak/filebrowser/settings"
"github.com/gtsteffaniak/filebrowser/storage"
"github.com/gtsteffaniak/filebrowser/users"
@@ -66,7 +65,7 @@ func getUserIdentifier(flags *pflag.FlagSet) interface{} {
return nil
}
-func printRules(rulez []rules.Rule, id interface{}) {
+func printRules(rulez []users.Rule, id interface{}) {
for id, rule := range rulez {
fmt.Printf("(%d) ", id)
diff --git a/backend/cmd/rules_add.go b/backend/cmd/rules_add.go
index d7fa4064..27d8ba36 100644
--- a/backend/cmd/rules_add.go
+++ b/backend/cmd/rules_add.go
@@ -5,7 +5,6 @@ import (
"github.com/spf13/cobra"
- "github.com/gtsteffaniak/filebrowser/rules"
"github.com/gtsteffaniak/filebrowser/settings"
"github.com/gtsteffaniak/filebrowser/storage"
"github.com/gtsteffaniak/filebrowser/users"
@@ -32,13 +31,13 @@ var rulesAddCmd = &cobra.Command{
regexp.MustCompile(exp)
}
- rule := rules.Rule{
+ rule := users.Rule{
Allow: allow,
Regex: regex,
}
if regex {
- rule.Regexp = &rules.Regexp{Raw: exp}
+ rule.Regexp = &users.Regexp{Raw: exp}
} else {
rule.Path = exp
}
diff --git a/backend/filebrowser b/backend/filebrowser
new file mode 100755
index 0000000000000000000000000000000000000000..81ec32af856c2c0d7b473ac2de7f1720f3b7b32f
GIT binary patch
literal 12325124
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