Skip to content
Snippets Groups Projects
Verified Commit 9cda8abd authored by Damien's avatar Damien
Browse files

FEAT #7737 Jnlp Controller

parent 8adf825b
No related branches found
No related tags found
No related merge requests found
{
"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": {
......
......@@ -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,
......
......@@ -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');
......
<?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();
}
}
......@@ -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');
}
}
......@@ -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;
}
......
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
......
......@@ -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'),
......
......@@ -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',
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment