Compare commits
17
Commits
fix_pkg
...
SOGo-2.0.2a
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3b847dad11 | ||
|
|
89f31ebc0c | ||
|
|
19fceff5cb | ||
|
|
a204616831 | ||
|
|
4525063194 | ||
|
|
bee27444bc | ||
|
|
0b5aaa045a | ||
|
|
7a598cbc8b | ||
|
|
d736ba1d5d | ||
|
|
021c905fea | ||
|
|
bc91cfe3d2 | ||
|
|
58bdf5c933 | ||
|
|
864789959d | ||
|
|
af3deea480 | ||
|
|
eacbda1429 | ||
|
|
9dd000a2ca | ||
|
|
ce4084e528 |
No files matched your search
@@ -1,3 +1,160 @@
|
||||
commit 19fceff5cb30dcb69942c6a04f4decf765180e8d
|
||||
Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
Date: Tue Oct 30 16:59:22 2012 -0400
|
||||
|
||||
avoid comparisons that extend past the string length
|
||||
|
||||
(cherry picked from commit 21ee23e7dfb10510d83a7ac081050215d215dcf2)
|
||||
|
||||
M SoObjects/SOGo/NSString+Utilities.m
|
||||
|
||||
commit a2046168312a354057ef202ed9c54bb24af0cc21
|
||||
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
|
||||
Date: Tue Nov 6 09:04:18 2012 -0500
|
||||
|
||||
Apply patches for bug #2060
|
||||
|
||||
(cherry picked from commit 6ad59a8481972be77b1af56b93ec24dd6482aaf6)
|
||||
|
||||
M SoObjects/SOGo/LDAPSource.m
|
||||
M SoObjects/SOGo/NSString+Crypto.h
|
||||
M SoObjects/SOGo/NSString+Crypto.m
|
||||
M SoObjects/SOGo/SQLSource.m
|
||||
|
||||
commit 45250631942b5dd2371919e8dcd73a918a8b465e
|
||||
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
|
||||
Date: Tue Nov 6 08:05:23 2012 -0500
|
||||
|
||||
Automatically disable alarms for newly subsribed calendars.
|
||||
|
||||
This fixes bug #2074.
|
||||
(cherry picked from commit fe09a7969d5fe57468bd7540318da75111b767ab)
|
||||
|
||||
M SoObjects/SOGo/SOGoGCSFolder.m
|
||||
|
||||
commit bee27444bc727765bd7eb72a85bc358b61590f9f
|
||||
Author: Jean Raby <jraby@inverse.ca>
|
||||
Date: Tue Nov 13 17:20:18 2012 -0500
|
||||
|
||||
Use GCSSpecialQueries in sogo-tool rename-user
|
||||
|
||||
Fixes #1924
|
||||
The SQL syntax used by the former query would only work
|
||||
with postgresql and Oracle.
|
||||
(cherry picked from commit 378eef408236051f5bcb44011f20a51ed1fe3fe8)
|
||||
|
||||
M SOPE/GDLContentStore/GCSSpecialQueries.m
|
||||
M Tools/SOGoToolRenameUser.m
|
||||
|
||||
commit 0b5aaa045a436e061cde77143907b05791948019
|
||||
Author: Francis Lachapelle <flachapelle@inverse.ca>
|
||||
Date: Tue Nov 13 16:22:27 2012 -0500
|
||||
|
||||
Fix user rights editor in calendar module
|
||||
|
||||
(cherry picked from commit 33bd07a53d76317f2eeac6c518c3a0495126369d)
|
||||
|
||||
M UI/WebServerResources/UIxCalUserRightsEditor.css
|
||||
|
||||
commit 7a598cbc8bc4a19093216f8636a58261cd2cc53f
|
||||
Author: Francis Lachapelle <flachapelle@inverse.ca>
|
||||
Date: Tue Nov 13 16:13:56 2012 -0500
|
||||
|
||||
Improve user rights editor in calendar module
|
||||
|
||||
(cherry picked from commit fb4b266b3bfff65f69a98984433293905ddee975)
|
||||
|
||||
M UI/WebServerResources/UIxCalUserRightsEditor.css
|
||||
|
||||
commit d736ba1d5d05bbd0cef1b692ae015d1922114349
|
||||
Author: Jean Raby <jraby@inverse.ca>
|
||||
Date: Tue Nov 13 15:01:30 2012 -0500
|
||||
|
||||
Reorder VCALENDAR template elements
|
||||
|
||||
It must match [iCalCalendar orderOfElements]
|
||||
(cherry picked from commit d82ba7cbb96e55950da133bcfced87d0af131539)
|
||||
|
||||
M Tests/Integration/test-davacl.py
|
||||
|
||||
commit 021c905fea679825fdbeebe0402d8fc3b593fed1
|
||||
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
|
||||
Date: Tue Nov 13 13:58:05 2012 -0500
|
||||
|
||||
We now order correctly CardGroups - especially for calendars.
|
||||
|
||||
This is to avoid a bug in BlackBerry devices where the METHOD
|
||||
must be placed BEFORE any vevent/vtimezone objects, otherwise
|
||||
the invitation objects are never recognized, and rather shown
|
||||
as a "application/x-rimdevicecalendar" attachment.
|
||||
(cherry picked from commit 51192dd5338f43570382d3dc942b083933430dda)
|
||||
|
||||
M SOPE/NGCards/CardElement.h
|
||||
M SOPE/NGCards/CardElement.m
|
||||
M SOPE/NGCards/CardGroup.h
|
||||
M SOPE/NGCards/CardGroup.m
|
||||
M SOPE/NGCards/CardVersitRenderer.m
|
||||
M SOPE/NGCards/iCalCalendar.h
|
||||
M SOPE/NGCards/iCalCalendar.m
|
||||
M SoObjects/Appointments/SOGoAppointmentObject.m
|
||||
|
||||
commit bc91cfe3d221ee312d3a7fc7a9c005800f8a3a99
|
||||
Author: Francis Lachapelle <flachapelle@inverse.ca>
|
||||
Date: Mon Nov 12 16:36:30 2012 -0500
|
||||
|
||||
Fix scrolling for calendars/addressbooks lists
|
||||
(cherry picked from commit b088f6f97f897520d469e860b3ff740c5bc2a4ba)
|
||||
|
||||
M UI/WebServerResources/ContactsUI.css
|
||||
M UI/WebServerResources/SchedulerUI.css
|
||||
M UI/WebServerResources/SchedulerUI.js
|
||||
|
||||
commit 58bdf5c933dd3d414465c7f5581a74440902b6f8
|
||||
Author: Francis Lachapelle <flachapelle@inverse.ca>
|
||||
Date: Mon Nov 12 15:32:03 2012 -0500
|
||||
|
||||
Fix bug with reply-to header in messages
|
||||
(cherry picked from commit e037ca0a4914785c4f34a50613292fa0ddc08775)
|
||||
|
||||
M SoObjects/Mailer/SOGoDraftObject.m
|
||||
|
||||
commit 864789959df106908608e00f1d05ea23d810a17a
|
||||
Author: Francis Lachapelle <flachapelle@inverse.ca>
|
||||
Date: Wed Nov 7 11:06:12 2012 -0500
|
||||
|
||||
Fix title display of cards with a photo
|
||||
(cherry picked from commit 0ab36d4ec5b0079c72b42fd8717fda17744d0666)
|
||||
|
||||
M UI/WebServerResources/ContactsUI.css
|
||||
|
||||
commit af3deea480b05fae80267ed5e5c5b4a0573a14de
|
||||
Author: Jean Raby <jraby@inverse.ca>
|
||||
Date: Mon Nov 5 13:12:25 2012 -0500
|
||||
|
||||
Fix 'Show Raw Source' for tasks
|
||||
|
||||
(cherry picked from commit 0a4809e2be49b89c0515d1ac63a3e0c89ac57455)
|
||||
|
||||
M UI/WebServerResources/SchedulerUI.js
|
||||
|
||||
commit eacbda1429561dba2dd20deaa571f58f8ee1e4be
|
||||
Author: Francis Lachapelle <flachapelle@inverse.ca>
|
||||
Date: Fri Oct 26 22:31:14 2012 -0400
|
||||
|
||||
Fix typos in Spanish (Spain) translation
|
||||
|
||||
(cherry picked from commit 2fdf4f55355377dffc8e696562fffaf1626be305)
|
||||
|
||||
M SoObjects/Appointments/SpanishSpain.lproj/Localizable.strings
|
||||
|
||||
commit 1080bee3ba9749aad0dc28625081fc6a496f7280
|
||||
Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
Date: Wed Oct 24 15:00:02 2012 -0400
|
||||
|
||||
style
|
||||
|
||||
M ChangeLog
|
||||
|
||||
commit 389f4d4c19065341fd4a20fa8a72d8feebb90cbf
|
||||
Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
Date: Wed Oct 24 14:59:13 2012 -0400
|
||||
@@ -1135,6 +1292,15 @@ M Documentation/SOGo Mobile Devices Configuration.odt
|
||||
M Documentation/SOGo Mozilla Thunderbird Configuration.odt
|
||||
M Documentation/SOGo Native Microsoft Outlook Configuration.odt
|
||||
|
||||
commit ce4084e5285b353afa9fc81e47389f9927364d17
|
||||
Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
Date: Fri Oct 12 16:55:27 2012 -0400
|
||||
|
||||
getNewChangeNumbers: new wrapper for openchangedb_get_new_changeNumbers
|
||||
|
||||
M OpenChange/MAPIStoreContext.h
|
||||
M OpenChange/MAPIStoreContext.m
|
||||
|
||||
commit b1547d7212dfeb23a8d6c936db0a46cad77f8b23
|
||||
Author: Luc Charland <lcharland@inverse.ca>
|
||||
Date: Fri Oct 12 13:34:38 2012 -0400
|
||||
|
||||
@@ -1,3 +1,22 @@
|
||||
2.0.2a (2012-11-15)
|
||||
-------------------
|
||||
|
||||
Enhancements
|
||||
- improved user rights editor in calendar module
|
||||
- disable alarms for newly subsribed calendars
|
||||
|
||||
Bug fixes
|
||||
- fixed typos in Spanish (Spain) translation
|
||||
- fixed display of raw source for tasks
|
||||
- fixed title display of cards with a photo
|
||||
- fixed null address in reply-to header of messages
|
||||
- fixed scrolling for calendar/addressbooks lists
|
||||
- fixed display of invitations on BlackBerry devices
|
||||
- fixed sogo-tool rename-user for MySQL database
|
||||
- fixed corrupted attachments in Webmail
|
||||
- fixed parsing of URLs that can throw an exception
|
||||
- fixed password encoding in user sources
|
||||
|
||||
2.0.2 (2012-10-24)
|
||||
------------------
|
||||
|
||||
|
||||
@@ -110,6 +110,14 @@
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (NSString *) updateCPathInFolderInfo: (NSString *) tableName
|
||||
withCPath2: (NSString *) c_path2
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
|
||||
@@ -205,6 +213,17 @@
|
||||
return types;
|
||||
}
|
||||
|
||||
- (NSString *) updateCPathInFolderInfo: (NSString *) tableName
|
||||
withCPath2: (NSString *) c_path2
|
||||
{
|
||||
static NSString *sqlFolderFormat
|
||||
= (@"UPDATE %@"
|
||||
@" SET c_path = '/'||c_path1||'/'||c_path2||'/'||c_path3||'/'||c_path4"
|
||||
@" WHERE c_path2 = '%@'");
|
||||
|
||||
return [NSString stringWithFormat: sqlFolderFormat, tableName, c_path2];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
//
|
||||
@@ -299,6 +318,17 @@
|
||||
return types;
|
||||
}
|
||||
|
||||
- (NSString *) updateCPathInFolderInfo: (NSString *) tableName
|
||||
withCPath2: (NSString *) c_path2
|
||||
{
|
||||
static NSString *sqlFolderFormat
|
||||
= (@"UPDATE %@"
|
||||
@" SET c_path = CONCAT('/', c_path1, '/', c_path2, '/', c_path3, '/', c_path4)"
|
||||
@" WHERE c_path2 = '%@'");
|
||||
|
||||
return [NSString stringWithFormat: sqlFolderFormat, tableName, c_path2];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
//
|
||||
@@ -392,4 +422,15 @@
|
||||
return types;
|
||||
}
|
||||
|
||||
- (NSString *) updateCPathInFolderInfo: (NSString *) tableName
|
||||
withCPath2: (NSString *) c_path2
|
||||
{
|
||||
static NSString *sqlFolderFormat
|
||||
= (@"UPDATE %@"
|
||||
@" SET c_path = '/'||c_path1||'/'||c_path2||'/'||c_path3||'/'||c_path4"
|
||||
@" WHERE c_path2 = '%@'");
|
||||
|
||||
return [NSString stringWithFormat: sqlFolderFormat, tableName, c_path2];
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -1,6 +1,6 @@
|
||||
/* CardElement.h - this file is part of SOPE
|
||||
*
|
||||
* Copyright (C) 2006 Inverse inc.
|
||||
* Copyright (C) 2006-2012 Inverse inc.
|
||||
*
|
||||
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
*
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* CardElement.m - this file is part of SOPE
|
||||
*
|
||||
* Copyright (C) 2006 Inverse inc.
|
||||
* Copyright (C) 2006-2012 Inverse inc.
|
||||
*
|
||||
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
*
|
||||
|
||||
@@ -75,6 +75,8 @@
|
||||
- (void) replaceThisElement: (CardElement *) oldElement
|
||||
withThisOne: (CardElement *) newElement;
|
||||
|
||||
- (NSArray *) orderOfElements;
|
||||
|
||||
@end
|
||||
|
||||
#endif /* CARDGROUP_H */
|
||||
@@ -1,6 +1,6 @@
|
||||
/* CardGroup.m - this file is part of SOPE
|
||||
*
|
||||
* Copyright (C) 2006 Inverse inc.
|
||||
* Copyright (C) 2006-2012 Inverse inc.
|
||||
*
|
||||
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
*
|
||||
@@ -454,4 +454,9 @@ static NGCardsSaxHandler *sax = nil;
|
||||
return new;
|
||||
}
|
||||
|
||||
- (NSArray *) orderOfElements
|
||||
{
|
||||
return nil;
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -1,6 +1,6 @@
|
||||
/* CardVersitRenderer.m - this file is part of SOPE
|
||||
*
|
||||
* Copyright (C) 2006 Inverse inc.
|
||||
* Copyright (C) 2006-2012 Inverse inc.
|
||||
*
|
||||
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
*
|
||||
@@ -107,6 +107,7 @@
|
||||
CardElement *currentChild;
|
||||
NSMutableString *rendering;
|
||||
NSString *groupTag;
|
||||
NSArray *order;
|
||||
|
||||
rendering = [NSMutableString string];
|
||||
|
||||
@@ -120,7 +121,30 @@
|
||||
|
||||
groupTag = [groupTag uppercaseString];
|
||||
[rendering appendFormat: @"BEGIN:%@\r\n", groupTag];
|
||||
children = [[aGroup children] objectEnumerator];
|
||||
|
||||
// We reorder the group elemments, if necessary
|
||||
order = [aGroup orderOfElements];
|
||||
|
||||
if (order)
|
||||
{
|
||||
NSMutableArray *orderedElements;
|
||||
int i, c;
|
||||
|
||||
orderedElements = [NSMutableArray array];
|
||||
c = [order count];
|
||||
|
||||
for (i = 0; i < c; i++)
|
||||
{
|
||||
[orderedElements addObjectsFromArray: [aGroup childrenWithTag: [order objectAtIndex: i]]];
|
||||
}
|
||||
|
||||
children = [orderedElements objectEnumerator];
|
||||
}
|
||||
else
|
||||
{
|
||||
children = [[aGroup children] objectEnumerator];
|
||||
}
|
||||
|
||||
while ((currentChild = [children nextObject]))
|
||||
[rendering appendString: [self render: currentChild]];
|
||||
[rendering appendFormat: @"END:%@\r\n", groupTag];
|
||||
|
||||
@@ -38,18 +38,6 @@
|
||||
@class iCalTimeZone;
|
||||
|
||||
@interface iCalCalendar : CardGroup
|
||||
// {
|
||||
// NSString *version;
|
||||
// NSString *calscale;
|
||||
// NSString *prodId;
|
||||
// NSString *method;
|
||||
|
||||
// NSMutableArray *todos;
|
||||
// NSMutableArray *events;
|
||||
// NSMutableArray *journals;
|
||||
// NSMutableArray *freeBusys;
|
||||
// NSMutableDictionary *timezones;
|
||||
// }
|
||||
|
||||
/* accessors */
|
||||
|
||||
|
||||
@@ -210,6 +210,13 @@
|
||||
return [super versitString];
|
||||
}
|
||||
|
||||
- (NSArray *) orderOfElements
|
||||
{
|
||||
return [NSArray arrayWithObjects: @"prodid", @"version", @"method", @"calscale",
|
||||
@"vtimezone", @"vevent", @"vtodo", @"vjournal", @"vfreebusy", nil];
|
||||
}
|
||||
|
||||
|
||||
/* ical typing */
|
||||
|
||||
- (NSString *) entityName
|
||||
|
||||
@@ -410,14 +410,6 @@
|
||||
previousObject: oldEvent
|
||||
toAttendees: updateAttendees
|
||||
withType: @"calendar:invitation-update"];
|
||||
|
||||
#if 0
|
||||
// DELETE CODE
|
||||
[self sendReceiptEmailForObject: newEvent
|
||||
addedAttendees: nil
|
||||
deletedAttendees: nil
|
||||
updatedAttendees: updateAttendees];
|
||||
#endif
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
@@ -25,13 +25,13 @@ vtodo_class2 = "(Tarea confidencial)";
|
||||
"comment_label" = "Comentario:";
|
||||
|
||||
/* Invitation */
|
||||
"Event Invitation: \"%{Summary}\"" = "Invitación al evento: \"% {Summary}\"";
|
||||
"Event Invitation: \"%{Summary}\"" = "Invitación al evento: \"%{Summary}\"";
|
||||
"(sent by %{SentBy}) " = "(enviado por %{SentBy}) ";
|
||||
"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate}\nEnd: %{EndDate}\nDescription: %{Description}" = "%{Organizer} %{SentByText}le ha invitado a %{Summary}.\n\nInicio: %{StartDate}\nFin: %{EndDate}\nDescripción: %{Description}";
|
||||
"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" = "%{Organizer} %{SentByText}le ha invitado a %{Summary}.\n\nInicio: %{StartDate} a las %{StartTime}\nFin: %{EndDate} a las %{EndTime}\nDescripción: %{Description}";
|
||||
|
||||
/* Deletion */
|
||||
"Event Cancelled: \"%{Summary}\"" = "Evento Cancelado: \"% {Summary}\"";
|
||||
"Event Cancelled: \"%{Summary}\"" = "Evento Cancelado: \"%{Summary}\"";
|
||||
"%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate}\nEnd: %{EndDate}\nDescription: %{Description}"
|
||||
= "%{Organizer} %{SentByText}ha cancelado este evento: %{Summary}.\n\nInicio: %{StartDate}\nFin: %{EndDate}\nDescripción: %{Description}";
|
||||
"%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}"
|
||||
|
||||
@@ -269,7 +269,7 @@ static NSString *userAgent = nil;
|
||||
{
|
||||
id headerValue;
|
||||
unsigned int count;
|
||||
NSString *messageID, *priority, *pureSender,*replyTo;
|
||||
NSString *messageID, *priority, *pureSender, *replyTo;
|
||||
|
||||
for (count = 0; count < 8; count++)
|
||||
{
|
||||
@@ -314,8 +314,8 @@ static NSString *userAgent = nil;
|
||||
if ([replyTo length] > 0)
|
||||
{
|
||||
[headers setObject: replyTo forKey: @"reply-to"];
|
||||
[headers removeObjectForKey: @"replyTo"];
|
||||
}
|
||||
[headers removeObjectForKey: @"replyTo"];
|
||||
|
||||
if ([[newHeaders objectForKey: @"receipt"] isEqualToString: @"true"])
|
||||
{
|
||||
|
||||
+28
-15
@@ -586,7 +586,10 @@ andMultipleBookingsField: (NSString *) newMultipleBookingsField
|
||||
pass = [plainPassword asCryptedPassUsingScheme: _userPasswordAlgorithm];
|
||||
|
||||
if (pass == nil)
|
||||
[self errorWithFormat: @"Unsupported user-password algorithm: %@", _userPasswordAlgorithm];
|
||||
{
|
||||
[self errorWithFormat: @"Unsupported user-password algorithm: %@", _userPasswordAlgorithm];
|
||||
return nil;
|
||||
}
|
||||
|
||||
return [NSString stringWithFormat: @"{%@}%@", _userPasswordAlgorithm, pass];
|
||||
}
|
||||
@@ -629,24 +632,34 @@ andMultipleBookingsField: (NSString *) newMultipleBookingsField
|
||||
NGLdapModification *mod;
|
||||
NGLdapAttribute *attr;
|
||||
NSArray *changes;
|
||||
NSString* encryptedPass;
|
||||
|
||||
attr = [[NGLdapAttribute alloc] initWithAttributeName: @"userPassword"];
|
||||
if ([_userPasswordAlgorithm isEqualToString: @"none"])
|
||||
[attr addStringValue: newPassword];
|
||||
else
|
||||
[attr addStringValue: [self _encryptPassword: newPassword]];
|
||||
|
||||
mod = [NGLdapModification replaceModification: attr];
|
||||
changes = [NSArray arrayWithObject: mod];
|
||||
*perr = PolicyNoError;
|
||||
{
|
||||
encryptedPass = newPassword;
|
||||
}
|
||||
else
|
||||
{
|
||||
encryptedPass = [self _encryptPassword: newPassword];
|
||||
}
|
||||
if(encryptedPass != nil)
|
||||
{
|
||||
[attr addStringValue: encryptedPass];
|
||||
mod = [NGLdapModification replaceModification: attr];
|
||||
changes = [NSArray arrayWithObject: mod];
|
||||
*perr = PolicyNoError;
|
||||
|
||||
if ([bindConnection bindWithMethod: @"simple"
|
||||
binddn: userDN
|
||||
credentials: oldPassword])
|
||||
didChange = [bindConnection modifyEntryWithDN: userDN
|
||||
changes: changes];
|
||||
else
|
||||
didChange = NO;
|
||||
if ([bindConnection bindWithMethod: @"simple"
|
||||
binddn: userDN
|
||||
credentials: oldPassword])
|
||||
{
|
||||
didChange = [bindConnection modifyEntryWithDN: userDN
|
||||
changes: changes];
|
||||
}
|
||||
else
|
||||
didChange = NO;
|
||||
}
|
||||
}
|
||||
else
|
||||
didChange = [bindConnection changePasswordAtDn: userDN
|
||||
|
||||
@@ -56,7 +56,7 @@ typedef enum {
|
||||
- (NSString *) asSHA1String;
|
||||
- (NSString *) asMD5String;
|
||||
|
||||
+ (keyEncoding) getDefaultEncodingForScheme: (NSString *) passwordScheme;
|
||||
+ (NSArray *) getDefaultEncodingForScheme: (NSString *) passwordScheme;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@@ -71,8 +71,7 @@
|
||||
{
|
||||
NSString *scheme;
|
||||
NSString *pass;
|
||||
NSArray *schemeComps;
|
||||
keyEncoding encoding;
|
||||
NSArray *encodingAndScheme;
|
||||
|
||||
NSRange range;
|
||||
int selflen, len;
|
||||
@@ -88,32 +87,11 @@
|
||||
if (len == 0)
|
||||
scheme = defaultScheme;
|
||||
|
||||
encoding = [NSString getDefaultEncodingForScheme: scheme];
|
||||
|
||||
// get the encoding which may be part of the scheme
|
||||
// e.g. ssha.hex forces a hex encoded ssha scheme
|
||||
// possible is "b64" or "hex"
|
||||
schemeComps = [scheme componentsSeparatedByString: @"."];
|
||||
if ([schemeComps count] == 2)
|
||||
{
|
||||
NSString *stringEncoding;
|
||||
// scheme without encoding string is the first item
|
||||
scheme = [schemeComps objectAtIndex: 0];
|
||||
// encoding string is second item
|
||||
stringEncoding = [schemeComps objectAtIndex: 1];
|
||||
if ([stringEncoding caseInsensitiveCompare: @"hex"] == NSOrderedSame)
|
||||
{
|
||||
encoding = encHex;
|
||||
}
|
||||
else if ([stringEncoding caseInsensitiveCompare: @"b64"] == NSOrderedSame ||
|
||||
[stringEncoding caseInsensitiveCompare: @"base64"] == NSOrderedSame)
|
||||
{
|
||||
encoding = encBase64;
|
||||
}
|
||||
}
|
||||
encodingAndScheme = [NSString getDefaultEncodingForScheme: scheme];
|
||||
|
||||
pass = [self substringWithRange: range];
|
||||
return [NSArray arrayWithObjects: scheme, pass, [NSNumber numberWithInt: encoding], nil];
|
||||
// return array with [scheme, password, encoding]
|
||||
return [NSArray arrayWithObjects: [encodingAndScheme objectAtIndex: 1], pass, [encodingAndScheme objectAtIndex: 0], nil];
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -147,7 +125,7 @@
|
||||
if (encoding == encHex)
|
||||
{
|
||||
decodedData = [NSData decodeDataFromHexString: pass];
|
||||
|
||||
|
||||
if(decodedData == nil)
|
||||
{
|
||||
decodedData = [NSData data];
|
||||
@@ -208,8 +186,10 @@
|
||||
*
|
||||
* @param passwordScheme The scheme to use
|
||||
* @param theSalt The binary data of the salt
|
||||
* @param userEncoding The encoding (plain, hex, base64) to be used
|
||||
* @return If successful, the encrypted and encoded NSString of the format {scheme}pass, or nil if the scheme did not exists or an error occured
|
||||
* @param userEncoding The encoding (plain, hex, base64) to be used. If set to
|
||||
* encDefault, the encoding will be detected from scheme name.
|
||||
* @return If successful, the encrypted and encoded NSString of the format {scheme}pass,
|
||||
* or nil if the scheme did not exists or an error occured.
|
||||
*/
|
||||
- (NSString *) asCryptedPassUsingScheme: (NSString *) passwordScheme
|
||||
withSalt: (NSData *) theSalt
|
||||
@@ -217,6 +197,22 @@
|
||||
{
|
||||
keyEncoding dataEncoding;
|
||||
NSData* cryptedData;
|
||||
|
||||
// use default encoding scheme, when set to default
|
||||
if (userEncoding == encDefault)
|
||||
{
|
||||
// the encoding needs to be detected before crypting,
|
||||
// to get the plain scheme (without encoding identifier)
|
||||
NSArray* encodingAndScheme;
|
||||
encodingAndScheme = [NSString getDefaultEncodingForScheme: passwordScheme];
|
||||
dataEncoding = [[encodingAndScheme objectAtIndex: 0] intValue];
|
||||
passwordScheme = [encodingAndScheme objectAtIndex: 1];
|
||||
}
|
||||
else
|
||||
{
|
||||
dataEncoding = userEncoding;
|
||||
}
|
||||
|
||||
// convert NSString to NSData and apply encryption scheme
|
||||
cryptedData = [self dataUsingEncoding: NSUTF8StringEncoding];
|
||||
cryptedData = [cryptedData asCryptedPassUsingScheme: passwordScheme withSalt: theSalt];
|
||||
@@ -224,12 +220,6 @@
|
||||
if (cryptedData == nil)
|
||||
return nil;
|
||||
|
||||
// use default encoding scheme, when set to default
|
||||
if (userEncoding == encDefault)
|
||||
dataEncoding = [NSString getDefaultEncodingForScheme: passwordScheme];
|
||||
else
|
||||
dataEncoding = userEncoding;
|
||||
|
||||
if (dataEncoding == encHex)
|
||||
{
|
||||
// hex encoding
|
||||
@@ -250,19 +240,49 @@
|
||||
/**
|
||||
* Returns the encoding for a specified scheme
|
||||
*
|
||||
* @param passwordScheme The scheme for which to get the encoding.
|
||||
* @param passwordScheme The scheme for which to get the encoding. Can be "scheme.encoding" in which case the encoding is returned
|
||||
* @see keyEncoding
|
||||
* @return returns the encoding, if unknown returns encPlain
|
||||
* @return returns NSArray with elements {NSNumber encoding, NSString* scheme} where scheme is the 'real' scheme without the ".encoding" part.
|
||||
* 'encoding' is stored as NSNumber in the array. If the encoding was not detected, encPlain is used for encoding.
|
||||
*/
|
||||
+ (keyEncoding) getDefaultEncodingForScheme: (NSString *) passwordScheme
|
||||
+ (NSArray *) getDefaultEncodingForScheme: (NSString *) passwordScheme
|
||||
{
|
||||
NSArray *schemeComps;
|
||||
NSString *trueScheme;
|
||||
keyEncoding encoding = encPlain;
|
||||
|
||||
// get the encoding which may be part of the scheme
|
||||
// e.g. ssha.hex forces a hex encoded ssha scheme
|
||||
// possible is "b64" or "hex"
|
||||
schemeComps = [passwordScheme componentsSeparatedByString: @"."];
|
||||
if ([schemeComps count] == 2)
|
||||
{
|
||||
trueScheme = [schemeComps objectAtIndex: 0];
|
||||
NSString *stringEncoding;
|
||||
// encoding string is second item
|
||||
stringEncoding = [schemeComps objectAtIndex: 1];
|
||||
if ([stringEncoding caseInsensitiveCompare: @"hex"] == NSOrderedSame)
|
||||
{
|
||||
encoding = encHex;
|
||||
}
|
||||
else if ([stringEncoding caseInsensitiveCompare: @"b64"] == NSOrderedSame ||
|
||||
[stringEncoding caseInsensitiveCompare: @"base64"] == NSOrderedSame)
|
||||
{
|
||||
encoding = encBase64;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
trueScheme = passwordScheme;
|
||||
}
|
||||
|
||||
// in order to keep backwards-compatibility, hex encoding is used for sha1 here
|
||||
if ([passwordScheme caseInsensitiveCompare: @"md5"] == NSOrderedSame ||
|
||||
[passwordScheme caseInsensitiveCompare: @"plain-md5"] == NSOrderedSame ||
|
||||
[passwordScheme caseInsensitiveCompare: @"sha"] == NSOrderedSame ||
|
||||
[passwordScheme caseInsensitiveCompare: @"cram-md5"] == NSOrderedSame)
|
||||
{
|
||||
return encHex;
|
||||
encoding = encHex;
|
||||
}
|
||||
else if ([passwordScheme caseInsensitiveCompare: @"smd5"] == NSOrderedSame ||
|
||||
[passwordScheme caseInsensitiveCompare: @"ldap-md5"] == NSOrderedSame ||
|
||||
@@ -272,9 +292,9 @@
|
||||
[passwordScheme caseInsensitiveCompare: @"sha512"] == NSOrderedSame ||
|
||||
[passwordScheme caseInsensitiveCompare: @"ssha512"] == NSOrderedSame)
|
||||
{
|
||||
return encBase64;
|
||||
encoding = encBase64;
|
||||
}
|
||||
return encPlain;
|
||||
return [NSArray arrayWithObjects: [NSNumber numberWithInt: encoding], trueScheme, nil];
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -134,15 +134,16 @@ static int cssEscapingCount;
|
||||
start--;
|
||||
start++;
|
||||
|
||||
length = [self length];
|
||||
// In [UIxMailPartTextViewer flatContentAsString], we first escape HTML entities and then
|
||||
// add URLs. Therefore, the brackets (inequality signs <>) have been encoded at this point.
|
||||
if ([[self substringWithRange: NSMakeRange (start, 4)] compare: @"<"] == NSOrderedSame)
|
||||
if (length > (start + 4)
|
||||
&& [[self substringWithRange: NSMakeRange (start, 4)] compare: @"<"] == NSOrderedSame)
|
||||
start += 4;
|
||||
|
||||
length = [self length] - start;
|
||||
workRange = NSMakeRange (start, length);
|
||||
length -= start;
|
||||
workRange = [self rangeOfCharacterFromSet: urlAfterEndingChars
|
||||
options: NSLiteralSearch range: workRange];
|
||||
options: NSLiteralSearch range: NSMakeRange (start, length)];
|
||||
if (workRange.location != NSNotFound)
|
||||
length = workRange.location - start;
|
||||
while
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/* SOGoGCSFolder.m - this file is part of SOGo
|
||||
*
|
||||
* Copyright (C) 2004-2005 SKYRIX Software AG
|
||||
* Copyright (C) 2006-2010 Inverse inc.
|
||||
* Copyright (C) 2006-2012 Inverse inc.
|
||||
*
|
||||
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
*
|
||||
@@ -835,7 +835,7 @@ static NSArray *childRecordFields = nil;
|
||||
- (BOOL) subscribeUserOrGroup: (NSString *) theIdentifier
|
||||
reallyDo: (BOOL) reallyDo
|
||||
{
|
||||
NSMutableDictionary *moduleSettings;
|
||||
NSMutableDictionary *moduleSettings, *folderShowAlarms;
|
||||
NSMutableArray *folderSubscription;
|
||||
NSString *subscriptionPointer;
|
||||
NSMutableArray *allUsers;
|
||||
@@ -886,6 +886,8 @@ static NSArray *childRecordFields = nil;
|
||||
folderSubscription
|
||||
= [moduleSettings objectForKey: @"SubscribedFolders"];
|
||||
subscriptionPointer = [self folderReference];
|
||||
|
||||
folderShowAlarms = [moduleSettings objectForKey: @"FolderShowAlarms"];
|
||||
|
||||
if (reallyDo)
|
||||
{
|
||||
@@ -897,14 +899,26 @@ static NSArray *childRecordFields = nil;
|
||||
forKey: @"SubscribedFolders"];
|
||||
}
|
||||
|
||||
if (!(folderShowAlarms
|
||||
&& [folderShowAlarms isKindOfClass: [NSMutableDictionary class]]))
|
||||
{
|
||||
folderShowAlarms = [NSMutableDictionary dictionary];
|
||||
[moduleSettings setObject: folderShowAlarms
|
||||
forKey: @"FolderShowAlarms"];
|
||||
}
|
||||
|
||||
[folderSubscription addObjectUniquely: subscriptionPointer];
|
||||
|
||||
// By default, we disable alarms on subscribed calendars
|
||||
[folderShowAlarms setObject: [NSNumber numberWithBool: NO]
|
||||
forKey: subscriptionPointer];
|
||||
}
|
||||
else
|
||||
{
|
||||
[self removeFolderSettings: moduleSettings
|
||||
withReference: subscriptionPointer];
|
||||
[folderSubscription removeObject: subscriptionPointer];
|
||||
|
||||
[folderShowAlarms removeObjectForKey: subscriptionPointer];
|
||||
}
|
||||
|
||||
[us synchronize];
|
||||
|
||||
@@ -187,7 +187,10 @@
|
||||
pass = [plainPassword asCryptedPassUsingScheme: _userPasswordAlgorithm];
|
||||
|
||||
if (pass == nil)
|
||||
[self errorWithFormat: @"Unsupported user-password algorithm: %@", _userPasswordAlgorithm];
|
||||
{
|
||||
[self errorWithFormat: @"Unsupported user-password algorithm: %@", _userPasswordAlgorithm];
|
||||
return nil;
|
||||
}
|
||||
|
||||
if (_prependPasswordScheme)
|
||||
result = [NSString stringWithFormat: @"{%@}%@", _userPasswordAlgorithm, pass];
|
||||
@@ -308,18 +311,20 @@
|
||||
NSString *sqlstr;
|
||||
BOOL didChange;
|
||||
BOOL isOldPwdOk;
|
||||
|
||||
|
||||
isOldPwdOk = NO;
|
||||
didChange = NO;
|
||||
|
||||
|
||||
// Verify current password
|
||||
isOldPwdOk = [self checkLogin:login password:oldPassword perr:perr expire:0 grace:0];
|
||||
|
||||
|
||||
if (isOldPwdOk)
|
||||
{
|
||||
// Encrypt new password
|
||||
NSString *encryptedPassword = [self _encryptPassword: newPassword];
|
||||
|
||||
if(encryptedPassword == nil)
|
||||
return NO;
|
||||
|
||||
// Save new password
|
||||
login = [login stringByReplacingString: @"'" withString: @"''"];
|
||||
cm = [GCSChannelManager defaultChannelManager];
|
||||
|
||||
@@ -208,8 +208,8 @@ class DAVAclTest(unittest.TestCase):
|
||||
return versitStruct
|
||||
|
||||
event_template = """BEGIN:VCALENDAR
|
||||
VERSION:2.0
|
||||
PRODID:-//Inverse//Event Generator//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VEVENT
|
||||
SEQUENCE:0
|
||||
TRANSP:OPAQUE
|
||||
|
||||
@@ -35,6 +35,7 @@
|
||||
#import <GDLContentStore/GCSChannelManager.h>
|
||||
#import <GDLContentStore/GCSFolder.h>
|
||||
#import <GDLContentStore/GCSFolderManager.h>
|
||||
#import <GDLContentStore/GCSSpecialQueries.h>
|
||||
#import <GDLContentStore/NSURL+GCS.h>
|
||||
|
||||
#import <SOGo/NSString+Utilities.h>
|
||||
@@ -113,6 +114,7 @@
|
||||
BOOL rc = NO;
|
||||
GCSFolderManager *fm;
|
||||
GCSChannelManager *cm;
|
||||
GCSSpecialQueries *specialQueries;
|
||||
NSURL *folderLocation;
|
||||
EOAdaptorContext *ac;
|
||||
EOAdaptorChannel *fc;
|
||||
@@ -125,6 +127,7 @@
|
||||
folderLocation = [fm folderInfoLocation];
|
||||
fc = [cm acquireOpenChannelForURL: folderLocation];
|
||||
ac = [fc adaptorContext];
|
||||
specialQueries = [fc specialQueries];
|
||||
sqlFromUserID = [fromUserID asSafeSQLString];
|
||||
sqlToUserID = [toUserID asSafeSQLString];
|
||||
|
||||
@@ -137,15 +140,16 @@
|
||||
if (!sqlError)
|
||||
{
|
||||
sql
|
||||
= [NSString stringWithFormat: @"UPDATE %@"
|
||||
@" SET c_path = '/'||c_path1||'/'||c_path2||'/'||c_path3||'/'||c_path4"
|
||||
@" WHERE c_path2 = '%@'",
|
||||
[folderLocation gcsTableName], sqlToUserID];
|
||||
= [specialQueries updateCPathInFolderInfo: [folderLocation gcsTableName]
|
||||
withCPath2: sqlToUserID];
|
||||
sqlError = [fc evaluateExpressionX: sql];
|
||||
}
|
||||
|
||||
if (sqlError)
|
||||
[ac rollbackTransaction];
|
||||
{
|
||||
[ac rollbackTransaction];
|
||||
NSLog([sqlError reason]);
|
||||
}
|
||||
else
|
||||
rc = [ac commitTransaction];
|
||||
|
||||
@@ -195,7 +199,10 @@
|
||||
[profileLocation gcsTableName], sqlToUserID, sqlFromUserID];
|
||||
sqlError = [fc evaluateExpressionX: sql];
|
||||
if (sqlError)
|
||||
[ac rollbackTransaction];
|
||||
{
|
||||
[ac rollbackTransaction];
|
||||
NSLog([sqlError reason]);
|
||||
}
|
||||
else
|
||||
rc = [ac commitTransaction];
|
||||
|
||||
|
||||
@@ -110,7 +110,8 @@ DIV#contactFoldersList
|
||||
bottom: 0px;
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
overflow: hidden; }
|
||||
overflow: auto;
|
||||
overflow-x: hidden; }
|
||||
|
||||
DIV#abToolbar
|
||||
{ padding-left: 6px; }
|
||||
@@ -237,7 +238,6 @@ DIV#contactView H3.contactCardTitle
|
||||
padding: .2em 0px;
|
||||
font-size: large;
|
||||
font-weight: bold;
|
||||
width: 300px;
|
||||
text-decoration: underline; }
|
||||
|
||||
DIV.contactColumn
|
||||
|
||||
@@ -5,7 +5,8 @@ DIV#leftPanel
|
||||
width: 19.25em;
|
||||
bottom: 0px;
|
||||
background-color: #CCDDEC;
|
||||
overflow: hidden; }
|
||||
overflow: auto;
|
||||
overflow-x: hidden; }
|
||||
|
||||
DIV#schedulerTabs
|
||||
{ position: absolute;
|
||||
@@ -21,9 +22,6 @@ DIV#schedulerTabs .tab
|
||||
{ left: 0px;
|
||||
right: 0px; }
|
||||
|
||||
DIV#calendarSelectorView
|
||||
{ overflow: hidden; }
|
||||
|
||||
DIV#calendarSelectorButtons
|
||||
{ padding-left: 6px; }
|
||||
|
||||
@@ -44,8 +42,6 @@ UL#calendarList
|
||||
padding: 0px;
|
||||
list-style-type: none;
|
||||
list-style-image: none;
|
||||
overflow: hidden;
|
||||
overflow-y: auto;
|
||||
-moz-user-select: none;
|
||||
-khtml-user-select: none; }
|
||||
|
||||
|
||||
@@ -1986,8 +1986,8 @@ function calendarDisplayCallback(http) {
|
||||
"-",
|
||||
deleteEvent,
|
||||
copyEventToPersonalCalendar,
|
||||
onMenuRawEvent
|
||||
);
|
||||
onMenuRawEvent
|
||||
);
|
||||
var observer;
|
||||
if (currentView == 'dayview') {
|
||||
observer = $("daysView");
|
||||
@@ -2669,7 +2669,7 @@ function onTasksListMenuPrepareVisibility() {
|
||||
var options = $(this).down("ul");
|
||||
var rawOption = options.down("li", 6);
|
||||
|
||||
var selectedTasks = $$("UL#tasksList LI._selected");
|
||||
var selectedTasks = $$("#tasksList ._selected");
|
||||
if (selectedTasks.length == 1)
|
||||
rawOption.removeClassName("disabled");
|
||||
else
|
||||
@@ -3239,23 +3239,23 @@ function onWindowResize(event) {
|
||||
handle.adjust();
|
||||
|
||||
if (!$(document.body).hasClassName("popup"))
|
||||
drawNowLine ();
|
||||
drawNowLine();
|
||||
}
|
||||
|
||||
function drawNowLine () {
|
||||
function drawNowLine() {
|
||||
var d = new Date();
|
||||
var hours = d.getHours();
|
||||
var minutes = d.getMinutes();
|
||||
|
||||
if (currentView == "dayview") {
|
||||
var today = new Date ();
|
||||
var m = parseInt(today.getMonth ()) + 1;
|
||||
var d = today.getDate ();
|
||||
var today = new Date();
|
||||
var m = parseInt(today.getMonth()) + 1;
|
||||
var d = today.getDate();
|
||||
if (m < 10)
|
||||
m = "0" + m;
|
||||
if (d < 10)
|
||||
d = "0" + d;
|
||||
var day = today.getFullYear () + "" + m + "" + d;
|
||||
var day = today.getFullYear() + "" + m + "" + d;
|
||||
var targets = $$("DIV#daysView DIV.days DIV.day[day=" + day
|
||||
+ "] DIV.clickableHourCell");
|
||||
}
|
||||
@@ -3268,12 +3268,12 @@ function drawNowLine () {
|
||||
if (target) {
|
||||
var div = $("nowLineDisplay");
|
||||
if (!div)
|
||||
div = new Element ("div", {'id': 'nowLineDisplay'});
|
||||
div = new Element("div", {'id': 'nowLineDisplay'});
|
||||
|
||||
div.style.top = parseInt (((minutes * target.offsetHeight) / 60) - 1) + "px";
|
||||
target.appendChild (div);
|
||||
div.style.top = parseInt(((minutes * target.offsetHeight) / 60) - 1) + "px";
|
||||
target.appendChild(div);
|
||||
|
||||
setTimeout ("drawNowLine ();", 60000); // 1 min.
|
||||
setTimeout("drawNowLine ();", 60000); // 1 min.
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,11 +29,11 @@ DIV.basicUserRights
|
||||
|
||||
DIV.calendarUserRights SPAN
|
||||
{ float: left;
|
||||
clear: right;
|
||||
clear: both;
|
||||
line-height: 2em;
|
||||
margin-right: 1em;
|
||||
text-align: right;
|
||||
width: 220px; }
|
||||
width: 120px; }
|
||||
|
||||
DIV.buttons
|
||||
{ text-align: right;
|
||||
|
||||
Reference in new issue
Block a user