Thanks for that.
I tried setting it to true, but no luck.
>From what I understand from the code though, I wouldn't expect it to -
the credential_decoder lambda that gets set up based on that flag
isn't used until after the regex tries to split the URI, ie:
m =
re.compile('^(?P<user>[^:@]+)(\:(?P<password>[^@]*))?@(?P<host>[^\:@/]+)(\:(?P<port>[0-9]+))?/(?P<db>[^\?]+)(\?sslmode=(?P<sslmode>.+))?$').match(uri)
if not m:
raise SyntaxError, "Invalid URI string in DAL"
user = credential_decoder(m.group('user'))
The match is failing (ie m is None) when passed in a credential string
like this, from db.py:
from gluon.tools import Service
db = DAL('postgres://user:p@ssword@host/db')
response.generic_patterns = ['*']
service = Service()
Forgot to mention - running web2py 1.99.4 against PostgreSQL 9.1.
To my mind, the bug lies with the regex. I asked a question on Stack
Overflow to see if I could come up with a solution with their help:
http://stackoverflow.com/questions/9156195/python-regex-escaping/9160293
Using the regex in the answer I accepted works when I try it in a mini
test script, ie:
uri = 'postgres://username:p@ssword@host/database'
uri = uri.split('://')[1]
m =
re.compile('((?P<user>.*):)((?P<pass>.*)@)((?P<host>.*)/)((?P<db>.*))').match(uri)
if not m:
raise SyntaxError, "Invalid URI string in DAL " + uri
else:
print m.groupdict()
will result in:
{'host': 'host', 'db': 'database', 'user': 'username', 'pass': 'p@ssword'}
(note I've ignored port and SSL)
However if I modify dal.py, swapping line 1877 with:
m =
re.compile('((?P<user>.*):)((?P<pass>.*)@)((?P<host>.*)/)((?P<db>.*))').match(uri)
I get:
Traceback (most recent call last):
File "/var/www/web2py/gluon/restricted.py", line 204, in restricted
exec ccode in environment
File "/var/www/web2py/applications/geospatial/models/db.py", line 3,
in <module>
db = DAL('postgres://username:p@ssword@host/database')
File "/var/www/web2py/gluon/dal.py", line 4736, in __init__
driver_args or {}, adapter_args or {})
File "/var/www/web2py/gluon/dal.py", line 1878, in __init__
if not m:
SyntaxError: Invalid URI string in DAL
IE no match (m is None).
Any help would be much appreciated. Happy to provide any more
information as required.
Cheers,
Hugh.
On 6 February 2012 20:46, Niphlod <[email protected]> wrote:
> in gluon/dal.py you can find this....
>
> def __init__(self, uri='sqlite://dummy.db',
> pool_size=0, folder=None,
> db_codec='UTF-8', check_reserved=None,
> migrate=True, fake_migrate=False,
> migrate_enabled=True, fake_migrate_all=False,
> decode_credentials=False, driver_args=None,
> adapter_args=None, attempts=5, auto_import=False):
>
> if not decode_credentials:
> credential_decoder = lambda cred: cred
> else:
> credential_decoder = lambda cred: urllib.unquote(cred)
>
> try to quote the credentials and set decode_credentials to True
>
> On Feb 6, 7:18 am, Hugh Barker <[email protected]> wrote:
>> Hi,
>> I have a bit of a problem with my connection string in db.py -
>> specifically, the database password has a '@' symbol, and so web2py chokes
>> because it assumes this is the delimiter between password and host.
>>
>> I had a look at dal.py and I guess the regex needs modifying to take this
>> case into account. Unfortunately my regex skills are pretty rudimentary - I
>> spent an hour or so trying to nut it out, but didn't get anywhere, so I
>> thought I'd ask you guys. The code is around line 1800 of dal.py:
>>
>> uri = uri.split('://')[1]
>> m =
>> re.compile('^(?P<user>[^:@]+)(\:(?P<password>[^@]*))?@(?P<host>[^\:@/]+)(\:(?P<port>[0-9]+))?/(?P<db>[^\?]+)(\?sslmode=(?P<sslmode>.+))?$').match(uri)
>> if not m:
>> raise SyntaxError, "Invalid URI string in DAL"
>>
>> I can see what it's doing and where it's going wrong, just not how to fix
>> it :(
>>
>> Any help is appreciated.. I guess the easy option is to change the DB
>> password, but unfortunately that isn't an option for me.
>>
>> Cheers,
>> Hugh.