Skip to content
This repository has been archived by the owner on Jan 31, 2020. It is now read-only.

Running URI through UriNormalize Filter appends / - causes Hostname TLD check to always fail #235

Open
rkeet opened this issue Jul 24, 2018 · 2 comments

Comments

@rkeet
Copy link

rkeet commented Jul 24, 2018

If you run any hostname through UriNormalize, at some point the normalize function in the Uri module is run. This module calls normalizePath function.

This function appends a / to the end of the URI.

Next, when you try to validate the URI with Hostname validator with 'useTldCheck' => true, in the options, it will always fail.

hostname


Steps to reproduce

Have the following in a fieldset

        $this->add(
            [
                'name'       => 'someUrl',
                'required'   => true,
                'type'       => Text::class,
                'options'    => [
                    'label' => 'Some URL',
                ],
                'attributes' => [
                    'maxlength' => 100,
                ],
            ]
        );

Have the following in an InputFilter:

        $this->add(
            [
                'name'       => 'someUrl',
                'required'   => true,
                'filters'    => [
                    ['name' => StringTrim::class],
                    ['name' => StripTags::class],
                    [
                        'name'    => ToNull::class,
                        'options' => [
                            'type' => ToNull::TYPE_STRING,
                        ],
                    ],
                    [
                        'name'    => UriNormalize::class,
                        'options' => [
                            'enforcedScheme' => 'https',
                        ],
                    ],
                ],
                'validators' => [
                    [
                        'name'    => StringLength::class,
                        'options' => [
                            'min' => 1,
                            'max' => 100,
                        ],
                    ],
                    [
                        'name'    => Hostname::class,
                        'options' => [
                            'allow'       => Hostname::ALLOW_DNS,
                            // Allow only DNS names
                            'useIdnCheck' => true,
                            // Check IDN domains - International Domain Names - supports international characters in DNS of country TLD, e.g. *.de (Germany) TLD
                            'useTldCheck' => true,
                            // Validates the existence of the TLD itself (the .com part of the domain)
                        ],
                    ],
                    [
                        'name'    => Uri::class,
                        'options' => [
                            'allowRelative' => false,
                        ],
                    ],
                ],
            ]
        );

I've got a few more issues reported that I'm solving, next to projects and a full-time job, I most likely will not have time to fix this. Would appreciate someone stepping in to fix this one. If not I might get around to it after other issues in zend-form and/or zend-inputfilter are finished.

@rkeet
Copy link
Author

rkeet commented Jul 24, 2018

                    // Remove trailing '/' char from tld string if present
                    if (substr($this->tld, -1) === '/') {
                        $this->tld = substr($this->tld, 0, -1);
                    }

I would suggest this after line 2052 in Hostname.php file.

@weierophinney
Copy link
Member

This repository has been closed and moved to laminas/laminas-validator; a new issue has been opened at laminas/laminas-validator#3.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants