Compare commits
50
Commits
eas2
...
SOGo-5.12.8
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
28c4daa504 | ||
|
|
4e5c2516d4 | ||
|
|
baf26ae19d | ||
|
|
0cb21f8fb9 | ||
|
|
d7232618e6 | ||
|
|
93b82a0f60 | ||
|
|
2af96d10d5 | ||
|
|
29d0bbc9eb | ||
|
|
67ce01ec2a | ||
|
|
6119d6cf23 | ||
|
|
0ddc4281b8 | ||
|
|
b7641be5c8 | ||
|
|
d902756aaf | ||
|
|
f9b71059f4 | ||
|
|
ee2ebbb81c | ||
|
|
6f0b4f9d05 | ||
|
|
40228c619b | ||
|
|
d7f02b6083 | ||
|
|
453ddceae9 | ||
|
|
55d615e4dd | ||
|
|
1f7e5d2b2c | ||
|
|
f322fa2721 | ||
|
|
623f083cd9 | ||
|
|
7f7e1ad496 | ||
|
|
4f92da4971 | ||
|
|
1fdb4d3026 | ||
|
|
fbd056cc29 | ||
|
|
39b820a549 | ||
|
|
1be58da745 | ||
|
|
6ce884b3e7 | ||
|
|
4a587fe000 | ||
|
|
d993227b36 | ||
|
|
54e65233d9 | ||
|
|
2c2dbe4c61 | ||
|
|
d7e51655fb | ||
|
|
83d4c522f8 | ||
|
|
e821b20f87 | ||
|
|
dba92852f1 | ||
|
|
af984f58c0 | ||
|
|
71d865b86a | ||
|
|
3abbc31ed4 | ||
|
|
389e8e64c4 | ||
|
|
b46bf8b8dd | ||
|
|
7a09408ef8 | ||
|
|
95efe73e69 | ||
|
|
eb77a8e048 | ||
|
|
7876013a4c | ||
|
|
e9b3f2a43d | ||
|
|
47239ba0fd | ||
|
|
6f916008e9 |
No files matched your search
+1
-1
@@ -1,6 +1,6 @@
|
||||
[main]
|
||||
host = https://www.transifex.com
|
||||
lang_map = fr: French, pt_BR: BrazilianPortuguese, ru: Russian, sk: Slovak, es_AR: SpanishArgentina, fi: Finnish, id_ID: Indonesian, lt: Lithuanian, tr_TR: TurkishTurkey, zh_TW: ChineseTaiwan, ar: Arabic, cs: Czech, nn_NO: NorwegianNynorsk, sl_SI: Slovenian, uk: Ukrainian, zh_CN: ChineseChina, sv: Swedish, bg_BG: Bulgarian, cy: Welsh, is: Icelandic, sr: Serbian, lv: Latvian, pl: Polish, ro_RO: Romanian, bs_BA: Bosnian,ca: Catalan, he: Hebrew, kk: Kazakh, pt: Portuguese, es_ES: SpanishSpain, eu: Basque, hu: Hungarian, ja: Japanese, mk_MK: Macedonian, nb_NO: NorwegianBokmal, nl: Dutch, sr@latin: SerbianLatin, da_DK: Danish, de: German, hr_HR: Croatian, it: Italian, sr_ME@latin: Montenegrin, gl_ES: Galician, ko: Korean, th: Thai
|
||||
lang_map = fr: French, pt_BR: BrazilianPortuguese, ru: Russian, sk: Slovak, es_AR: SpanishArgentina, fi: Finnish, id_ID: Indonesian, lt: Lithuanian, tr_TR: TurkishTurkey, zh_TW: ChineseTaiwan, ar: Arabic, cs: Czech, nn_NO: NorwegianNynorsk, sl_SI: Slovenian, uk: Ukrainian, zh_CN: ChineseChina, sv: Swedish, bg_BG: Bulgarian, cy: Welsh, is: Icelandic, sr: Serbian, lv: Latvian, pl: Polish, ro_RO: Romanian, bs_BA: Bosnian,ca: Catalan, he: Hebrew, kk: Kazakh, pt: Portuguese, es_ES: SpanishSpain, eu: Basque, hu: Hungarian, ja: Japanese, mk_MK: Macedonian, nb_NO: NorwegianBokmal, nl: Dutch, sr@latin: SerbianLatin, da_DK: Danish, de: German, hr_HR: Croatian, it: Italian, sr_ME@latin: Montenegrin, gl_ES: Galician, ko: Korean, th: Thai, el: Greek
|
||||
|
||||
[o:alinto:p:sogo:r:soobjects-appointments]
|
||||
source_file = SoObjects/Appointments/English.lproj/Localizable.strings
|
||||
|
||||
@@ -2,6 +2,78 @@
|
||||
|
||||
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
||||
|
||||
### [5.12.8](https://github.com/Alinto/sogo/compare/SOGo-5.12.7...SOGo-5.12.8) (2026-05-11)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **acl:** fix folder path ([d902756](https://github.com/Alinto/sogo/commit/d902756aaf955a9ade6061806bb372e15b673197))
|
||||
* **acl:** only add existing uid ([f9b7105](https://github.com/Alinto/sogo/commit/f9b71059f4f382d7b337d16ce1257443ade43d02))
|
||||
* **css:** do not escape css if missing ([d723261](https://github.com/Alinto/sogo/commit/d7232618e6d6518acd148d3fafc5476d6a83aae1))
|
||||
* **mail:** correctly render mail when searching ([0cb21f8](https://github.com/Alinto/sogo/commit/0cb21f8fb95d3fcb5da5112e3dcf082fa7cb1fe3))
|
||||
* **mail:** remove negative margin from mail ([6119d6c](https://github.com/Alinto/sogo/commit/6119d6cf232cdf322b6c9d6d8beec7c8f47b8ad2))
|
||||
* **mail:** render properly the subject v2 ([29d0bbc](https://github.com/Alinto/sogo/commit/29d0bbc9eb96c2b4a0ada4d93eac79a66c789b22))
|
||||
* **mail:** sanitise mail with ics (invitation to event) ([67ce01e](https://github.com/Alinto/sogo/commit/67ce01ec2a1a7854d8e9f615dd65afb949043e86))
|
||||
* **openid:** check the userinfo mail + avoid infinite loop ([93b82a0](https://github.com/Alinto/sogo/commit/93b82a0f60ce5d8b0938e3f03d86baee8d075162))
|
||||
* **UI:** render properly the subject ([b7641be](https://github.com/Alinto/sogo/commit/b7641be5c80c0c02dc1b4742ce92e4de9a948b72))
|
||||
|
||||
|
||||
### Localization
|
||||
|
||||
* **pl:** Update Polish translations ([4e5c251](https://github.com/Alinto/sogo/commit/4e5c2516d43a3d80fad75f0a08c114ff3cb3eb03))
|
||||
|
||||
### [5.12.7](https://github.com/Alinto/sogo/compare/SOGo-5.12.6...SOGo-5.12.7) (2026-03-30)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **sql:** use proper sql adaptor for usr source ([1f7e5d2](https://github.com/Alinto/sogo/commit/1f7e5d2b2c2047c44a6a9e05f73c36491cb96d21))
|
||||
* **typo:** pass the correct arg to checkLogin ([d7f02b6](https://github.com/Alinto/sogo/commit/d7f02b6083197ecabc57c6e3c6f16a3bc23c68d0))
|
||||
|
||||
|
||||
### Localization
|
||||
|
||||
* **all:** update several translations ([40228c6](https://github.com/Alinto/sogo/commit/40228c619b6df02be4ed5e3f2e0b8d78d8cf15b2))
|
||||
* **fr:** Typo in French ([55d615e](https://github.com/Alinto/sogo/commit/55d615e4dd563bc31d82400b1bf110eed61248f6))
|
||||
|
||||
### [5.12.6](https://github.com/Alinto/sogo/compare/SOGo-5.12.6...SOGo-5.12.6) (2026-03-19)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **totp:** new user can properly use totp ([623f08](https://github.com/Alinto/sogo/commit/623f083cd94842766c6d9430cf3bdad8fc4d5dbc))
|
||||
|
||||
### [5.12.5](https://github.com/Alinto/sogo/compare/SOGo-5.12.4...SOGo-5.12.5) (2026-03-03)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **db:** increase some column size ([f8638a3](https://github.com/Alinto/sogo/commit/f8638a3f4edd3487901c119b079dea2a3746cd7c))
|
||||
* **encryptedUrl:** fix cache key data and expect uncrypted name for freebusy ([95efe73](https://github.com/Alinto/sogo/commit/95efe73e69abaae7fb8c1bdd0fe7ac660d59d7a4))
|
||||
* **event:** also add jitsi url in the location as outlook doesn't support attach url ([7876013](https://github.com/Alinto/sogo/commit/7876013a4c1b0c7a1ac7153f2c61ff5f3de39632))
|
||||
* **identity:** fix signatrue when changing identity ([71d865b](https://github.com/Alinto/sogo/commit/71d865b86a7c11dc6aa8612999ae515f14a3bdf2))
|
||||
* **login:** prevent user search for login keyword ([6f91600](https://github.com/Alinto/sogo/commit/6f916008e9e30bceaf5942e0c8645006d07d3aec))
|
||||
* **Mail:** correctly update quota when refreshing ([af984f5](https://github.com/Alinto/sogo/commit/af984f58c043cb7ddc8597f119c8a5b9737612b2))
|
||||
* **mail:** use the correct replyTo when set to a non*default identity ([03fa91d](https://github.com/Alinto/sogo/commit/03fa91dc22b268ce230f78e7386234ca84814f27))
|
||||
* **minsearch:** fix instance of minsearch ([d7e5165](https://github.com/Alinto/sogo/commit/d7e51655fb0a543cff68a9fbc10ceb67540e4bec))
|
||||
* **tool:** rename-user properly change data in c_defaults and c_settings ([d69f55c](https://github.com/Alinto/sogo/commit/d69f55c265e0e5873032d5e14e49636ed6c36631))
|
||||
* **trad:** typo in a transation key ([e2b8494](https://github.com/Alinto/sogo/commit/e2b8494a9cde046a8aad71808353366c328e0230))
|
||||
* **ui:** prevent UI to search for users with empty string ([389e8e6](https://github.com/Alinto/sogo/commit/389e8e64c4933edbcc1f756f422594e70d70c903))
|
||||
* **vulnerability:** prevent javascript njection with hint query ([e821b20](https://github.com/Alinto/sogo/commit/e821b20f87d1a9757f1d0aff7d1e31703f97054b))
|
||||
* **vulnerability:** prevent sogo to execute scripts pass in theme query ([16ab99e](https://github.com/Alinto/sogo/commit/16ab99e7cf8db2c30b211f0d5e338d7f9e3a9efb))
|
||||
* **vulnerability:** prevent xss with events, tasks and contacts categories ([e9b3f2a](https://github.com/Alinto/sogo/commit/e9b3f2a43d7557e8416f6749df4ab4f9128af2d1))
|
||||
* **vulnerability:** properly change the totp code after disabling it ([83d4c52](https://github.com/Alinto/sogo/commit/83d4c522f87cfde0ba543837d9b24c3479083ec2))
|
||||
|
||||
|
||||
### Localization
|
||||
|
||||
* **ca:** Update Catalan translations ([4a587fe](https://github.com/Alinto/sogo/commit/4a587fe00044bfce55186a7f75af64b5256399d7))
|
||||
* **es_ES:** Update SpanishSpain translations ([6ce884b](https://github.com/Alinto/sogo/commit/6ce884b3e71cc08c1e3eedb722be00ade6d1263f))
|
||||
* **pt_BR:** Update BrazilianPortuguese translations ([39b820a](https://github.com/Alinto/sogo/commit/39b820a5490eadbbadc6872f0814c23b7a6d4a13))
|
||||
* **pt:** Add Greek (partial) ([1fdb4d3](https://github.com/Alinto/sogo/commit/1fdb4d30261f5d69d83eef7d8615ef62ddd94a7e))
|
||||
* **pt:** Update Portuguese translations ([fbd056c](https://github.com/Alinto/sogo/commit/fbd056cc293a7c53f0ff0de4dd8a50a0d998291f))
|
||||
* **ru:** Update Russian translations ([1be58da](https://github.com/Alinto/sogo/commit/1be58da745b875aeb12096ac8fb8c51c6df99068))
|
||||
* **th:** Update Thai translations ([d993227](https://github.com/Alinto/sogo/commit/d993227b36b6fbddebf113a5b544aa3bebf01bcc))
|
||||
|
||||
## [5.12.4](https://github.com/Alinto/sogo/compare/SOGo-5.12.3...SOGo-5.13.0) (2025-10-06)
|
||||
|
||||
|
||||
|
||||
+1
-1
@@ -380,7 +380,7 @@ static BOOL debugLeaks;
|
||||
|
||||
request = [_ctx request];
|
||||
login = [SOGoUser getDecryptedUsernameIfNeeded: _key request: request];
|
||||
if([login isEqualToString: @"changeLanguage"])
|
||||
if([login isEqualToString: @"changeLanguage"] || [login isEqualToString: @"login"])
|
||||
user = nil;
|
||||
else
|
||||
{
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
"Inviting the following persons is prohibited:" = "Inviting the following persons is prohibited:";
|
||||
"Personal Calendar" = "Personal Calendar";
|
||||
vevent_class0 = "(Public event)";
|
||||
vevent_class1 = "(Private event)";
|
||||
vevent_class2 = "(Confidential event)";
|
||||
|
||||
vtodo_class0 = "(Public task)";
|
||||
vtodo_class1 = "(Private task)";
|
||||
vtodo_class2 = "(Confidential task)";
|
||||
|
||||
/* Receipts */
|
||||
"The event \"%{Summary}\" was created" = "The event \"%{Summary}\" was created";
|
||||
"The event \"%{Summary}\" was deleted" = "The event \"%{Summary}\" was deleted";
|
||||
"The event \"%{Summary}\" was updated" = "The event \"%{Summary}\" was updated";
|
||||
"The task \"%{Summary}\" was created" = "The task \"%{Summary}\" was created";
|
||||
"The task \"%{Summary}\" was deleted" = "The task \"%{Summary}\" was deleted";
|
||||
"The task \"%{Summary}\" was updated" = "The task \"%{Summary}\" was updated";
|
||||
"The following attendees(s) were notified" = "The following attendee(s) were notified";
|
||||
"The following attendees(s) were added" = "The following attendee(s) were added";
|
||||
"The following attendees(s) were removed" = "The following attendee(s) were removed";
|
||||
|
||||
/* IMIP messages */
|
||||
"calendar_label" = "Calendar";
|
||||
"startDate_label" = "Start";
|
||||
"endDate_label" = "End";
|
||||
"time_label" = "Time";
|
||||
"to_label" = "to";
|
||||
"due_label" = "Due Date";
|
||||
"location_label" = "Location";
|
||||
"summary_label" = "Summary";
|
||||
"comment_label" = "Comment";
|
||||
"organizer_label" = "Organizer";
|
||||
"attendee_label" = "Attendee";
|
||||
|
||||
/* Invitation */
|
||||
"Event Invitation: \"%{Summary}\"" = "Event Invitation: \"%{Summary}\"";
|
||||
"(sent by %{SentBy}) " = "(sent by %{SentBy}) ";
|
||||
"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate}\nEnd: %{EndDate}\nDescription: %{Description}" = "%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate}\nEnd: %{EndDate}\nDescription: %{Description}";
|
||||
"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" = "%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}";
|
||||
|
||||
/* Deletion */
|
||||
"Event Cancelled: \"%{Summary}\"" = "Event Cancelled: \"%{Summary}\"";
|
||||
"%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate}\nEnd: %{EndDate}\nDescription: %{Description}"
|
||||
= "%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate}\nEnd: %{EndDate}\nDescription: %{Description}";
|
||||
"%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}"
|
||||
= "%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}";
|
||||
|
||||
/* Update */
|
||||
"The appointment \"%{Summary}\" for the %{OldStartDate} has changed"
|
||||
= "The appointment \"%{Summary}\" for the %{OldStartDate} has changed";
|
||||
"The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed"
|
||||
= "The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed";
|
||||
"The following parameters have changed in the \"%{Summary}\" meeting:"
|
||||
= "The following parameters have changed in the \"%{Summary}\" meeting:";
|
||||
"Please accept or decline those changes."
|
||||
= "Please accept or decline those changes.";
|
||||
|
||||
/* Reply */
|
||||
"Accepted invitation: \"%{Summary}\"" = "Accepted invitation: \"%{Summary}\"";
|
||||
"Declined invitation: \"%{Summary}\"" = "Declined invitation: \"%{Summary}\"";
|
||||
"Delegated invitation: \"%{Summary}\"" = "Delegated invitation: \"%{Summary}\"";
|
||||
"Not yet decided on invitation: \"%{Summary}\"" = "Not yet decided on invitation: \"%{Summary}\"";
|
||||
"%{Attendee} %{SentByText}has accepted your event invitation."
|
||||
= "%{Attendee} %{SentByText}has accepted your event invitation.";
|
||||
"%{Attendee} %{SentByText}has declined your event invitation."
|
||||
= "%{Attendee} %{SentByText}has declined your event invitation.";
|
||||
"%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}."
|
||||
= "%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}.";
|
||||
"%{Attendee} %{SentByText}has not yet decided upon your event invitation."
|
||||
= "%{Attendee} %{SentByText}has not yet decided upon your event invitation.";
|
||||
|
||||
/* Reminder */
|
||||
"Reminder: \"%{Summary}\" - %{StartDate}" = "Reminder: \"%{Summary}\" - %{StartDate}";
|
||||
|
||||
/* Resources */
|
||||
"Cannot access resource: \"%{Cn} %{SystemEmail}\"" = "Cannot access resource: \"%{Cn} %{SystemEmail}\"";
|
||||
"Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\". The conflicting event is \"%{EventTitle}\", and starts on %{StartDate}." = "Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\". The conflicting event is \"%{EventTitle}\", and starts on %{StartDate}.";
|
||||
|
||||
/* Participation role */
|
||||
"Your participation is required to this event" = "Your participation is required to this event";
|
||||
"Your participation is optional to this event" = "Your participation is optional to this event";
|
||||
"Your participation is not required to this event" = "Your participation is not required to this event";
|
||||
@@ -15,7 +15,7 @@ vtodo_class2 = "(งานลับ)";
|
||||
"The task \"%{Summary}\" was created" = "งาน \"%{Summary}\" ถูกสร้างขี้น";
|
||||
"The task \"%{Summary}\" was deleted" = "งาน \"%{Summary}\" ถูกลบ";
|
||||
"The task \"%{Summary}\" was updated" = "งาน \"%{Summary}\" ถูกอัพเดต";
|
||||
"The following attendees(s) were notified" = "แจ้งผู้เข้าร่วมดังต่อไปนี้";
|
||||
"The following attendees(s) were notified" = "ผู้เข้าร่วมต่อไปนี้ได้รับการแจ้งแล้ว";
|
||||
"The following attendees(s) were added" = "ผู้เข้าร่วมต่อไปนี้ถูกเพิ่มเข้ามา";
|
||||
"The following attendees(s) were removed" = "ผู้เข้าร่วมต่อไปนี้ถูกลบออก";
|
||||
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
"Personal Address Book" = "Personal Address Book";
|
||||
"Collected Address Book" = "Collected Address Book";
|
||||
@@ -0,0 +1,5 @@
|
||||
"OtherUsersFolderName" = "Other Users";
|
||||
"SharedFoldersName" = "Shared Folders";
|
||||
|
||||
"Report: Marked messages as junk" = "Report: Marked messages as junk";
|
||||
"Report: Marked messages as not junk" = "Report: Marked messages as not junk";
|
||||
@@ -91,6 +91,9 @@
|
||||
@interface SOGoMailGermanForward : SOGoMailForward
|
||||
@end
|
||||
|
||||
@interface SOGoMailGreekForward : SOGoMailForward
|
||||
@end
|
||||
|
||||
@interface SOGoMailHebrewForward : SOGoMailForward
|
||||
@end
|
||||
|
||||
|
||||
@@ -345,6 +345,9 @@
|
||||
@implementation SOGoMailGermanForward
|
||||
@end
|
||||
|
||||
@implementation SOGoMailGreekForward
|
||||
@end
|
||||
|
||||
@implementation SOGoMailHebrewForward
|
||||
@end
|
||||
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
<#newLine/><#newLine
|
||||
/><#signaturePlacementOnTop><#signature/><#newLine/><#newLine/></#signaturePlacementOnTop
|
||||
>-------- Αρχικό Μήνυμα --------<#newLine
|
||||
/>Θέμα: <#subject/><#newLine
|
||||
/>Ημερομηνία: <#date/><#newLine
|
||||
/>Από: <#from/><#newLine
|
||||
/><#hasReplyTo>Απάντηση-Προς: <#replyTo/><#newLine/></#hasReplyTo
|
||||
><#hasOrganization>Οργανισμός: <#organization/><#newLine/></#hasOrganization
|
||||
>Προς: <#to/><#newLine
|
||||
/><#hasCc>Κοιν.: <#cc/><#newLine/></#hasCc
|
||||
><#hasNewsGroups>Ομάδες ειδήσεων: <#newsgroups/><#newLine/></#hasNewsGroups
|
||||
><#hasReferences>Αναφορές: <#references/><#newLine/></#hasReferences
|
||||
><#newLine/><#newLine
|
||||
/><#messageBody
|
||||
/><#signaturePlacementOnBottom><#newLine/><#newLine/><#signature/></#signaturePlacementOnBottom>
|
||||
@@ -0,0 +1,88 @@
|
||||
subject: WOString {
|
||||
value = subject;
|
||||
escapeHTML = NO;
|
||||
}
|
||||
|
||||
date: WOString {
|
||||
value = date;
|
||||
escapeHTML = NO;
|
||||
}
|
||||
|
||||
from: WOString {
|
||||
value = from;
|
||||
escapeHTML = NO;
|
||||
}
|
||||
|
||||
newLine: WOString {
|
||||
value = newLine;
|
||||
escapeHTML = NO;
|
||||
}
|
||||
|
||||
hasReplyTo: WOConditional {
|
||||
condition = hasReplyTo;
|
||||
}
|
||||
|
||||
replyTo: WOString {
|
||||
value = replyTo;
|
||||
escapeHTML = NO;
|
||||
}
|
||||
|
||||
hasOrganization: WOConditional {
|
||||
condition = hasOrganization;
|
||||
}
|
||||
|
||||
organization: WOString {
|
||||
value = organization;
|
||||
escapeHTML = NO;
|
||||
}
|
||||
|
||||
to: WOString {
|
||||
value = to;
|
||||
escapeHTML = NO;
|
||||
}
|
||||
|
||||
hasCc: WOConditional {
|
||||
condition = hasCc;
|
||||
}
|
||||
|
||||
cc: WOString {
|
||||
value = cc;
|
||||
escapeHTML = NO;
|
||||
}
|
||||
|
||||
hasNewsGroups: WOConditional {
|
||||
condition = hasNewsGroups;
|
||||
}
|
||||
|
||||
newsgroups: WOString {
|
||||
value = newsgroups;
|
||||
escapeHTML = NO;
|
||||
}
|
||||
|
||||
hasReferences: WOConditional {
|
||||
condition = hasReferences;
|
||||
}
|
||||
|
||||
references: WOString {
|
||||
value = references;
|
||||
escapeHTML = NO;
|
||||
}
|
||||
|
||||
messageBody: WOString {
|
||||
value = messageBody;
|
||||
escapeHTML = NO;
|
||||
}
|
||||
|
||||
signature: WOString {
|
||||
value = signature;
|
||||
escapeHTML = NO;
|
||||
}
|
||||
|
||||
signaturePlacementOnTop: WOConditional {
|
||||
condition = signaturePlacementOnTop;
|
||||
}
|
||||
|
||||
signaturePlacementOnBottom: WOConditional {
|
||||
condition = signaturePlacementOnTop;
|
||||
negate = YES;
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
<#replyPlacementOnTop><#newLine/><#newLine/></#replyPlacementOnTop
|
||||
><#signaturePlacementOnTop><#signature/><#newLine/><#newLine/></#signaturePlacementOnTop
|
||||
><#outlookMode
|
||||
>-------- Αρχικό Μήνυμα --------<#newLine
|
||||
/>Θέμα: <#subject/><#newLine
|
||||
/>Ημερομηνία: <#date/><#newLine
|
||||
/>Από: <#from/><#newLine
|
||||
/><#hasReplyTo>Απάντηση-Προς: <#replyTo/><#newLine/></#hasReplyTo
|
||||
><#hasOrganization>Οργανισμός: <#organization/><#newLine/></#hasOrganization
|
||||
>Προς: <#to/><#newLine
|
||||
/><#hasCc>Κοιν.: <#cc/><#newLine/></#hasCc
|
||||
><#hasNewsGroups>Ομάδες ειδήσεων: <#newsgroups/><#newLine/></#hasNewsGroups
|
||||
><#hasReferences>Αναφορές: <#references/><#newLine/></#hasReferences
|
||||
></#outlookMode
|
||||
><#standardMode>Στις <#date/>, ο/η <#from/> έγραψε:</#standardMode
|
||||
><#newLine/><#newLine/><#messageBody
|
||||
/><#replyPlacementOnBottom><#newLine/><#newLine/></#replyPlacementOnBottom
|
||||
><#signaturePlacementOnBottom><#newLine/><#signature/></#signaturePlacementOnBottom>
|
||||
@@ -0,0 +1,106 @@
|
||||
outlookMode: WOConditional {
|
||||
condition = outlookMode;
|
||||
}
|
||||
|
||||
standardMode: WOConditional {
|
||||
condition = outlookMode;
|
||||
negate = YES;
|
||||
}
|
||||
|
||||
subject: WOString {
|
||||
value = subject;
|
||||
escapeHTML = NO;
|
||||
}
|
||||
|
||||
date: WOString {
|
||||
value = date;
|
||||
escapeHTML = NO;
|
||||
}
|
||||
|
||||
from: WOString {
|
||||
value = from;
|
||||
escapeHTML = NO;
|
||||
}
|
||||
|
||||
newLine: WOString {
|
||||
value = newLine;
|
||||
escapeHTML = NO;
|
||||
}
|
||||
|
||||
hasReplyTo: WOConditional {
|
||||
condition = hasReplyTo;
|
||||
}
|
||||
|
||||
replyTo: WOString {
|
||||
value = replyTo;
|
||||
escapeHTML = NO;
|
||||
}
|
||||
|
||||
hasOrganization: WOConditional {
|
||||
condition = hasOrganization;
|
||||
}
|
||||
|
||||
organization: WOString {
|
||||
value = organization;
|
||||
escapeHTML = NO;
|
||||
}
|
||||
|
||||
to: WOString {
|
||||
value = to;
|
||||
escapeHTML = NO;
|
||||
}
|
||||
|
||||
hasCc: WOConditional {
|
||||
condition = hasCc;
|
||||
}
|
||||
|
||||
cc: WOString {
|
||||
value = cc;
|
||||
escapeHTML = NO;
|
||||
}
|
||||
|
||||
hasNewsGroups: WOConditional {
|
||||
condition = hasNewsGroups;
|
||||
}
|
||||
|
||||
newsgroups: WOString {
|
||||
value = newsgroups;
|
||||
escapeHTML = NO;
|
||||
}
|
||||
|
||||
hasReferences: WOConditional {
|
||||
condition = hasReferences;
|
||||
}
|
||||
|
||||
references: WOString {
|
||||
value = references;
|
||||
escapeHTML = NO;
|
||||
}
|
||||
|
||||
messageBody: WOString {
|
||||
value = messageBody;
|
||||
escapeHTML = NO;
|
||||
}
|
||||
|
||||
signature: WOString {
|
||||
value = signature;
|
||||
escapeHTML = NO;
|
||||
}
|
||||
|
||||
replyPlacementOnTop: WOConditional {
|
||||
condition = replyPlacementOnTop;
|
||||
}
|
||||
|
||||
replyPlacementOnBottom: WOConditional {
|
||||
condition = replyPlacementOnTop;
|
||||
negate = YES;
|
||||
}
|
||||
|
||||
signaturePlacementOnTop: WOConditional {
|
||||
condition = signaturePlacementOnTop;
|
||||
}
|
||||
|
||||
signaturePlacementOnBottom: WOConditional {
|
||||
condition = signaturePlacementOnTop;
|
||||
negate = YES;
|
||||
}
|
||||
@@ -1031,16 +1031,26 @@ static int cssEscapingCount;
|
||||
newResult = [regex stringByReplacingMatchesInString:result options:0 range:NSMakeRange(0, [result length]) withTemplate:@"</for*"];
|
||||
result = [NSString stringWithString: newResult];
|
||||
|
||||
// Remove onload
|
||||
regex = [NSRegularExpression regularExpressionWithPattern:@"onload="
|
||||
options: NSRegularExpressionCaseInsensitive error:&error];
|
||||
newResult = [regex stringByReplacingMatchesInString:result options:0 range:NSMakeRange(0, [result length]) withTemplate:@"onl***="];
|
||||
result = [NSString stringWithString: newResult];
|
||||
// // Remove onload
|
||||
// regex = [NSRegularExpression regularExpressionWithPattern:@"onload="
|
||||
// options: NSRegularExpressionCaseInsensitive error:&error];
|
||||
// newResult = [regex stringByReplacingMatchesInString:result options:0 range:NSMakeRange(0, [result length]) withTemplate:@"onl***="];
|
||||
// result = [NSString stringWithString: newResult];
|
||||
|
||||
// Remove onmouseover
|
||||
regex = [NSRegularExpression regularExpressionWithPattern:@"onmouseover="
|
||||
options: NSRegularExpressionCaseInsensitive error:&error];
|
||||
newResult = [regex stringByReplacingMatchesInString:result options:0 range:NSMakeRange(0, [result length]) withTemplate:@"onmouseo***="];
|
||||
// // Remove onmouseover
|
||||
// regex = [NSRegularExpression regularExpressionWithPattern:@"onmouseover="
|
||||
// options: NSRegularExpressionCaseInsensitive error:&error];
|
||||
// newResult = [regex stringByReplacingMatchesInString:result options:0 range:NSMakeRange(0, [result length]) withTemplate:@"onmouseo***="];
|
||||
// result = [NSString stringWithString: newResult];
|
||||
|
||||
// regex = [NSRegularExpression regularExpressionWithPattern:@"onrepeat="
|
||||
// options: NSRegularExpressionCaseInsensitive error:&error];
|
||||
// newResult = [regex stringByReplacingMatchesInString:result options:0 range:NSMakeRange(0, [result length]) withTemplate:@"onrep***="];
|
||||
// result = [NSString stringWithString: newResult];
|
||||
|
||||
regex = [NSRegularExpression regularExpressionWithPattern: @"(on\\w+)\\s*=\\s*([\"'][^\"']*[\"']|[^\\s>]+)"
|
||||
options: NSRegularExpressionCaseInsensitive error: &error];
|
||||
newResult = [regex stringByReplacingMatchesInString: result options: 0 range: NSMakeRange(0, [result length]) withTemplate: @"on***=\"\""];
|
||||
result = [NSString stringWithString: newResult];
|
||||
|
||||
// Remove @import css (in style tags)
|
||||
|
||||
@@ -289,7 +289,7 @@ static memcached_st *handle = NULL;
|
||||
NSData *keyData, *valueData;
|
||||
memcached_return error;
|
||||
|
||||
// [self logWithFormat: @"setValue: '%@' forKey: '%@'", value, key];
|
||||
//[self logWithFormat: @"setValue: '%@' forKey: '%@'", value, key];
|
||||
if (handle)
|
||||
{
|
||||
keyData = [key dataUsingEncoding: NSUTF8StringEncoding];
|
||||
|
||||
@@ -59,6 +59,7 @@
|
||||
"French",
|
||||
"Galician",
|
||||
"German",
|
||||
"Greek",
|
||||
"Hebrew",
|
||||
"Hungarian",
|
||||
"Icelandic",
|
||||
|
||||
@@ -462,7 +462,9 @@
|
||||
|
||||
- (int) searchMinimumWordLength
|
||||
{
|
||||
return [self integerForKey: @"SOGoSearchMinimumWordLength"];
|
||||
int min = [self integerForKey: @"SOGoSearchMinimumWordLength"];
|
||||
if(min<1) min=1;
|
||||
return min;
|
||||
}
|
||||
|
||||
- (BOOL) notifyOnPersonalModifications
|
||||
|
||||
@@ -1859,27 +1859,76 @@ static NSArray *childRecordFields = nil;
|
||||
EOAdaptorChannel *channel;
|
||||
GCSFolder *folder;
|
||||
NSEnumerator *userRoles;
|
||||
NSString *SQL, *currentRole;
|
||||
NSString *SQL, *currentRole, *sqlstr;
|
||||
NSString *fieldName, *value;
|
||||
EOAdaptorContext *adaptorCtx;
|
||||
EOAdaptor *adaptor;
|
||||
EOAttribute *attribute;
|
||||
|
||||
folder = [self ocsFolder];
|
||||
channel = [folder acquireAclChannel];
|
||||
[[channel adaptorContext] beginTransaction];
|
||||
adaptorCtx = [channel adaptorContext];
|
||||
|
||||
[adaptorCtx beginTransaction];
|
||||
userRoles = [roles objectEnumerator];
|
||||
objectPath = [NSString stringWithFormat: @"/%@", objectPath];
|
||||
while ((currentRole = [userRoles nextObject]))
|
||||
{
|
||||
int i = 0;
|
||||
int count = 0;
|
||||
adaptor = [adaptorCtx adaptor];
|
||||
attribute = [EOAttribute new];
|
||||
[attribute autorelease];
|
||||
if ([GCSFolderManager singleStoreMode])
|
||||
SQL = [NSString stringWithFormat: @"INSERT INTO %@"
|
||||
@" (c_object, c_uid, c_role, c_folder_id)"
|
||||
@" VALUES ('/%@', '%@', '%@', %@)",
|
||||
[folder aclTableName],
|
||||
objectPath, uid, currentRole, [folder folderId]];
|
||||
{
|
||||
sqlstr = [NSMutableString stringWithFormat: @"INSERT INTO %@"
|
||||
@" (c_object, c_uid, c_role, c_folder_id)"
|
||||
@" VALUES (",
|
||||
[folder aclTableName]];
|
||||
NSArray *keys = [NSArray arrayWithObjects: @"c_object", @"c_uid", @"c_role", @"c_folder_id", nil];
|
||||
NSArray *values = [NSArray arrayWithObjects: objectPath, uid, currentRole, [folder folderId], nil];
|
||||
|
||||
for (i = 0, count = [keys count]; i < count; i++) {
|
||||
fieldName = [keys objectAtIndex: i];
|
||||
if(i < 3)
|
||||
[attribute setExternalType: @"varchar"];
|
||||
else
|
||||
[attribute setExternalType: @"int"];
|
||||
value = [values objectAtIndex: i];
|
||||
if (attribute)
|
||||
{
|
||||
value = [adaptor formatValue: value forAttribute: attribute];
|
||||
[sqlstr appendString: value];
|
||||
if(i < 3)
|
||||
[sqlstr appendString:@", "];
|
||||
}
|
||||
}
|
||||
[sqlstr appendString:@")"];
|
||||
}
|
||||
else
|
||||
SQL = [NSString stringWithFormat: @"INSERT INTO %@"
|
||||
@" (c_object, c_uid, c_role)"
|
||||
@" VALUES ('/%@', '%@', '%@')",
|
||||
[folder aclTableName],
|
||||
objectPath, uid, currentRole];
|
||||
[channel evaluateExpressionX: SQL];
|
||||
{
|
||||
sqlstr = [NSMutableString stringWithFormat: @"INSERT INTO %@"
|
||||
@" (c_object, c_uid, c_role)"
|
||||
@" VALUES (",
|
||||
[folder aclTableName]];
|
||||
NSArray *keys = [NSArray arrayWithObjects: @"c_object", @"c_uid", @"c_role", nil];
|
||||
NSArray *values = [NSArray arrayWithObjects: objectPath, uid, currentRole, nil];
|
||||
|
||||
for (i = 0, count = [keys count]; i < count; i++) {
|
||||
fieldName = [keys objectAtIndex: i];
|
||||
[attribute setExternalType: @"varchar"];
|
||||
value = [values objectAtIndex: i];
|
||||
if (attribute)
|
||||
{
|
||||
value = [adaptor formatValue: value forAttribute: attribute];
|
||||
[sqlstr appendString: value];
|
||||
if(i < 2)
|
||||
[sqlstr appendString:@", "];
|
||||
}
|
||||
}
|
||||
[sqlstr appendString:@")"];
|
||||
}
|
||||
[channel evaluateExpressionX: sqlstr];
|
||||
}
|
||||
|
||||
[[channel adaptorContext] commitTransaction];
|
||||
|
||||
@@ -823,13 +823,16 @@ size_t curl_body_function(void *ptr, size_t size, size_t nmemb, void *buffer)
|
||||
- (NSMutableDictionary *) fetchUserInfo
|
||||
{
|
||||
NSString *location, *auth, *content;
|
||||
SOGoSystemDefaults *sd;
|
||||
SimpleOpenIdResponse *response;
|
||||
// WOResponse *response;
|
||||
NSUInteger status;
|
||||
NSMutableDictionary *result;
|
||||
NSDictionary *profile, *headers;
|
||||
NSURL *url;
|
||||
NSString *email;
|
||||
NSString *email, *type, *user_domain;
|
||||
NSRange r;
|
||||
NSArray *domainsAllowed;
|
||||
|
||||
result = [NSMutableDictionary dictionary];
|
||||
[result setObject: @"ok" forKey: @"error"];
|
||||
@@ -871,6 +874,36 @@ size_t curl_body_function(void *ptr, size_t size, size_t nmemb, void *buffer)
|
||||
"email":"myuser@user.com"}*/
|
||||
if (email = [profile objectForKey: self->openIdEmailParam])
|
||||
{
|
||||
//Check the mail domain is ok
|
||||
|
||||
r = [email rangeOfString: @"@"];
|
||||
if (r.location != NSNotFound)
|
||||
user_domain = [email substringFromIndex: r.location+1];
|
||||
else
|
||||
{
|
||||
[self logWithFormat: @"Error mail from userInfo not a mail %@", email];
|
||||
[result setObject: @"mail-error" forKey: @"error"];
|
||||
return result;
|
||||
}
|
||||
|
||||
sd = [SOGoSystemDefaults sharedSystemDefaults];
|
||||
if(self->forDomain != nil && [sd doesLoginTypeByDomain])
|
||||
{
|
||||
type = [sd getLoginTypeForDomain: self->forDomain];
|
||||
if(type != nil && [type isEqualToString: @"openid"] && ![user_domain isEqualToString: self->forDomain])
|
||||
{
|
||||
[self errorWithFormat: @"Openid userinfo email is not the right domain. Excpected: %@, Got %@", self->forDomain, user_domain];
|
||||
[result setObject: @"mail-error" forKey: @"error"];
|
||||
return result;
|
||||
}
|
||||
}
|
||||
else if(((domainsAllowed = [sd domainsAllowed]) && [domainsAllowed count] > 0) && ![domainsAllowed containsObject: user_domain])
|
||||
{
|
||||
[self errorWithFormat: @"Openid userinfo email domain is not allowed. Got %@", user_domain];
|
||||
[result setObject: @"mail-error" forKey: @"error"];
|
||||
return result;
|
||||
}
|
||||
|
||||
if(self->userTokenInterval > 0)
|
||||
[self _saveUserToCache: email];
|
||||
[result setObject: email forKey: @"login"];
|
||||
@@ -949,7 +982,7 @@ size_t curl_body_function(void *ptr, size_t size, size_t nmemb, void *buffer)
|
||||
}
|
||||
}
|
||||
|
||||
//The acces token hasn't work, delete the session in database if needed
|
||||
//The access token hasn't work, delete the session in database if needed
|
||||
if(self->accessToken)
|
||||
{
|
||||
[[[GCSFolderManager defaultFolderManager] openIdFolder] deleteOpenIdSessionFor: self->accessToken];
|
||||
@@ -962,6 +995,12 @@ size_t curl_body_function(void *ptr, size_t size, size_t nmemb, void *buffer)
|
||||
//remove old session
|
||||
[[[GCSFolderManager defaultFolderManager] openIdFolder] deleteOpenIdSessionFor: self->accessToken];
|
||||
}
|
||||
if([[resultUserInfo objectForKey: @"error"] isEqualToString: @"mail-error"])
|
||||
{
|
||||
//Means there is a problem with the mail get from userInfo (logs wil explained)
|
||||
//To avoid infinite loop -> openid -> redirect sogo -> useinfo fail -> rediretc to sogo index -> redirect to openid...
|
||||
return nil;
|
||||
}
|
||||
|
||||
return @"anonymous";
|
||||
}
|
||||
|
||||
@@ -124,7 +124,8 @@
|
||||
|
||||
- (BOOL) isSuperUser;
|
||||
- (BOOL) canAuthenticate;
|
||||
- (NSString *) totpKey;
|
||||
- (NSString *) totpKey: (bool) isCheck;
|
||||
- (NSString *) oldtotpKey;
|
||||
|
||||
/* resource */
|
||||
- (BOOL) isResource;
|
||||
|
||||
@@ -47,7 +47,6 @@
|
||||
|
||||
#import "SOGoUser.h"
|
||||
|
||||
static const NSString *kEncryptedUserNamePrefix = @"uenc";
|
||||
|
||||
@implementation SoUser (SOGoExtension)
|
||||
|
||||
@@ -1299,7 +1298,7 @@ static const NSString *kEncryptedUserNamePrefix = @"uenc";
|
||||
return [authValue boolValue];
|
||||
}
|
||||
|
||||
- (NSString *) totpKey
|
||||
- (NSString *) totpKey: (bool) isCheck
|
||||
{
|
||||
#if defined(MFA_CONFIG)
|
||||
NSString *key, *result;
|
||||
@@ -1308,6 +1307,51 @@ static const NSString *kEncryptedUserNamePrefix = @"uenc";
|
||||
|
||||
size_t s_len, secret_len;
|
||||
|
||||
//Until 5.12.4, SOGo had two problems with totp:
|
||||
// * It was not renew after a user disable it/renable it.
|
||||
// * The length was too small: 12 instead of the recommanded 20
|
||||
|
||||
if(![_defaults totpEnabled])
|
||||
{
|
||||
//Totp was not enabled
|
||||
//Only renew if this is not a check (happen when the user enable it for the first time and save its preferences
|
||||
//the saveAction will check the totp code but [_defaults totpEnabled] is still False )
|
||||
key = [[self userSettings] userCurrentTotpKey: !isCheck];
|
||||
}
|
||||
else
|
||||
{
|
||||
//Totp currently enabled
|
||||
key = [[self userSettings] userCurrentTotpKey: NO];
|
||||
}
|
||||
|
||||
s = [key UTF8String];
|
||||
s_len = strlen(s);
|
||||
|
||||
oath_init();
|
||||
oath_base32_encode(s,s_len, &secret, &secret_len);
|
||||
oath_done();
|
||||
|
||||
result = [[NSString alloc] initWithBytesNoCopy: secret
|
||||
length: secret_len
|
||||
encoding: NSASCIIStringEncoding
|
||||
freeWhenDone: YES];
|
||||
|
||||
return [result autorelease];
|
||||
#else
|
||||
return nil;
|
||||
#endif
|
||||
}
|
||||
|
||||
- (NSString *) oldtotpKey
|
||||
{
|
||||
#if defined(MFA_CONFIG)
|
||||
//Was used before 5.12.5, is to not make obsolete totp profile set before
|
||||
NSString *key, *result;
|
||||
const char *s;
|
||||
char *secret;
|
||||
|
||||
size_t s_len, secret_len;
|
||||
|
||||
key = [[[self userSettings] userPrivateSalt] substringToIndex: 12];
|
||||
s = [key UTF8String];
|
||||
s_len = strlen(s);
|
||||
@@ -1371,7 +1415,7 @@ static const NSString *kEncryptedUserNamePrefix = @"uenc";
|
||||
return username;
|
||||
|
||||
cache = [SOGoCache sharedCache];
|
||||
cacheKey = [NSString stringWithFormat: @"%@_%@", kEncryptedUserNamePrefix, username];
|
||||
cacheKey = [NSString stringWithFormat: @"encrypted_%@",username];
|
||||
|
||||
exception = nil;
|
||||
tmp = nil;
|
||||
@@ -1402,11 +1446,14 @@ static const NSString *kEncryptedUserNamePrefix = @"uenc";
|
||||
NSString *tmp, *cacheKey;
|
||||
SOGoCache *cache;
|
||||
|
||||
if (![[SOGoSystemDefaults sharedSystemDefaults] isURLEncryptionEnabled] || [username isEqualToString: @"anonymous"] || [[request requestHandlerKey] isEqualToString:@"dav"])
|
||||
if (![[SOGoSystemDefaults sharedSystemDefaults] isURLEncryptionEnabled] ||
|
||||
[username isEqualToString: @"anonymous"] ||
|
||||
[[request requestHandlerKey] isEqualToString:@"dav"] ||
|
||||
[[request requestHandlerPath] hasSuffix: @"freebusy.ifb/ajaxRead"])
|
||||
return username;
|
||||
|
||||
cache = [SOGoCache sharedCache];
|
||||
cacheKey = [NSString stringWithFormat: @"%@_%@", kEncryptedUserNamePrefix, username];
|
||||
cacheKey = [NSString stringWithFormat: @"decrypted_%@", username];
|
||||
exception = nil;
|
||||
tmp = nil;
|
||||
|
||||
|
||||
@@ -35,6 +35,8 @@
|
||||
- (NSArray *) subscribedCalendars;
|
||||
- (NSArray *) subscribedAddressBooks;
|
||||
- (NSString *) userPrivateSalt;
|
||||
- (NSString *) userCurrentTotpKey: (bool) renew;
|
||||
- (void) setTotpKey: (NSString* ) newKey;
|
||||
- (NSString *) userPublicSalt;
|
||||
- (void)enableForceResetPassword;
|
||||
- (void)disableForceResetPassword;
|
||||
|
||||
@@ -116,6 +116,42 @@ static Class SOGoUserProfileKlass = Nil;
|
||||
return salt;
|
||||
}
|
||||
|
||||
- (NSString *) userCurrentTotpKey: (bool) renew
|
||||
{
|
||||
NSMutableDictionary *values;
|
||||
NSString *key;
|
||||
|
||||
key = [[self dictionaryForKey: @"General"] objectForKey: @"totpKey"];
|
||||
|
||||
if (!key || renew)
|
||||
{
|
||||
key = [[[[NSProcessInfo processInfo] globallyUniqueString] asSHA1String] substringToIndex: 20];
|
||||
values = [self objectForKey: @"General"];
|
||||
|
||||
if (!values)
|
||||
values = [NSMutableDictionary dictionary];
|
||||
|
||||
[values setObject: key forKey: @"totpKey"];
|
||||
[self setObject: values forKey: @"General"];
|
||||
[self synchronize];
|
||||
}
|
||||
|
||||
return key;
|
||||
}
|
||||
|
||||
- (void) setTotpKey: (NSString* ) newKey
|
||||
{
|
||||
NSMutableDictionary *values;
|
||||
values = [self objectForKey: @"General"];
|
||||
|
||||
if (!values)
|
||||
values = [NSMutableDictionary dictionary];
|
||||
|
||||
[values setObject: newKey forKey: @"totpKey"];
|
||||
[self setObject: values forKey: @"General"];
|
||||
[self synchronize];
|
||||
}
|
||||
|
||||
- (void) enableForceResetPassword
|
||||
{
|
||||
[self setObject: [NSNumber numberWithInt:1] forKey: @"ForceResetPassword"];
|
||||
|
||||
+42
-22
@@ -225,7 +225,7 @@
|
||||
*/
|
||||
- (NSString *) _encryptPassword: (NSString *) plainPassword
|
||||
{
|
||||
NSString *pass;
|
||||
NSString *pass, *passwordScheme;
|
||||
NSString* result;
|
||||
|
||||
pass = [plainPassword asCryptedPassUsingScheme: _userPasswordAlgorithm
|
||||
@@ -254,7 +254,7 @@
|
||||
return [self checkLogin: _login
|
||||
password: _pwd
|
||||
perr: _perr
|
||||
expire: _perr
|
||||
expire: _expire
|
||||
grace: _grace
|
||||
disablepasswordPolicyCheck: NO];
|
||||
}
|
||||
@@ -272,6 +272,7 @@
|
||||
grace: (int *) _grace
|
||||
disablepasswordPolicyCheck: (BOOL) _disablepasswordPolicyCheck
|
||||
{
|
||||
EOAdaptor *adaptor;
|
||||
EOAdaptorChannel *channel;
|
||||
EOQualifier *qualifier;
|
||||
GCSChannelManager *cm;
|
||||
@@ -281,11 +282,13 @@
|
||||
|
||||
rc = NO;
|
||||
|
||||
_login = [_login stringByReplacingString: @"'" withString: @"''"];
|
||||
cm = [GCSChannelManager defaultChannelManager];
|
||||
channel = [cm acquireOpenChannelForURL: _viewURL];
|
||||
if (channel)
|
||||
{
|
||||
EOAdaptorContext *adaptorCtx;
|
||||
adaptorCtx = [channel adaptorContext];
|
||||
adaptor = [adaptorCtx adaptor];
|
||||
if (_loginFields)
|
||||
{
|
||||
NSMutableArray *qualifiers;
|
||||
@@ -324,7 +327,8 @@
|
||||
nil];
|
||||
[qualifier autorelease];
|
||||
}
|
||||
[qualifier appendSQLToString: sql];
|
||||
[qualifier appendSQLToString: sql
|
||||
withAdaptor: adaptor];
|
||||
|
||||
ex = [channel evaluateExpressionX: sql];
|
||||
if (!ex)
|
||||
@@ -430,9 +434,11 @@
|
||||
{
|
||||
BOOL didChange, isOldPwdOk, isPolicyOk;
|
||||
EOAdaptorChannel *channel;
|
||||
EOAdaptor *adaptor;
|
||||
EOQualifier *qualifier_login, *qualifier_pwd;
|
||||
GCSChannelManager *cm;
|
||||
NSException *ex;
|
||||
NSString *sqlstr;
|
||||
NSMutableString *sqlstr;
|
||||
|
||||
*perr = -1;
|
||||
isOldPwdOk = NO;
|
||||
@@ -455,16 +461,27 @@
|
||||
return NO;
|
||||
|
||||
// Save new password
|
||||
login = [login stringByReplacingString: @"'" withString: @"''"];
|
||||
cm = [GCSChannelManager defaultChannelManager];
|
||||
channel = [cm acquireOpenChannelForURL: _viewURL];
|
||||
if (channel)
|
||||
{
|
||||
sqlstr = [NSString stringWithFormat: (@"UPDATE %@"
|
||||
@" SET c_password = '%@'"
|
||||
@" WHERE c_uid = '%@'"),
|
||||
[_viewURL gcsTableName], encryptedPassword, login];
|
||||
|
||||
EOAdaptorContext *adaptorCtx;
|
||||
adaptorCtx = [channel adaptorContext];
|
||||
adaptor = [adaptorCtx adaptor];
|
||||
sqlstr = [NSMutableString stringWithFormat: @"UPDATE %@ SET ",
|
||||
[_viewURL gcsTableName]];
|
||||
|
||||
qualifier_pwd = [[EOKeyValueQualifier alloc] initWithKey: @"c_password"
|
||||
operatorSelector: EOQualifierOperatorEqual
|
||||
value: encryptedPassword];
|
||||
[qualifier_pwd appendSQLToString: sqlstr
|
||||
withAdaptor: adaptor];
|
||||
[sqlstr appendString: @" WHERE "];
|
||||
qualifier_login = [[EOKeyValueQualifier alloc] initWithKey: @"c_uid"
|
||||
operatorSelector: EOQualifierOperatorEqual
|
||||
value: login];
|
||||
[qualifier_login appendSQLToString: sqlstr
|
||||
withAdaptor: adaptor];
|
||||
ex = [channel evaluateExpressionX: sqlstr];
|
||||
if (!ex)
|
||||
{
|
||||
@@ -998,7 +1015,9 @@
|
||||
inDomain: (NSString *)domain
|
||||
limit: (int)limit
|
||||
{
|
||||
EOAdaptor *adaptor;
|
||||
EOAdaptorChannel *channel;
|
||||
EOQualifier *qualifier;
|
||||
NSEnumerator *criteriaList;
|
||||
NSMutableArray *fields, *results;
|
||||
GCSChannelManager *cm;
|
||||
@@ -1014,12 +1033,14 @@
|
||||
channel = [cm acquireOpenChannelForURL: _viewURL];
|
||||
if (channel)
|
||||
{
|
||||
EOAdaptorContext *adaptorCtx;
|
||||
adaptorCtx = [channel adaptorContext];
|
||||
adaptor = [adaptorCtx adaptor];
|
||||
fields = [NSMutableArray array];
|
||||
if ([filter length])
|
||||
{
|
||||
lowerFilter = [filter lowercaseString];
|
||||
lowerFilter = [lowerFilter asSafeSQLLikeString];
|
||||
filterFormat = [NSString stringWithFormat: @"LOWER(%%@) LIKE '%%%%%@%%%%'", lowerFilter];
|
||||
filter = [[filter asSafeSQLString] stringByReplacingString: @"\%" withString: @"%%"];
|
||||
filterFormat = [NSString stringWithFormat: @"(%%@ isCaseInsensitiveLike: '*%@*')", filter];
|
||||
if (criteria)
|
||||
criteriaList = [criteria objectEnumerator];
|
||||
else
|
||||
@@ -1044,7 +1065,9 @@
|
||||
if ([fields count])
|
||||
{
|
||||
qs = [[[fields uniqueObjects] stringsWithFormat: filterFormat] componentsJoinedByString: @" OR "];
|
||||
[sql appendString: qs];
|
||||
qualifier = [EOQualifier qualifierWithQualifierFormat: qs];
|
||||
[qualifier appendSQLToString: sql
|
||||
withAdaptor: adaptor];
|
||||
}
|
||||
else
|
||||
[sql appendString: @"1 = 1"];
|
||||
@@ -1108,7 +1131,7 @@
|
||||
andSortOrdering: (EOSortOrdering *) ordering
|
||||
inDomain: (NSString *) domain
|
||||
{
|
||||
static EOAdaptor *adaptor = nil;
|
||||
EOAdaptor *adaptor;
|
||||
NSException *ex;
|
||||
NSMutableArray *results;
|
||||
NSMutableString *sql;
|
||||
@@ -1123,12 +1146,9 @@
|
||||
channel = [cm acquireOpenChannelForURL: _viewURL];
|
||||
if (channel)
|
||||
{
|
||||
if (!adaptor)
|
||||
{
|
||||
EOAdaptorContext *adaptorCtx;
|
||||
adaptorCtx = [channel adaptorContext];
|
||||
adaptor = [adaptorCtx adaptor];
|
||||
}
|
||||
EOAdaptorContext *adaptorCtx;
|
||||
adaptorCtx = [channel adaptorContext];
|
||||
adaptor = [adaptorCtx adaptor];
|
||||
sql = [NSMutableString stringWithFormat: @"SELECT c_name FROM %@ WHERE (", [_viewURL gcsTableName]];
|
||||
|
||||
if (qualifier)
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
"No resource" = "Cap recurs";
|
||||
"Any Authenticated User" = "Qualsevol usuari autenticat";
|
||||
"Public Access" = "Accés públic";
|
||||
"Save" = "Save";
|
||||
"Clear" = "Clear";
|
||||
"Message of the day" = "Message of the day";
|
||||
"Message of the day has been saved" = "Message of the day has been saved";
|
||||
"Save" = "Desar";
|
||||
"Clear" = "Esborrar";
|
||||
"Message of the day" = "Missatge del dia";
|
||||
"Message of the day has been saved" = "El missatge del dia s'ha desat";
|
||||
@@ -4,7 +4,7 @@
|
||||
"Close" = "Schließen";
|
||||
"Modules" = "Module";
|
||||
/* Modules short names */
|
||||
"ACLs" = "ACLs";
|
||||
"ACLs" = "Zugriffsrechte";
|
||||
/* Modules titles */
|
||||
"ACLs_title" = "Benutzerordner ACL-Management";
|
||||
/* Modules descriptions */
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
/* this file is in UTF-8 format! */
|
||||
|
||||
"Help" = "Help";
|
||||
"Close" = "Close";
|
||||
"Modules" = "Modules";
|
||||
/* Modules short names */
|
||||
"ACLs" = "ACLs";
|
||||
/* Modules titles */
|
||||
"ACLs_title" = "Users folders ACLs management";
|
||||
/* Modules descriptions */
|
||||
"ACLs_description" = "<p>The Access Control Lists administration module allows to change the ACLs of each user's Calendars and Address books.</p><p>To modify the ACLs of a user's folder, type the name of the user in the search field at the top of the window and double-click on the desired folder.</p>";
|
||||
"Name or Email" = "Name or Email";
|
||||
"ACLs saved" = "ACLs saved";
|
||||
/* Rights module: initial search message */
|
||||
"Start a search to edit the rights" = "Start a search to edit the rights";
|
||||
/* Rights module: Empty search result */
|
||||
"No matching user" = "No matching user";
|
||||
/* Rights module: no selection */
|
||||
"No resource selected" = "No resource selected";
|
||||
"Add User" = "Add User";
|
||||
"Subscribe User" = "Subscribe User";
|
||||
"Rights" = "Rights";
|
||||
"Search Users" = "Search Users";
|
||||
"users found" = "users found";
|
||||
"No resource" = "No resource";
|
||||
"Any Authenticated User" = "Any Authenticated User";
|
||||
"Public Access" = "Public Access";
|
||||
"Save" = "Save";
|
||||
"Clear" = "Clear";
|
||||
"Message of the day" = "Message of the day";
|
||||
"Message of the day has been saved" = "Message of the day has been saved";
|
||||
@@ -41,11 +41,11 @@
|
||||
= "Qualsevol usuari amb un compte en el sistema tindrà accés a la seua llibreta d'adreces \"%{0}\". Està segur de voler donar accés a qualsevol usuari en el sistema? ";
|
||||
"Give Access" = "Donar accés";
|
||||
"Keep Private" = "Mantenir en privat";
|
||||
"Expand" = "Expand";
|
||||
"Reduce" = "Reduce";
|
||||
"Expand" = "Expandir";
|
||||
"Reduce" = "Reduir";
|
||||
|
||||
/* tooltip */
|
||||
"Refresh" = "Refresh";
|
||||
"Refresh" = "Actualitzar";
|
||||
|
||||
/* generic.js */
|
||||
"Unable to subscribe to that folder!"
|
||||
@@ -109,7 +109,7 @@
|
||||
"Personal" = "Personal";
|
||||
"To Do" = "Per fer";
|
||||
"Later" = "Més tard";
|
||||
"Forwarded" = "Forwarded";
|
||||
"Forwarded" = "Reenviat";
|
||||
"Return Receipt Sent" = "Justificant de recepció enviat";
|
||||
"a2_Sunday" = "dg";
|
||||
"a2_Monday" = "dl";
|
||||
@@ -128,15 +128,15 @@
|
||||
"S/MIME Certificate" = "Certificat S/MIME";
|
||||
"Subject Name" = "Nom del subjecte";
|
||||
"Issuer" = "Emissor";
|
||||
"streetAddress" = "Street";
|
||||
"stateOrProvinceName" = "State or Province";
|
||||
"localityName" = "Locality";
|
||||
"streetAddress" = "Carrer";
|
||||
"stateOrProvinceName" = "Estat o Província";
|
||||
"localityName" = "Localitat";
|
||||
"countryName" = "País";
|
||||
"organizationName" = "Organització";
|
||||
"organizationalUnitName" = "Unitat organitzativa";
|
||||
"commonName" = "Nom comú";
|
||||
"surname" = "Surname";
|
||||
"givenName" = "Given Name";
|
||||
"surname" = "Cognoms";
|
||||
"givenName" = "Nom de pila";
|
||||
"emailAddress" = "Correu electrònic";
|
||||
|
||||
|
||||
@@ -227,16 +227,16 @@
|
||||
"Move forward" = "Avançar";
|
||||
|
||||
/* Password Recovery */
|
||||
"passwordRecovery_Disabled" = "Disabled";
|
||||
"passwordRecovery_SecretQuestion" = "Secret question";
|
||||
"passwordRecovery_SecretQuestion1" = "What is the name of your first pet ?";
|
||||
"passwordRecovery_SecretQuestion2" = "What was your first car ?";
|
||||
"passwordRecovery_SecretQuestion3" = "What is your favorite movie ?";
|
||||
"passwordRecovery_SecondaryEmail" = "Secondary E-mail";
|
||||
"passwordRecovery_Disabled" = "Desactivat";
|
||||
"passwordRecovery_SecretQuestion" = "Pregunta secreta";
|
||||
"passwordRecovery_SecretQuestion1" = "Quin és el nom de la teva primera mascota?";
|
||||
"passwordRecovery_SecretQuestion2" = "Quin va ser el teu primer cotxe?";
|
||||
"passwordRecovery_SecretQuestion3" = "Quina és la teva pel·lícula preferida?";
|
||||
"passwordRecovery_SecondaryEmail" = "Correu electrònic secundari";
|
||||
|
||||
/* Password */
|
||||
"POLICY_MIN_LOWERCASE_LETTER" = "Minimum of %{0} lowercase letter";
|
||||
"POLICY_MIN_UPPERCASE_LETTER" = "Minimum of %{0} uppercase letter";
|
||||
"POLICY_MIN_DIGIT" = "Minimum of %{0} digit";
|
||||
"POLICY_MIN_SPECIAL_SYMBOLS" = "Minimum of %{0} special symbols";
|
||||
"POLICY_MIN_LENGTH" = "Minimum length of %{0} characters";
|
||||
"POLICY_MIN_LOWERCASE_LETTER" = "Mínim de %{0} lletra minúscula";
|
||||
"POLICY_MIN_UPPERCASE_LETTER" = "Mínim de %{0} lletra majúscula";
|
||||
"POLICY_MIN_DIGIT" = "Mínim de %{0} dígit";
|
||||
"POLICY_MIN_SPECIAL_SYMBOLS" = "Mínim de %{0} símbols especials";
|
||||
"POLICY_MIN_LENGTH" = "Longitud mínima de %{0} caràcters";
|
||||
@@ -9,7 +9,7 @@
|
||||
"Address Book" = "Adressbuch";
|
||||
"Mail" = "E-Mail";
|
||||
"Preferences" = "Einstellungen";
|
||||
"Administration" = "Administration";
|
||||
"Administration" = "Verwaltung";
|
||||
"Disconnect" = "Beenden";
|
||||
"Toggle Menu" = "Menü umschalten";
|
||||
"Right Administration" = "Rechteadministration";
|
||||
@@ -197,10 +197,10 @@
|
||||
"key_right" = "→";
|
||||
|
||||
/* Shift and up arrow combo keys */
|
||||
"key_shift+up" = "shift + ↑";
|
||||
"key_shift+up" = "Umschalt + ↑";
|
||||
|
||||
/* Shift and down arrow combo keys */
|
||||
"key_shift+down" = "shift + ↓";
|
||||
"key_shift+down" = "Umschalt + ↓";
|
||||
|
||||
/* Backspace key */
|
||||
"key_backspace" = "⌫";
|
||||
|
||||
@@ -0,0 +1,242 @@
|
||||
/* this file is in UTF-8 format! */
|
||||
|
||||
/* toolbars */
|
||||
"Save" = "Αποθήκευση";
|
||||
"Close" = "Κλείσιμο";
|
||||
"Edit User Rights" = "Επεξεργασία Δικαιωμάτων Χρήστη";
|
||||
"Home" = "Αρχική";
|
||||
"Calendar" = "Ημερολόγιο";
|
||||
"Address Book" = "Επαφές";
|
||||
"Mail" = "Αλληλογραφία";
|
||||
"Preferences" = "Ρυθμίσεις";
|
||||
"Administration" = "Διαχείριση";
|
||||
"Disconnect" = "Αποσύνδεση";
|
||||
"Toggle Menu" = "Εναλλαγή Μενού";
|
||||
"Right Administration" = "Διαχείριση Δικαιωμάτων";
|
||||
"Log Console (dev.)" = "Κονσόλα Καταγραφής (dev.)";
|
||||
"User" = "Χρήστης";
|
||||
"Vacation message is enabled" = "Το μήνυμα απουσίας είναι ενεργοποιημένο";
|
||||
"Help" = "Βοήθεια";
|
||||
"noJavascriptError" = "Το SOGo απαιτεί JavaScript για να λειτουργήσει. Βεβαιωθείτε ότι αυτή η επιλογή είναι διαθέσιμη και ενεργοποιημένη στις ρυθμίσεις του προγράμματος περιήγησής σας.";
|
||||
"noJavascriptRetry" = "Επανάληψη";
|
||||
"Owner" = "Ιδιοκτήτης";
|
||||
"Publish the Free/Busy information" = "Δημοσίευση πληροφοριών Ελεύθερος/Απασχολημένος";
|
||||
"Add..." = "Προσθήκη...";
|
||||
"Remove" = "Αφαίρεση";
|
||||
"Subscribe User" = "Εγγραφή Χρήστη";
|
||||
"Any Authenticated User" = "Οποιοσδήποτε Πιστοποιημένος Χρήστης";
|
||||
"Public Access" = "Δημόσια Πρόσβαση";
|
||||
"Any user not listed above" = "Οποιοσδήποτε χρήστης δεν αναφέρεται παραπάνω";
|
||||
"Anybody accessing this resource from the public area" = "Οποιοσδήποτε που έχει πρόσβαση σε αυτόν τον πόρο από τη δημόσια περιοχή";
|
||||
"Sorry, the user rights can not be configured for that object." = "Λυπούμαστε, τα δικαιώματα χρήστη δεν μπορούν να ρυθμιστούν για αυτό το αντικείμενο.";
|
||||
"Any user with an account on this system will be able to access your mailbox \"%{0}\". Are you certain you trust them all?"
|
||||
= "Οποιοσδήποτε χρήστης με λογαριασμό σε αυτό το σύστημα θα μπορεί να έχει πρόσβαση στο γραμματοκιβώτιό σας \"%{0}\". Είστε βέβαιοι ότι τους εμπιστεύεστε όλους;";
|
||||
"Any user with an account on this system will be able to access your calendar \"%{0}\". Are you certain you trust them all?"
|
||||
= "Οποιοσδήποτε χρήστης με λογαριασμό σε αυτό το σύστημα θα μπορεί να έχει πρόσβαση στο ημερολόγιό σας \"%{0}\". Είστε βέβαιοι ότι τους εμπιστεύεστε όλους;";
|
||||
"Potentially anyone on the Internet will be able to access your calendar \"%{0}\", even if they do not have an account on this system. Is this information suitable for the public Internet?"
|
||||
= "Δυνητικά οποιοσδήποτε στο Διαδίκτυο θα μπορεί να έχει πρόσβαση στο ημερολόγιό σας \"%{0}\", ακόμα και αν δεν έχει λογαριασμό σε αυτό το σύστημα. Είναι αυτές οι πληροφορίες κατάλληλες για δημόσια δημοσίευση στο Διαδίκτυο;";
|
||||
"Any user with an account on this system will be able to access your address book \"%{0}\". Are you certain you trust them all?"
|
||||
= "Οποιοσδήποτε χρήστης με λογαριασμό σε αυτό το σύστημα θα μπορεί να έχει πρόσβαση στο βιβλίο διευθύνσεών σας \"%{0}\". Είστε βέβαιοι ότι τους εμπιστεύεστε όλους;";
|
||||
"Potentially anyone on the Internet will be able to access your address book \"%{0}\", even if they do not have an account on this system. Is this information suitable for the public Internet?"
|
||||
= "Δυνητικά οποιοσδήποτε στο Διαδίκτυο θα μπορεί να έχει πρόσβαση στο βιβλίο διευθύνσεών σας \"%{0}\", ακόμα και αν δεν έχει λογαριασμό σε αυτό το σύστημα. Είναι αυτές οι πληροφορίες κατάλληλες για δημόσια δημοσίευση στο Διαδίκτυο;";
|
||||
"Give Access" = "Παροχή Πρόσβασης";
|
||||
"Keep Private" = "Διατήρηση Ιδιωτικότητας";
|
||||
"Expand" = "Επέκταση";
|
||||
"Reduce" = "Σύμπτυξη";
|
||||
|
||||
/* tooltip */
|
||||
"Refresh" = "Ανανέωση";
|
||||
|
||||
/* generic.js */
|
||||
"Unable to subscribe to that folder!"
|
||||
= "Αδυναμία εγγραφής σε αυτόν τον φάκελο!";
|
||||
"You cannot subscribe to a folder that you own!"
|
||||
= "Δεν μπορείτε να εγγραφείτε σε φάκελο που σας ανήκει!";
|
||||
"Unable to unsubscribe from that folder!"
|
||||
= "Αδυναμία κατάργησης εγγραφής από αυτόν τον φάκελο!";
|
||||
"You cannot unsubscribe from a folder that you own!"
|
||||
= "Δεν μπορείτε να καταργήσετε την εγγραφή από φάκελο που σας ανήκει!";
|
||||
"Unable to rename that folder!" = "Αδυναμία μετονομασίας αυτού του φακέλου!";
|
||||
"You have already subscribed to that folder!"
|
||||
= "Έχετε ήδη εγγραφεί σε αυτόν τον φάκελο!";
|
||||
"The user rights cannot be edited for this object!"
|
||||
= "Τα δικαιώματα χρήστη δεν μπορούν να επεξεργαστούν για αυτό το αντικείμενο!";
|
||||
"A folder by that name already exists." = "Ένας φάκελος με αυτό το όνομα υπάρχει ήδη.";
|
||||
"You cannot create a list in a shared address book."
|
||||
= "Δεν μπορείτε να δημιουργήσετε λίστα σε κοινόχρηστο βιβλίο διευθύνσεων.";
|
||||
"Warning" = "Προειδοποίηση";
|
||||
"Can't contact server" = "Προέκυψε σφάλμα κατά την επικοινωνία με τον διακομιστή. Παρακαλούμε δοκιμάστε ξανά αργότερα.";
|
||||
"You are not allowed to access this module or this system. Please contact your system administrator."
|
||||
= "Δεν σας επιτρέπεται η πρόσβαση σε αυτήν την ενότητα ή σε αυτό το σύστημα. Επικοινωνήστε με τον διαχειριστή του συστήματος.";
|
||||
"You don't have the required privileges to perform the operation."
|
||||
= "Δεν έχετε τα απαιτούμενα δικαιώματα για να εκτελέσετε αυτήν την ενέργεια.";
|
||||
"noEmailForDelegation" = "Πρέπει να καθορίσετε τη διεύθυνση στην οποία θέλετε να αναθέσετε την πρόσκλησή σας.";
|
||||
"delegate is organizer" = "Ο αντιπρόσωπος είναι ο διοργανωτής. Παρακαλούμε καθορίστε διαφορετικό αντιπρόσωπο.";
|
||||
"delegate is a participant" = "Ο αντιπρόσωπος είναι ήδη συμμετέχων.";
|
||||
"delegate is a group" = "Η καθορισμένη διεύθυνση αντιστοιχεί σε ομάδα. Μπορείτε να αναθέσετε μόνο σε μοναδικό άτομο.";
|
||||
|
||||
/* common buttons */
|
||||
"OK" = "Εντάξει";
|
||||
"Cancel" = "Άκυρο";
|
||||
"Yes" = "Ναι";
|
||||
"No" = "Όχι";
|
||||
|
||||
/* generic messages */
|
||||
"Error" = "Σφάλμα";
|
||||
"Success" = "Επιτυχία";
|
||||
|
||||
/* confirmation dialog box */
|
||||
"Confirmation" = "Επιβεβαίωση";
|
||||
|
||||
/* alarms */
|
||||
"Reminder" = "Υπενθύμιση";
|
||||
"Start" = "Έναρξη";
|
||||
"Due Date" = "Ημερομηνία Λήξης";
|
||||
"Location" = "Τοποθεσία";
|
||||
"Snooze" = "Αναβολή";
|
||||
"Snooze for " = "Αναβολή για ";
|
||||
"5 minutes" = "5 λεπτά";
|
||||
"10 minutes" = "10 λεπτά";
|
||||
"15 minutes" = "15 λεπτά";
|
||||
"30 minutes" = "30 λεπτά";
|
||||
"45 minutes" = "45 λεπτά";
|
||||
"1 hour" = "1 ώρα";
|
||||
"1 day" = "1 ημέρα";
|
||||
|
||||
/* mail labels */
|
||||
"Important" = "Σημαντικό";
|
||||
"Work" = "Εργασία";
|
||||
"Personal" = "Προσωπικό";
|
||||
"To Do" = "Προς Εκτέλεση";
|
||||
"Later" = "Αργότερα";
|
||||
"Forwarded" = "Προωθήθηκε";
|
||||
"Return Receipt Sent" = "Απεστάλη Απόδειξη Παράδοσης";
|
||||
"a2_Sunday" = "Κυ";
|
||||
"a2_Monday" = "Δε";
|
||||
"a2_Tuesday" = "Τρ";
|
||||
"a2_Wednesday" = "Τε";
|
||||
"a2_Thursday" = "Πέ";
|
||||
"a2_Friday" = "Πα";
|
||||
"a2_Saturday" = "Σά";
|
||||
"Access Rights" = "Δικαιώματα Πρόσβασης";
|
||||
"Add User" = "Προσθήκη Χρήστη";
|
||||
"Loading" = "Φόρτωση";
|
||||
"No such user." = "Δεν υπάρχει τέτοιος χρήστης.";
|
||||
"You cannot (un)subscribe to a folder that you own!" = "Δεν μπορείτε να (απ)εγγραφείτε από φάκελο που σας ανήκει!";
|
||||
|
||||
/* SMIME Certificate field */
|
||||
"S/MIME Certificate" = "Πιστοποιητικό S/MIME";
|
||||
"Subject Name" = "Όνομα Υποκειμένου";
|
||||
"Issuer" = "Εκδότης";
|
||||
"streetAddress" = "Οδός";
|
||||
"stateOrProvinceName" = "Πολιτεία ή Νομός";
|
||||
"localityName" = "Πόλη";
|
||||
"countryName" = "Χώρα";
|
||||
"organizationName" = "Οργανισμός";
|
||||
"organizationalUnitName" = "Μονάδα Οργανισμού";
|
||||
"commonName" = "Κοινό Όνομα";
|
||||
"surname" = "Επίθετο";
|
||||
"givenName" = "Όνομα";
|
||||
"emailAddress" = "Διεύθυνση Email";
|
||||
|
||||
|
||||
/* Authentication username */
|
||||
"Username" = "Όνομα Χρήστη";
|
||||
|
||||
/* Authentication password */
|
||||
"Password" = "Κωδικός Πρόσβασης";
|
||||
|
||||
/* Authentication failed */
|
||||
"Wrong username or password." = "Λανθασμένο όνομα χρήστη ή κωδικός πρόσβασης.";
|
||||
|
||||
/* Error message displayed bellow search field when the search string has less than the required number of characters */
|
||||
"Enter at least %{minimumSearchLength} characters" = "Εισαγάγετε τουλάχιστον %{minimumSearchLength} χαρακτήρες";
|
||||
|
||||
/* Error message displayed when a file upload exceeds WOMaxUploadSize */
|
||||
"File size upload limit reached" = "Ξεπεράστηκε το όριο μεγέθους αρχείου για μεταφόρτωση";
|
||||
|
||||
/* Generic server error */
|
||||
"An error occured, please try again." = "Προέκυψε σφάλμα, παρακαλούμε δοκιμάστε ξανά.";
|
||||
|
||||
/* Open datepicker */
|
||||
"Open Calendar" = "Άνοιγμα Ημερολογίου";
|
||||
|
||||
/* Toggle visibility (ex: mail account in left navigation menu) */
|
||||
"Toggle visibility" = "Εναλλαγή ορατότητας";
|
||||
|
||||
"Keyboard Shortcuts" = "Συντομεύσεις Πληκτρολογίου";
|
||||
|
||||
/* Aria label for avatar button to select and unselect an item */
|
||||
"Toggle item" = "Εναλλαγή στοιχείου";
|
||||
|
||||
/* Toggle multiple items at the same time (hotkeys cheatsheet) */
|
||||
"Toggle range of items" = "Εναλλαγή εύρους στοιχείων";
|
||||
|
||||
/* Question mark shows list of hotkeys */
|
||||
"Show or hide this help" = "Εμφάνιση ή απόκρυψη αυτής της βοήθειας";
|
||||
|
||||
/* Space key */
|
||||
"key_space" = "διάστημα";
|
||||
|
||||
/* Delete key */
|
||||
"key_delete" = "delete";
|
||||
|
||||
/* Shift and space key */
|
||||
"key_shift+space" = "shift + διάστημα";
|
||||
|
||||
/* Up arrow key */
|
||||
"key_up" = "↑";
|
||||
|
||||
/* Down arrow key */
|
||||
"key_down" = "↓";
|
||||
|
||||
/* Left arrow key */
|
||||
"key_left" = "←";
|
||||
|
||||
/* Right arrow key */
|
||||
"key_right" = "→";
|
||||
|
||||
/* Shift and up arrow combo keys */
|
||||
"key_shift+up" = "shift + ↑";
|
||||
|
||||
/* Shift and down arrow combo keys */
|
||||
"key_shift+down" = "shift + ↓";
|
||||
|
||||
/* Backspace key */
|
||||
"key_backspace" = "⌫";
|
||||
|
||||
/* Hotkey to start a search */
|
||||
"hotkey_search" = "s";
|
||||
|
||||
/* Hotkey description to select next list item */
|
||||
"View next item" = "Προβολή επόμενου στοιχείου";
|
||||
|
||||
/* Hotkey description to select previous list item */
|
||||
"View previous item" = "Προβολή προηγούμενου στοιχείου";
|
||||
|
||||
/* Hotkey description to add next list item to selection */
|
||||
"Add next item to selection" = "Προσθήκη επόμενου στοιχείου στην επιλογή";
|
||||
|
||||
/* Hotkey description to add previous list item to selection */
|
||||
"Add previous item to selection" = "Προσθήκη προηγούμενου στοιχείου στην επιλογή";
|
||||
|
||||
/* Hotkey description to move backward in current view */
|
||||
"Move backward" = "Μετακίνηση προς τα πίσω";
|
||||
|
||||
/* Hotkey description to move forward in current view */
|
||||
"Move forward" = "Μετακίνηση προς τα εμπρός";
|
||||
|
||||
/* Password Recovery */
|
||||
"passwordRecovery_Disabled" = "Απενεργοποιημένο";
|
||||
"passwordRecovery_SecretQuestion" = "Μυστική ερώτηση";
|
||||
"passwordRecovery_SecretQuestion1" = "Ποιο είναι το όνομα του πρώτου σας κατοικίδιου;";
|
||||
"passwordRecovery_SecretQuestion2" = "Ποιο ήταν το πρώτο σας αυτοκίνητο;";
|
||||
"passwordRecovery_SecretQuestion3" = "Ποια είναι η αγαπημένη σας ταινία;";
|
||||
"passwordRecovery_SecondaryEmail" = "Δευτερεύον Email";
|
||||
|
||||
/* Password */
|
||||
"POLICY_MIN_LOWERCASE_LETTER" = "Τουλάχιστον %{0} πεζός χαρακτήρας";
|
||||
"POLICY_MIN_UPPERCASE_LETTER" = "Τουλάχιστον %{0} κεφαλαίος χαρακτήρας";
|
||||
"POLICY_MIN_DIGIT" = "Τουλάχιστον %{0} ψηφίο";
|
||||
"POLICY_MIN_SPECIAL_SYMBOLS" = "Τουλάχιστον %{0} ειδικός χαρακτήρας";
|
||||
"POLICY_MIN_LENGTH" = "Ελάχιστο μήκος %{0} χαρακτήρες";
|
||||
@@ -176,7 +176,7 @@
|
||||
"Show or hide this help" = "Pokaż lub ukryj tę podpowiedź";
|
||||
|
||||
/* Space key */
|
||||
"key_space" = "space";
|
||||
"key_space" = "spacja";
|
||||
|
||||
/* Delete key */
|
||||
"key_delete" = "delete";
|
||||
|
||||
@@ -176,13 +176,13 @@
|
||||
"Show or hide this help" = "Mostrar ou ocultar esta ajuda";
|
||||
|
||||
/* Space key */
|
||||
"key_space" = "space";
|
||||
"key_space" = "espaço";
|
||||
|
||||
/* Delete key */
|
||||
"key_delete" = "delete";
|
||||
|
||||
/* Shift and space key */
|
||||
"key_shift+space" = "shift + space";
|
||||
"key_shift+space" = "shift + espaço";
|
||||
|
||||
/* Up arrow key */
|
||||
"key_up" = "↑";
|
||||
|
||||
@@ -235,8 +235,8 @@
|
||||
"passwordRecovery_SecondaryEmail" = "Email secundario";
|
||||
|
||||
/* Password */
|
||||
"POLICY_MIN_LOWERCASE_LETTER" = "Minimum of %{0} lowercase letter";
|
||||
"POLICY_MIN_UPPERCASE_LETTER" = "Minimum of %{0} uppercase letter";
|
||||
"POLICY_MIN_DIGIT" = "Minimum of %{0} digit";
|
||||
"POLICY_MIN_SPECIAL_SYMBOLS" = "Minimum of %{0} special symbols";
|
||||
"POLICY_MIN_LENGTH" = "Minimum length of %{0} characters";
|
||||
"POLICY_MIN_LOWERCASE_LETTER" = "Mínimo de %{0} letra minúscula";
|
||||
"POLICY_MIN_UPPERCASE_LETTER" = "Mínimo de %{0} letra mayúscula";
|
||||
"POLICY_MIN_DIGIT" = "Mínimo de %{0} dígito";
|
||||
"POLICY_MIN_SPECIAL_SYMBOLS" = "Mínimo de %{0} símbolos especiales";
|
||||
"POLICY_MIN_LENGTH" = "Longitud mínima de %{0} caracteres";
|
||||
@@ -26,6 +26,8 @@
|
||||
#import <NGObjWeb/WORequest.h>
|
||||
#import <NGObjWeb/WOResponse.h>
|
||||
|
||||
#import <SOGo/SOGoUserManager.h>
|
||||
|
||||
#import <SoObjects/SOGo/SOGoContentObject.h>
|
||||
|
||||
#import <SOGo/NSDictionary+Utilities.h>
|
||||
@@ -34,6 +36,25 @@
|
||||
|
||||
@implementation UIxObjectActions
|
||||
|
||||
|
||||
- (BOOL) _checkUid: (NSString *) newUID
|
||||
{
|
||||
BOOL response;
|
||||
SOGoUserManager *um;
|
||||
response = NO;
|
||||
|
||||
if ([newUID length] > 0)
|
||||
{
|
||||
um = [SOGoUserManager sharedUserManager];
|
||||
if ([[um getEmailForUID: newUID] length] > 0)
|
||||
{
|
||||
response = YES;
|
||||
}
|
||||
}
|
||||
|
||||
return response;
|
||||
}
|
||||
|
||||
/**
|
||||
* @api {get} /so/:username/:folderPath/addUserInAcls?uid=:uid Add user to ACLs
|
||||
* @apiVersion 1.0.0
|
||||
@@ -49,8 +70,17 @@
|
||||
WOResponse *response;
|
||||
NSString *uid;
|
||||
unsigned int code;
|
||||
NSDictionary *jsonResponse;
|
||||
|
||||
uid = [[context request] formValueForKey: @"uid"];
|
||||
if(![self _checkUid: uid])
|
||||
{
|
||||
jsonResponse = [NSDictionary dictionaryWithObject: [self labelForKey: @"No such user."]
|
||||
forKey: @"message"];
|
||||
response = [self responseWithStatus: 403
|
||||
andString: [jsonResponse jsonRepresentation]];
|
||||
return response;
|
||||
}
|
||||
if ([[self clientObject] addUserInAcls: uid])
|
||||
code = 204;
|
||||
else
|
||||
@@ -77,8 +107,17 @@
|
||||
WOResponse *response;
|
||||
NSString *uid;
|
||||
unsigned int code;
|
||||
NSDictionary *jsonResponse;
|
||||
|
||||
uid = [[context request] formValueForKey: @"uid"];
|
||||
if(![self _checkUid: uid])
|
||||
{
|
||||
jsonResponse = [NSDictionary dictionaryWithObject: [self labelForKey: @"No such user."]
|
||||
forKey: @"message"];
|
||||
response = [self responseWithStatus: 403
|
||||
andString: [jsonResponse jsonRepresentation]];
|
||||
return response;
|
||||
}
|
||||
if ([[self clientObject] removeUserFromAcls: uid])
|
||||
code = 204;
|
||||
else
|
||||
|
||||
@@ -193,11 +193,11 @@
|
||||
"Work" = "Feina";
|
||||
"Mobile" = "Mòbil";
|
||||
"Pager" = "Cercapersones";
|
||||
"Download iOS - MacOS configuration profile" = "Download iOS - MacOS configuration profile";
|
||||
"Download iOS - MacOS configuration profile" = "Descarregar perfil de configuració iOS - MacOS";
|
||||
|
||||
/* categories */
|
||||
"contacts_category_labels" = "Colleague, Competitor, Customer, Friend, Family, Business Partner, Provider, Press, VIP";
|
||||
"New category" = "New category";
|
||||
"contacts_category_labels" = "Col·lega, Competidor, Client, Amic, Família, Soci, Proveïdor, Premsa, VIP";
|
||||
"New category" = "Nova categoria";
|
||||
|
||||
/* adresses */
|
||||
"Title" = "Títol";
|
||||
@@ -222,7 +222,7 @@
|
||||
"New Addressbook..." = "Nova llibreta d'adreces";
|
||||
"Subscribe to an Addressbook..." = "Subscribiure's a una llibreta...";
|
||||
"Remove the selected Addressbook" = "Esborrar la llibreta seleccionada";
|
||||
"Subscribe to a shared contact" = "Subscribe to a shared addressbook";
|
||||
"Subscribe to a shared contact" = "Subscriure's a una llibreta compartida";
|
||||
"Search User" = "Cerca usuari";
|
||||
"Name of the Address Book" = "Nom de la llibreta";
|
||||
"Are you sure you want to delete the selected address book?"
|
||||
@@ -351,7 +351,7 @@
|
||||
"Synchronization" = "Sincronització";
|
||||
"Synchronize" = "Sincronitzar";
|
||||
"Sucessfully subscribed to address book" = "S'ha subscrit correctament a la llibreta d'adreces";
|
||||
"A similar card already exists. Would you like to save it anyway?" = "A similar card already exists. Would you like to save it anyway?";
|
||||
"A similar card already exists. Would you like to save it anyway?" = "Ja existeix un contacte similar. Voleu desar-lo igualment?";
|
||||
|
||||
/* Aria label for scope of search on contacts */
|
||||
"Search scope" = " Abast de la cerca ";
|
||||
|
||||
@@ -285,7 +285,7 @@
|
||||
"Contacts" = "Kontakte";
|
||||
"Add" = "Hinzufügen";
|
||||
"Lists can't be moved or copied." = "Listen können nicht verschoben oder kopiert werden.";
|
||||
"Export" = "Export";
|
||||
"Export" = "Exportieren";
|
||||
"Export Address Book..." = "Adressbuch exportieren...";
|
||||
"View Raw Source" = "Rohen Quelltext anzeigen";
|
||||
|
||||
|
||||
@@ -0,0 +1,366 @@
|
||||
/* this file is in UTF-8 format! */
|
||||
|
||||
"Contact" = "Contact";
|
||||
"Address" = "Address";
|
||||
"Photos" = "Photos";
|
||||
"Other" = "Other";
|
||||
"Address Books" = "Address Books";
|
||||
"Addressbook" = "Addressbook";
|
||||
"Addresses" = "Addresses";
|
||||
"Update" = "Update";
|
||||
"Cancel" = "Cancel";
|
||||
"Common" = "Common";
|
||||
"Contact editor" = "Contact editor";
|
||||
"Contact viewer" = "Contact viewer";
|
||||
"Email" = "Email";
|
||||
"Screen Name" = "Screen Name";
|
||||
"Extended" = "Extended";
|
||||
"Fax" = "Fax";
|
||||
"Firstname" = "Firstname";
|
||||
"Home" = "Home";
|
||||
"HomePhone" = "HomePhone";
|
||||
"Lastname" = "Lastname";
|
||||
"Location" = "Location";
|
||||
"Add a category" = "Add a category";
|
||||
"MobilePhone" = "MobilePhone";
|
||||
"Name" = "Name";
|
||||
"OfficePhone" = "OfficePhone";
|
||||
"Organization" = "Organization";
|
||||
"Work Phone" = "Work Phone";
|
||||
"Cell" = "Cell";
|
||||
"Pager" = "Pager";
|
||||
"Pref" = "Pref";
|
||||
"Phone" = "Phone";
|
||||
"Phones" = "Phones";
|
||||
"Postal" = "Postal";
|
||||
"Save" = "Save";
|
||||
"Internet" = "Internet";
|
||||
"Unit" = "Unit";
|
||||
"delete" = "delete";
|
||||
"edit" = "edit";
|
||||
"invalidemailwarn" = "The specified email is invalid";
|
||||
"new" = "new";
|
||||
"Preferred Phone" = "Preferred Phone";
|
||||
"Move To" = "Move To";
|
||||
"Copy To" = "Copy To";
|
||||
"Add to" = "Add to";
|
||||
"To" = "To";
|
||||
"Carbon Copy (Cc)" = "Carbon Copy (Cc)";
|
||||
"Blind Carbon Copy (Bcc)" = "Blind Carbon Copy (Bcc)";
|
||||
|
||||
/* Search scope: name fields */
|
||||
"name" = "Name";
|
||||
|
||||
/* Search scope: name fields */
|
||||
"c_cn" = "Name";
|
||||
|
||||
/* Search scope: secondary email field */
|
||||
"mozillanickname" = "Secondary email";
|
||||
|
||||
/* Search scope: screen name field */
|
||||
"nsaimid" = "Screen name";
|
||||
|
||||
/* Search scope: mail fields */
|
||||
"mail" = "Mail";
|
||||
|
||||
/* Search scope: mail fields */
|
||||
"c_mail" = "Mail";
|
||||
|
||||
/* Search scope: telephone field */
|
||||
"telephonenumber" = "Telephone";
|
||||
|
||||
/* Search scope: telephone field */
|
||||
"homephone" = "Telephone";
|
||||
|
||||
/* Search scope: mobile field */
|
||||
"mobile" = "Mobile";
|
||||
|
||||
/* Search scope: fax field */
|
||||
"facsimiletelephonenumber" = "Fax";
|
||||
|
||||
/* Search scope: pager field */
|
||||
"pager" = "Pager";
|
||||
|
||||
/* Search scope: categories field */
|
||||
"c_categories" = "Categories";
|
||||
|
||||
/* Search scope: categories field */
|
||||
"vcardcategories" = "Categories";
|
||||
|
||||
/* Search scope: title field */
|
||||
"title" = "Title";
|
||||
|
||||
/* Search scope: organization field */
|
||||
"c_o" = "Organization";
|
||||
|
||||
/* Search scope: organization field */
|
||||
"o" = "Organization";
|
||||
|
||||
/* Search scope: department field */
|
||||
"ou" = "Department";
|
||||
|
||||
/* Search scope: city field */
|
||||
"l" = "City";
|
||||
|
||||
/* Search scope: country field */
|
||||
"c" = "Country";
|
||||
|
||||
/* Search scope: home address field */
|
||||
"mozillahomestreet" = "Home Address";
|
||||
|
||||
/* Search scope: state/province field */
|
||||
"st" = "State/Province";
|
||||
|
||||
/* Search scope: home state/province field */
|
||||
"mozillahomestate" = "Home State/Province";
|
||||
|
||||
/* Search scope: zip/postal code field */
|
||||
"postalCode" = "Zip/Postal Code";
|
||||
|
||||
/* Search scope: home zip/postal code field */
|
||||
"mozillahomepostalcode" = "Zip/Postal Code";
|
||||
|
||||
/* Search scope: home country field */
|
||||
"mozillahomecountryname" = "Home Country";
|
||||
|
||||
/* Search scope: home web page field */
|
||||
"mozillahomeurl" = "Home page";
|
||||
|
||||
/* Search scope: work web page field */
|
||||
"mozillaworkurl" = "Web page";
|
||||
|
||||
/* Search scope: note field */
|
||||
"description" = "Note";
|
||||
|
||||
/* Subheader of empty addressbook */
|
||||
"No contact" = "No contact";
|
||||
|
||||
/* Subheader of system addressbook */
|
||||
"Start a search to browse this address book" = "Start a search to browse this address book";
|
||||
|
||||
/* Number of contacts in addressbook; string is prefixed by number */
|
||||
"contacts" = "contacts";
|
||||
|
||||
/* No contact matching search criteria */
|
||||
"No matching contact" = "No matching contact";
|
||||
|
||||
/* Number of contacts matching search criteria; string is prefixed by number */
|
||||
"matching contacts" = "matching contacts";
|
||||
|
||||
/* Number of selected contacts in list */
|
||||
"selected" = "selected";
|
||||
|
||||
/* Empty right pane */
|
||||
"No contact selected" = "No contact selected";
|
||||
|
||||
/* Tooltips */
|
||||
"Create a new address book card" = "Create a new address book card";
|
||||
"Create a new list" = "Create a new list";
|
||||
"Edit the selected card" = "Edit the selected card";
|
||||
"Send a mail message" = "Send a mail message";
|
||||
"Delete selected card or address book" = "Delete selected card or address book";
|
||||
"Reload all contacts" = "Reload all contacts";
|
||||
"htmlMailFormat_UNKNOWN" = "Unknown";
|
||||
"htmlMailFormat_FALSE" = "Plain Text";
|
||||
"htmlMailFormat_TRUE" = "HTML";
|
||||
"Name or Email" = "Name or Email";
|
||||
"Category" = "Category";
|
||||
"Personal Addressbook" = "Personal Addressbook";
|
||||
"Search in Addressbook" = "Search in Addressbook";
|
||||
"New Card" = "New Card";
|
||||
"New List" = "New List";
|
||||
"Edit" = "Edit";
|
||||
"Properties" = "Properties";
|
||||
"Sharing..." = "Sharing...";
|
||||
"Write" = "Write";
|
||||
"Delete" = "Delete";
|
||||
"Instant Message" = "Instant Message";
|
||||
"Add..." = "Add...";
|
||||
"Remove" = "Remove";
|
||||
"Please wait..." = "Please wait...";
|
||||
"No possible subscription" = "No possible subscription";
|
||||
"Preferred" = "Preferred";
|
||||
"Display" = "Display";
|
||||
"Display Name" = "Display Name";
|
||||
"Additional Email" = "Additional Email";
|
||||
"Phone Number" = "Phone Number";
|
||||
"Prefers to receive messages formatted as" = "Prefers to receive messages formatted as";
|
||||
"Categories" = "Categories";
|
||||
"First" = "First";
|
||||
"Last" = "Last";
|
||||
"Nickname" = "Nickname";
|
||||
"Telephone" = "Telephone";
|
||||
"Work" = "Work";
|
||||
"Mobile" = "Mobile";
|
||||
"Pager" = "Pager";
|
||||
"Download iOS - MacOS configuration profile" = "Download iOS - MacOS configuration profile";
|
||||
|
||||
/* categories */
|
||||
"contacts_category_labels" = "Colleague, Competitor, Customer, Friend, Family, Business Partner, Provider, Press, VIP";
|
||||
"New category" = "New category";
|
||||
|
||||
/* adresses */
|
||||
"Title" = "Title";
|
||||
"Service" = "Service";
|
||||
"Company" = "Company";
|
||||
"Department" = "Department";
|
||||
"City" = "City ";
|
||||
"State_Province" = "State/Province";
|
||||
"ZIP_Postal Code" = "ZIP/Postal Code";
|
||||
"Country" = "Country";
|
||||
"Web Page" = "Web Page";
|
||||
"Other Infos" = "Other Infos";
|
||||
"Note" = "Note";
|
||||
"Timezone" = "Timezone";
|
||||
"Birthday" = "Birthday";
|
||||
"Birthday (yyyy-mm-dd)" = "Birthday (yyyy-mm-dd)";
|
||||
"Freebusy URL" = "Freebusy URL";
|
||||
"Add as..." = "Add as...";
|
||||
"Recipient" = "Recipient";
|
||||
"Carbon Copy" = "Carbon Copy";
|
||||
"Blind Carbon Copy" = "Blind Carbon Copy";
|
||||
"New Addressbook..." = "New Addressbook...";
|
||||
"Subscribe to an Addressbook..." = "Subscribe to an Addressbook...";
|
||||
"Remove the selected Addressbook" = "Remove the selected Addressbook";
|
||||
"Subscribe to a shared contact" = "Subscribe to a shared addressbook";
|
||||
"Search User" = "Search User";
|
||||
"Name of the Address Book" = "Name of the Address Book";
|
||||
"Are you sure you want to delete the selected address book?"
|
||||
= "Are you sure you want to delete the selected address book?";
|
||||
"Are you sure you want to delete the addressbook \"%{0}\"?"
|
||||
= "Are you sure you want to delete the addressbook \"%{0}\"?";
|
||||
"You cannot remove nor unsubscribe from a public addressbook."
|
||||
= "You cannot remove nor unsubscribe from a public addressbook.";
|
||||
"You cannot remove nor unsubscribe from your personal addressbook."
|
||||
= "You cannot remove nor unsubscribe from your personal addressbook.";
|
||||
"Are you sure you want to delete the selected contacts?"
|
||||
= "Are you sure you want to delete the selected contacts?";
|
||||
"Are you sure you want to delete the card of %{0}?" = "Are you sure you want to delete the card of %{0}?";
|
||||
"You cannot delete the card of \"%{0}\"."
|
||||
= "You cannot delete the card of \"%{0}\".";
|
||||
"You cannot subscribe to a folder that you own!"
|
||||
= "You cannot subscribe to a folder that you own.";
|
||||
"Unable to subscribe to that folder!"
|
||||
= "Unable to subscribe to that folder.";
|
||||
|
||||
/* security */
|
||||
"Security" = "Security";
|
||||
"Uninstall" = "Uninstall";
|
||||
"Error reading the card certificate." = "Error reading the card certificate.";
|
||||
"No certificate associated to card." = "No certificate associated to card.";
|
||||
|
||||
/* acls */
|
||||
"Access rights to" = "Access rights to";
|
||||
"For user" = "For user";
|
||||
"Any Authenticated User" = "Any Authenticated User";
|
||||
"Public Access" = "Public Access";
|
||||
"This person can add cards to this addressbook."
|
||||
= "This person can add cards to this addressbook.";
|
||||
"This person can edit the cards of this addressbook."
|
||||
= "This person can edit the cards of this addressbook.";
|
||||
"This person can list the content of this addressbook."
|
||||
= "This person can list the content of this addressbook.";
|
||||
"This person can read the cards of this addressbook."
|
||||
= "This person can read the cards of this addressbook.";
|
||||
"This person can erase cards from this addressbook."
|
||||
= "This person can erase cards from this addressbook.";
|
||||
"The selected contact has no email address."
|
||||
= "The selected contact has no email address.";
|
||||
"Please select a contact." = "Please select a contact.";
|
||||
|
||||
/* Messages for move and copy */
|
||||
"%{0} card(s) copied" = "%{0} card(s) copied";
|
||||
"%{0} card(s) moved" = "%{0} card(s) moved";
|
||||
"SoAccessDeniedException" = "You cannot write to this address book.";
|
||||
"Forbidden" = "Forbidden";
|
||||
"Invalid Contact" = "The selected contact no longer exists.";
|
||||
"Unknown Destination Folder" = "The chosen destination address book no longer exists.";
|
||||
|
||||
/* Lists */
|
||||
"List details" = "List details";
|
||||
"List name" = "List name";
|
||||
"List nickname" = "List nickname";
|
||||
"List description" = "List description";
|
||||
"Members" = "Members";
|
||||
"Contacts" = "Contacts";
|
||||
"Add" = "Add";
|
||||
"Lists can't be moved or copied." = "Lists can't be moved or copied.";
|
||||
"Export" = "Export";
|
||||
"Export Address Book..." = "Export Address Book...";
|
||||
"View Raw Source" = "View Raw Source";
|
||||
|
||||
/* Import */
|
||||
"Import Cards" = "Import Cards";
|
||||
"Select a vCard or LDIF file." = "Select a vCard or LDIF file.";
|
||||
"Upload" = "Upload";
|
||||
"Uploading" = "Uploading";
|
||||
"Done" = "Done";
|
||||
"An error occured while importing contacts." = "An error occured while importing contacts.";
|
||||
"No card was imported." = "No card was imported.";
|
||||
"A total of %{0} cards were imported in the addressbook." = "A total of %{0} cards were imported in the addressbook.";
|
||||
"Reload" = "Reload";
|
||||
|
||||
/* Properties window */
|
||||
"Address Book Name" = "Address Book Name";
|
||||
"Links to this Address Book" = "Links to this Address Book";
|
||||
"Authenticated User Access" = "Authenticated User Access";
|
||||
"CardDAV URL" = "CardDAV URL";
|
||||
"Options" = "Options";
|
||||
"Rename" = "Rename";
|
||||
"Subscriptions" = "Subscriptions";
|
||||
"Global Addressbooks" = "Global Addressbooks";
|
||||
"Search" = "Search";
|
||||
"Sort" = "Sort";
|
||||
"Descending Order" = "Descending Order";
|
||||
"Back" = "Back";
|
||||
"Select All" = "Select All";
|
||||
"Copy contacts" = "Copy contacts";
|
||||
"More messages options" = "More messages options";
|
||||
"New Contact" = "New Contact";
|
||||
"Close" = "Close";
|
||||
"More contact options" = "More contact options";
|
||||
"Organization Unit" = "Organization Unit";
|
||||
"Add Organizational Unit" = "Add Organizational Unit";
|
||||
"Type" = "Type";
|
||||
"Email Address" = "Email Address";
|
||||
"New Email Address" = "New Email Address";
|
||||
"New Phone Number" = "New Phone Number";
|
||||
"URL" = "URL";
|
||||
"New URL" = "New URL";
|
||||
"street" = "street";
|
||||
"street (continued)" = "street (continued)";
|
||||
"Postoffice" = "Postoffice";
|
||||
"Region" = "Region";
|
||||
"Postal Code" = "Postal Code";
|
||||
"New Address" = "New Address";
|
||||
"Reset" = "Reset";
|
||||
"Description" = "Description";
|
||||
"Add Member" = "Add Member";
|
||||
"Subscribe" = "Subscribe";
|
||||
"Add Birthday" = "Add Birthday";
|
||||
"Import" = "Import";
|
||||
"More options" = "More options";
|
||||
"Role" = "Role";
|
||||
"Add Screen Name" = "Add Screen Name";
|
||||
"Custom 1" = "Custom 1";
|
||||
"Custom 2" = "Custom 2";
|
||||
"Custom 3" = "Custom 3";
|
||||
"Custom 4" = "Custom 4";
|
||||
"Custom Value" = "Custom Value";
|
||||
"New Custom Value" = "New Custom Value";
|
||||
"Synchronization" = "Synchronization";
|
||||
"Synchronize" = "Synchronize";
|
||||
"Sucessfully subscribed to address book" = "Successfully subscribed to address book";
|
||||
"A similar card already exists. Would you like to save it anyway?" = "A similar card already exists. Would you like to save it anyway?";
|
||||
|
||||
/* Aria label for scope of search on contacts */
|
||||
"Search scope" = "Search scope";
|
||||
|
||||
/* Aria label for avatar button to select and unselect a card */
|
||||
"Toggle item" = "Toggle item";
|
||||
|
||||
/* Hotkey to create a new card */
|
||||
"key_create_card" = "c";
|
||||
|
||||
/* Hotkey to create a new list */
|
||||
"key_create_list" = "l";
|
||||
@@ -164,7 +164,7 @@
|
||||
"htmlMailFormat_FALSE" = "czysty tekst";
|
||||
"htmlMailFormat_TRUE" = "HTML";
|
||||
"Name or Email" = "Nazwa lub e-mail";
|
||||
"Category" = "Category";
|
||||
"Category" = "Kategoria";
|
||||
"Personal Addressbook" = "Osobista książka adresowa";
|
||||
"Search in Addressbook" = "Szukaj w książce adresowej";
|
||||
"New Card" = "Nowy kontakt";
|
||||
|
||||
@@ -304,11 +304,11 @@
|
||||
"Address Book Name" = "Nome do livro de endereços";
|
||||
"Links to this Address Book" = "Link para este livro de endereços";
|
||||
"Authenticated User Access" = "Acesso Utilizadores Autenticados";
|
||||
"CardDAV URL" = "CardDAV URL";
|
||||
"CardDAV URL" = "URL CardDAV";
|
||||
"Options" = "Opções";
|
||||
"Rename" = "Alterar nome";
|
||||
"Subscriptions" = "Subscrições";
|
||||
"Global Addressbooks" = "Livro de endereços de global";
|
||||
"Global Addressbooks" = "Livro de endereços global";
|
||||
"Search" = "Procurar";
|
||||
"Sort" = "Ordenar";
|
||||
"Descending Order" = "Ordem decrescente";
|
||||
|
||||
@@ -485,7 +485,7 @@ static Class SOGoContactGCSEntryK = Nil;
|
||||
co = [self clientObject];
|
||||
card = [co vCard];
|
||||
request = [context request];
|
||||
params = [[request contentAsString] objectFromJSONString];
|
||||
params = [[[request contentAsString] stringWithoutHTMLInjection: YES] objectFromJSONString];
|
||||
forceSave = [[params objectForKey: @"ignoreDuplicate"] boolValue];
|
||||
|
||||
[self setAttributes: params];
|
||||
|
||||
@@ -339,7 +339,7 @@
|
||||
[list retain];
|
||||
|
||||
request = [context request];
|
||||
params = [[request contentAsString] objectFromJSONString];
|
||||
params = [[[request contentAsString] stringWithoutHTMLInjection: YES] objectFromJSONString];
|
||||
|
||||
o = [params objectForKey: @"refs"];
|
||||
if (![o isKindOfClass: [NSArray class]])
|
||||
|
||||
@@ -24,7 +24,7 @@ request_info = "vous invite à une réunion.";
|
||||
"Update status" = "Intégrer les modifications";
|
||||
Accept = "Accepter";
|
||||
Decline = "Décliner";
|
||||
Tentative = "Tentatif";
|
||||
Tentative = "Tentative";
|
||||
"Delegate ..." = "Déléguer ...";
|
||||
"Delegated to" = "Délégué à";
|
||||
"Update status in calendar" = "Mettre l'agenda à jour";
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
ACCEPTED = "accepted";
|
||||
COMPLETED = "completed";
|
||||
DECLINED = "declined";
|
||||
DELEGATED = "delegated";
|
||||
"IN-PROCESS" = "in process";
|
||||
"NEEDS-ACTION" = "needs action";
|
||||
TENTATIVE = "tentative";
|
||||
organized_by_you = "organized by you";
|
||||
you_are_an_attendee = "you are an attendee";
|
||||
add_info_text = "iMIP 'ADD' requests are not yet supported by SOGo.";
|
||||
publish_info_text = "The sender informs you of the attached event.";
|
||||
cancel_info_text = "Your invitation or the whole event was canceled.";
|
||||
request_info_no_attendee = "is proposing a meeting to the attendees. You receive this mail as a notification, you are not scheduled as a participant.";
|
||||
Appointment = "Appointment";
|
||||
"Status Update" = "Status Update";
|
||||
was = "was";
|
||||
|
||||
Organizer = "Organizer";
|
||||
Time = "Time";
|
||||
Attendees = "Attendees";
|
||||
request_info = "invites you to participate in a meeting.";
|
||||
"Add to calendar" = "Add to calendar";
|
||||
"Delete from calendar" = "Delete from calendar";
|
||||
"Update status" = "Update status";
|
||||
Accept = "Accept";
|
||||
Decline = "Decline";
|
||||
Tentative = "Tentative";
|
||||
"Delegate ..." = "Delegate ...";
|
||||
"Delegated to" = "Delegated to";
|
||||
"Update status in calendar" = "Update status in calendar";
|
||||
"delegated from" = "delegated from";
|
||||
reply_info_no_attendee = "You received a reply to a scheduling event but the sender of the reply is not a participant.";
|
||||
reply_info = "This is a reply to an event invitation done by you.";
|
||||
"to" = "to";
|
||||
"Untitled" = "Untitled";
|
||||
"Size" = "Size";
|
||||
"Subject" = "Subject";
|
||||
"From" = "From";
|
||||
"Date" = "Date";
|
||||
"To" = "To";
|
||||
"Issuer" = "Issuer";
|
||||
/* Tooltips */
|
||||
"View Attachment" = "View Attachment";
|
||||
"Save Attachment" = "Save Attachment";
|
||||
"CC" = "CC";
|
||||
"Cancel" = "Cancel";
|
||||
"OK" = "OK";
|
||||
"Comment" = "Comment";
|
||||
"Description" = "Description";
|
||||
"Location" = "Location";
|
||||
@@ -938,7 +938,11 @@ static NSString *_sanitizeHtmlForDisplay(NSString *content)
|
||||
|
||||
- (NSString *) cssContent
|
||||
{
|
||||
NSString *cssContent, *css;
|
||||
NSString *cssContent, *css, *newResult;
|
||||
NSRegularExpression *regex;
|
||||
NSError *error;
|
||||
|
||||
error = nil;
|
||||
|
||||
if (!handler)
|
||||
[self _parseContent];
|
||||
@@ -950,6 +954,19 @@ static NSString *_sanitizeHtmlForDisplay(NSString *content)
|
||||
[handler css]];
|
||||
else
|
||||
cssContent = @"";
|
||||
|
||||
if([cssContent length])
|
||||
{
|
||||
regex = [NSRegularExpression regularExpressionWithPattern:@"margin-left\\s*:\\s*-[^;]+(\\s*!important)?"
|
||||
options: NSRegularExpressionCaseInsensitive error:&error];
|
||||
newResult = [regex stringByReplacingMatchesInString:cssContent options:0 range:NSMakeRange(0, [cssContent length]) withTemplate:@"margin-left: 0 !important"];
|
||||
cssContent = [NSString stringWithString: newResult];
|
||||
|
||||
regex = [NSRegularExpression regularExpressionWithPattern:@"margin-right\\s*:\\s*-[^;]+(\\s*!important)?"
|
||||
options: NSRegularExpressionCaseInsensitive error:&error];
|
||||
newResult = [regex stringByReplacingMatchesInString:cssContent options:0 range:NSMakeRange(0, [cssContent length]) withTemplate:@"margin-right: 0 !important"];
|
||||
cssContent = [NSString stringWithString: newResult];
|
||||
}
|
||||
|
||||
return cssContent;
|
||||
}
|
||||
@@ -1093,7 +1110,11 @@ static NSString *_sanitizeHtmlForDisplay(NSString *content)
|
||||
|
||||
- (NSString *) cssContent
|
||||
{
|
||||
NSString *cssContent, *css;
|
||||
NSString *cssContent, *css, *newResult;
|
||||
NSRegularExpression *regex;
|
||||
NSError *error;
|
||||
|
||||
error = nil;
|
||||
|
||||
if (!handler)
|
||||
[self _parseContent];
|
||||
@@ -1105,6 +1126,19 @@ static NSString *_sanitizeHtmlForDisplay(NSString *content)
|
||||
[handler css]];
|
||||
else
|
||||
cssContent = @"";
|
||||
|
||||
if([cssContent length])
|
||||
{
|
||||
regex = [NSRegularExpression regularExpressionWithPattern:@"margin-left\\s*:\\s*-[^;]+(\\s*!important)?"
|
||||
options: NSRegularExpressionCaseInsensitive error:&error];
|
||||
newResult = [regex stringByReplacingMatchesInString:cssContent options:0 range:NSMakeRange(0, [cssContent length]) withTemplate:@"margin-left: 0 !important"];
|
||||
cssContent = [NSString stringWithString: newResult];
|
||||
|
||||
regex = [NSRegularExpression regularExpressionWithPattern:@"margin-right\\s*:\\s*-[^;]+(\\s*!important)?"
|
||||
options: NSRegularExpressionCaseInsensitive error:&error];
|
||||
newResult = [regex stringByReplacingMatchesInString:cssContent options:0 range:NSMakeRange(0, [cssContent length]) withTemplate:@"margin-right: 0 !important"];
|
||||
cssContent = [NSString stringWithString: newResult];
|
||||
}
|
||||
|
||||
return cssContent;
|
||||
}
|
||||
|
||||
@@ -44,6 +44,7 @@
|
||||
#import <SOGo/SOGoUserFolder.h>
|
||||
#import <SOGo/SOGoUserDefaults.h>
|
||||
#import <SOGo/SOGoUserManager.h>
|
||||
#import <SOGo/NSString+Utilities.h>
|
||||
#import <Appointments/iCalEntityObject+SOGo.h>
|
||||
#import <Appointments/SOGoAppointmentFolder.h>
|
||||
#import <Appointments/SOGoAppointmentFolders.h>
|
||||
@@ -81,8 +82,7 @@
|
||||
{
|
||||
if (!inCalendar)
|
||||
{
|
||||
inCalendar
|
||||
= [iCalCalendar parseSingleFromSource: [self flatContentAsString]];
|
||||
inCalendar = [iCalCalendar parseSingleFromSource: [self flatContentAsString]];
|
||||
[inCalendar retain];
|
||||
}
|
||||
|
||||
@@ -583,7 +583,12 @@
|
||||
[[person partStatWithDefault] lowercaseString], @"partstat", nil]];
|
||||
}
|
||||
|
||||
[d setObject: a forKey: @"participants"];
|
||||
[d setObject: a forKey: @"participants"];
|
||||
|
||||
//Sanitise the html content
|
||||
if([d objectForKey:@"content"]){
|
||||
[d setObject: [[d objectForKey:@"content"] stringWithoutHTMLInjection: NO] forKey: @"content"];
|
||||
}
|
||||
|
||||
return d;
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
/* Icon's label */
|
||||
"Create" = "Redactar";
|
||||
"Empty Trash" = "Buidar paperera";
|
||||
"Empty Junk Folder" = "Empty Junk Folder";
|
||||
"Empty Junk Folder" = "Buidar carpeta de correu brossa";
|
||||
"Delete" = "Esborrar";
|
||||
"Expunge" = "Compactar";
|
||||
"Forward" = "Reenviar";
|
||||
@@ -79,7 +79,7 @@
|
||||
"Folder compacted" = "carpeta compactada";
|
||||
|
||||
/* Empty Junk Folder success message */
|
||||
"Junk folder emptied" = "Junk folder emptied";
|
||||
"Junk folder emptied" = "S'ha buidat la carpeta de correu brossa";
|
||||
|
||||
/* Empty Trash success message */
|
||||
"Trash emptied" = "S'ha buidat la paperera";
|
||||
@@ -88,7 +88,7 @@
|
||||
"Access rights to" = "Drets d'accés a";
|
||||
"For user" = "Per a l'usuari";
|
||||
"Any Authenticated User" = "Qualsevol usuari autenticat";
|
||||
"View this folder" = "View this folder";
|
||||
"View this folder" = "Veure aquesta carpeta";
|
||||
"Read mails from this folder" = "Llegir corrreu d'aquesta carpeta";
|
||||
"Mark mails read and unread" = "Marcar correus com a llegits o no llegits";
|
||||
"Modify the flags of the mails in this folder" = "Modificar les marques dels correus en aquesta carpeta";
|
||||
@@ -143,23 +143,23 @@
|
||||
"This mail is being sent from an unsecure network!" = "Aquest missatge s'envia des d'una xarxa no segura.";
|
||||
"Address Book" = "Llibreta d'adreces";
|
||||
"Search For" = "Cercar";
|
||||
"Contains" = "Contains";
|
||||
"Does not contains" = "Does not contains";
|
||||
"Advanced search" = "Advanced search";
|
||||
"Anytime" = "Anytime";
|
||||
"Last 7 days" = "Last 7 days";
|
||||
"Last 30 days" = "Last 30 days";
|
||||
"Last 6 month" = "Last 6 month";
|
||||
"Before" = "Before";
|
||||
"After" = "After";
|
||||
"Between" = "Between";
|
||||
"and" = "and";
|
||||
"With attachments" = "With attachments";
|
||||
"In favorites" = "In favorites";
|
||||
"Unseen only" = "Unseen only";
|
||||
"Show more" = "Show more";
|
||||
"Reset" = "Reset";
|
||||
"Message size" = "Message size";
|
||||
"Contains" = "Conté";
|
||||
"Does not contains" = "No conté";
|
||||
"Advanced search" = "Cerca avançada";
|
||||
"Anytime" = "Qualsevol moment";
|
||||
"Last 7 days" = "Últims 7 dies";
|
||||
"Last 30 days" = "Últims 30 dies";
|
||||
"Last 6 month" = "Últims 6 mesos";
|
||||
"Before" = "Abans de";
|
||||
"After" = "Després de";
|
||||
"Between" = "Entre";
|
||||
"and" = "i";
|
||||
"With attachments" = "Amb adjunts";
|
||||
"In favorites" = "Als preferits";
|
||||
"Unseen only" = "Només no llegits";
|
||||
"Show more" = "Mostrar més";
|
||||
"Reset" = "Restablir";
|
||||
"Message size" = "Mida del missatge";
|
||||
|
||||
/* Popup "show" */
|
||||
"all" = "tot";
|
||||
@@ -171,7 +171,7 @@
|
||||
/* MailListView */
|
||||
"Sender" = "Remitent";
|
||||
"Subject or Sender" = "Assumpte o remitent";
|
||||
"Subject or Recipient" = "Subject or Recipient";
|
||||
"Subject or Recipient" = "Assumpte o destinatari";
|
||||
"To or Cc" = "Per a o CC";
|
||||
"Entire Message" = "Missatge complet";
|
||||
"Date" = "Data";
|
||||
@@ -191,13 +191,13 @@
|
||||
"Untitled" = "Sense títol";
|
||||
|
||||
/* Filter option in messages list */
|
||||
"Show unread messages only" = "Show unread messages only";
|
||||
"Show unread messages only" = "Mostrar només missatges no llegits";
|
||||
|
||||
/* Filter option in messages list */
|
||||
"Show flagged messages only" = "Show flagged messages only";
|
||||
"Show flagged messages only" = "Mostrar només missatges marcats";
|
||||
|
||||
/* Aria label for icon of labels */
|
||||
"Filtered by label" = "Filtered by label";
|
||||
"Filtered by label" = "Filtrat per etiqueta";
|
||||
|
||||
/* Tree */
|
||||
"SentFolderName" = "Enviats";
|
||||
@@ -205,7 +205,7 @@
|
||||
"InboxFolderName" = "Safata d'entrada";
|
||||
"DraftsFolderName" = "Esborranys";
|
||||
"JunkFolderName" = "Correu brossa";
|
||||
"TemplatesFolderName" = "Templates";
|
||||
"TemplatesFolderName" = "Plantilles";
|
||||
"SieveFolderName" = "Filtres";
|
||||
"Folders" = "Carpetes"; /* title line */
|
||||
|
||||
@@ -257,7 +257,7 @@
|
||||
"Save As..." = "Desar com a...";
|
||||
"Print Preview" = "Vista preliminar";
|
||||
"View Message Source" = "Veure format original del missatge";
|
||||
"View raw message" = "View raw message";
|
||||
"View raw message" = "Veure missatge sense format";
|
||||
|
||||
/* Message view "more" menu: create an event from message */
|
||||
"Convert To Event" = "Converteix a esdeveniment";
|
||||
@@ -266,10 +266,10 @@
|
||||
"Convert To Task" = "Converteix a tasca";
|
||||
|
||||
/* Message view "more" menu: download message as an eml file */
|
||||
"Download message" = "Download message";
|
||||
"Download message" = "Descarregar missatge";
|
||||
|
||||
/* Message view "more" menu: download message as a zip archive */
|
||||
"Download message (zip)" = "Download message (zip)";
|
||||
"Download message (zip)" = "Descarregar missatge (zip)";
|
||||
|
||||
/* Message view "more" menu: download all attachments as a zip archive */
|
||||
"Download all attachments" = "Descarrega tots els adjunts";
|
||||
@@ -317,16 +317,16 @@
|
||||
"No certificate associated to account." = "No hi ha cap certificat associat al compte.";
|
||||
|
||||
/* Invalid S/MIME signature */
|
||||
"Digital signature is not valid" = "Digital signature is not valid";
|
||||
"Digital signature is not valid" = "La signatura digital no és vàlida";
|
||||
|
||||
/* Valid S/MIME signature */
|
||||
"Message is signed" = "Message is signed";
|
||||
"Message is signed" = "El missatge està signat";
|
||||
|
||||
/* Valid S/MIME signature but common name not found */
|
||||
"Message is signed but the certificate doesn't match the sender email address" = "Message is signed but the certificate doesn't match the sender email address";
|
||||
"Message is signed but the certificate doesn't match the sender email address" = "El missatge està signat però el certificat no coincideix amb l'adreça de correu del remitent";
|
||||
|
||||
/* Unknown error while validating message signature */
|
||||
"Digital signature is not valid" = "Digital signature is not valid";
|
||||
"Digital signature is not valid" = "La signatura digital no és vàlida";
|
||||
|
||||
"This Folder" = "Aquesta carpeta";
|
||||
|
||||
@@ -410,10 +410,10 @@
|
||||
"Error while saving the draft" = "Error en guardar l'esborrany";
|
||||
|
||||
/* Error when emptying trash */
|
||||
"Unable to empty the trash folder." = "Unable to empty the trash folder.";
|
||||
"Unable to empty the trash folder." = "No s'ha pogut buidar la paperera.";
|
||||
|
||||
/* Error when emptying junk folder */
|
||||
"Unable to empty the junk folder." = "Unable to empty the junk folder.";
|
||||
"Unable to empty the junk folder." = "No s'ha pogut buidar la carpeta de correu brossa.";
|
||||
|
||||
/* Error when uploading a file attachment */
|
||||
"Error while uploading the file \"%{0}\":" = "Error en carregar el fitxer \"%{0}\":";
|
||||
@@ -429,9 +429,9 @@
|
||||
"cannot send message: (smtp) all recipients discarded" = "No s'ha pogut enviar el missatge: tots els destinataris són incorrectes.";
|
||||
"cannot send message (smtp) - recipients discarded" = "No s'ha pogut enviar el missatge. Les següents adreces són incorrectes";
|
||||
"cannot send message: (smtp) error when connecting" = "No s'ha pogut enviar el missatge. Error al connectar amb el servidor SMTP.";
|
||||
"cannot sign email without certificate" = "The message can't be signed because there's no certificate associated to the mail account.";
|
||||
"cannot sign message because the certificate can't be read" = "The message can't be signed becasue the certificate associated to the mail account can't be read.";
|
||||
"cannot sign message because the certificate doesn't include the specified sender address" = "The message can't be signed because the sender address is not included in the certificate associated to the mail account.";
|
||||
"cannot sign email without certificate" = "El missatge no es pot signar perquè no hi ha cap certificat associat al compte de correu.";
|
||||
"cannot sign message because the certificate can't be read" = "El missatge no es pot signar perquè no es pot llegir el certificat associat al compte de correu.";
|
||||
"cannot sign message because the certificate doesn't include the specified sender address" = "El missatge no es pot signar perquè l'adreça del remitent no està inclosa al certificat associat al compte de correu.";
|
||||
|
||||
/* Contacts list in mail editor */
|
||||
"Email" = "Correu electrònic";
|
||||
@@ -452,7 +452,7 @@
|
||||
"Set as Trash" = "Establir com a Paperera";
|
||||
|
||||
/* Set the folder as the one holding the Templates */
|
||||
"Set as Templates" = "Set as Templates";
|
||||
"Set as Templates" = "Establir com a Plantilles";
|
||||
|
||||
/* Set the folder as the one holding Junk mails */
|
||||
"Set as Junk" = "Estableix com a correu brossa";
|
||||
@@ -464,7 +464,7 @@
|
||||
"Copy messages" = "Copiar els missatges";
|
||||
"More messages options" = "Més opcions de missatges";
|
||||
"Flag" = "Afegir estrella";
|
||||
"Unflag" = "Unflag";
|
||||
"Unflag" = "Treure estrella";
|
||||
"Mark as Unread" = "Marca com a no llegit";
|
||||
"Mark as Read" = "Marca com a llegit";
|
||||
"Closing Window ..." = "Tancant la finestra ...";
|
||||
@@ -478,10 +478,10 @@
|
||||
"Your email has been sent" = "El teu email s'ha enviat";
|
||||
"Folder compacted" = "carpeta compactada";
|
||||
|
||||
"More Options" = "More Options";
|
||||
"More Options" = "Més opcions";
|
||||
|
||||
"New draft" = "New draft";
|
||||
"Create new draft with this template" = "Create new draft with this template";
|
||||
"New draft" = "Nou esborrany";
|
||||
"Create new draft with this template" = "Crear nou esborrany amb aquesta plantilla";
|
||||
|
||||
/* Advanced search */
|
||||
"Enter Subject" = "Introduïu l'Assumpte";
|
||||
@@ -517,16 +517,16 @@
|
||||
"hotkey_forward" = "f";
|
||||
|
||||
/* Email deletion */
|
||||
"Clean folder" = "Clean folder";
|
||||
"Clean mailbox" = "Clean mailbox";
|
||||
"Delete permanently (do not use trash)" = "Delete permanently (do not use trash)";
|
||||
"Apply to subfolders" = "Apply to subfolders";
|
||||
"Delete e-mails older than" = "Delete e-mails older than";
|
||||
"3 months" = "3 months";
|
||||
"6 months" = "6 months";
|
||||
"9 months" = "9 months";
|
||||
"1 year" = "1 year";
|
||||
"Custom" = "Custom";
|
||||
"You are about to permanently delete some messages. Are you sure you want to proceed with this action?" = "You are about to permanently delete some messages. Are you sure you want to proceed with this action?";
|
||||
"Apply" = "Apply";
|
||||
"%{0} message(s) deleted" = "%{0} message(s) deleted";
|
||||
"Clean folder" = "Netejar carpeta";
|
||||
"Clean mailbox" = "Netejar bústia";
|
||||
"Delete permanently (do not use trash)" = "Esborrar permanentment (sense paperera)";
|
||||
"Apply to subfolders" = "Aplicar a subcarpetes";
|
||||
"Delete e-mails older than" = "Esborrar correus més antics de";
|
||||
"3 months" = "3 mesos";
|
||||
"6 months" = "6 mesos";
|
||||
"9 months" = "9 mesos";
|
||||
"1 year" = "1 any";
|
||||
"Custom" = "Personalitzat";
|
||||
"You are about to permanently delete some messages. Are you sure you want to proceed with this action?" = "Esteu a punt d'esborrar permanentment alguns missatges. Esteu segur que voleu continuar amb aquesta acció?";
|
||||
"Apply" = "Aplicar";
|
||||
"%{0} message(s) deleted" = "%{0} missatge(s) esborrat(s)";
|
||||
@@ -5,7 +5,7 @@
|
||||
"Empty Trash" = "Papierkorb leeren";
|
||||
"Empty Junk Folder" = "Spam-Ordner leeren";
|
||||
"Delete" = "Löschen";
|
||||
"Expunge" = "Expunge";
|
||||
"Expunge" = "Komprimieren";
|
||||
"Forward" = "Weiterleiten";
|
||||
"Get Mail" = "Abrufen";
|
||||
"Junk" = "Spam";
|
||||
@@ -360,7 +360,7 @@
|
||||
"Do you really want to move this folder into the trash ?"
|
||||
= "Wollen Sie diesen Ordner wirklich in den Papierkorb verschieben?";
|
||||
"Operation failed" = "Operation fehlgeschlagen.";
|
||||
"Quota" = "Quota:";
|
||||
"Quota" = "Speicherplatz:";
|
||||
"quotasFormat" = "%{0}% von %{1} MB verwendet";
|
||||
"messageQuotasFormat" = "%{0}% von %{1} Nachrichten";
|
||||
"Unable to move/delete folder." = "Kann den Ordner nicht verschieben/löschen.";
|
||||
|
||||
@@ -0,0 +1,532 @@
|
||||
/* this file is in UTF-8 format! */
|
||||
|
||||
/* Icon's label */
|
||||
"Create" = "Create";
|
||||
"Empty Trash" = "Empty Trash";
|
||||
"Empty Junk Folder" = "Empty Junk Folder";
|
||||
"Delete" = "Delete";
|
||||
"Expunge" = "Expunge";
|
||||
"Forward" = "Forward";
|
||||
"Get Mail" = "Get Mail";
|
||||
"Junk" = "Junk";
|
||||
"Not junk" = "Not junk";
|
||||
"Reply" = "Reply";
|
||||
"Reply All" = "Reply All";
|
||||
"Print" = "Print";
|
||||
"Stop" = "Stop";
|
||||
"Write" = "Write";
|
||||
"Search" = "Search";
|
||||
"Send" = "Send";
|
||||
"Contacts" = "Contacts";
|
||||
"Attach" = "Attach";
|
||||
"Save" = "Save";
|
||||
"Options" = "Options";
|
||||
"Close" = "Close";
|
||||
"Size" = "Size";
|
||||
|
||||
/* Tooltips */
|
||||
"Send this message now" = "Send this message now";
|
||||
"Select a recipient from an Address Book" = "Select a recipient from an Address Book";
|
||||
"Include an attachment" = "Include an attachment";
|
||||
"Save this message" = "Save this message";
|
||||
"Get new messages" = "Get new messages";
|
||||
"Create a new message" = "Create a new message";
|
||||
"Go to address book" = "Go to address book";
|
||||
"Reply to the message" = "Reply to the message";
|
||||
"Reply to sender and all recipients" = "Reply to sender and all recipients";
|
||||
"Forward selected message" = "Forward selected message";
|
||||
"Delete selected message or folder" = "Delete selected message or folder";
|
||||
"Print this message" = "Print this message";
|
||||
"Stop the current transfer" = "Stop the current transfer";
|
||||
"Attachment" = "Attachment";
|
||||
"Unread" = "Unread";
|
||||
"Flagged" = "Flagged";
|
||||
"Search multiple mailboxes" = "Search multiple mailboxes";
|
||||
|
||||
/* Main Frame */
|
||||
"Home" = "Home";
|
||||
"Calendar" = "Calendar";
|
||||
"Addressbook" = "Address Book";
|
||||
"Mail" = "Mail";
|
||||
"Right Administration" = "Right Administration";
|
||||
"Help" = "Help";
|
||||
|
||||
/* Mail account main windows */
|
||||
"Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!";
|
||||
"Read messages" = "Read messages";
|
||||
|
||||
/* Tooltip for fab button */
|
||||
"Write a new message" = "Write a new message";
|
||||
|
||||
/* Tooltip for fab button */
|
||||
"Write a message in new window" = "Write a message in new window";
|
||||
|
||||
"Share" = "Share";
|
||||
"Account" = "Account";
|
||||
"Shared Account" = "Shared Account";
|
||||
|
||||
/* A mailbox is selected, but no message (only shown on large screens) */
|
||||
"No message selected" = "No message selected";
|
||||
|
||||
/* No mailbox is selected (usually resulting from an IMAP connection problem) */
|
||||
"No mailbox selected" = "No mailbox selected";
|
||||
|
||||
"An error occured while communicating with the mail server" = "An error occured while communicating with the mail server";
|
||||
|
||||
/* Mailbox actions */
|
||||
|
||||
/* Compact Folder success message */
|
||||
"Folder compacted" = "Folder compacted";
|
||||
|
||||
/* Empty Junk Folder success message */
|
||||
"Junk folder emptied" = "Junk folder emptied";
|
||||
|
||||
/* Empty Trash success message */
|
||||
"Trash emptied" = "Trash emptied";
|
||||
|
||||
/* acls */
|
||||
"Access rights to" = "Access rights to";
|
||||
"For user" = "For user";
|
||||
"Any Authenticated User" = "Any Authenticated User";
|
||||
"View this folder" = "View this folder";
|
||||
"Read mails from this folder" = "Read mails from this folder";
|
||||
"Mark mails read and unread" = "Mark mails read and unread";
|
||||
"Modify the flags of the mails in this folder" = "Modify the flags of the mails in this folder";
|
||||
"Insert, copy and move mails into this folder" = "Insert, copy and move mails into this folder";
|
||||
"Post mails" = "Post mails";
|
||||
"Add subfolders to this folder" = "Add subfolders to this folder";
|
||||
"Remove this folder" = "Remove this folder";
|
||||
"Erase mails from this folder" = "Erase mails from this folder";
|
||||
"Expunge this folder" = "Expunge this folder";
|
||||
"Export This Folder" = "Export This Folder";
|
||||
"Modify the acl of this folder" = "Modify the acl of this folder";
|
||||
"Saved Messages.zip" = "Saved Messages.zip";
|
||||
"Update" = "Update";
|
||||
"Cancel" = "Cancel";
|
||||
|
||||
/* Mail edition */
|
||||
"From" = "From";
|
||||
"Subject" = "Subject";
|
||||
"To" = "To";
|
||||
"Cc" = "Cc";
|
||||
"Bcc" = "Bcc";
|
||||
"Reply-To" = "Reply-To";
|
||||
"Add address" = "Add address";
|
||||
"Body" = "Body";
|
||||
"Open" = "Open";
|
||||
"Select All" = "Select All";
|
||||
"Select Message" = "Select Message";
|
||||
"Attach Web Page..." = "Attach Web Page...";
|
||||
"file" = "file";
|
||||
"files" = "files";
|
||||
"Save all" = "Save all";
|
||||
"to" = "To";
|
||||
"cc" = "Cc";
|
||||
"bcc" = "Bcc";
|
||||
"Add a recipient" = "Add a recipient";
|
||||
"Edit Draft..." = "Edit Draft...";
|
||||
"Load Images" = "Load Images";
|
||||
"Return Receipt" = "Return Receipt";
|
||||
"Choose which identity to send this message from" = "Choose which identity to send this message from";
|
||||
"The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "The sender of this message has asked to be notified when you read this message. Do you wish to notify the sender?";
|
||||
"Return Receipt (displayed) - %@"= "Return Receipt (displayed) - %@";
|
||||
"This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents.";
|
||||
"Security" = "Security";
|
||||
"Sign" = "Sign";
|
||||
"Encrypt" = "Encrypt";
|
||||
"Priority" = "Priority";
|
||||
"highest" = "Highest";
|
||||
"high" = "High";
|
||||
"normal" = "Normal";
|
||||
"low" = "Low";
|
||||
"lowest" = "Lowest";
|
||||
"This mail is being sent from an unsecure network!" = "This mail is being sent from an unsecure network!";
|
||||
"Address Book" = "Address Book";
|
||||
"Search For" = "Search For";
|
||||
"Contains" = "Contains";
|
||||
"Does not contains" = "Does not contains";
|
||||
"Advanced search" = "Advanced search";
|
||||
"Anytime" = "Anytime";
|
||||
"Last 7 days" = "Last 7 days";
|
||||
"Last 30 days" = "Last 30 days";
|
||||
"Last 6 month" = "Last 6 month";
|
||||
"Before" = "Before";
|
||||
"After" = "After";
|
||||
"Between" = "Between";
|
||||
"and" = "and";
|
||||
"With attachments" = "With attachments";
|
||||
"In favorites" = "In favorites";
|
||||
"Unseen only" = "Unseen only";
|
||||
"Show more" = "Show more";
|
||||
"Reset" = "Reset";
|
||||
"Message size" = "Message size";
|
||||
|
||||
/* Popup "show" */
|
||||
"all" = "all";
|
||||
"read" = "read";
|
||||
"unread" = "unread";
|
||||
"deleted" = "deleted";
|
||||
"flagged" = "flagged";
|
||||
|
||||
/* MailListView */
|
||||
"Sender" = "Sender";
|
||||
"Subject or Sender" = "Subject or Sender";
|
||||
"Subject or Recipient" = "Subject or Recipient";
|
||||
"To or Cc" = "To or Cc";
|
||||
"Entire Message" = "Entire Message";
|
||||
"Date" = "Date";
|
||||
"View" = "View";
|
||||
"All" = "All";
|
||||
"No message" = "No message";
|
||||
"messages" = "messages";
|
||||
"Yesterday" = "Yesterday";
|
||||
"first" = "First";
|
||||
"previous" = "Previous";
|
||||
"next" = "Next";
|
||||
"last" = "Last";
|
||||
"msgnumber_to" = "to";
|
||||
"msgnumber_of" = "of";
|
||||
"Mark Unread" = "Mark Unread";
|
||||
"Mark Read" = "Mark Read";
|
||||
"Untitled" = "Untitled";
|
||||
|
||||
/* Filter option in messages list */
|
||||
"Show unread messages only" = "Show unread messages only";
|
||||
|
||||
/* Filter option in messages list */
|
||||
"Show flagged messages only" = "Show flagged messages only";
|
||||
|
||||
/* Aria label for icon of labels */
|
||||
"Filtered by label" = "Filtered by label";
|
||||
|
||||
/* Tree */
|
||||
"SentFolderName" = "Sent";
|
||||
"TrashFolderName" = "Trash";
|
||||
"InboxFolderName" = "Inbox";
|
||||
"DraftsFolderName" = "Drafts";
|
||||
"JunkFolderName" = "Junk";
|
||||
"TemplatesFolderName" = "Templates";
|
||||
"SieveFolderName" = "Filters";
|
||||
"Folders" = "Folders"; /* title line */
|
||||
|
||||
/* MailMoveToPopUp */
|
||||
"MoveTo" = "Move …";
|
||||
|
||||
/* Address Popup menu */
|
||||
"Add to Address Book..." = "Add to Address Book...";
|
||||
"Successfully created card" = "Successfully created card";
|
||||
"Compose Mail To" = "Compose Mail To";
|
||||
"Create Filter From Message..." = "Create Filter From Message...";
|
||||
|
||||
/* Image Popup menu */
|
||||
"Save Image" = "Save Image";
|
||||
"Save Attachment" = "Save Attachment";
|
||||
|
||||
/* Mailbox popup menus */
|
||||
"Open in New Mail Window" = "Open in New Mail Window";
|
||||
"Copy Folder Location" = "Copy Folder Location";
|
||||
"Subscribe..." = "Subscribe...";
|
||||
"Mark Folder Read" = "Mark Folder Read";
|
||||
"New Folder..." = "New Folder...";
|
||||
"Compact This Folder" = "Compact This Folder";
|
||||
"Search Messages..." = "Search Messages...";
|
||||
"Sharing..." = "Sharing...";
|
||||
"New Subfolder..." = "New Subfolder...";
|
||||
"Rename Folder..." = "Rename Folder...";
|
||||
"Delete Folder" = "Delete Folder";
|
||||
"Use This Folder For" = "Use This Folder For";
|
||||
"Get Messages for Account" = "Get Messages for Account";
|
||||
"Properties..." = "Properties...";
|
||||
"Delegation..." = "Delegation...";
|
||||
|
||||
/* Use This Folder menu */
|
||||
"Sent Messages" = "Sent Messages";
|
||||
"Drafts" = "Drafts";
|
||||
"Deleted Messages" = "Deleted Messages";
|
||||
"Junk Messages" = "Junk Messages";
|
||||
|
||||
/* Message list popup menu */
|
||||
"Open Message In New Window" = "Open Message In New Window";
|
||||
"Reply to Sender Only" = "Reply to Sender Only";
|
||||
"Reply to All" = "Reply to All";
|
||||
"Edit As New..." = "Edit As New...";
|
||||
"Move To" = "Move To";
|
||||
"Copy To" = "Copy To";
|
||||
"Label" = "Label";
|
||||
"Mark" = "Mark";
|
||||
"Save As..." = "Save As...";
|
||||
"Print Preview" = "Print Preview";
|
||||
"View Message Source" = "View Message Source";
|
||||
"View raw message" = "View raw message";
|
||||
|
||||
/* Message view "more" menu: create an event from message */
|
||||
"Convert To Event" = "Convert To Event";
|
||||
|
||||
/* Message view "more" menu: create a task from message */
|
||||
"Convert To Task" = "Convert To Task";
|
||||
|
||||
/* Message view "more" menu: download message as an eml file */
|
||||
"Download message" = "Download message";
|
||||
|
||||
/* Message view "more" menu: download message as a zip archive */
|
||||
"Download message (zip)" = "Download message (zip)";
|
||||
|
||||
/* Message view "more" menu: download all attachments as a zip archive */
|
||||
"Download all attachments" = "Download all attachments";
|
||||
|
||||
/* Filename prefix when downloading all attachments as a zip archive */
|
||||
"attachments" = "attachments";
|
||||
|
||||
"Print..." = "Print...";
|
||||
"Delete Message" = "Delete Message";
|
||||
"Delete Selected Messages" = "Delete Selected Messages";
|
||||
"Mark the selected messages as junk" = "Mark the selected messages as junk";
|
||||
"Mark the selected messages as not junk" = "Mark the selected messages as not junk";
|
||||
|
||||
/* Text appended to the recipients list when there are too many recipients */
|
||||
"and %{0} more..." = "and %{0} more...";
|
||||
|
||||
/* Button label to hide extended list of recipients */
|
||||
"Hide" = "Hide";
|
||||
|
||||
/* Number of selected messages in list */
|
||||
"selected" = "selected";
|
||||
|
||||
/* Date formatting from one time to another time */
|
||||
"to_time" = "to";
|
||||
|
||||
/* Date formatting from one day to another day */
|
||||
"to_date" = "to";
|
||||
|
||||
/* Encrypted message notification */
|
||||
"This message is encrypted" = "This message is encrypted";
|
||||
|
||||
/* Encrypted message but no certificate */
|
||||
"This message can't be decrypted. Please make sure you have uploaded your S/MIME certificate from the mail preferences module." = "This message can't be decrypted. Please make sure you have uploaded your S/MIME certificate from the mail preferences module.";
|
||||
|
||||
/* OpenSSL certificate error - unknown issuer */
|
||||
"certificate verify error" = "Unable to verify message signature";
|
||||
|
||||
/* OpenSSL certificate error - digest failure */
|
||||
"digest failure" = "The message has been modified";
|
||||
|
||||
/* OpenSSL reading error */
|
||||
"Error reading the certificate. Please install a new certificate." = "Error reading the certificate. Please install a new certificate.";
|
||||
|
||||
/* Trying to access a non-existent certificate */
|
||||
"No certificate associated to account." = "No certificate associated to account.";
|
||||
|
||||
/* Invalid S/MIME signature */
|
||||
"Digital signature is not valid" = "Digital signature is not valid";
|
||||
|
||||
/* Valid S/MIME signature */
|
||||
"Message is signed" = "Message is signed";
|
||||
|
||||
/* Valid S/MIME signature but common name not found */
|
||||
"Message is signed but the certificate doesn't match the sender email address" = "Message is signed but the certificate doesn't match the sender email address";
|
||||
|
||||
/* Unknown error while validating message signature */
|
||||
"Digital signature is not valid" = "Digital signature is not valid";
|
||||
|
||||
"This Folder" = "This Folder";
|
||||
|
||||
/* Label popup menu */
|
||||
"None" = "None";
|
||||
|
||||
/* Mark popup menu */
|
||||
"As Read" = "As Read";
|
||||
"Thread As Read" = "Thread As Read";
|
||||
"As Read By Date..." = "As Read By Date...";
|
||||
"All Read" = "All Read";
|
||||
"As Junk" = "As Junk";
|
||||
"As Not Junk" = "As Not Junk";
|
||||
"Run Junk Mail Controls" = "Run Junk Mail Controls";
|
||||
"Search messages in" = "Search messages in";
|
||||
"Search" = "Search";
|
||||
"Search subfolders" = "Search subfolders";
|
||||
"Match any of the following" = "Match any of the following";
|
||||
"Match all of the following" = "Match all of the following";
|
||||
"contains" = "contains";
|
||||
"does not contain" = "does not contain";
|
||||
"No matches found" = "No matches found";
|
||||
"results found" = "results found";
|
||||
"result found" = "result found";
|
||||
"Please specify at least one filter" = "Please specify at least one filter";
|
||||
|
||||
/* Folder operations */
|
||||
"Name" = "Name";
|
||||
"Enter the new name of your folder"
|
||||
="Enter the new name of your folder";
|
||||
"Do you really want to move this folder into the trash ?"
|
||||
= "Do you really want to move this folder into the trash ?";
|
||||
"Operation failed" = "Operation failed";
|
||||
"Quota" = "Quota:";
|
||||
"quotasFormat" = "%{0}% used on %{1} MB";
|
||||
"messageQuotasFormat" = "%{0}% of %{1} msgs";
|
||||
"Unable to move/delete folder." = "Unable to move/delete folder.";
|
||||
|
||||
/* Alternative operation when folder cannot be deleted */
|
||||
"The mailbox could not be moved to the trash folder. Would you like to delete it immediately?"
|
||||
= "The mailbox could not be moved to the trash folder. Would you like to delete it immediately?";
|
||||
|
||||
/* Confirmation message when deleting multiple messages */
|
||||
"Are you sure you want to delete the selected messages?" = "Are you sure you want to delete the selected messages?";
|
||||
|
||||
/* Notification on the number of messages successfuly copied */
|
||||
"%{0} message(s) copied" = "%{0} message(s) copied";
|
||||
|
||||
/* Notification on the number of messages successfuly movied */
|
||||
"%{0} message(s) moved" = "%{0} message(s) moved";
|
||||
|
||||
"Please select a message." = "Please select a message.";
|
||||
"Please select a message to print." = "Please select a message to print.";
|
||||
"Please select only one message to print." = "Please select only one message to print.";
|
||||
"The message you have selected doesn't exist anymore." = "The message you have selected doesn't exist anymore.";
|
||||
"The folder with name \"%{0}\" could not be created."
|
||||
= "The folder with name \"%{0}\" could not be created.";
|
||||
"This folder could not be renamed to \"%{0}\"."
|
||||
= "This folder could not be renamed to \"%{0}\".";
|
||||
"The folder could not be deleted."
|
||||
= "The folder could not be deleted.";
|
||||
"The trash could not be emptied."
|
||||
= "The trash could not be emptied.";
|
||||
"The folder functionality could not be changed."
|
||||
= "The folder functionality could not be changed.";
|
||||
"You need to choose a non-virtual folder!" = "You need to choose a non-virtual folder!";
|
||||
"Moving a message into its own folder is impossible!"
|
||||
= "Moving a message into its own folder is impossible!";
|
||||
"Copying a message into its own folder is impossible!"
|
||||
= "Copying a message into its own folder is impossible!";
|
||||
|
||||
/* Message operations */
|
||||
"The messages could not be moved to the trash folder. Would you like to delete them immediately?"
|
||||
= "The messages could not be moved to the trash folder. Would you like to delete them immediately?";
|
||||
|
||||
/* Message editing */
|
||||
"Please specify a subject." = "Please specify a subject.";
|
||||
"error_missingsubject" = "The message has no subject. Are you sure you want to send it?";
|
||||
"error_missingrecipients" = "Please specify at least one recipient.";
|
||||
"Send Anyway" = "Send Anyway";
|
||||
"Error while saving the draft" = "Error while saving the draft";
|
||||
|
||||
/* Error when emptying trash */
|
||||
"Unable to empty the trash folder." = "Unable to empty the trash folder.";
|
||||
|
||||
/* Error when emptying junk folder */
|
||||
"Unable to empty the junk folder." = "Unable to empty the junk folder.";
|
||||
|
||||
/* Error when uploading a file attachment */
|
||||
"Error while uploading the file \"%{0}\":" = "Error while uploading the file \"%{0}\":";
|
||||
"There is an active file upload. Closing the window will interrupt it." = "There is an active file upload. Closing the window will interrupt it.";
|
||||
"Message is too big" = "Message is too big";
|
||||
|
||||
/* Appears while sending the message */
|
||||
"Sending" = "Sending";
|
||||
|
||||
/* Appears when the message is successfuly sent */
|
||||
"Sent" = "Sent";
|
||||
|
||||
"cannot send message: (smtp) all recipients discarded" = "Cannot send message: all recipients are invalid.";
|
||||
"cannot send message (smtp) - recipients discarded" = "Cannot send message. The following addresses are invalid";
|
||||
"cannot send message: (smtp) error when connecting" = "Cannot send message: error when connecting to the SMTP server.";
|
||||
"cannot sign email without certificate" = "The message can't be signed because there's no certificate associated to the mail account.";
|
||||
"cannot sign message because the certificate can't be read" = "The message can't be signed becasue the certificate associated to the mail account can't be read.";
|
||||
"cannot sign message because the certificate doesn't include the specified sender address" = "The message can't be signed because the sender address is not included in the certificate associated to the mail account.";
|
||||
|
||||
/* Contacts list in mail editor */
|
||||
"Email" = "Email";
|
||||
"More mail options" = "More mail options";
|
||||
"Delegation" = "Delegation";
|
||||
"Add User" = "Add User";
|
||||
"Add a tag" = "Add a tag";
|
||||
"reply" = "reply";
|
||||
"Edit" = "Edit";
|
||||
"Yes" = "Yes";
|
||||
"No" = "No";
|
||||
"Location" = "Location";
|
||||
"Rename" = "Rename";
|
||||
"Compact" = "Compact";
|
||||
"Export" = "Export";
|
||||
"Set as Drafts" = "Set as Drafts";
|
||||
"Set as Sent" = "Set as Sent";
|
||||
"Set as Trash" = "Set as Trash";
|
||||
|
||||
/* Set the folder as the one holding the Templates */
|
||||
"Set as Templates" = "Set as Templates";
|
||||
|
||||
/* Set the folder as the one holding Junk mails */
|
||||
"Set as Junk" = "Set as Junk";
|
||||
|
||||
"Sort" = "Sort";
|
||||
"Order Received" = "Order Received";
|
||||
"Descending Order" = "Descending Order";
|
||||
"Back" = "Back";
|
||||
"Copy messages" = "Copy messages";
|
||||
"More messages options" = "More messages options";
|
||||
"Flag" = "Flag";
|
||||
"Unflag" = "Unflag";
|
||||
"Mark as Unread" = "Mark as Unread";
|
||||
"Mark as Read" = "Mark as Read";
|
||||
"Closing Window ..." = "Closing Window ...";
|
||||
"Tried to send too many mails. Please wait." = "Tried to send too many mails. Please wait.";
|
||||
"View Mail" = "View Mail";
|
||||
"This message contains external images." = "This message contains external images.";
|
||||
"Expanded" = "Expanded";
|
||||
"Add a Criteria" = "Add a Criteria";
|
||||
"More search options" = "More search options";
|
||||
"Your email has been saved" = "Your email has been saved";
|
||||
"Your email has been sent" = "Your email has been sent";
|
||||
"Folder compacted" = "Folder compacted";
|
||||
|
||||
"More Options" = "More Options";
|
||||
|
||||
"New draft" = "New draft";
|
||||
"Create new draft with this template" = "Create new draft with this template";
|
||||
|
||||
/* Advanced search */
|
||||
"Enter Subject" = "Enter Subject";
|
||||
"Enter From" = "Enter From";
|
||||
"Enter To" = "Enter To";
|
||||
"Enter Cc" = "Enter Cc";
|
||||
"Enter Body" = "Enter Body";
|
||||
"match" = "match";
|
||||
"does not match" = "does not match";
|
||||
|
||||
/* Aria label for scope of search on messages */
|
||||
"Search scope" = "Search scope";
|
||||
|
||||
/* Subscriptions Dialog */
|
||||
"Manage Subscriptions" = "Manage Subscriptions";
|
||||
|
||||
/* Label of filter input field in subscriptions dialog */
|
||||
"Filter" = "Filter";
|
||||
|
||||
/* Hotkey to write a new message */
|
||||
"hotkey_compose" = "w";
|
||||
|
||||
/* Hotkey to flag a message */
|
||||
"hotkey_flag" = "*";
|
||||
|
||||
/* Hotkey to reply to a message */
|
||||
"hotkey_reply" = "r";
|
||||
|
||||
/* Hotkey to reply to all recipients of a message */
|
||||
"hotkey_replyall" = "a";
|
||||
|
||||
/* Hotkey to forward to a message */
|
||||
"hotkey_forward" = "f";
|
||||
|
||||
/* Email deletion */
|
||||
"Clean folder" = "Clean folder";
|
||||
"Clean mailbox" = "Clean mailbox";
|
||||
"Delete permanently (do not use trash)" = "Delete permanently (do not use trash)";
|
||||
"Apply to subfolders" = "Apply to subfolders";
|
||||
"Delete e-mails older than" = "Delete e-mails older than";
|
||||
"3 months" = "3 months";
|
||||
"6 months" = "6 months";
|
||||
"9 months" = "9 months";
|
||||
"1 year" = "1 year";
|
||||
"Custom" = "Custom";
|
||||
"You are about to permanently delete some messages. Are you sure you want to proceed with this action?" = "You are about to permanently delete some messages. Are you sure you want to proceed with this action?";
|
||||
"Apply" = "Apply";
|
||||
"%{0} message(s) deleted" = "%{0} message(s) deleted";
|
||||
@@ -293,10 +293,10 @@
|
||||
"selected" = "выбран";
|
||||
|
||||
/* Date formatting from one time to another time */
|
||||
"to_time" = "в";
|
||||
"to_time" = "до";
|
||||
|
||||
/* Date formatting from one day to another day */
|
||||
"to_date" = "в";
|
||||
"to_date" = "по";
|
||||
|
||||
/* Encrypted message notification */
|
||||
"This message is encrypted" = "Это сообщение зашифровано";
|
||||
|
||||
@@ -143,23 +143,23 @@
|
||||
"This mail is being sent from an unsecure network!" = "Este mendaje es enviado desde una red no segura.";
|
||||
"Address Book" = "Libreta de direcciones";
|
||||
"Search For" = "Buscar";
|
||||
"Contains" = "Contains";
|
||||
"Does not contains" = "Does not contains";
|
||||
"Advanced search" = "Advanced search";
|
||||
"Anytime" = "Anytime";
|
||||
"Last 7 days" = "Last 7 days";
|
||||
"Last 30 days" = "Last 30 days";
|
||||
"Last 6 month" = "Last 6 month";
|
||||
"Before" = "Before";
|
||||
"After" = "After";
|
||||
"Between" = "Between";
|
||||
"and" = "and";
|
||||
"With attachments" = "With attachments";
|
||||
"In favorites" = "In favorites";
|
||||
"Unseen only" = "Unseen only";
|
||||
"Show more" = "Show more";
|
||||
"Reset" = "Reset";
|
||||
"Message size" = "Message size";
|
||||
"Contains" = "Contiene";
|
||||
"Does not contains" = "No contiene";
|
||||
"Advanced search" = "Búsqueda avanzada";
|
||||
"Anytime" = "Cualquier momento";
|
||||
"Last 7 days" = "Últimos 7 días";
|
||||
"Last 30 days" = "Últimos 30 días";
|
||||
"Last 6 month" = "Últimos 6 meses";
|
||||
"Before" = "Antes de";
|
||||
"After" = "Después de";
|
||||
"Between" = "Entre";
|
||||
"and" = "y";
|
||||
"With attachments" = "Con adjuntos";
|
||||
"In favorites" = "En favoritos";
|
||||
"Unseen only" = "Solo no leídos";
|
||||
"Show more" = "Mostrar más";
|
||||
"Reset" = "Restablecer";
|
||||
"Message size" = "Tamaño del mensaje";
|
||||
|
||||
/* Popup "show" */
|
||||
"all" = "todo";
|
||||
@@ -171,7 +171,7 @@
|
||||
/* MailListView */
|
||||
"Sender" = "Remitente";
|
||||
"Subject or Sender" = "Asunto o remitente";
|
||||
"Subject or Recipient" = "Subject or Recipient";
|
||||
"Subject or Recipient" = "Asunto o destinatario";
|
||||
"To or Cc" = "Para o CC";
|
||||
"Entire Message" = "Mensage completo";
|
||||
"Date" = "Fecha";
|
||||
@@ -257,7 +257,7 @@
|
||||
"Save As..." = "Guardar como...";
|
||||
"Print Preview" = "Vista preliminar";
|
||||
"View Message Source" = "Ver formato original del mensaje";
|
||||
"View raw message" = "View raw message";
|
||||
"View raw message" = "Ver mensaje sin formato";
|
||||
|
||||
/* Message view "more" menu: create an event from message */
|
||||
"Convert To Event" = "Convertir como evento";
|
||||
@@ -517,16 +517,16 @@
|
||||
"hotkey_forward" = "f";
|
||||
|
||||
/* Email deletion */
|
||||
"Clean folder" = "Clean folder";
|
||||
"Clean mailbox" = "Clean mailbox";
|
||||
"Delete permanently (do not use trash)" = "Delete permanently (do not use trash)";
|
||||
"Apply to subfolders" = "Apply to subfolders";
|
||||
"Delete e-mails older than" = "Delete e-mails older than";
|
||||
"3 months" = "3 months";
|
||||
"6 months" = "6 months";
|
||||
"9 months" = "9 months";
|
||||
"1 year" = "1 year";
|
||||
"Custom" = "Custom";
|
||||
"You are about to permanently delete some messages. Are you sure you want to proceed with this action?" = "You are about to permanently delete some messages. Are you sure you want to proceed with this action?";
|
||||
"Apply" = "Apply";
|
||||
"%{0} message(s) deleted" = "%{0} message(s) deleted";
|
||||
"Clean folder" = "Limpiar carpeta";
|
||||
"Clean mailbox" = "Limpiar buzón";
|
||||
"Delete permanently (do not use trash)" = "Borrar permanentemente (sin papelera)";
|
||||
"Apply to subfolders" = "Aplicar a subcarpetas";
|
||||
"Delete e-mails older than" = "Borrar correos más antiguos de";
|
||||
"3 months" = "3 meses";
|
||||
"6 months" = "6 meses";
|
||||
"9 months" = "9 meses";
|
||||
"1 year" = "1 año";
|
||||
"Custom" = "Personalizado";
|
||||
"You are about to permanently delete some messages. Are you sure you want to proceed with this action?" = "Está a punto de borrar permanentemente algunos mensajes. ¿Está seguro de que desea continuar con esta acción?";
|
||||
"Apply" = "Aplicar";
|
||||
"%{0} message(s) deleted" = "%{0} mensaje(s) borrado(s)";
|
||||
@@ -1034,6 +1034,8 @@
|
||||
SOGoMailFolder *folder;
|
||||
WORequest *request;
|
||||
WOResponse *response;
|
||||
SOGoMailAccount *account;
|
||||
id quota;
|
||||
int i, max;
|
||||
|
||||
request = [context request];
|
||||
@@ -1078,13 +1080,20 @@
|
||||
headers = [self getHeadersForUIDs: [changedUids subarrayWithRange: r]
|
||||
inFolder: folder];
|
||||
|
||||
data = [NSDictionary dictionaryWithObjectsAndKeys:
|
||||
data = [NSMutableDictionary dictionaryWithObjectsAndKeys:
|
||||
changedUids, @"changed",
|
||||
deletedUids, @"deleted",
|
||||
headers, @"headers",
|
||||
newSyncToken, @"syncToken",
|
||||
[NSNumber numberWithUnsignedInt: [folder unseenCount]], @"unseenCount",
|
||||
nil];
|
||||
|
||||
// We also return the inbox quota
|
||||
account = [folder mailAccountFolder];
|
||||
quota = [account getInboxQuota];
|
||||
if (quota != nil)
|
||||
[data setObject: quota forKey: @"quotas"];
|
||||
|
||||
response = [self responseWithStatus: 200 andJSONRepresentation: data];
|
||||
}
|
||||
}
|
||||
@@ -1169,7 +1178,7 @@
|
||||
[msg addObject: [NSNumber numberWithBool: [self isMessageFlagged]]];
|
||||
|
||||
// Subject
|
||||
[msg addObject: [[self messageSubject] stringWithoutHTMLInjection: YES]];
|
||||
[msg addObject: [[[self messageSubject] stringWithoutHTMLInjection: YES] stringWithoutHTMLInjection: NO]];
|
||||
|
||||
// From
|
||||
from = [[message objectForKey: @"envelope"] from];
|
||||
|
||||
@@ -363,7 +363,7 @@ static NSString *mailETag = nil;
|
||||
if ([self formattedDate])
|
||||
[data setObject: [self formattedDate] forKey: @"date"];
|
||||
if ([self messageSubject])
|
||||
[data setObject: [[self messageSubject] stringWithoutHTMLInjection: YES] forKey: @"subject"];
|
||||
[data setObject: [[[self messageSubject] stringWithoutHTMLInjection: YES] stringWithoutHTMLInjection: NO] forKey: @"subject"];
|
||||
if ((addresses = [addressFormatter dictionariesForArray: [co fromEnvelopeAddresses]]))
|
||||
[data setObject: addresses forKey: @"from"];
|
||||
if ((addresses = [addressFormatter dictionariesForArray: [co toEnvelopeAddresses]]))
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,13 +47,14 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
"Indonesian" = "bahasa Indonesia";
|
||||
"Italian" = "Italiano";
|
||||
"Japanese" = "日本語";
|
||||
"Korean" = "한국어";
|
||||
"Korean" = "coreano";
|
||||
"Kazakh" = "Қазақ";
|
||||
"Latvian" = "Latviešu";
|
||||
"Lithuanian" = "Lietuvių";
|
||||
@@ -73,7 +74,7 @@
|
||||
"SpanishSpain" = "Español (España)";
|
||||
"SpanishArgentina" = "Español (Argentina)";
|
||||
"Swedish" = "Svenska";
|
||||
"Thai" = "ภาษา";
|
||||
"Thai" = "Idioma";
|
||||
"TurkishTurkey" = "Türkçe (Türkiye)";
|
||||
"Ukrainian" = "Українська";
|
||||
"Welsh" = "Cymraeg";
|
||||
@@ -107,11 +108,11 @@
|
||||
"Unhandled error response" = "Erro de resposta não tratado";
|
||||
"Password change is not supported." = "Alteração da senha não suportada.";
|
||||
"Unhandled HTTP error code: %{0}" = "Erro HTTP não tratado: %{0}";
|
||||
"Current password" = "Current password";
|
||||
"Current password" = "Senha atual";
|
||||
"New password" = "Nova senha";
|
||||
"Passwords don't match" = "Passwords don't match";
|
||||
"Passwords don't match" = "As senhas não coincidem";
|
||||
"Confirmation" = "Confirmação";
|
||||
"Change" = "Change";
|
||||
"Change" = "Alterar";
|
||||
"Cancel" = "Cancelar";
|
||||
"Please wait..." = "Por favor, aguarde...";
|
||||
"Close" = "Fechar";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galicijsky";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
/* Ελληνικά / Greek */
|
||||
{
|
||||
NSLanguageName = "Ελληνικά";
|
||||
NSFormalName = "Ελληνικά";
|
||||
NSLocaleCode = "el";/* ISO 639-1 */
|
||||
NSLanguageCode = "ell";/* ISO 639-2 */
|
||||
NSParentContext = "";
|
||||
|
||||
NSAMPMDesignation = ("π.μ.", "μ.μ.");
|
||||
NSCurrencySymbol = "€";
|
||||
NSInternationalCurrencyString = "EUR"; /* ISO 4217 */
|
||||
NSDateFormatString = "%A, %e %B %Y";
|
||||
NSShortDateFormatString = "%d/%m/%y";
|
||||
NSShortTimeDateFormatString = "%d/%m/%y %I:%M %p";
|
||||
NSTimeDateFormatString = "%A, %e %B %Y %I:%M:%S %p %Z";
|
||||
NSTimeFormatString = "%I:%M:%S %p";
|
||||
NSDateTimeOrdering = DMYH;
|
||||
NSDecimalSeparator = ",";
|
||||
NSThousandsSeparator = ".";
|
||||
NSDecimalDigits = ("0","1","2","3","4","5","6","7","8","9");
|
||||
NSMonthNameArray = ( "Ιανουάριος", "Φεβρουάριος", "Μάρτιος", "Απρίλιος", "Μάιος", "Ιούνιος", "Ιούλιος", "Αύγουστος", "Σεπτέμβριος", "Οκτώβριος", "Νοέμβριος", "Δεκέμβριος" );
|
||||
NSShortMonthNameArray = ("Ιαν", "Φεβ", "Μαρ", "Απρ", "Μάι", "Ιουν", "Ιουλ", "Αυγ", "Σεπ", "Οκτ", "Νοε", "Δεκ");
|
||||
NSWeekDayNameArray = ("Κυριακή", "Δευτέρα", "Τρίτη", "Τετάρτη", "Πέμπτη", "Παρασκευή", "Σάββατο");
|
||||
NSShortWeekDayNameArray = ("Κυρ", "Δευ", "Τρί", "Τετ", "Πέμ", "Παρ", "Σάβ");
|
||||
NSAMPMDesignation = ("π.μ.", "μ.μ.");
|
||||
|
||||
/* Relative day expressions */
|
||||
NSNextDayDesignations = ("αύριο");
|
||||
NSNextNextDayDesignations = ("μεθαύριο");
|
||||
NSPriorDayDesignations = ("χθες");
|
||||
NSThisDayDesignations = ("σήμερα", "τώρα");
|
||||
|
||||
NSEarlierTimeDesignations = ("πριν", "προηγούμενο", "παρελθόν");
|
||||
NSLaterTimeDesignations = ("επόμενο");
|
||||
|
||||
/* Some common hour references */
|
||||
NSHourNameDesignations = (
|
||||
(0, "μεσάνυχτα"),
|
||||
(12, "μεσημέρι"),
|
||||
(14, "απόγευμα"),
|
||||
(19, "βράδυ")
|
||||
);
|
||||
|
||||
/* Currency formatting (Greece uses €) */
|
||||
NSPositiveCurrencyFormatString = "#.###,## €";
|
||||
NSNegativeCurrencyFormatString = "-#.###,## €";
|
||||
|
||||
/* Year / Month / Week words - useful in some UI */
|
||||
NSYearMonthWeekDesignations = ("έτος", "μήνας", "εβδομάδα");
|
||||
}
|
||||
@@ -0,0 +1,136 @@
|
||||
/* this file is in UTF-8 format! */
|
||||
|
||||
"title" = "SOGo";
|
||||
"Username" = "Username";
|
||||
"Password" = "Password";
|
||||
"Domain" = "Domain";
|
||||
"Remember username" = "Remember username";
|
||||
"Connect" = "Connect";
|
||||
|
||||
/* Appears while authentication is in progress */
|
||||
"Authenticating" = "Authenticating";
|
||||
|
||||
/* Appears when authentication succeeds */
|
||||
"Welcome" = "Welcome";
|
||||
|
||||
"Authentication Failed" = "Authentication Failed";
|
||||
"Wrong username or password." = "Wrong username or password.";
|
||||
"Retry" = "Retry";
|
||||
"Login failed due to unhandled error case:" = "Login failed due to unhandled error case:";
|
||||
"cookiesNotEnabled" = "You cannot login because your browser's cookies are disabled. Please enable cookies in your browser's settings and try again.";
|
||||
"browserNotCompatible" = "We've detected that your browser version is currently not supported on this site. Our recommendation is to use Firefox. Click on the link below to download the most current version of this browser.";
|
||||
"alternativeBrowsers" = "Alternatively, you can also use the following compatible browsers";
|
||||
"alternativeBrowserSafari" = "Alternatively, you can also use Safari.";
|
||||
|
||||
/* 2FA */
|
||||
"Verification Code" = "Verification Code";
|
||||
"Enter the 6-digit verification code from your TOTP application." = "Enter the 6-digit verification code from your TOTP application.";
|
||||
"You provided an invalid TOTP key." = "You provided an invalid TOTP key.";
|
||||
"Two-factor authentication has been disabled. Visit the Preferences module to restore two-factor authentication and reconfigure your TOTP application." = "Two-factor authentication has been disabled. Visit the Preferences module to restore two-factor authentication and reconfigure your TOTP application.";
|
||||
|
||||
"Download" = "Download";
|
||||
"Language" = "Language";
|
||||
"choose" = "Choose ...";
|
||||
"Arabic" = "العربية";
|
||||
"Basque" = "Euskara";
|
||||
"Bosnian" = "Bosanski";
|
||||
"Bulgarian" = "Български";
|
||||
"Catalan" = "Català";
|
||||
"ChineseChina" = "简体中文";
|
||||
"ChineseTaiwan" = "正體中文";
|
||||
"Croatian" = "Hrvatski";
|
||||
"Czech" = "Česky";
|
||||
"Danish" = "Dansk (Danmark)";
|
||||
"Dutch" = "Nederlands";
|
||||
"English" = "English";
|
||||
"Finnish" = "Suomi";
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
"Indonesian" = "bahasa Indonesia";
|
||||
"Italian" = "Italiano";
|
||||
"Japanese" = "日本語";
|
||||
"Korean" = "한국어";
|
||||
"Kazakh" = "Қазақ";
|
||||
"Latvian" = "Latviešu";
|
||||
"Lithuanian" = "Lietuvių";
|
||||
"Macedonian" = "Македонски";
|
||||
"Montenegrin" = "Crnogorski";
|
||||
"NorwegianBokmal" = "Norsk bokmål";
|
||||
"NorwegianNynorsk" = "Norsk nynorsk";
|
||||
"Polish" = "Polski";
|
||||
"Portuguese" = "Português";
|
||||
"BrazilianPortuguese" = "Português brasileiro";
|
||||
"Romanian" = "Română";
|
||||
"Russian" = "Русский";
|
||||
"Serbian" = "Српски";
|
||||
"SerbianLatin" = "Srpski";
|
||||
"Slovak" = "Slovensky";
|
||||
"Slovenian" = "Slovenščina";
|
||||
"SpanishSpain" = "Español (España)";
|
||||
"SpanishArgentina" = "Español (Argentina)";
|
||||
"Swedish" = "Svenska";
|
||||
"Thai" = "ภาษา";
|
||||
"TurkishTurkey" = "Türkçe (Türkiye)";
|
||||
"Ukrainian" = "Українська";
|
||||
"Welsh" = "Cymraeg";
|
||||
|
||||
"About" = "About";
|
||||
"AboutBox" = "Developed by Inverse and Alinto, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.<br/><br/>\nSOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.<br/><br/>\nSOGo is distributed under the <a href=\"http://gnu.org/licenses/gpl.html\">GNU GPL</a> version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.<br/><br/>\nSee <a href=\"http://www.sogo.nu/en/support/community.html\">this page</a> for various support options.";
|
||||
"Your account was locked due to too many failed attempts." = "Your account was locked due to too many failed attempts.";
|
||||
"Your account was locked due to an expired password." = "Your account was locked due to an expired password.";
|
||||
"Login failed due to unhandled error case" = "Login failed due to unhandled error case";
|
||||
"Change your Password" = "Change your Password";
|
||||
"The password was changed successfully." = "The password was changed successfully.";
|
||||
"Your password has expired, please enter a new one below" = "Your password has expired, please enter a new one below";
|
||||
"Your password is too weak. Please choose a stronger password to enhance your security" = "Your password is too weak. Please choose a stronger password to enhance your security";
|
||||
"Password must not be empty." = "Password must not be empty.";
|
||||
"The passwords do not match. Please try again." = "The passwords do not match. Please try again.";
|
||||
"Password Grace Period" = "Password Grace Period";
|
||||
"You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog.";
|
||||
"Password about to expire" = "Password about to expire";
|
||||
"Your password is going to expire in %{0} %{1}." = "Your password is going to expire in %{0} %{1}.";
|
||||
"days" = "days";
|
||||
"hours" = "hours";
|
||||
"minutes" = "minutes";
|
||||
"seconds" = "seconds";
|
||||
"Password change failed" = "Password change failed";
|
||||
"Password change failed - Permission denied" = "Password change failed - Permission denied";
|
||||
"Password change failed - Insufficient password quality" = "Password change failed - Insufficient password quality";
|
||||
"Password change failed - Password is too short" = "Password change failed - Password is too short";
|
||||
"Password change failed - Password is too young" = "Password change failed - Password is too young";
|
||||
"Password change failed - Password is in history" = "Password change failed - Password is in history";
|
||||
"Unhandled policy error: %{0}" = "Unhandled policy error: %{0}";
|
||||
"Unhandled error response" = "Unhandled error response";
|
||||
"Password change is not supported." = "Password change is not supported.";
|
||||
"Unhandled HTTP error code: %{0}" = "Unhandled HTTP error code: %{0}";
|
||||
"Current password" = "Current password";
|
||||
"New password" = "New password";
|
||||
"Passwords don't match" = "Passwords don't match";
|
||||
"Confirmation" = "Confirmation";
|
||||
"Change" = "Change";
|
||||
"Cancel" = "Cancel";
|
||||
"Please wait..." = "Please wait...";
|
||||
"Close" = "Close";
|
||||
"Missing search parameter" = "Missing search parameter";
|
||||
"Missing type parameter" = "Missing type parameter";
|
||||
|
||||
/* Password Recovery */
|
||||
"Secondary e-mail" = "Secondary e-mail";
|
||||
"Answer" = "Answer";
|
||||
"Password lost" = "Password lost";
|
||||
"No password recovery method has been defined for this user" = "No password recovery method has been defined for this user";
|
||||
"Invalid secret question answer" = "Invalid secret question answer";
|
||||
"Next" = "Next";
|
||||
"Back" = "Back";
|
||||
"Please enter a new password below" = "Please enter a new password below";
|
||||
"A link will be sent to %{0}" = "A link will be sent to %{0}";
|
||||
"A password reset link has been sent, please check your recovery e-mail mailbox and click on the link" = "A password reset link has been sent, please check your recovery e-mail mailbox and click on the link";
|
||||
"Invalid configuration for email password recovery" = "Invalid configuration for email password recovery";
|
||||
"Password recovery email in error" = "Password recovery email in error";
|
||||
"Password reset" = "Password reset";
|
||||
"Hi %{0},\nThere was a request to change your password!\n\nIf you did not make this request then please ignore this email.\n\nOtherwise, please click this link to change your password: %{1}" = "Hi %{0},\nThere was a request to change your password!\n\nIf you did not make this request then please ignore this email.\n\nOtherwise, please click this link to change your password: %{1}";
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galisisk ";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
@@ -107,11 +108,11 @@
|
||||
"Unhandled error response" = "Erro de resposta não tratado";
|
||||
"Password change is not supported." = "Alteração da palavra-passe não é suportada.";
|
||||
"Unhandled HTTP error code: %{0}" = "Erro HTTP não tratado: %{0}";
|
||||
"Current password" = "Current password";
|
||||
"Current password" = "Palavra-passe atual";
|
||||
"New password" = "Nova palavra-passe";
|
||||
"Passwords don't match" = "Passwords don't match";
|
||||
"Passwords don't match" = "As palavra-passe não são idênticas";
|
||||
"Confirmation" = "Confirmação";
|
||||
"Change" = "Change";
|
||||
"Change" = "Alterar";
|
||||
"Cancel" = "Cancelar";
|
||||
"Please wait..." = "Por favor aguarde...";
|
||||
"Close" = "Fechar";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
+83
-10
@@ -338,7 +338,7 @@ static const NSString *kJwtKey = @"jwt";
|
||||
const auto time_step = OATH_TOTP_DEFAULT_TIME_STEP_SIZE;
|
||||
const auto digits = 6;
|
||||
|
||||
real_secret = [[loggedInUser totpKey] UTF8String];
|
||||
real_secret = [[loggedInUser totpKey: YES] UTF8String];
|
||||
|
||||
auto result = oath_init();
|
||||
auto t = time(NULL);
|
||||
@@ -366,16 +366,60 @@ static const NSString *kJwtKey = @"jwt";
|
||||
|
||||
if (code != [verificationCode unsignedIntValue])
|
||||
{
|
||||
[self logWithFormat: @"Invalid TOTP key for '%@'", username];
|
||||
[json setObject: [NSNumber numberWithInt: 1]
|
||||
forKey: @"totpInvalidKey"];
|
||||
return [self responseWithStatus: 403
|
||||
andJSONRepresentation: json];
|
||||
//With 5.12.5, the totpKey has changed (non longer from salt but from a propoer totpkey parameter)
|
||||
//To avoid making all old totp configuration obsolete, we're trying the verification code with
|
||||
//the old method first
|
||||
unsigned int old_code;
|
||||
const char *old_real_secret;
|
||||
char *old_secret;
|
||||
|
||||
size_t old_secret_len;
|
||||
|
||||
const auto old_time_step = OATH_TOTP_DEFAULT_TIME_STEP_SIZE;
|
||||
const auto old_digits = 6;
|
||||
|
||||
old_real_secret = [[loggedInUser oldtotpKey] UTF8String];
|
||||
|
||||
auto old_result = oath_init();
|
||||
auto old_time = time(NULL);
|
||||
auto old_left = old_time_step - (old_time % old_time_step);
|
||||
|
||||
char old_otp[old_digits + 1];
|
||||
|
||||
oath_base32_decode (old_real_secret,
|
||||
strlen(old_real_secret),
|
||||
&old_secret, &old_secret_len);
|
||||
|
||||
old_result = oath_totp_generate2(old_secret,
|
||||
old_secret_len,
|
||||
old_time,
|
||||
old_time_step,
|
||||
OATH_TOTP_DEFAULT_START_TIME,
|
||||
old_digits,
|
||||
0,
|
||||
old_otp);
|
||||
|
||||
sscanf(old_otp, "%u", &old_code);
|
||||
|
||||
oath_done();
|
||||
free(old_secret);
|
||||
|
||||
if (old_code != [verificationCode unsignedIntValue])
|
||||
{
|
||||
[self logWithFormat: @"Invalid TOTP key for '%@'", username];
|
||||
[json setObject: [NSNumber numberWithInt: 1] forKey: @"totpInvalidKey"];
|
||||
return [self responseWithStatus: 403 andJSONRepresentation: json];
|
||||
}
|
||||
else {
|
||||
//Move the old secret to the new parameter
|
||||
[us setTotpKey: [[us userPrivateSalt] substringToIndex: 12]];
|
||||
}
|
||||
}
|
||||
} // if ([verificationCode length] == 6 && [verificationCode unsignedIntValue] > 0)
|
||||
}
|
||||
else
|
||||
{
|
||||
if ([us dictionaryForKey: @"General"] && ![[us dictionaryForKey: @"General"] objectForKey: @"PrivateSalt"])
|
||||
if ([us dictionaryForKey: @"General"] && !([[us dictionaryForKey: @"General"] objectForKey: @"PrivateSalt"] ||
|
||||
[[us dictionaryForKey: @"General"] objectForKey: @"totpKey"]))
|
||||
{
|
||||
// Since v5.3.0, a new salt is used for TOTP. If it's missing, disable TOTP and alert the user.
|
||||
[ud setTotpEnabled: NO];
|
||||
@@ -641,8 +685,22 @@ static const NSString *kJwtKey = @"jwt";
|
||||
code = value;
|
||||
[openIdSession fetchToken: code redirect: redirectLocation];
|
||||
login = [openIdSession login: @""];
|
||||
if(!login)
|
||||
{
|
||||
//login is nil only if there's a problem with the userInfo mail parameters
|
||||
response = [self responseWithStatus: 500 andString: @"Openid wrong email, check the log"];
|
||||
return response;
|
||||
}
|
||||
if ([login length])
|
||||
{
|
||||
//Check if the user exist in SOGo user source (ldap or sql)
|
||||
loggedInUser = [SOGoUser userWithLogin: login];
|
||||
if(!loggedInUser)
|
||||
{
|
||||
[self logWithFormat: @"Mail returned by openid does not exist in user source: %@", login];
|
||||
response = [self responseWithStatus: 500 andString: @"Openid wrong email, check the log"];
|
||||
return response;
|
||||
}
|
||||
auth = [[WOApplication application] authenticatorInContext: context];
|
||||
openIdCookie = [auth cookieWithUsername: login
|
||||
andPassword: [openIdSession getToken]
|
||||
@@ -1016,12 +1074,14 @@ static const NSString *kJwtKey = @"jwt";
|
||||
{
|
||||
id value;
|
||||
WORequest *rq;
|
||||
NSString* login;
|
||||
NSString* login, *loginClean;
|
||||
NSDictionary *formValues;
|
||||
|
||||
login = @"";
|
||||
|
||||
rq = [context request];
|
||||
|
||||
|
||||
if((formValues=[rq formValues]) && (value=[formValues objectForKey: @"hint"]))
|
||||
{
|
||||
if ([value isKindOfClass: [NSArray class]])
|
||||
@@ -1029,7 +1089,20 @@ static const NSString *kJwtKey = @"jwt";
|
||||
else
|
||||
login = value;
|
||||
}
|
||||
return login;
|
||||
|
||||
//Check common injection
|
||||
loginClean = [login stringWithoutHTMLInjection: YES];
|
||||
if(![loginClean isEqualToString: login])
|
||||
{
|
||||
loginClean = @"";
|
||||
}
|
||||
//Check single quote to inject javascript
|
||||
if ([loginClean rangeOfString:@"'"].location !=NSNotFound)
|
||||
{
|
||||
loginClean = @"";
|
||||
}
|
||||
|
||||
return loginClean;
|
||||
}
|
||||
|
||||
- (BOOL) hasPasswordRecovery
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Gallego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
@@ -107,11 +108,11 @@
|
||||
"Unhandled error response" = "การตอบสนองข้อผิดพลาดที่ไม่สามารถจัดการได้";
|
||||
"Password change is not supported." = "ไม่รองรับการเปลี่ยนรหัสผ่าน";
|
||||
"Unhandled HTTP error code: %{0}" = "โค้ดข้อผิดพลาด HTTP ไม่ได้รับการจัดการ: %{0}";
|
||||
"Current password" = "Current password";
|
||||
"Current password" = "รหัสผ่านปัจจุบัน";
|
||||
"New password" = "รหัสผ่านใหม่";
|
||||
"Passwords don't match" = "Passwords don't match";
|
||||
"Passwords don't match" = "รหัสผ่านไม่ตรงกัน";
|
||||
"Confirmation" = "ยืนยัน";
|
||||
"Change" = "Change";
|
||||
"Change" = "เปลี่ยน";
|
||||
"Cancel" = "ยกเลิก";
|
||||
"Please wait..." = " กรุณารอสักครู่...";
|
||||
"Close" = "ปิด";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"French" = "Français";
|
||||
"Galician" = "Galego";
|
||||
"German" = "Deutsch";
|
||||
"Greek" = "Ελληνικά";
|
||||
"Hebrew" = "עברית";
|
||||
"Hungarian" = "Magyar";
|
||||
"Icelandic" = "Íslenska";
|
||||
|
||||
Loaded 100 of 144 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user