diff --git a/Common/config/default.json b/Common/config/default.json index 34134353..074aa128 100644 --- a/Common/config/default.json +++ b/Common/config/default.json @@ -83,7 +83,7 @@ "fileInfoBlockList" : ["FileUrl"], "wordView": ["pdf", "djvu", "xps", "oxps", "doc", "dotx", "dotm", "dot", "fodt", "ott", "rtf", "mht", "html", "htm", "xml", "epub", "fb2"], "wordEdit": ["docx", "docm", "docxf", "oform", "odt", "txt"], - "cellView": ["xls", "xltx", "xltm", "xlt", "fods", "ots"], + "cellView": ["xls", "xlsb", "xltx", "xltm", "xlt", "fods", "ots"], "cellEdit": ["xlsx", "xlsm", "ods", "csv"], "slideView": ["ppt", "ppsx", "ppsm", "pps", "potx", "potm", "pot", "fodp", "otp"], "slideEdit": ["pptx", "pptm", "odp"], @@ -122,7 +122,9 @@ "openProtectedFile": true, "editorDataStorage": "editorDataMemory", "assemblyFormatAsOrigin": true, - "newFileTemplate" : "../../document-templates/new" + "newFileTemplate" : "../../document-templates/new", + "downloadFileAllowExt": ["pdf"], + "tokenRequiredParams": true }, "requestDefaults": { "headers": { @@ -216,15 +218,13 @@ }, "inbox": { "header": "Authorization", - "prefix": "Bearer ", - "inBody": false + "prefix": "Bearer " }, "outbox": { "header": "Authorization", "prefix": "Bearer ", "algorithm": "HS256", "expires": "5m", - "inBody": false, "urlExclusionRegex": "" }, "session": { diff --git a/Common/npm-shrinkwrap.json b/Common/npm-shrinkwrap.json index f21e35a3..dd85b948 100644 --- a/Common/npm-shrinkwrap.json +++ b/Common/npm-shrinkwrap.json @@ -70,18 +70,18 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "aws-sdk": { - "version": "2.346.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.346.0.tgz", - "integrity": "sha512-4nJfbsK5Chu1ujIHHuvzRz7Ypu9Rbb8KQ/9T5QkVKUaQkl7AUnaUyENykIjhUybQlyg6uqPXg4JTK0801P+OfA==", + "version": "2.1074.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1074.0.tgz", + "integrity": "sha512-tD478mkukglutjs+mq5FQmYFzz+l/wddl5u3tTMWTNa+j1eSL+AqaHPFM1rC3O9h98QqpKKzeKbLrPhGDvYaRg==", "requires": { - "buffer": "4.9.1", + "buffer": "4.9.2", "events": "1.1.1", - "ieee754": "1.1.8", - "jmespath": "0.15.0", + "ieee754": "1.1.13", + "jmespath": "0.16.0", "querystring": "0.2.0", "sax": "1.2.1", "url": "0.10.3", - "uuid": "3.1.0", + "uuid": "3.3.2", "xml2js": "0.4.19" } }, @@ -96,9 +96,9 @@ "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" }, "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "bcrypt-pbkdf": { "version": "1.0.2", @@ -144,9 +144,9 @@ "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" }, "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", "requires": { "base64-js": "^1.0.2", "ieee754": "^1.1.4", @@ -175,11 +175,6 @@ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, - "circular-json": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.9.tgz", - "integrity": "sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ==" - }, "clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", @@ -228,9 +223,9 @@ } }, "date-format": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-1.2.0.tgz", - "integrity": "sha1-YV6CjiM90aubua4JUODOzPpuytg=" + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.3.tgz", + "integrity": "sha512-7P3FyqDcfeznLZp2b+OMitV9Sz2lUnsT87WaTat9nVwqsBkTzPG3lPLNwW3en6F4pHUiWzr6vb8CLhjdK9bcxQ==" }, "debug": { "version": "3.2.6", @@ -301,6 +296,11 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, + "flatted": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==" + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -369,9 +369,9 @@ } }, "ieee754": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" }, "imurmurhash": { "version": "0.1.4", @@ -409,20 +409,15 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "jmespath": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", - "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==" }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, "json-schema-traverse": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", @@ -466,14 +461,21 @@ } }, "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" + }, + "dependencies": { + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + } } }, "jwa": { @@ -549,15 +551,30 @@ "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" }, "log4js": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-3.0.6.tgz", - "integrity": "sha512-ezXZk6oPJCWL483zj64pNkMuY/NcRX5MPiB0zE6tjZM137aeusrOnW1ecxgF9cmwMWkBMhjteQxBPoZBh9FDxQ==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.1.tgz", + "integrity": "sha512-iUiYnXqAmNKiIZ1XSAitQ4TmNs8CdZYTAWINARF3LjnsLN8tY5m0vRwd6uuWj/yNY0YHxeZodnbmxKFUOM2rMg==", "requires": { - "circular-json": "^0.5.5", - "date-format": "^1.2.0", - "debug": "^3.1.0", - "rfdc": "^1.1.2", - "streamroller": "0.7.0" + "date-format": "^4.0.3", + "debug": "^4.3.3", + "flatted": "^3.2.4", + "rfdc": "^1.3.0", + "streamroller": "^3.0.2" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, "make-dir": { @@ -619,9 +636,12 @@ } }, "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } }, "node-forge": { "version": "0.10.0", @@ -666,11 +686,6 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" - }, "psl": { "version": "1.1.29", "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", @@ -762,9 +777,9 @@ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, "rfdc": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.2.tgz", - "integrity": "sha512-92ktAgvZhBzYTIK0Mja9uen5q5J3NRVMoDkJL2VMwq6SXjVCgqvQeVP2XAaUY6HT+XpQYeLSjb3UoitBryKmdA==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" }, "rhea": { "version": "0.3.9", @@ -819,42 +834,56 @@ } }, "streamroller": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-0.7.0.tgz", - "integrity": "sha512-WREzfy0r0zUqp3lGO096wRuUp7ho1X6uo/7DJfTlEi0Iv/4gT7YHqXDjKC2ioVGBZtE8QzsQD9nx1nIuoZ57jQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.2.tgz", + "integrity": "sha512-ur6y5S5dopOaRXBuRIZ1u6GC5bcEXHRZKgfBjfCglMhmIf+roVCECjvkEYzNQOXIN2/JPnkMPW/8B3CZoKaEPA==", "requires": { - "date-format": "^1.2.0", - "debug": "^3.1.0", - "mkdirp": "^0.5.1", - "readable-stream": "^2.3.0" + "date-format": "^4.0.3", + "debug": "^4.1.1", + "fs-extra": "^10.0.0" }, "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "ms": "2.1.2" } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", "requires": { - "safe-buffer": "~5.1.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" } + }, + "graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" } } }, @@ -884,6 +913,11 @@ } } }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -935,15 +969,10 @@ "requires-port": "^1.0.0" } }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" }, "verror": { "version": "1.10.0", @@ -955,6 +984,20 @@ "extsprintf": "^1.2.0" } }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "win-ca": { "version": "3.4.5", "resolved": "https://registry.npmjs.org/win-ca/-/win-ca-3.4.5.tgz", diff --git a/Common/package.json b/Common/package.json index 6a8072eb..4f21aef5 100644 --- a/Common/package.json +++ b/Common/package.json @@ -5,7 +5,7 @@ "private": true, "dependencies": { "amqplib": "^0.8.0", - "aws-sdk": "^2.346.0", + "aws-sdk": "^2.1074.0", "co": "^4.6.0", "config": "^2.0.1", "content-disposition": "^0.5.3", @@ -15,7 +15,7 @@ "fs-extra": "^7.0.0", "ipaddr.js": "^1.8.1", "jsonwebtoken": "^8.3.0", - "log4js": "^3.0.6", + "log4js": "^6.4.1", "mime": "^2.3.1", "mkdirp": "^0.5.1", "ms": "^2.1.1", diff --git a/Common/sources/commondefines.js b/Common/sources/commondefines.js index 03d31e26..a592abcf 100644 --- a/Common/sources/commondefines.js +++ b/Common/sources/commondefines.js @@ -794,6 +794,8 @@ function OutputSfcData(key) { this['notmodified'] = undefined; this['forcesavetype'] = undefined; this['encrypted'] = undefined; + + this['token'] = undefined; } OutputSfcData.prototype.getKey = function() { return this['key']; @@ -879,6 +881,12 @@ OutputSfcData.prototype.getEncrypted = function() { OutputSfcData.prototype.setEncrypted = function(v) { this['encrypted'] = v; }; +OutputSfcData.prototype.getToken = function() { + return this['token'] +}; +OutputSfcData.prototype.setToken = function(v) { + this['token'] = v; +}; function OutputMailMerge(mailMergeSendData) { if (mailMergeSendData) { diff --git a/Common/sources/storage-s3.js b/Common/sources/storage-s3.js index 5acaf5e8..e0264ff4 100644 --- a/Common/sources/storage-s3.js +++ b/Common/sources/storage-s3.js @@ -36,7 +36,6 @@ var url = require('url'); var path = require('path'); var AWS = require('aws-sdk'); var mime = require('mime'); -var s3urlSigner = require('amazon-s3-url-signer'); var utils = require('./utils'); const ms = require('ms'); const commonDefines = require('./../../Common/sources/commondefines'); diff --git a/Common/sources/utils.js b/Common/sources/utils.js index 150e44fc..3c0f24a7 100644 --- a/Common/sources/utils.js +++ b/Common/sources/utils.js @@ -76,7 +76,6 @@ var cfgSignatureSecretOutbox = config.get('services.CoAuthoring.secret.outbox'); var cfgVisibilityTimeout = config.get('queue.visibilityTimeout'); var cfgQueueRetentionPeriod = config.get('queue.retentionPeriod'); var cfgRequestDefaults = config.get('services.CoAuthoring.requestDefaults'); -const cfgTokenOutboxInBody = config.get('services.CoAuthoring.token.outbox.inBody'); const cfgTokenEnableRequestOutbox = config.get('services.CoAuthoring.token.enable.request.outbox'); const cfgTokenOutboxUrlExclusionRegex = config.get('services.CoAuthoring.token.outbox.urlExclusionRegex'); const cfgPasswordEncrypt = config.get('openpgpjs.encrypt'); @@ -331,6 +330,10 @@ function downloadUrlPromiseWithoutRedirect(uri, optTimeout, optLimit, opt_Author }; } let fResponse = function(response) { + if (opt_streamWriter) { + //Set-Cookie resets browser session + response.caseless.del('Set-Cookie'); + } var contentLength = response.caseless.get('content-length'); if (contentLength && (contentLength - 0) > sizeLimit) { raiseError(this, 'EMSGSIZE', 'Error response: content-length:' + contentLength); @@ -843,17 +846,15 @@ function getSecret(docId, secretElem, opt_iss, opt_token) { return getSecretByElem(secretElem); } exports.getSecret = getSecret; -function fillJwtForRequest(opt_payload) { +function fillJwtForRequest(payload, opt_inBody) { + //todo refuse prototypes in payload(they are simple getter/setter). + //JSON.parse/stringify is more universal but Object.assign is enough for our inputs + payload = Object.assign(Object.create(null), payload); let data; - if (cfgTokenOutboxInBody) { - //todo refuse prototypes in opt_payload(they are simple getter/setter). - //JSON.parse/stringify is more universal but Object.assign is enough for our inputs - data = Object.assign(Object.create(null), opt_payload); + if (opt_inBody) { + data = payload; } else { - data = {}; - if(opt_payload){ - data.payload = opt_payload; - } + data = {payload: payload}; } let options = {algorithm: cfgTokenOutboxAlgorithm, expiresIn: cfgTokenOutboxExpires}; diff --git a/DocService/npm-shrinkwrap.json b/DocService/npm-shrinkwrap.json index 2dfea092..105bf276 100644 --- a/DocService/npm-shrinkwrap.json +++ b/DocService/npm-shrinkwrap.json @@ -28,6 +28,17 @@ } } }, + "ajv": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, "apicache": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/apicache/-/apicache-1.6.2.tgz", @@ -433,6 +444,11 @@ } } }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, "faye-websocket": { "version": "0.11.4", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", @@ -512,6 +528,11 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, "json5": { "version": "1.0.1", "resolved": "http://registry.npmjs.org/json5/-/json5-1.0.1.tgz", @@ -846,6 +867,11 @@ "ipaddr.js": "1.9.1" } }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", @@ -920,6 +946,11 @@ "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-1.3.0.tgz", "integrity": "sha1-gG6+e7+3005NfB6e8oLvz60EEmo=" }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, "retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", @@ -1095,6 +1126,14 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, "utf7": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/utf7/-/utf7-1.0.2.tgz", diff --git a/DocService/package.json b/DocService/package.json index d7ca881f..0224d259 100644 --- a/DocService/package.json +++ b/DocService/package.json @@ -9,6 +9,7 @@ "prepare4shutdown": "sources/shutdown.js" }, "dependencies": { + "ajv": "^8.9.0", "apicache": "^1.6.2", "base64-stream": "^1.0.0", "body-parser": "^1.18.3", diff --git a/DocService/sources/DocsCoServer.js b/DocService/sources/DocsCoServer.js index e8d5de6a..88ede82d 100644 --- a/DocService/sources/DocsCoServer.js +++ b/DocService/sources/DocsCoServer.js @@ -134,8 +134,6 @@ const cfgTokenSessionAlgorithm = config.get('token.session.algorithm'); const cfgTokenSessionExpires = ms(config.get('token.session.expires')); const cfgTokenInboxHeader = config.get('token.inbox.header'); const cfgTokenInboxPrefix = config.get('token.inbox.prefix'); -const cfgTokenInboxInBody = config.get('token.inbox.inBody'); -const cfgTokenOutboxInBody = config.get('token.outbox.inBody'); const cfgTokenBrowserSecretFromInbox = config.get('token.browser.secretFromInbox'); const cfgTokenVerifyOptions = config.get('token.verifyOptions'); const cfgSecretBrowser = config.get('secret.browser'); @@ -152,6 +150,7 @@ const cfgWarningLimitPercents = configCommon.get('license.warning_limit_percents const cfgErrorFiles = configCommon.get('FileConverter.converter.errorfiles'); const cfgOpenProtectedFile = config.get('server.openProtectedFile'); const cfgRefreshLockInterval = ms(configCommon.get('wopi.refreshLockInterval')); +const cfgTokenRequiredParams = config.get('server.tokenRequiredParams'); const EditorTypes = { document : 0, @@ -658,18 +657,18 @@ function* getOriginalParticipantsId(docId) { return result; } -function* sendServerRequest(docId, uri, dataObject, opt_checkAuthorization) { +function* sendServerRequest(docId, uri, dataObject, opt_checkAndFixAuthorizationLength) { logger.debug('postData request: docId = %s;url = %s;data = %j', docId, uri, dataObject); let auth; if (utils.canIncludeOutboxAuthorization(uri)) { - auth = utils.fillJwtForRequest(dataObject); - if (cfgTokenOutboxInBody) { - dataObject = {token: auth}; - auth = undefined; - } else if (opt_checkAuthorization && !opt_checkAuthorization(auth, dataObject)) { - auth = utils.fillJwtForRequest(dataObject); - logger.warn('authorization reduced to: docId = %s; length=%d', docId, auth.length); + let bodyToken = utils.fillJwtForRequest(dataObject, true); + auth = utils.fillJwtForRequest(dataObject, false); + let authLen = auth.length; + if (opt_checkAndFixAuthorizationLength && !opt_checkAndFixAuthorizationLength(auth, dataObject)) { + auth = utils.fillJwtForRequest(dataObject, false); + logger.warn('authorization too large. Use body token instead. size reduced from %d to %d: docId = %s', authLen, auth.length, docId); } + dataObject.setToken(bodyToken); } let postRes = yield utils.postRequestPromise(uri, JSON.stringify(dataObject), undefined, cfgCallbackRequestTimeout, auth); logger.debug('postData response: docId = %s;data = %s', docId, postRes.body); @@ -1169,18 +1168,7 @@ function checkJwtHeader(docId, req, opt_header, opt_prefix, opt_secretType) { } return null; } -function checkJwtPayloadHash(docId, hash, body, token) { - var res = false; - if (body && Buffer.isBuffer(body)) { - var decoded = jwt.decode(token, {complete: true}); - var hmac = jwa(decoded.header.alg); - var secret = utils.getSecret(docId, cfgSecretInbox, null, token); - var signature = hmac.sign(body, secret); - res = (hash === signature); - } - return res; -} -function getRequestParams(docId, req, opt_isNotInBody, opt_tokenAssign) { +function getRequestParams(docId, req, opt_isNotInBody) { let res = {code: constants.NO_ERROR, params: undefined}; if (req.body && Buffer.isBuffer(req.body) && req.body.length > 0 && !opt_isNotInBody) { res.params = JSON.parse(req.body.toString('utf8')); @@ -1190,33 +1178,26 @@ function getRequestParams(docId, req, opt_isNotInBody, opt_tokenAssign) { if (cfgTokenEnableRequestInbox) { res.code = constants.VKEY; let checkJwtRes; - if (cfgTokenInboxInBody && !opt_isNotInBody) { + if (res.params.token) { checkJwtRes = checkJwt(docId, res.params.token, commonDefines.c_oAscSecretType.Inbox); } else { - //for compatibility checkJwtRes = checkJwtHeader(docId, req); } if (checkJwtRes) { if (checkJwtRes.decoded) { res.code = constants.NO_ERROR; - if (cfgTokenInboxInBody && !opt_tokenAssign) { - res.params = checkJwtRes.decoded; - } else { - //for compatibility - if (!utils.isEmptyObject(checkJwtRes.decoded.payload)) { - Object.assign(res.params, checkJwtRes.decoded.payload); - } else if (checkJwtRes.decoded.payloadhash) { - if (!checkJwtPayloadHash(docId, checkJwtRes.decoded.payloadhash, req.body, checkJwtRes.token)) { - res.code = constants.VKEY; - } - } else if (!utils.isEmptyObject(checkJwtRes.decoded.query)) { - Object.assign(res.params, checkJwtRes.decoded.query); - } + if (cfgTokenRequiredParams) { + res.params = {}; } - } else { - if (constants.JWT_EXPIRED_CODE == checkJwtRes.code) { - res.code = constants.VKEY_KEY_EXPIRE; + Object.assign(res.params, checkJwtRes.decoded); + if (!utils.isEmptyObject(checkJwtRes.decoded.payload)) { + Object.assign(res.params, checkJwtRes.decoded.payload); } + if (!utils.isEmptyObject(checkJwtRes.decoded.query)) { + Object.assign(res.params, checkJwtRes.decoded.query); + } + } else if (constants.JWT_EXPIRED_CODE == checkJwtRes.code) { + res.code = constants.VKEY_KEY_EXPIRE; } } } @@ -1273,7 +1254,6 @@ exports.getExternalChangeInfo = getExternalChangeInfo; exports.checkJwt = checkJwt; exports.getRequestParams = getRequestParams; exports.checkJwtHeader = checkJwtHeader; -exports.checkJwtPayloadHash = checkJwtPayloadHash; exports.install = function(server, callbackFunction) { var sockjs_echo = sockjs.createServer(cfgSockjs), urlParse = new RegExp("^/doc/([" + constants.DOC_ID_PATTERN + "]*)/c.+", 'i'); @@ -1950,6 +1930,27 @@ exports.install = function(server, callbackFunction) { //not '=' because if it jwt from previous version, we must use values from data Object.assign(data.permissions, permissions); } + + //issuer for secret + if (decoded.iss) { + data.iss = decoded.iss; + } + return res; + } + function validateAuthToken(data, decoded) { + var res = ""; + if (!decoded?.document?.key) { + res = "document.key"; + } else if (!decoded?.document?.permissions) { + res = "document.permissions"; + } else if (!decoded?.document?.url) { + res = "document.url"; + } else if (data.documentCallbackUrl && !decoded?.editorConfig?.callbackUrl) { + //todo callbackUrl required + res = "editorConfig.callbackUrl"; + } else if (data.mode && !decoded?.editorConfig?.mode) { + res = "editorConfig.mode"; + } return res; } function fillDataFromJwt(decoded, data) { @@ -1965,6 +1966,9 @@ exports.install = function(server, callbackFunction) { } if(doc.permissions) { res = deepEqual(data.permissions, doc.permissions, {strict: true}); + if (!res) { + logger.warn('fillDataFromJwt token has modified permissions docId = %s', data.docid); + } if(!data.permissions){ data.permissions = {}; } @@ -2013,7 +2017,7 @@ exports.install = function(server, callbackFunction) { if (edit.user) { var dataUser = data.user; var user = edit.user; - if (null != user.id) { + if (user.id) { dataUser.id = user.id; if (openCmd) { openCmd.userid = user.id; @@ -2022,25 +2026,28 @@ exports.install = function(server, callbackFunction) { if (null != user.index) { dataUser.indexUser = user.index; } - if (null != user.firstname) { + if (user.firstname) { dataUser.firstname = user.firstname; } - if (null != user.lastname) { + if (user.lastname) { dataUser.lastname = user.lastname; } if (user.name) { dataUser.username = user.name; } + if (user.group) { + //like in Common.Utils.fillUserInfo(web-apps/apps/common/main/lib/util/utils.js) + dataUser.username = user.group.toString() + String.fromCharCode(160) + dataUser.username; + } } if (edit.user && edit.user.name) { data.denyChangeName = true; } } - res = res && fillDataFromWopiJwt(decoded, data); - //todo make required fields if (decoded.url || decoded.payload|| (decoded.key && !decoded.fileInfo)) { + logger.warn('fillDataFromJwt token has invalid format docId = %s', data.docid); res = false; } @@ -2088,7 +2095,29 @@ exports.install = function(server, callbackFunction) { commonDefines.c_oAscSecretType.Browser; const checkJwtRes = checkJwt(docId, data.jwtSession || data.jwtOpen, secretType); if (checkJwtRes.decoded) { - if (!fillDataFromJwt(checkJwtRes.decoded, data)) { + let decoded = checkJwtRes.decoded; + let fillDataFromJwtRes = false; + if (decoded.fileInfo) { + //wopi + fillDataFromJwtRes = fillDataFromWopiJwt(decoded, data); + } else if (decoded.editorConfig && undefined !== decoded.editorConfig.ds_view) { + //reconnection + fillDataFromJwtRes = fillDataFromJwt(decoded, data); + } else { + //opening + let validationErr = validateAuthToken(data, decoded); + if (!validationErr) { + fillDataFromJwtRes = fillDataFromJwt(decoded, data); + } else if (cfgTokenRequiredParams) { + logger.error("auth missing required parameter %s (since 7.1 version): docId = %s ", validationErr, docId); + conn.close(constants.JWT_ERROR_CODE, constants.JWT_ERROR_REASON); + return; + } else { + logger.warn("auth missing required parameter %s (since 7.1 version): docId = %s ", validationErr, docId); + fillDataFromJwtRes = fillDataFromJwt(decoded, data); + } + } + if(!fillDataFromJwtRes) { logger.warn("fillDataFromJwt return false: docId = %s", docId); conn.close(constants.ACCESS_DENIED_CODE, constants.ACCESS_DENIED_REASON); return; @@ -2718,7 +2747,7 @@ exports.install = function(server, callbackFunction) { } yield* publish({type: commonDefines.c_oPublishType.changes, docId: docId, userId: userId, changes: changesToSend, startIndex: startIndex, changesIndex: puckerIndex, - locks: arrLocks, excelAdditionalInfo: data.excelAdditionalInfo}, docId, userId); + locks: arrLocks, excelAdditionalInfo: data.excelAdditionalInfo, endSaveChanges: data.endSaveChanges}, docId, userId); } // Автоматически снимаем lock сами и посылаем индекс для сохранения yield* unSaveLock(conn, changesIndex, newChangesLastTime); @@ -2736,7 +2765,7 @@ exports.install = function(server, callbackFunction) { } let isPublished = yield* publish({type: commonDefines.c_oPublishType.changes, docId: docId, userId: userId, changes: changesToSend, startIndex: startIndex, changesIndex: puckerIndex, - locks: [], excelAdditionalInfo: undefined}, docId, userId); + locks: [], excelAdditionalInfo: undefined, endSaveChanges: data.endSaveChanges}, docId, userId); sendData(conn, {type: 'savePartChanges', changesIndex: changesIndex}); if (!isPublished) { //stub for lockDocumentsTimerId @@ -3025,7 +3054,8 @@ exports.install = function(server, callbackFunction) { return; } sendData(participant, {type: 'saveChanges', changes: changes, - changesIndex: data.changesIndex, locks: data.locks, excelAdditionalInfo: data.excelAdditionalInfo}); + changesIndex: data.changesIndex, endSaveChanges: data.endSaveChanges, + locks: data.locks, excelAdditionalInfo: data.excelAdditionalInfo}); }); } break; @@ -3367,8 +3397,8 @@ exports.licenseInfo = function(req, res) { var precisionSum = {}; for (let i = 0; i < PRECISION.length; ++i) { precisionSum[PRECISION[i].name] = { - edit: {min: Number.MAX_VALUE, sum: 0, count: 0, max: 0}, - view: {min: Number.MAX_VALUE, sum: 0, count: 0, max: 0} + edit: {min: Number.MAX_VALUE, sum: 0, count: 0, intervalsInPresision: PRECISION[i].val / expDocumentsStep, max: 0}, + view: {min: Number.MAX_VALUE, sum: 0, count: 0, intervalsInPresision: PRECISION[i].val / expDocumentsStep, max: 0} }; output.connectionsStat[PRECISION[i].name] = { edit: {min: 0, avr: 0, max: 0}, @@ -3377,37 +3407,45 @@ exports.licenseInfo = function(req, res) { } var redisRes = yield editorData.getEditorConnections(); const now = Date.now(); - var precisionIndex = 0; - for (let i = redisRes.length - 1; i >= 1; i -= 2) { - for (let j = precisionIndex; j < PRECISION.length; ++j) { + if (redisRes.length > 0) { + let expDocumentsStep95 = expDocumentsStep * 0.95; + let prevTime = Number.MAX_VALUE; + var precisionIndex = 0; + for (let i = redisRes.length - 1; i >= 0; i--) { let elem = redisRes[i]; - if (now - elem.time < PRECISION[j].val) { - let precision = precisionSum[PRECISION[j].name]; - precision.edit.min = Math.min(precision.edit.min, elem.edit); - precision.edit.max = Math.max(precision.edit.max, elem.edit); - precision.edit.sum += elem.edit; - precision.edit.count++; - precision.view.min = Math.min(precision.view.min, elem.view); - precision.view.max = Math.max(precision.view.max, elem.view); - precision.view.sum += elem.view; - precision.view.count++; - } else { - precisionIndex = j + 1; + //skip duplicates in cluster + if (prevTime - elem.time >= expDocumentsStep95) { + for (let j = precisionIndex; j < PRECISION.length; ++j) { + if (now - elem.time < PRECISION[j].val) { + let precision = precisionSum[PRECISION[j].name]; + precision.edit.min = Math.min(precision.edit.min, elem.edit); + precision.edit.max = Math.max(precision.edit.max, elem.edit); + precision.edit.sum += elem.edit; + precision.edit.count++; + precision.view.min = Math.min(precision.view.min, elem.view); + precision.view.max = Math.max(precision.view.max, elem.view); + precision.view.sum += elem.view; + precision.view.count++; + } else { + precisionIndex = j + 1; + } + } } + prevTime = elem.time; } - } - for (let i in precisionSum) { - let precision = precisionSum[i]; - let precisionOut = output.connectionsStat[i]; - if (precision.edit.count > 0) { - precisionOut.edit.avr = Math.round(precision.edit.sum / precision.edit.count); - precisionOut.edit.min = precision.edit.min; - precisionOut.edit.max = precision.edit.max; - } - if (precision.view.count > 0) { - precisionOut.view.avr = Math.round(precision.view.sum / precision.view.count); - precisionOut.view.min = precision.view.min; - precisionOut.view.max = precision.view.max; + for (let i in precisionSum) { + let precision = precisionSum[i]; + let precisionOut = output.connectionsStat[i]; + if (precision.edit.count > 0) { + precisionOut.edit.avr = Math.round(precision.edit.sum / precision.edit.intervalsInPresision); + precisionOut.edit.min = precision.edit.min; + precisionOut.edit.max = precision.edit.max; + } + if (precision.view.count > 0) { + precisionOut.view.avr = Math.round(precision.view.sum / precision.view.intervalsInPresision); + precisionOut.view.min = precision.view.min; + precisionOut.view.max = precision.view.max; + } } } const nowUTC = getLicenseNowUtc(); diff --git a/DocService/sources/canvasservice.js b/DocService/sources/canvasservice.js index 989de2af..21e0121c 100644 --- a/DocService/sources/canvasservice.js +++ b/DocService/sources/canvasservice.js @@ -71,6 +71,7 @@ const cfgAssemblyFormatAsOrigin = config.get('services.CoAuthoring.server.assemb const cfgCallbackRequestTimeout = config.get('services.CoAuthoring.server.callbackRequestTimeout'); const cfgDownloadMaxBytes = config.get('FileConverter.converter.maxDownloadBytes'); const cfgDownloadTimeout = config.get('FileConverter.converter.downloadTimeout'); +const cfgDownloadFileAllowExt = config.get('services.CoAuthoring.server.downloadFileAllowExt'); var SAVE_TYPE_PART_START = 0; var SAVE_TYPE_PART = 1; @@ -621,7 +622,7 @@ function* commandImgurls(conn, cmd, outputData) { } for (let i = 0; i < urls.length; ++i) { if (utils.canIncludeOutboxAuthorization(urls[i])) { - authorizations[i] = [utils.fillJwtForRequest({url: urls[i]})]; + authorizations[i] = [utils.fillJwtForRequest({url: urls[i]}, false)]; } } } else { @@ -822,14 +823,12 @@ function* commandChangeDocInfo(conn, cmd, outputData) { outputData.setData(constants.CHANGE_DOC_INFO); } } -function checkAuthorizationLength(authorization, data){ +function checkAndFixAuthorizationLength(authorization, data){ //todo it is stub (remove in future versions) - //8kb(https://stackoverflow.com/questions/686217/maximum-on-http-header-values) - 1kb(for other header) + //8kb(https://stackoverflow.com/questions/686217/maximum-on-http-header-values) - 1kb(for other headers) let res = authorization.length < 7168; if (!res) { - logger.warn('authorization too long: docId = %s; length=%d', data.getKey(), authorization.length); data.setChangeUrl(undefined); - //for backward compatibility. remove this when Community is ready data.setChangeHistory({}); } return res; @@ -983,7 +982,7 @@ function* commandSfcCallback(cmd, isSfcm, isEncrypted) { if (wopiParams) { replyStr = yield processWopiPutFile(docId, wopiParams, savePathDoc, userLastChangeId); } else { - replyStr = yield* docsCoServer.sendServerRequest(docId, uri, outputSfc, checkAuthorizationLength); + replyStr = yield* docsCoServer.sendServerRequest(docId, uri, outputSfc, checkAndFixAuthorizationLength); } let replyData = docsCoServer.parseReplyData(docId, replyStr); isSfcmSuccess = replyData && commonDefines.c_oAscServerCommandErrors.NoError == replyData.error; @@ -1015,7 +1014,7 @@ function* commandSfcCallback(cmd, isSfcm, isEncrypted) { if (wopiParams) { replyStr = yield processWopiPutFile(docId, wopiParams, savePathDoc, userLastChangeId); } else { - replyStr = yield* docsCoServer.sendServerRequest(docId, uri, outputSfc, checkAuthorizationLength); + replyStr = yield* docsCoServer.sendServerRequest(docId, uri, outputSfc, checkAndFixAuthorizationLength); } } catch (err) { logger.error('sendServerRequest error: docId = %s;url = %s;data = %j\r\n%s', docId, uri, outputSfc, err.stack); @@ -1078,9 +1077,12 @@ function* commandSfcCallback(cmd, isSfcm, isEncrypted) { logger.error('Error storeForgotten: docId = %s\r\n%s', docId, err.stack); } if (!isSfcm) { + //todo simultaneous opening + //to unlock wopi file + yield docsCoServer.cleanDocumentOnExitPromise(docId, true, callbackUserIndex); //cleanupRes can be false in case of simultaneous opening. it is OK let cleanupRes = yield cleanupCacheIf(updateMask); - logger.debug('storeForgotten cleanupRes=%s', cleanupRes); + logger.debug('storeForgotten cleanupRes=%s: docId = %s', cleanupRes, docId); } } if (forceSave) { @@ -1472,15 +1474,26 @@ exports.downloadFile = function(req, res) { let authorization; if (cfgTokenEnableBrowser) { let checkJwtRes = docsCoServer.checkJwtHeader(docId, req, 'Authorization', 'Bearer ', commonDefines.c_oAscSecretType.Browser); + let errorDescription; if (checkJwtRes.decoded) { - url = checkJwtRes.decoded.changesUrl; + let decoded = checkJwtRes.decoded; + if (decoded.changesUrl) { + url = decoded.changesUrl; + } else if (decoded.document && -1 !== cfgDownloadFileAllowExt.indexOf(decoded.document.fileType)) { + url = decoded.document.url; + } else { + errorDescription = 'access deny'; + } } else { - logger.warn('Error downloadFile jwt: docId = %s description = %s', docId, checkJwtRes.description); + errorDescription = checkJwtRes.description; + } + if (errorDescription) { + logger.warn('Error downloadFile jwt: docId = %s description = %s', docId, errorDescription); res.sendStatus(403); return; } if (utils.canIncludeOutboxAuthorization(url)) { - authorization = utils.fillJwtForRequest({url: url}); + authorization = utils.fillJwtForRequest({url: url}, false); } } diff --git a/DocService/sources/converterservice.js b/DocService/sources/converterservice.js index 6c53b423..2f34e01b 100644 --- a/DocService/sources/converterservice.js +++ b/DocService/sources/converterservice.js @@ -248,6 +248,9 @@ function convertRequest(req, res, isJson) { if (params.region && locale[params.region.toLowerCase()]) { cmd.setLCID(locale[params.region.toLowerCase()].id); } + if (params.documentLayout) { + cmd.setJsonParams(JSON.stringify({'documentLayout': params.documentLayout})); + } if (params.spreadsheetLayout) { cmd.setJsonParams(JSON.stringify({'spreadsheetLayout': params.spreadsheetLayout})); } @@ -287,24 +290,23 @@ function convertRequest(req, res, isJson) { cmd.setOutputFormat(constants.AVS_OFFICESTUDIO_FILE_IMAGE); } } - var textParams = params.textParams; - if (textParams) { - if (typeof textParams === 'string') { - textParams = JSON.parse(textParams); + var documentRenderer = params.documentRenderer; + if (documentRenderer) { + if (typeof documentRenderer === 'string') { + documentRenderer = JSON.parse(documentRenderer); } - var textParamsData = new commonDefines.CTextParams(textParams); - //todo text - switch (textParams.association) { - case 'block': + var textParamsData = new commonDefines.CTextParams(); + switch (documentRenderer.textAssociation) { + case 'plainParagraph': textParamsData.setAssociation(3); break; - case 'noFrames': + case 'plainLine': textParamsData.setAssociation(2); break; - case 'line': + case 'blockLine': textParamsData.setAssociation(1); break; - case 'char': + case 'blockChar': default: textParamsData.setAssociation(0); break; @@ -352,7 +354,7 @@ function builderRequest(req, res) { let authRes; if (!utils.isEmptyObject(req.query)) { //todo this is a stub for compatibility. remove in future version - authRes = docsCoServer.getRequestParams(docId, req, true, true); + authRes = docsCoServer.getRequestParams(docId, req, true); } else { authRes = docsCoServer.getRequestParams(docId, req); } diff --git a/DocService/sources/editorDataMemory.js b/DocService/sources/editorDataMemory.js index 596f517a..4c6e4e86 100644 --- a/DocService/sources/editorDataMemory.js +++ b/DocService/sources/editorDataMemory.js @@ -350,7 +350,7 @@ EditorData.prototype.setLicense = function(key, val) { return Promise.resolve(); }; EditorData.prototype.getLicense = function(key) { - return Promise.resolve(false); + return Promise.resolve(null); }; EditorData.prototype.isConnected = function() { diff --git a/FileConverter/sources/converter.js b/FileConverter/sources/converter.js index beb43893..63e450ee 100644 --- a/FileConverter/sources/converter.js +++ b/FileConverter/sources/converter.js @@ -316,7 +316,7 @@ function* downloadFile(docId, uri, fileFrom, withAuthorization, filterPrivate, o try { let authorization; if (utils.canIncludeOutboxAuthorization(uri) && withAuthorization) { - authorization = utils.fillJwtForRequest({url: uri}); + authorization = utils.fillJwtForRequest({url: uri}, false); } let getRes = yield utils.downloadUrlPromise(uri, cfgDownloadTimeout, cfgDownloadMaxBytes, authorization, filterPrivate, opt_headers); data = getRes.body; diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 468f6723..6d82d0cc 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -70,9 +70,9 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" }, "async": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz", - "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==" + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" }, "atob": { "version": "2.1.2", @@ -696,24 +696,24 @@ } }, "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" }, "grunt": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.3.0.tgz", - "integrity": "sha512-6ILlMXv11/4cxuhSMfSU+SfvbxrPuqZrAtLN64+tZpQ3DAKfSQPQHRbTjSbdtxfyQhGZPtN0bDZJ/LdCM5WXXA==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.4.1.tgz", + "integrity": "sha512-ZXIYXTsAVrA7sM+jZxjQdrBOAg7DyMUplOMhTaspMRExei+fD0BTwdWXnn0W5SXqhb/Q/nlkzXclSi3IH55PIA==", "requires": { "dateformat": "~3.0.3", "eventemitter2": "~0.4.13", "exit": "~0.1.2", "findup-sync": "~0.3.0", "glob": "~7.1.6", - "grunt-cli": "~1.3.2", - "grunt-known-options": "~1.1.0", + "grunt-cli": "~1.4.2", + "grunt-known-options": "~2.0.0", "grunt-legacy-log": "~3.0.0", - "grunt-legacy-util": "~2.0.0", + "grunt-legacy-util": "~2.0.1", "iconv-lite": "~0.4.13", "js-yaml": "~3.14.0", "minimatch": "~3.0.4", @@ -723,15 +723,15 @@ }, "dependencies": { "grunt-cli": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.3.2.tgz", - "integrity": "sha512-8OHDiZZkcptxVXtMfDxJvmN7MVJNE8L/yIcPb4HB7TlyFD1kDvjHrb62uhySsU14wJx9ORMnTuhRMQ40lH/orQ==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz", + "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==", "requires": { - "grunt-known-options": "~1.1.0", + "grunt-known-options": "~2.0.0", "interpret": "~1.1.0", - "liftoff": "~2.5.0", + "liftup": "~3.0.1", "nopt": "~4.0.1", - "v8flags": "~3.1.1" + "v8flags": "~3.2.0" }, "dependencies": { "nopt": { @@ -801,9 +801,9 @@ } }, "grunt-known-options": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz", - "integrity": "sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz", + "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==" }, "grunt-legacy-log": { "version": "3.0.0", @@ -834,9 +834,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -877,9 +877,9 @@ } }, "grunt-mkdir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-mkdir/-/grunt-mkdir-1.0.0.tgz", - "integrity": "sha1-c+GiasJKCFljY/TdlUsNMkheWOk=" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grunt-mkdir/-/grunt-mkdir-1.1.0.tgz", + "integrity": "sha512-FRE17OYVveNbVJFX8GPGa5bzH2ZiAdBx3q0Kwk2Dg6l+TzLGaTdufUxiUWUbS2MERFacnmXZwDDOR5ZbYW0o+Q==" }, "grunt-stripcomments": { "version": "0.7.2", @@ -1017,9 +1017,9 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-core-module": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz", - "integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", "requires": { "has": "^1.0.3" } @@ -1140,9 +1140,9 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" }, "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -1153,31 +1153,77 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" }, - "liftoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", - "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", + "liftup": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", + "integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==", "requires": { - "extend": "^3.0.0", - "findup-sync": "^2.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", + "extend": "^3.0.2", + "findup-sync": "^4.0.0", + "fined": "^1.2.0", + "flagged-respawn": "^1.0.1", "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" + "object.map": "^1.0.1", + "rechoir": "^0.7.0", + "resolve": "^1.19.0" }, "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", + "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", "requires": { "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", + "is-glob": "^4.0.0", + "micromatch": "^4.0.2", "resolve-dir": "^1.0.1" } + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } } } }, @@ -1275,9 +1321,9 @@ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" }, "mout": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/mout/-/mout-1.2.2.tgz", - "integrity": "sha512-w0OUxFEla6z3d7sVpMZGBCpQvYh8PHS1wZ6Wu9GNKHMpAHWJ0if0LsQZh3DlOqw55HlhJEOMLpFnwtxp99Y5GA==" + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/mout/-/mout-1.2.3.tgz", + "integrity": "sha512-vtE+eZcSj/sBkIp6gxB87MznryWP+gHIp0XX9SKrzA5TAkvz6y7VTuNruBjYdJozd8NY5i9XVIsn8cn3SwNjzg==" }, "ms": { "version": "2.0.0", @@ -1444,17 +1490,22 @@ "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=" }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", "requires": { - "resolve": "^1.1.6" + "resolve": "^1.9.0" } }, "regex-not": { @@ -1467,9 +1518,9 @@ } }, "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==" }, "repeat-string": { "version": "1.6.1", @@ -1477,12 +1528,13 @@ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, "resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", + "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", "requires": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.8.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, "resolve-dir": { @@ -1666,9 +1718,9 @@ } }, "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" }, "split-string": { "version": "3.1.0", @@ -1715,6 +1767,11 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -1838,9 +1895,9 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "v8flags": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", - "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", "requires": { "homedir-polyfill": "^1.0.1" } diff --git a/package.json b/package.json index 88b3b72d..5a67c940 100644 --- a/package.json +++ b/package.json @@ -54,12 +54,12 @@ "./build/server/Metrics" ], "dependencies": { - "grunt": "^1.3.0", + "grunt": "^1.4.1", "grunt-banner": "^0.6.0", "grunt-check-dependencies": "^1.0.0", "grunt-contrib-clean": "^2.0.0", "grunt-contrib-copy": "^1.0.0", - "grunt-stripcomments": "^0.7.2", - "grunt-mkdir": "^1.0.0" + "grunt-mkdir": "^1.1.0", + "grunt-stripcomments": "^0.7.2" } } diff --git a/schema/json-api/opening-file.json b/schema/json-api/opening-file.json new file mode 100644 index 00000000..93516e65 --- /dev/null +++ b/schema/json-api/opening-file.json @@ -0,0 +1,86 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "https://example.com/example.json", + "type": "object", + "required": [ + "document", + "editorConfig" + ], + "properties": { + "document": { + "$id": "#/properties/document", + "type": "object", + "required": [ + "key", + "permissions", + "url" + ], + "properties": { + "key": { + "$id": "#/properties/document/properties/key", + "type": "string" + }, + "permissions": { + "$id": "#/properties/document/properties/permissions", + "type": "object", + "required": [], + "additionalProperties": true + }, + "url": { + "$id": "#/properties/document/properties/url", + "type": "string" + } + }, + "additionalProperties": true + }, + "editorConfig": { + "$id": "#/properties/editorConfig", + "type": "object", + "required": [ + "callbackUrl", + "mode" + ], + "properties": { + "callbackUrl": { + "$id": "#/properties/editorConfig/properties/callbackUrl", + "type": "string" + }, + "mode": { + "$id": "#/properties/editorConfig/properties/mode", + "type": "string" + }, + "user": { + "$id": "#/properties/editorConfig/properties/user", + "type": "object", + "required": [], + "properties": { + "group": { + "$id": "#/properties/editorConfig/properties/user/properties/group", + "type": "string" + }, + "id": { + "$id": "#/properties/editorConfig/properties/user/properties/id", + "anyOf": [ + { + "$id": "#/properties/editorConfig/properties/user/properties/id/anyOf/0", + "type": "string" + }, + { + "$id": "#/properties/editorConfig/properties/user/properties/id/anyOf/1", + "type": "integer" + } + ] + }, + "name": { + "$id": "#/properties/editorConfig/properties/user/properties/name", + "type": "string" + } + }, + "additionalProperties": true + } + }, + "additionalProperties": true + } + }, + "additionalProperties": true +} \ No newline at end of file