aboutsummaryrefslogblamecommitdiff
path: root/nixops/modules/websites/tools/ether/etherpad_lite.nix
blob: e67497be8e023442c8e2f4b879cfa23573289ab3 (plain) (tree)
1
2
3

                                                                  
                              




























                                                                    


                                             

                           


                                                 

                             


                                      



                                                                              
                                                                                  




                                     
 










                                                       
 













                                                                                                                                                                                                                                                                            
 






















                                                                
              






































                                                                                                                    

     



































                                                                                                

                                                                               










                                                     
                                      
   
{ env, fetchedGithub, fetchurl, stdenv, writeText, pkgs, cacert }:
let
  listenPort = env.listenPort;
  sessionkey = writeText "SESSIONKEY.txt" env.session_key;
  apikey = writeText "APIKEY.txt" env.api_key;
  jquery = fetchurl {
    url = https://code.jquery.com/jquery-1.9.1.js;
    sha256 = "0h4dk67yc9d0kadqxb6b33585f3x3559p6qmp70l00qwq030vn3v";
  };
  etherpad_modules = [
    "ep_aa_file_menu_toolbar"
    "ep_adminpads"
    "ep_align"
    "ep_bookmark"
    "ep_clear_formatting"
    "ep_colors"
    "ep_copy_paste_select_all"
    "ep_cursortrace"
    "ep_embedmedia"
    "ep_font_family"
    "ep_font_size"
    "ep_headings2"
    "ep_ldapauth"
    "ep_line_height"
    "ep_markdown"
    "ep_previewimages"
    "ep_ruler"
    "ep_scrollto"
    "ep_set_title_on_pad"
    "ep_subscript_and_superscript"
    "ep_timesliderdiff"
    ];
  keys = [
    {
      dest = "webapps/tools-etherpad-apikey";
      permissions = "0400";
      text = env.api_key;
    }
    {
      dest = "webapps/tools-etherpad-sessionkey";
      permissions = "0400";
      text = env.session_key;
    }
    {
      dest = "webapps/tools-etherpad";
      permissions = "0400";
      text =
        # Make sure we’re not rebuilding whole libreoffice just because of a
        # dependency
        let libreoffice = (import <nixpkgs> { overlays = []; }).libreoffice-fresh;
        in
        ''
          {
            "title": "Etherpad",
            "favicon": "favicon.ico",

            "ip": "127.0.0.1",
            "port" : ${env.listenPort},
            "showSettingsInAdminPage" : false,
            "dbType" : "postgres",
            "dbSettings" : {
              "user"    : "${env.postgresql.user}",
              "host"    : "${env.postgresql.socket}",
              "password": "${env.postgresql.password}",
              "database": "${env.postgresql.database}",
              "charset" : "utf8mb4"
            },

            "defaultPadText" : "Welcome to Etherpad!\n\nThis pad text is synchronized as you type, so that everyone viewing this page sees the same text. This allows you to collaborate seamlessly on documents!\n\nGet involved with Etherpad at http:\/\/etherpad.org\n",
            "padOptions": {
              "noColors": false,
              "showControls": true,
              "showChat": true,
              "showLineNumbers": true,
              "useMonospaceFont": false,
              "userName": false,
              "userColor": false,
              "rtl": false,
              "alwaysShowChat": false,
              "chatAndUsers": false,
              "lang": "en-gb"
            },

            "suppressErrorsInPadText" : false,
            "requireSession" : false,
            "editOnly" : false,
            "sessionNoPassword" : false,
            "minify" : true,
            "maxAge" : 21600,
            "abiword" : null,
            "soffice" : "${libreoffice}/bin/soffice",
            "tidyHtml" : "${pkgs.html-tidy}/bin/tidy",
            "allowUnknownFileEnds" : true,
            "requireAuthentication" : false,
            "requireAuthorization" : false,
            "trustProxy" : false,
            "disableIPlogging" : false,
            "automaticReconnectionTimeout" : 0,
            "scrollWhenFocusLineIsOutOfViewport": {
              "percentage": {
                "editionAboveViewport": 0,
                "editionBelowViewport": 0
              },
              "duration": 0,
              "scrollWhenCaretIsInTheLastLineOfViewport": false,
              "percentageToScrollWhenUserPressesArrowUp": 0
            },
            "users": {
              "ldapauth": {
                "url": "ldaps://${env.ldap.host}",
                "accountBase": "${env.ldap.base}",
                "accountPattern": "(&(memberOf=cn=users,cn=etherpad,ou=services,dc=immae,dc=eu)(uid={{username}}))",
                "displayNameAttribute": "cn",
                "searchDN": "cn=etherpad,ou=services,dc=immae,dc=eu",
                "searchPWD": "${env.ldap.password}",
                "groupSearchBase": "${env.ldap.base}",
                "groupAttribute": "member",
                "groupAttributeIsDN": true,
                "searchScope": "sub",
                "groupSearch": "(memberOf=cn=groups,cn=etherpad,ou=services,dc=immae,dc=eu)",
                "anonymousReadonly": false
              }
            },
            "socketTransportProtocols" : ["xhr-polling", "jsonp-polling", "htmlfile"],
            "loadTest": false,
            "indentationOnNewLine": false,
            "toolbar": {
              "left": [
                ["bold", "italic", "underline", "strikethrough"],
                ["orderedlist", "unorderedlist", "indent", "outdent"],
                ["undo", "redo"],
                ["clearauthorship"]
              ],
              "right": [
                ["importexport", "timeslider", "savedrevision"],
                ["settings", "embed"],
                ["showusers"]
              ],
              "timeslider": [
                ["timeslider_export", "timeslider_returnToPad"]
              ]
            },
            "loglevel": "INFO",
            "logconfig" : { "appenders": [ { "type": "console" } ] }
          }
        '';
    }
  ];
  webappDir = stdenv.mkDerivation (fetchedGithub ./etherpad-lite.json // rec {
    __noChroot = true;
    patches = [ ./libreoffice_patch.diff ];
    buildPhase = ''
      export GIT_SSL_CAINFO=${cacert}/etc/ssl/certs/ca-bundle.crt
      export SSL_CERT_FILE=${cacert}/etc/ssl/certs/ca-bundle.crt
      export HOME=$PWD

      touch src/.ep_initialized
      cp -v src/static/custom/js.template src/static/custom/index.js
      cp -v src/static/custom/js.template src/static/custom/pad.js
      cp -v src/static/custom/js.template src/static/custom/timeslider.js
      cp -v src/static/custom/css.template src/static/custom/index.css
      cp -v src/static/custom/css.template src/static/custom/pad.css
      cp -v src/static/custom/css.template src/static/custom/timeslider.css

      sed -i 's/var\/dirty.db/\/var\/lib\/etherpad-lite\/dirty.db/g' \
        settings.json.template

      mkdir -v node_modules
      ln -s ../src node_modules/ep_etherpad-lite

      node bin/doc/generate doc/index.md --format=html \
        --template=doc/template.html > documentation.html

      cd src
      npm install
      cd ..
      ${builtins.concatStringsSep "\n"
        (map (n: "npm install ${n}; touch node_modules/${n}/.ep_initialized") etherpad_modules)}
      '';
    installPhase = ''
      mkdir -p $out
      install -t $out/src/ -vDm 644 src/.ep_initialized
      cp -a node_modules $out/
      cp -a src/* $out/src/
      ln -sf /var/secrets/webapps/tools-etherpad-sessionkey $out/SESSIONKEY.txt
      ln -sf /var/secrets/webapps/tools-etherpad-apikey $out/APIKEY.txt
      cp ${jquery} $out/src/static/js/jquery.js

      mkdir $out/doc
      install -t "$out/doc/" \
        -vDm 644 {CHANGELOG,CONTRIBUTING,README}.md \
        -vDm 644 documentation.html
    '';
    buildInputs = [ pkgs.nodejs pkgs.python ];
  });
in
  {
    inherit webappDir keys listenPort;
  }