Compare commits

...
35 Commits
Author SHA1 Message Date
Graham Steffaniak 1c8843b766 merged completion 2025-11-10 10:48:49 -06:00
Graham Steffaniak 337b958b9e Merge branch 'main' into stable/v1.0.1 2025-11-10 10:42:17 -06:00
dc60832d22 Patch/misc fixes (#1558)
Co-authored-by: Pyro <pyrodd@gmail.com>
Co-authored-by: Kevin B. <kurami32_kbm@proton.me>
Co-authored-by: lps-rocks <10893911+lps-rocks@users.noreply.github.com>
Co-authored-by: contributor <foss.contributor@gmail.com>
Co-authored-by: Sarabanga <96509626+Sarabanga@users.noreply.github.com>
Co-authored-by: Ironic <202444094+YoureIronic@users.noreply.github.com>
2025-11-10 10:40:13 -06:00
Graham Steffaniak 809e1e5ea4 patch a few bugs 2025-11-05 18:46:57 -06:00
Graham Steffaniak 75c8d7847f updated workflows (#1499) 2025-11-02 15:10:06 -06:00
Graham Steffaniak 07f37cb3a6 merged 2025-11-02 14:57:57 -06:00
Graham Steffaniak 403614dcb3 Merge branch 'dev/v1.0.1' of github.com:gtsteffaniak/filebrowser into dev/v1.0.1 2025-11-02 14:57:05 -06:00
Graham Steffaniak e0d9ff25da updated login page and icon (#1494) 2025-11-02 08:25:21 -06:00
Graham Steffaniak 55620b5056 updated login page and icon 2025-11-01 09:15:22 -05:00
Graham Steffaniak f4f2400d91 hide version for unauthenticated users (#1490) 2025-11-01 08:52:04 -05:00
Kevin B. f6b4310035 Fix onlyOffice nextPrevious (#1492) 2025-10-31 19:45:56 -05:00
Graham Steffaniak 095bdff589 updated changelog 2025-10-31 16:39:10 -05:00
Graham Steffaniakandcontributor 6baa5d1b73 make dev for git bash (#1489)
Co-authored-by: contributor <foss.contributor@gmail.com>
2025-10-31 16:33:47 -05:00
Sarabanga 01569dfa88 Update Russian translations in ru.json (#1484) 2025-10-31 14:58:04 -05:00
Graham Steffaniak 67ff16e2a6 updated without secrets hidden for generated config 2025-10-31 14:11:21 -05:00
Graham Steffaniak 02f28b53bb Fix path breadcrumbs single source (#1483) 2025-10-31 14:10:21 -05:00
Graham Steffaniak 138c4a99b5 fix halloween static asset location 2025-10-31 12:43:30 -05:00
Graham Steffaniak 30d2e8ab44 restore main.go 2025-10-31 12:38:05 -05:00
Graham Steffaniak f48156a8fe restore settings config 2025-10-31 12:36:29 -05:00
Graham Steffaniak 8371e7a2d8 updated with info page on file preview (#1480) 2025-10-31 12:33:47 -05:00
Graham Steffaniak 6d33057cac Revert "cross-platform npm run watch" (#1478) 2025-10-30 20:25:20 -05:00
contributor 3f6e9af56c cross-platform npm run watch (#1473) 2025-10-30 16:03:22 -05:00
contributor 2c3bef143a update makefile linker flags to properly set version and sha (#1474) 2025-10-30 16:03:09 -05:00
Graham Steffaniak 9871d27cb7 updated deps 2025-10-30 15:48:05 -05:00
lps-rocksandGraham Steffaniak 60780c91c6 Fix #1470 (#1472)
Co-authored-by: Graham Steffaniak <42989099+gtsteffaniak@users.noreply.github.com>
2025-10-30 12:50:17 -05:00
Graham Steffaniak 8fa1438ff9 updated with share property fix (#1467) 2025-10-29 19:04:32 -05:00
Kevin B. 39bbf69911 Update spanish translations and add translations for help prompt (#1466) 2025-10-29 17:57:49 -05:00
Pyro b953957c96 Update ru.json (#1464) 2025-10-29 09:51:08 -05:00
Graham Steffaniak 79ead3997e Add new info prompt (#1465) 2025-10-29 09:50:09 -05:00
Graham Steffaniak 53c4fa586f Conditionals check fix (#1462) 2025-10-28 20:37:57 -05:00
Graham Steffaniak 92168ed471 updated only office debugger 2025-10-28 19:39:32 -05:00
Graham Steffaniak 0941f17f8f updated with change password fix 2025-10-28 18:43:14 -05:00
Graham Steffaniak dfaccd8e34 updated with heic convert fix (#1461) 2025-10-28 18:40:21 -05:00
Graham Steffaniak f33d058a12 updated backend logs onlyoffice 2025-10-28 17:07:10 -05:00
Graham Steffaniak e31f4e9c7c updated stable release workflow (#1458) 2025-10-28 14:50:13 -05:00
17 changed files with 92 additions and 37 deletions

No files matched your search

+16 -1
View File
@@ -2,7 +2,18 @@
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).
## v1.0.1
## v1.0.1-stable
**BugFixes**:
- UserDefault always applies to newly created users #1518
- Updating user's own password sometimes doesn't work
- Anonymous Share link with optional password does not allow downloads #1553
- Share options should go in the meta tags #1511
- Unable to select compression format when downloading multiple files/dir via Share link (v1.0.0) #1557
- fixed sidebar clipping on some browsers like safari
- Files show as Download is not available even though it is #1537
## v1.0.1-beta & v1.0.0-stable
**New Features**:
- login icon support added via `frontend.loginIcon` config path variable
@@ -27,7 +38,11 @@ All notable changes to this project will be documented in this file. For commit
- fixed some condition that the halloween background doesn't load properly
- some comments not showing up on config viewer in settings
<<<<<<< HEAD
## v1.0.0-beta
=======
## v1.0.0
>>>>>>> main
**Notes**:
- Enhanced onlyoffice debugger with more wholistic backend logs
+1 -1
View File
@@ -13,7 +13,7 @@ RUN go build -tags mupdf,musl -ldflags="-w -s \
-o filebrowser .
RUN upx filebrowser
FROM node:lts-slim AS nbuild
FROM node:jod-slim AS nbuild
WORKDIR /app
COPY ./frontend/package.json ./
RUN apt-get update && apt-get install -y --no-install-recommends git ca-certificates \
+1 -1
View File
@@ -112,7 +112,7 @@ func runCLI() bool {
}
newUser.Permissions = settings.Config.UserDefaults.Permissions
newUser.Permissions.Admin = asAdmin
err = storage.CreateUser(newUser)
err = storage.CreateUser(newUser, newUser.Permissions)
if err != nil {
logger.Errorf("could not create user: %v", err)
}
+7 -3
View File
@@ -7,6 +7,7 @@ import (
"strings"
"time"
"github.com/gtsteffaniak/filebrowser/backend/common/settings"
"github.com/gtsteffaniak/filebrowser/backend/common/version"
"github.com/gtsteffaniak/go-logger/logger"
"golang.org/x/mod/semver"
@@ -30,6 +31,9 @@ func CheckForUpdates() (updateInfo, error) {
repoOwner := "gtsteffaniak"
repoName := "filebrowser"
currentVersion := version.Version
if currentVersion == "untracked" || currentVersion == "testing" || currentVersion == "" || settings.Config.Env.IsDevMode {
return updateInfo{}, nil
}
splitVersion := strings.Split(currentVersion, "-")
versionCategory := "stable"
if len(splitVersion) > 1 {
@@ -51,13 +55,13 @@ func CheckForUpdates() (updateInfo, error) {
if err := json.NewDecoder(resp.Body).Decode(&tags); err != nil {
return updateInfo{}, err
}
// Find the latest beta version greater than the current one
// Find the latest version greater than the current one that matches the version category
var NewVersion string
for _, tag := range tags {
// Check if the version is valid, is a pre-release, and contains "beta"
// Check if the version is valid and the prerelease contains the version category
if semver.IsValid(tag.Name) && strings.Contains(semver.Prerelease(tag.Name), versionCategory) {
// Check if this tag is greater than the current version
// and also greater than any other beta version we've found so far
// and also greater than any other version we've found so far
if semver.Compare(tag.Name, currentVersion) > 0 {
if NewVersion == "" || semver.Compare(tag.Name, NewVersion) > 0 {
NewVersion = tag.Name
+4
View File
@@ -84,6 +84,10 @@ func (st usersBackend) Update(user *users.User, actorIsAdmin bool, fields ...str
return err
}
if user.LoginMethod == "" {
user.LoginMethod = existingUser.LoginMethod
}
if !slices.Contains(fields, "Password") {
user.Password = existingUser.Password
} else {
+3 -1
View File
@@ -107,7 +107,7 @@ func quickSetup(store *bolt.BoltStore) {
}
// create new user
func CreateUser(userInfo users.User) error {
func CreateUser(userInfo users.User, permissions users.Permissions) error {
newUser := &userInfo
newUser.ShowFirstLogin = settings.Config.Env.IsFirstLoad && newUser.Permissions.Admin
if userInfo.LoginMethod == "password" {
@@ -125,6 +125,8 @@ func CreateUser(userInfo users.User) error {
if userInfo.Username == "" {
return fmt.Errorf("username is required to create a user")
}
settings.ApplyUserDefaults(newUser)
newUser.Permissions = permissions
logger.Debugf("Creating user: %v %v", userInfo.Username, userInfo.Scopes)
// create new home directories
err := userStore.Save(newUser, true, false)
+2 -3
View File
@@ -84,7 +84,7 @@ func setupProxyUser(r *http.Request, data *requestContext, proxyUser string) (*u
if user.Username == config.Auth.AdminUsername {
user.Permissions.Admin = true
}
err = storage.CreateUser(user)
err = storage.CreateUser(user, user.Permissions)
if err != nil {
return nil, err
}
@@ -223,8 +223,7 @@ func signupHandler(w http.ResponseWriter, r *http.Request, d *requestContext) (i
},
LoginMethod: users.LoginMethodPassword,
}
user.Permissions = settings.Config.UserDefaults.Permissions
err := storage.CreateUser(user)
err := storage.CreateUser(user, settings.Config.UserDefaults.Permissions)
if err != nil {
logger.Debug(err.Error())
// Return the actual error message instead of a generic one
+1 -1
View File
@@ -300,7 +300,7 @@ func loginWithOidcUser(w http.ResponseWriter, r *http.Request, username string,
if isAdmin {
user.Permissions.Admin = true
}
err = storage.CreateUser(*user)
err = storage.CreateUser(*user, user.Permissions)
if err != nil {
return http.StatusInternalServerError, err
}
+12 -4
View File
@@ -70,6 +70,8 @@ func handleWithStaticData(w http.ResponseWriter, r *http.Request, d *requestCont
defaultThemeColor := "#455a64"
staticURL := config.Server.BaseURL + "public/static"
description := config.Frontend.Description
title := config.Frontend.Name
// Use custom favicon if configured and validated, otherwise fall back to default
var favicon string
@@ -148,10 +150,16 @@ func handleWithStaticData(w http.ResponseWriter, r *http.Request, d *requestCont
}
}
if d.share.Description != "" {
data["description"] = d.share.Description
description = d.share.Description
}
if d.share.Title != "" {
data["title"] = d.share.Title
title = d.share.Title
}
if d.share.ShareTheme != "" {
theme, ok := config.Frontend.Styling.CustomThemeOptions[d.share.ShareTheme]
if ok {
userSelectedTheme = theme.CssRaw
}
}
if d.share.ShareTheme != "" {
theme, ok := config.Frontend.Styling.CustomThemeOptions[d.share.ShareTheme]
@@ -176,7 +184,7 @@ func handleWithStaticData(w http.ResponseWriter, r *http.Request, d *requestCont
loginIcon := staticURL + "/loginIcon"
data["htmlVars"] = map[string]interface{}{
"title": config.Frontend.Name,
"title": title,
"customCSS": config.Frontend.Styling.CustomCSSRaw,
"userSelectedTheme": userSelectedTheme,
"lightBackground": config.Frontend.Styling.LightBackground,
@@ -188,7 +196,7 @@ func handleWithStaticData(w http.ResponseWriter, r *http.Request, d *requestCont
"color": defaultThemeColor,
"winIcon": staticURL + "/img/icons/mstile-144x144.png",
"appIcon": staticURL + "/img/icons/android-chrome-256x256.png",
"description": config.Frontend.Description,
"description": description,
}
// variables consumed by frontend as json
data["globalVars"] = map[string]interface{}{
+1 -1
View File
@@ -164,7 +164,7 @@ func usersPostHandler(w http.ResponseWriter, r *http.Request, d *requestContext)
return http.StatusBadRequest, errors.ErrEmptyPassword
}
err = storage.CreateUser(req.User)
err = storage.CreateUser(req.User, req.User.Permissions)
if err != nil {
return http.StatusInternalServerError, err
}
+3 -2
View File
@@ -1,6 +1,6 @@
import { fetchURL, adjustedData } from './utils'
import { getApiPath, doubleEncode, getPublicApiPath } from '@/utils/url.js'
import { mutations } from '@/store'
import { mutations,state } from '@/store'
import { notify } from '@/notify'
import { globalVars } from '@/utils/constants'
@@ -101,7 +101,8 @@ export function download(format, files, shareHash = "") {
const apiPath = getApiPath(shareHash == "" ? 'api/raw' : 'public/api/raw', {
files: fileargs,
algo: format,
hash: shareHash
hash: shareHash,
...(state.share.token && { token: state.share.token })
})
const url = window.origin + apiPath
+1 -1
View File
@@ -261,7 +261,7 @@ export default {
// Add keyboard event listener for "/" to activate search
this.handleKeydown = (event) => {
if (event.key === '/' && !state.isSearchActive) {
if (event.key === '/' && !state.isSearchActive && getters.currentPrompt() === null) {
event.preventDefault();
this.open();
}
@@ -27,7 +27,8 @@
</div>
<div v-if="!shareInfo.disableDownload" class="share__box__element share__box__center">
<button class="button button--flat clickable" @click="goToDownload()"> {{ $t("buttons.download") }} </button>
<button class="button button--flat clickable" @click="goToDownload()"> {{ $t("buttons.download") }}
</button>
</div>
</div>
@@ -41,7 +42,7 @@
<script>
import { publicApi } from "@/api";
import { state, getters } from "@/store";
import { state, getters, mutations } from "@/store";
import { getHumanReadableFilesize } from "@/utils/filesizes";
import { getTypeInfo } from "@/utils/mimetype";
import QrcodeVue from "qrcode.vue";
@@ -115,13 +116,29 @@ export default {
},
methods: {
goToDownload() {
const downloadLink = publicApi.getDownloadURL({
path: "/",
hash: state.share.hash,
token: state.share.token,
inline: false,
}, [state.req.path]);
window.open(downloadLink, "_blank");
if (state.req.items.length > 1) {
mutations.showHover({
name: "download",
confirm: (format) => {
mutations.closeHovers();
const downloadLink = publicApi.getDownloadURL({
path: "/",
hash: state.share.hash,
token: state.share.token,
inline: false,
}, [state.req.path]);
window.open(downloadLink + "&format=" + format, "_blank");
},
});
} else {
const downloadLink = publicApi.getDownloadURL({
path: "/",
hash: state.share.hash,
token: state.share.token,
inline: false,
}, [state.req.path]);
window.open(downloadLink, "_blank");
}
},
getShareLink() {
return publicApi.getShareURL({
+1 -3
View File
@@ -514,9 +514,7 @@ button.action {
}
.headline-card {
padding: 1em;
overflow: hidden !important;
min-height: fit-content;
padding: 0.5em;
}
.person-button {
+12 -2
View File
@@ -13,13 +13,23 @@ export default function downloadFiles(items) {
}
if (getters.isShare()) {
// Perform download without opening a new window
startDownload(null, items, state.share.hash);
if (getters.isSingleFileSelected()) {
startDownload(null, items, state.share.hash);
} else {
// Multiple files download with user confirmation
mutations.showHover({
name: "download",
confirm: (format) => {
mutations.closeHovers();
startDownload(format, items, state.share.hash);
},
});
}
return;
}
if (getters.isSingleFileSelected()) {
startDownload(null, items);
return;
} else {
// Multiple files download with user confirmation
mutations.showHover({
-3
View File
@@ -967,9 +967,6 @@ export default {
mutations.setMultiple(val == true);
showMultipleSelection();
},
openSearch() {
this.currentPrompt = "search";
},
windowsResize: throttle(function () {
this.colunmsResize();
this.width = window.innerWidth;
+1 -1
View File
@@ -88,7 +88,7 @@ export default {
},
computed: {
permissions() {
return state.user.permissions;
return getters.permissions();
},
showImage() {
if (state.req.type == "image/heic" || state.req.type == "image/heif") {