Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

LocalPath's relativize() fails in some cases #70

Open
robertoea opened this issue Jul 17, 2023 · 15 comments
Open

LocalPath's relativize() fails in some cases #70

robertoea opened this issue Jul 17, 2023 · 15 comments
Assignees
Labels
enhancement New feature or request

Comments

@robertoea
Copy link

Checking ...->isSymlink() might not be enough, because it might be (one of) the ancestor's directories that is symlinked. Also, the $localPath->isSymlink() condition in relativize() might be missing a return.

Background:
Creating a new page doesn't work on my instance after upgrading combostrap to the new major version. My dokuwiki is set up on a symlinked dir and looking at the error log it appeared that combo failed to relativize the file path. Forcing canonical absolute path resolution solved the issue.

@gerardnico
Copy link
Member

Thanks for reporting. I miss it, I don't know how.

Can I have your case specifically so that I can test it.
Where is the symlink?

@robertoea
Copy link
Author

Basically my web hosting provider set up the directories like this:

domains
  example.com (primary domain)
    private_html --> symlinked to ../example.com/public_html
    public_html
      wiki
  alias.com (add-on domain)
    private_html --> symlinked to ../alias.com/public_html
    public_html --> symlinked to ../example.com/public_html
private_html --> symlinked to example.com/private_html
public_html --> symlinked to example.com/public_html

When accessing https://wiki.alias.com, pages will be served from domains/alias.com/private_html/wiki (which resolves to domains/example.com/public_html/wiki).

@gerardnico
Copy link
Member

Thanks. Sorry for the inconvenience, that's infuriating, I know.
Combostrap file system should stay on the physical path (ie domains/example.com/public_html/wiki)

I still don't see the relativization that does not work.

  • What is the path that needs to be relativized?
  • Does Dokuwiki see its installation directory in domains/alias.com/private_html/wiki and not in domains/example.com/public_html/wiki?

What do you mean with Forcing canonical absolute path resolution solved the issue.

Thanks
Nico

Ps for me later, the code location are:

@gerardnico
Copy link
Member

I took a look at the installation and its strange that you got wiki/ in the boostrap resources.
ie https://cdn.jsdelivr.net/wiki//npm/[email protected]/dist/css/bootstrap.min.css
Why? Because it's hard coded.

@robertoea
Copy link
Author

robertoea commented Aug 9, 2023

Basically the symptom was that when I created or edited a new page, I got an error The local path ($path) is not inside a wiki path drive.

IIRC, Dokuwiki tried to add a file in public_html/wiki/data, but the driveRoot was detected in private_html. Either that, or the other way around.

I think I just commented out the conditions that checked isAbsolute so toCanonicalAbsolutePath is always called:

public function relativize(LocalPath $localPath): LocalPath
    {

        /**
         * One of the problem of relativization is
         * that it may be:
         * * logical (when using a symling)
         * * physical
         */
        //if (!$this->isAbsolute() || $this->isShortName()) {
            /**
             * This is not a logical resolution
             * (if the path is logically not absolute and is a symlink,
             * we have a problem)
             */
            $actualPath = $this->toCanonicalAbsolutePath();
        //} else {
        //    $actualPath = $this;
        //}
        //if (!$localPath->isAbsolute() || $localPath->isShortName()) {
            $localPath = $localPath->toCanonicalAbsolutePath();
        //}

        if (strpos($actualPath->toAbsoluteId(), $localPath->toAbsoluteId()) === 0) {
            if ($actualPath->toAbsoluteId() === $localPath->toAbsoluteId()) {
                return LocalPath::createFromPathString("");
            }
            $sepCharacter = 1; // delete the sep characters
            $relativePath = substr($actualPath->toAbsoluteId(), strlen($localPath->toAbsoluteId()) + $sepCharacter);
            $relativePath = str_replace($this->getDirectorySeparator(), WikiPath::NAMESPACE_SEPARATOR_DOUBLE_POINT, $relativePath);
            return LocalPath::createFromPathString($relativePath);
        }
        /**
         * May be a symlink link
         */
        if ($this->isSymlink()) {
            $realPath = $this->toCanonicalAbsolutePath();
            return $realPath->relativize($localPath);
        }
        if ($localPath->isSymlink()) {
            $localPath = $localPath->toCanonicalAbsolutePath();
            $this->relativize($localPath);
        }
        throw new ExceptionBadArgument("The path ($localPath) is not a parent path of the actual path ($actualPath)");

    }

@gerardnico
Copy link
Member

It would be great if I can have the stack trace in the log to see where the relativize function was called during the creation because recreating your environment is a lot of work.

@robertoea
Copy link
Author

I don't have access to the server at the moment, but IIRC it's called from createFromPathObject in WikiPath.php.

@gerardnico
Copy link
Member

I want the stack trace to go way back until the creation of the page. I'll wait.

In this function, the code throws an exception, where we can see the paths involved and the whole code path. During the page creation, at some point, the paths passed are not good.

@gerardnico
Copy link
Member

If there is a symlink in a child folder (generally the data folder), the relativization will not work if we take the canonical path.

The file would be at:
/data-dokuwiki/pages/xxxx
and the folder would be at
/dokuwiki/data/pages
while logically the file is at:
/dokuwiki/data/pages/xxxx
I try to do the resolution always logically by default.

@robertoea
Copy link
Author

Is this what you need?

An error has occurred

An error has occurred during the execution of the action (combo_page)

Error (only seen by manager):

The local path (file:///home/user/domains/example.com/public_html/wiki/data/pages/slot_header.txt) is not inside a wiki path drive

#0 /home/user/domains/example.com/public_html/wiki/lib/plugins/combo/ComboStrap/LocalPath.php(239): ComboStrap\WikiPath::createFromPathObject()
#1 /home/user/domains/example.com/public_html/wiki/lib/plugins/combo/ComboStrap/FetcherMarkupBuilder.php(134): ComboStrap\LocalPath->toWikiPath()
#2 /home/user/domains/example.com/public_html/wiki/lib/plugins/combo/ComboStrap/FetcherMarkup.php(178): ComboStrap\FetcherMarkupBuilder->setRequestedExecutingPath()
#3 /home/user/domains/example.com/public_html/wiki/lib/plugins/combo/ComboStrap/TemplateSlot.php(212): ComboStrap\FetcherMarkup::createXhtmlMarkupFetcherFromPath()
#4 /home/user/domains/example.com/public_html/wiki/lib/plugins/combo/ComboStrap/FetcherPage.php(263): ComboStrap\TemplateSlot->getMarkupFetcher()
#5 /home/user/domains/example.com/public_html/wiki/lib/plugins/combo/ComboStrap/FetcherPage.php(132): ComboStrap\FetcherPage->buildObjectIfNeeded()
#6 /home/user/domains/example.com/public_html/wiki/lib/plugins/combo/action/docustom.php(180): ComboStrap\FetcherPage->getFetchString()
#7 /home/user/domains/example.com/public_html/wiki/inc/Extension/EventHandler.php(80): action_plugin_combo_docustom->executeComboDoAction()
#8 /home/user/domains/example.com/public_html/wiki/inc/Extension/Event.php(74): dokuwiki\Extension\EventHandler->process_event()
#9 /home/user/domains/example.com/public_html/wiki/inc/ActionRouter.php(80): dokuwiki\Extension\Event->advise_before()
#10 /home/user/domains/example.com/public_html/wiki/inc/ActionRouter.php(48): dokuwiki\ActionRouter->setupAction()
#11 /home/user/domains/example.com/public_html/wiki/inc/ActionRouter.php(60): dokuwiki\ActionRouter->__construct()
#12 /home/user/domains/example.com/public_html/wiki/inc/actions.php(16): dokuwiki\ActionRouter::getInstance()
#13 /home/user/domains/example.com/public_html/wiki/doku.php(126): act_dispatch()
#14 {main}

@gerardnico
Copy link
Member

gerardnico commented Aug 9, 2023

Yes.

I have symlinked the DokuWiki root installation on my environment and it works. Maybe it comes from the wiki sub-directory configuration. Still searching.

This is the Apache configuration that I have used:

<VirtualHost *:80>
    DocumentRoot "d:/dokuwiki-symlink"
    ServerName combo.nico.lan
    DirectoryIndex index.php
    <Directory "d:/dokuwiki-symlink" >
		Require all granted
		AllowOverride All
		Options Indexes FollowSymLinks Includes ExecCGI
    </Directory>
</VirtualHost>

Do you know your HTTP server configuration?

@gerardnico
Copy link
Member

gerardnico commented Aug 9, 2023

If you add ?do=admin&page=config to your URL in order to go to the configuration.
Can you give me the configuration that you have in savedir and basedir ?

image

I'm trying to see the configuration value $conf['datadir']. This is where the pages are stored.

At least, as you seem to have a bit of Php knowledge, in a PHP script, you can do

global $conf;
$pageDirectory = $conf['datadir'];
echo $pageDirectory

Ps: I use a farm therefore the symlink does not impact the data configuration....

@gerardnico
Copy link
Member

If you set the savedir to the real location of your files

  • ie /home/user/domains/example.com/public_html/wiki/data,
  • instead of ./data
    do you still have the problem?

@robertoea
Copy link
Author

savedir is ./data
basedir is empty
$pageDirectory is /home/user/domains/example.com/private_html/wiki/data/pages

If I set savedir to the real location I don't have the problem anymore.

@gerardnico
Copy link
Member

Thanks!
I will let this problem cool down to work on the best approach to solve this particular problem.

@gerardnico gerardnico added the enhancement New feature or request label Mar 16, 2024
@gerardnico gerardnico self-assigned this Mar 16, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants