Skip to content

Commit

Permalink
fix(core): only escape "%" with the SQL LIKE operator
Browse files Browse the repository at this point in the history
  • Loading branch information
cgx committed Feb 21, 2022
1 parent 9bffee2 commit 2389e44
Show file tree
Hide file tree
Showing 6 changed files with 24 additions and 20 deletions.
12 changes: 6 additions & 6 deletions SoObjects/Appointments/SOGoAppointmentFolder.m
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
Copyright (C) 2007-2014 Inverse inc.
Copyright (C) 2007-2022 Inverse inc.
Copyright (C) 2004-2005 SKYRIX Software AG

This file is part of SOGo.
Expand Down Expand Up @@ -795,7 +795,7 @@ - (NSArray *) bareFetchFields: (NSArray *) fields
if ([title length])
[baseWhere
addObject: [NSString stringWithFormat: @"c_title isCaseInsensitiveLike: '%%%@%%'",
[title asSafeSQLString]]];
[title asSafeSQLLikeString]]];

if (component)
{
Expand Down Expand Up @@ -1532,14 +1532,14 @@ - (NSArray *) fetchFields: (NSArray *) _fields
if ([filters isEqualToString:@"title_Category_Location"] || [filters isEqualToString:@"entireContent"])
{
[baseWhere addObject: [NSString stringWithFormat: @"(c_title isCaseInsensitiveLike: '%%%@%%' OR c_category isCaseInsensitiveLike: '%%%@%%' OR c_location isCaseInsensitiveLike: '%%%@%%')",
[title asSafeSQLString],
[title asSafeSQLString],
[title asSafeSQLString]]];
[title asSafeSQLLikeString],
[title asSafeSQLLikeString],
[title asSafeSQLLikeString]]];
}
}
else
[baseWhere addObject: [NSString stringWithFormat: @"c_title isCaseInsensitiveLike: '%%%@%%'",
[title asSafeSQLString]]];
[title asSafeSQLLikeString]]];
}

/* prepare mandatory fields */
Expand Down
6 changes: 3 additions & 3 deletions SoObjects/Contacts/SOGoContactGCSFolder.m
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
Copyright (C) 2006-2013 Inverse inc.
Copyright (C) 2006-2022 Inverse inc.
Copyright (C) 2004-2005 SKYRIX Software AG
This file is part of SOGo.
Expand Down Expand Up @@ -178,7 +178,7 @@ - (EOQualifier *) _qualifierForFilter: (NSString *) filter

if ([filter length] > 0)
{
filter = [filter asSafeSQLString];
filter = [filter asSafeSQLLikeString];
if ([criteria isEqualToString: @"name_or_address"])
qs = [NSString stringWithFormat:
@"(c_sn isCaseInsensitiveLike: '%%%@%%') OR "
Expand Down Expand Up @@ -281,7 +281,7 @@ - (NSDictionary *) lookupContactWithName: (NSString *) aName
if (aName && [aName length] > 0)
{
aName = [aName asSafeSQLString];
qs = [NSString stringWithFormat: @"(c_name='%@')", aName];
qs = [NSString stringWithFormat: @"(c_name = '%@')", aName];
qualifier = [EOQualifier qualifierWithQualifierFormat: qs];
dbRecords = [[self ocsFolder] fetchFields: folderListingFields
matchingQualifier: qualifier];
Expand Down
3 changes: 2 additions & 1 deletion SoObjects/SOGo/NSString+Utilities.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/* NSString+Utilities.h - this file is part of SOGo
*
* Copyright (C) 2006-2015 Inverse inc.
* Copyright (C) 2006-2022 Inverse inc.
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
Expand Down Expand Up @@ -51,6 +51,7 @@

/* SQL safety */
- (NSString *) asSafeSQLString;
- (NSString *) asSafeSQLLikeString;

/* Unicode safety */
- (NSString *) safeString;
Expand Down
12 changes: 8 additions & 4 deletions SoObjects/SOGo/NSString+Utilities.m
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/* NSString+Utilities.m - this file is part of SOGo
*
* Copyright (C) 2006-2015 Inverse inc.
* Copyright (C) 2006-2022 Inverse inc.
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
Expand Down Expand Up @@ -688,9 +688,13 @@ - (id) objectFromJSONString

- (NSString *) asSafeSQLString
{
return [[[self stringByReplacingString: @"\\" withString: @"\\\\"]
stringByReplacingString: @"'" withString: @"\\'"]
stringByReplacingString: @"\%" withString: @"\\%"];
return [[self stringByReplacingString: @"\\" withString: @"\\\\"]
stringByReplacingString: @"'" withString: @"\\'"];
}

- (NSString *) asSafeSQLLikeString
{
return [[self asSafeSQLString] stringByReplacingString: @"\%" withString: @"\\%"];
}

- (NSUInteger) countOccurrencesOfString: (NSString *) substring
Expand Down
9 changes: 4 additions & 5 deletions SoObjects/SOGo/SOGoGCSFolder.m
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/* SOGoGCSFolder.m - this file is part of SOGo
*
* Copyright (C) 2004-2005 SKYRIX Software AG
* Copyright (C) 2006-2014 Inverse inc.
* Copyright (C) 2006-2022 Inverse inc.
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
Expand Down Expand Up @@ -1929,8 +1929,8 @@ - (NSArray *) _fetchComponentsWithNames: (NSArray *) cNames
if (sqlFilter)
{
filterString = [NSMutableString stringWithCapacity: 8192];
[filterString appendFormat: @"(c_name='%@')",
[cNames componentsJoinedByString: @"' OR c_name='"]];
[filterString appendFormat: @"(c_name = '%@')",
[cNames componentsJoinedByString: @"' OR c_name = '"]];
if ([sqlFilter length] > 0)
[filterString appendFormat: @" AND (%@)", sqlFilter];
qualifier = [EOQualifier qualifierWithQualifierFormat: filterString];
Expand Down Expand Up @@ -1972,8 +1972,7 @@ - (NSArray *) _fetchComponentsMatchingObjectNames: (NSArray *) cNames
{
currentName = [[cNames objectAtIndex: count] asSafeSQLString];
queryNameLength = idQueryOverhead + [currentName length];
if ((currentSize + queryNameLength)
> maxQuerySize)
if ((currentSize + queryNameLength) > maxQuerySize)
{
records = [self _fetchComponentsWithNames: currentNames fields: fields];
[components addObjectsFromArray: records];
Expand Down
2 changes: 1 addition & 1 deletion SoObjects/SOGo/SQLSource.m
Original file line number Diff line number Diff line change
Expand Up @@ -776,7 +776,7 @@ - (NSArray *) fetchContactsMatching: (NSString *) filter
if (channel)
{
lowerFilter = [filter lowercaseString];
lowerFilter = [lowerFilter stringByReplacingString: @"'" withString: @"''"];
lowerFilter = [lowerFilter asSafeSQLLikeString];

sql = [NSMutableString stringWithFormat: (@"SELECT *"
@" FROM %@"
Expand Down

0 comments on commit 2389e44

Please sign in to comment.