On Wed, Feb 16, 2011 at 17:08, Sergiu Dumitriu <[email protected]> wrote:
> On 02/16/2011 03:43 PM, Thomas Mortagne wrote:
>> On Wed, Feb 16, 2011 at 12:43, Sergiu Dumitriu<[email protected]> wrote:
>>> On 02/16/2011 11:50 AM, Thomas Mortagne wrote:
>>>> On Wed, Feb 16, 2011 at 11:36, Sergiu Dumitriu<[email protected]> wrote:
>>>>> On 02/16/2011 10:09 AM, tmortagne (SVN) wrote:
>>>>>> Author: tmortagne
>>>>>> Date: 2011-02-16 10:09:31 +0100 (Wed, 16 Feb 2011)
>>>>>> New Revision: 34718
>>>>>>
>>>>>> Modified:
>>>>>>
>>>>>> platform/core/branches/xwiki-core-2.7/xwiki-core/src/main/java/com/xpn/xwiki/store/XWikiHibernateBaseStore.java
>>>>>>
>>>>>> platform/core/branches/xwiki-core-2.7/xwiki-core/src/main/java/com/xpn/xwiki/store/XWikiHibernateStore.java
>>>>>> Log:
>>>>>> XWIKI-5976: Cannot create subwiki named "lines"
>>>>>> Better (but a lot less elegant...) fix
>>>>>>
>>>>>> Modified:
>>>>>> platform/core/branches/xwiki-core-2.7/xwiki-core/src/main/java/com/xpn/xwiki/store/XWikiHibernateBaseStore.java
>>>>>> ===================================================================
>>>>>> ---
>>>>>> platform/core/branches/xwiki-core-2.7/xwiki-core/src/main/java/com/xpn/xwiki/store/XWikiHibernateBaseStore.java
>>>>>> 2011-02-16 09:09:21 UTC (rev 34717)
>>>>>> +++
>>>>>> platform/core/branches/xwiki-core-2.7/xwiki-core/src/main/java/com/xpn/xwiki/store/XWikiHibernateBaseStore.java
>>>>>> 2011-02-16 09:09:31 UTC (rev 34718)
>>>>>> @@ -504,7 +504,6 @@
>>>>>> }
>>>>>> } catch (Exception e) {
>>>>>> }
>>>>>> - ;
>>>>>> try {
>>>>>> if (bTransaction) {
>>>>>> endTransaction(context, true);
>>>>>> @@ -600,13 +599,14 @@
>>>>>>
>>>>>> if (context.getDatabase() != null) {
>>>>>> String schemaName =
>>>>>> getSchemaFromWikiName(context);
>>>>>> + String escapedSchemaName = escapeSchema(schemaName,
>>>>>> context);
>>>>>>
>>>>>> DatabaseProduct databaseProduct =
>>>>>> getDatabaseProductName(context);
>>>>>> if (DatabaseProduct.ORACLE == databaseProduct) {
>>>>>> Statement stmt = null;
>>>>>> try {
>>>>>> stmt =
>>>>>> session.connection().createStatement();
>>>>>> - stmt.execute("alter session set
>>>>>> current_schema = " + schemaName);
>>>>>> + stmt.execute("alter session set
>>>>>> current_schema = " + escapedSchemaName);
>>>>>> } finally {
>>>>>> try {
>>>>>> if (stmt != null) {
>>>>>> @@ -620,7 +620,7 @@
>>>>>> Statement stmt = null;
>>>>>> try {
>>>>>> stmt =
>>>>>> session.connection().createStatement();
>>>>>> - stmt.execute("SET SCHEMA " + schemaName);
>>>>>> + stmt.execute("SET SCHEMA " +
>>>>>> escapedSchemaName);
>>>>>> } finally {
>>>>>> try {
>>>>>> if (stmt != null) {
>>>>>> @@ -648,6 +648,29 @@
>>>>>> }
>>>>>>
>>>>>> /**
>>>>>> + * Escape schema name depending of the database engine.
>>>>>> + *
>>>>>> + * @param schema the schema name to escape
>>>>>> + * @param context the XWiki context to get database engine
>>>>>> identifier
>>>>>> + * @return the escaped version
>>>>>> + */
>>>>>> + protected String escapeSchema(String schema, XWikiContext context)
>>>>>> + {
>>>>>> + DatabaseProduct databaseProduct =
>>>>>> getDatabaseProductName(context);
>>>>>> +
>>>>>> + String escapedSchema;
>>>>>
>>>>> You should use this instead:
>>>>>
>>>>> escapedSchema = dialect.openQuote() + schema + dialect.closeQuote();
>>>>
>>>> Ok thanks
>>>>
>>>>>
>>>>> I think nobody wants to use ` or " in the wiki name, so there shouldn't
>>>>> be a need for doubling them.
>>>>
>>>> No sure about that. We have to do something, either remove or properly
>>>> escape then otherwise it's not very safe
>>>
>>> OK, you can double the openQuote() character. For SQLServer dialect you
>>> have to do it differently, though:
>>>
>>> replace("[", "[[]")
>>>
>>> Although, simple doubling isn't enough, for example trying to create
>>> this database will drop the xyz database:
>>>
>>> x\`; drop database xyz; \`
>>>
>>> turns into:
>>>
>>> create database `x\``; drop database xxx; \```;
>>>
>>> which fails to create the first database (invalid name), drops the
>>> second database, and fails to execute the ` command. I tested it on the
>>> mysql console, not through Hibernate.
>>
>> That's weird since
>> http://dev.mysql.com/doc/refman/5.0/en/identifiers.html says
>> "Identifier quote characters can be included within an identifier if
>> you quote the identifier. If the character to be included within the
>> identifier is the same as that used to quote the identifier itself,
>> then you need to double the character."
>
> Yes, that is correct, but \ is an escape character.
Sorry i did not seen the \ in your example.
>
> So, normally doubling ` will have the desired effect:
>
> create database that`s life; -> invalid, error.
> create database `that``s life`; -> valid, OK.
> create database `that\``s life`; -> invalid, since \` actually escapes
> the first backquote, breaking the special meaning of ``. That's not a
> double backquote which translates into a single literal backquote, but a
> literal backquote followed by an unmatched, unescape backquote which
> closes the starting backquote early.
>
> This holds true for " as well, and this is why escapetool.sql is not
> enough to prevent SQL injections and parameterized queries should be
> used everywhere.
Then the best is to use \ to escape, I don't understand why they don't
talk about that in the documentation if that a way to escape it.
>
>>>
>>>>>
>>>>> BTW, SQLServer uses [ ] for quoting.
>>>>
>>>> You mean DB2 ?
>>>
>>> I mean Microsoft's SQL Server, their complete lack of imagination makes
>>> it hard to distinguish their product.
>>
>> I understood that but you I don't see any support for MS SQL Server in
>> DatabaseProduct and i don't see why I would add it now just for that.
>
> Well, there are several users that run XWiki on top of MSSQL, and even
> though it's not highly maintained by the developers, we should at least
> try not to break things on purpose.
I don't see what is broken. Having ] was not working anyway since
nothing was escaped. It's not about breaking on purpose it's about
having a special handling for this database here and I'm not sure it's
critical here.
>
>>>
>>>>>
>>>>>> + if (DatabaseProduct.MYSQL == databaseProduct) {
>>>>>> + // MySQL does not use SQL92 escaping syntax by default
>>>>>> + escapedSchema = "`" + schema.replace("`", "``") + "`";
>>>>>> + } else {
>>>>>> + // Use SQL92 escape syntax
>>>>>> + escapedSchema = "\"" + schema.replace("\"", "\"\"") + "\"";
>>>>>> + }
>>>>>> +
>>>>>> + return escapedSchema;
>>>>>> + }
>>>>>> +
>>>>>> + /**
>>>>>> * Begins a transaction
>>>>>> *
>>>>>> * @param context
>
>
> --
> Sergiu Dumitriu
> http://purl.org/net/sergiu/
> _______________________________________________
> devs mailing list
> [email protected]
> http://lists.xwiki.org/mailman/listinfo/devs
>
--
Thomas Mortagne
_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs