Compare commits

...

116 Commits

Author SHA1 Message Date
865ab950bf nodejs: request for a document when opening on client 2026-03-27 12:10:40 +03:00
500d1c24e4 fix(nodejs): correct formidable 4 filepath in forcesave 2026-03-27 12:10:39 +03:00
a796fd94e5 fix(nodejs): saving file from buffer forceSave 2026-03-27 12:10:38 +03:00
89940918b8 fix(nodejs): onSaveDocument only when file is opened from buffer 2026-03-27 12:09:42 +03:00
e60de8be91 fix(nodejs): using formidable to get opened from buffer file data 2026-03-11 15:11:13 +03:00
d0af413197 feat(nodejs): saving files opened from buffer with forcesave endpoint 2026-03-11 15:11:13 +03:00
bd1cc16793 feat(nodejs): opening and saving document from buffer 2026-03-11 15:10:56 +03:00
7b9623ce6a Merge remote-tracking branch 'remotes/origin/release/v9.4.0' into develop
# Conflicts:
#	.gitmodules
#	CHANGELOG.md
#	web/documentserver-example/nodejs/public/assets/document-formats
#	web/documentserver-example/nodejs/public/assets/plugin-aiautofill
2026-03-11 15:08:39 +03:00
b43af4a42b deps(php-laravel): bump laravel/pint to 1.28.0
# Conflicts:
#	web/documentserver-example/php-laravel/composer.lock
2026-03-11 13:51:04 +03:00
8778d492a1 Merge remote-tracking branch 'remotes/origin/release/1.15.0' into develop
# Conflicts:
#	web/documentserver-example/python/.check-licenses.yml
2026-03-11 13:48:38 +03:00
3c7aa7707c Merge pull request 'refactor(php-laravel): lint fix' from 1.15-lint-fix into release/1.15.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/document-server-integration/pulls/100
2026-03-11 10:47:19 +00:00
b528be73d8 refactor(php-laravel): lint fix 2026-03-11 17:22:04 +07:00
dc9ff1ae4a ci: fix licenses-go.yml (added step Set up Go) 2026-03-11 13:14:19 +03:00
91551f4664 feat: update python/.check-licenses.yml 2026-03-11 13:07:25 +03:00
3fa078d3ef Merge pull request 'revert firebase/php-jwt from 7.0' from revert-php-jwt into develop
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/document-server-integration/pulls/98
2026-03-06 13:05:26 +00:00
6076181db4 revert firebase/php-jwt from 7.0 2026-03-06 17:32:42 +07:00
9a76a3100f Merge pull request 'update-dependencies(java-spring, nodejs, php, php-laravel)' from update-dependencies into develop
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/document-server-integration/pulls/97
2026-03-06 09:04:11 +00:00
f52ae4558e build(php-laravel): bump rollup to 4.59.0 2026-03-06 14:55:41 +07:00
26a5809bc7 build(php-laravel): bump firebase/php-jwt to 7.0 2026-03-06 14:45:26 +07:00
a080a156b0 build(php-laravel): onlyoffice/docs-integration-sdk 1.3.1 2026-03-06 14:43:23 +07:00
1dbca4aeb3 build(php): bump firebase/php-jwt to 7.0.0 2026-03-06 14:20:48 +07:00
0652ae6679 build(nodejs): audit fix high vulnerabilities 2026-03-06 14:14:58 +07:00
1574e2c550 build(java-spring): bump com.fasterxml.jackson.core:jackson-core to 2.18.6 2026-03-06 14:02:56 +07:00
9d7993ecba Merge remote-tracking branch 'remotes/origin/release/1.15.0' into develop 2026-03-04 18:32:45 +03:00
da663c951e Merge pull request 'feature/aiautofiller' from feature/aiautofiller into release/1.15.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/document-server-integration/pulls/96
2026-03-04 15:32:02 +00:00
967287ab44 nodejs: ai-autofill v1.0.0 2026-03-04 18:30:10 +03:00
d236bc0bcc nodejs: update plugin ai-autofill guid (v0.1.3) 2026-03-04 18:03:31 +03:00
333da622b3 update autofill plugin 2026-03-04 18:03:31 +03:00
19967b0940 nodejs: autofill auto started on Fill mode only 2026-03-04 18:03:31 +03:00
b0224993a2 update autofill plugin 2026-03-04 18:03:31 +03:00
449c6b55e6 nodejs: fix lint 2026-03-04 18:03:31 +03:00
b39e5f4787 fix: disable autofill plugin for 'comment' mode 2026-03-04 18:03:30 +03:00
9d8bcda58b nodejs: update autofill plugin 2026-03-04 18:03:30 +03:00
f3a71ee26b nodejs: anonymous without ai autofill 2026-03-04 18:03:30 +03:00
480d68148d nodejs: plugin data update 2026-03-04 18:03:30 +03:00
8b32812744 nodejs: plugin for pdf only 2026-03-04 18:03:30 +03:00
edab397c98 fix: fallback to default plugins 2026-03-04 18:03:30 +03:00
ab90b3eb32 fix(plugins): merge configs with in-line plugin config 2026-03-04 18:03:29 +03:00
fdee619bb0 fix: use plugin path without build 2026-03-04 18:03:29 +03:00
15f3f531f0 chore: added additional data 2026-03-04 18:03:29 +03:00
02be0dd321 deps: bumped autofill plugin 2026-03-04 18:03:29 +03:00
f8fbf35244 chore: update plugin submodule 2026-03-04 18:03:29 +03:00
f6227c8bc9 chore: new sample data 2026-03-04 18:03:29 +03:00
8301c63826 refactor: move data to json, build path to the plugin from config 2026-03-04 18:03:28 +03:00
47c737c431 chore: strict check 2026-03-04 18:03:28 +03:00
d7b1a7f34f fix: do not autostart non edit mode 2026-03-04 18:03:28 +03:00
8e4dc58bf9 feat: initial aiautofiller example 2026-03-04 18:03:28 +03:00
09e41f4c3d Merge remote-tracking branch 'remotes/origin/fix-1.15' into release/1.15.0 2026-03-03 13:18:50 +03:00
4bc09870a8 fix(php): null optional arguments in convert method. Fix Bug 80425 2026-03-03 16:29:17 +07:00
04aae40b66 fix: enable edit converted button for editable exts. Fix Bug 80381 2026-03-03 14:55:51 +07:00
d13eb90f38 delete FileChoiceUrl 2026-03-02 17:58:07 +03:00
de2b2e0c59 Merge remote-tracking branch 'remotes/origin/release/1.15.0' into develop 2026-02-24 18:55:34 +03:00
67f453c4e0 formats v9.3 2026-02-24 18:48:44 +03:00
9878583600 nodejs: conversion to md 2026-02-24 18:46:32 +03:00
2fb6246f80 nodejs: support tsv 2026-02-24 18:46:06 +03:00
829f1b4226 update documentserver version to 9.3 in compose files 2026-02-24 18:44:45 +03:00
8271719817 Merge remote-tracking branch 'remotes/origin/feature/aiautofiller' into release/v9.3.0 2026-02-24 15:05:47 +03:00
395e2d1299 nodejs: update plugin ai-autofill guid (v0.1.3) 2026-02-24 14:59:41 +03:00
7d9d2fdf3d nodejs: conversion to md 2026-02-19 09:44:30 +03:00
3a0a713c5a Merge pull request 'update documentserver version to 9.3 in compose files' from 9.3.0-update-compose into release/v9.3.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/document-server-integration/pulls/93
2026-02-18 06:08:08 +00:00
8d1e0ff63d nodejs: format json 2026-02-18 09:06:55 +03:00
496092c09f update documentserver version to 9.3 in compose files 2026-02-17 15:48:09 +07:00
c0a870458b Merge remote-tracking branch 'remotes/origin/feature/aiautofiller' into release/v9.3.0 2026-02-16 09:46:28 +03:00
35da4e1de1 update autofill plugin 2026-02-16 09:46:03 +03:00
238cf93a22 Merge pull request 'resolve release/1.15.0 to develop merge conflict' from 1.15-conflict into develop
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/document-server-integration/pulls/92
2026-02-13 13:45:16 +00:00
10bc689f13 Merge remote-tracking branch 'remotes/origin/release/1.15.0' into 1.15-conflict 2026-02-13 16:02:58 +03:00
d532f3d8de nodejs: fix lint 2026-02-13 16:01:14 +03:00
59a8e2f63d fix(go): merge lossy-edit bugfix and new formats handling 2026-02-13 16:35:15 +07:00
0bdaa40036 Merge pull request 'bugfix-1.15' from bugfix-1.15 into release/1.15.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/document-server-integration/pulls/91
2026-02-13 09:03:33 +00:00
a60fd14daf increase default upload file size to 100 MB. Fix Bug 79567 2026-02-12 13:49:42 +07:00
f55196a1b2 fix(ruby): resolve fillform urls with proxy. Fix Bug 79584 2026-02-12 13:01:28 +07:00
11974256a9 Merge remote-tracking branch 'remotes/origin/feature/aiautofiller' into release/v9.3.0 2026-02-11 13:21:25 +03:00
f69fabb44a nodejs: autofill auto started on Fill mode only 2026-02-11 13:21:05 +03:00
bc434dea55 fix(ruby): correct platforms in gemfile.lock 2026-02-11 16:08:37 +07:00
af895ee2e6 Merge pull request 'update-deps' from update-deps into develop
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/document-server-integration/pulls/90
2026-02-11 06:51:53 +00:00
8c725214af fix: files list height. Fix Bug 71461 2026-02-10 17:35:30 +07:00
dd513194bb build(php-laravel): bump psy/psysh to 0.12.19 2026-02-10 14:41:15 +07:00
6069c017c0 build(php-laravel): bump phpunit/phpunit to 11.5.50 2026-02-10 14:27:34 +07:00
fbc3d47607 build(nodejs): bump fast-xml-parser to 5.3.4 2026-02-10 14:17:24 +07:00
f8222b1052 build(php): bump phpunit/phpunit to 10.5.62 2026-02-10 14:14:50 +07:00
4c331d56d7 Merge pull request 'bugfix-1.15' from bugfix-1.15 into release/1.15.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/document-server-integration/pulls/89
2026-02-06 12:12:22 +00:00
ea3667174f fix(java-spring): correct roles for named users. Fix Bug 79808 2026-02-06 18:34:27 +07:00
ada17c99f7 fix(nodejs): use path module to get file basename. Fix Bug 79810 2026-02-06 17:39:09 +07:00
7a1cc7cbdc fix(go): move anonymous to the end of users list. Fix Bug 79785 2026-02-06 13:09:18 +07:00
976d7072a9 Merge remote-tracking branch 'remotes/origin/feature/aiautofiller' into release/v9.3.0 2026-02-04 13:33:42 +03:00
8272c83660 update autofill plugin 2026-02-04 13:33:12 +03:00
9a7350e169 Merge pull request 'bugfix-release-1.15' from bugfix-release-1.15 into release/1.15.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/document-server-integration/pulls/88
2026-02-02 11:47:23 +00:00
0c33288120 fix(go): allow edit files with lossy-edit action. Fix Bug 79626 2026-02-02 16:26:18 +07:00
aff50cca4a fix(ruby): string forcesavetype check. Fix Bug 79584 2026-02-02 16:26:18 +07:00
7aca0edfed fix(php-laravel): correct conversion of uploaded files with password. Fix Bug 79569 2026-02-02 16:26:18 +07:00
2a3bcc0f67 fix(php-laravel): increase max upload file size and fix env variable. Fix Bug 79567 2026-02-02 16:26:18 +07:00
1da1dec76c fix(go): correct processing of document passwords 2026-02-02 16:25:45 +07:00
c73aae1c4b Merge pull request 'fix: disable autofill plugin for 'comment' mode' from feature/aiautofiller into release/v9.3.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/document-server-integration/pulls/87
2026-01-30 08:39:00 +00:00
4340c34c23 nodejs: fix lint 2026-01-30 11:38:01 +03:00
3eff9b469b fix: disable autofill plugin for 'comment' mode 2026-01-30 11:37:20 +03:00
701d65dfaf Merge pull request 'build(nodejs): bump qs to 6.14.1' from nodejs-bump-qs into develop
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/document-server-integration/pulls/86
2026-01-27 07:09:23 +00:00
5fa447b489 build(nodejs): bump qs to 6.14.1 2026-01-27 13:07:17 +07:00
eabda30bf7 Merge branch 'feature/aiautofiller' into release/v9.3.0
# Conflicts:
#	.gitmodules
2026-01-21 17:18:43 +03:00
548f24aaff nodejs: update autofill plugin 2026-01-21 17:16:24 +03:00
c1ec722b9f nodejs: anonymous without ai autofill 2026-01-21 17:16:24 +03:00
92a1aff932 nodejs: plugin data update 2026-01-21 17:16:23 +03:00
4fe6e961d3 nodejs: plugin for pdf only 2026-01-21 17:16:23 +03:00
e612717b0b fix: fallback to default plugins 2026-01-21 17:16:23 +03:00
e0e0bc96bf fix(plugins): merge configs with in-line plugin config 2026-01-21 17:16:23 +03:00
c3739fb08a fix: use plugin path without build 2026-01-21 17:16:23 +03:00
c22dbea9bf chore: added additional data 2026-01-21 17:16:23 +03:00
606a14ce8f deps: bumped autofill plugin 2026-01-21 17:16:22 +03:00
4cb50c752b chore: update plugin submodule 2026-01-21 17:16:22 +03:00
c304b5f526 chore: new sample data 2026-01-21 17:16:22 +03:00
f02726d138 refactor: move data to json, build path to the plugin from config 2026-01-21 17:16:22 +03:00
85b0fdc33f chore: strict check 2026-01-21 17:16:22 +03:00
0e8c99aaab fix: do not autostart non edit mode 2026-01-21 17:16:21 +03:00
5a4b47c4bd feat: initial aiautofiller example 2026-01-21 17:16:21 +03:00
9775c8e175 nodejs: support tsv 2026-01-21 17:02:57 +03:00
c092db2566 Merge pull request 'fix(java): correct dataInsertImage object' from java-fix-data-insert-image into develop
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/document-server-integration/pulls/85
2026-01-20 12:34:35 +00:00
873692e038 fix(java): correct dataInsertImage object 2026-01-20 17:40:21 +07:00
89 changed files with 3162 additions and 1680 deletions

View File

@ -15,6 +15,10 @@ jobs:
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version: '1.23'
- name: Submodule Update
run: |
cd ${{ github.workspace }}

3
.gitmodules vendored
View File

@ -5,6 +5,9 @@
[submodule "web/documentserver-example/nodejs/public/assets/document-formats"]
path = web/documentserver-example/nodejs/public/assets/document-formats
url = https://github.com/ONLYOFFICE/document-formats
[submodule "web/documentserver-example/nodejs/public/assets/plugin-aiautofill"]
path = web/documentserver-example/nodejs/public/assets/plugin-aiautofill
url = https://github.com/ONLYOFFICE/plugin-aiautofill.git
[submodule "web/documentserver-example/csharp-mvc/assets/document-templates"]
path = web/documentserver-example/csharp-mvc/assets/document-templates
url = https://github.com/ONLYOFFICE/document-templates

View File

@ -17,8 +17,9 @@
- nodejs: wopi UserCanOnlyComment
## 1.15.0
- nodejs: added AI Auto Fill Plugin
- php-laravel: fix custom jwt header
- formats for ds v9.1
- formats for ds v9.3
- user role
- start filling
- update demo files

View File

@ -143,6 +143,7 @@
.scroll-table-body {
top: 31px;
height: calc(100% - 34px);
}
footer {
@ -748,6 +749,7 @@
.scroll-table-body {
top: 36px;
height: calc(100% - 34px);
}
.scroll-table-body tr:first-child {

View File

@ -844,6 +844,7 @@ footer table tr td:first-child {
position: absolute;
right: 0;
top: 71px;
height: calc(100% - 130px);
scrollbar-color: #D0D5DA transparent;
scrollbar-width: thin;
}

View File

@ -398,7 +398,9 @@ if (typeof jQuery != "undefined") {
jq("#downloadConverted").removeClass("disable");
jq("#hiddenFileName").attr("data",response.filename);
if (response.error !== "FileTypeIsNotSupported") {
jq("#beginEditConverted").removeClass("disable");
if (formatManager.isEditable(fileExt)) {
jq("#beginEditConverted").removeClass("disable");
}
jq("#beginViewConverted").removeClass("disable");
jq("#downloadConverted").attr("data","fromStorage");
} else {

View File

@ -143,6 +143,7 @@
.scroll-table-body {
top: 31px;
height: calc(100% - 34px);
}
footer {
@ -748,6 +749,7 @@
.scroll-table-body {
top: 36px;
height: calc(100% - 34px);
}
.scroll-table-body tr:first-child {

View File

@ -848,6 +848,7 @@ footer a:hover {
position: absolute;
right: 0;
top: 71px;
height: calc(100% - 130px);
scrollbar-color: #D0D5DA transparent;
scrollbar-width: thin;
}

View File

@ -398,7 +398,9 @@ if (typeof jQuery != "undefined") {
jq("#downloadConverted").removeClass("disable");
jq("#hiddenFileName").attr("data",response.filename);
if (response.error !== "FileTypeIsNotSupported") {
jq("#beginEditConverted").removeClass("disable");
if (formatManager.isEditable(fileExt)) {
jq("#beginEditConverted").removeClass("disable");
}
jq("#beginViewConverted").removeClass("disable");
jq("#downloadConverted").attr("data","fromStorage");
} else {

View File

@ -79,7 +79,9 @@ func (srv *DefaultServerEndpointsHandler) Convert(w http.ResponseWriter, r *http
return
}
newUrl, newExt, err := srv.ConversionManager.GetConverterUri(fileUrl, fileExt, toExt, key, true, filename)
newUrl, newExt, err := srv.ConversionManager.GetConverterUri(
fileUrl, fileExt, toExt, key, true, filename, payload.Filepass,
)
if err != nil {
response.Error = err.Error()
srv.logger.Errorf("File conversion error: %s", err.Error())

View File

@ -74,7 +74,10 @@ type JwtManager interface {
type ConversionManager interface {
GetInternalExtension(fileType string) string
GetConverterUri(docUri, fromExt, toExt, docKey string, isAsync bool, title string) (string, string, error)
GetConverterUri(
docUri, fromExt, toExt, docKey string,
isAsync bool, title string, filePass string,
) (string, string, error)
}
type CommandManager interface {

View File

@ -69,6 +69,7 @@ func (cm DefaultConversionManager) GetConverterUri(
docKey string,
isAsync bool,
title string,
filePass string,
) (string, string, error) {
if fromExt == "" {
fromExt = utils.GetFileExt(docUri, true)
@ -81,6 +82,7 @@ func (cm DefaultConversionManager) GetConverterUri(
Title: title,
Key: docKey,
Async: isAsync,
Password: filePass,
RegisteredClaims: jwt.RegisteredClaims{
ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Minute * cm.config.JwtExpiresIn)),
IssuedAt: jwt.NewNumericDate(time.Now()),

View File

@ -78,7 +78,7 @@ func (dm DefaultDocumentManager) sanitizeEditorParameters(parameters *managers.E
}
actions := dm.FormatManager.GetActions(utils.GetFileExt(parameters.Filename, true))
parameters.CanEdit = slices.Contains(actions, "edit")
parameters.CanEdit = slices.Contains(actions, "edit") || slices.Contains(actions, "lossy-edit")
if parameters.CanEdit && parameters.PermissionsMode != "view" {
parameters.Mode = "edit"

View File

@ -30,23 +30,6 @@ type DefaultUserManager struct {
func NewDefaultUserManager(logger *zap.SugaredLogger) managers.UserManager {
users := []models.User{
{
Id: "uid-0",
Username: "",
Email: "",
Group: "",
ReviewGroups: nil,
CommentGroups: nil,
UserInfoGroups: nil,
Favorite: -1,
DeniedPermissions: []string{"protect"},
Description: descriptionUser0,
Templates: false,
Avatar: false,
Goback: nil,
Close: nil,
Roles: []string{},
},
{
Id: "uid-1",
Username: "John Smith",
@ -116,6 +99,23 @@ func NewDefaultUserManager(logger *zap.SugaredLogger) managers.UserManager {
},
Roles: []string{"role"},
},
{
Id: "uid-0",
Username: "",
Email: "",
Group: "",
ReviewGroups: nil,
CommentGroups: nil,
UserInfoGroups: nil,
Favorite: -1,
DeniedPermissions: []string{"protect"},
Description: descriptionUser0,
Templates: false,
Avatar: false,
Goback: nil,
Close: nil,
Roles: []string{},
},
}
return &DefaultUserManager{
users,
@ -197,7 +197,7 @@ func (um DefaultUserManager) GetUserById(uid string) (models.User, error) {
}
}
return um.users[0], nil
return um.GetUserById("uid-0")
}
func (um DefaultUserManager) GetUserInfoById(uid string, serverAddress string) models.UserInfo {

View File

@ -99,6 +99,7 @@ type ConvertRequestPayload struct {
Key string `json:"key"`
Async bool `json:"async"`
JwtToken string `json:"token,omitempty"`
Password string `json:"password"`
jwt.RegisteredClaims
}

View File

@ -58,7 +58,6 @@ type EditorConfig struct {
Mode string `json:"mode,omitempty"`
ActionLink string `json:"actionLink,omitempty"`
CreateUrl string `json:"createUrl,omitempty"`
FileChoiceUrl string `json:"fileChoiceUrl,omitempty"`
CoEditing map[string]interface{} `json:"coEditing,omitempty"`
Plugins map[string]interface{} `json:"plugins,omitempty"`
Templates []Template `json:"templates,omitempty"`

View File

@ -130,7 +130,7 @@ if (typeof jQuery !== "undefined") {
var responseText = data.responseText;
var response = jq.parseJSON(responseText);
if (response.error) {
if (response.error.includes("Incorrect password")) {
if (response.error.includes("-5")) {
jq(".current").removeClass("current");
jq("#step2").addClass("error");
jq("#blockPassword").show();
@ -385,7 +385,9 @@ if (typeof jQuery !== "undefined") {
jq("#downloadConverted").removeClass("disable");
jq("#hiddenFileName").attr("data",response.filename);
if (response.error !== "FileTypeIsNotSupported") {
jq("#beginEditConverted").removeClass("disable");
if (formatManager.isEditable(fileExt)) {
jq("#beginEditConverted").removeClass("disable");
}
jq("#beginViewConverted").removeClass("disable");
jq("#downloadConverted").attr("data","fromStorage");
} else {

View File

@ -143,6 +143,7 @@
.scroll-table-body {
top: 31px;
height: calc(100% - 34px);
}
footer {
@ -747,6 +748,7 @@
.scroll-table-body {
top: 36px;
height: calc(100% - 34px);
}
.scroll-table-body tr:first-child {

View File

@ -845,6 +845,7 @@ footer table tr td:first-child {
position: absolute;
right: 0;
top: 71px;
height: calc(100% - 130px);
scrollbar-color: #D0D5DA transparent;
scrollbar-width: thin;
}

View File

@ -59,7 +59,7 @@
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.15.0</version>
<version>2.18.6</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>

View File

@ -68,7 +68,7 @@ public class ExampleData {
"Can view chat",
"Has an avatar",
"Can submit forms",
"Has no roles",
"Has role 'Anyone'",
"Can start filling"
);
@ -85,7 +85,7 @@ public class ExampleData {
"Can view chat",
"Has an avatar",
"Can't submit forms",
"Has role 'Anyone'",
"Has role 'role'",
"Can start filling"
);
@ -105,7 +105,7 @@ public class ExampleData {
"Can't close history",
"Can't restore the file version",
"Can't submit forms",
"Has role 'role'",
"Has no roles",
"Can start filling"
);
@ -114,19 +114,19 @@ public class ExampleData {
"", List.of(FilterState.NULL.toString()), List.of(FilterState.NULL.toString()),
List.of(FilterState.NULL.toString()), List.of(FilterState.NULL.toString()),
List.of(FilterState.NULL.toString()), false, true, true, true,
new Goback(null, false), new Close(null, false), null, true);
new Goback(null, false), new Close(null, false), List.of("Anyone"), true);
// create user 2 with the specified parameters
userService.createUser("Mark Pottato", "pottato@example.com", descriptionUserSecond,
"group-2", List.of("", "group-2"), List.of(FilterState.NULL.toString()),
List.of("group-2", ""), List.of("group-2"), List.of("group-2", ""), true, true,
true, true, new Goback("Go to Documents", null), new Close(null, true), List.of("Anyone"), false);
true, true, new Goback("Go to Documents", null), new Close(null, true), List.of("role"), false);
// create user 3 with the specified parameters
userService.createUser("Hamish Mitchell", null, descriptionUserThird,
"group-3", List.of("group-2"), List.of("group-2", "group-3"), List.of("group-2"),
new ArrayList<>(), List.of("group-2"), null, true, true, false,
null, new Close(null, true), List.of("role"), false);
null, new Close(null, true), null, false);
// create user 0 with the specified parameters
userService.createUser("Anonymous", null, descriptionUserZero, "",

View File

@ -33,8 +33,8 @@ spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
hibernate.ddl-auto
spring.h2.console.enabled=true
spring.h2.console.path=/h2
spring.servlet.multipart.max-file-size=5MB
spring.servlet.multipart.max-request-size=5MB
spring.servlet.multipart.max-file-size=100MB
spring.servlet.multipart.max-request-size=100MB
url.index=/
url.converter=/converter

View File

@ -130,6 +130,7 @@
.scroll-table-body {
top: 31px;
height: calc(100% - 34px);
}
footer {
@ -740,6 +741,7 @@
.scroll-table-body {
top: 36px;
height: calc(100% - 34px);
}
.scroll-table-body tr:first-child {

View File

@ -846,6 +846,7 @@ footer table tr td:first-child {
position: absolute;
right: 0;
top: 71px;
height: calc(100% - 130px);
scrollbar-color: #D0D5DA transparent;
scrollbar-width: thin;
}

View File

@ -390,7 +390,9 @@ if (typeof jQuery !== "undefined") {
jq("#downloadConverted").removeClass("disable");
jq("#hiddenFileName").attr("data",response.filename);
if (response.error !== "FileTypeIsNotSupported") {
jq("#beginEditConverted").removeClass("disable");
if (formatManager.isEditable(fileExt)) {
jq("#beginEditConverted").removeClass("disable");
}
jq("#beginViewConverted").removeClass("disable");
jq("#downloadConverted").attr("data","fromStorage");
} else {

View File

@ -79,6 +79,7 @@ public class EditorServlet extends HttpServlet {
// an image that will be inserted into the document
Map<String, Object> dataInsertImage = new HashMap<>();
Map<String, Object>[] images = new HashMap[1];
images[0] = new HashMap<>();
images[0].put("fileType", "svg");
images[0].put("url", DocumentManager.getServerUrl(true) + "/css/img/logo.svg");
if (isEnableDirectUrl) {

View File

@ -1,6 +1,6 @@
version=1.15.0
filesize-max=5242880
filesize-max=104857600
storage-folder=app_data
filename-max=50
enable-forgotten=TRUE

View File

@ -142,6 +142,7 @@
.scroll-table-body {
top: 31px;
height: calc(100% - 34px);
}
footer {
@ -734,6 +735,7 @@
.scroll-table-body {
top: 36px;
height: calc(100% - 34px);
}
.scroll-table-body tr:first-child {

View File

@ -851,6 +851,7 @@ footer table tr td:first-child {
position: absolute;
right: 0;
top: 71px;
height: calc(100% - 130px);
scrollbar-color: #D0D5DA transparent;
scrollbar-width: thin;
}

View File

@ -397,7 +397,9 @@ if (typeof jQuery !== "undefined") {
jq("#downloadConverted").removeClass("disable");
jq("#hiddenFileName").attr("data",response.filename);
if (response.error !== "FileTypeIsNotSupported") {
jq("#beginEditConverted").removeClass("disable");
if (formatManager.isEditable(fileExt)) {
jq("#beginEditConverted").removeClass("disable");
}
jq("#beginViewConverted").removeClass("disable");
jq("#downloadConverted").attr("data","fromStorage");
} else {

View File

@ -17,6 +17,7 @@
*/
// connect the necessary packages and modules
const crypto = require('crypto');
const express = require('express');
const path = require('path');
const favicon = require('serve-favicon');
@ -28,17 +29,16 @@ const config = require('config');
const mime = require('mime');
const urllib = require('urllib');
const urlModule = require('url');
const { emitWarning } = require('process');
const DocManager = require('./helpers/docManager');
const documentService = require('./helpers/documentService');
const fileUtility = require('./helpers/fileUtility');
const wopiApp = require('./helpers/wopi/wopiRouting');
const users = require('./helpers/users');
const dataAutofill = require('./config/data.json');
const configServer = config.get('server');
const siteUrl = configServer.get('siteUrl');
const enableForgotten = configServer.get('enableForgotten');
const fileChoiceUrl = configServer.has('fileChoiceUrl') ? configServer.get('fileChoiceUrl') : '';
const cfgSignatureEnable = configServer.get('token.enable');
const cfgSignatureUseForRequest = configServer.get('token.useforrequest');
const cfgSignatureAuthorizationHeader = configServer.get('token.authorizationHeader');
@ -221,6 +221,18 @@ app.get('/download', (req, res) => { // define a handler for downloading files
filestream.pipe(res); // send file information to the response by streams
});
app.get('/data', (req, res) => { // define a handler for getting sample ai form data
if (!req.query.code) { // integration must validate incoming codes and generate new ones for each data request
res.sendStatus(403);
return;
}
res.send({
data: dataAutofill,
code: crypto.randomBytes(16).toString('hex'),
});
});
app.get('/history', (req, res) => {
req.DocManager = new DocManager(req, res);
if (cfgSignatureEnable && cfgSignatureUseForRequest) {
@ -283,7 +295,7 @@ app.post('/upload', (req, res) => { // define a handler for uploading files
if (err) { // if an error occurs
// DocManager.cleanFolderRecursive(uploadDirTmp, true); // clean the folder with temporary files
res.writeHead(200, { 'Content-Type': 'application/json' });
res.write(`{ "error": "${err.message}"}`);
res.write(`{ "error": "${err.message}" }`);
res.end();
return;
}
@ -292,7 +304,7 @@ app.post('/upload', (req, res) => { // define a handler for uploading files
if (file === undefined) { // if file parameter is undefined
res.writeHead(200, { 'Content-Type': 'application/json' });
res.write('{ "error": "Uploaded file not found"}');
res.write('{ "error": "Uploaded file not found" }');
res.end();
return;
}
@ -303,7 +315,7 @@ app.post('/upload', (req, res) => { // define a handler for uploading files
if (fileSizeLimit < file.size || file.size <= 0) {
// DocManager.cleanFolderRecursive(uploadDirTmp, true); // clean the folder with temporary files
res.writeHead(200, { 'Content-Type': 'application/json' });
res.write('{ "error": "File size is incorrect"}');
res.write('{ "error": "File size is incorrect" }');
res.end();
return;
}
@ -315,7 +327,7 @@ app.post('/upload', (req, res) => { // define a handler for uploading files
if (exts.indexOf(curExt) === -1 || fileUtility.getFormatActions(curExt).length === 0) {
// DocManager.cleanFolderRecursive(uploadDirTmp, true); // if not, clean the folder with temporary files
res.writeHead(200, { 'Content-Type': 'application/json' });
res.write('{ "error": "File type is not supported"}');
res.write('{ "error": "File type is not supported" }');
res.end();
return;
}
@ -324,7 +336,7 @@ app.post('/upload', (req, res) => { // define a handler for uploading files
// DocManager.cleanFolderRecursive(uploadDirTmp, true); // clean the folder with temporary files
res.writeHead(200, { 'Content-Type': 'application/json' });
if (error) { // if an error occurs
res.write(`{ "error": "${error}"}`); // write an error message to the response
res.write(`{ "error": "${error}" }`); // write an error message to the response
} else {
// otherwise, write a new file name to the response
res.write(`{ "filename": "${file.originalFilename}", "documentType": "${documentType}" }`);
@ -557,7 +569,7 @@ app.delete('/file', (req, res) => { // define a handler for removing file
}
res.writeHead(200, { 'Content-Type': 'application/json' });
res.write('{"success":true}');
res.write('{ "success":true }');
} catch (ex) {
console.log(ex);
res.writeHead(200, { 'Content-Type': 'text/plain' });
@ -708,12 +720,38 @@ app.put('/restore', async (req, res) => { // define a handler for restore file v
res.end();
});
app.post('/forcesave', async (req, res) => {
req.DocManager = new DocManager(req, res);
const uAddress = req.query.useraddress;
const fName = fileUtility.getFileName(req.query.filename);
if (req.headers['content-type'] === 'application/octet-stream') {
const form = new formidable.IncomingForm();
form.parse(req, async (err, fields, files) => {
if (err) {
res.write('{"error":1, "message":"document data is empty"}');
res.end();
return;
}
const filePath = files.file.filepath || files.file[0].filepath;
const data = fileSystem.readFileSync(filePath);
await req.DocManager.forcesaveFile(data, fName, fileUtility.getFileExtension(fName), uAddress);
fileSystem.unlinkSync(filePath);
res.write('{"error":0}');
res.end();
});
} else {
res.write('{"error":0}');
res.end();
}
});
app.post('/track', async (req, res) => { // define a handler for tracking file changes
req.DocManager = new DocManager(req, res);
let uAddress = req.query.useraddress;
let fName = fileUtility.getFileName(req.query.filename);
let version = 0;
// track file changes
const processTrack = async function processTrack(response, bodyTrack, fileNameTrack, userAddressTrack) {
@ -729,7 +767,7 @@ app.post('/track', async (req, res) => { // define a handler for tracking file c
if (!req.DocManager.existsSync(req.DocManager.storagePath(fileName, userAddress))) {
console.log(`callbackProcessSave error: name = ${fileName} userAddress = ${userAddress} is not exist`);
response.setHeader('Content-Type', 'application/json');
response.write('{"error":1, "message":"file is not exist"}');
response.write('{ "error": 1, "message": "file is not exist" }');
response.end();
return;
}
@ -738,66 +776,17 @@ app.post('/track', async (req, res) => { // define a handler for tracking file c
if (status !== 200) throw new Error(`Document editing service returned status: ${status}`);
const storagePath = req.DocManager.storagePath(newFileName, userAddress);
let historyPath = req.DocManager.historyPath(newFileName, userAddress); // get the path to the history data
if (historyPath === '') { // if the history path doesn't exist
historyPath = req.DocManager.historyPath(newFileName, userAddress, true); // create it
req.DocManager.createDirectory(historyPath); // and create a directory for the history data
}
const countVersion = req.DocManager.countVersion(historyPath); // get the next file version number
version = countVersion + 1;
// get the path to the specified file version
const versionPath = req.DocManager.versionPath(newFileName, userAddress, version);
req.DocManager.createDirectory(versionPath); // create a directory to the specified file version
const downloadZip = body.changesurl;
if (downloadZip) {
// get the path to the file with document versions differences
const pathChanges = req.DocManager.diffPath(newFileName, userAddress, version);
const zip = await urllib.request(downloadZip, { method: 'GET' });
const statusZip = zip.status;
const dataZip = zip.data;
if (statusZip === 200) {
fileSystem.writeFileSync(pathChanges, dataZip); // write the document version differences to the archive
} else {
emitWarning(`Document editing service returned status: ${statusZip}`);
}
}
const changeshistory = JSON.stringify(body.history);
if (changeshistory) {
// get the path to the file with document changes
const pathChangesJson = req.DocManager.changesPath(newFileName, userAddress, version);
fileSystem.writeFileSync(pathChangesJson, changeshistory); // and write this data to the path in json format
}
const pathKey = req.DocManager.keyPath(newFileName, userAddress, version); // get the path to the key.txt file
fileSystem.writeFileSync(pathKey, body.key); // write the key value to the key.txt file
// get the path to the previous file version
const pathPrev = path.join(versionPath, `prev${fileUtility.getFileExtension(fileName)}`);
// and write it to the current path
fileSystem.renameSync(req.DocManager.storagePath(fileName, userAddress), pathPrev);
fileSystem.writeFileSync(storagePath, data);
// get the path to the forcesaved file
const forcesavePath = req.DocManager.forcesavePath(newFileName, userAddress, false);
if (forcesavePath !== '') { // if this path is empty
fileSystem.unlinkSync(forcesavePath); // remove it
}
await req.DocManager.saveFile(fileName, newFileName, userAddress, body, data);
} catch (ex) {
console.log(ex);
response.setHeader('Content-Type', 'application/json');
response.write(`{"error":1,"message":${JSON.stringify(ex)}}`);
response.write(`{ "error": 1, "message":${JSON.stringify(ex)} }`);
response.end();
return;
}
response.setHeader('Content-Type', 'application/json');
response.write('{"error":0}');
response.write('{ "error": 0 }');
response.end();
};
@ -805,7 +794,7 @@ app.post('/track', async (req, res) => { // define a handler for tracking file c
const processSave = async function processSave(downloadUri, body, fileName, userAddress) {
if (!downloadUri) {
response.setHeader('Content-Type', 'application/json');
response.write('{"error":1,"message":"save uri is empty"}');
response.write('{ "error": 1, "message": "save uri is empty" }');
response.end();
return;
}
@ -857,73 +846,17 @@ app.post('/track', async (req, res) => { // define a handler for tracking file c
const downloadExt = `.${body.fileType}`;
const isSubmitForm = body.forcesavetype === 3; // SubmitForm
let correctName = fileName;
let forcesavePath = '';
if (isSubmitForm) {
// new file
if (newFileName) {
correctName = req.DocManager.getCorrectName(
`${fileUtility.getFileName(fileName, true)}-form${downloadExt}`,
userAddress,
);
} else {
const ext = fileUtility.getFileExtension(fileName);
correctName = req.DocManager.getCorrectName(
`${fileUtility.getFileName(fileName, true)}-form${ext}`,
userAddress,
);
}
forcesavePath = req.DocManager.storagePath(correctName, userAddress);
} else {
if (newFileName) {
correctName = req.DocManager.getCorrectName(fileUtility.getFileName(
fileName,
true,
) + downloadExt, userAddress);
}
// create forcesave path if it doesn't exist
forcesavePath = req.DocManager.forcesavePath(correctName, userAddress, false);
if (forcesavePath === '') {
forcesavePath = req.DocManager.forcesavePath(correctName, userAddress, true);
}
}
fileSystem.writeFileSync(forcesavePath, data);
if (isSubmitForm) {
const uid = body.actions[0].userid;
req.DocManager.saveFileData(correctName, uid, 'Filling Form', userAddress);
const { formsdataurl } = body;
if (formsdataurl) {
const formsdataName = req.DocManager.getCorrectName(
`${fileUtility.getFileName(correctName, true)}.txt`,
userAddress,
);
// get the path to the file with forms data
const formsdataPath = req.DocManager.storagePath(formsdataName, userAddress);
const formsdata = await urllib.request(formsdataurl, { method: 'GET' });
const statusFormsdata = formsdata.status;
const dataFormsdata = formsdata.data;
if (statusFormsdata === 200) {
fileSystem.writeFileSync(formsdataPath, dataFormsdata); // write the forms data
} else {
emitWarning(`Document editing service returned status: ${statusFormsdata}`);
}
} else {
emitWarning('Document editing service do not returned formsdataurl');
}
}
await req.DocManager.forcesaveFile(data, fileName, downloadExt, userAddress, body, newFileName, isSubmitForm);
} catch (ex) {
console.log(ex);
response.write(`{"error":1,"message":${JSON.stringify(ex)}}`);
response.write(`{ "error":1, "message":${JSON.stringify(ex)} }`);
response.end();
return;
}
response.setHeader('Content-Type', 'application/json');
response.write('{"error":0}');
response.write('{ "error": 0 }');
response.end();
};
@ -931,7 +864,7 @@ app.post('/track', async (req, res) => { // define a handler for tracking file c
const processForceSave = async function processForceSave(downloadUri, body, fileName, userAddress) {
if (!downloadUri) {
response.setHeader('Content-Type', 'application/json');
response.write('{"error":1,"message":"forcesave uri is empty"}');
response.write('{ "error":1, "message": "forcesave uri is empty" }');
response.end();
return;
}
@ -976,6 +909,9 @@ app.post('/track', async (req, res) => { // define a handler for tracking file c
}
}
}
if (bodyTrack.users.length <= 0 && req.DocManager.forcesavePath(fName, uAddress, false)) {
await req.DocManager.saveFile(fName, fName, uAddress, bodyTrack);
}
} else if (bodyTrack.status === 2 || bodyTrack.status === 3) { // MustSave, Corrupted
await processSave(bodyTrack.url, bodyTrack, fileNameTrack, userAddressTrack); // save file
return;
@ -985,7 +921,7 @@ app.post('/track', async (req, res) => { // define a handler for tracking file c
}
response.setHeader('Content-Type', 'application/json');
response.write('{"error":0}');
response.write('{ "error":0 }');
response.end();
};
@ -1025,7 +961,7 @@ app.post('/track', async (req, res) => { // define a handler for tracking file c
}
if (!body) {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.write('{"error":1,"message":"body is empty"}');
res.write('{ "error": 1, "message": "body is empty" }');
res.end();
return;
}
@ -1094,6 +1030,7 @@ app.get('/editor', (req, res) => { // define a handler for editing document
req.DocManager = new DocManager(req, res);
let { fileExt } = req.query;
const fromBuffer = req.query.fromBuffer === 'true';
const user = users.getUser(req.query.userid);
const userid = user.id;
const { name } = user;
@ -1203,13 +1140,46 @@ app.get('/editor', (req, res) => { // define a handler for editing document
user.goback.url = `${req.DocManager.getServerUrl()}/`;
}
let pluginsConfig;
if (fileType === fileUtility.fileType.pdf // pdf form only
&& userid !== 'uid-0' // users only
&& mode !== 'comment') { // form field must be editable
const baseUrl = configServer.has('exampleUrl') && configServer.get('exampleUrl')
? configServer.get('exampleUrl')
: req.DocManager.getServerUrl();
const pluginGuid = 'asc.{6A95DA5C-857E-4C26-B00B-34876F1EEAD8}';
const pluginCode = crypto.randomBytes(16).toString('hex');
pluginsConfig = {
autostart: [...new Set([
(mode === 'fillForms' ? pluginGuid : []),
...(plugins.autostart || []),
])],
options: {
[pluginGuid]: {
code: pluginCode,
callback: `${baseUrl}/data`,
},
...(plugins.options || {}),
},
pluginsData: [...new Set([
`${baseUrl}/assets/plugin-aiautofill/config.json`,
...(plugins.pluginsData || []),
])],
};
} else {
pluginsConfig = plugins;
}
// file config data
const argss = {
bufferCallback: req.DocManager.getCallback(fileName, fromBuffer),
apiUrl: siteUrl + configServer.get('apiUrl'),
file: {
name: fileName,
ext: fileUtility.getFileExtension(fileName, true),
uri: url,
uri: fromBuffer ? '_data_' : url,
directUrl: !userDirectUrl ? null : directUrl,
uriUser: directUrl,
created: new Date().toDateString(),
@ -1246,9 +1216,8 @@ app.get('/editor', (req, res) => { // define a handler for editing document
reviewGroups: JSON.stringify(reviewGroups),
commentGroups: JSON.stringify(commentGroups),
userInfoGroups: JSON.stringify(userInfoGroups),
fileChoiceUrl,
submitForm,
plugins: JSON.stringify(plugins),
plugins: JSON.stringify(pluginsConfig),
actionData,
fileKey: userid !== 'uid-0'
? JSON.stringify({ fileName, userAddress: req.DocManager.curUserHostAddress() }) : null,

View File

@ -0,0 +1,304 @@
{
"sellers": [
{
"name": "John Anderson",
"email": "john.anderson@example.com",
"phone": "+1-234-567-8900",
"mobile": "+1-234-567-8901",
"address": "123 Main St",
"city": "Chicago",
"state": "IL",
"zip": "60601",
"country": "USA",
"company": "Tech Solutions LLC"
},
{
"name": "Maria Garcia",
"email": "maria.garcia@ventas.es",
"phone": "+34-912-345-678",
"mobile": "+34-600-123-456",
"address": "Calle Mayor 45",
"city": "Madrid",
"state": "Madrid",
"zip": "28013",
"country": "Spain",
"company": "Soluciones Digitales SA"
}
],
"deals": [
{
"name": "Enterprise Software License",
"number": "DL-2025-001",
"date": "2025-01-15",
"closeDate": "2025-03-30",
"status": "pending",
"amount": 125000,
"currency": "USD",
"description": "Annual enterprise software license with premium support package"
},
{
"name": "Cloud Infrastructure Migration",
"number": "DL-2025-002",
"date": "2025-02-10",
"closeDate": "2025-06-15",
"status": "in_progress",
"amount": 450000,
"currency": "EUR",
"description": "Complete cloud migration service with training and support"
}
],
"buyers": [
{
"name": "Jane Mitchell",
"email": "jane.mitchell@techcorp.com",
"phone": "+1-987-654-3210",
"mobile": "+1-987-654-3211",
"address": "321 Park Avenue",
"city": "New York",
"state": "NY",
"zip": "10001",
"country": "USA",
"company": "TechCorp International",
"department": "IT"
},
{
"name": "Pierre Dubois",
"email": "p.dubois@innovatech.fr",
"phone": "+33-1-42-34-56-78",
"mobile": "+33-6-12-34-56-78",
"address": "15 Avenue des Champs-Élysées",
"city": "Paris",
"state": "Île-de-France",
"zip": "75008",
"country": "France",
"company": "InnovaTech France",
"department": "Procurement"
}
],
"companies": [
{
"name": "Acme Corporation",
"email": "info@acmecorp.com",
"phone": "+1-312-555-0100",
"website": "https://www.acmecorp.com",
"address": "456 Business Plaza",
"city": "Chicago",
"state": "IL",
"zip": "60602",
"country": "USA",
"industry": "Technology"
},
{
"name": "Global Innovations Ltd",
"email": "contact@globalinnov.co.uk",
"phone": "+44-20-7123-4567",
"website": "https://www.globalinnov.co.uk",
"address": "88 Piccadilly Street",
"city": "London",
"state": "England",
"zip": "W1J 9HF",
"country": "United Kingdom",
"industry": "Consulting"
}
],
"products": [
{
"name": "Premium Software Suite",
"sku": "SW-PREM-001",
"category": "Software",
"quantity": 100,
"price": 999.99,
"currency": "USD",
"description": "Comprehensive software package with all premium features"
},
{
"name": "Professional Laptop",
"sku": "HW-LAP-PRO-15",
"category": "Hardware",
"quantity": 50,
"price": 1499.99,
"currency": "USD",
"description": "15-inch professional laptop with high-performance specs"
},
{
"name": "Cloud Storage Plan - Business",
"sku": "CLD-STR-BIZ-1TB",
"category": "Services",
"quantity": 1,
"price": 29.99,
"currency": "USD",
"description": "1TB cloud storage with business features (monthly subscription)"
}
],
"persons": [
{
"name": "John Anderson",
"firstName": "John",
"middleName": "Michael",
"lastName": "Anderson",
"dateOfBirth": "1990-01-15",
"gender": "Male",
"title": "Senior Software Engineer",
"email": "john.anderson@example.com",
"phone": "+1-234-567-8900",
"mobile": "+1-234-567-8901",
"address": "123 Main Street, Apt 4B",
"city": "Chicago",
"state": "IL",
"zip": "60601",
"country": "USA",
"website": "johnanderson.dev"
},
{
"name": "Yuki Tanaka",
"firstName": "Yuki",
"lastName": "Tanaka",
"dateOfBirth": "1988-07-22",
"gender": "Female",
"title": "UX/UI Designer",
"email": "yuki.tanaka@design.jp",
"phone": "+81-3-1234-5678",
"mobile": "+81-90-1234-5678",
"address": "1-2-3 Shibuya",
"city": "Tokyo",
"state": "Tokyo",
"zip": "150-0002",
"country": "Japan",
"website": "yukitanaka.design"
},
{
"name": "Sarah Johnson",
"firstName": "Sarah",
"lastName": "Johnson",
"employeeId": "ACM-2019-1234",
"personalEmail": "sarah.j.personal@gmail.com",
"department": "Product Development",
"jobPosition": "Senior Product Manager",
"hireDate": "2019-03-15",
"salary": 120000,
"salaryCurrency": "USD"
},
{
"name": "Carlos Rodriguez",
"firstName": "Carlos",
"lastName": "Rodriguez",
"employeeId": "ACM-2020-5678",
"personalEmail": "carlos.rod.personal@gmail.com",
"department": "Engineering",
"jobPosition": "DevOps Engineer",
"hireDate": "2020-07-20",
"salary": 105000,
"salaryCurrency": "USD"
}
],
"invoices": [
{
"number": "INV-2025-0001",
"date": "2025-01-15",
"dueDate": "2025-02-15",
"status": "paid",
"subtotal": 10000,
"tax": 800,
"taxRate": 8,
"discount": 500,
"total": 10300,
"currency": "USD",
"notes": "Payment received on time. Thank you for your business!",
"items": [
{
"productId": "P001",
"description": "Premium Software Suite - 10 licenses",
"quantity": 10,
"unitPrice": 999.99,
"total": 9999.90
}
]
},
{
"number": "INV-2025-0002",
"date": "2025-02-01",
"dueDate": "2025-03-01",
"status": "pending",
"subtotal": 75000,
"tax": 6000,
"taxRate": 8,
"discount": 0,
"total": 81000,
"currency": "USD",
"notes": "Payment terms: Net 30 days",
"items": [
{
"productId": "P002",
"description": "Professional Laptop - 50 units",
"quantity": 50,
"unitPrice": 1499.99,
"total": 74999.50
}
]
}
],
"customers": [
{
"type": "individual",
"firstName": "Emily",
"lastName": "Chen",
"email": "emily.chen@email.com",
"phone": "+1-555-111-2222",
"dateOfBirth": "1985-09-14",
"registrationDate": "2023-01-10",
"totalOrders": 15,
"totalSpent": 4500.75,
"address": {
"street": "567 Oak Street",
"city": "Seattle",
"state": "WA",
"zip": "98101",
"country": "USA"
}
},
{
"type": "business",
"companyName": "TechStart Solutions",
"contactPerson": "Robert Kim",
"email": "robert.kim@techstart.com",
"phone": "+1-555-333-4444",
"registrationDate": "2022-06-20",
"totalOrders": 42,
"totalSpent": 125000.00,
"address": {
"street": "890 Enterprise Boulevard",
"city": "Austin",
"state": "TX",
"zip": "78701",
"country": "USA"
}
}
],
"events": [
{
"name": "Annual Tech Conference 2025",
"type": "conference",
"startDate": "2025-06-15",
"endDate": "2025-06-17",
"startTime": "09:00",
"endTime": "18:00",
"timezone": "America/New_York",
"location": {
"name": "Convention Center",
"address": "100 Convention Plaza",
"city": "New York",
"state": "NY",
"zip": "10001",
"country": "USA"
},
"capacity": 5000,
"registered": 3500,
"status": "upcoming",
"organizer": "Tech Events Inc",
"description": "Join us for the biggest tech conference of the year featuring keynotes from industry leaders.",
"ticketPrice": 299.00,
"currency": "USD",
"website": "https://techconf2025.com"
}
]
}

View File

@ -18,6 +18,8 @@
const path = require('path');
const fileSystem = require('fs');
const urllib = require('urllib');
const { emitWarning } = require('process');
const configServer = require('config').get('server');
const fileUtility = require('./fileUtility');
const documentService = require('./documentService');
@ -203,11 +205,12 @@ DocManager.prototype.getProtocol = function getProtocol() {
};
// get callback url
DocManager.prototype.getCallback = function getCallback(fileName) {
DocManager.prototype.getCallback = function getCallback(fileName, fromBuffer = false) {
const server = this.getServerUrl(true);
const hostAddress = this.curUserHostAddress();
const route = fromBuffer ? '/forcesave' : '/track';
// get callback handler
const handler = `/track?filename=${encodeURIComponent(fileName)}&useraddress=${encodeURIComponent(hostAddress)}`;
const handler = `${route}?filename=${encodeURIComponent(fileName)}&useraddress=${encodeURIComponent(hostAddress)}`;
return server + handler;
};
@ -269,6 +272,129 @@ DocManager.prototype.forcesavePath = function forcesavePath(fileName, userAddres
return directory;
};
DocManager.prototype.forcesaveFile = async function forcesaveFile(
data,
fileName,
downloadExt,
userAddress,
body = null,
newFileName = false,
isSubmitForm = false,
) {
let correctName = fileName;
let forcesavePath = '';
if (isSubmitForm) {
// new file
if (newFileName) {
correctName = this.getCorrectName(
`${fileUtility.getFileName(fileName, true)}-form${downloadExt}`,
userAddress,
);
} else {
const ext = fileUtility.getFileExtension(fileName);
correctName = this.getCorrectName(
`${fileUtility.getFileName(fileName, true)}-form${ext}`,
userAddress,
);
}
forcesavePath = this.storagePath(correctName, userAddress);
} else {
if (newFileName) {
correctName = this.getCorrectName(fileUtility.getFileName(
fileName,
true,
) + downloadExt, userAddress);
}
// create forcesave path if it doesn't exist
forcesavePath = this.forcesavePath(correctName, userAddress, false);
if (forcesavePath === '') {
forcesavePath = this.forcesavePath(correctName, userAddress, true);
}
}
fileSystem.writeFileSync(forcesavePath, data);
if (isSubmitForm) {
const uid = body.actions[0].userid;
this.saveFileData(correctName, uid, 'Filling Form', userAddress);
const { formsdataurl } = body;
if (formsdataurl) {
const formsdataName = this.getCorrectName(
`${fileUtility.getFileName(correctName, true)}.txt`,
userAddress,
);
// get the path to the file with forms data
const formsdataPath = this.storagePath(formsdataName, userAddress);
const formsdata = await urllib.request(formsdataurl, { method: 'GET' });
const statusFormsdata = formsdata.status;
const dataFormsdata = formsdata.data;
if (statusFormsdata === 200) {
fileSystem.writeFileSync(formsdataPath, dataFormsdata); // write the forms data
} else {
emitWarning(`Document editing service returned status: ${statusFormsdata}`);
}
} else {
emitWarning('Document editing service do not returned formsdataurl');
}
}
};
DocManager.prototype.saveFile = async function saveFile(fileName, newFileName, userAddress, body, data = null) {
const storagePath = this.storagePath(newFileName, userAddress);
let historyPath = this.historyPath(newFileName, userAddress); // get the path to the history data
if (historyPath === '') { // if the history path doesn't exist
historyPath = this.historyPath(newFileName, userAddress, true); // create it
this.createDirectory(historyPath); // and create a directory for the history data
}
const countVersion = this.countVersion(historyPath); // get the next file version number
const version = countVersion + 1;
// get the path to the specified file version
const versionPath = this.versionPath(newFileName, userAddress, version);
this.createDirectory(versionPath); // create a directory to the specified file version
const downloadZip = body.changesurl;
if (downloadZip) {
// get the path to the file with document versions differences
const pathChanges = this.diffPath(newFileName, userAddress, version);
const zip = await urllib.request(downloadZip, { method: 'GET' });
const statusZip = zip.status;
const dataZip = zip.data;
if (statusZip === 200) {
fileSystem.writeFileSync(pathChanges, dataZip); // write the document version differences to the archive
} else {
emitWarning(`Document editing service returned status: ${statusZip}`);
}
}
const changeshistory = body.changeshistory || JSON.stringify(body.history);
if (changeshistory) {
// get the path to the file with document changes
const pathChangesJson = this.changesPath(newFileName, userAddress, version);
fileSystem.writeFileSync(pathChangesJson, changeshistory); // and write this data to the path in json format
}
const pathKey = this.keyPath(newFileName, userAddress, version); // get the path to the key.txt file
fileSystem.writeFileSync(pathKey, body.key); // write the key value to the key.txt file
// get the path to the previous file version
const pathPrev = path.join(versionPath, `prev${fileUtility.getFileExtension(fileName)}`);
// and write it to the current path
fileSystem.renameSync(this.storagePath(fileName, userAddress), pathPrev);
// get the path to the forcesaved file
const forcesavePath = this.forcesavePath(newFileName, userAddress, false);
if (forcesavePath !== '') { // if this path is not empty
if (data === null) fileSystem.writeFileSync(storagePath, fileSystem.readFileSync(forcesavePath));
fileSystem.unlinkSync(forcesavePath); // remove it
}
if (data !== null) fileSystem.writeFileSync(storagePath, data);
};
// create the path to the file history
DocManager.prototype.historyPath = function historyPath(fileName, userAddress, create) {
let directory = this.storageRootPath(userAddress);

View File

@ -16,6 +16,7 @@
*
*/
const pathModule = require('path');
const supportedFormats = require('../public/assets/document-formats/onlyoffice-docs-formats.json'); // eslint-disable-line
const fileUtility = {};
@ -39,8 +40,7 @@ fileUtility.getFileNameFromUrl = function getFileNameFromUrl(url, withoutExtensi
fileUtility.getFileName = function getFileName(path, withoutExtension) {
if (!path) return '';
const parts = path.split('/');
const fileName = parts.pop(); // get the file name from the last part of the path
const fileName = pathModule.basename(path); // get the file name from the last part of the path
// get file name without extension
if (withoutExtension) {

View File

@ -116,6 +116,7 @@ const descrUser0 = [
'Has empty role',
'Can\'t submit forms',
'Tour of tips when opening a document',
'Without AI Auto Fill Plugin',
];
const users = [

File diff suppressed because it is too large Load Diff

View File

@ -20,7 +20,7 @@
"debug": "^4.3.4",
"ejs": "^3.1.10",
"express": "^4.21.1",
"fast-xml-parser": "^4.4.1",
"fast-xml-parser": "^5.3.4",
"formidable": "^3.5.4",
"he": "^1.2.0",
"jsonwebtoken": "^9.0.2",
@ -52,7 +52,7 @@
"word-wrap": "1.2.4",
"pac-resolver": "7.0.0",
"degenerator": "3.0.1",
"qs": "6.7.3",
"qs": "6.14.1",
"json5": "2.2.3"
}
}

View File

@ -442,7 +442,9 @@ if (typeof jQuery != "undefined") {
jq("#downloadConverted").removeClass("disable");
jq("#hiddenFileName").attr("data",response.filename);
if (response.error !== "FileTypeIsNotSupported") {
jq("#beginEditConverted").removeClass("disable");
if (formatManager.isEditable(fileExt)) {
jq("#beginEditConverted").removeClass("disable");
}
jq("#beginViewConverted").removeClass("disable");
jq("#downloadConverted").attr("data","fromStorage");
} else {

View File

@ -54,7 +54,6 @@
"shareUrl": "<%- file.uriUser %>",
"toolbarDocked": "top"
},
"fileChoiceUrl": "<%- editor.fileChoiceUrl %>",
"lang": "<%- editor.lang %>",
"mode": "<%- editor.mode %>",
"plugins": <%- editor.plugins %>,

View File

@ -77,8 +77,29 @@
var onAppReady = function () { // the application is loaded into the browser
innerAlert("Document editor ready");
if (config.document.url === "_data_") {
let xhr = new XMLHttpRequest();
xhr.open("GET", "download?fileName=" + encodeURIComponent(config.document.title));
xhr.responseType = "arraybuffer";
xhr.send();
xhr.onload = () => {
if (xhr.status === 200) {
docEditor.openDocument(new Uint8Array(xhr.response));
} else {
innerAlert("Failed to download document");
}
};
};
};
var onSaveDocument = function (event) {
let xhr = new XMLHttpRequest();
xhr.open("POST", "<%- bufferCallback %>");
xhr.setRequestHeader('Content-Type', 'application/octet-stream');
xhr.send(event.data);
}
var onDocumentStateChange = function (event) { // the document is modified
var title = document.title.replace(/^\*/g, "");
document.title = (event.data ? "*" : "") + title;
@ -476,6 +497,10 @@
}
}
if (config.document.url === "_data_") {
config.events.onSaveDocument = onSaveDocument;
}
try {
var oformParam = new URL(window.location).searchParams.get("oform");
} catch (e) {}

View File

@ -111,11 +111,19 @@
<tr>
<td valign="middle">
<label class="side-option">
<input id="directUrl" type="checkbox" class="checkbox collectable" name="directUrl" />Try opening on client
<input id="directUrl" type="checkbox" class="checkbox collectable" name="directUrl" />Opening direct link
<img id="directUrlInfo" class="info info-tooltip" data-id="directUrlInfo" data-tooltip="Some files can be opened in the user's browser without connecting to the document server. Open each file in only one way." src="images/info.svg" />
</label>
</td>
</tr>
<tr>
<td valign="middle">
<label class="side-option">
<input id="fromBuffer" type="checkbox" class="checkbox collectable" name="fromBuffer" />Opening on client
<img id="fromBufferInfo" class="info info-tooltip" data-id="fromBufferInfo" data-tooltip="Download the file and transfer it to the editor on the client without requests from the document server." src="images/info.svg" />
</label>
</td>
</tr>
</tbody>
</table>
</div>

View File

@ -10,7 +10,7 @@ DOCS_INTEGRATION_SDK_CONVERT_SERVICE_URL=/converter
DOCUMENT_STORAGE_PUBLIC_URL=http://localhost
DOCUMENT_STORAGE_PRIVATE_URL=http://proxy
DOCUMENT_STORAGE_MAXIMUM_FILE_SIZE=5242880
DOCUMENT_STORAGE_MAXIMUM_FILE_SIZE=104857600
DOCUMENT_STORAGE_DISPLAY_FORGOTTEN_PAGE=false

View File

@ -165,7 +165,7 @@ class FileController extends Controller
fileType: PathInfo::extension($request->filename),
outputType: $request->input('fileExt', 'ooxml'),
url: $request->fileUri,
password: $request->password,
password: $request->filePass,
user: $request->user,
userAddress: $request->ip(),
lang: cache('lang', default: 'en'),

View File

@ -14,7 +14,7 @@ class CheckAndDecodeJWTPayload
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
* @param Closure(Request): (Response) $next
*/
public function handle(Request $request, Closure $next): Response
{

View File

@ -11,7 +11,7 @@ class EnsureForgottenPageEnabled
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
* @param Closure(Request): (Response) $next
*/
public function handle(Request $request, Closure $next): Response
{

View File

@ -14,7 +14,7 @@ class EnsureJWTTokenIsPresent
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
* @param Closure(Request): (Response) $next
*/
public function handle(Request $request, Closure $next): Response
{

View File

@ -12,7 +12,7 @@ class EnsureUserDirectoryExists
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
* @param Closure(Request): (Response) $next
*/
public function handle(Request $request, Closure $next): Response
{

View File

@ -74,7 +74,7 @@ class SettingsManager extends OnlyOfficeSettingsManager
],
],
'file' => [
'max_size' => env('DOCUMENT_STORAGE_MAXIMUM_FILE_SIZE', 5 * 1024 * 1024),
'max_size' => env('DOCUMENT_STORAGE_MAXIMUM_FILE_SIZE', 100 * 1024 * 1024),
],
];
}

View File

@ -36,6 +36,9 @@ class ConvertRequest
false,
$data['lang'],
$data['filename'],
$data['codePage'] ?? null,
$data['delimiter'] ?? null,
$data['password'] ?? null,
);
if (property_exists($result, 'Error')) {

View File

@ -30,7 +30,7 @@ class CreateDocumentRequest
public mixed $fileContent,
public string $user,
) {
if ($fileSize && ($fileSize <= 0 || $fileSize > env('STORAGE_MAXIMUM_FILE_SIZE', 5 * 1024 * 1024))) {
if ($fileSize && ($fileSize <= 0 || $fileSize > env('DOCUMENT_STORAGE_MAXIMUM_FILE_SIZE', 100 * 1024 * 1024))) {
throw new UnexpectedValueException("Incorrect file size: $fileSize");
}
}

View File

@ -1,5 +1,7 @@
<?php
use App\Providers\AppServiceProvider;
return [
App\Providers\AppServiceProvider::class,
AppServiceProvider::class,
];

View File

@ -4,7 +4,7 @@
"firebase/php-jwt": "^6.10",
"laravel/framework": "^11.0",
"laravel/tinker": "^2.9",
"onlyoffice/docs-integration-sdk": "dev-feature/diagram"
"onlyoffice/docs-integration-sdk": "1.3.1"
},
"require-dev": {
"fakerphp/faker": "^1.23",

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,7 @@
<?php
use App\Models\User;
return [
/*
@ -62,7 +64,7 @@ return [
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => env('AUTH_MODEL', App\Models\User::class),
'model' => env('AUTH_MODEL', User::class),
],
// 'users' => [

View File

@ -2,12 +2,13 @@
namespace Database\Factories;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\User>
* @extends Factory<User>
*/
class UserFactory extends Factory
{

View File

@ -11,7 +11,7 @@ services:
documentserver:
container_name: documentserver
image: onlyoffice/documentserver:8.2
image: onlyoffice/documentserver:9.3
expose:
- "80"
environment:

View File

@ -436,9 +436,9 @@
}
},
"node_modules/@rollup/rollup-android-arm-eabi": {
"version": "4.40.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.1.tgz",
"integrity": "sha512-kxz0YeeCrRUHz3zyqvd7n+TVRlNyTifBsmnmNPtk3hQURUyG9eAB+usz6DAwagMusjx/zb3AjvDUvhFGDAexGw==",
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz",
"integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==",
"cpu": [
"arm"
],
@ -450,9 +450,9 @@
]
},
"node_modules/@rollup/rollup-android-arm64": {
"version": "4.40.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.1.tgz",
"integrity": "sha512-PPkxTOisoNC6TpnDKatjKkjRMsdaWIhyuMkA4UsBXT9WEZY4uHezBTjs6Vl4PbqQQeu6oION1w2voYZv9yquCw==",
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz",
"integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==",
"cpu": [
"arm64"
],
@ -464,9 +464,9 @@
]
},
"node_modules/@rollup/rollup-darwin-arm64": {
"version": "4.40.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.1.tgz",
"integrity": "sha512-VWXGISWFY18v/0JyNUy4A46KCFCb9NVsH+1100XP31lud+TzlezBbz24CYzbnA4x6w4hx+NYCXDfnvDVO6lcAA==",
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz",
"integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==",
"cpu": [
"arm64"
],
@ -478,9 +478,9 @@
]
},
"node_modules/@rollup/rollup-darwin-x64": {
"version": "4.40.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.1.tgz",
"integrity": "sha512-nIwkXafAI1/QCS7pxSpv/ZtFW6TXcNUEHAIA9EIyw5OzxJZQ1YDrX+CL6JAIQgZ33CInl1R6mHet9Y/UZTg2Bw==",
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz",
"integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==",
"cpu": [
"x64"
],
@ -492,9 +492,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-arm64": {
"version": "4.40.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.1.tgz",
"integrity": "sha512-BdrLJ2mHTrIYdaS2I99mriyJfGGenSaP+UwGi1kB9BLOCu9SR8ZpbkmmalKIALnRw24kM7qCN0IOm6L0S44iWw==",
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz",
"integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==",
"cpu": [
"arm64"
],
@ -506,9 +506,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-x64": {
"version": "4.40.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.1.tgz",
"integrity": "sha512-VXeo/puqvCG8JBPNZXZf5Dqq7BzElNJzHRRw3vjBE27WujdzuOPecDPc/+1DcdcTptNBep3861jNq0mYkT8Z6Q==",
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz",
"integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==",
"cpu": [
"x64"
],
@ -520,9 +520,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
"version": "4.40.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.1.tgz",
"integrity": "sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg==",
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz",
"integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==",
"cpu": [
"arm"
],
@ -534,9 +534,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
"version": "4.40.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.1.tgz",
"integrity": "sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg==",
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz",
"integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==",
"cpu": [
"arm"
],
@ -548,9 +548,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
"version": "4.40.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.1.tgz",
"integrity": "sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg==",
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz",
"integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==",
"cpu": [
"arm64"
],
@ -562,9 +562,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
"version": "4.40.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.1.tgz",
"integrity": "sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ==",
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz",
"integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==",
"cpu": [
"arm64"
],
@ -575,10 +575,10 @@
"linux"
]
},
"node_modules/@rollup/rollup-linux-loongarch64-gnu": {
"version": "4.40.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.1.tgz",
"integrity": "sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ==",
"node_modules/@rollup/rollup-linux-loong64-gnu": {
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz",
"integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==",
"cpu": [
"loong64"
],
@ -589,10 +589,38 @@
"linux"
]
},
"node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
"version": "4.40.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.1.tgz",
"integrity": "sha512-BvvA64QxZlh7WZWqDPPdt0GH4bznuL6uOO1pmgPnnv86rpUpc8ZxgZwcEgXvo02GRIZX1hQ0j0pAnhwkhwPqWg==",
"node_modules/@rollup/rollup-linux-loong64-musl": {
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz",
"integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==",
"cpu": [
"loong64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-ppc64-gnu": {
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz",
"integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==",
"cpu": [
"ppc64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-ppc64-musl": {
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz",
"integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==",
"cpu": [
"ppc64"
],
@ -604,9 +632,9 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
"version": "4.40.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.1.tgz",
"integrity": "sha512-EQSP+8+1VuSulm9RKSMKitTav89fKbHymTf25n5+Yr6gAPZxYWpj3DzAsQqoaHAk9YX2lwEyAf9S4W8F4l3VBQ==",
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz",
"integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==",
"cpu": [
"riscv64"
],
@ -618,9 +646,9 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-musl": {
"version": "4.40.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.1.tgz",
"integrity": "sha512-n/vQ4xRZXKuIpqukkMXZt9RWdl+2zgGNx7Uda8NtmLJ06NL8jiHxUawbwC+hdSq1rrw/9CghCpEONor+l1e2gA==",
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz",
"integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==",
"cpu": [
"riscv64"
],
@ -632,9 +660,9 @@
]
},
"node_modules/@rollup/rollup-linux-s390x-gnu": {
"version": "4.40.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.1.tgz",
"integrity": "sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg==",
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz",
"integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==",
"cpu": [
"s390x"
],
@ -646,9 +674,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
"version": "4.40.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.1.tgz",
"integrity": "sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ==",
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz",
"integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==",
"cpu": [
"x64"
],
@ -660,9 +688,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
"version": "4.40.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.1.tgz",
"integrity": "sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ==",
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz",
"integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==",
"cpu": [
"x64"
],
@ -673,10 +701,38 @@
"linux"
]
},
"node_modules/@rollup/rollup-openbsd-x64": {
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz",
"integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"openbsd"
]
},
"node_modules/@rollup/rollup-openharmony-arm64": {
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz",
"integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"openharmony"
]
},
"node_modules/@rollup/rollup-win32-arm64-msvc": {
"version": "4.40.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.1.tgz",
"integrity": "sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg==",
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz",
"integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==",
"cpu": [
"arm64"
],
@ -688,9 +744,9 @@
]
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
"version": "4.40.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.1.tgz",
"integrity": "sha512-DfcogW8N7Zg7llVEfpqWMZcaErKfsj9VvmfSyRjCyo4BI3wPEfrzTtJkZG6gKP/Z92wFm6rz2aDO7/JfiR/whA==",
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz",
"integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==",
"cpu": [
"ia32"
],
@ -701,10 +757,24 @@
"win32"
]
},
"node_modules/@rollup/rollup-win32-x64-gnu": {
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz",
"integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
]
},
"node_modules/@rollup/rollup-win32-x64-msvc": {
"version": "4.40.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.1.tgz",
"integrity": "sha512-ECyOuDeH3C1I8jH2MK1RtBJW+YPMvSfT0a5NN0nHfQYnDSJ6tUiZH3gzwVP5/Kfh/+Tt7tpWVF9LXNTnhTJ3kA==",
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz",
"integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==",
"cpu": [
"x64"
],
@ -716,9 +786,9 @@
]
},
"node_modules/@types/estree": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz",
"integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==",
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
"integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
"dev": true,
"license": "MIT"
},
@ -965,13 +1035,13 @@
"dev": true
},
"node_modules/rollup": {
"version": "4.40.1",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.1.tgz",
"integrity": "sha512-C5VvvgCCyfyotVITIAv+4efVytl5F7wt+/I2i9q9GZcEXW9BP52YYOXC58igUi+LFZVHukErIIqQSWwv/M3WRw==",
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz",
"integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/estree": "1.0.7"
"@types/estree": "1.0.8"
},
"bin": {
"rollup": "dist/bin/rollup"
@ -981,26 +1051,31 @@
"npm": ">=8.0.0"
},
"optionalDependencies": {
"@rollup/rollup-android-arm-eabi": "4.40.1",
"@rollup/rollup-android-arm64": "4.40.1",
"@rollup/rollup-darwin-arm64": "4.40.1",
"@rollup/rollup-darwin-x64": "4.40.1",
"@rollup/rollup-freebsd-arm64": "4.40.1",
"@rollup/rollup-freebsd-x64": "4.40.1",
"@rollup/rollup-linux-arm-gnueabihf": "4.40.1",
"@rollup/rollup-linux-arm-musleabihf": "4.40.1",
"@rollup/rollup-linux-arm64-gnu": "4.40.1",
"@rollup/rollup-linux-arm64-musl": "4.40.1",
"@rollup/rollup-linux-loongarch64-gnu": "4.40.1",
"@rollup/rollup-linux-powerpc64le-gnu": "4.40.1",
"@rollup/rollup-linux-riscv64-gnu": "4.40.1",
"@rollup/rollup-linux-riscv64-musl": "4.40.1",
"@rollup/rollup-linux-s390x-gnu": "4.40.1",
"@rollup/rollup-linux-x64-gnu": "4.40.1",
"@rollup/rollup-linux-x64-musl": "4.40.1",
"@rollup/rollup-win32-arm64-msvc": "4.40.1",
"@rollup/rollup-win32-ia32-msvc": "4.40.1",
"@rollup/rollup-win32-x64-msvc": "4.40.1",
"@rollup/rollup-android-arm-eabi": "4.59.0",
"@rollup/rollup-android-arm64": "4.59.0",
"@rollup/rollup-darwin-arm64": "4.59.0",
"@rollup/rollup-darwin-x64": "4.59.0",
"@rollup/rollup-freebsd-arm64": "4.59.0",
"@rollup/rollup-freebsd-x64": "4.59.0",
"@rollup/rollup-linux-arm-gnueabihf": "4.59.0",
"@rollup/rollup-linux-arm-musleabihf": "4.59.0",
"@rollup/rollup-linux-arm64-gnu": "4.59.0",
"@rollup/rollup-linux-arm64-musl": "4.59.0",
"@rollup/rollup-linux-loong64-gnu": "4.59.0",
"@rollup/rollup-linux-loong64-musl": "4.59.0",
"@rollup/rollup-linux-ppc64-gnu": "4.59.0",
"@rollup/rollup-linux-ppc64-musl": "4.59.0",
"@rollup/rollup-linux-riscv64-gnu": "4.59.0",
"@rollup/rollup-linux-riscv64-musl": "4.59.0",
"@rollup/rollup-linux-s390x-gnu": "4.59.0",
"@rollup/rollup-linux-x64-gnu": "4.59.0",
"@rollup/rollup-linux-x64-musl": "4.59.0",
"@rollup/rollup-openbsd-x64": "4.59.0",
"@rollup/rollup-openharmony-arm64": "4.59.0",
"@rollup/rollup-win32-arm64-msvc": "4.59.0",
"@rollup/rollup-win32-ia32-msvc": "4.59.0",
"@rollup/rollup-win32-x64-gnu": "4.59.0",
"@rollup/rollup-win32-x64-msvc": "4.59.0",
"fsevents": "~2.3.2"
}
},

View File

@ -841,6 +841,7 @@ footer table tr td:first-child {
position: absolute;
right: 0;
top: 71px;
height: calc(100% - 130px);
scrollbar-color: #D0D5DA transparent;
scrollbar-width: thin;
}

View File

@ -143,6 +143,7 @@
.scroll-table-body {
top: 31px;
height: calc(100% - 34px);
}
footer {
@ -414,6 +415,7 @@
.scroll-table-body {
top: 31px;
height: calc(100% - 34px);
}
footer table tr {

View File

@ -421,9 +421,11 @@ if (typeof jQuery != "undefined") {
jq("#convertStep2").removeClass("current").addClass("done");
jq("#convertStep2").text(`2. File conversion to ${fileExt}`);
jq("#downloadConverted").removeClass("disable");
jq("#hiddenFileName").attr("data",response.filename);
if (response.error !== "FileTypeIsNotSupported") {
jq("#hiddenFileName").attr("data",response.filename);
jq("#beginEditConverted").removeClass("disable");
if (formatManager.isEditable(fileExt)) {
jq("#beginEditConverted").removeClass("disable");
}
jq("#beginViewConverted").removeClass("disable");
jq("#downloadConverted").attr("data","fromStorage");
} else {

View File

@ -143,6 +143,7 @@
.scroll-table-body {
top: 31px;
height: calc(100% - 34px);
}
footer {
@ -748,6 +749,7 @@
.scroll-table-body {
top: 36px;
height: calc(100% - 34px);
}
.scroll-table-body tr:first-child {

View File

@ -846,6 +846,7 @@ footer table tr td:first-child {
position: absolute;
right: 0;
top: 71px;
height: calc(100% - 130px);
scrollbar-color: #D0D5DA transparent;
scrollbar-width: thin;
}

View File

@ -413,7 +413,9 @@ if (typeof jQuery != "undefined") {
jq("#downloadConverted").removeClass("disable");
jq("#hiddenFileName").attr("data",response.filename);
if (response.error !== "FileTypeIsNotSupported") {
jq("#beginEditConverted").removeClass("disable");
if (formatManager.isEditable(fileExt)) {
jq("#beginEditConverted").removeClass("disable");
}
jq("#beginViewConverted").removeClass("disable");
jq("#downloadConverted").attr("data","fromStorage");
} else {

File diff suppressed because it is too large Load Diff

View File

@ -3,7 +3,7 @@ version: "3.8"
services:
documentserver:
container_name: documentserver
image: onlyoffice/documentserver:8.2
image: onlyoffice/documentserver:9.3
expose:
- "80"
environment:

View File

@ -152,7 +152,7 @@ class ConfigurationManager
{
$size = getenv('MAXIMUM_FILE_SIZE');
if (!$size) {
return 5 * 1024 * 1024;
return 100 * 1024 * 1024;
}
return intval($size);
}

View File

@ -757,8 +757,8 @@ function getConvertedData(
$documentRevisionID,
$async,
&$convertedDocumentURL,
$filePass,
$lang,
$filePass = null,
$lang = null,
$fileName = null
) {
$convertedDocumentURL = "";

View File

@ -51,6 +51,11 @@
- msgspec
- :who:
:why: BSD-3-Clause
:versions:
- 0.20.0
:versions: []
:when: 2025-11-07 10:13:51.477550000 Z
- - :approve
- pyjwt
- :who:
:why: MIT
:versions: []
:when: 2025-11-07 10:13:51.477550000 Z

View File

@ -3,7 +3,7 @@ version: "3.8"
services:
documentserver:
container_name: documentserver
image: onlyoffice/documentserver:8.2
image: onlyoffice/documentserver:9.3
expose:
- "80"
environment:

View File

@ -116,7 +116,7 @@ class ConfigurationManager:
size = environ.get('MAXIMUM_FILE_SIZE')
if size:
return int(size)
return 5 * 1024 * 1024
return 100 * 1024 * 1024
def conversion_timeout(self) -> int:
timeout = environ.get('CONVERSION_TIMEOUT')

View File

@ -143,6 +143,7 @@
.scroll-table-body {
top: 31px;
height: calc(100% - 34px);
}
footer {
@ -747,6 +748,7 @@
.scroll-table-body {
top: 36px;
height: calc(100% - 34px);
}
.scroll-table-body tr:first-child {

View File

@ -845,6 +845,7 @@ footer table tr td:first-child {
position: absolute;
right: 0;
top: 71px;
height: calc(100% - 130px);
scrollbar-color: #D0D5DA transparent;
scrollbar-width: thin;
}

View File

@ -397,7 +397,9 @@ if (typeof jQuery !== "undefined") {
jq("#downloadConverted").removeClass("disable");
jq("#hiddenFileName").attr("data",response.filename);
if (response.error !== "FileTypeIsNotSupported") {
jq("#beginEditConverted").removeClass("disable");
if (formatManager.isEditable(fileExt)) {
jq("#beginEditConverted").removeClass("disable");
}
jq("#beginViewConverted").removeClass("disable");
jq("#downloadConverted").attr("data","fromStorage");
} else {

View File

@ -158,6 +158,8 @@ GEM
racc (~> 1.4)
nokogiri (1.18.9-x86_64-linux-gnu)
racc (~> 1.4)
nokogiri (1.18.9-x86_64-linux-musl)
racc (~> 1.4)
parallel (1.24.0)
parser (3.3.0.5)
ast (~> 2.4.1)
@ -320,8 +322,9 @@ GEM
zeitwerk (2.6.13)
PLATFORMS
arm64-darwin-22
arm64-darwin
x86_64-linux
x86_64-linux-musl
DEPENDENCIES
byebug (~> 11.1)

View File

@ -402,7 +402,9 @@ if (typeof jQuery != "undefined") {
jq("#downloadConverted").removeClass("disable");
jq("#hiddenFileName").attr("data",response.filename);
if (response.error !== "FileTypeIsNotSupported") {
jq("#beginEditConverted").removeClass("disable");
if (formatManager.isEditable(fileExt)) {
jq("#beginEditConverted").removeClass("disable");
}
jq("#beginViewConverted").removeClass("disable");
jq("#downloadConverted").attr("data","fromStorage");
} else {

View File

@ -143,6 +143,7 @@
.scroll-table-body {
top: 31px;
height: calc(100% - 34px);
}
footer {
@ -747,6 +748,7 @@
.scroll-table-body {
top: 36px;
height: calc(100% - 34px);
}
.scroll-table-body tr:first-child {

View File

@ -846,6 +846,7 @@ footer table tr td:first-child {
position: absolute;
right: 0;
top: 71px;
height: calc(100% - 130px);
scrollbar-color: #D0D5DA transparent;
scrollbar-width: thin;
}

View File

@ -143,7 +143,7 @@ class ConfigurationManager
env = ENV.fetch('MAXIMUM_FILE_SIZE', nil)
return Integer(env, 10) if env
5 * 1024 * 1024
100 * 1024 * 1024
end
sig { returns(Numeric) }

View File

@ -84,6 +84,13 @@ class TrackHelper
copied['changesurl'] = resolved_uri.to_s
end
formsdataurl = copied['formsdataurl']
if formsdataurl
uri = URI(formsdataurl)
resolved_uri = TrackHelper.proxy_manager.resolve_uri(uri)
copied['formsdataurl'] = resolved_uri.to_s
end
home = copied['home']
copied['home'] = resolve_process_save_body(home) if home
@ -180,7 +187,9 @@ class TrackHelper
end
# file force saving process
def self.process_force_save(file_data, file_name, user_address)
def self.process_force_save(raw_file_data, file_name, user_address)
file_data = resolve_process_save_body(raw_file_data)
download_uri = file_data['url']
if download_uri.eql?(nil)
saved = 1
@ -222,7 +231,7 @@ class TrackHelper
begin
# check if the forcesave type is equal to 3 (the form was submitted)
is_submit_form = Integer(file_data['forcesavetype'], 10) == 3
is_submit_form = file_data['forcesavetype'].to_s == '3'
if is_submit_form
file_name = if new_file_name

View File

@ -3,7 +3,7 @@ version: "3.8"
services:
documentserver:
container_name: documentserver
image: onlyoffice/documentserver:8.2
image: onlyoffice/documentserver:9.3
expose:
- "80"
environment: