Skip to content
Snippets Groups Projects
Verified Commit 29e03697 authored by David Beniamine's avatar David Beniamine
Browse files

Fallback controller WIP

parent b3ae8966
No related branches found
No related tags found
1 merge request!17Tuleap 77 legacy container
...@@ -2,6 +2,10 @@ controllers: ...@@ -2,6 +2,10 @@ controllers:
resource: ../../src/Controller/ resource: ../../src/Controller/
type: annotation type: annotation
fallback:
resource: ../../src/Controller/FallbackController.php
type: annotation
kernel: kernel:
resource: ../../src/Kernel.php resource: ../../src/Kernel.php
type: annotation type: annotation
...@@ -21,3 +21,7 @@ services: ...@@ -21,3 +21,7 @@ services:
# add more service definitions when explicit configuration is needed # add more service definitions when explicit configuration is needed
# please note that last definitions always *replace* previous ones # please note that last definitions always *replace* previous ones
parameters:
app.legacy_url_external: '%env(LEGACY_URL_EXTERNAL)%'
app.legacy_url: '%env(LEGACY_URL)%'
app.legacy_external_prefix: '%env(LEGACY_EXTERNAL_PREFIX)%'
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use AppBundle\Entity\Capsule;
use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class FallbackController extends AbstractController
{
/**
* @Route("/", name="get_legacy_resource_creation", methods={"POST"})
* @Route("/{controller}", name="get_legacy_resource_creation_index", requirements={"controller" = "index.php"})
*/
public function getCreationCapsuleAction(Request $request, $controller = null)
{
// $_POST parameters
$capsuleName = $request->request->get('create');
$capsulePass = $request->request->get('p');
$capsuleLink = $this->sanitize($capsuleName);
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_REMEMBERED');
$user = $this->getUser();
/*
// memorykall legacy affichera un message si champ vide
//bloquer les noms à null
if($capsuleName == null || $capsuleName == '')
{
// rediriger sur une page demandant un nom
return $this->redirectToRoute('missing_name');
}*/
// TODO : the following code MUST be re-enabled with tuleap-51
// // check if capsule exist in database
// $capByName = $this->getDoctrine()
// ->getManager()
// ->getRepository('AppBundle:Capsule')
// ->findOneByNom($capsuleName)
// ;
// $capByLink = $this->getDoctrine()
// ->getManager()
// ->getRepository('AppBundle:Capsule')
// ->findOneByLink($capsuleLink)
// ;
// if (!$capByName instanceof Capsule && !$capByLink instanceof Capsule) {
// $dateCreation = new \DateTime();
// $cap = new Capsule();
// $cap->setNom($capsuleName);
// $cap->setLink($capsuleLink);
// $cap->setEditionLink($capsuleLink.'/?p='.$capsulePass);
// $cap->setAutCrea($user);
// $cap->setDtCrea($dateCreation);
// $cap->setDtMaj($dateCreation);
// $cap->addEditeur($user);
//
// $em = $this->getDoctrine()->getManager();
// $em->persist($cap);
// $em->flush();
// }
// // si la capsule existe déjà memorkall legacy affichera un message capsule existe déjà
$response = $this->transfertToLegacy($request);
return $response;
}
/**
* @Route("/", name="get_legacy_resource")
* @Route("/{controller}", name="get_legacy_resource", requirements={"controller" = ".+"})
*/
public function getLegacyResourceAction(Request $request, $controller = null)
{
// $logger = $this->get('logger');
// check if capsule edition (pôst or get)
if ($request->query->has('p') || $request->request->has('p')) {
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_REMEMBERED');
$user = $this->getUser();
$pass = '';
if ($request->query->has('p')) {
$pass = $request->query->get('p');
} elseif ($request->request->has('p')) {
$pass = $request->request->get('p');
}
$userId = $user->getId();
// don't work properly with special char
//$link = rtrim($controller, "php/project.php");
$link = str_replace("php/project.php", "", $controller);
$link = rtrim($link, "/");
// TODO : the following code MUST be re-enabled with tuleap-51
// // check if capsule exist in database
// $cap = $this->getDoctrine()
// ->getManager()
// ->getRepository('AppBundle:Capsule')
// ->getCapsuleByLink($link);
// if (!$cap instanceof Capsule) {
// // rediriger sur une page demandant si il est l'auteur de la capsule
// return $this->redirectToRoute('add_author', array('capsuleLink'=>$link, 'capsulePass'=> $pass));
// }
//
// // if capsule exists, check if user can edit it
// $cap = $this->getDoctrine()
// ->getManager()
// ->getRepository('AppBundle:Capsule')
// ->getCapsuleByLinkAndUser($link, $userId);
// if (!$cap instanceof Capsule) {
// // rediriger sur une page lui demandant de contacter
// // l'administrateur de la capsule pour lui donner des droits
// return $this->redirectToRoute('no_edition_access');
// }
//
// // if yes, continue
// $cap->setAutMaj($user);
// $cap->setDtMaj(new \DateTime());
//
// $em = $this->getDoctrine()->getManager();
// $em->persist($cap);
// $em->flush();
}
if ($controller == null) {
//if no controller, this is index.php
return $this->redirectToRoute('get_legacy_resource', array('controller' => 'index.php'));
}
// use iframe to enhance speed but not for creation
if (strpos($controller, 'legacy') !== 0) {
// relative path (to app/) of the legacy code (on the same filesystem)
//$path_to_legacy_code = $this->getParameter('kernel.root_dir').
//$this->getParameter('legacy_root_dir');
$originalController = $request->getPathInfo();
$originalQueryString = $request->getQueryString();
$extension = strrchr($originalController, '.');
if ($extension != '.html' && $extension != '.php' && $extension != false) {
//$url = "{$path_to_legacy_code}{$originalController}";
$url = "{$originalController}";
try {
$mime = $this->getMime($url, $extension);
$response = new BinaryFileResponse($url);
$response->headers->set('Content-Type', $mime ?: 'application/octet-stream');
return $response;
} catch (FileNotFoundException $e) {
// try normal access by url
}
}
$separator = '';
if (!$extension) {
$separator = '/';
}
$url = "{$this->getParameter('app.legacy_url_external')}/" .
"{$originalController}{$separator}?{$originalQueryString}";
$url = preg_replace('(^https?:\/\/[^/]+(:\d+)?)', '', $url);
$pattern = '/\/\//i';
$url = preg_replace($pattern, '/', $url);
// $logger->info("Capsule iframe configuration for none index.php ", ['url' => $url]);
return $this->render("legacy/legacy.html.twig", array(
'url' => $url,
));
}
$response = $this->transfertToLegacy($request);
return $response;
}
private function transfertToLegacy(Request $request)
{
// relative path (to app/) of the legacy code (on the same filesystem)
//$path_to_legacy_code = $this->container->getParameter('kernel.root_dir').
// $this->container->getParameter('legacy_root_dir');
$prefix = $this->getParameter('app.legacy_external_prefix');
$originalController = preg_replace("@^$prefix@", '', $request->getPathInfo());
$originalQueryString = $request->getQueryString();
//@TODO : delete on linux server
// $originalController = str_replace("/", "\\", $originalController); //windows
$extension = strrchr($originalController, '.');
if ($extension != '.html' && $extension != '.php' && $extension != false) {
#$url = "{$path_to_legacy_code}{$originalController}";
$url = "{$originalController}";
try {
$mime = $this->getMime($url, $extension);
$response = new BinaryFileResponse($url);
$response->headers->set('Content-Type', $mime ?: 'application/octet-stream');
return $response;
} catch (FileNotFoundException $e) {
// try normal access by url
}
}
$separator = '';
if (!$extension) {
$separator = '/';
}
$url = "{$this->getParameter('app.legacy_url')}{$originalController}{$separator}?{$originalQueryString}";
//open connection
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
// logs the connection (optional)
$stderr = fopen("{$this->getParameter('kernel.project_dir')}/log/curl.txt", "w");
if ($request->getMethod() == 'POST') {
$postParameters = $request->request->all();
/*$postParametersString = '';
foreach ($postParameters as $key => $value) {
$postParametersString .= $key . '=' . $value . '&';
}
rtrim($postParametersString, '&');*/
// upload file to transfer
if (isset($_FILES['fileToUpload'])) {
$data = array(
'fileToUpload' => curl_file_create(
$_FILES['fileToUpload']['tmp_name'],
$_FILES['fileToUpload']['type'],
$_FILES['fileToUpload']['name']
)
);
$postParameters = array_merge($postParameters, $data);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
}
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postParameters);
}
curl_setopt($ch, CURLOPT_COOKIESESSION, 0);
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies.txt');
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt');
//execute post
$result = curl_exec($ch);
$contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
if ($result === false) {
$mes = "Erreur - Page non trouvée : " .
sprintf(curl_error($ch)) .
' - ' . sprintf(curl_errno($ch));
curl_close($ch);
throw new NotFoundHttpException($mes);
}
curl_close($ch);
$response = new Response($result);
$response->headers->set('Content-Type', $contentType);
return $response;
}
// Mime Type Checker
private function getMime($filename, $extension, $mode = 0)
{
// mode 0 = full check
// mode 1 = extension check only
$mime_types = array(
'txt' => 'text/plain',
'htm' => 'text/html',
'html' => 'text/html',
'php' => 'text/html',
'css' => 'text/css',
'js' => 'application/javascript',
'json' => 'application/json',
'xml' => 'application/xml',
'swf' => 'application/x-shockwave-flash',
'flv' => 'video/x-flv',
// images
'png' => 'image/png',
'jpe' => 'image/jpeg',
'jpeg' => 'image/jpeg',
'jpg' => 'image/jpeg',
'gif' => 'image/gif',
'bmp' => 'image/bmp',
'ico' => 'image/vnd.microsoft.icon',
'tiff' => 'image/tiff',
'tif' => 'image/tiff',
'svg' => 'image/svg+xml',
'svgz' => 'image/svg+xml',
// archives
'zip' => 'application/zip',
'rar' => 'application/x-rar-compressed',
'exe' => 'application/x-msdownload',
'msi' => 'application/x-msdownload',
'cab' => 'application/vnd.ms-cab-compressed',
// audio/video
'mp3' => 'audio/mpeg',
'qt' => 'video/quicktime',
'mov' => 'video/quicktime',
// adobe
'pdf' => 'application/pdf',
'psd' => 'image/vnd.adobe.photoshop',
'ai' => 'application/postscript',
'eps' => 'application/postscript',
'ps' => 'application/postscript',
// ms office
'doc' => 'application/msword',
'rtf' => 'application/rtf',
'xls' => 'application/vnd.ms-excel',
'ppt' => 'application/vnd.ms-powerpoint',
'docx' => 'application/msword',
'xlsx' => 'application/vnd.ms-excel',
'pptx' => 'application/vnd.ms-powerpoint',
// open office
'odt' => 'application/vnd.oasis.opendocument.text',
'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
);
if (null === $filename) {
throw new \InvalidArgumentException('File cannot be null.');
}
$ext = strtolower(str_replace('.', '', $extension));
if (array_key_exists($ext, $mime_types)) {
return $mime_types[$ext];
}
$file = new File((string) $filename, true);
if (!$file->isReadable()) {
throw new FileException('File must be readable.');
}
$mime = $file->getMimeType();
return $mime;
}
// copy of function used by memorekall to calculate real project name !
public static function sanitize($string, $force_lowercase = true, $anal = false)
{
$strip = array("~", "`", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "_", "=", "+", "[", "{", "]",
"}", "\\", "|", ";", ":", "\"", "'", "&#8216;", "&#8217;", "&#8220;", "&#8221;", "&#8211;", "&#8212;",
"—", "–", ",", "<", ".", ">", "/", "?");
$clean = trim(str_replace($strip, "", strip_tags($string)));
$clean = preg_replace('/\s+/', "-", $clean);
$clean = ($anal) ? preg_replace("/[^a-zA-Z0-9]/", "", $clean) : $clean ;
return ($force_lowercase) ?
(function_exists('mb_strtolower')) ?
mb_strtolower($clean, 'UTF-8') :
strtolower($clean) :
$clean;
}
}
{% extends 'layout.html.twig' %}
{% block body %}
<iframe src="{{ url }}"
style="width:100%;height:100%;top:0;left:0;position:absolute"
{# width="1200"
height="600" #}
frameborder="0"
webkitallowfullscreen
mozallowfullscreen
allowfullscreen>
</iframe>
{% endblock %}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment