Merge branch 'staging' into plugins

This commit is contained in:
yflory 2024-06-21 17:01:45 +02:00
commit 3c8e6b16a1
13 changed files with 190 additions and 176 deletions

View file

@ -7,6 +7,7 @@ www/components/
www/bower_components/
www/common/onlyoffice/dist
www/common/onlyoffice/x2t
onlyoffice-dist/
www/scratch
www/accounts

View file

@ -89,9 +89,10 @@ module.exports = {
*/
//httpPort: 3000,
/* httpSafePort allows you to specify an alternative port from which
* the node process should serve sandboxed assets. The default value is
* that of your httpPort + 1. You probably don't need to change this.
/* httpSafePort purpose is to emulate another origin for the sandbox when
* you don't have two domains at hand (i.e. when httpSafeOrigin not defined).
* It is meant to be used only in case where you are working on a local
* development instance. The default value is your httpPort + 1.
*
*/
//httpSafePort: 3001,

View file

@ -36,9 +36,6 @@
}
.cp-reminder, .cp-avatar {
cursor: pointer;
&:hover {
background-color: @cp_dropdown-bg-hover;
}
}
.cp-avatar {
.avatar_main(30px);
@ -61,9 +58,6 @@
}
&.cp-clickable {
cursor: pointer;
&:hover {
background-color: @cp_dropdown-bg-hover;
}
}
}
.cp-notification-dismiss {
@ -73,9 +67,6 @@
align-items: center;
justify-content: center;
cursor: pointer;
&:hover {
background-color: @cp_dropdown-bg-hover;
}
}
}
}

View file

@ -77,6 +77,12 @@
&:hover {
background-color: contrast(@cp_toolbar-bg, darken(@cp_toolbar-bg, 5%), lighten(@cp_toolbar-bg, 5%));
}
&:focus {
outline: @cryptpad_color_brand solid 2px;
}
}
button:nth-of-type(1){
margin-left: 0.3rem;
}
}

View file

@ -9,11 +9,13 @@
# in production and require professional support please contact sales@cryptpad.fr
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
# Let's Encrypt webroot
include letsencrypt-webroot;
# Include mime.types to be able to support .mjs files (see "types" below)
include mime.types;

View file

@ -34,6 +34,7 @@ SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"
downgrade-1.0 force-response-1.0
Protocols h2 http/1.1
LimitRequestBody 157286400
AddType application/javascript mjs
ProxyPass / http://localhost:3000/ upgrade=websocket
ProxyPassReverse / http://localhost:3000/
</VirtualHost>

View file

@ -9,8 +9,9 @@
# in production and require professional support please contact sales@cryptpad.fr
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
# Let's Encrypt webroot
include letsencrypt-webroot;

View file

@ -6,7 +6,7 @@
set -euo pipefail
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)
CONF_DIR=$SCRIPT_DIR/onlyoffice-conf
BUILDS_DIR=$CONF_DIR/onlyoffice-builds.git
OO_DIR=$SCRIPT_DIR/www/common/onlyoffice/dist
@ -14,86 +14,89 @@ PROPS_FILE="$CONF_DIR"/onlyoffice.properties
declare -A PROPS
main () {
mkdir -p "$CONF_DIR"
main() {
mkdir -p "$CONF_DIR"
load_props
load_props
parse_arguments "$@"
parse_arguments "$@"
ask_for_license
ask_for_license
# Remeber the 1st version that is installed. This will help us install only
# needed OnlyOffice versions in a later version of this script.
set_prop oldest_needed_version v1
# Remeber the 1st version that is installed. This will help us install only
# needed OnlyOffice versions in a later version of this script.
set_prop oldest_needed_version v1
mkdir -p "$OO_DIR"
install_version v1 4f370beb
install_version v2b d9da72fd
install_version v4 6ebc6938
install_version v5 88a356f0
install_version v6 abd8a309
install_version v7 9d8b914a
install_x2t v7.3+1 ab0c05b0e4c81071acea83f0c6a8e75f5870c360ec4abc4af09105dd9b52264af9711ec0b7020e87095193ac9b6e20305e446f2321a541f743626a598e5318c1
mkdir -p "$OO_DIR"
install_version v1 4f370beb
install_version v2b d9da72fd
install_version v4 6ebc6938
install_version v5 88a356f0
install_version v6 abd8a309
install_version v7 ba82142f
install_x2t v7.3+1 ab0c05b0e4c81071acea83f0c6a8e75f5870c360ec4abc4af09105dd9b52264af9711ec0b7020e87095193ac9b6e20305e446f2321a541f743626a598e5318c1
rm -rf "$BUILDS_DIR"
if command -v rdfind &> /dev/null; then
rdfind -makehardlinks true -makeresultsfile false $OO_DIR/v*
fi
rm -rf "$BUILDS_DIR"
if command -v rdfind &>/dev/null; then
rdfind -makehardlinks true -makeresultsfile false $OO_DIR/v*
fi
}
load_props () {
if [ -e "$PROPS_FILE" ]; then
while IFS='=' read -r key value; do
PROPS["$key"]="$value"
done < "$PROPS_FILE"
fi
load_props() {
if [ -e "$PROPS_FILE" ]; then
while IFS='=' read -r key value; do
PROPS["$key"]="$value"
done <"$PROPS_FILE"
fi
}
set_prop () {
PROPS["$1"]="$2"
set_prop() {
PROPS["$1"]="$2"
for i in "${!PROPS[@]}"; do
echo "$i=${PROPS[$i]}"
done > "$PROPS_FILE"
for i in "${!PROPS[@]}"; do
echo "$i=${PROPS[$i]}"
done >"$PROPS_FILE"
}
parse_arguments () {
while [[ $# -gt 0 ]]; do
case $1 in
-h|--help)
show_help
shift
;;
-a|--accept-license)
ACCEPT_LICENSE="1"
shift
;;
*)
show_help
shift
;;
esac
done
parse_arguments() {
while [[ $# -gt 0 ]]; do
case $1 in
-h | --help)
show_help
shift
;;
-a | --accept-license)
ACCEPT_LICENSE="1"
shift
;;
*)
show_help
shift
;;
esac
done
}
ask_for_license () {
if [ ${ACCEPT_LICENSE+x} ] || [ "${PROPS[agree_license]:-no}" == yes ]; then
return
fi
ask_for_license() {
if [ ${ACCEPT_LICENSE+x} ] || [ "${PROPS[agree_license]:-no}" == yes ]; then
return
fi
ensure_command_available curl
ensure_command_available curl
(echo -e "Please review the license of OnlyOffice:\n\n" ; curl https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/LICENSE.txt 2>/dev/null) | less
(
echo -e "Please review the license of OnlyOffice:\n\n"
curl https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/LICENSE.txt 2>/dev/null
) | less
read -rp "Do you accept the license? (Y/N): " confirm \
&& [[ $confirm == [yY] || $confirm == [yY][eE][sS] ]] || exit 1
read -rp "Do you accept the license? (Y/N): " confirm &&
[[ $confirm == [yY] || $confirm == [yY][eE][sS] ]] || exit 1
set_prop "agree_license" yes
set_prop "agree_license" yes
}
show_help () {
cat << EOF
show_help() {
cat <<EOF
install-onlyoffice installs or upgrades OnlyOffice.
NOTE: When you have rdfind installed, it will be used to save ~650MB of disk
@ -108,88 +111,87 @@ OPTIONS:
script. Read and accept this before using this option:
https://github.com/ONLYOFFICE/web-apps/blob/master/LICENSE.txt
EOF
exit 1
exit 1
}
ensure_oo_is_downloaded () {
ensure_command_available git
ensure_oo_is_downloaded() {
ensure_command_available git
if ! [ -d "$BUILDS_DIR" ]; then
echo "Downloading OnlyOffice..."
git clone --bare https://github.com/cryptpad/onlyoffice-builds.git "$BUILDS_DIR"
fi
if ! [ -d "$BUILDS_DIR" ]; then
echo "Downloading OnlyOffice..."
git clone --bare https://github.com/cryptpad/onlyoffice-builds.git "$BUILDS_DIR"
fi
}
install_version () {
local DIR=$1
local COMMIT=$2
local FULL_DIR=$OO_DIR/$DIR
local LAST_DIR
LAST_DIR=$(pwd)
install_version() {
local DIR=$1
local COMMIT=$2
local FULL_DIR=$OO_DIR/$DIR
local LAST_DIR
LAST_DIR=$(pwd)
if [ ! -e "$FULL_DIR"/.commit ] || [ "$(cat "$FULL_DIR"/.commit)" != "$COMMIT" ]; then
ensure_oo_is_downloaded
if [ ! -e "$FULL_DIR"/.commit ] || [ "$(cat "$FULL_DIR"/.commit)" != "$COMMIT" ]; then
ensure_oo_is_downloaded
rm -rf "$FULL_DIR"
rm -rf "$FULL_DIR"
cd "$BUILDS_DIR"
git worktree add "$FULL_DIR" "$COMMIT"
cd "$BUILDS_DIR"
git worktree add "$FULL_DIR" "$COMMIT"
cd "$LAST_DIR"
cd "$LAST_DIR"
echo "$COMMIT" > "$FULL_DIR"/.commit
echo "$COMMIT" >"$FULL_DIR"/.commit
echo "$DIR updated"
else
echo "$DIR was up to date"
fi
echo "$DIR updated"
else
echo "$DIR was up to date"
fi
if [ ${CLEAR+x} ]; then
rm -f "$FULL_DIR"/.git
fi
if [ ${CLEAR+x} ]; then
rm -f "$FULL_DIR"/.git
fi
}
install_x2t () {
ensure_command_available curl
ensure_command_available sha512sum
ensure_command_available unzip
install_x2t() {
ensure_command_available curl
ensure_command_available sha512sum
ensure_command_available unzip
local VERSION=$1
local HASH=$2
local LAST_DIR
LAST_DIR=$(pwd)
local X2T_DIR=$OO_DIR/x2t
local VERSION=$1
local HASH=$2
local LAST_DIR
LAST_DIR=$(pwd)
local X2T_DIR=$OO_DIR/x2t
if [ ! -e "$X2T_DIR"/.version ] || [ "$(cat "$X2T_DIR"/.version)" != "$VERSION" ]; then
rm -rf "$X2T_DIR"
mkdir -p "$X2T_DIR"
if [ ! -e "$X2T_DIR"/.version ] || [ "$(cat "$X2T_DIR"/.version)" != "$VERSION" ]; then
rm -rf "$X2T_DIR"
mkdir -p "$X2T_DIR"
cd "$X2T_DIR"
cd "$X2T_DIR"
curl "https://github.com/cryptpad/onlyoffice-x2t-wasm/releases/download/$VERSION/x2t.zip" --location --output x2t.zip
# curl "https://github.com/cryptpad/onlyoffice-x2t-wasm/releases/download/v7.3%2B1/x2t.zip" --location --output x2t.zip
echo "$HASH x2t.zip" > x2t.zip.sha512
if ! sha512sum --check x2t.zip.sha512; then
echo "x2t.zip does not match expected checksum"
exit 1
fi
unzip x2t.zip
rm x2t.zip*
curl "https://github.com/cryptpad/onlyoffice-x2t-wasm/releases/download/$VERSION/x2t.zip" --location --output x2t.zip
# curl "https://github.com/cryptpad/onlyoffice-x2t-wasm/releases/download/v7.3%2B1/x2t.zip" --location --output x2t.zip
echo "$HASH x2t.zip" >x2t.zip.sha512
if ! sha512sum --check x2t.zip.sha512; then
echo "x2t.zip does not match expected checksum"
exit 1
fi
unzip x2t.zip
rm x2t.zip*
echo "$VERSION" > "$X2T_DIR"/.version
echo "$VERSION" >"$X2T_DIR"/.version
echo "x2t updated"
else
echo "x2t was up to date"
fi
echo "x2t updated"
else
echo "x2t was up to date"
fi
}
ensure_command_available () {
if ! command -v "$1" &> /dev/null; then
echo "$1 needs to be installed to run this script"
exit 1
fi
ensure_command_available() {
if ! command -v "$1" &>/dev/null; then
echo "$1 needs to be installed to run this script"
exit 1
fi
}
main "$@"

View file

@ -776,7 +776,8 @@ var server = Http.createServer(app);
nThen(function (w) {
server.listen(Env.httpPort, Env.httpAddress, w());
if (Env.httpSafePort) {
server.listen(Env.httpSafePort, Env.httpAddress, w());
let safeServer = Http.createServer(app);
safeServer.listen(Env.httpSafePort, Env.httpAddress, w());
}
server.on('upgrade', function (req, socket, head) {
// TODO warn admins that websockets should only be proxied in this way in a dev environment

View file

@ -13,19 +13,6 @@
},
"dependencies": {
"@mcrowe/minibloom": "^0.2.0",
"chainpad-crypto": "^0.2.5",
"chainpad-server": "^5.1.0",
"cookie-parser": "^1.4.6",
"body-parser": "^1.20.2",
"express": "~4.19.2",
"fs-extra": "^7.0.0",
"get-folder-size": "^2.0.1",
"netflux-websocket": "^1.0.0",
"http-proxy-middleware": "^2.0.6",
"jsonwebtoken": "^9.0.0",
"notp": "^2.0.3",
"nthen": "0.1.8",
"openid-client": "^5.4.2",
"@node-saml/node-saml": "^4.0.5",
"alertify.js": "1.0.11",
"body-parser": "^1.20.2",
@ -43,7 +30,7 @@
"croppie": "^2.5.0",
"dragula": "3.7.2",
"drawio": "github:cryptpad/drawio-npm#npm-21.8.2+5",
"express": "~4.18.2",
"express": "~4.19.2",
"file-saver": "1.3.1",
"fs-extra": "^7.0.0",
"get-folder-size": "^2.0.1",

View file

@ -1197,11 +1197,12 @@ define([
});
};
// `app`: true (force open wiht the app), false (force open in preview),
// `app`: true (force open with the app), false (force open in preview),
// falsy (open in preview if default is not using the app)
var defaultInApp = ['application/pdf'];
var openFile = function (el, isRo, app) {
var data = manager.getFileData(el);
// In anonymous drives, `el` already contains file data
var data = el.channel ? el : manager.getFileData(el);
if (data.static) {
if (data.href) {

View file

@ -181,15 +181,11 @@ define([
});
};
var getUserIndex = function () {
var i = 1;
var ids = content.ids || {};
Object.keys(ids).forEach(function (k) {
if (ids[k] && ids[k].index && ids[k].index >= i) {
i = ids[k].index + 1;
}
});
return i;
const getNewUserIndex = function () {
const ids = content.ids || {};
const indexes = Object.values(ids).map((user) => user.index);
const maxIndex = Math.max(...indexes);
return maxIndex === -Infinity ? 1 : maxIndex+1;
};
var setMyId = function () {
@ -200,7 +196,7 @@ define([
myOOId = Util.createRandomInteger();
// f: function used in .some(f) but defined outside of the while
var f = function (id) {
return ids[id] === myOOId;
return ids[id].ooid === myOOId;
};
while (Object.keys(ids).some(f)) {
myOOId = Util.createRandomInteger();
@ -209,7 +205,7 @@ define([
var myId = getId();
ids[myId] = {
ooid: myOOId,
index: getUserIndex(),
index: getNewUserIndex(),
netflux: metadataMgr.getNetfluxId()
};
oldIds = JSON.parse(JSON.stringify(ids));
@ -917,6 +913,15 @@ define([
});
};
const findUserByOOId = function(ooId) {
return Object.values(content.ids)
.find((user) => user.ooid === ooId);
};
const getMyOOIndex = function() {
return findUserByOOId(myOOId).index;
};
var getParticipants = function () {
var users = metadataMgr.getMetadata().users;
var i = 1;
@ -948,19 +953,19 @@ define([
isCloseCoAuthoring:false,
view: false
});
i++;
if (!myUniqueOOId) { myUniqueOOId = String(myOOId) + i; }
const myOOIndex = getMyOOIndex();
if (!myUniqueOOId) { myUniqueOOId = String(myOOId) + myOOIndex; }
p.push({
id: myUniqueOOId,
id: String(myOOId),
idOriginal: String(myOOId),
username: metadataMgr.getUserData().name || Messages.anonymous,
indexUser: i,
indexUser: myOOIndex,
connectionId: metadataMgr.getNetfluxId() || Hash.createChannelId(),
isCloseCoAuthoring:false,
view: false
});
return {
index: i,
index: myOOIndex,
list: p.filter(Boolean)
};
};
@ -1600,13 +1605,15 @@ define([
var x2tConvertData = function (data, fileName, format, cb) {
var sframeChan = common.getSframeChannel();
var e = getEditor();
var fonts = e && e.FontLoader.fontInfos;
var files = e && e.FontLoader.fontFiles.map(function (f) {
var editor = getEditor();
var fonts = editor && editor.FontLoader.fontInfos;
var files = editor && editor.FontLoader.fontFiles.map(function (f) {
return { 'Id': f.Id, };
});
var type = common.getMetadataMgr().getPrivateData().ooType;
var images = (e && window.frames[0].AscCommon.g_oDocumentUrls.urls) || {};
const images = editor
? structuredClone(window.frames[0].AscCommon.g_oDocumentUrls.getUrls())
: {};
// Fix race condition which could drop images sometimes
// ==> make sure each image has a 'media/image_name.ext' entry as well
@ -1617,7 +1624,7 @@ define([
});
// Add theme images
var theme = e && window.frames[0].AscCommon.g_image_loader.map_image_index;
var theme = editor && window.frames[0].AscCommon.g_image_loader.map_image_index;
if (theme) {
Object.keys(theme).forEach(function (url) {
if (!/^(\/|blob:|data:)/.test(url)) {
@ -1631,7 +1638,7 @@ define([
type: type,
fileName: fileName,
outputFormat: format,
images: (e && window.frames[0].AscCommon.g_oDocumentUrls.urls) || {},
images: (editor && window.frames[0].AscCommon.g_oDocumentUrls.urls) || {},
fonts: fonts,
fonts_files: files,
mediasSources: getMediasSources(),
@ -2064,6 +2071,15 @@ Uncaught TypeError: Cannot read property 'calculatedType' of null
if (blobUrl) {
delete downloadImages[name];
debug("CryptPad Image already loaded " + blobUrl);
// Fix: https://github.com/cryptpad/cryptpad/issues/1500
// Maybe OO was reloaded, but the CryptPad cache is still intact?
// -> Add the image to OnlyOffice again.
const documentUrls = window.frames[0].AscCommon.g_oDocumentUrls;
if (!(data.name in documentUrls.getUrls())) {
documentUrls.addImageUrl(data.name, blobUrl);
}
return void callback(blobUrl);
}
@ -2697,7 +2713,6 @@ Uncaught TypeError: Cannot read property 'calculatedType' of null
};
var onCheckpoint = function (cp) {
// We want to load a checkpoint:
console.log('XXX onCheckpoint', JSON.stringify(cp));
loadCp(cp);
};
var setHistoryMode = function (bool) {

View file

@ -176,6 +176,11 @@ define([
else { editor.execCommand("insertTab"); }
}
},
//remove focus from editor
"Esc": function () {
document.activeElement.blur();
document.querySelector('.cp-toolbar-link-logo').focus();
},
"Shift-Tab": function () {
editor.execCommand("indentLess");
},