1 /***************************************************************************
2      testqgsdatasourceuri.cpp
3      --------------------------------------
4     Date                 : Thu Apr 16 2015
5     Copyright            : (C) 2015 by Sandro Mani
6     Email                : manisandro@gmail.com
7  ***************************************************************************
8  *                                                                         *
9  *   This program is free software; you can redistribute it and/or modify  *
10  *   it under the terms of the GNU General Public License as published by  *
11  *   the Free Software Foundation; either version 2 of the License, or     *
12  *   (at your option) any later version.                                   *
13  *                                                                         *
14  ***************************************************************************/
15 #include "qgstest.h"
16 #include <QObject>
17 #include <QString>
18 //header for class being tested
19 #include <qgsdatasourceuri.h>
20 
21 Q_DECLARE_METATYPE( QgsWkbTypes::Type )
22 Q_DECLARE_METATYPE( QgsDataSourceUri::SslMode )
23 
24 class TestQgsDataSourceUri: public QObject
25 {
26     Q_OBJECT
27   private slots:
28     void checkparser();
29     void checkparser_data();
30     void checkAuthParams();
31 };
32 
checkparser_data()33 void TestQgsDataSourceUri::checkparser_data()
34 {
35   QTest::addColumn<QString>( "uri" );
36   QTest::addColumn<QString>( "table" );
37   QTest::addColumn<QString>( "geometrycolumn" );
38   QTest::addColumn<QString>( "key" );
39   QTest::addColumn<bool>( "estimatedmetadata" );
40   QTest::addColumn<QString>( "srid" );
41   QTest::addColumn<QgsWkbTypes::Type>( "type" );
42   QTest::addColumn<bool>( "selectatid" );
43   QTest::addColumn<QString>( "service" );
44   QTest::addColumn<QString>( "user" );
45   QTest::addColumn<QString>( "password" );
46   QTest::addColumn<QString>( "dbname" );
47   QTest::addColumn<QString>( "host" );
48   QTest::addColumn<QString>( "port" );
49   QTest::addColumn<QString>( "driver" );
50   QTest::addColumn<QgsDataSourceUri::SslMode>( "sslmode" );
51   QTest::addColumn<QString>( "sql" );
52   QTest::addColumn<QString>( "myparam" );
53   QTest::addColumn<QString>( "schema" );
54 
55 
56   QTest::newRow( "oci" )
57       << "host=myhost port=1234 user='myname' password='mypasswd' estimatedmetadata=true srid=1000003007 table=\"myschema\".\"mytable\" (GEOM) myparam='myvalue' sql="
58       << "mytable" // table
59       << "GEOM" // geometrycolumn
60       << "" // key
61       << true // estimatedmetadata
62       << "1000003007" // srid
63       << QgsWkbTypes::Unknown // type
64       << false // selectatid
65       << "" // service
66       << "myname" // user
67       << "mypasswd" // password
68       << "" // dbname
69       << "myhost" // host
70       << "1234" // port
71       << "" // driver
72       << QgsDataSourceUri::SslPrefer // sslmode
73       << "" // sql
74       << "myvalue" // myparam
75       << "myschema"
76       ;
77 
78   QTest::newRow( "pgrast" )
79       << R"(PG: dbname='qgis_tests' host=localhost port=5432 user='myname' sslmode=disable estimatedmetadata=true srid=3067 table="public"."basic_map_tiled" (rast))"
80       << "basic_map_tiled" // table
81       << "rast" // geometrycolumn
82       << "" // key
83       << true // estimatedmetadata
84       << "3067" // srid
85       << QgsWkbTypes::Unknown // type
86       << false // selectatid
87       << "" // service
88       << "myname" // user
89       << "" // password
90       << "qgis_tests" // dbname
91       << "localhost" // host
92       << "5432" // port
93       << "" // driver
94       << QgsDataSourceUri::SslDisable // sslmode
95       << "" // sql
96       << "" // myparam
97       << "public" // schema
98       ;
99 
100   QTest::newRow( "pg_notable" )
101       << "PG: dbname=mydb host=myhost user=myname password=mypasswd port=5432 mode=2 schema=myschema "
102       << "" // table
103       << "" // geometrycolumn
104       << "" // key
105       << false // estimatedmetadata
106       << "" // srid
107       << QgsWkbTypes::Unknown // type
108       << false // selectatid
109       << "" // service
110       << "myname" // user
111       << "mypasswd" // password
112       << "mydb" // dbname
113       << "myhost" // host
114       << "5432" // port
115       << "" // driver
116       << QgsDataSourceUri::SslPrefer // sslmode
117       << "" // sql
118       << "" // myparam
119       << "public" // schema
120       ;
121 
122   QTest::newRow( "pg_notable_quoted" )
123       << "dbname='mydb' host='myhost' user='myname' password='mypasswd' port='5432' mode='2' schema=myschema"
124       << "" // table
125       << "" // geometrycolumn
126       << "" // key
127       << false // estimatedmetadata
128       << "" // srid
129       << QgsWkbTypes::Unknown // type
130       << false // selectatid
131       << "" // service
132       << "myname" // user
133       << "mypasswd" // password
134       << "mydb" // dbname
135       << "myhost" // host
136       << "5432" // port
137       << "" // driver
138       << QgsDataSourceUri::SslPrefer // sslmode
139       << "" // sql
140       << "" // myparam
141       << "public" // schema
142       ;
143 
144 
145 
146   QTest::newRow( "pgmlsz" )
147       << "PG: dbname=mydb host=myhost user=myname password=mypasswd port=5432 mode=2 schema=public column=geom table=mytable type=MultiLineStringZ"
148       << "mytable" // table
149       << "" // geometrycolumn
150       << "" // key
151       << false // estimatedmetadata
152       << "" // srid
153       << QgsWkbTypes::MultiLineStringZ // type
154       << false // selectatid
155       << "" // service
156       << "myname" // user
157       << "mypasswd" // password
158       << "mydb" // dbname
159       << "myhost" // host
160       << "5432" // port
161       << "" // driver
162       << QgsDataSourceUri::SslPrefer // sslmode
163       << "" // sql
164       << "" // myparam
165       << "public" // schema
166       ;
167 
168   QTest::newRow( "DB2" )
169       << "host=localhost port=50000 dbname=OSTEST user='osuser' password='osuserpw' estimatedmetadata=true srid=4326 key=OBJECTID table=TEST.ZIPPOINT (GEOM) myparam='myvalue' driver='IBM DB2 ODBC DRIVER' sql="
170       << "TEST.ZIPPOINT" // table
171       << "GEOM" // geometrycolumn
172       << "OBJECTID" // key
173       << true // estimatedmetadata
174       << "4326" // srid
175       << QgsWkbTypes::Unknown // type
176       << false // selectatid
177       << "" // service
178       << "osuser" // user
179       << "osuserpw" // password
180       << "OSTEST" // dbname
181       << "localhost" // host
182       << "50000" // port
183       << "IBM DB2 ODBC DRIVER" // driver
184       << QgsDataSourceUri::SslPrefer // sslmode
185       << "" // sql
186       << "myvalue" // myparam
187       << "TEST"  // schema
188       ;
189 }
190 
checkparser()191 void TestQgsDataSourceUri::checkparser()
192 {
193   QFETCH( QString, uri );
194   QFETCH( QString, table );
195   QFETCH( QString, geometrycolumn );
196   QFETCH( QString, key );
197   QFETCH( bool, estimatedmetadata );
198   QFETCH( QString, srid );
199   QFETCH( QgsWkbTypes::Type, type );
200   QFETCH( bool, selectatid );
201   QFETCH( QString, service );
202   QFETCH( QString, user );
203   QFETCH( QString, password );
204   QFETCH( QString, dbname );
205   QFETCH( QString, host );
206   QFETCH( QString, port );
207   QFETCH( QString, driver );
208   QFETCH( QgsDataSourceUri::SslMode, sslmode );
209   QFETCH( QString, sql );
210   QFETCH( QString, myparam );
211   QFETCH( QString, schema );
212 
213   QgsDataSourceUri ds( uri );
214   QCOMPARE( ds.table(), table );
215   QCOMPARE( ds.geometryColumn(), geometrycolumn );
216   QCOMPARE( ds.keyColumn(), key );
217   QCOMPARE( ds.useEstimatedMetadata(), estimatedmetadata );
218   QCOMPARE( ds.srid(), srid );
219   QCOMPARE( ds.wkbType(), type );
220   QCOMPARE( ds.selectAtIdDisabled(), selectatid );
221   QCOMPARE( ds.service(), service );
222   QCOMPARE( ds.username(), user );
223   QCOMPARE( ds.password(), password );
224   QCOMPARE( ds.database(), dbname );
225   QCOMPARE( ds.host(), host );
226   QCOMPARE( ds.port(), port );
227   QCOMPARE( ds.driver(), driver );
228   QCOMPARE( ds.sslMode(), sslmode );
229   QCOMPARE( ds.sql(), sql );
230   QCOMPARE( ds.param( "myparam" ), myparam );
231 }
232 
checkAuthParams()233 void TestQgsDataSourceUri::checkAuthParams()
234 {
235   // some providers rely on the QgsDataSourceUri params for storing and retrieving username, password and authentication.
236   // Test here that the direct setters and getters for username/password/authcfg are compatible with providers which utilize the parameter system
237 
238   QgsDataSourceUri uri;
239   QVERIFY( uri.param( QStringLiteral( "username" ) ).isEmpty() );
240   QVERIFY( uri.param( QStringLiteral( "password" ) ).isEmpty() );
241   QVERIFY( uri.param( QStringLiteral( "authcfg" ) ).isEmpty() );
242 
243   uri.setUsername( QStringLiteral( "kaladin" ) );
244   uri.setPassword( QStringLiteral( "stormblessed" ) );
245   uri.setAuthConfigId( QStringLiteral( "syl" ) );
246 
247   QCOMPARE( uri.param( QStringLiteral( "username" ) ), QStringLiteral( "kaladin" ) );
248   QCOMPARE( uri.param( QStringLiteral( "password" ) ), QStringLiteral( "stormblessed" ) );
249   QCOMPARE( uri.param( QStringLiteral( "authcfg" ) ), QStringLiteral( "syl" ) );
250 
251   // round trip through encodedUri should not lose username/password/authcfg
252   QByteArray encoded = uri.encodedUri();
253   QgsDataSourceUri uri2;
254   uri2.setEncodedUri( encoded );
255 
256   QCOMPARE( uri2.param( QStringLiteral( "username" ) ), QStringLiteral( "kaladin" ) );
257   QCOMPARE( uri2.username(), QStringLiteral( "kaladin" ) );
258   QCOMPARE( uri2.param( QStringLiteral( "password" ) ), QStringLiteral( "stormblessed" ) );
259   QCOMPARE( uri2.password(), QStringLiteral( "stormblessed" ) );
260   QCOMPARE( uri2.param( QStringLiteral( "authcfg" ) ), QStringLiteral( "syl" ) );
261   QCOMPARE( uri2.authConfigId(), QStringLiteral( "syl" ) );
262 
263   QgsDataSourceUri uri3;
264   uri3.setParam( QStringLiteral( "username" ), QStringLiteral( "kaladin" ) );
265   uri3.setParam( QStringLiteral( "password" ), QStringLiteral( "stormblessed" ) );
266   uri3.setParam( QStringLiteral( "authcfg" ), QStringLiteral( "syl" ) );
267   QCOMPARE( uri3.param( QStringLiteral( "username" ) ), QStringLiteral( "kaladin" ) );
268   QCOMPARE( uri3.params( QStringLiteral( "username" ) ), QStringList() << QStringLiteral( "kaladin" ) );
269   QCOMPARE( uri3.username(), QStringLiteral( "kaladin" ) );
270   QCOMPARE( uri3.param( QStringLiteral( "password" ) ), QStringLiteral( "stormblessed" ) );
271   QCOMPARE( uri3.params( QStringLiteral( "password" ) ), QStringList() << QStringLiteral( "stormblessed" ) );
272   QCOMPARE( uri3.password(), QStringLiteral( "stormblessed" ) );
273   QCOMPARE( uri3.param( QStringLiteral( "authcfg" ) ), QStringLiteral( "syl" ) );
274   QCOMPARE( uri3.params( QStringLiteral( "authcfg" ) ), QStringList() << QStringLiteral( "syl" ) );
275   QCOMPARE( uri3.authConfigId(), QStringLiteral( "syl" ) );
276 
277   QVERIFY( uri.hasParam( QStringLiteral( "username" ) ) );
278   uri.removeParam( QStringLiteral( "username" ) );
279   QVERIFY( !uri.hasParam( QStringLiteral( "username" ) ) );
280   QVERIFY( uri.param( QStringLiteral( "username" ) ).isEmpty() );
281   QVERIFY( uri.username().isEmpty() );
282   QVERIFY( uri.hasParam( QStringLiteral( "password" ) ) );
283   uri.removeParam( QStringLiteral( "password" ) );
284   QVERIFY( !uri.hasParam( QStringLiteral( "password" ) ) );
285   QVERIFY( uri.param( QStringLiteral( "password" ) ).isEmpty() );
286   QVERIFY( uri.password().isEmpty() );
287   QVERIFY( uri.hasParam( QStringLiteral( "authcfg" ) ) );
288   uri.removeParam( QStringLiteral( "authcfg" ) );
289   QVERIFY( !uri.hasParam( QStringLiteral( "authcfg" ) ) );
290   QVERIFY( uri.param( QStringLiteral( "authcfg" ) ).isEmpty() );
291   QVERIFY( uri.authConfigId().isEmpty() );
292 
293   // issue GH #39243
294   QgsDataSourceUri uri4;
295   uri4.setEncodedUri( QStringLiteral( "dpiMode=7&url=http://localhost:8000/ows/?MAP%3D/home/bug.qgs&username=username&password=pa%25%25word" ) );
296 
297   QCOMPARE( uri4.param( QStringLiteral( "username" ) ), QStringLiteral( "username" ) );
298   QCOMPARE( uri4.username(), QStringLiteral( "username" ) );
299   QCOMPARE( uri4.param( QStringLiteral( "password" ) ), QStringLiteral( "pa%%word" ) );
300   QCOMPARE( uri4.password(), QStringLiteral( "pa%%word" ) );
301 
302   // issue GH #42405
303   uri4.setEncodedUri( QStringLiteral( "dpiMode=7&url=http://localhost:8000/ows/?MAP%3D/home/bug.qgs&username=username&password=qgis%C3%A8%C3%A9" ) );
304   QCOMPARE( uri4.param( QStringLiteral( "username" ) ), QStringLiteral( "username" ) );
305   QCOMPARE( uri4.username(), QStringLiteral( "username" ) );
306   QCOMPARE( uri4.param( QStringLiteral( "password" ) ), QStringLiteral( "qgisèé" ) );
307   QCOMPARE( uri4.password(), QStringLiteral( "qgisèé" ) );
308 
309   uri4.setEncodedUri( QStringLiteral( "dpiMode=7&url=http://localhost:8000/&username=username&password=%1" ).arg( QString( QUrl::toPercentEncoding( QStringLiteral( "������" ) ) ) ) );
310   QCOMPARE( uri4.param( QStringLiteral( "username" ) ), QStringLiteral( "username" ) );
311   QCOMPARE( uri4.username(), QStringLiteral( "username" ) );
312   QCOMPARE( uri4.param( QStringLiteral( "password" ) ), QStringLiteral( "������" ) );
313   QCOMPARE( uri4.password(), QStringLiteral( "������" ) );
314 
315 }
316 
317 
318 QGSTEST_MAIN( TestQgsDataSourceUri )
319 #include "testqgsdatasourceuri.moc"
320