From 9cda8abdedd6cd688392041a31750285577de9d1 Mon Sep 17 00:00:00 2001
From: Damien <damien.burel@maarch.org>
Date: Tue, 12 Jun 2018 18:13:16 +0200
Subject: [PATCH] FEAT #7737 Jnlp Controller

---
 composer.json                                 |  51 +--
 modules/content_management/js/functions.js    | 142 --------
 rest/index.php                                |   5 +-
 .../controllers/JnlpController.php            | 310 ++++++++++++++++++
 src/core/controllers/CoreController.php       |  21 --
 vendor/composer/ClassLoader.php               |  10 +-
 vendor/composer/LICENSE                       |   2 +-
 vendor/composer/autoload_psr4.php             |   1 +
 vendor/composer/autoload_static.php           |   5 +
 9 files changed, 353 insertions(+), 194 deletions(-)
 create mode 100644 src/app/contentManagement/controllers/JnlpController.php

diff --git a/composer.json b/composer.json
index 30c4f6de8d9..472a3267a22 100755
--- a/composer.json
+++ b/composer.json
@@ -1,32 +1,33 @@
 {
     "autoload": {
     	"psr-4": {
-            "SrcCore\\"       : "src/core/",
-            "Action\\"        : "src/app/action/",
-            "Attachment\\"    : "src/app/attachment/",
-            "Basket\\"        : "src/app/basket/",
-            "Contact\\"       : "src/app/contact/",
-            "Docserver\\"     : "src/app/docserver/",
-            "Doctype\\"       : "src/app/doctype/",
-            "Entity\\"        : "src/app/entity/",
-            "Folder\\"        : "src/app/folder/",
-            "Group\\"         : "src/app/group/",
-            "History\\"       : "src/app/history/",
-            "Link\\"          : "src/app/link/",
-            "Note\\"          : "src/app/note/",
-            "Notification\\"  : "src/app/notification/",
-            "Parameter\\"     : "src/app/parameter/",
-            "Priority\\"      : "src/app/priority/",
-            "Report\\"        : "src/app/report/",
-            "Resource\\"      : "src/app/resource/",
-            "SignatureBook\\" : "src/app/signatureBook/",
-            "Status\\"        : "src/app/status/",
-            "Template\\"      : "src/app/template/",
-            "User\\"          : "src/app/user/",
-            "VersionUpdate\\" : "src/app/versionUpdate/",
+            "SrcCore\\"           : "src/core/",
+            "Action\\"            : "src/app/action/",
+            "Attachment\\"        : "src/app/attachment/",
+            "Basket\\"            : "src/app/basket/",
+            "Contact\\"           : "src/app/contact/",
+            "ContentManagement\\" : "src/app/contentManagement/",
+            "Docserver\\"         : "src/app/docserver/",
+            "Doctype\\"           : "src/app/doctype/",
+            "Entity\\"            : "src/app/entity/",
+            "Folder\\"            : "src/app/folder/",
+            "Group\\"             : "src/app/group/",
+            "History\\"           : "src/app/history/",
+            "Link\\"              : "src/app/link/",
+            "Note\\"              : "src/app/note/",
+            "Notification\\"      : "src/app/notification/",
+            "Parameter\\"         : "src/app/parameter/",
+            "Priority\\"          : "src/app/priority/",
+            "Report\\"            : "src/app/report/",
+            "Resource\\"          : "src/app/resource/",
+            "SignatureBook\\"     : "src/app/signatureBook/",
+            "Status\\"            : "src/app/status/",
+            "Template\\"          : "src/app/template/",
+            "User\\"              : "src/app/user/",
+            "VersionUpdate\\"     : "src/app/versionUpdate/",
 
-            "Convert\\"       : "modules/convert/",
-            "Sendmail\\"      : "modules/sendmail/"
+            "Convert\\"           : "modules/convert/",
+            "Sendmail\\"          : "modules/sendmail/"
     	}
     },
     "require": {
diff --git a/modules/content_management/js/functions.js b/modules/content_management/js/functions.js
index 7d266e22f9d..3e948303a54 100755
--- a/modules/content_management/js/functions.js
+++ b/modules/content_management/js/functions.js
@@ -13,153 +13,11 @@ function loadApplet(url, value)
     }
 }
 
-//applet send a message (error) to Maarch
-function sendAppletMsg(theMsg)
-{
-    //theMsg = 'erreur!';
-    //console.log(window.opener.$('divErrorAttachment'));
-
-    var error = /^ERREUR/.test(theMsg);
-    if (window.opener.$('divErrorAttachment')) {
-        if(error){
-            window.opener.$('divErrorAttachment').innerHTML = theMsg;
-            window.opener.$('divInfoAttachment').setStyle({display: 'none'});
-            window.opener.$('divErrorAttachment').setStyle({display: 'inline'});
-            window.close();
-        }else{
-            window.opener.$('divInfoAttachment').innerHTML = theMsg;
-            window.opener.$('divInfoAttachment').setStyle({display: 'inline'});
-            window.opener.$('divErrorAttachment').setStyle({display: 'none'});
-        }
-    }else{
-        if(error){
-            window.opener.$('main_info').setStyle({display: 'none'});
-            window.opener.$('main_error').setStyle({display: 'inline'});
-            window.opener.$('main_error').innerHTML = theMsg;
-            window.close();
-        }else{
-            window.opener.$('main_info').setStyle({display: 'inline'});
-            window.opener.$('main_error').setStyle({display: 'none'});
-            window.opener.$('main_info').innerHTML = theMsg;
-        }
-    }
-    //$('divError').innerHTML = theMsg;
-    //$('divError').setStyle({display: 'inline'});
-    //window.close();
-    /*if (theMsg != '' && theMsg != ' ') {
-        if (window.opener.$('divError')) {
-            window.opener.$('divError').innerHTML = theMsg;
-        } else if ($('divError')) {
-            $('divError').innerHTML = theMsg;
-        }
-    }*/
-}
-
-//destroy the modal of the applet and launch an ajax script
-function endOfApplet(objectType, theMsg)
-{
-    console.log('endOfAppletendOfAppletendOfApplet');
-    if (window.opener.$('add')) {
-        window.opener.$('add').setStyle({display: 'inline'});
-    } else if (window.opener.$('edit')) {
-        window.opener.$('edit').setStyle({display: 'inline'});
-    }
-
-    //if (window.opener.$('edit') && objectType != 'transmission') {
-    //    window.opener.$('edit').setStyle({display: 'inline'});
-    //}
-
-    $('divError').innerHTML = theMsg;
-    if (objectType == 'template' || objectType == 'templateStyle' || objectType == 'attachmentVersion' || objectType == 'attachmentUpVersion' || objectType == 'transmission') {
-        endTemplate();
-    } else if (objectType == 'resource') {
-        endResource();
-    } else if (objectType == 'attachmentFromTemplate') {
-        endAttachmentFromTemplate();
-    } else if (objectType == 'attachment') {
-        endAttachment();
-    } else if (objectType == 'outgoingMail') {
-        endAttachmentOutgoing();
-    } 
-    //destroyModal('CMApplet');
-}
-
-function endAttachmentFromTemplate()
-{
-    //window.alert('template ?');
-    if(window.opener.$('list_attach')) {
-        window.opener.$('list_attach').src = window.opener.$('list_attach').src;
-    }
-    window.close();
-}
-
 function endAttachment()
 {
     window.close();
 }
 
-function endTemplate()
-{
-    //window.alert('template ?');
-    window.close();
-}
-
-function endAttachmentOutgoing()
-{
-    console.log('Fin nouveau spontane');
-	
-	
-    window.close();
-	
-}
-
-//reload the list div and the document if necessary
-function endResource()
-{
-    //window.alert('resource ?');
-    showDivEnd(
-        'loadVersions',
-        'nbVersions',
-        'createVersion',
-        'index.php?display=false&module=content_management&page=list_versions'
-    );
-    if (window.opener.$('viewframe')) {
-        window.opener.$('viewframe').src = window.opener.$('viewframe').src;
-    } else if (window.opener.$('viewframevalid')) {
-        window.opener.$('viewframevalid').src = window.opener.$('viewframevalid').src;
-    }
-    
-    //window.close();
-}
-
-function showDivEnd(divName, spanNb, divCreate, path_manage_script)
-{
-    new Ajax.Request(path_manage_script,
-    {
-        method:'post',
-        parameters: {res_id : 'test'},
-            onSuccess: function(answer){
-            eval("response = "+answer.responseText);
-            if(response.status == 0 || response.status == 1) {
-                if(response.status == 0) {
-                    window.opener.$(divName).innerHTML = response.list;
-                    window.opener.$(spanNb).innerHTML = response.nb;
-                    window.opener.$(divCreate).innerHTML = response.create;
-                    window.close();
-                } else {
-                    window.opener.$(divName).innerHTML = 'error = 1 : ' . response.error_txt;
-                }
-            } else {
-                window.opener.$(divName).innerHTML = 'error > 1 : ' . response.error_txt;
-                try {
-                    //window.opener.$(divName).innerHTML = response.error_txt;
-                }
-                catch(e){}
-            }
-        }
-    });
-}
-
 function showDiv(divName, spanNb, divCreate, path_manage_script)
 {
     new Ajax.Request(path_manage_script,
diff --git a/rest/index.php b/rest/index.php
index fb1bb15cbeb..977cedbc734 100755
--- a/rest/index.php
+++ b/rest/index.php
@@ -154,8 +154,9 @@ $app->get('/histories', \History\controllers\HistoryController::class . ':get');
 $app->get('/histories/users/{userSerialId}', \History\controllers\HistoryController::class . ':getByUserId');
 
 //Jnlp
-$app->post('/jnlp', \SrcCore\controllers\CoreController::class . ':generateJnlp');
-$app->get('/jnlp', \SrcCore\controllers\CoreController::class . ':renderJnlp');
+$app->post('/jnlp', \ContentManagement\controllers\JnlpController::class . ':generateJnlp');
+$app->get('/jnlp', \ContentManagement\controllers\JnlpController::class . ':renderJnlp');
+$app->post('/jnlp/{userUniqueId}', \ContentManagement\controllers\JnlpController::class . ':processJnlp');
 
 //Links
 $app->get('/links/resId/{resId}', \Link\controllers\LinkController::class . ':getByResId');
diff --git a/src/app/contentManagement/controllers/JnlpController.php b/src/app/contentManagement/controllers/JnlpController.php
new file mode 100644
index 00000000000..bc8b951a95d
--- /dev/null
+++ b/src/app/contentManagement/controllers/JnlpController.php
@@ -0,0 +1,310 @@
+<?php
+
+/**
+ * Copyright Maarch since 2008 under licence GPLv3.
+ * See LICENCE.txt file at the root folder for more details.
+ * This file is part of Maarch software.
+ */
+
+/**
+ * @brief Jnlp Controller
+ *
+ * @author dev@maarch.org
+ */
+
+namespace ContentManagement\controllers;
+
+
+use Docserver\models\DocserverModel;
+use Slim\Http\Request;
+use Slim\Http\Response;
+use SrcCore\models\CoreConfigModel;
+use SrcCore\models\DatabaseModel;
+use SrcCore\models\ValidatorModel;
+use Template\models\TemplateModel;
+
+require_once 'core/class/Url.php';
+
+class JnlpController
+{
+    public function generateJnlp(Request $request, Response $response)
+    {
+        $data = $request->getParams();
+
+        $coreUrl = str_replace('rest/', '', \Url::coreurl());
+        $tmpPath = CoreConfigModel::getTmpPath();
+        $appName = CoreConfigModel::getApplicationName();
+        $userUniqueId = DatabaseModel::uniqueId();
+        $jnlpFileName = $GLOBALS['userId'] . '_maarchCM_' . $userUniqueId;
+        $jnlpFileNameExt = $jnlpFileName . '.jnlp';
+
+        $allCookies = '';
+        foreach($_COOKIE as $key => $value) {
+            if (!empty($allCookies)) {
+                $allCookies .= '; ';
+            }
+            $allCookies .= $key . '=' . str_replace(' ', '+', $value);
+        }
+
+        $loadedXml = CoreConfigModel::getXmlLoaded(['path' => 'modules/content_management/xml/config.xml']);
+        $jarPath = $coreUrl;
+        if ($loadedXml && !empty((string)$loadedXml->CONFIG[0]->jar_path)) {
+            $jarPath = (string)$loadedXml->CONFIG[0]->jar_path;
+        }
+
+        $jnlpDocument = new \DomDocument('1.0', 'UTF-8');
+
+        $tagJnlp = $jnlpDocument->createElement('jnlp');
+
+        $newAttribute = $jnlpDocument->createAttribute('spec');
+        $newAttribute->value = '6.0+';
+        $tagJnlp->appendChild($newAttribute);
+
+        $newAttribute = $jnlpDocument->createAttribute('codebase');
+        $newAttribute->value = $tmpPath;
+        $tagJnlp->appendChild($newAttribute);
+
+        $tagInformation = $jnlpDocument->createElement('information');
+        $tagTitle       = $jnlpDocument->createElement('title', 'Editeur de modèle de document');
+        $tagVendor      = $jnlpDocument->createElement('vendor', 'MAARCH');
+        $tagOffline     = $jnlpDocument->createElement('offline-allowed');
+        $tagSecurity    = $jnlpDocument->createElement('security');
+        $tagPermissions = $jnlpDocument->createElement('all-permissions');
+        $tagResources   = $jnlpDocument->createElement('resources');
+        $tagJ2se        = $jnlpDocument->createElement('j2se');
+
+        $newAttribute = $jnlpDocument->createAttribute('version');
+        $newAttribute->value = '1.6+';
+        $tagJ2se->appendChild($newAttribute);
+
+        $tagJar1 = $jnlpDocument->createElement('jar');
+        $newAttribute = $jnlpDocument->createAttribute('href');
+        $newAttribute->value = $coreUrl . '/modules/content_management/dist/maarchCM.jar';
+        $tagJar1->appendChild($newAttribute);
+        $newAttribute = $jnlpDocument->createAttribute('main');
+        $newAttribute->value = 'true';
+        $tagJar1->appendChild($newAttribute);
+
+        $tagJar2 = $jnlpDocument->createElement('jar');
+        $newAttribute = $jnlpDocument->createAttribute('href');
+        $newAttribute->value = $jarPath . '/modules/content_management/dist/lib/httpclient-4.5.2.jar';
+        $tagJar2->appendChild($newAttribute);
+
+        $tagJar3 = $jnlpDocument->createElement('jar');
+        $newAttribute = $jnlpDocument->createAttribute('href');
+        $newAttribute->value = $jarPath . '/modules/content_management/dist/lib/httpclient-cache-4.5.2.jar';
+        $tagJar3->appendChild($newAttribute);
+
+        $tagJar4 = $jnlpDocument->createElement('jar');
+        $newAttribute = $jnlpDocument->createAttribute('href');
+        $newAttribute->value = $jarPath . '/modules/content_management/dist/lib/httpclient-win-4.5.2.jar';
+        $tagJar4->appendChild($newAttribute);
+
+        $tagJar5 = $jnlpDocument->createElement('jar');
+        $newAttribute = $jnlpDocument->createAttribute('href');
+        $newAttribute->value = $jarPath . '/modules/content_management/dist/lib/httpcore-4.4.4.jar';
+        $tagJar5->appendChild($newAttribute);
+
+        $tagJar6 = $jnlpDocument->createElement('jar');
+        $newAttribute = $jnlpDocument->createAttribute('href');
+        $newAttribute->value = $jarPath . '/modules/content_management/dist/lib/plugin.jar';
+        $tagJar6->appendChild($newAttribute);
+
+        $tagJar7 = $jnlpDocument->createElement('jar');
+        $newAttribute = $jnlpDocument->createAttribute('href');
+        $newAttribute->value = $jarPath . '/modules/content_management/dist/lib/commons-logging-1.2.jar';
+        $tagJar7->appendChild($newAttribute);
+
+
+        $tagApplication = $jnlpDocument->createElement('application-desc');
+        $newAttribute = $jnlpDocument->createAttribute('main-class');
+        $newAttribute->value = 'com.maarch.MaarchCM';
+        $tagApplication->appendChild($newAttribute);
+
+        $tagArg1 = $jnlpDocument->createElement('argument', $coreUrl . 'rest/jnlp/' . $userUniqueId);
+        $tagArg2 = $jnlpDocument->createElement('argument', $data['objectType']);
+        $tagArg3 = $jnlpDocument->createElement('argument', $data['table']);
+        $tagArg4 = $jnlpDocument->createElement('argument', $data['objectId']);
+        $tagArg5 = $jnlpDocument->createElement('argument', $data['uniqueId']);
+
+        $tagArg6 = $jnlpDocument->createElement('argument', "{$appName}={$_COOKIE[$appName]}");
+        $tagArg7 = $jnlpDocument->createElement('argument', htmlentities($allCookies));
+        $tagArg8 = $jnlpDocument->createElement('argument', $jnlpFileName);
+        $tagArg9 = $jnlpDocument->createElement('argument', $GLOBALS['userId']);
+        $tagArg10 = $jnlpDocument->createElement('argument', 'false');
+        $tagArg11 = $jnlpDocument->createElement('argument', 'false');
+
+
+        $tagJnlp->appendChild($tagInformation);
+        $tagInformation->appendChild($tagTitle);
+        $tagInformation->appendChild($tagVendor);
+        $tagInformation->appendChild($tagOffline);
+
+        $tagJnlp->appendChild($tagSecurity);
+        $tagSecurity->appendChild($tagPermissions);
+
+        $tagJnlp->appendChild($tagResources);
+        $tagResources->appendChild($tagJ2se);
+        $tagResources->appendChild($tagJar1);
+        $tagResources->appendChild($tagJar2);
+        $tagResources->appendChild($tagJar3);
+        $tagResources->appendChild($tagJar4);
+        $tagResources->appendChild($tagJar5);
+        $tagResources->appendChild($tagJar6);
+        $tagResources->appendChild($tagJar7);
+
+        $tagJnlp->appendChild($tagApplication);
+        $tagApplication->appendChild($tagArg1);
+        $tagApplication->appendChild($tagArg2);
+        $tagApplication->appendChild($tagArg3);
+        $tagApplication->appendChild($tagArg4);
+        $tagApplication->appendChild($tagArg5);
+        $tagApplication->appendChild($tagArg6);
+        $tagApplication->appendChild($tagArg7);
+        $tagApplication->appendChild($tagArg8);
+        $tagApplication->appendChild($tagArg9);
+        $tagApplication->appendChild($tagArg10);
+        $tagApplication->appendChild($tagArg11);
+
+        $jnlpDocument->appendChild($tagJnlp);
+
+        $jnlpDocument->save($tmpPath . $jnlpFileNameExt);
+
+        fopen($tmpPath . $jnlpFileName . '.lck', 'w+');
+
+        return $response->withJson(['generatedJnlp' => $jnlpFileNameExt, 'userUniqueId' => $userUniqueId]);
+    }
+
+    public function renderJnlp(Request $request, Response $response)
+    {
+        $data = $request->getQueryParams();
+
+        if (explode('.', $data['fileName'])[1] != 'jnlp') {
+            return $response->withStatus(403)->withJson(['errors' => 'File extension forbidden']);
+        } elseif (strpos($data['fileName'], "{$GLOBALS['userId']}_maarchCM_") === false) {
+            return $response->withStatus(403)->withJson(['errors' => 'File name forbidden']);
+        }
+
+        $tmpPath = CoreConfigModel::getTmpPath();
+        $jnlp = file_get_contents($tmpPath . $data['fileName']);
+        if ($jnlp === false) {
+            return $response->withStatus(404)->withJson(['errors' => 'Jnlp file not found on ' . $tmpPath]);
+        }
+
+        $response->write($jnlp);
+
+        return $response->withHeader('Content-Type', 'application/x-java-jnlp-file');
+    }
+
+    public function processJnlp(Request $request, Response $response, array $aArgs)
+    {
+        $data = $request->getParams();
+
+        $tmpPath = CoreConfigModel::getTmpPath();
+
+        if ($data['action'] == 'editObject') {
+            if ($data['objectType'] == 'templateStyle') {
+                $explodeFile = explode('.', $data['objectId']);
+                $ext = $explodeFile[count($explodeFile) - 1];
+                $newFileOnTmp = "tmp_file_{$GLOBALS['userId']}_{$aArgs['userUniqueId']}.{$ext}";
+
+                $pathToCopy = $data['objectId'];
+            } elseif ($data['objectType'] == 'template') {
+                $docserver = DocserverModel::getCurrentDocserver(['typeId' => 'TEMPLATES', 'collId' => 'templates', 'select' => ['path_template']]);
+                $template = TemplateModel::getById(['id' => $data['objectId'], 'select' => ['template_path', 'template_file_name']]);
+
+                $explodeFile = explode('.', $template['template_file_name']);
+                $ext = $explodeFile[count($explodeFile) - 1];
+                $newFileOnTmp = "tmp_file_{$GLOBALS['userId']}_{$aArgs['userUniqueId']}.{$ext}";
+
+                $pathToCopy = $docserver['path_template'] . str_replace('#', DIRECTORY_SEPARATOR, $template['template_path']) . $template['template_file_name'];
+            } else {
+                $xmlResponse = JnlpController::generateResponse(['type' => 'ERROR', 'data' => ['ERROR' => 'Wrong objectType']]);
+                $response->write($xmlResponse);
+                return $response->withHeader('Content-Type', 'application/xml');
+            }
+
+            if (!copy($pathToCopy, $tmpPath . $newFileOnTmp)) {
+                $xmlResponse = JnlpController::generateResponse(['type' => 'ERROR', 'data' => ['ERROR' => "Failed to copy on {$tmpPath} : {$pathToCopy}"]]);
+                $response->write($xmlResponse);
+                return $response->withHeader('Content-Type', 'application/xml');
+            }
+
+            $fileContent = file_get_contents($tmpPath . $newFileOnTmp, FILE_BINARY);
+
+            $result = [
+                'STATUS'            => 'ok',
+                'OBJECT_TYPE'       => $data['objectType'],
+                'OBJECT_TABLE'      => $data['objectTable'],
+                'OBJECT_ID'         => $data['objectId'],
+                'UNIQUE_ID'         => $data['uniqueId'],
+                'APP_PATH'          => 'start',
+                'FILE_CONTENT'      => base64_encode($fileContent),
+                'FILE_EXTENSION'    => $ext,
+                'ERROR'             => '',
+                'END_MESSAGE'       => ''
+            ];
+            $xmlResponse = JnlpController::generateResponse(['type' => 'SUCCESS', 'data' => $result]);
+
+        } elseif ($data['action'] == 'saveObject') {
+            if (empty($data['fileContent']) || empty($data['fileExtension'])) {
+                $xmlResponse = JnlpController::generateResponse(['type' => 'ERROR', 'data' => ['ERROR' => 'File content or file extension empty']]);
+                $response->write($xmlResponse);
+                return $response->withHeader('Content-Type', 'application/xml');
+            }
+
+            $encodedFileContent = str_replace(' ', '+', $data['fileContent']);
+            $ext = str_replace(["\\", "/", '..'], '', $data['fileExtension']);
+            $fileContent = base64_decode($encodedFileContent);
+            $fileOnTmp = "tmp_file_{$GLOBALS['userId']}_{$aArgs['userUniqueId']}.{$ext}";
+
+            $file = fopen($tmpPath . $fileOnTmp, 'w');
+            fwrite($file, $fileContent);
+            fclose($file);
+
+            if (!empty($data['step']) && $data['step'] == 'end') {
+                unlink($tmpPath . $GLOBALS['userId'] . '_maarchCM_' . $aArgs['userUniqueId'] . '.lck');
+            }
+
+            $result = ['END_MESSAGE' => 'Update ok'];
+            $xmlResponse = JnlpController::generateResponse(['type' => 'SUCCESS', 'data' => $result]);
+        } else {
+            $result = [
+                'STATUS' => 'ko',
+                'OBJECT_TYPE'       => $data['objectType'],
+                'OBJECT_TABLE'      => $data['objectTable'],
+                'OBJECT_ID'         => $data['objectId'],
+                'UNIQUE_ID'         => $data['uniqueId'],
+                'APP_PATH'          => 'start',
+                'FILE_CONTENT'      => '',
+                'FILE_EXTENSION'    => '',
+                'ERROR'             => 'Missing parameters',
+                'END_MESSAGE'       => ''
+            ];
+            $xmlResponse = JnlpController::generateResponse(['type' => 'ERROR', 'data' => $result]);
+        }
+
+        $response->write($xmlResponse);
+
+        return $response->withHeader('Content-Type', 'application/xml');
+    }
+
+    private static function generateResponse(array $aArgs)
+    {
+        ValidatorModel::notEmpty($aArgs, ['type', 'data']);
+        ValidatorModel::stringType($aArgs, ['type']);
+        ValidatorModel::arrayType($aArgs, ['data']);
+
+        $response = new \DomDocument('1.0', 'UTF-8');
+
+        $tagRoot = $response->createElement($aArgs['type']);
+        $response->appendChild($tagRoot);
+
+        foreach ($aArgs['data'] as $key => $value) {
+            $tag = $response->createElement($key, $value);
+            $tagRoot->appendChild($tag);
+        }
+
+        return $response->saveXML();
+    }
+}
diff --git a/src/core/controllers/CoreController.php b/src/core/controllers/CoreController.php
index 0d3c26a644a..b69475ed116 100644
--- a/src/core/controllers/CoreController.php
+++ b/src/core/controllers/CoreController.php
@@ -73,25 +73,4 @@ class CoreController
 
         return $response->withJson($administration);
     }
-
-    public function renderJnlp(Request $request, Response $response)
-    {
-        $data = $request->getQueryParams();
-
-        if (explode('.', $data['fileName'])[1] != 'jnlp') {
-            return $response->withStatus(403)->withJson(['errors' => 'File extension forbidden']);
-        } elseif (strpos($data['fileName'], "{$GLOBALS['userId']}_maarchCM_") === false) {
-            return $response->withStatus(403)->withJson(['errors' => 'File name forbidden']);
-        }
-
-        $tmpPath = CoreConfigModel::getTmpPath();
-        $jnlp = file_get_contents($tmpPath . $data['fileName']);
-        if ($jnlp === false) {
-            return $response->withStatus(404)->withJson(['errors' => 'Jnlp file not found on ' . $tmpPath]);
-        }
-
-        $response->write($jnlp);
-
-        return $response->withHeader('Content-Type', 'application/x-java-jnlp-file');
-    }
 }
diff --git a/vendor/composer/ClassLoader.php b/vendor/composer/ClassLoader.php
index 4626994fd4d..2c72175e772 100644
--- a/vendor/composer/ClassLoader.php
+++ b/vendor/composer/ClassLoader.php
@@ -374,9 +374,13 @@ class ClassLoader
 
         $first = $class[0];
         if (isset($this->prefixLengthsPsr4[$first])) {
-            foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) {
-                if (0 === strpos($class, $prefix)) {
-                    foreach ($this->prefixDirsPsr4[$prefix] as $dir) {
+            $subPath = $class;
+            while (false !== $lastPos = strrpos($subPath, '\\')) {
+                $subPath = substr($subPath, 0, $lastPos);
+                $search = $subPath.'\\';
+                if (isset($this->prefixDirsPsr4[$search])) {
+                    foreach ($this->prefixDirsPsr4[$search] as $dir) {
+                        $length = $this->prefixLengthsPsr4[$first][$search];
                         if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
                             return $file;
                         }
diff --git a/vendor/composer/LICENSE b/vendor/composer/LICENSE
index 1a28124886d..f27399a042d 100644
--- a/vendor/composer/LICENSE
+++ b/vendor/composer/LICENSE
@@ -1,5 +1,5 @@
 
-Copyright (c) 2016 Nils Adermann, Jordi Boggiano
+Copyright (c) Nils Adermann, Jordi Boggiano
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php
index 97cb3fbc2e6..fe1aa85c5ac 100644
--- a/vendor/composer/autoload_psr4.php
+++ b/vendor/composer/autoload_psr4.php
@@ -41,6 +41,7 @@ return array(
     'Doctype\\' => array($baseDir . '/src/app/doctype'),
     'Docserver\\' => array($baseDir . '/src/app/docserver'),
     'Convert\\' => array($baseDir . '/modules/convert'),
+    'ContentManagement\\' => array($baseDir . '/src/app/contentManagement'),
     'Contact\\' => array($baseDir . '/src/app/contact'),
     'Clue\\StreamFilter\\' => array($vendorDir . '/clue/stream-filter/src'),
     'Buzz\\' => array($vendorDir . '/kriswallsmith/buzz/lib/Buzz'),
diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php
index 27fa9de5a0a..b6e744d4669 100644
--- a/vendor/composer/autoload_static.php
+++ b/vendor/composer/autoload_static.php
@@ -97,6 +97,7 @@ class ComposerStaticInit3cf41326f2ce1ccc88c4676c4e39ea47
         'C' => 
         array (
             'Convert\\' => 8,
+            'ContentManagement\\' => 18,
             'Contact\\' => 8,
             'Clue\\StreamFilter\\' => 18,
         ),
@@ -254,6 +255,10 @@ class ComposerStaticInit3cf41326f2ce1ccc88c4676c4e39ea47
         array (
             0 => __DIR__ . '/../..' . '/modules/convert',
         ),
+        'ContentManagement\\' => 
+        array (
+            0 => __DIR__ . '/../..' . '/src/app/contentManagement',
+        ),
         'Contact\\' => 
         array (
             0 => __DIR__ . '/../..' . '/src/app/contact',
-- 
GitLab