4 Commits

Author SHA1 Message Date
Lukas F. Hartmann
dfad9269ff add empty database folder, or first bringup fails 2021-06-28 14:30:35 +02:00
Lukas F. Hartmann
0a1bd2a107 WIP chargebee integration sketch 2021-05-23 23:53:41 +02:00
Lukas F. Hartmann
6ef1f8fba6 packages: update the rest of the packages manually 2021-05-15 20:42:10 +02:00
Lukas F. Hartmann
a1fb09709a packages: automatic npm audit updates 2021-05-15 20:03:32 +02:00
34 changed files with 3320 additions and 17589 deletions

View File

@@ -1,7 +1,26 @@
FROM node:18-alpine
FROM node:10-alpine3.11
WORKDIR /app
# build audiowaveform from source
RUN apk add git make cmake gcc g++ libmad-dev libid3tag-dev libsndfile-dev gd-dev boost-dev libgd libpng-dev zlib-dev
RUN apk add zlib-static libpng-static boost-static
RUN apk add autoconf automake libtool gettext
RUN wget https://github.com/xiph/flac/archive/1.3.3.tar.gz
RUN tar xzf 1.3.3.tar.gz
RUN cd flac-1.3.3/ && ./autogen.sh
RUN cd flac-1.3.3/ && ./configure --enable-shared=no
RUN cd flac-1.3.3/ && make
RUN cd flac-1.3.3/ && make install
RUN git clone https://github.com/bbc/audiowaveform.git
RUN mkdir audiowaveform/build/
RUN cd audiowaveform/build/ && cmake -D ENABLE_TESTS=0 -D BUILD_STATIC=1 ..
RUN cd audiowaveform/build/ && make
RUN cd audiowaveform/build/ && make install
# install chromium
RUN apk add --no-cache \
chromium \

View File

@@ -31,7 +31,7 @@ We appreciate filed issues, pull requests and general discussion.
Spacedeck requires:
- Node.js 18.x: Web Server / API. Download: https://nodejs.org
- Node.js 10.x: Web Server / API. Download: https://nodejs.org
- Graphicsmagick. On non-Linux, Download: http://www.graphicsmagick.org/ On Linux, install via package manager.
- Optionally ffmpeg, audiowaveform and ghostscript. See "Optional Dependencies" below.

View File

@@ -1,32 +0,0 @@
# Configuring Emails
There are several configuration options in `config/default.json`
## Email Relay Configuration
- mail_provider:
* `console`
* `smtp`
- mail_smtp_host:
* the IP address or FQDN of your SMTP email relay
- mail_smtp_port:
* the port used to connect to the email relay
- mail_smtp_secure: true
* whether to use TLS when connecting to the SMTP email relay
- mail_smtp_require_tls:
* `true`: attempt to use TLS even if the email relay doesn't advertise it, don't send the email if TLS isn't supported
* `false`: permits emails to be sents without using TLS
- mail_smtp_user:
* the username for the SMTP email relay.
* comment out this line for an email relay that doesn't use authentication
- mail_smtp_pass
* the password for the SMTP email relay
* comment out this line for an email relay that doesn't use authentication
## Content of Emails
- teamname:
* the team name appears on the emails sent by your spacedeck
- contact_email:
* the email address that appears on emails being sent by your spacedeck
- endpoint:
* the URL that users click on in the emails being sent by your spacedeck

View File

@@ -8,8 +8,7 @@ const path = require('path')
const db = require('../models/db')
const Sequelize = require('sequelize')
const Op = Sequelize.Op
const { v4: uuidv4 } = require('uuid');
const uuidv4 = require('uuid/v4')
require('../models/db')

View File

@@ -1,332 +0,0 @@
{
"ok": "OK",
"cancel": "Storno",
"close": "Zavřít",
"open": "Otevřít",
"folder": "Složka",
"save": "Uložit",
"saved": "Uloženo",
"created": "vytvořeno",
"duplicate": "Zduplikovat",
"delete": "Smazat",
"remove": "Odebrat",
"set": "nastavit",
"reset": "resetovat",
"thanks": "Díky",
"share": "Sdílet",
"signup": "Zaregistrovat se",
"login": "Přihlásit se",
"logout": "Odhlásit se",
"email": "E-mailová adresa",
"password": "Heslo",
"forgot_password": "Zapomenuté heslo",
"width": "Šířka",
"height": "Výška",
"nick": "Název",
"role": "Role",
"members": "Členové",
"actions": "Akce",
"or": "nebo",
"you": "vy",
"via": "prostřednictvím",
"by": "od",
"zero": "Nula",
"page": "Stránka",
"new": "Nevé",
"copy": "Zkopírovat",
"home": "Domů",
"owner": "Vlastník",
"space": "Prostor",
"second": "Druhé",
"not_found": "Nenalezeno.",
"untitled_space": "Prostor bez názvu",
"untitled_folder": "Složka bez názvu",
"untitled": "bez názvu",
"sure": "Opravdu to chcete?",
"specify": "Zadejte prosím",
"confirm": "Potvrďte prosím",
"error_unknown_email": "Tato kombinace e-mail/heslo není známa.",
"error_password_confirmation": "Zadání hesla se neshodují.",
"error_domain_blocked": "Doména, ze které přistupujete, je blokována.",
"error_user_email_already_used": "Tato e-mailová adresa už je používána.",
"support": "Podpora pro Spacedeck",
"offline": "Bez připojení k Internetu. Pokud chcete získat další, klikněte.",
"error": "Je nám líto, ale něco se pokazilo. Obraťte se na support@spacedeck.com",
"welcome": "Vítejte",
"claim": "Vaše digitální tabule.",
"trynow": "Vyzkoušet nyní.",
"about": "O nás",
"terms": "Všeobecné podmínky",
"contact": "Kontakt",
"privacy": "Soukromí",
"business_adress": "Adresa firmy",
"post_adress": "Poštovní adresa",
"phone": "Telefon",
"ceo": "Generální ředitel",
"name": "Název",
"confirm_subject": "Potvrzení e-mailu pro Spacedeck",
"confirm_body": "Děkujeme, že jste se zaregistrovali u Spacedeck.\nPokud chcete potvrdit svou e-mailovou adresu, klikněte na následující odkaz.\n",
"confirm_action": "Potvrdit nyní",
"team_invite_membership_subject": "Pozvánka do týmu pro %s",
"team_invite_membership_body": "Byli jste pozváni do %s na Spacedeck. Pokud chcete pozvání přijmout, klikněte na následující odkaz.",
"team_invite_user_body": "Byli jste pozvání do %s na Spacedeck.\nVaše dočasné heslo je „%s“.\nPokud chcete pozvání přijmout, klikněte na následující odkaz.",
"team_invite_admin_body": "%s byl(a) pozván(a) do vašeho týmu: %s. Dočasné heslo je „%s“.",
"team_invite_membership_acction": "Přijmout",
"team_new_member_subject": "Nový člen týmu pro %s zaregistrován",
"team_new_member_body": "%s se právě přidal k týmu %s na Spacedeck.",
"space_invite_membership_subject": "%s vás pozval(a) do prostoru %s ",
"space_invite_membership_body": "Byli jste pozvání %s, abyste se připojili do prostoru %s na Spacedeck. Pokud chcete pozvání přijmout, klikněte na následující odkaz.",
"space_invite_membership_action": "Přijmout",
"folder_invite_membership_subject": "Prostor",
"folder_invite_membership_body": "Byli jste pozvání do týmu na Spacedeck. Pokud chcete pozvání přijmout, kliněte na následující odkaz.",
"folder_invite_membership_acction": "Přijmout",
"login_google": "Přihlásit se Google účtem",
"save_changes": "Uložit změny",
"upgrade": "Přejít na vyšší variantu",
"upgrade_now": "Přejí na vyšší variantu nyní",
"create_space": "Vytvořit prostor",
"create_folder": "Vytvořit složku",
"email_unconfirmed": "E-mail nepotvrzen",
"confirmation_sent": "E-mail odeslán",
"folder_filter": "Filtrovat",
"sort_by": "Seřadit podle",
"last_modified": "Naposledy změněno",
"last_opened": "Naposledy otevřeno",
"title": "Nadpis",
"edit_team": "Upravit tým",
"edit_account": "Upravit účet",
"log_out": "Odhlásit se",
"no_spaces_yet": "Vítejte! Prostory a složky zde můžete vytvářet pomocí tlačítek v levé horním rohu.",
"new_folder_title": "Nový název složky",
"folder_settings": "Nastavení složky",
"upload_cover_image": "Nahrát obrázek pro desky",
"spacedeck_pro_ad_folders": "Se Spacedeck Pro, je možné ve složkách organizovat neomezené množství prostorů a spravovat přístup pro každou ze složek. Chcete se dozvědět víc o funkcích této vyšší varianty?",
"spacedeck_pro_ad_versions": "Se Spacedeck Pro, je možné ukládat neomezený počet verzí každého prostoru a sledovat tak svůj postup nebo si tak ukládat průběžné stavy. Chcete se dozvědět víc o funkcích této vyšší varianty?",
"spacedeck_pro_ad_pdf": "Se Spacedeck Pro, je možné exportovat vaše prostory jako PDF soubory pro účely archivace, odesílání e-mailem nebo tisk. Chcete se dozvědět víc o funkcích této vyšší varianty?",
"spacedeck_pro_ad_zip": "Se Spacedeck Pro, je možné exportovat obsah prostoru jako ZIP balíček. Chcete se dozvědět víc o funkcích této vyšší varianty?",
"spacedeck_pro_ad_colors": "Se Spacedeck Pro, je možné míchat své vlastní barvy pomocí profesionálního voliče barev.",
"profile_caption": "Profil",
"upload_avatar": "Nahrát profilový obrázek",
"uploading_avatar": "Nahrát profilový obrázek…",
"avatar_dimensions": "Doporučené rozměry: 200×200 pixelů.",
"profile_name": "Jméno",
"profile_email": "E-mailová adresa",
"send_again": "Poslat znovu",
"confirmation_sent_long": "E-mail s odkazem pro potvrzení odeslán. Podívejte se do své schránky.",
"confirmation_sent_another": "Odeslán další odkaz pro potvrzení.",
"confirmation_sent_dialog_text": "Poslali jsme vám e-mail vysvětlující jak potvrdit svou e-mailovou adresu.",
"payment_caption": "Platba",
"language_caption": "Jazyk",
"notifications_caption": "Upozornění",
"notifications_option_chat": "E-mailem mne informujte o nových komentářích",
"notifications_option_spaces": "Posílejte mi denní souhrn dění v mých prostorech a složkách",
"password_caption": "Heslo",
"current_password": "Stávající heslo",
"new_password": "Nové heslo",
"verify_password": "Ověřit si heslo",
"change_password": "Změnit si heslo",
"reset_password": "Resetovat heslo",
"terminate_caption": "Smazat účet",
"terminate_warning": "Pokud svůj účet smažete, budou veškeré prostory, složky a zprávy, včetně obsahu, který jste vy a další lidé vytvořili ve vašich prostorech ZLIKVIDOVÁNY.",
"terminate_warning2": "Toto už nepůjde napravit.",
"terminate_reason": "Zpráva",
"terminate_reason_caption": "Pomozte nám zlepšit se sdělením vašeho dúvodu pro zrušení.",
"terminate_terminate": "Ukončit",
"space_blank1": "Vítejte v novém prostoru!",
"space_blank2": "Přetáhněte sem soubory, vkládejte odkazy",
"space_blank3": "nebo použijte níže uvedené nástroje",
"space_blank4": "a zaplňte tento prostor obsahem.",
"draft": "Koncept",
"publish": "Zveřejnit",
"published": "Zveřejněno",
"save_version": "Uložit verzi",
"version_saved": "Verze uložena",
"post": "Odeslat zprávu",
"chat_invite_cta1": "Spolupráce je zábava!",
"chat_invite_cta2": "Proč ",
"chat_invite_cta3": "nepozvat nějaké lidi",
"chat_invite_cta4": "ke společné práci?",
"chat_message_placeholder": "Napiště zprávu od vás…",
"view": "Zobrazit",
"edit": "Upravit",
"present": "Přezentovat",
"chat": "Chat",
"meta": "Meta",
"tool_search": "Hledat",
"tool_upload": "Nahrát",
"tool_text": "Text",
"tool_shape": "Tvar",
"tool_zones": "Oblasti",
"tool_canvas": "Plátno",
"search_media": "Hledat média…",
"type_here": "Pište sem",
"text_formats": "Formáty",
"format_p": "Odstavec",
"format_bullets": "Seznam s odrážkami",
"format_numbers": "Číslovaný seznam",
"format_h1": "Nadpis 1",
"format_h2": "Nadpis 2",
"format_h3": "Nadpis 3",
"font_size": "Velikost písma",
"line_height": "Výška řádku",
"tool_align": "Zarovnat",
"tool_styles": "Styly",
"tool_bullets": "Odrážky",
"tool_numbers": "Čísla",
"tool_font": "Písmo",
"color_fill": "Vyplnit",
"color_stroke": "Čára",
"color_text": "Text",
"tool_type": "Typ",
"tool_box": "Box",
"tool_link": "Odkaz",
"tool_layout": "Rozvržení",
"tool_options": "Předvolby",
"tool_stroke": "Čára",
"tool_delete": "Smazat",
"tool_lock": "Uzamknout",
"tool_copy": "Zkopírovat",
"stack": "Na sebe",
"tool_circle": "Kruh",
"tool_hexagon": "Šestiúhelník",
"tool_square": "Čtverec",
"tool_diamond": "Diamant",
"tool_bubble": "Bublina",
"tool_cloud": "Mrak",
"tool_burst": "Dávka",
"tool_star": "Hvězda",
"tool_heart": "Srdce",
"tool_scribble": "Kreslení",
"tool_line": "Čára",
"tool_arrow": "Šipka",
"search_media_placeholder": "HLedat webová média…",
"add_zone": "Nová oblast",
"palette": "Paleta",
"picker": "Volič",
"background_image_caption": "Obrázek",
"background_color_caption": "Barva",
"upload_background_caption": "Obrázek pro pozadí nahrajete kliknutím",
"upload_background": "Nahrát pozadí",
"access_caption": "Přístup",
"versions_caption": "Verze",
"info_caption": "Informace",
"mode_private": "Soukromé: Upravovat mohou pouze členové",
"mode_public": "Veřejné: Zobrazit si může kdokoli, kdo má odkaz",
"invite_collaborators": "Pozvat spolupracovníky",
"revoke_access": "Zrušit přístup",
"invite": "Odeslat pozvánky",
"invitee_email_address": "E-mailová adresa nového člena",
"optional_message": "Volitelná zpráva",
"role_viewer": "Prohlížející si",
"role_editor": "Editor",
"role_admin": "Správce",
"new_space_title": "Nový název pro prostor",
"team": "Tým",
"search": "Hledat",
"search_no_results": "nic nenalezeno",
"search_clear": "vyčistit hledání",
"rename": "přejmenovat",
"mobile": "mobilní",
"image": "obrázek",
"tool_filter": "filtrovat",
"canel": "kanál",
"invite_membership_action": "akce pozvání člena",
"viewer": "prohlížející si",
"editor": "editor",
"admin": "správce",
"logging_in": "přihlašování se",
"password_confirmation": "Potvrzení hesla",
"confirm_again": "Poslali jsme vám e-mail vysvětlující jak potvrdit svou e-mailovou adresu.",
"confirmed": "Váš účet byl úspěšně potvrzen. Děkujeme.",
"signing_up": "Registrace",
"password_check_inbox": "Podívejte se do své schránky",
"new_space": "Nový prostor",
"tool_more": "Více",
"what_is_your_name": "Vítejte v %s! Zvolte si uživatelské jméno.",
"lang": "cs",
"landing_title": "Vaše tabule na webu.",
"landing_claim": "Spacedeck umožňuje snadno kombinovat všechny možné druhy virtuálních tabulí: textové poznámky, fotky, webové odkazy, dokonce video a zvukové nahrávky. ",
"landing_example": "Lidé Spacedeck používají pro uspořádávání si svých nápadů, v týmech pro zobrazení přehledu projektů, nebo na školách a univerzitách pro pestřejší, propojené zážitky z učení se.",
"spaces": "Mé prostory",
"access_editor_link": "Odkaz pro okamžité upravování",
"access_editor_link_desc": "Tento odkaz pošlete komukoli, kdo by měl být schopen tento prostor okamžitě upravovat, není zapotřebí žádný účet: ",
"access_editor_link_desc_slug": "Tento odkaz obsahuje také název prostoru. ",
"access_anonymous_edit_blocking": "Anonymní editoři mohou měnit pouze své vlastní položky",
"access_current_members": "Stávající členové",
"access_new_members": "Pozvat nové členy",
"access_no_members": "Členové tohoto prostoru se zobrazí zde.",
"comments": "komentáře",
"landing_customers": "Oblíbené u tisíců dalších uživatelů.",
"landing_features_title": "Snadno použitelné.",
"landing_features_text": "Nový Spacedeck 5 má zjednodušené, hezké uživatelské rozhraní, které usnadňuje a zpříjemňuje práci ještě více, než předtím a přitom poskytuje ještě výkonnější funkce:",
"landing_features_1": "<b>Přetahujte sem</b> obrázky, videa a zvukové soubory ze svého počítače nebo webu",
"landing_features_2": "<b>Pište a formátujte text</b>t s úplnou kontrolou nad písmy, barvami a styly",
"landing_features_3": "<b>Kreslete, opatřujte poznámkami a zvýrazňujte</b> pomocí poskytovaných grafických tvarů",
"landing_features_4": "Udělejte ze své tabule <b>přezentaci s přibližováním</b>",
"landing_features_5": "<b>Spolupracujte a chatujte</b> v reálném čase s členy týmu, studenty nebo přáteli.",
"landing_features_6": "<b>Sdílejte prostory</b> prostřednictvím webu nebo e-mailu",
"landing_features_7": "<b>Exportujte svou práci</b> jako tisknutelné PDF nebo ZIP",
"landing_pricing": "Velmi levné.",
"landing_pricing_lite": "Zdarma / osobní použití",
"landing_pricing_lite_text": "Základní verze pro shromažďování obrázků a uchovávání poznámek.",
"landing_pricing_pro_features_list": "<ul><li>Neomezené prostory</li><li>Složky</li><li>Export do PDF a ZIP</li><li>Bez vodoznaků</li><li>Uživatelsky určená pozadí</li><li>Historie aktivit</li><li>20 GB úložiště</li><ul>",
"landing_pricing_pro": "4,90 € za uživatele a měsíc. <br><small>nebo 49,90 € za uživatele a rok</small>",
"landing_pricing_pro_text": "Nabité všemy schopnostmi, které očekáváte.",
"landing_pricing_pro_features": "Nabité všemy schopnostmi, které očekáváte.",
"welcome_subject": "Vítejte ve Spacedeck",
"welcome_body": "Zdravíme!\nDěkujeme, že jste se zaregistrovali ha Spacedeck.<br>Douváme, že se vám práce v prostorech bude líbit.<br>Pamatujte, že váš účet obsahuje neomezený počet spolupracovníků. Klidně sdílejte své prostory přátelům a kolegům po celém světě.",
"invite_emails": "E-mailové adresy (oddělované čárkou)",
"history_recently_updated": "Nedávno aktualizováno",
"history_recently_empty": "Doposud se nic nestalo.",
"parent_folder": "nadřazená složka",
"created_by": "Vytvořil(a)",
"last_updated": "Naposledy aktualizováno",
"feedback_sent": "Děkujeme za zpětnou vazbu!",
"role_member": "Člen",
"team_invite_membership_action": "Přijmout pozvání",
"space_message_subject": "Nová zpráva v prostoru %s",
"space_message_body": "%s napsal(a) v %s: \n",
"pro_ad_history_headline": "Pokud přejdete na Spacedeck Pro, uvidíte zde historii nedávných aktualizací napříš všemi vašimi (sdílenými) prostory.",
"password_reset_subject": "Reset Password for Spacedeck",
"password_reset_body": "Vyžádali jste si resetování vašeho hesla do Spacedeck.\nPokud chcete nastavit nové heslo, klikněte na následující odkaz.",
"password_reset_action": "Resetovat nyní",
"was_offline": "Spojení se Spacedeck bylo přerušeno. Pokud máte neuloženou práci, ponechte tento panel prohlížeče otevřený dokud nebude spojení znovu navázáno, pak znovu proveďte jakoukoli operaci na doposud neuložených objektech.",
"subscription_failed_user_subject": "Problém s vaší platbou za Spacedeck",
"subscription_failed_user_body": "Je nám líto, nepodařilo se nám zpracovat vaší platební metodu. V nastavení svého účtu můžete snadno vytvořit novou, včetně PayPal.",
"subscription_failed_team_subject": "Problém s vaší platbou za Spacedeck",
"subscription_failed_team_body": "Je nám líto, ale nepodařilo se zpracovat platební metodu pro váš týmový účet. Prosíme opravte svou platební metodu co možná nejdříve.",
"team_name": "Název týmu",
"subdomain": "Dílčí doména",
"team_adresses": "E-mailová adresa",
"add": "Přidat",
"invited": "pozván(a)",
"duplicate_destination": "Do které složky chcete tento prostor zduplikovat?",
"duplicate_confirm": "Zduplikovat %s do %s?",
"duplicate_success": "%s bylo zduplikováno do %s.",
"goto_space": "Přejít na prostor %s",
"goto_folder": "Přejít do složky %s",
"stay_here": "Zůstat zde",
"sharing": "Sdílení",
"list": "Exportovat seznam",
"link": "Odkaz",
"download_space": "Stáhnout si prostor",
"download_as_pdf": "Stáhnout si prostor jako PDF",
"type": "Typ",
"download": "Stáhnout si",
"Previous Zone": "Předchozí oblast",
"Next Zone": "Následující oblast",
"promote": "Povýšit",
"demote": "Degradovat",
"more": "Další",
"lock": "Zamknout",
"unlock": "Odemknout",
"follow_present": "Sledovat",
"mute_present": "Nesledovat",
"follow_present_help": "Pokud tento prostor přezentuje někdo další, ostatní členové automaticky sledují prezentaci. Tímto tlačítkem se toto sledování zapíná a vypíná.",
"export": "Export",
"media": "Média",
"tool_edit_text": "Upravit text",
"tool_space_help_part_one": "Pokud chcete přidat obsah, použijte lištu s nástroji.",
"tool_space_help_part_two": "Je možné sem přetáhnout také obrázky, zvukové a video soubory.",
"tool_delete_space": "Opravdu smazat „%s“?"
}

View File

@@ -19,7 +19,6 @@
"logout": "Log out",
"email": "Email Address",
"password": "Password",
"forgot_password": "Forgot Password",
"width": "Width",
"height": "Height",
"nick": "Name",
@@ -199,7 +198,6 @@
"tool_scribble": "Scribble",
"tool_line": "Line",
"tool_arrow": "Arrow",
"tool_pan": "Pan",
"search_media_placeholder": "Search web media…",
"add_zone": "New Zone",
"palette": "Palette",
@@ -326,8 +324,5 @@
"follow_present_help": "If someone else is presenting this Space, the other members automatically follow the presentation. Switch following on or off with this button.",
"export": "Export",
"media": "Media",
"tool_edit_text": "Edit Text",
"tool_space_help_part_one": "Use the toolbar to add content.",
"tool_space_help_part_two": "You can also drop images or sound and video files.",
"tool_delete_space": "Really delete \"%s\"?"
}
"tool_edit_text": "Edit Text"
}

View File

@@ -20,7 +20,6 @@
"logout": "Se déconnecter",
"email": "Adresse email",
"password": "Mot de passe",
"forgot_password": "Mot de passe oublié",
"width": "Largeur",
"height": "Hauteur",
"nick": "Nom",
@@ -40,30 +39,30 @@
"space": "Espace",
"second": "Seconde",
"not_found": "Pas trouvé.",
"untitled": "sans titre",
"untitled_space": "Espace sans titre",
"untitled_folder": "Dossier sans titre",
"untitled": "sans titre",
"sure": "Êtes-vous sûr ?",
"specify": "Veuillez préciser :",
"sure": "Êtes-vous sûr?",
"specify": "Veuillez préciser:",
"confirm": "Veuillez confirmer",
"signup_google": "S'inscrire avec Google",
"error_unknown_email": "Combinaison inconnue de l'email et mot de passe.",
"error_password_confirmation": "Les deux mots de passe ne correspondent pas.",
"error_domain_blocked": "Ce domaine a été désactivé.",
"error_user_email_already_used": "Cette adresse email est déjà enregistrée.",
"error_user_email_already_used": "Cette adresse email est déjà enregistré.",
"support": "Aide Spacedeck",
"offline": "Désolé, mais les serveurs Spacedeck ne peuvent pas être atteint pour le moment. Plus d' informations ici.",
"offline": "Désolé , mais les serveurs Spacedeck ne peuvent pas être atteint pour le moment. Plus d' informations ici.",
"error": "Désolé, une erreur s'est produite. Veuillez contacter support@spacedeck.com",
"welcome": "Bienvenue",
"claim": "Le tableau blanc partagé pour tout le monde",
"trynow": "Essayez-le gratuitement",
"about": "de nous",
"terms": "Termes",
"contact": "Contact",
"privacy": "Sphère privée",
"terms": "termes",
"contact": "contact",
"privacy": "sphère privée",
"business_adress": "Siège social",
"post_adress": "Adresse courrier",
"phone": "Téléphone",
"phone": "téléphone",
"ceo": "Gestionnaire",
"name": "name",
"confirm_subject": "Confirmation de l'email Spacedeck",
@@ -76,10 +75,11 @@
"team_invite_membership_acction": "Accept",
"team_new_member_subject": "New Team Member",
"team_new_member_body": "%s just joined Team %s on Spacedeck.",
"invite_emails": "Entrer les adresses email (séparées pas des virgules)",
"optional_message": "Message personnel (facultatif)",
"space_invite_membership_subject": "Invitation Espace par %s: %s",
"space_invite_membership_body": "Vous avez été invité par %s à Espace \"%s\"",
"space_invite_membership_action": "Accepter l'invitation",
"space_invite_membership_action": "Accepter L'invitation",
"folder_invite_membership_subject": "Space",
"folder_invite_membership_body": "You have been invited to a Team on Spacedeck. Please click on the following link to accept the invitation.",
"folder_invite_membership_acction": "Accept",
@@ -99,7 +99,7 @@
"edit_team": "Modifier l'équipe",
"edit_account": "Modifier le compte",
"log_out": "Déconnecter",
"no_spaces_yet": "Vous n'avez pas encore créé d'espace.",
"no_spaces_yet": "Vous ne avez pas encore créé d'espaces.",
"new_folder_title": "Nouveau titre pour le dossier",
"folder_settings": "Paramètres du dossier",
"upload_cover_image": "Charger image de couverture",
@@ -109,10 +109,10 @@
"spacedeck_pro_ad_zip": "Avec Spacedeck Pro, vous pouvez exporter le contenu d'un espace comme un paquet ZIP. Voulez-vous en savoir plus sur les fonctionnalités Pro?",
"spacedeck_pro_ad_colors": "Avec Spacedeck Pro, vous pouvez mélanger vos propres couleurs en utilisant un sélecteur de couleur professionnelle.",
"profile_caption": "Profil",
"upload_avatar": "Télécharger l'image de profil",
"upload_avatar": "Télécharger l'image profil",
"uploading_avatar": "L'image de profil est téléchargée…",
"avatar_dimensions": "Format suggéré: 200×200 pixels.",
"profile_name": "Nom",
"profile_name": "Name",
"profile_email": "Email",
"send_again": "Renvoyer",
"confirmation_sent_long": "Lien de confirmation email envoyé. Se il vous plaît vérifier votre courrier.",
@@ -126,28 +126,28 @@
"password_caption": "Mot de passe",
"current_password": "Ancien mot de passe",
"new_password": "Nouveau mot de passe",
"verify_password": "Répéter le mot de passe",
"verify_password": "Répéter mot de passe",
"change_password": "Enregistrer",
"reset_password": "Mot de passe oublié ?",
"reset_password": "Mot de passe oublié?",
"terminate_caption": "Supprimer le compte",
"terminate_warning": "En supprimant votre compte, vos messages, espaces, dossiers et tout leur contenu seront effacés. Cette action ne peut être annulée.",
"terminate_warning2": "Cela ne peut pas être annulée.",
"terminate_reason": "Problèmes rencontrés",
"terminate_reason_caption": "Aidez-nous à améliorer le produit en précisant les raisons de la suppression de votre compte.",
"terminate_terminate": "Supprimer le compte définitivement ?",
"terminate_terminate": "Supprimer le compte définitivement?",
"space_blank1": "Ceci est votre nouvel espace.",
"space_blank2": "Déposez des fichiers, collez des liens web",
"space_blank3": "ou utilisez les outils.",
"space_blank4": "Soyez créatifs !",
"space_blank4": "Soyez créatifs!",
"draft": "Conception",
"publish": "Publier",
"published": "Publié",
"save_version": "Enregistrer une version",
"version_saved": "Version enregistrée.",
"post": "Envoyer",
"chat_invite_cta1": "Travailler ensemble est amusant !",
"chat_invite_cta1": "Travailler ensemble est amusant!",
"chat_invite_cta2": "Pourquoi ",
"chat_invite_cta3": "ne pas vous invitez quelques collaborateurs ?",
"chat_invite_cta3": "ne pas vous invitez quelques collaborateurs?",
"chat_invite_cta4": "",
"chat_message_placeholder": "Votre message ici…",
"view": "Vue",
@@ -208,7 +208,7 @@
"picker": "Mélange",
"background_image_caption": "Image",
"background_color_caption": "Couleur",
"upload_background_caption": "Cliquer ici pour télécharger une image de fond.",
"upload_background_caption": "Cliquez ici pour télécharger une image de fond.",
"upload_background": "Télécharger",
"access_caption": "Accès",
"versions_caption": "Versions",
@@ -222,7 +222,7 @@
"role_editor": "Éditeur",
"role_admin": "Administrateur",
"new_space_title": "Nouveau titre pour l'espace",
"invitee_email_address": "Adresse e-mail de l'invité",
"invitee_email_address": "Adresse e-mail de invitee",
"viewer": "Spectateur",
"editor": "Éditeur",
"admin": "Administrateur",
@@ -237,10 +237,9 @@
"logging_in": "Connexion",
"password_confirmation": "Confirmation du mot de passe",
"confirm_again": "Veuillez consulter votre boîte pour confirmer votre email.",
"confirmed": "Adresse email confirmée avec succès. Merci !",
"signing_up": "Signing Up",
"confirmed": "Adresse email confirmée avec succès. merci!",
"password_check_inbox": "password_check_inbox",
"what_is_your_name": "Bonjour ! Choisir un nom d'utilisateur s'il vous plaît.",
"what_is_your_name": "Bonjour! Choisir un nom d'utilisateur s'il vous plaît.",
"landing_title": "Le tableau blanc partagé pour tout le monde.",
"landing_claim": "Le tableau blanc partagé pour tout le monde.",
"landing_example": "Que vous soyez étudiant, enseignant ou chercheur: Avec Spacedeck il est facile pour vous de créer, de gérer et de partager des cours ou le travail en classe. Développez vos théories visuellement. Organisez des notes de recherche, web, images, audio et vidéo.",
@@ -272,18 +271,18 @@
"landing_pricing_pro_features": "Avec toute la puissance que vous attendez.",
"welcome_subject": "Bienvenue sur Spacedeck",
"welcome_body": "Merci pour votre inscription à Spacedeck.\nNous espérons que vous aurez plaisir à travailler dans les Espaces. <br> Rappelez-vous que votre compte comprend un nombre illimité de collaborateurs. <br> N''hésitez pas à partager vos espaces avec des amis et collègues du monde entier.",
"invite_emails": "Entrer les adresses email (séparées pas des virgules)",
"history_recently_updated": "Nouvelles",
"history_recently_empty": "Rien ne se passe",
"parent_folder": "Dossier origine",
"created_by": "Créé par",
"last_updated": "Mis à jour",
"feedback_sent": "Merci pour votre commentaire !",
"role_member": "role_member",
"history_recently_updated": "Nouvelles",
"history_recently_empty": "Rien ne se passe",
"signing_up": "Signing Up",
"feedback_sent": "Merci pour votre commentaire!",
"space_message_subject": "A posté sur %s",
"space_message_body": "%s a commenté dans %s:\n",
"role_member": "role_member",
"password_reset_subject": "Réinitialiser le Mot de passe pour Spacedeck",
"password_reset_body": "Salut !<br><br>Vous avez demandé la réinitialisation de votre Mot de passe.<br>Veuillez cliquer sur le lien suivant pour définir un nouveau Mot de passe.<br>",
"password_reset_body": "Salut!<br><br>Vous avez demandé la réinitialisation de votre Mot de passe.<br>Veuillez cliquer sur le lien suivant pour définir un nouveau Mot de passe.<br>",
"password_reset_action": "Définir un nouveau Mot de passe",
"was_offline": "The connection to Spacedeck was interrupted. If you have unsaved work, please keep this browser tab open until the connection is re-established, then touch the unsaved objects again.",
"subscription_failed_user_subject": "Problem with your Spacedeck Payment",
@@ -302,26 +301,21 @@
"goto_space": "Aller à l'espace %s",
"goto_folder": "Aller au dossier %s",
"stay_here": "Reste ici",
"sharing": "Partager",
"list": "Exporter la liste",
"link": "Link",
"download_space": "Télécharger un espace",
"download_as_pdf": "Télécharger un espace comme PDF",
"download_space": "télécharger un espace",
"download_as_pdf": "télécharger un espace comme PDF",
"type": "Type",
"download": "Télécharger",
"Previous Zone": "Zone précédent",
"Next Zone": "Zone suivante",
"promote": "Promouvoir",
"demote": "Rétrograder",
"lock": "Bloquer",
"unlock": "Déverrouiller",
"list": "liste",
"promote": "promouvoir",
"demote": "rétrograder",
"lock": "bloquer",
"unlock": "déverrouillage",
"link": "link",
"download": "download",
"more": "plus",
"follow_present": "Suivre",
"mute_present": "Pas suivre",
"follow_present_help": "follow_present_help",
"media": "Media",
"tool_edit_text": "Modifier le texte",
"tool_space_help_part_one": "Utilisez la barre d'outil pour ajouter des éléments.",
"tool_space_help_part_two": "Vous pouvez également déposer des fichiers images, son ou video.",
"tool_delete_space": "Confirmez-vous la suppression de \"%s\" ?"
"media": "Media"
}

View File

@@ -19,7 +19,6 @@
"logout": "Se desconnectar",
"email": "Adreça electronica",
"password": "Senhal",
"forgot_password": "Senhal oblidat",
"width": "Largor",
"height": "Nautor",
"nick": "Escais",
@@ -324,9 +323,5 @@
"mute_present": "Quitar de seguir",
"follow_present_help": "Se qualquun mai presenta aqueste espaci, los demai membres seguiràn automaticament la presentacion. Basculatz labonament a la presentacion amb aqueste boton.",
"export": "exportar",
"media": "Mèdia",
"tool_edit_text": "Editar tèxt",
"tool_space_help_part_one": "Utilizar la barra daisina per apondre de contengut.",
"tool_space_help_part_two": "Podètz tanben lisar dimatges o de fichièrs sons o vidèos.",
"tool_delete_space": "Suprimir « %s » per de bon ?"
"media": "Mèdia"
}

View File

@@ -23,12 +23,7 @@ module.exports = (req, res, next) => {
}
// authentication via session/cookie
let token = req.cookies["sdsession"];
if (!token || token == null) {
// authentication via session/header
token = req.headers["x-spacedeck-auth"];
}
const token = req.cookies["sdsession"];
if (token && token != "null" && token != null) {
db.Session.findOne({ where: { token: token } })
@@ -61,7 +56,7 @@ module.exports = (req, res, next) => {
}
});
})
.catch((err) => {
.error((err) => {
console.error("Session resolve error", err);
next();
});

15195
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -11,47 +11,48 @@
"node": ">=10.0.0"
},
"dependencies": {
"archiver": "5.3.1",
"async": "3.2.4",
"archiver": "1.3.0",
"async": "2.3.0",
"bcryptjs": "2.4.3",
"body-parser": "^1.19.0",
"cheerio": "1.0.0-rc.12",
"config": "3.3.9",
"chargebee": "2.6.5",
"cheerio": "0.22.0",
"config": "1.25.1",
"cookie-parser": "~1.4.3",
"ejs": "3.1.9",
"ejs": "3.1.5",
"execSync": "latest",
"express": "^4.16.4",
"file-type": "^16.5.0",
"glob": "10.3.3",
"file-type": "^7.6.0",
"glob": "7.1.1",
"gm": "^1.23.1",
"helmet": "^7.0.0",
"i18n-2": "0.7.3",
"helmet": "^3.5.0",
"i18n-2": "0.6.3",
"log-timestamp": "latest",
"mock-aws-s3": "^4.0.2",
"moment": "^2.19.3",
"morgan": "^1.9.1",
"nodemailer": "^6.6.0",
"puppeteer": "^18",
"read-chunk": "^3",
"puppeteer": "8.0.0",
"read-chunk": "^2.1.0",
"request": "^2.88.0",
"sanitize-html": "^2.3.3",
"sequelize": "^6.33.0",
"serve-favicon": "~2.5.0",
"sequelize": "^4.37.6",
"serve-favicon": "~2.4.2",
"serve-static": "^1.13.1",
"slug": "^8.2.2",
"sqlite3": "5.*",
"umzug": "^2",
"slug": "^1.1.0",
"sqlite3": "^4.2.0",
"umzug": "^2.1.0",
"underscore": "^1.13.1",
"uuid": "^9.0.0",
"validator": "13.9.0",
"ws": "8.13.0"
"uuid": "^3.2.1",
"validator": "7.0.0",
"ws": "3.3.1"
},
"devDependencies": {
"gulp": "^4.0.2",
"gulp-clean-css": "^4.3.0",
"gulp-concat": "^2.6.1",
"gulp-sass": "^5",
"nodemon": "^3.0.1"
"gulp-sass": "^4.0.2",
"nodemon": "^2.0.6"
},
"main": "app.js",
"description": "",

View File

@@ -193,7 +193,7 @@ var SpacedeckBoardArtifacts = {
z = a.z;
if (z<0) z=0; // fix negative z-index
styles = [
"left:" +a.x+"px",
"top:" +a.y+"px",
@@ -206,7 +206,7 @@ var SpacedeckBoardArtifacts = {
if (a.margin_right) styles.push("margin-right:"+a.margin_right+"px");
if (a.margin_top) styles.push("margin-top:"+a.margin_top+"px");
if (a.margin_bottom) styles.push("margin-bottom:"+a.margin_bottom+"px");
// FIXME: via class logic?
if (a.mime.match("vector")) {
styles.push("overflow:visible");

View File

@@ -2562,17 +2562,6 @@ var SpacedeckSections = {
this.opened_dialog = "none";
},
start_pan: function(evt) {
this.deselect();
if (this.active_tool == "pan") {
this.active_tool = "pointer";
} else {
this.active_tool = "pan";
}
this.opened_dialog = "none";
},
start_drawing_scribble: function(evt) {
this.deselect();
if (this.active_tool == "scribble") {

View File

@@ -418,7 +418,7 @@ var SpacedeckSpaces = {
if (!space_type) space_type = "space";
var s = {
name: space_type == "space" ? __("untitled_space") : __("untitled_folder"),
name: space_type == "space" ? __("untitled_space") : __("untitled_folder") ,
artifacts: [],
space_type: space_type,
parent_space_id: this.active_folder._id
@@ -487,7 +487,7 @@ var SpacedeckSpaces = {
},
delete_space: function(space) {
smoke.confirm(__("tool_delete_space", space.name), function(confirmed) {
smoke.confirm("Really delete "+space.name+"?", function(confirmed) {
if (!confirmed) return;
var idx = this.active_folder.children.indexOf(space);
@@ -502,7 +502,7 @@ var SpacedeckSpaces = {
this.active_folder.children.splice(idx,1);
}.bind(this));
}.bind(this), {ok: __("ok"), cancel: __("cancel")});
}.bind(this));
},
duplicate_space: function(space) {
@@ -528,7 +528,7 @@ var SpacedeckSpaces = {
space.name = title;
save_space(space);
}
}.bind(this), {value: space.name, ok: __("ok"), cancel: __("cancel")});
}.bind(this), {value: space.name});
},
rename_folder: function(folder) {
@@ -539,7 +539,7 @@ var SpacedeckSpaces = {
folder.name = title;
save_space(folder);
}
}.bind(this), {value: folder.name, ok: __("ok"), cancel: __("cancel")});
}.bind(this), {value: folder.name});
},
edit_space_title: function() {

View File

@@ -130,9 +130,27 @@ SpacedeckUsers = {
$event.stopPropagation();
}
create_user(name, email, password, password_confirmation, invite_code, function(session) {
create_user(name, email, password, password_confirmation, invite_code, function(res) {
this.creating_user = false;
this.login_submit(email, password, null, on_success);
if (res.chargebee_checkout) {
var chargebeeInstance = Chargebee.init({
site: "spacedeck-test",
enableRedirectMode: true,
enableFriendbuyTracking: false
});
chargebeeInstance.openCheckout({
hostedPage: function() {
return new Promise(function(resolve, reject) {
resolve(res.chargebee_checkout);
})
}
});
} else {
// user created, login
this.login_submit(email, password, null, on_success);
}
}.bind(this), function(req) {
this.creating_user = false;
try {

View File

@@ -121,26 +121,20 @@ function boot_spacedeck() {
var lang = "en";
window.refreshLocale = function() {
var old_lang = lang;
if (spacedeck && spacedeck.user && spacedeck.user.prefs_language) {
lang = spacedeck.user.prefs_language || "en";
if (spacedeck && spacedeck.user && spacedeck.user.preferences) {
lang = spacedeck.user.preferences.language || "en";
} else if (window.browser_lang) {
lang = window.browser_lang;
}
if (lang != old_lang) {
i18n.init({ lng: lang, resStore: window.locales }, function(err, t) {
console.log("i18n initialized: "+lang);
});
}
}
window.refreshLocale();
i18n.init({ lng: lang, resStore: window.locales }, function(err, t) {
console.log("i18n initialized: "+lang);
});
window.__ = function() {
window.__ = function() {
var params = Array.prototype.slice.call(arguments);
params.shift();
window.refreshLocale();

View File

@@ -733,7 +733,7 @@ function setup_whiteboard_directives() {
return;
}
if (_.include(["zoom", "scribble", "pan"], $scope.active_tool)) {
if (_.include(["zoom", "scribble"], $scope.active_tool)) {
// tools that stay active after use
this.mouse_state = "idle";
$scope.mouse_state = this.mouse_state;

File diff suppressed because one or more lines are too long

View File

@@ -14,7 +14,7 @@ var router = express.Router();
const db = require('../../models/db');
const Sequelize = require('sequelize');
const Op = Sequelize.Op;
const { v4: uuidv4 } = require('uuid');
const uuidv4 = require('uuid/v4');
router.get('/:membership_id/accept', function(req, res, next) {
if (req.user) {

View File

@@ -16,12 +16,12 @@ router.post('/', function(req, res) {
res.status(400).json({});
return;
}
var email = req.body.email.toLowerCase();
var password = req.body["password"];
db.User.findOne({where: {email: email}})
.catch(err => {
.error(err => {
res.sendStatus(404);
})
.then(user => {
@@ -41,7 +41,7 @@ router.post('/', function(req, res) {
};
db.Session.create(session)
.catch(err => {
.error(err => {
console.error("Error creating Session:",err);
res.sendStatus(500);
})

View File

@@ -6,7 +6,7 @@ const os = require('os');
const db = require('../../models/db');
const Sequelize = require('sequelize');
const Op = Sequelize.Op;
const { v4: uuidv4 } = require('uuid');
const uuidv4 = require('uuid/v4');
var payloadConverter = require('../../helpers/artifact_converter');
var redis = require('../../helpers/redis');

View File

@@ -3,7 +3,7 @@ var config = require('config');
const db = require('../../models/db');
const Sequelize = require('sequelize');
const Op = Sequelize.Op;
const { v4: uuidv4 } = require('uuid');
const uuidv4 = require('uuid/v4');
var redis = require('../../helpers/redis');
var mailer = require('../../helpers/mailer');

View File

@@ -3,7 +3,7 @@ var config = require('config');
const db = require('../../models/db');
const Sequelize = require('sequelize');
const Op = Sequelize.Op;
const { v4: uuidv4 } = require('uuid');
const uuidv4 = require('uuid/v4');
var redis = require('../../helpers/redis');
var mailer = require('../../helpers/mailer');

View File

@@ -4,7 +4,7 @@ const os = require('os');
const db = require('../../models/db');
const Sequelize = require('sequelize');
const Op = Sequelize.Op;
const { v4: uuidv4 } = require('uuid');
const uuidv4 = require('uuid/v4');
var redis = require('../../helpers/redis');
var mailer = require('../../helpers/mailer');
@@ -81,13 +81,13 @@ function listSpacesInFolder(req, res, parent_space_id) {
}
router.get('/', function(req, res, next) {
if (req.query.parent_space_id && req["spaceAuth"]) {
// list subspaces of a space authorized anonymously
listSpacesInFolder(req, res, req.query.parent_space_id);
return;
}
if (!req.user) {
res.status(403).json({
error: "auth required"
@@ -127,11 +127,11 @@ router.get('/', function(req, res, next) {
} else if (req.query.parent_space_id && req.query.parent_space_id != req.user.home_folder_id) {
// list spaces in a folder
listSpacesInFolder(req, res, req.query.parent_space_id);
} else {
// list home folder and spaces/folders that the user is a member of
db.Membership.findAll({ where: {
user_id: req.user._id
}}).then(memberships => {
@@ -186,8 +186,10 @@ router.post('/', function(req, res, next) {
attrs.edit_hash = crypto.randomBytes(64).toString('hex').substring(0, 7);
attrs.edit_slug = attrs.edit_slug || slug(attrs.name);
attrs.access_mode = "private";
db.Space.create(attrs).then(createdSpace => {
res.status(201).json(createdSpace);
// create initial admin membership
var membership = {
_id: uuidv4(),
@@ -196,7 +198,7 @@ router.post('/', function(req, res, next) {
role: "admin",
state: "active"
};
db.Membership.create(membership).then(() => {
res.status(201).json(createdSpace);
});

View File

@@ -2,8 +2,7 @@
var config = require('config');
const db = require('../../models/db');
const { v4: uuidv4 } = require('uuid');
const uuidv4 = require('uuid/v4');
const os = require('os');
var mailer = require('../../helpers/mailer');
@@ -24,6 +23,8 @@ var express = require('express');
var router = express.Router();
var glob = require('glob');
var chargebee = require('chargebee');
router.get('/current', function(req, res, next) {
if (req.user) {
var u = _.clone(req.user.dataValues);
@@ -33,102 +34,135 @@ router.get('/current', function(req, res, next) {
u.token = req.cookies['sdsession'];
console.log(u);
res.status(200).json(u);
} else {
res.status(401).json({"error":"user_not_found"});
}
});
function createChargebeeCheckout(req, res, plan_id, email, name, company) {
var nameParts = name.split(" ");
var firstName = nameParts.shift();
var lastName = nameParts.join(" ");
chargebee.hosted_page.checkout_new({
subscription: {
plan_id: plan_id
},
customer: {
first_name: firstName,
last_name: lastName,
email: email,
company: company,
}
}).request(function(error,result) {
if (error) {
console.log(error);
res.status(400).json({"error":error+""});
} else {
res.status(200).json({"chargebee_checkout":result.hosted_page});
}
});
};
function createUser(req, res, email, nickname, password) {
bcrypt.genSalt(10, function(err, salt) {
bcrypt.hash(password, salt, function(err, hash) {
crypto.randomBytes(16, function(ex, buf) {
var token = buf.toString('hex');
var u = {
_id: uuidv4(),
email: email,
account_type: "email",
nickname: nickname,
password_hash: hash,
prefs_language: req.i18n.locale,
confirmation_token: token
};
db.User.create(u)
.error(err => {
res.sendStatus(400);
})
.then(u => {
var homeFolder = {
_id: uuidv4(),
name: req.i18n.__("home"),
space_type: "folder",
creator_id: u._id
};
db.Space.create(homeFolder)
.error(err => {
res.sendStatus(400);
})
.then(homeFolder => {
u.home_folder_id = homeFolder._id;
u.save()
.then(() => {
// home folder created,
// auto accept pending invites
db.Membership.update({
"state": "active"
}, {
where: {
"email_invited": u.email,
"state": "pending"
}
});
res.status(201).json({});
})
.error(err => {
res.status(400).json(err);
});
})
});
});
});
});
};
// create user
router.post('/', function(req, res) {
if (!req.body["email"] || !req.body["password"]) {
res.status(400).json({"error":"email or password missing"});
return;
}
var email = req.body["email"].toLowerCase();
var nickname = req.body["nickname"];
var password = req.body["password"];
var password_confirmation = req.body["password_confirmation"];
var invite_code = req.body["invite_code"];
var company = req.body["company"] || "";
if (password_confirmation != password) {
res.status(400).json({"error":"password_confirmation"});
return;
}
if (config.invite_code && invite_code != config.invite_code) {
res.status(400).json({"error":"Invalid Invite Code."});
return;
}
if (!validator.isEmail(email)) {
res.status(400).json({"error":"email_invalid"});
return;
}
var createUser = function() {
bcrypt.genSalt(10, function(err, salt) {
bcrypt.hash(password, salt, function(err, hash) {
crypto.randomBytes(16, function(ex, buf) {
var token = buf.toString('hex');
var u = {
_id: uuidv4(),
email: email,
account_type: "email",
nickname: nickname,
password_hash: hash,
prefs_language: req.i18n.locale,
confirmation_token: token
};
db.User.create(u)
.catch(err => {
res.sendStatus(400);
})
.then(u => {
var homeFolder = {
_id: uuidv4(),
name: req.i18n.__("home"),
space_type: "folder",
creator_id: u._id
};
db.Space.create(homeFolder)
.catch(err => {
res.sendStatus(400);
})
.then(homeFolder => {
u.home_folder_id = homeFolder._id;
u.save()
.then(() => {
// home folder created,
// auto accept pending invites
db.Membership.update({
"state": "active"
}, {
where: {
"email_invited": u.email,
"state": "pending"
}
});
res.status(201).json({});
})
.catch(err => {
res.status(400).json(err);
});
})
});
});
});
});
};
db.User.findAll({where: {email: email}})
.then(users => {
if (users.length == 0) {
createUser();
if (config.get('chargebee_integration')) {
// sign up via paid plan trial
createChargebeeCheckout(req, res, config.get('chargebee_default_plan_id'), email, nickname, company);
// TODO: createUser after chargebee checkout
}
else {
createUser(req, res, email, nickname, password);
}
} else {
res.status(400).json({"error":"user_email_already_used"});
}
@@ -194,7 +228,7 @@ router.delete('/:id', (req, res, next) => {
// TODO: this doesn't currently work.
// all objects (indirectly) belonging to the user have
// to be walked and deleted first.
user.destroy().then(err => {
if(err)res.status(400).json(err);
else res.sendStatus(204);
@@ -290,7 +324,7 @@ router.post('/password_reset_requests/:confirm_token/confirm', function(req, res
bcrypt.genSalt(10, (err, salt) => {
bcrypt.hash(password, salt, function(err, hash) {
user.password_hash = hash;
user.password_reset_token = null;
user.password_token = null;
user.save().then(function(updatedUser) {
res.sendStatus(201);
});

View File

@@ -12,7 +12,7 @@ const _ = require('underscore');
const db = require('../models/db');
const Sequelize = require('sequelize');
const Op = Sequelize.Op;
const { v4: uuidv4 } = require('uuid');
const uuidv4 = require('uuid/v4');
router.get('/', (req, res) => {
res.render('index', { config:config, user:req.user });

View File

@@ -23,6 +23,8 @@ const express = require('express');
const app = express();
const serveStatic = require('serve-static');
const chargebee = require('chargebee');
const isProduction = app.get('env') === 'production';
// workaround for libssl_conf.so error triggered by phantomjs
@@ -61,7 +63,7 @@ app.use(bodyParser.urlencoded({
}));
app.use(cookieParser());
//app.use(helmet.frameguard({ action: 'SAMEORIGIN' }));
//app.use(helmet.frameguard())
//app.use(helmet.xssFilter())
/*app.use(helmet.hsts({
maxAge: 7776000000,
@@ -110,6 +112,14 @@ if (app.get('env') == 'development') {
module.exports = app;
// ChargeBee Integration (Optional)
if (config.get('chargebee_integration')) {
chargebee.configure({
site: config.get('chargebee_site'),
api_key: config.get('chargebee_api_key')
});
}
// CONNECT TO DATABASE
db.init();

View File

@@ -3,7 +3,6 @@
.artifact {
position: relative;
line-height: normal;
//-webkit-transform: translate3d(0,0,0); // hw accel
iframe {

View File

@@ -3,7 +3,7 @@
<a class="btn btn-dark btn-md btn-round btn-icon" href="/spaces">
<span class="icon icon-svg icon-sd6"></span>
</a>
<h5><%=__('edit_account')%></h5>
<h5>Edit Account</h5>
</div>
<div class="header-right pull-right">
@@ -86,7 +86,7 @@
</div>
<div class="form-group">
<button class="btn btn-md btn-dark" v-on:click="save_user()"><%=__('save')%></button>
<button class="btn btn-md btn-dark" v-on:click="save_user()">Save</button>
</div>
</div>
</div>
@@ -158,7 +158,7 @@
</div>
<div class="collapse" v-bind:class="{in:account=='terminate'}">
<h4><%=__('terminate_caption')%></h4>
<h4>Terminate Account</h4>
<div class="modal-section labels-inline">
<div class="form-group">
<label class="label"><%=__("current_password")%></label>
@@ -177,7 +177,7 @@
</div>
<div class="modal-footer">
<button class="btn btn-stroke-darken btn-md" v-on:click="remove_account(account_remove_password, account_remove_feedback)"><%=__('terminate_caption')%></button>
<button class="btn btn-stroke-darken btn-md" v-on:click="remove_account(account_remove_password, account_remove_feedback)">Terminate Account</button>
</div>
</div>
</div>

View File

@@ -36,7 +36,7 @@
<div class="center alert alert-danger" v-if="login_error">{{login_error}}</div>
<div style="margin-top:2em">
<a href="/password-reset"><%= __("forgot_password") %></a>
<a href="/password-reset">Forgot Password</a>
</div>
</form>
</div>

View File

@@ -43,8 +43,8 @@
<div class="space-empty" v-cloak v-if="active_view == 'space' && !present_mode && active_space_artifacts.length == 0">
<div class="table-fake">
<div class="cell">
<p><%= __('tool_space_help_part_one')%><br>
<%= __('tool_space_help_part_two')%></p>
<p>Use the toolbar to add content.<br>
You can also drop images or sound and video files.</p>
</div>
</div>
</div>

View File

@@ -18,11 +18,6 @@
<button class="btn btn-divider"></button>
<button class="btn btn-icon-labeled btn-transparent" v-on:click="start_pan()" v-bind:class="{active:active_tool=='pan'}" title="<%=__("tool_pan")%>">
<span class="icon icon-move"></span>
<span class="icon-label"><%=__("tool_pan")%></span>
</button>
<div class="dropdown top left light" v-bind:class="{open:opened_dialog=='shapes'}">
<div class="btn-collapse in" title="<%=__("tool_shape")%>">
<button class="btn btn-transparent btn-icon-labeled" v-bind:class="{open:opened_dialog=='shapes'}" v-on:click="open_dialog('shapes')">
@@ -46,11 +41,6 @@
<span class="icon-label"><%=__("tool_arrow")%></span>
</button>
<button class="btn btn-icon-labeled btn-transparent" v-on:click="start_drawing_line()" v-bind:class="{active:active_tool=='line'}" title="<%=__("tool_line")%>">
<span class="icon icon-tool-line"></span>
<span class="icon-label"><%=__("tool_line")%></span>
</button>
<div class="dropdown bottom light center">
<div class="btn-collapse in">
<input type="file" multiple v-on:change="handle_image_file_upload($event)" id="image_file_upload" class="btn btn-transparent btn-icon-labeled" style="position: absolute; z-index: 1; opacity: 0;">

View File

@@ -57,6 +57,9 @@
<script src="/javascripts/spacedeck_directives.js"></script>
<script src="/javascripts/spacedeck_vue.js"></script>
<!-- TODO: only include based on config -->
<script src="https://js.chargebee.com/v2/chargebee.js"></script>
<script>if (window.module) module = window.module;</script>
</head>

4865
yarn.lock

File diff suppressed because it is too large Load Diff