Новости Joomla

0 Пользователей и 1 Гость просматривают эту тему.
  • 24 Ответов
  • 2658 Просмотров
*

lexmakh

  • Осваиваюсь на форуме
  • 13
  • 0 / 0
Приветствую всех форумчан!
Помогите плз начинающему)
Есть сайт на 4 версии, появилась необходимость использовать свой скрипт на php, размещен он в папке в корне сайта, на сайт выводится как wrapper и ссылка на эту папку, доступ к этому всему делу должен быть только у юзеров, на сайте выставил права всё отлично, но прямая ссылка на папку доступна и можно зайти в обход Joomla... как сделать так чтобы было нельзя, а только через сайт Joomla с авторизацией?
Заранее благодарен всем!
*

sivers

  • Живу я здесь
  • 2585
  • 359 / 0
Re: PHP скрипт для авторизованных
« Ответ #1 : 12.12.2023, 09:50:19 »
Подтянуть классы Joomla (посмотрите как подключается в индексе корневом, сделайте так же, только без $app->execute();)
Прочитать юзера через $user = Factory::getUser() и проверить $user->id - если больше нуля, значит юзер авторизован.
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

lexmakh

  • Осваиваюсь на форуме
  • 13
  • 0 / 0
Re: PHP скрипт для авторизованных
« Ответ #2 : 12.12.2023, 10:32:16 »
Подтянуть классы Joomla (посмотрите как подключается в индексе корневом, сделайте так же, только без $app->execute();)
Прочитать юзера через $user = Factory::getUser() и проверить $user->id - если больше нуля, значит юзер авторизован.
Спасибо за наводку, но я в этих делах новичок, буду пробовать разобраться, но в корневом индексе у меня только такое:
Код
<?php

/**
 * @package    Joomla.Site
 *
 * [member=126442]copyright[/member]  (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
 * @license    GNU General Public License version 2 or later; see LICENSE.txt
 */

// NOTE: This file should remain compatible with PHP 5.2 to allow us to run our PHP minimum check and show a friendly error message

// Define the application's minimum supported PHP version as a constant so it can be referenced within the application.
define('JOOMLA_MINIMUM_PHP', '7.2.5');

if (version_compare(PHP_VERSION, JOOMLA_MINIMUM_PHP, '<')) {
    die(
        str_replace(
            '{{phpversion}}',
            JOOMLA_MINIMUM_PHP,
            file_get_contents(dirname(__FILE__). '/templates/system/incompatible.html')
        )
    );
}

/**
 * Constant that is checked in included files to prevent direct access.
 * define() is used rather than "const" to not error for PHP 5.2 and lower
 */
define('_JEXEC', 1);

// Run the application - All executable code should be triggered through this file
require_once dirname(__FILE__). '/includes/app.php';
*

sivers

  • Живу я здесь
  • 2585
  • 359 / 0
Re: PHP скрипт для авторизованных
« Ответ #3 : 12.12.2023, 11:30:09 »
Посмотрите тут:
Спойлер
[свернуть]
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

lexmakh

  • Осваиваюсь на форуме
  • 13
  • 0 / 0
Re: PHP скрипт для авторизованных
« Ответ #4 : 12.12.2023, 12:14:37 »
Спасибо!
Я правильно понимаю, что этот код мне нужно добавить в мой index.php?
добавляю в начале файла:
Код
<?php $_SERVER['REQUEST_URI'] = '...'; $_SERVER['HTTP_HOST'] = '...'; define('_JEXEC', 1); include_once dirname(__DIR__).'/api/includes/api.php'; $db = \Joomla\CMS\Factory::getDbo();
ничего не меняется, скрипт выполняется
*

sivers

  • Живу я здесь
  • 2585
  • 359 / 0
Re: PHP скрипт для авторизованных
« Ответ #5 : 12.12.2023, 12:29:26 »
ничего не меняется, скрипт выполняется
Там описание подключение классов Joomla, а не решение вашей задачи. Перечитайте первый пост.
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

lexmakh

  • Осваиваюсь на форуме
  • 13
  • 0 / 0
Re: PHP скрипт для авторизованных
« Ответ #6 : 12.12.2023, 12:34:25 »
Там описание подключение классов Joomla, а не решение вашей задачи. Перечитайте первый пост.
Понял, начинаю проверять юзера, получаю ошибку 500
Код
<?php
$_SERVER['REQUEST_URI'] = '...';
$_SERVER['HTTP_HOST'] = '...';
define('_JEXEC', 1);
include_once dirname(__DIR__).'/api/includes/api.php';
$db = \Joomla\CMS\Factory::getDbo();

use Joomla\CMS\Factory;
$user = Factory::getUser()
if ($user->guest) {
        echo "<p>You must login to see the content.</p>";
} else {
        echo "<p>You are logged in, you can see the content.</p>";
}

где то логи можно посмотреть?
*

lexmakh

  • Осваиваюсь на форуме
  • 13
  • 0 / 0
Re: PHP скрипт для авторизованных
« Ответ #7 : 12.12.2023, 12:36:24 »
логи нашел)
ругается на if ($user->guest) {
*

ProtectYourSite

  • Живу я здесь
  • 2364
  • 137 / 4
  • Безопасность вебсайтов
Re: PHP скрипт для авторизованных
« Ответ #8 : 12.12.2023, 14:54:16 »
; надо ставить после $user = Factory::getUser()
Либо пишите полный текст ошибки
*

lexmakh

  • Осваиваюсь на форуме
  • 13
  • 0 / 0
Re: PHP скрипт для авторизованных
« Ответ #9 : 12.12.2023, 15:11:56 »
; надо ставить после $user = Factory::getUser()
Либо пишите полный текст ошибки
спасибо! не заметил такой глупой ошибки  crazy!
теперь подскажите пожалуйста, как спрятать контент не авторизованным?
*

lexmakh

  • Осваиваюсь на форуме
  • 13
  • 0 / 0
Re: PHP скрипт для авторизованных
« Ответ #10 : 12.12.2023, 15:22:50 »
не работает это, не зависимо авторизован или нет выводит: You must login to see the content
если делаю как в первом сообщении: if ($user->0) { то ошибка: Got error 'PHP message: PHP Parse error:  syntax error, unexpected '0' (T_LNUMBER), expecting identifier (T_STRING) or variable (T_VARIABLE) or '{' or '$' in /var/www/
*

lexmakh

  • Осваиваюсь на форуме
  • 13
  • 0 / 0
Re: PHP скрипт для авторизованных
« Ответ #11 : 12.12.2023, 15:27:33 »
if ($user->id>0) {
вот так заработало, но тоже самое теперь говорит: You are logged in, you can see the content не зависимо от авторизации...
*

sivers

  • Живу я здесь
  • 2585
  • 359 / 0
Re: PHP скрипт для авторизованных
« Ответ #12 : 12.12.2023, 15:54:03 »
да, потому что еще и к сессии той же подключиться надо. готового ответа как это сделать - у меня нет.
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

beliyadm

  • Легенда
  • 9758
  • 1665 / 66
  • Севастополь, Россия
Re: PHP скрипт для авторизованных
« Ответ #13 : 13.12.2023, 19:13:07 »
А не проще использовать модуль произвольного HTML кода, создать для него отдельный макет вывода, в котором прописать этот PHP скрипт.
На странице опубликовать модуль с указанием созданного макета, доступ к странице\модулю закрывать для пользователей штатными средствами.
Все истины, которые я хочу вам изложить, — бесстыдная ложь. Сделать всё хорошо
TLG: @Beliyadm
*

lexmakh

  • Осваиваюсь на форуме
  • 13
  • 0 / 0
Re: PHP скрипт для авторизованных
« Ответ #14 : 14.12.2023, 08:06:10 »
А не проще использовать модуль произвольного HTML кода, создать для него отдельный макет вывода, в котором прописать этот PHP скрипт.
На странице опубликовать модуль с указанием созданного макета, доступ к странице\модулю закрывать для пользователей штатными средствами.
я так пробовал, но не получалось, выводилась по моему пустая страница, а в PHP я не силен, хотя скрипт в принципе простой...
а что значит создать отдельный макет вывода?
*

beliyadm

  • Легенда
  • 9758
  • 1665 / 66
  • Севастополь, Россия
Re: PHP скрипт для авторизованных
« Ответ #15 : 14.12.2023, 08:35:46 »
а что значит создать отдельный макет вывода?

Создать пустой файл \templates\шаблон\html\mod_custom\customcode.php, в него запихнуть нужный PHP скрипт, опубликовать модуль произвольного HTML кода указав в настройках "доп параметры" как макет этот customcode

Если сам скрипт не завязан на каких-либо путях\подключении библиотек - должно с полпинка заработать
Все истины, которые я хочу вам изложить, — бесстыдная ложь. Сделать всё хорошо
TLG: @Beliyadm
*

lexmakh

  • Осваиваюсь на форуме
  • 13
  • 0 / 0
Re: PHP скрипт для авторизованных
« Ответ #16 : 14.12.2023, 09:39:24 »
спасибо за наводку!
в таком варианте уже что-то, но видимо как Вы сказали из-за путей работает не так.
у меня этот скрипт сканирует и выводит список папок с картинками, которые постоянно обновляются, генерирует список ссылок вида ./index.php?dir=имя папки и при переходе по ссылке открывается слайдшоу с этими картинками.
в предложенном Вами варианте генерируется ссылка http://домен/?dir=имя папки и при переходе понятное дело ничего нужного не открывается...
Мне было бы достаточно, чтобы скрипт просканировал одну конкретную папку и запустил слайд-шоу, ниже приложу код, можете помочь пожалуйста?
Код
<!DOCTYPE html>
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="stylesheet" href="base.css">
</head>
<body>
<?php
if(!isset($_GET['dir'])){
  echo '<ul>';
  $dir    = './';
  $files = array_filter(scandir($dir),"is_dir");
  foreach($files as $f) {
    if (!preg_match("/^\./",$f)) {
      $childfiles = scandir($f);
      $count = 0;
      foreach($childfiles as $c) {
        if (preg_match("/image|video/",mime_content_type($f.'/'.$c))){
          $count++;
        };
      }
      echo '<li><a href="index.php?dir='.$f.'">'.$f.' ['.$count.']</li>';
    }
  }
  echo '</ul>';
} else {
  if (preg_match('/^\.|\/+|~/',$_GET['dir'])){
    die('only direct child folders');
  }
  $all = array();
  $dir = './'.$_GET['dir'];
  if (!is_dir($dir)) {
    die('Cannot find the folder, sorry');
  }
  $files = scandir($dir);
  foreach($files as $f) {
    if (preg_match("/image|video/",mime_content_type($dir.'/'.$f))){
      array_push($all,$f);
    }
  }
?>
<div id="slideshow-container"><>
<script>
  let slideshow = {
    container: '#slideshow-container',
    media: <?php echo json_encode($all);?>,
    folder: '<?php echo urlencode(str_replace('index.php?','',$_GET['dir']))?>/',
    autoplay: 'no',
    endless: 'yes'
  }
</script>
<script src="slideshow.js"></script>
<?php } ?>
</body>
</html>
*

beliyadm

  • Легенда
  • 9758
  • 1665 / 66
  • Севастополь, Россия
Re: PHP скрипт для авторизованных
« Ответ #17 : 14.12.2023, 21:52:30 »
Мне было бы достаточно, чтобы скрипт просканировал одну конкретную папку и запустил слайд-шоу
Для этого есть множество других расширений, к примеру я использую плагин Simple Image Gallery - в материал вставляете тег {gallery}myphotos{/gallery} (путь идет от корня images) и всё. Создаются кешированные превьюшки, генерится слайдшоу или что угодно в каком угодно формате (списком\слайдером и тд - подключаете свои скрипты\стили и меняете шаблон вывода).
Пример - https://bcks.su/section/dance/tantsevalnyj-kollektiv-pugovki

Ну и дальше работать с правами доступа к материалу с этим тегом штатно.

Если самодельно - то самый простой скрипт вывода картинок из галереи будет примерно таким без всяких заморочек.
Код
$dirname = './images/gal/';
$images = glob($dirname.'*.jpg');

foreach ($images as $image) {
echo '<img src="'.$image.'" />';
}


Все истины, которые я хочу вам изложить, — бесстыдная ложь. Сделать всё хорошо
TLG: @Beliyadm
*

lexmakh

  • Осваиваюсь на форуме
  • 13
  • 0 / 0
Re: PHP скрипт для авторизованных
« Ответ #18 : 15.12.2023, 12:09:45 »
нет стандартные не подходят, пробовал много разных.
у меня не очень стандартная задача) у меня 4 папки по 1.5к картинок, которые меняются каждую минуту, новая добавляется последняя удаляется.
есть у меня рабочий скрипт он сканирует от корня и выдает список url на эти папки с изображениями, а мне бы сделать чтобы я указал из какой именно папки брать изображения и запускать скрипт.
так же он из двух компонентов: бэк на PHP и сам скрипт, если бы его упросить и поместить в один файл, чтобы я его мог сделать модуль произвольного HTML кода, точнее 4 таких модуля для разных папок и средствами Joomla уже управлял бы доступом...
index.php
Код
<!DOCTYPE html>
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="stylesheet" href="base.css">
</head>
<body>
<?php
if(!isset($_GET['dir'])){
  echo '<ul>';
  $dir    = './';
  $files = array_filter(scandir($dir),"is_dir");
  foreach($files as $f) {
    if (!preg_match("/^\./",$f)) {
      $childfiles = scandir($f);
      $count = 0;
      foreach($childfiles as $c) {
        if (preg_match("/image|video/",mime_content_type($f.'/'.$c))){
          $count++;
        };
      }
      echo '<li><a href="index.php?dir='.$f.'">'.$f.' ['.$count.']</li>';
    }
  }
  echo '</ul>';
} else {
  if (preg_match('/^\.|\/+|~/',$_GET['dir'])){
    die('only direct child folders');
  }
  $all = array();
  $dir = './'.$_GET['dir'];
  if (!is_dir($dir)) {
    die('Cannot find the folder, sorry');
  }
  $files = scandir($dir);
  foreach($files as $f) {
    if (preg_match("/image|video/",mime_content_type($dir.'/'.$f))){
      array_push($all,$f);
    }
  }
?>
<div id="slideshow-container"></div>
<script>
  let slideshow = {
    container: '#slideshow-container',
    media: <?php echo json_encode($all);?>,
    folder: '<?php echo urlencode(str_replace('index.php?','',$_GET['dir']))?>/',
    autoplay: 'no',
    endless: 'yes'
  }
</script>
<script src="slideshow.js"></script>
<?php } ?>
</body>
</html>

slideshow.js
Код
if (typeof slideshow === 'object') {
let styles = document.createElement('link');
styles.rel="stylesheet";
styles.href="slideshow.css";
document.head.appendChild(styles);
document.querySelector(slideshow.container).innerHTML = `
<div class="slideshow-info"></div>
<div class="slideshow-docs">Arrow keys go back/forward
</div>
<button id="slideshow-next">в–¶</button>
<button id="slideshow-prev">в—Ђ</button>
<button id="slideshow-autoplay"></button>
<div class="slideshow-wrapper">
</div>
`;
const out = document.querySelector('.slideshow-info');
const wrapper = document.querySelector('.slideshow-wrapper');
const next = document.querySelector('#slideshow-next');
const prev = document.querySelector('#slideshow-prev');
const autoplay = document.querySelector('#slideshow-autoplay');
let hash = 'counter' + slideshow.folder;
let counter = slideshow.media.length-1;
let autoincrease = slideshow.autoplay === 'no' ? false : true;
let restart = slideshow.endless === 'no' ? false : true;
let first = false;
let last = false;
let timeout = false;
let speed = slideshow.speed || 40;
let all = slideshow.media.length
let direction = -1;

function validatecounter() {
  autoplay.innerText = autoincrease ? "в–¶пёЏ" : 'вЏё';
  if (restart) {
    if (counter < 0) counter = all - 1;
    counter = counter % all;
  } else {
    if (counter <= 0) {
      counter = 0;
    }
    if (counter === all) counter = all - 1;
  }
  if (!restart) {
    first = counter === 0;
    last = counter === all - -1;
/*      if (counter === 0) {
      prev.classList.add('hidden');
    } else {
      prev.classList.remove('hidden');
    }
    if (counter === all - 1) {
      next.classList.add('hidden');
      autoplay.classList.add('hidden');
    } else {
      next.classList.remove('hidden');
      autoplay.classList.remove('hidden');
    } */
  }

  show();
}
function show() {
  clearTimeout(timeout);
  out.innerText = `${slideshow.media[counter]} ${counter+1}/${all}`;
  wrapper.innerText = '';
  wrapper.dataset.loaded = 'false';

  if(slideshow.media[counter].endsWith('.mp4')) {
    wrapper.style.backgroundImage = ``;
    let vid = document.createElement('video');
    vid.setAttribute('loop','true');
    vid.setAttribute('autoplay','true');
    vid.setAttribute('src', slideshow.folder + slideshow.media[counter]);
    if (wrapper.dataset.loaded === 'false') {
      vid.addEventListener('canplaythrough', ev => {
        wrapper.appendChild(vid);
        loaded();
      },{passive:true, once:true});
    }
  } else {
    wrapper.innerText = ' ';
    let url = slideshow.folder + slideshow.media[counter];
    let i = new Image();
    i.src = url;
    i.onload = function() {
      wrapper.style.backgroundImage = `url(${url})`;
      loaded();
    }
    i.onerror = function() {
      wrapper.innerText = 'Error loading image ' + url;
      loaded();
    }
  }
}
function loaded() {
  wrapper.dataset.loaded = 'true';
  if (autoincrease && !last) {
    timeout = window.setTimeout(function(){
      counter += direction;
      validatecounter();
    },speed);
  }
}
function nextslide() {
  if(!last) {
    counter--;
    autoincrease = false;
    validatecounter();
  }
};
function prevslide() {
  if(!first) {
    counter++;
    autoincrease = false;
    validatecounter();
  }
};
function toggleauto() {
  autoincrease = !autoincrease;
  validatecounter();
};
next.addEventListener('click', nextslide);
prev.addEventListener('click', prevslide);
autoplay.addEventListener('click',toggleauto);
document.addEventListener('keyup', ev => {
  ev.preventDefault();
  if (ev.key === "ArrowRight") { nextslide(); }
  if (ev.key === "ArrowUp") { history.back(); }
  if (ev.key === "ArrowLeft") { prevslide(); }
  if (ev.key === " ") { toggleauto(); }
});
validatecounter();
} else {
  console.error('Please define a slideshow object first');
  document.body.innerText = "вљ пёЏ Can't find slideshow object"
}
*

ProtectYourSite

  • Живу я здесь
  • 2364
  • 137 / 4
  • Безопасность вебсайтов
Re: PHP скрипт для авторизованных
« Ответ #19 : 16.12.2023, 15:52:33 »
А где папка находится? Чтобы не было проблем с путями, лучше используйте константы.

К примеру:
Код
$dir  = JPATH_ROOT . 'my_custom_images_folder';

И еще пару замечаний:
1) Не совсем безопасно принимать $_GET['dir'] без фильтрации
2) head, body эти HTML теги не нужны в коде, если Вы используете как модуль, то это встраивается на конкретной странице в текущей позиции уже в указанную верстку
3) если принципиально, чтобы открывался скрипт напрямую по указанному файлу (типо site.ru/modules/mod_blabla/custom.php, то стоит погуглить примеры с отключением:
Код
defined('_JEXEC') or die('Restricted access');
*

ProtectYourSite

  • Живу я здесь
  • 2364
  • 137 / 4
  • Безопасность вебсайтов
Re: PHP скрипт для авторизованных
« Ответ #20 : 16.12.2023, 15:55:30 »
ну и в любом случае, если файлы доступны физически и не закрыты через htaccess, то по ссылке они будут доступны, вне зависимости от прав доступа. Для этих целей надо использовать что-то типо Jdownloads либо писать свой кастомный компонент с похожей логикой
*

lexmakh

  • Осваиваюсь на форуме
  • 13
  • 0 / 0
Re: PHP скрипт для авторизованных
« Ответ #21 : 21.12.2023, 10:13:59 »
А где папка находится? Чтобы не было проблем с путями, лучше используйте константы.
папка в корне
*

lexmakh

  • Осваиваюсь на форуме
  • 13
  • 0 / 0
Re: PHP скрипт для авторизованных
« Ответ #22 : 21.12.2023, 10:16:49 »
ну и в любом случае, если файлы доступны физически и не закрыты через htaccess, то по ссылке они будут доступны, вне зависимости от прав доступа. Для этих целей надо использовать что-то типо Jdownloads либо писать свой кастомный компонент с похожей логикой
это понятно, прямые ссылки на файлы пусть будут, задача чтобы скрипт мог выполняться только авторизованными.
а что дает Jdownloads? он просто делает htaccess в этой папке, но тогда я вообще не имею доступа к этим файлам...
*

fsv

  • Живу я здесь
  • 2781
  • 410 / 2
Re: PHP скрипт для авторизованных
« Ответ #23 : 22.12.2023, 09:50:33 »
Вам в начале темы правильно подсказали. Попробуйте следующий код, проверил, работает. Только у меня файл в корне сайта. У вас папка, измените пути в первых двух if.
Код
<?php

const _JEXEC = 1;

if (file_exists(__DIR__ . '/defines.php')) {
    require_once __DIR__ . '/defines.php';
}

if (!defined('_JDEFINES')) {
    define('JPATH_BASE', __DIR__);
    require_once JPATH_BASE . '/includes/defines.php';
}

// Get the framework.
require_once JPATH_BASE . '/includes/framework.php';

// Boot the DI container
$container = \Joomla\CMS\Factory::getContainer();

$container->alias('session.web', 'session.web.site')
    ->alias('session', 'session.web.site')
    ->alias('JSession', 'session.web.site')
    ->alias(\Joomla\CMS\Session\Session::class, 'session.web.site')
    ->alias(\Joomla\Session\Session::class, 'session.web.site')
    ->alias(\Joomla\Session\SessionInterface::class, 'session.web.site');

$app = $container->get(\Joomla\CMS\Application\SiteApplication::class);

// Set the application as global app
\Joomla\CMS\Factory::$application = $app;

$app->createExtensionNamespaceMap();


/////////// your code: ///////////

$user = \Joomla\CMS\Factory::getUser();

if($user->guest) {
    $app->redirect('/');
}

echo 'Дальнейшее выполнение скрипта для авторизованных.';

exit;
Веб-разработка: заказ. Только новая разработка.
*

sivers

  • Живу я здесь
  • 2585
  • 359 / 0
Re: PHP скрипт для авторизованных
« Ответ #24 : 22.12.2023, 10:34:03 »
Вам в начале темы правильно подсказали. Попробуйте следующий код, проверил, работает. Только у меня файл в корне сайта. У вас папка, измените пути в первых двух if.

Это не поможет, т.к. сессия будет другая у скрипта и юзер там окажется неавторизован.
Вот была похожая тема, но там Joomla постарее:
Передача сессии стороннему скрипту
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Не работает скрипт внутри статьи Joomla 5

Автор creative3d

Ответов: 11
Просмотров: 1336
Последний ответ 30.01.2024, 07:52:29
от creative3d
Как подключить Joomla 4 framework в свой php скрипт?

Автор SalityGEN

Ответов: 6
Просмотров: 2802
Последний ответ 15.02.2023, 11:32:57
от fsv