Compare commits

...
Author SHA1 Message Date
smizrahi be3630d009 fix(mail): Keep content of Outlook downlevel-revealed conditional comments. Fixes #6167. 2026-10-02 17:25:02 +02:00
Hivert Quentin 6c93d6b66c fix(mail): fix the sort value 2026-09-21 10:21:26 +02:00
Hivert Quentin aa7f82c09d fix(doc): typos 2026-09-14 17:28:06 +02:00
Hivert Quentin c0a83f5c35 chore(release): 5.12.11 2026-09-14 11:22:21 +02:00
Hivert Quentin 1bf1031ab2 i18n(hu): Update Hungarian translations 2026-09-14 11:12:34 +02:00
Hivert Quentin 012e6eff47 fix(junk): extend list of junk icon available 2026-09-14 10:56:28 +02:00
Hivert Quentin 04a3e98238 fix(pwd): use the proper url for reset password mail part2 2026-09-10 08:11:23 +02:00
Hivert Quentin 3d9853e95b chore(js/css): update generated files 2026-09-10 01:01:19 -04:00
Hivert Quentin 382118a93b fix(pwd): use the proper url for reset password mail 2026-09-07 16:26:09 +02:00
Hivert Quentin 3f4f949664 feat(junk): add junk action on mail view 2026-09-04 18:13:36 +02:00
Hivert Quentin 089b50c0de fix(db): release db channel after using them part 2 2026-09-04 11:30:42 +02:00
Hivert Quentin 152f44b90e fix(db): release db channel after using them 2026-09-03 17:09:44 +02:00
Hivert Quentin d089c4046f fix(UI): use legitimate sorting value 2026-09-03 14:42:51 +02:00
Hivert Quentin 10dc173349 fix(sanitization): update regex for html sanitization 2026-09-03 10:51:45 +02:00
WoodySlum 7ce69e3ea7 Merge pull request #395 from kah-ja/fix/imip-card-template-injection
fix(mail): stop interpreting mail data in compiled part viewers
2026-08-27 11:04:41 +02:00
Jan Kahmen 045a0b9c0a fix(mail): escape mail data placed in attributes of a compiled part
the generic attribute writer used for these two spots does not escape what it
writes, so a value taken from the message ends the attribute and starts a new
one. both are inside a part that is compiled, which is where an injected
handler runs.

* the organizer link took inEvent.organizer.email verbatim. a value such as
  mailto:x@y" onpointerover="... produced a live handler on the anchor, and an
  entity encoded scheme such as javascript: reached the href, where the
  browser decodes it. the href is now built as mailto: plus the parsed address
  and escaped as an attribute value.

* the attachment name paragraph of the image and the link viewer took
  filenameForDisplay verbatim. a quote inside an RFC 2231 encoded filename
  ended the title attribute. the writer escapes & < > there but not the quote,
  so the accessor drops the quote instead of escaping it, which keeps a plain
  filename such as A&B.pdf unchanged in the tooltip.

the img title of the image viewer is left alone: attributes of that element are
escaped by the framework already.
2026-08-17 23:48:41 +02:00
Jan Kahmen 8813677ecb fix(core): keep the @import cleanup working in stringWithoutHTMLInjection
the trailing while loop reuses the regex variable, which by then points at the
angular brace pattern whenever stripAngular is YES. that pattern has two
capture groups while the loop substitutes $1@im****$3, so NSRegularExpression
raises NSInvalidArgumentException and the NS_HANDLER swallows it.

give the @import pattern its own variable and use it in both the replacement
and the loop. the replacement also used the template of the block above, which
dropped the whole style element instead of masking the @import in place, so
test_stringWithoutHTMLInjection failed. it passes again, and a case with
stripAngular YES covers the loop.
2026-08-17 23:03:41 +02:00
Jan Kahmen 0d66d7503d fix(mail): stop interpreting iMIP card text fields as markup
the whole server built html of an iMIP card is rendered through sg-compile
(Message.service.js sets part.compile for UIxMailPartICalViewer), and the user
comment and the description are emitted with escapeHTML="NO". event data from
the invitation is therefore both an angular template and raw html.

47133fdf3 closed the description against interpolation with ng-non-bindable.
this closes both paths for every remaining field:

* ng-non-bindable on the user comment, the location, the organizer common name
  and the raw body shown when the calendar cannot be parsed
* the user comment and the description are read through accessors that escape
  them, so the url detection and insertBR produce the only markup left in the
  output

the marker sits on the leaf containers, not on md-card-content, so the buttons,
the delegation autocomplete and the attendee chips keep being compiled. url
detection still turns a bare url in a comment or a description into a link.
2026-08-17 23:03:41 +02:00
Hivert Quentin f7fce46371 chore(release): 5.12.10 2026-08-13 10:17:59 +02:00
Hivert Quentin 2a8f20e080 i18n(hu): Update Hungarian translations 2026-08-13 10:03:55 +02:00
Hivert Quentin 41e2b7b1ab fix(bug): escape angularJS only if needed to keep legitimate directive 2026-08-12 10:53:51 +02:00
Hivert Quentin f0c23407bf chore(sendmail): disable sendmail for now 2026-08-11 17:34:50 +02:00
Hivert Quentin 1caa25711f fix(bug): incorrect method called 2026-08-11 17:06:27 +02:00
Hivert Quentin a156f4ce9f fix(passwordRecoveyr): get the domain from the user mail 2026-08-10 19:35:31 +02:00
Hivert Quentin 47133fdf3b fix(mail): escape angularJS directive for description 2026-08-10 19:34:25 +02:00
Hivert Quentin 78807d01ae fix(dav): properly parse MKCOL request 2026-08-10 19:31:32 +02:00
smizrahi aefc14b265 feat(sogo-tool): add init-user command to create a user's personal folders and preferences without a login 2026-07-15 15:03:37 +02:00
Vincent Bonamy a99a848064 Revert cleanup of usesCASAuthentication on c3234882eb - useful for CAS-specific frontend recovery logic 2026-06-15 08:56:23 +02:00
Hivert Quentin 3a78a3bbb4 fix(calendar): do not transmit og http status to external calendar 2026-06-09 10:26:58 +02:00
smizrahi f11f34cdef fix(mail): escape References/Organization/Newsgroups headers in HTML forward so message-id chevrons aren't parsed as HTML tags hiding the quoted body. Closes #6046. 2026-06-04 11:53:58 +02:00
smizrahi 39a35830e9 fix(ckeditor): Sync resized image width/height into style and HTML attributes so Outlook and other mail clients ignoring CSS aspect-ratio render the correct dimensions. Closes #6169. 2026-06-04 11:53:58 +02:00
smizrahi 6904911ac1 fix(mail): Some links broken in HTML rendering due to libxml2 (SOPE) only supporting HTML4 — when an anchor has no content between its opening and closing tags, store it and re-open it around the next element, closing </a> after that element's end tag. Closes #5961. Closes #6172. 2026-06-04 11:53:58 +02:00
Hivert Quentin fbd5bd19c6 Merge branch 'master' of github.com:Alinto/sogo 2026-05-29 01:00:09 -04:00
Hivert Quentin 97bbd7ed7f fix(tool): wrong method called 2026-05-28 14:57:59 +02:00
Hivert Quentin b5c83f5839 fix(event): clean import of event 2026-05-28 13:27:08 +02:00
Hivert Quentin b978ceb020 Merge branch 'master' of github.com:Alinto/sogo 2026-05-28 01:00:08 -04:00
Hivert Quentin d97472b93c chore(release): 5.12.9 2026-05-27 10:25:16 +02:00
Hivert Quentin d823cadda0 i18n(es_ES): Update SpanishSpain translations 2026-05-27 10:22:10 +02:00
Hivert Quentin fd427f9196 i18n(ca): Update Catalan translations 2026-05-27 10:22:10 +02:00
Hivert Quentin b18f1a09f5 fix(event): clean import of event 2026-05-26 10:30:02 +02:00
Hivert Quentin accc1c2302 chore(js/css): update generated files 2026-05-20 01:01:08 -04:00
Hivert Quentin 6e590115fb fix(mail): do not encode non-html element 2026-05-19 10:01:46 +02:00
Hivert Quentin c45233c11e fix(pref): prevent onevent cleaning to remove legitimate words 2026-05-19 09:30:58 +02:00
Hivert Quentin 27ad4ddbab chore(js/css): update generated files 2026-05-13 01:01:07 -04:00
Jordi Mallach e27b083213 Update onEvent test to match expectation after the XSS fixes 2026-05-12 13:19:09 +02:00
Hivert Quentin be440baa23 fix(mail): render the subject without html when searching 2026-05-12 08:52:18 +02:00
Hivert Quentin 28c4daa504 chore(release): 5.12.8 2026-05-11 09:20:31 +02:00
Hivert Quentin 4e5c2516d4 i18n(pl): Update Polish translations 2026-05-11 09:16:30 +02:00
Hivert Quentin baf26ae19d chore(js/css): update generated files 2026-05-09 01:01:08 -04:00
Hivert Quentin 0cb21f8fb9 fix(mail): correctly render mail when searching 2026-05-08 11:02:52 +02:00
Hivert Quentin d7232618e6 fix(css): do not escape css if missing 2026-05-08 10:25:54 +02:00
Hivert Quentin 93b82a0f60 fix(openid): check the userinfo mail + avoid infinite loop 2026-05-05 10:39:38 +02:00
Hivert Quentin 2af96d10d5 chore(js/css): update generated files 2026-05-05 01:01:07 -04:00
Hivert Quentin 29d0bbc9eb fix(mail): render properly the subject v2 2026-05-03 16:57:25 +02:00
Hivert Quentin 67ce01ec2a fix(mail): sanitise mail with ics (invitation to event) 2026-05-03 15:08:15 +02:00
Hivert Quentin 6119d6cf23 fix(mail): remove negative margin from mail 2026-04-24 09:16:31 +02:00
Hivert Quentin 0ddc4281b8 chore(js/css): update generated files 2026-04-24 01:01:04 -04:00
Hivert Quentin b7641be5c8 fix(UI): render properly the subject 2026-04-23 16:39:43 +02:00
Hivert Quentin d902756aaf fix(acl): fix folder path 2026-04-21 13:52:19 +02:00
Hivert Quentin f9b71059f4 fix(acl): only add existing uid 2026-04-20 09:08:40 +02:00
Hivert Quentin ee2ebbb81c chore(js/css): update generated files 2026-04-02 01:01:12 -04:00
Hivert Quentin 6f0b4f9d05 chore(release): 5.12.7 2026-03-30 10:19:00 +02:00
Hivert Quentin 40228c619b i18n(all): update several translations 2026-03-30 10:06:08 +02:00
Hivert Quentin d7f02b6083 fix(typo): pass the correct arg to checkLogin 2026-03-26 09:07:05 +01:00
tkeriven 453ddceae9 Merge pull request #379 from Alinto/fix_6065
fix(sql): use proper sql adaptor for usr source
2026-03-25 17:20:52 +01:00
Hivert Quentin 55d615e4dd i18n(fr): Typo in French 2026-03-25 09:21:42 +01:00
Hivert Quentin 1f7e5d2b2c fix(sql): use proper sql adaptor for usr source 2026-03-24 15:26:37 +01:00
Hivert Quentin f322fa2721 chore(release): 5.12.6 2026-03-19 13:49:13 +01:00
Hivert Quentin 623f083cd9 fix(totp): new user can properly use totp 2026-03-19 13:30:28 +01:00
Hivert Quentin 7f7e1ad496 chore(release): 5.12.5 2026-03-03 12:49:33 +01:00
Hivert Quentin 4f92da4971 chore(js/css): update generated files 2026-03-03 01:01:16 -05:00
Hivert Quentin 1fdb4d3026 i18n(pt): Add Greek (partial) 2026-03-02 15:01:52 +01:00
Hivert Quentin fbd056cc29 i18n(pt): Update Portuguese translations 2026-03-02 11:49:55 +01:00
Hivert Quentin 39b820a549 i18n(pt_BR): Update BrazilianPortuguese translations 2026-03-02 11:49:55 +01:00
Hivert Quentin 1be58da745 i18n(ru): Update Russian translations 2026-03-02 11:49:55 +01:00
Hivert Quentin 6ce884b3e7 i18n(es_ES): Update SpanishSpain translations 2026-03-02 11:49:55 +01:00
Hivert Quentin 4a587fe000 i18n(ca): Update Catalan translations 2026-03-02 11:49:54 +01:00
Hivert Quentin d993227b36 i18n(th): Update Thai translations 2026-03-02 11:49:54 +01:00
Hivert Quentin 54e65233d9 chore(js/css): update generated files 2026-03-02 09:15:14 +00:00
Hivert Quentin 2c2dbe4c61 chore(js/css): update generated files 2026-02-26 01:00:41 -05:00
Hivert Quentin d7e51655fb fix(minsearch): fix instance of minsearch 2026-02-25 17:33:05 +01:00
Hivert Quentin 83d4c522f8 fix(vulnerability): properly change the totp code after disabling it 2026-02-25 15:23:57 +01:00
Hivert Quentin e821b20f87 fix(vulnerability): prevent javascript njection with hint query 2026-02-24 17:06:04 +01:00
Hivert Quentin dba92852f1 chore(js/css): update generated files 2026-02-06 01:00:40 -05:00
Hivert Quentin af984f58c0 fix(Mail): correctly update quota when refreshing 2026-02-05 10:51:41 +01:00
Hivert Quentin 71d865b86a fix(identity): fix signatrue when changing identity 2026-02-05 08:48:28 +01:00
Hivert Quentin 3abbc31ed4 chore(js/css): update generated files 2026-01-30 01:00:38 -05:00
Hivert Quentin 389e8e64c4 fix(ui): prevent UI to search for users with empty string 2026-01-29 15:58:00 +01:00
Hivert Quentin b46bf8b8dd chore(js/css): update generated files 2026-01-22 01:00:37 -05:00
Hivert Quentin 7a09408ef8 chore(js/css): update generated files 2025-12-31 01:00:38 -05:00
Hivert Quentin 95efe73e69 fix(encryptedUrl): fix cache key data and expect uncrypted name for freebusy 2025-12-22 17:28:49 +01:00
Hivert Quentin eb77a8e048 chore(js/css): update generated files 2025-12-17 01:00:34 -05:00
Hivert Quentin 7876013a4c fix(event): also add jitsi url in the location as outlook doesn't support attach url 2025-12-16 10:50:34 +01:00
Hivert Quentin e9b3f2a43d fix(vulnerability): prevent xss with events, tasks and contacts categories 2025-12-16 10:25:49 +01:00
vrubim 47239ba0fd add remaining traslations for catalan and spanish 2025-12-12 10:27:17 +01:00
Hivert Quentin 6f916008e9 fix(login): prevent user search for login keyword 2025-12-09 11:05:52 +01:00
Hivert Quentin 16ab99e7cf fix(vulnerability): prevent sogo to execute scripts pass in theme query 2025-11-26 13:22:38 +01:00
Hivert Quentin bd0547fb73 chore(js/css): update generated files 2025-11-25 01:00:34 -05:00
Hivert Quentin 03fa91dc22 fix(mail): use the correct replyTo when set to a non*default identity 2025-11-24 15:44:21 +01:00
Hivert Quentin e2b8494a9c fix(trad): typo in a transation key 2025-10-16 17:03:30 +02:00
Hivert Quentin d69f55c265 fix(tool): ranem-user properly change data in c_defaults and c_settings 2025-10-16 11:32:39 +02:00
Hivert Quentin f8638a3f4e fix(db): increase some column size 2025-10-15 17:07:37 +02:00
Hivert Quentin f18e3a05c3 chore(realease): 5.12.4 2025-10-06 09:52:02 +02:00
Hivert Quentin 6425a62e1a i18n(cy): Update Welsh translations 2025-10-06 09:47:41 +02:00
Hivert Quentin 5021376daf i18n(uk): Update Ukrainian translations 2025-10-06 09:47:41 +02:00
Hivert Quentin 8c38c9ce03 i18n(tr_TR): Update TurkishTurkey translations 2025-10-06 09:47:41 +02:00
Hivert Quentin f86a32d0a1 i18n(th): Update Thai translations 2025-10-06 09:47:41 +02:00
Hivert Quentin 2ebb63767e i18n(sv): Update Swedish translations 2025-10-06 09:47:41 +02:00
Hivert Quentin c755ab3b4e i18n(es_ES): Update SpanishSpain translations 2025-10-06 09:47:41 +02:00
Hivert Quentin 07e9d34865 i18n(es_AR): Update SpanishArgentina translations 2025-10-06 09:47:40 +02:00
Hivert Quentin 645be8fcc5 i18n(sl_SI): Update Slovenian translations 2025-10-06 09:47:39 +02:00
Hivert Quentin 0f24c17516 i18n(sk): Update Slovak translations 2025-10-06 09:47:39 +02:00
Hivert Quentin c675dbfaa7 i18n(sr@latin): Update SerbianLatin translations 2025-10-06 09:47:39 +02:00
Hivert Quentin dd367b0e94 i18n(sr): Update Serbian translations 2025-10-06 09:47:39 +02:00
Hivert Quentin 1a80fd6284 i18n(ru): Update Russian translations 2025-10-06 09:47:39 +02:00
Hivert Quentin ec4d7807d9 i18n(ro_RO): Update Romanian translations 2025-10-06 09:47:38 +02:00
Hivert Quentin 972ffcc0c6 i18n(pt): Update Portuguese translations 2025-10-06 09:47:38 +02:00
Hivert Quentin 3a442f1b3d i18n(nn_NO): Update NorwegianNynorsk translations 2025-10-06 09:47:38 +02:00
Hivert Quentin eab6d9f249 i18n(nb_NO): Update NorwegianBokmal translations 2025-10-06 09:47:38 +02:00
Hivert Quentin 3dc9b90992 i18n(sr_ME@latin): Update Montenegrin translations 2025-10-06 09:47:38 +02:00
Hivert Quentin 798bed54e2 i18n(mk_MK): Update Macedonian translations 2025-10-06 09:47:38 +02:00
Hivert Quentin 2b455fe587 i18n(lt): Update Lithuanian translations 2025-10-06 09:47:38 +02:00
Hivert Quentin ad7dc8f45e i18n(lv): Update Latvian translations 2025-10-06 09:47:38 +02:00
Hivert Quentin ed9121175a i18n(ko): Update Korean translations 2025-10-06 09:47:38 +02:00
Hivert Quentin 6514fbb8f1 i18n(kk): Update Kazakh translations 2025-10-06 09:47:38 +02:00
Hivert Quentin 9a295c5944 i18n(ja): Update Japanese translations 2025-10-06 09:47:38 +02:00
Hivert Quentin 1bb74c7522 i18n(it): Update Italian translations 2025-10-06 09:47:38 +02:00
Hivert Quentin 56e4929ca7 i18n(id_ID): Update Indonesian translations 2025-10-06 09:47:38 +02:00
Hivert Quentin 401e2f51cd i18n(is): Update Icelandic translations 2025-10-06 09:47:38 +02:00
Hivert Quentin 799e8c21af i18n(hu): Update Hungarian translations 2025-10-06 09:47:38 +02:00
Hivert Quentin 070705acfa i18n(he): Update Hebrew translations 2025-10-06 09:47:38 +02:00
Hivert Quentin 95e19379f6 i18n(de): Update German translations 2025-10-06 09:47:38 +02:00
Hivert Quentin f017fef4b2 i18n(gl): Update Galician translations 2025-10-06 09:47:38 +02:00
Hivert Quentin a914fd4151 i18n(fr): Update French translations 2025-10-06 09:47:38 +02:00
Hivert Quentin c0c506f910 i18n(fi): Update Finnish translations 2025-10-06 09:47:38 +02:00
Hivert Quentin b42882b564 i18n(nl): Update Dutch translations 2025-10-06 09:47:38 +02:00
Hivert Quentin ae293ec3ce i18n(da_DK): Update Danish translations 2025-10-06 09:47:38 +02:00
Hivert Quentin e662f10389 i18n(hr_HR): Update Croatian translations 2025-10-06 09:47:37 +02:00
Hivert Quentin c7a519ca12 i18n(zh_TW): Update ChineseTaiwan translations 2025-10-06 09:47:37 +02:00
Hivert Quentin 22ab0b3c75 i18n(zh_CN): Update ChineseChina translations 2025-10-06 09:47:37 +02:00
Hivert Quentin b77129e2e7 i18n(ca): Update Catalan translations 2025-10-06 09:47:37 +02:00
Hivert Quentin 4585293d99 i18n(bg_BG): Update Bulgarian translations 2025-10-06 09:47:37 +02:00
Hivert Quentin 9d277c3f15 i18n(pt_BR): Update BrazilianPortuguese translations 2025-10-06 09:47:37 +02:00
Hivert Quentin 4461122697 i18n(bs_BA): Update Bosnian translations 2025-10-06 09:47:37 +02:00
Hivert Quentin b96e531f66 i18n(eu): Update Basque translations 2025-10-06 09:47:37 +02:00
Hivert Quentin 6c3e66142f i18n(ar): Update Arabic translations 2025-10-06 09:47:37 +02:00
Hivert Quentin 16fcb46c4b i18n(pl): Update Polish translations 2025-10-06 09:47:37 +02:00
Hivert Quentin f252e0e2c2 i18n(cs): Update Czech translations 2025-10-06 09:47:37 +02:00
Hivert Quentin 09d87b2d23 chore(UI): update theme-default 2025-10-06 09:33:17 +02:00
Hivert Quentin 9e20190fad fix(login): Only remember the login if the auth was successful 2025-10-02 13:37:56 +02:00
Hivert Quentin 981748754a fix(mailer): don't add mailto: to string starting with @ 2025-09-24 09:18:08 +02:00
Hivert Quentin 8d8ef5fd67 chore(js/css): update generated files 2025-09-23 01:00:35 -04:00
Hivert Quentin 666c979eea fix(mailer): correctly show interline for p element 2025-09-22 09:57:12 +02:00
Hivert Quentin 1d59c616ac chore(js/css): update generated files 2025-09-20 01:00:35 -04:00
Hivert Quentin a7f7950d91 fix(eas): use proper imap mech for EAS request when using openid 2025-09-19 16:47:16 +02:00
Hivert Quentin 5d616600df feat(mail): Add a setting to show the attachments above the mail body 2025-09-19 15:30:45 +02:00
Hivert Quentin a077512e34 fix(ui): add css class for login page 2025-09-19 09:50:15 +02:00
Hivert Quentin 23c8648169 fix(label): missing trad 2025-09-17 13:48:39 +02:00
Hivert Quentin 9fad7e6f9c chore(packaging): prepare debian 13 2025-09-16 16:11:23 +02:00
Hivert Quentin 0fb3db0608 fix(label): ensure the translation kept is not null 2025-09-16 16:09:01 +02:00
Hivert Quentin a7651e56c5 fix(task): fix reminder for tasks 2025-09-15 17:21:47 +02:00
Emily Kooistra 481a9bf1de perf(calendar): don't allocate and copy all children for each time we call _filterComponent:
Improving the filtering of the calender objects, keeping a global static of the array of tags
that are allowed. And using removeChildren to prevent the need of a full copy while we iterate
over it.
2025-09-15 15:43:05 +02:00
Emily Kooistra f48f27c812 perf(core): store translations in a globally static NSMutableDictionary
fetching public ICS files without this patch result in continual opening
and closing of the "Localizable.strings" to create a NSDictionary,
looking up one key and closing it again. By caching it in a static
variable this greatly improves the performance.
2025-09-15 15:43:05 +02:00
Hivert Quentin 86d94ab8fe fix(log): remove the ics from the log line 2025-08-27 10:19:42 +02:00
Hivert Quentin aba41a06b4 chore(js/css): update generated files 2025-08-21 01:00:36 -04:00
Hivert Quentin ed7a136e0f fix(password): Correctly check the secret question answer when hitting enter instead of the button next 2025-08-20 14:04:31 +02:00
Patrick Ben Koetter d99f020f82 chore(doc): Modernized Headings for easier editing (#370) 2025-08-08 10:45:12 +02:00
Hivert Quentin 244d1388eb fix(calendar): fetch our own iana timezone instead of trusting VTIMEZONE 2025-08-01 11:56:06 +02:00
Hivert Quentin dfcbbba514 chore(build): remove unnecessary import 2025-07-29 13:50:52 +02:00
Hivert Quentin 7bee193413 fix(mail): preoperly generates the message-id header value 2025-07-28 17:40:14 +02:00
Hivert Quentin 4ef79e219c fix(openid): correcly type userTokenInterval 2025-07-28 16:08:17 +02:00
Hivert Quentin 736d7589b1 fix(ldap): fetch the correct user source when creating an event with an attendee 2025-07-28 13:52:15 +02:00
Hivert Quentin 4d8cca10f6 fix(kdap): don't try to fetch for a nobody user 2025-07-28 13:28:30 +02:00
Hivert Quentin c8dd5535b3 fix(sieveà: Sieve use the correct imap auth mechanism 2025-07-24 15:03:30 +02:00
Hivert Quentin 42f620e562 fix(curl): properly close curl connection 2025-07-24 14:46:45 +02:00
Hivert Quentin 3662846900 chore(js/css): update generated files 2025-07-22 01:00:32 -04:00
Hivert Quentin b9f6b90740 Revert "fix(view): automatically refresh view only if a number is set."
This reverts commit 55dbae6bee.
2025-07-21 13:11:30 +02:00
Hivert Quentin b69ef6d7a5 chore(release): 5.12.3 2025-07-12 09:44:17 +02:00
Hivert Quentin 3ab86776e2 fix(calendar): fix recurrent event last date
Fix a bug introduces by #8766b7c
2025-07-08 15:26:09 +02:00
Hivert Quentin 7fa0daea43 chore(js/css): update generated files 2025-07-08 01:00:38 -04:00
Hivert Quentin 55dbae6bee fix(view): automatically refresh view only if a number is set. 2025-07-07 15:39:59 +02:00
Hivert Quentin d48befd151 chore(js/css): update generated files 2025-07-04 01:00:36 -04:00
Hivert Quentin f5f8f112cd chore(language): Add Thai language 2025-07-03 16:59:56 +02:00
Hivert Quentin 08bc6aff3f chore(language): Add Korean language 2025-07-03 09:35:50 +02:00
Hivert Quentin 8290cf2859 chore(doc): add doc por api 2025-06-25 14:16:17 +02:00
Hivert Quentin 8f03432a55 chore(release): 5.12.2 2025-06-25 09:34:32 +02:00
Hivert Quentin 9649ae345f i18n(pt): Update Portuguese translations 2025-06-25 08:52:35 +02:00
Hivert Quentin e9c03d3cf7 i18n(tr_TR): Update TurkishTurkey translations 2025-06-25 08:52:35 +02:00
Hivert Quentin 031e117cba i18n(nl): Update Dutch translations 2025-06-25 08:52:34 +02:00
Hivert Quentin dabad1d0cf fix(api): add handler for internal error 2025-06-24 10:20:12 +02:00
Hivert Quentin c1b6388260 chore(packaging): fix rhel packaging 2025-06-24 09:30:28 +02:00
Hivert Quentin bc6b849d66 chore(js/css): update generated files 2025-06-24 01:00:36 -04:00
Hivert Quentin 51f1521dba feat(api): add endpoint for caldav/cardav url 2025-06-23 17:14:39 +02:00
Hivert Quentin 516606baff fix(session): allow password/token to be longer than userkey 2025-06-23 09:27:51 +02:00
Hivert Quentin a782424a30 feat(openid): swicth to libcurl for http request
It was using an internal library before and there were too much errors due to incomplete http's protocol implementation
2025-06-23 09:24:02 +02:00
Hivert Quentin f53d7b73db fix(sieve): add requirements for notify when doing a filter 2025-06-19 09:40:58 +02:00
Hivert Quentin 8766b7c6b3 fix(calendar): properly evalute last occurance freebusy 2025-06-17 11:31:00 +02:00
Hivert Quentin 8a907737de fix(view): don't hide the option mailcomposer in small screen 2025-06-16 11:14:08 +02:00
Hivert Quentin 1a6f2825b6 chore(foc): put a link to the community version 2025-06-11 13:52:36 +02:00
Hivert Quentin 9954c3607b fix(openid): allow expires_in param to be null 2025-05-21 14:50:41 +02:00
Hivert Quentin 085fc4a9eb fix(openid): add state in connection flow 2025-05-20 09:08:46 +02:00
Hivert Quentin e36d0d219b fix(password): put correct regex for special char 2025-05-13 16:51:08 +02:00
Hivert Quentin c5fb3482e2 fix(openid): make end_session_endpoint optional 2025-05-13 16:03:13 +02:00
Hivert Quentin bc4c9ba0e6 chore(release): 5.12.1 2025-04-30 10:59:22 +02:00
Hivert Quentin 54debcf47d i18n(cy): Update Welsh translations 2025-04-30 10:56:22 +02:00
Hivert Quentin 6d8d4f7c39 i18n(sv): Update Swedish translations 2025-04-30 10:56:22 +02:00
Hivert Quentin 4b397f68f5 i18n(es_AR): Update SpanishArgentina translations 2025-04-30 10:56:22 +02:00
Hivert Quentin fdb88abc12 i18n(sl_SI): Update Slovenian translations 2025-04-30 10:56:22 +02:00
Hivert Quentin d3e5a004db i18n(sk): Update Slovak translations 2025-04-30 10:56:22 +02:00
Hivert Quentin 9f4440b07f i18n(sr@latin): Update SerbianLatin translations 2025-04-30 10:56:22 +02:00
Hivert Quentin 3e61a52673 i18n(sr): Update Serbian translations 2025-04-30 10:56:22 +02:00
Hivert Quentin 532b8dc202 i18n(ro_RO): Update Romanian translations 2025-04-30 10:56:22 +02:00
Hivert Quentin 828f85c720 i18n(nn_NO): Update NorwegianNynorsk translations 2025-04-30 10:56:22 +02:00
Hivert Quentin aa6575c42b i18n(sr_ME@latin): Update Montenegrin translations 2025-04-30 10:56:21 +02:00
Hivert Quentin 1ba83ec57d i18n(mk_MK): Update Macedonian translations 2025-04-30 10:56:21 +02:00
Hivert Quentin bbc04913b9 i18n(lt): Update Lithuanian translations 2025-04-30 10:56:21 +02:00
Hivert Quentin 1dcf475d3b i18n(lv): Update Latvian translations 2025-04-30 10:56:21 +02:00
Hivert Quentin 1bf955d193 i18n(kk): Update Kazakh translations 2025-04-30 10:56:21 +02:00
Hivert Quentin 264f94b64d i18n(ja): Update Japanese translations 2025-04-30 10:56:20 +02:00
Hivert Quentin d7fc5a52b8 i18n(it): Update Italian translations 2025-04-30 10:56:20 +02:00
Hivert Quentin 5f6168d536 i18n(id_ID): Update Indonesian translations 2025-04-30 10:56:20 +02:00
Hivert Quentin c792ddb601 i18n(is): Update Icelandic translations 2025-04-30 10:56:20 +02:00
Hivert Quentin c31b3f4592 i18n(hu): Update Hungarian translations 2025-04-30 10:56:20 +02:00
Hivert Quentin f4adf6267d i18n(he): Update Hebrew translations 2025-04-30 10:56:20 +02:00
Hivert Quentin aae9e6065f i18n(fi): Update Finnish translations 2025-04-30 10:56:20 +02:00
Hivert Quentin 20e7c890de i18n(nl): Update Dutch translations 2025-04-30 10:56:20 +02:00
Hivert Quentin 961702de67 i18n(hr_HR): Update Croatian translations 2025-04-30 10:56:20 +02:00
Hivert Quentin 3ac01f7051 i18n(zh_TW): Update ChineseTaiwan translations 2025-04-30 10:56:20 +02:00
Hivert Quentin bbd17f5531 i18n(zh_CN): Update ChineseChina translations 2025-04-30 10:56:20 +02:00
Hivert Quentin 8c4f56c971 i18n(ca): Update Catalan translations 2025-04-30 10:56:20 +02:00
Hivert Quentin 1d0b6a622c i18n(bg_BG): Update Bulgarian translations 2025-04-30 10:56:20 +02:00
Hivert Quentin ade923d21d i18n(bs_BA): Update Bosnian translations 2025-04-30 10:56:20 +02:00
Hivert Quentin 54f8af30ce i18n(eu): Update Basque translations 2025-04-30 10:56:20 +02:00
Hivert Quentin 5c48745c94 i18n(ar): Update Arabic translations 2025-04-30 10:56:20 +02:00
Chris 4ec3d2091a fix(typo): Fix typo 'attachements' (#367)
* fix: Fix typo 'attachements'
* fix: Use original translation key for typo fix
2025-04-29 14:50:29 +02:00
Hivert Quentin 3616e56289 fix(db): log an error if the table sogo_folder_info is malformed 2025-04-16 15:54:11 +02:00
Hivert Quentin 47548f0939 chore(js/css): update generated files 2025-04-16 03:49:18 -04:00
smizrahi 068f1f3154 fix(ui): Change angular material to fix issues with Safari iOS 18+ 2025-04-16 09:48:36 +02:00
Hivert Quentin c88f95586a chore(js/css): update generated files 2025-04-16 01:00:33 -04:00
smizrahi 07c75280bb fix(ui): Change angular material to fix issues with Safari iOS 18+ 2025-04-15 19:00:33 +02:00
Hivert Quentin 0fadd4cb72 fic(notificaiton): remove the unintended rules on email that was the same as for forward 2025-04-15 14:05:52 +02:00
Hivert Quentin eb7f551e88 fix(calendar): properly show the URL property in iCalendar 2025-04-15 09:27:35 +02:00
Hivert Quentin 148fab9409 fix(calendar): put valarm at the end of vevent block to satisfy outlook.office.com which is too lazy to follow the spec 2025-04-09 11:15:59 +02:00
Hivert Quentin 7c59e6b3bf fix(sieve): Correctly update default sieve filter for new users 2025-04-09 10:14:05 +02:00
Hivert Quentin ca425e6752 fix(ldap): update baseDN with correct domain if needed 2025-04-09 08:52:46 +02:00
Hivert Quentin 9e431d08a2 fix(iOS): iOS 18.4 encodes caldav url and put %40 instead of @ for username. Fix that. 2025-04-01 16:18:02 +02:00
Hivert Quentin 788ece452b fix(smtp): fix string type 2025-04-01 10:05:26 +02:00
Hivert Quentin 696b8eed4d chore(js/css): update generated files 2025-04-01 01:00:34 -04:00
Slávek Banko ab9f0c1bf1 fix(calendar): Fix typo Jisti × Jitsi
Signed-off-by: Slávek Banko <slavek.banko@axis.cz>
2025-03-31 21:03:47 +02:00
Slávek Banko 4a68909060 feat(calendar): Make the Jitsi meeting room prefix configurable
Signed-off-by: Slávek Banko <slavek.banko@axis.cz>
2025-03-31 21:03:47 +02:00
Hivert Quentin 1f8dc12929 fix(folder): fix folders sorting for special folders 2025-03-31 18:01:10 +02:00
Hivert Quentin 7c6b6743e0 fix(tnef): add protection against malformed winmail.dat 2025-03-26 16:22:12 +01:00
Hivert Quentin 4be3ba227c chore(release): 5.12.0 2025-03-24 10:34:09 +01:00
Hivert Quentin 3aa14a43e2 chore(timezones): Update to version 2025b 2025-03-24 10:18:24 +01:00
Hivert Quentin f6d18c208e i18n(fr): Update French translations 2025-03-24 09:57:16 +01:00
Hivert Quentin 7c36a65b7c i18n(cy): Update Welsh translations 2025-03-24 09:57:16 +01:00
Hivert Quentin 52ae03d064 i18n(uk): Update Ukrainian translations 2025-03-24 09:57:16 +01:00
Hivert Quentin a860101003 i18n(tr_TR): Update TurkishTurkey translations 2025-03-24 09:57:16 +01:00
Hivert Quentin 397d0ee5fc i18n(sv): Update Swedish translations 2025-03-24 09:57:16 +01:00
Hivert Quentin da15327c92 i18n(es_ES): Update SpanishSpain translations 2025-03-24 09:57:15 +01:00
Hivert Quentin f273d3e513 i18n(es_AR): Update SpanishArgentina translations 2025-03-24 09:57:15 +01:00
Hivert Quentin 9a3a06c957 i18n(sl_SI): Update Slovenian translations 2025-03-24 09:57:15 +01:00
Hivert Quentin 5753a52ab4 i18n(sk): Update Slovak translations 2025-03-24 09:57:15 +01:00
Hivert Quentin b86f59411a i18n(sr@latin): Update SerbianLatin translations 2025-03-24 09:57:15 +01:00
Hivert Quentin 20d6b98f07 i18n(sr): Update Serbian translations 2025-03-24 09:57:14 +01:00
Hivert Quentin 80abd1d896 i18n(ru): Update Russian translations 2025-03-24 09:57:14 +01:00
Hivert Quentin 4438a2e647 i18n(ro_RO): Update Romanian translations 2025-03-24 09:57:14 +01:00
Hivert Quentin 81406434d6 i18n(pt): Update Portuguese translations 2025-03-24 09:57:14 +01:00
Hivert Quentin 65f7b2552a i18n(pl): Update Polish translations 2025-03-24 09:57:13 +01:00
Hivert Quentin d23bb125a3 i18n(nn_NO): Update NorwegianNynorsk translations 2025-03-24 09:57:13 +01:00
Hivert Quentin 39fa4fc38f i18n(nb_NO): Update NorwegianBokmal translations 2025-03-24 09:57:13 +01:00
Hivert Quentin ae4d6a07f3 i18n(sr_ME@latin): Update Montenegrin translations 2025-03-24 09:57:13 +01:00
Hivert Quentin d43f3378a5 i18n(mk_MK): Update Macedonian translations 2025-03-24 09:57:13 +01:00
Hivert Quentin 2bf0780942 i18n(lt): Update Lithuanian translations 2025-03-24 09:57:12 +01:00
Hivert Quentin 4367ca5247 i18n(lv): Update Latvian translations 2025-03-24 09:57:12 +01:00
Hivert Quentin 7617db7383 i18n(kk): Update Kazakh translations 2025-03-24 09:57:12 +01:00
Hivert Quentin 4d5cf314b5 i18n(it): Update Italian translations 2025-03-24 09:57:12 +01:00
Hivert Quentin 7b0319d616 i18n(id_ID): Update Indonesian translations 2025-03-24 09:57:12 +01:00
Hivert Quentin 0f2faec7d4 i18n(is): Update Icelandic translations 2025-03-24 09:57:12 +01:00
Hivert Quentin 51cf90d620 i18n(hu): Update Hungarian translations 2025-03-24 09:57:12 +01:00
Hivert Quentin ef6f53f48c i18n(he): Update Hebrew translations 2025-03-24 09:57:11 +01:00
Hivert Quentin 1f379d51fd i18n(de): Update German translations 2025-03-24 09:57:11 +01:00
Hivert Quentin a98d4b9944 i18n(gl): Update Galician translations 2025-03-24 09:57:11 +01:00
Hivert Quentin e0677705aa i18n(fi): Update Finnish translations 2025-03-24 09:57:11 +01:00
Hivert Quentin f110498d3f i18n(nl): Update Dutch translations 2025-03-24 09:57:11 +01:00
Hivert Quentin 2912e07e0b i18n(da_DK): Update Danish translations 2025-03-24 09:57:10 +01:00
Hivert Quentin ac6abb66ec i18n(cs): Update Czech translations 2025-03-24 09:57:10 +01:00
Hivert Quentin 6bb9796550 i18n(hr_HR): Update Croatian translations 2025-03-24 09:57:09 +01:00
Hivert Quentin 7d8b8a4ba3 i18n(zh_TW): Update ChineseTaiwan translations 2025-03-24 09:57:08 +01:00
Hivert Quentin d72cc8fdef i18n(zh_CN): Update ChineseChina translations 2025-03-24 09:57:08 +01:00
Hivert Quentin 83bdc145f9 i18n(ca): Update Catalan translations 2025-03-24 09:57:08 +01:00
Hivert Quentin 60f2f1b9fc i18n(bg_BG): Update Bulgarian translations 2025-03-24 09:57:08 +01:00
Hivert Quentin 0bc20b1b79 i18n(pt_BR): Update BrazilianPortuguese translations 2025-03-24 09:57:08 +01:00
Hivert Quentin 5c2020dc3e i18n(bs_BA): Update Bosnian translations 2025-03-24 09:57:08 +01:00
Hivert Quentin 0dccf10505 i18n(eu): Update Basque translations 2025-03-24 09:57:07 +01:00
Hivert Quentin 6de11e58ee i18n(ar): Update Arabic translations 2025-03-24 09:57:06 +01:00
Hivert Quentin 4c09ebfb6e i18n(ja): Update Japanese translations 2025-03-24 09:57:06 +01:00
Hivert Quentin d1d9024eca fix(auth): add missing method to auth class 2025-03-19 14:05:49 +01:00
Hivert Quentin 7328623e11 fix(addressBook): fix #2f9c2cf show email if no display name for contact in list 2025-03-18 10:02:14 +01:00
Hivert Quentin c53f09ddec chore(js/css): update generated files 2025-03-14 01:00:44 -04:00
Hivert Quentin 50ba658fbd chore(doc): add extra step for container 2025-03-13 17:19:02 +01:00
Hivert Quentin a1f2670485 revert: feat add url for creating account on login page 2025-03-13 15:47:16 +01:00
826 changed files with 65965 additions and 2584 deletions

No files matched your search

+1 -1
View File
@@ -15,9 +15,9 @@
* *
* **************************************************************************/
/* Database configuration (mysql://, postgresql:// or oracle://) */
WOPort = "0.0.0.0:50000";
/* Database configuration (mysql://, postgresql:// or oracle://) */
// MySQL
SOGoProfileURL = "mysql://sogobuild:sogo123@mariadb:3306/sogo/sogo_user_profile";
+3 -1
View File
@@ -17,7 +17,9 @@ Simply clone the source code of the SOGo repo and open id with Visual Code Studi
When it's all build, go to http://127.0.0.1/SOGo. You have 3 users to login with:
`sogo-tests1`, `sogo-tests2`, `sogo-tests3` with all the same password `sogo`
You can only send mail and receive mail within the domain `example.org`
You can only send mail and receive mail among those three users.
**If you have troubles, you may need to build sogo once, see the next section for that.**
## How to work on SOGo
+1
View File
@@ -10,6 +10,7 @@
*/obj/
.scss-lint-config.yml_
ActiveSync/ActiveSync.SOGo
API/API.SOGo
Documentation/*.docbook
Documentation/*.pdf
Documentation/*.html
+1 -1
View File
@@ -1,3 +1,3 @@
[submodule "UI/WebServerResources/angular-material"]
path = UI/WebServerResources/angular-material
url = https://github.com/angular/material
url = https://github.com/Alinto/material.git
+1 -1
View File
@@ -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
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
+28
View File
@@ -0,0 +1,28 @@
# GNUstep makefile
include common.make
BUNDLE_NAME = API
API_PRINCIPAL_CLASS = SOGoAPIProduct
API_OBJC_FILES = \
SOGoAPIProduct.m \
SOGoAPI.m \
SOGoAPIVersion.m \
SOGoAPIUserFolder.m \
SOGoAPIDispatcher.m
API_RESOURCE_FILES += \
product.plist
API_LANGUAGES = $(SOGO_LANGUAGES)
API_LOCALIZED_RESOURCE_FILES = Localizable.strings
ADDITIONAL_INCLUDE_DIRS += -I../SOPE/ -I../SoObjects/
-include GNUmakefile.preamble
include $(GNUSTEP_MAKEFILES)/bundle.make
-include GNUmakefile.postamble
+16
View File
@@ -0,0 +1,16 @@
# compile settings
ADDITIONAL_CPPFLAGS += \
-DSOGO_MAJOR_VERSION=$(MAJOR_VERSION) \
-DSOGO_MINOR_VERSION=$(MINOR_VERSION) \
-DSOGO_PATCH_VERSION=$(SUBMINOR_VERSION) \
-DSOGO_LIBDIR="@\"$(SOGO_LIBDIR)\""
ADDITIONAL_INCLUDE_DIRS += \
-D_GNU_SOURCE -I../SOPE/ -I../SoObjects/
ADDITIONAL_LIB_DIRS += \
-L../SoObjects/SOGo/SOGo.framework/sogo -lSOGo \
-L../SOPE/GDLContentStore/$(GNUSTEP_OBJ_DIR)/ -lGDLContentStore \
-L../SOPE/NGCards/$(GNUSTEP_OBJ_DIR)/ -lNGCards \
-lEOControl -lNGStreams -lNGMime -lNGExtensions -lNGObjWeb -lWEExtensions
+35
View File
@@ -0,0 +1,35 @@
/*
Copyright (C) 2004-2005 SKYRIX Software AG
This file is part of SOPE.
SOPE is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
SOPE is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with SOPE; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
#import <Foundation/Foundation.h>
#import <Foundation/NSObject.h>
#import <Foundation/NSDictionary.h>
#import <Foundation/NSArray.h>
@class WOContext;
@interface SOGoAPI : NSObject
- (NSArray *) methodAllowed;
- (BOOL) needAuth;
- (NSArray *) paramNeeded;
- (NSDictionary *) action: (WOContext*) ctx withParam: (NSDictionary *) param;
@end
+52
View File
@@ -0,0 +1,52 @@
/*
Copyright (C) todo...
*/
#import <SOGoAPI.h>
@implementation SOGoAPI
- (id) init
{
[super init];
return self;
}
- (void) dealloc
{
[super dealloc];
}
- (NSArray *) methodAllowed
{
NSArray *result;
result = [NSArray arrayWithObjects:@"GET",nil];
return result;
}
- (BOOL) needAuth
{
return YES;
}
- (NSArray *) paramNeeded
{
return nil;
}
- (NSDictionary *) action: (WOContext*) ctx withParam: (NSDictionary *) param
{
NSDictionary* result;
result = [[NSDictionary alloc] initWithObjectsAndKeys:
@"API not defined", @"error",
nil];
[result autorelease];
return result;
}
@end /* SOGoAPI */
View File
Whitespace-only changes.
+54
View File
@@ -0,0 +1,54 @@
/*
Copyright (c) 2014-2015, Inverse inc.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the Inverse inc. nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#import <Foundation/NSObject.h>
#import <SOGo/WORequest+SOGo.h>
#import <SOGo/WOResponse+SOGo.h>
@class NSCalendarDate;
@class NSException;
@class NSMutableDictionary;
@class NSURL;
@class NSNumber;
static volatile BOOL apiShouldTerminate = NO;
@interface SOGoAPIDispatcher : NSObject
{
id context;
BOOL debugOn;
}
- (NSException *) dispatchRequest: (WORequest*) theRequest
inResponse: (WOResponse*) theResponse
context: (id) theContext;
@end
+399
View File
@@ -0,0 +1,399 @@
/*
Copyright (c) 2014, Inverse inc.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the Inverse inc. nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "SOGoAPIDispatcher.h"
#import <Foundation/NSAutoreleasePool.h>
#import <NGObjWeb/NSException+HTTP.h>
#import <NGObjWeb/WOContext+SoObjects.h>
#import <NGObjWeb/WOCoreApplication.h>
#import <NGExtensions/NSObject+Logs.h>
#import <NGExtensions/NSString+misc.h>
#import <NGExtensions/NSString+Encoding.h>
#import <SOGo/SOGoSystemDefaults.h>
#import <SOGo/SOGoUser.h>
#import <SOGo/SOGoUserManager.h>
#import <SOGo/NSString+Utilities.h>
#import <SOGo/WORequest+SOGo.h>
#import <SOGo/WOResponse+SOGo.h>
#import <SOGo/NSArray+Utilities.h>
#import <SOGo/NSString+Utilities.h>
#import <SOGo/SOGoOpenIdSession.h>
void handle_api_terminate(int signum)
{
NSLog(@"Forcing termination of API loop.");
apiShouldTerminate = YES;
[[WOCoreApplication application] terminateAfterTimeInterval: 1];
}
@implementation SOGoAPIDispatcher
- (id) init
{
[super init];
debugOn = [[SOGoSystemDefaults sharedSystemDefaults] apiDebugEnabled];
apiShouldTerminate = NO;
signal(SIGTERM, handle_api_terminate);
return self;
}
- (void) dealloc
{
[super dealloc];
}
- (void) _sendAPIErrorResponse: (WOResponse* ) response
withMessage: (NSString *) message
withStatus: (unsigned int) status
{
NSDictionary *msg;
msg = [[NSDictionary alloc] initWithObjectsAndKeys:
message, @"error",
nil];
[response setStatus: status];
[response setContent: [msg jsonRepresentation]];
}
- (NSString *) _getActionFromUri: (NSString *) _uri
{
/*
_uri always start with /SOGo/SOGoAPI
full _uri example /SOGo/SOGoAPI/Action/subaction1?param1&param2
*/
NSString *uriWithoutParams, *action, *prefix;
NSArray *uriSplits;
prefix = @"/SOGo/SOGoAPI";
action = @"";
uriWithoutParams = [_uri urlWithoutParameters];
if(![uriWithoutParams hasPrefix: prefix])
{
[self errorWithFormat: @"Uri for API request does not start with /SOGo/SOGoAPI: %@", uriWithoutParams];
return nil;
}
else
{
uriWithoutParams = [uriWithoutParams substringFromIndex:[prefix length]];
}
//remove first and last '/'' if needed
if([uriWithoutParams hasPrefix: @"/"])
{
uriWithoutParams = [uriWithoutParams substringFromIndex:1];
}
if([uriWithoutParams hasSuffix: @"/"])
{
uriWithoutParams = [uriWithoutParams substringToIndex:([uriWithoutParams length] -1)];
}
if([uriWithoutParams length] == 0)
{
[self warnWithFormat: @"Uri for API request has no action, make Version instead: %@", uriWithoutParams];
return @"SOGoAPIVersion";
}
else
{
uriSplits = [uriWithoutParams componentsSeparatedByString: @"/"];
action = [@"SOGoAPI" stringByAppendingString: [uriSplits objectAtIndex: 0]];
if(debugOn)
[self logWithFormat: @"API request, action made is %@", action];
}
return action;
}
- (NSDictionary *) _authBasicCheck: (NSString *) auth
{
NSDictionary *user;
NSRange rng;
NSString *decodeCred, *domain, *login, *pwd;
SOGoUserManager *lm;
SOGoPasswordPolicyError perr;
int expire, grace;
BOOL rc;
user = nil;
decodeCred = [[auth substringFromIndex:5] stringByTrimmingLeadWhiteSpaces];
decodeCred = [decodeCred stringByDecodingBase64];
rng = [decodeCred rangeOfString:@":"];
login = [decodeCred substringToIndex:rng.location];
pwd = [decodeCred substringFromIndex:(rng.location + rng.length)];
domain = nil;
perr = PolicyNoError;
rc = ([[SOGoUserManager sharedUserManager]
checkLogin: [login stringByReplacingString: @"%40"
withString: @"@"]
password: pwd
domain: &domain
perr: &perr
expire: &expire
grace: &grace
additionalInfo: nil]
&& perr == PolicyNoError);
if(rc)
{
//Fecth user info
lm = [SOGoUserManager sharedUserManager];
user = [lm contactInfosForUserWithUIDorEmail: login];
}
else
user = nil;
return user;
}
- (NSDictionary *) _authOpenId: (NSString *) auth withDomain: (NSString *) domain
{
NSDictionary *user;
NSString *token, *login;
SOGoOpenIdSession *openIdSession;
SOGoUserManager *lm;
user = nil;
token = [[auth substringFromIndex:6] stringByTrimmingLeadWhiteSpaces];
openIdSession = [SOGoOpenIdSession OpenIdSession: domain];
if(![openIdSession sessionIsOk])
{
[self errorWithFormat: @"API - OpenId server not found or has unexpected behavior, contact your admin."];
return nil;
}
[openIdSession setAccessToken: token];
login = [openIdSession login: @""];
if(login && ![login isEqualToString: @"anonymous"])
{
//Fecth user info
lm = [SOGoUserManager sharedUserManager];
user = [lm contactInfosForUserWithUIDorEmail: login];
}
else
user = nil;
return user;
}
- (NSException *) dispatchRequest: (WORequest*) theRequest
inResponse: (WOResponse*) theResponse
context: (id) theContext
{
NSAutoreleasePool *pool;
id activeUser;
NSString *method, *action, *error;
NSDictionary *form;
NSArray *paramNeeded;
NSMutableDictionary *paramInjected, *ret;
NSBundle *bundle;
id classAction;
Class clazz;
pool = [[NSAutoreleasePool alloc] init];
ASSIGN(context, theContext);
//Get the api action, check it
action = [self _getActionFromUri: [theRequest uri]];
if(!action)
{
error = [NSString stringWithFormat: @"No actions found for request to API: %@", [theRequest uri]];
[self errorWithFormat: error];
[self _sendAPIErrorResponse: theResponse withMessage: error withStatus: 400];
RELEASE(context);
RELEASE(pool);
return nil;
}
//Get the class for this action, check it
bundle = [NSBundle bundleForClass: NSClassFromString(@"SOGoAPIProduct")];
clazz = [bundle classNamed: action];
if(!clazz)
{
error = [NSString stringWithFormat: @"No backend API found for action: %@", action];
[self errorWithFormat: error];
[self _sendAPIErrorResponse: theResponse withMessage: error withStatus: 400];
RELEASE(context);
RELEASE(pool);
return nil;
}
//try to instantiate the class
NS_DURING
{
classAction = [[clazz alloc] init];
}
NS_HANDLER
{
error = [NSString stringWithFormat: @"Can't alloc and init class: %@", classAction];
[self errorWithFormat: error];
[self _sendAPIErrorResponse: theResponse withMessage: error withStatus: 500];
RELEASE(context);
RELEASE(pool);
return nil;
}
NS_ENDHANDLER;
//Check method
method = [theRequest method];
if(![[classAction methodAllowed] containsObject: method])
{
error = [NSString stringWithFormat: @"Method %@ not allowed for action %@", method, action];
[self errorWithFormat: error];
[self _sendAPIErrorResponse: theResponse withMessage: error withStatus: 400];
RELEASE(context);
RELEASE(pool);
return nil;
}
paramInjected = [NSMutableDictionary dictionary];
//Check parameters
if((paramNeeded = [classAction paramNeeded]) && [paramNeeded count] >= 1)
{
NSDictionary* formAndQuery = [theRequest formValues];
for(NSString *param in paramNeeded)
{
id value;
if((value = [formAndQuery objectForKey: param]))
{
NSString* trueValue;
if ([value isKindOfClass: [NSArray class]])
trueValue = [value lastObject];
else
trueValue = value;
[paramInjected setObject: trueValue forKey: param];
}
else
{
error = [NSString stringWithFormat: @"Missing param %@ for action %@", param, action];
[self errorWithFormat: error];
[self _sendAPIErrorResponse: theResponse withMessage: error withStatus: 400];
RELEASE(context);
RELEASE(pool);
return nil;
}
}
}
if([classAction needAuth])
{
if(debugOn)
[self logWithFormat: @"Check auth for action %@", action];
//check auth
NSString *auth = [theRequest headerForKey: @"authorization"];
if(auth)
{
NSDictionary* user;
if([[auth lowercaseString] hasPrefix: @"basic"])
{
//basic auth
user = [self _authBasicCheck: auth];
}
else if([[auth lowercaseString] hasPrefix: @"bearer"])
{
//openid auth, we may need to know the user-domain to know which openid server to fetch
NSString *domain = [theRequest headerForKey: @"user-domain"];
user = [self _authOpenId: auth withDomain: domain];
}
else
{
error = [NSString stringWithFormat: @"Authorization method incorrect: %@ for action %@", auth, action];
[self errorWithFormat: error];
[self _sendAPIErrorResponse: theResponse withMessage: error withStatus: 401];
RELEASE(context);
RELEASE(pool);
return nil;
}
//add current user in paramInjected
if(user){
if(debugOn)
[self logWithFormat: @"User authenticated %@", user];
[paramInjected setObject: user forKey: @"user"];
}
else
{
error = [NSString stringWithFormat: @"User wrong login or not found for action %@", action];
[self errorWithFormat: error];
[self _sendAPIErrorResponse: theResponse withMessage: error withStatus: 401];
RELEASE(context);
RELEASE(pool);
return nil;
}
}
else
{
error = [NSString stringWithFormat: @"No authorization header found for action %@", action];
[self errorWithFormat: error];
[self _sendAPIErrorResponse: theResponse withMessage: error withStatus: 401];
RELEASE(context);
RELEASE(pool);
return nil;
}
}
//Execute action
NS_DURING
{
ret = [classAction action: context withParam: paramInjected];
}
NS_HANDLER
{
error = [NSString stringWithFormat: @"Internal error during: %@", action];
[self errorWithFormat: error];
[self _sendAPIErrorResponse: theResponse withMessage: error withStatus: 500];
RELEASE(context);
RELEASE(pool);
return nil;
}
NS_ENDHANDLER;
//Make the response
[theResponse setContent: [ret jsonRepresentation]];
RELEASE(context);
RELEASE(pool);
return nil;
}
@end
+11
View File
@@ -0,0 +1,11 @@
/*
Copyright (C) todo...
*/
#import <Foundation/NSObject.h>
@interface SOGoAPIProduct : NSObject
@end
@implementation SOGoAPIProduct
@end /* SOGoAPIProduct */
+33
View File
@@ -0,0 +1,33 @@
/*
Copyright (C) 2004-2005 SKYRIX Software AG
This file is part of SOPE.
SOPE is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
SOPE is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with SOPE; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
#import <Foundation/Foundation.h>
#import <Foundation/NSObject.h>
#import <Foundation/NSDictionary.h>
#import <Foundation/NSArray.h>
#import <SOGoAPI.h>
@class WOContext;
@interface SOGoAPIUserFolder : SOGoAPI
- (NSArray *) methodAllowed;
- (NSDictionary *) action: (WOContext*) ctx withParam: (NSDictionary *) param;
@end
+110
View File
@@ -0,0 +1,110 @@
/*
Copyright (C) todo...
*/
#import <SOGoAPIUserFolder.h>
#import <GDLContentStore/GCSFolderManager.h>
#import <GDLContentStore/GCSFolder.h>
@implementation SOGoAPIUserFolder
- (id) init
{
[super init];
return self;
}
- (void) dealloc
{
[super dealloc];
}
/**
{
"calendar":[
{
"name":"DidyShared",
"url":"http://127.0.0.1/SOGo/dav/sogo-tests1@example.org/Calendar/12509-67F67D00-1-3105AF40"
},
{
"name":"LocalDidy",
"url":"http://127.0.0.1/SOGo/dav/sogo-tests1@example.org/Calendar/1BC38-67B60000-1-6E4B6880"
},
{
"name":"Personal Calendar",
"url":"http://127.0.0.1/SOGo/dav/sogo-tests1@example.org/Calendar/personal"
}
],
"username":"sogo-tests1@example.org",
"contact":[
{
"name":"Personal Address Book",
"url":"http://127.0.0.1/SOGo/dav/sogo-tests1@example.org/Contacts/personal"
}
]
}
**/
- (NSDictionary *) action: (WOContext*) ctx withParam: (NSDictionary *) param
{
NSDictionary* result;
NSArray *folders;
NSMutableArray *cardavLinks, *caldavLinks;
NSString *serverUrl, *basePath, *c_uid, *url;
GCSFolderManager *fm;
GCSFolder *folder;
int max, i;
//Should be a user
c_uid = [[[param objectForKey: @"user"] objectForKey: @"emails"] objectAtIndex: 0];
//fetch folders
fm = [GCSFolderManager defaultFolderManager];
basePath = [NSString stringWithFormat: @"/Users/%@", c_uid];
folders = [fm listSubFoldersAndNamesAtPath: basePath recursive: YES];
//Generate dav link
max = [folders count];
serverUrl = [[ctx serverURL] absoluteString];
cardavLinks = [NSMutableArray array];
caldavLinks = [NSMutableArray array];
serverUrl = [[ctx serverURL] absoluteString];
for (i = 0; i < max; i++)
{
NSMutableDictionary *folderRet;
folderRet = [NSMutableDictionary dictionary];
folder = [folders objectAtIndex: i];
url = [NSString stringWithFormat: @"%@/SOGo/dav/%@/%@", serverUrl, c_uid, [folder objectForKey: @"path"]];
[folderRet setObject: url forKey: @"url"];
[folderRet setObject: [folder objectForKey: @"name"] forKey: @"name"];
if([url rangeOfString:@"/Calendar/"].location == NSNotFound)
{
//Contacts
[cardavLinks addObject: folderRet];
}
else
{
//Calendar
[caldavLinks addObject: folderRet];
}
}
result = [[NSDictionary alloc] initWithObjectsAndKeys:
c_uid, @"username",
cardavLinks, @"contact",
caldavLinks, @"calendar",
nil];
[result autorelease];
return result;
}
@end /* SOGoAPIVersion */
+33
View File
@@ -0,0 +1,33 @@
/*
Copyright (C) 2004-2005 SKYRIX Software AG
This file is part of SOPE.
SOPE is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
SOPE is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with SOPE; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
#import <Foundation/Foundation.h>
#import <Foundation/NSObject.h>
#import <Foundation/NSDictionary.h>
#import <Foundation/NSArray.h>
#import <SOGoAPI.h>
@class WOContext;
@interface SOGoAPIVersion : SOGoAPI
- (NSArray *) methodAllowed;
- (NSDictionary *) action: (WOContext*) ctx withParam: (NSDictionary *) param;
@end
+42
View File
@@ -0,0 +1,42 @@
/*
Copyright (C) todo...
*/
#import <SOGoAPIVersion.h>
@implementation SOGoAPIVersion
- (id) init
{
[super init];
return self;
}
- (void) dealloc
{
[super dealloc];
}
- (BOOL) needAuth
{
return NO;
}
- (NSDictionary *) action: (WOContext*) ctx withParam: (NSDictionary *) param
{
NSDictionary* result;
result = [[NSDictionary alloc] initWithObjectsAndKeys:
[NSNumber numberWithInt:SOGO_MAJOR_VERSION], @"major",
[NSNumber numberWithInt:SOGO_MINOR_VERSION], @"minor",
[NSNumber numberWithInt:SOGO_PATCH_VERSION], @"patch",
nil];
[result autorelease];
return result;
}
@end /* SOGoAPIVersion */
+34
View File
@@ -0,0 +1,34 @@
include ../config.make
include $(GNUSTEP_MAKEFILES)/common.make
include ../Version
NEEDS_GUI=no
BUNDLE_EXTENSION = .SOGo
BUNDLE_INSTALL_DIR = $(SOGO_LIBDIR)
WOBUNDLE_EXTENSION = $(BUNDLE_EXTENSION)
WOBUNDLE_INSTALL_DIR = $(BUNDLE_INSTALL_DIR)
# SYSTEM_LIB_DIR += -L/usr/local/lib -L/usr/lib
ADDITIONAL_INCLUDE_DIRS += \
-I.. \
-I../.. \
-I../../SOPE
ADDITIONAL_LIB_DIRS += \
-L../SoObjects/SOGo/SOGo.framework/Versions/Current/sogo \
-L../SoObjects/SOGo/$(GNUSTEP_OBJ_DIR)/ \
-L../SOPE/NGCards/$(GNUSTEP_OBJ_DIR)/ \
-L/usr/local/lib \
-Wl,-rpath,$(SOGO_SYSLIBDIR)/sogo
BUNDLE_LIBS += \
-lSOGo \
-lGDLContentStore \
-lGDLAccess \
-lNGObjWeb \
-lNGCards -lNGMime -lNGLdap \
-lNGStreams -lNGExtensions -lEOControl \
-lDOM -lSaxObjC -lSBJson
ADDITIONAL_BUNDLE_LIBS += $(BUNDLE_LIBS)
+31
View File
@@ -0,0 +1,31 @@
{
requires = ( MAIN, Appointments, Contacts, Mailer );
publicResources = ();
factories = {};
classes = {
SOGoAPI = {
protectedBy = "<public>";
defaultRoles = {
"View" = ( "Authenticated", "PublicUser" );
};
};
};
categories = {
SOGoAPI = {
slots = {
};
methods = {
Version = {
protectedBy = "View";
pageName = "SOGoAPI";
actionName = "sogoVersion";
};
};
};
};
}
+1 -1
View File
@@ -1627,7 +1627,7 @@ struct GlobalObjectId {
[map setObject: dateReceived forKey: @"date"];
messageId = [NSString generateMessageID];
messageId = [NSString generateMessageID: [identity objectForKey: @"email"]];
[map setObject: messageId forKey: @"message-id"];
attachmentKeys = [self fetchFileAttachmentKeys];
+402
View File
@@ -2,6 +2,408 @@
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.11](https://github.com/Alinto/sogo/compare/SOGo-5.12.10...SOGo-5.12.11) (2026-09-14)
### Features
* **junk:** add junk action on mail view ([3f4f949](https://github.com/Alinto/sogo/commit/3f4f9496644953010a4a429f90eae733a50d61c4))
### Bug Fixes
* **core:** keep the [@import](https://github.com/import) cleanup working in stringWithoutHTMLInjection ([8813677](https://github.com/Alinto/sogo/commit/8813677ecb171e5d27cd582989c1d87b308c6df3))
* **db:** release db channel after using them ([152f44b](https://github.com/Alinto/sogo/commit/152f44b90e08013b5c132473a2de249682d997df))
* **db:** release db channel after using them part 2 ([089b50c](https://github.com/Alinto/sogo/commit/089b50c0defdb48e8c0bc0a13334591f3ee2dd11))
* **junk:** extend list of junk icon available ([012e6ef](https://github.com/Alinto/sogo/commit/012e6eff471893efaac033c69ddf7838ca51b791))
* **mail:** escape mail data placed in attributes of a compiled part ([045a0b9](https://github.com/Alinto/sogo/commit/045a0b9c0ac57aeea1b619f281acff0427cd81c7)), closes [#115](https://bugs.sogo.nu/view.php?id=115)
* **mail:** stop interpreting iMIP card text fields as markup ([0d66d75](https://github.com/Alinto/sogo/commit/0d66d7503d8fd147842e87b9b4f1b921986ef44b))
* **pwd:** use the proper url for reset password mail ([382118a](https://github.com/Alinto/sogo/commit/382118a93b6925de2ce7f774abc1865ebea2dbba))
* **pwd:** use the proper url for reset password mail part2 ([04a3e98](https://github.com/Alinto/sogo/commit/04a3e9823889acaf6c247b224f5f7a0108f8f829))
* **sanitization:** update regex for html sanitization ([10dc173](https://github.com/Alinto/sogo/commit/10dc1733496fb2f393537d864d83408e357f2215))
* **UI:** use legitimate sorting value ([d089c40](https://github.com/Alinto/sogo/commit/d089c4046ffac8124874c504491db9d1f15ae650))
### Localization
* **hu:** Update Hungarian translations ([1bf1031](https://github.com/Alinto/sogo/commit/1bf1031ab2932f196f1adcc8fdfc9dea7dfb1f65))
## [5.12.10](https://github.com/Alinto/sogo/compare/SOGo-5.12.9...SOGo-5.12.10) (2026-08-13)
### Features
* **sogo-tool:** add init-user command to create a user's personal folders and preferences without a login ([aefc14b](https://github.com/Alinto/sogo/commit/aefc14b265172e5ff94fa0fc1e4799f05d8e29f8))
### Bug Fixes
* **bug:** escape angularJS only if needed to keep legitimate directive ([41e2b7b](https://github.com/Alinto/sogo/commit/41e2b7b1ab59fefe48cedf49ba82f4e03b646d23))
* **bug:** incorrect method called ([1caa257](https://github.com/Alinto/sogo/commit/1caa25711f5891135c7ebca63f33b8758c00c8e8))
* **calendar:** do not transmit og http status to external calendar ([3a78a3b](https://github.com/Alinto/sogo/commit/3a78a3bbb44484c95c141b0f3c0c8fabdc8bcf6a))
* **ckeditor:** Sync resized image width/height into style and HTML attributes so Outlook and other mail clients ignoring CSS aspect-ratio render the correct dimensions. Closes [#6169](https://bugs.sogo.nu/view.php?id=6169). ([39a3583](https://github.com/Alinto/sogo/commit/39a35830e9d01a26b533515a20c1b4f527064519))
* **dav:** properly parse MKCOL request ([78807d0](https://github.com/Alinto/sogo/commit/78807d01aee9195b95e2ed21344f260aadb2faef))
* **event:** clean import of event ([b5c83f5](https://github.com/Alinto/sogo/commit/b5c83f58393e31151939d0d6fc227c0d0f127f33))
* **event:** clean import of event ([b18f1a0](https://github.com/Alinto/sogo/commit/b18f1a09f59424a36f6de5aa7c30e6f27405c15d))
* **mail:** escape angularJS directive for description ([47133fd](https://github.com/Alinto/sogo/commit/47133fdf3bc3148d374bbf413f058d714776e832))
* **mail:** escape References/Organization/Newsgroups headers in HTML forward so message-id chevrons aren't parsed as HTML tags hiding the quoted body. Closes [#6046](https://bugs.sogo.nu/view.php?id=6046). ([f11f34c](https://github.com/Alinto/sogo/commit/f11f34cdefdd4175ae6c8b0814c2ccaecfd7c373))
* **mail:** Some links broken in HTML rendering due to libxml2 (SOPE) only supporting HTML4 — when an anchor has no content between its opening and closing tags, store it and re-open it around the next element, closing </a> after that element's end tag. Closes [#5961](https://bugs.sogo.nu/view.php?id=5961). Closes [#6172](https://bugs.sogo.nu/view.php?id=6172). ([6904911](https://github.com/Alinto/sogo/commit/6904911ac17651de754246aff26fbb85aa8e01c7))
* **passwordRecoveyr:** get the domain from the user mail ([a156f4c](https://github.com/Alinto/sogo/commit/a156f4ce9f0eda3ff54633d4bcb7051388d2f39b))
* **tool:** wrong method called ([97bbd7e](https://github.com/Alinto/sogo/commit/97bbd7ed7f8173894f01b259f2f0f539ad6e95ed))
### Localization
* **hu:** Update Hungarian translations ([2a8f20e](https://github.com/Alinto/sogo/commit/2a8f20e080cdb39544622874a12fef807cc66612))
### [5.12.9](https://github.com/Alinto/sogo/compare/SOGo-5.12.8...SOGo-5.12.9) (2026-05-27)
### Bug Fixes
* **mail:** do not encode non-html element ([6e59011](https://github.com/Alinto/sogo/commit/6e590115fbce073847369495997228fba2fc3ce8))
* **mail:** render the subject without html when searching ([be440ba](https://github.com/Alinto/sogo/commit/be440baa23fd8b6ad5d8c947f60f9105ad717214))
* **pref:** prevent onevent cleaning to remove legitimate words ([c45233c](https://github.com/Alinto/sogo/commit/c45233c11e250a22fa1e1f3e47fee2d6e232045b))
### Localization
* **ca:** Update Catalan translations ([fd427f9](https://github.com/Alinto/sogo/commit/fd427f91967b99ca0d8eb42c4e5432f9ae4b49cf))
* **es_ES:** Update SpanishSpain translations ([d823cad](https://github.com/Alinto/sogo/commit/d823cadda084e735c6dbeb2694f583bdf9fb7f9b))
### [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)
### Enhancements
* **mail:** Add a setting to show the attachments above the mail body ([5d61660](https://github.com/Alinto/sogo/commit/5d616600dfa6258e4eebcb5c065e393ebfae8f3a))
### Bug Fixes
* **calendar:** fetch our own iana timezone instead of trusting VTIMEZONE ([244d138](https://github.com/Alinto/sogo/commit/244d1388eb00c060c5302e5bfd997fd397820bc0))
* **curl:** properly close curl connection ([42f620e](https://github.com/Alinto/sogo/commit/42f620e56201e17391532507c02ae370f117c574))
* **eas:** use proper imap mech for EAS request when using openid ([a7f7950](https://github.com/Alinto/sogo/commit/a7f7950d91c83acd75c0b0d55dec74ab85d38d6c))
* **ldap:** don't try to fetch for a nobody user ([4d8cca1](https://github.com/Alinto/sogo/commit/4d8cca10f63aff9499b71d61d59d6f81570eb659))
* **label:** ensure the translation kept is not null ([0fb3db0](https://github.com/Alinto/sogo/commit/0fb3db060871a14e2abd8c6963ccd812cbacf200))
* **label:** missing trad ([23c8648](https://github.com/Alinto/sogo/commit/23c8648169b4893aaafa2e369259d94d56c76831))
* **ldap:** fetch the correct user source when creating an event with an attendee ([736d758](https://github.com/Alinto/sogo/commit/736d7589b16be4ebcf9fc6931a79187888c3b444))
* **login:** Only remember the login if the auth was successful ([9e20190](https://github.com/Alinto/sogo/commit/9e20190fad1a437f7e1307f0adcfe19a8d45184c))
* **log:** remove the ics from the log line ([86d94ab](https://github.com/Alinto/sogo/commit/86d94ab8fefaf3aa5ba99e13c28a0b24036d94ff))
* **mailer:** correctly show interline for p element ([666c979](https://github.com/Alinto/sogo/commit/666c979eeae6d51a6bc09684ebbab57ed9ce4b91))
* **mailer:** don't add mailto: to string starting with @ ([9817487](https://github.com/Alinto/sogo/commit/981748754a4857bab66a6fb94cdc5da4265ce003))
* **mail:** preoperly generates the message-id header value ([7bee193](https://github.com/Alinto/sogo/commit/7bee193413935ca03e4936a15791fbbb534493ec))
* **openid:** correcly type userTokenInterval ([4ef79e2](https://github.com/Alinto/sogo/commit/4ef79e219c289697eec0c2d100c8af1a5d0889b6))
* **password:** Correctly check the secret question answer when hitting enter instead of the button next ([ed7a136](https://github.com/Alinto/sogo/commit/ed7a136e0f2c5ecd35033aef6d0561d9fcf2ccdc))
* **task:** fix reminder for tasks ([a7651e5](https://github.com/Alinto/sogo/commit/a7651e56c53a4dc33892d86f404a132a2b8af83a))
* **ui:** add css class for login page ([a077512](https://github.com/Alinto/sogo/commit/a077512e34bf42933457b92613b348ff2e06642a))
* **calendar:** don't allocate and copy all children for each time we call _filterComponent: ([481a9bf](https://github.com/Alinto/sogo/commit/481a9bf1de1da8e07b5ed4c1786aac89d19ca6c3))
* **core:** store translations in a globally static NSMutableDictionary ([f48f27c](https://github.com/Alinto/sogo/commit/f48f27c812466ce806ab60b43ebe5a2bfc97ed0a))
### Localization
* **ar:** Update Arabic translations ([6c3e661](https://github.com/Alinto/sogo/commit/6c3e66142f50c68ee9b1435e5d6961573e7445d4))
* **bg_BG:** Update Bulgarian translations ([4585293](https://github.com/Alinto/sogo/commit/4585293d999152e6c7b54f00f73f925051a4ed64))
* **bs_BA:** Update Bosnian translations ([4461122](https://github.com/Alinto/sogo/commit/446112269705ae1565a21d3e39e4665c172fc3d4))
* **ca:** Update Catalan translations ([b77129e](https://github.com/Alinto/sogo/commit/b77129e2e7608f163eeeb1c4ed7e35fb5558c3cb))
* **cs:** Update Czech translations ([f252e0e](https://github.com/Alinto/sogo/commit/f252e0e2c271118cceb2979a828f5220350ba57f))
* **cy:** Update Welsh translations ([6425a62](https://github.com/Alinto/sogo/commit/6425a62e1ab8900dc83df5ca165eb92718856886))
* **da_DK:** Update Danish translations ([ae293ec](https://github.com/Alinto/sogo/commit/ae293ec3ce7488530199e82bd7bde50b2d506a43))
* **de:** Update German translations ([95e1937](https://github.com/Alinto/sogo/commit/95e19379f6fa698f54a09d7b7bcb4cfe16b4c358))
* **es_AR:** Update SpanishArgentina translations ([07e9d34](https://github.com/Alinto/sogo/commit/07e9d34865e57fa64f8db1b7ed4a5a67a0c1f234))
* **es_ES:** Update SpanishSpain translations ([c755ab3](https://github.com/Alinto/sogo/commit/c755ab3b4ea5ecad2c98d396d6bca6d873d0f1de))
* **eu:** Update Basque translations ([b96e531](https://github.com/Alinto/sogo/commit/b96e531f662a41802bd83e54e4a8055987d36164))
* **fi:** Update Finnish translations ([c0c506f](https://github.com/Alinto/sogo/commit/c0c506f9103b12ed5a39b340c4bccac500a2f6a8))
* **fr:** Update French translations ([a914fd4](https://github.com/Alinto/sogo/commit/a914fd4151e5565d4f168819c2664dc460587dec))
* **gl:** Update Galician translations ([f017fef](https://github.com/Alinto/sogo/commit/f017fef4b2a86f210f36bd5e62afe37c7bba3a18))
* **he:** Update Hebrew translations ([070705a](https://github.com/Alinto/sogo/commit/070705acfaa65ad435c1d2fa659e4b1f333b59a8))
* **hr_HR:** Update Croatian translations ([e662f10](https://github.com/Alinto/sogo/commit/e662f10389795e281abd283775f0d168a519e25d))
* **hu:** Update Hungarian translations ([799e8c2](https://github.com/Alinto/sogo/commit/799e8c21af79b2a8beb082a9d56a238aee30ae4a))
* **id_ID:** Update Indonesian translations ([56e4929](https://github.com/Alinto/sogo/commit/56e4929ca78c105dde470a6d26749b1328fad47f))
* **is:** Update Icelandic translations ([401e2f5](https://github.com/Alinto/sogo/commit/401e2f51cd3a69afa72fb76ffeb8fc91a5779cca))
* **it:** Update Italian translations ([1bb74c7](https://github.com/Alinto/sogo/commit/1bb74c75227f858d680035a5eccd7c5ef954f869))
* **ja:** Update Japanese translations ([9a295c5](https://github.com/Alinto/sogo/commit/9a295c5944886df95b941f716fc5e6b4c62525b7))
* **kk:** Update Kazakh translations ([6514fbb](https://github.com/Alinto/sogo/commit/6514fbb8f1c2745dd44be49c72da88937fcf107f))
* **ko:** Update Korean translations ([ed91211](https://github.com/Alinto/sogo/commit/ed9121175aa6164a73987a247cebe47e53676529))
* **lt:** Update Lithuanian translations ([2b455fe](https://github.com/Alinto/sogo/commit/2b455fe587f96700c4398538b995680251660ac1))
* **lv:** Update Latvian translations ([ad7dc8f](https://github.com/Alinto/sogo/commit/ad7dc8f45ee316c4d39ebf5fa71207947b4be2f8))
* **mk_MK:** Update Macedonian translations ([798bed5](https://github.com/Alinto/sogo/commit/798bed54e2eb0f76f26dc6c6c423285c565b9888))
* **nb_NO:** Update NorwegianBokmal translations ([eab6d9f](https://github.com/Alinto/sogo/commit/eab6d9f2492eccc2397c3ad49ab284223cb8771c))
* **nl:** Update Dutch translations ([b42882b](https://github.com/Alinto/sogo/commit/b42882b564ad9aa1b510b00d06da21688d959785))
* **nn_NO:** Update NorwegianNynorsk translations ([3a442f1](https://github.com/Alinto/sogo/commit/3a442f1b3d38350a5544f0fb62718f45b70c37ad))
* **pl:** Update Polish translations ([16fcb46](https://github.com/Alinto/sogo/commit/16fcb46c4be26497d12be712c5bacf0f0056a5b3))
* **pt_BR:** Update BrazilianPortuguese translations ([9d277c3](https://github.com/Alinto/sogo/commit/9d277c3f157e21183648609e5bee429559e87a63))
* **pt:** Update Portuguese translations ([972ffcc](https://github.com/Alinto/sogo/commit/972ffcc0c6f4f67da5557da28b6c5af87d632b96))
* **ro_RO:** Update Romanian translations ([ec4d780](https://github.com/Alinto/sogo/commit/ec4d7807d994836218c6ba9c5979283623a520d4))
* **ru:** Update Russian translations ([1a80fd6](https://github.com/Alinto/sogo/commit/1a80fd6284750cc9997e6cbbafcdf86765032405))
* **sk:** Update Slovak translations ([0f24c17](https://github.com/Alinto/sogo/commit/0f24c175163e2a000d6cace4d9302cae384f3b49))
* **sl_SI:** Update Slovenian translations ([645be8f](https://github.com/Alinto/sogo/commit/645be8fcc53cd2729dad9906e66a8f630cffaf52))
* **sr_ME@latin:** Update Montenegrin translations ([3dc9b90](https://github.com/Alinto/sogo/commit/3dc9b9099223940ec4a4f660d499ac450398d6cc))
* **sr@latin:** Update SerbianLatin translations ([c675dbf](https://github.com/Alinto/sogo/commit/c675dbfaa70755abf4300462f538dfa878c7c969))
* **sr:** Update Serbian translations ([dd367b0](https://github.com/Alinto/sogo/commit/dd367b0e94b74dccfc862d9ca07906cc16234965))
* **sv:** Update Swedish translations ([2ebb637](https://github.com/Alinto/sogo/commit/2ebb63767e53c39bc982d9959dabacfdce8b9b19))
* **th:** Update Thai translations ([f86a32d](https://github.com/Alinto/sogo/commit/f86a32d0a148b8465a01f098855dc58470c1a689))
* **tr_TR:** Update TurkishTurkey translations ([8c38c9c](https://github.com/Alinto/sogo/commit/8c38c9ce038e902d4b79f2093448ffec2c1f1d55))
* **uk:** Update Ukrainian translations ([5021376](https://github.com/Alinto/sogo/commit/5021376daf92c95a69afa2a2d99cf559f858d478))
* **zh_CN:** Update ChineseChina translations ([22ab0b3](https://github.com/Alinto/sogo/commit/22ab0b3c751f7c20c234c1824552aaa4c661f983))
* **zh_TW:** Update ChineseTaiwan translations ([c7a519c](https://github.com/Alinto/sogo/commit/c7a519ca124121e259a00473e6163cbd93e16aa4))
### [5.12.3](https://github.com/Alinto/sogo/compare/SOGo-5.12.2...SOGo-5.12.3) (2025-07-12)
### Bug Fixes
* **calendar:** fix recurrent event last date ([3ab8677](https://github.com/Alinto/sogo/commit/3ab86776e2ea826e043e3a0519097538853d82e3)), closes [#8766b7](https://bugs.sogo.nu/view.php?id=8766b7)
* **view:** automatically refresh view only if a number is set. ([55dbae6](https://github.com/Alinto/sogo/commit/55dbae6bee9bdd1aa00333320ba076617cbfb0fc))
## [5.12.2](https://github.com/Alinto/sogo/compare/SOGo-5.12.1...SOGo-5.12.2) (2025-06-25)
### Features
* **api:** add endpoint for caldav/cardav url ([51f1521](https://github.com/Alinto/sogo/commit/51f1521dba2d0ca8bdbadffadb16db26b975f668))
* **openid:** swicth to libcurl for http request ([a782424](https://github.com/Alinto/sogo/commit/a782424a30cfe8e9c6f2769a45bcdd3498679237))
### Bug Fixes
* **api:** add handler for internal error ([dabad1d](https://github.com/Alinto/sogo/commit/dabad1d0cf46263d78558d79d2af9fff528a9a89))
* **calendar:** properly evalute last occurance freebusy ([8766b7c](https://github.com/Alinto/sogo/commit/8766b7c6b32aedf37d7f8f350e461931b253a4fb))
* **openid:** add state in connection flow ([085fc4a](https://github.com/Alinto/sogo/commit/085fc4a9eb7d1e2a0f7b48baa1f09a8ba0d515e1))
* **openid:** allow expires_in param to be null ([9954c36](https://github.com/Alinto/sogo/commit/9954c3607bfda55424f5ac532a1075407235f345))
* **openid:** make end_session_endpoint optional ([c5fb348](https://github.com/Alinto/sogo/commit/c5fb3482e22f1bfc935213e8ed7208becd9bd1f4))
* **password:** put correct regex for special char ([e36d0d2](https://github.com/Alinto/sogo/commit/e36d0d219baed8c7d57af0069fadb8d1bf7df072))
* **session:** allow password/token to be longer than userkey ([516606b](https://github.com/Alinto/sogo/commit/516606baff5674c25da1e76f532ca2a9d7818ec0))
* **sieve:** add requirements for notify when doing a filter ([f53d7b7](https://github.com/Alinto/sogo/commit/f53d7b73db3d87a17a253bf98ee09a80052b3fd8))
* **view:** don't hide the option mailcomposer in small screen ([8a90773](https://github.com/Alinto/sogo/commit/8a907737de336f873047ecdc7d5c8ac07ae9e45b))
### Localization
* **nl:** Update Dutch translations ([031e117](https://github.com/Alinto/sogo/commit/031e117cbacf9d41caff43be19e639dee81b84dc))
* **pt:** Update Portuguese translations ([9649ae3](https://github.com/Alinto/sogo/commit/9649ae345f334d390860b0db70db8c3b621f513e))
* **tr_TR:** Update TurkishTurkey translations ([e9c03d3](https://github.com/Alinto/sogo/commit/e9c03d3cf7e668866ac757f72d87cdc4709c9d33))
## [5.12.1](https://github.com/Alinto/sogo/compare/SOGo-5.12.0...SOGo-5.12.1) (2025-04-30)
### Features
* **calendar:** Make the Jitsi meeting room prefix configurable ([4a68909](https://github.com/Alinto/sogo/commit/4a689090607bc6c4e6385202e9fdaef7308a94fe))
### Bug Fixes
* **calendar:** Fix typo Jisti × Jitsi ([ab9f0c1](https://github.com/Alinto/sogo/commit/ab9f0c1bf1f8930b9cbbf592efe69c68654f35c2))
* **calendar:** properly show the URL property in iCalendar ([eb7f551](https://github.com/Alinto/sogo/commit/eb7f551e88f2c6693354b6c3b617861d4b63a1bb))
* **calendar:** put valarm at the end of vevent block to satisfy outlook.office.com which is too lazy to follow the spec ([148fab9](https://github.com/Alinto/sogo/commit/148fab9409abf703f56ae8ed701547f23d685711))
* **db:** log an error if the table sogo_folder_info is malformed ([3616e56](https://github.com/Alinto/sogo/commit/3616e562894be63fcdb7007b5f172d99f5ff59eb))
* **folder:** fix folders sorting for special folders ([1f8dc12](https://github.com/Alinto/sogo/commit/1f8dc1292924672489a4a1c76f557a9f0bc65662))
* **iOS:** iOS 18.4 encodes caldav url and put %40 instead of @ for username. Fix that. ([9e431d0](https://github.com/Alinto/sogo/commit/9e431d08a273f519ff833b15189d2d3ebef4fc79))
* **ldap:** update baseDN with correct domain if needed ([ca425e6](https://github.com/Alinto/sogo/commit/ca425e6752fd28d68e35cc4c1b7dd6f7b3c43ab4))
* **sieve:** Correctly update default sieve filter for new users ([7c59e6b](https://github.com/Alinto/sogo/commit/7c59e6b3bf4684c2884e5f0bd39009719e5ba1b9))
* **smtp:** fix string type ([788ece4](https://github.com/Alinto/sogo/commit/788ece452b80a0270169178d5e596972797d0906))
* **tnef:** add protection against malformed winmail.dat ([7c6b674](https://github.com/Alinto/sogo/commit/7c6b6743e017effcc0078c9ebc026d628f4b71af))
* **typo:** Fix typo 'attachements' ([#367](https://bugs.sogo.nu/view.php?id=367)) ([4ec3d20](https://github.com/Alinto/sogo/commit/4ec3d2091a8f5c26b4c4463b4fa9c89ef26f63ba))
* **ui:** Change angular material to fix issues with Safari iOS 18+ ([068f1f3](https://github.com/Alinto/sogo/commit/068f1f315498c9bc5a0513e62c7a3fd250d974ad))
* **ui:** Change angular material to fix issues with Safari iOS 18+ ([07c7528](https://github.com/Alinto/sogo/commit/07c75280bb06816562b1fb5747acf8efa39cb4a0))
### Localization
* **ar:** Update Arabic translations ([5c48745](https://github.com/Alinto/sogo/commit/5c48745c94380bfa02f36c751b0389e06d676493))
* **bg_BG:** Update Bulgarian translations ([1d0b6a6](https://github.com/Alinto/sogo/commit/1d0b6a622c30b8f55ac17db0d131992a733d356b))
* **bs_BA:** Update Bosnian translations ([ade923d](https://github.com/Alinto/sogo/commit/ade923d21d409a9bffca609826a630480ea561dc))
* **ca:** Update Catalan translations ([8c4f56c](https://github.com/Alinto/sogo/commit/8c4f56c971002c4e0bb9764c0d7c24fc5cfd3a92))
* **cy:** Update Welsh translations ([54debcf](https://github.com/Alinto/sogo/commit/54debcf47d5896b58917705ff85bada391a26919))
* **es_AR:** Update SpanishArgentina translations ([4b397f6](https://github.com/Alinto/sogo/commit/4b397f68f51f00945cab57bdec77ab5d68e68753))
* **eu:** Update Basque translations ([54f8af3](https://github.com/Alinto/sogo/commit/54f8af30cefe4024d6697a35de25fb1d7896785e))
* **fi:** Update Finnish translations ([aae9e60](https://github.com/Alinto/sogo/commit/aae9e6065fda25803c37a43ca2e067df88aba166))
* **he:** Update Hebrew translations ([f4adf62](https://github.com/Alinto/sogo/commit/f4adf6267d271d91a75d2176424e98862662e9f8))
* **hr_HR:** Update Croatian translations ([961702d](https://github.com/Alinto/sogo/commit/961702de6706531817818063a4a96b40862aa05d))
* **hu:** Update Hungarian translations ([c31b3f4](https://github.com/Alinto/sogo/commit/c31b3f4592c6564c4f372cf4e63c4be3564c75bf))
* **id_ID:** Update Indonesian translations ([5f6168d](https://github.com/Alinto/sogo/commit/5f6168d5365450e40f6e289be694fab5585ba0cc))
* **is:** Update Icelandic translations ([c792ddb](https://github.com/Alinto/sogo/commit/c792ddb601830896cd936e21bb69c17f8d11e705))
* **it:** Update Italian translations ([d7fc5a5](https://github.com/Alinto/sogo/commit/d7fc5a52b8284594a6be4050b6c56cffc0fea472))
* **ja:** Update Japanese translations ([264f94b](https://github.com/Alinto/sogo/commit/264f94b64d5ea1147d45b7040fc5c3c0bc1d368b))
* **kk:** Update Kazakh translations ([1bf955d](https://github.com/Alinto/sogo/commit/1bf955d1930caf920c34be8ffb3e46b47eb0f232))
* **lt:** Update Lithuanian translations ([bbc0491](https://github.com/Alinto/sogo/commit/bbc04913b9a3219cd31cfcfc4b0ec79fbee76713))
* **lv:** Update Latvian translations ([1dcf475](https://github.com/Alinto/sogo/commit/1dcf475d3b0394474950eb73169fcfeab55305cf))
* **mk_MK:** Update Macedonian translations ([1ba83ec](https://github.com/Alinto/sogo/commit/1ba83ec57d7e65f6f28542a89222ec58570d5cef))
* **nl:** Update Dutch translations ([20e7c89](https://github.com/Alinto/sogo/commit/20e7c890dea0a52925b18be2a5ae09ccd4c23dd9))
* **nn_NO:** Update NorwegianNynorsk translations ([828f85c](https://github.com/Alinto/sogo/commit/828f85c7204c86951db4654f2d254a1361ad0d98))
* **ro_RO:** Update Romanian translations ([532b8dc](https://github.com/Alinto/sogo/commit/532b8dc2028b1a1db26566df7baa964daf9bd6b7))
* **sk:** Update Slovak translations ([d3e5a00](https://github.com/Alinto/sogo/commit/d3e5a004dbdd80c6bba405a34dcbbb28819a0fa7))
* **sl_SI:** Update Slovenian translations ([fdb88ab](https://github.com/Alinto/sogo/commit/fdb88abc1251a8763e4c8e5dacf38e3191180fba))
* **sr_ME@latin:** Update Montenegrin translations ([aa6575c](https://github.com/Alinto/sogo/commit/aa6575c42b54b27ca9510ea0f02426a7657ed519))
* **sr@latin:** Update SerbianLatin translations ([9f4440b](https://github.com/Alinto/sogo/commit/9f4440b07f142cc0c68561b4413e56fe5c5322ff))
* **sr:** Update Serbian translations ([3e61a52](https://github.com/Alinto/sogo/commit/3e61a52673092c38ce2f7a32ebd855afab61782a))
* **sv:** Update Swedish translations ([6d8d4f7](https://github.com/Alinto/sogo/commit/6d8d4f7c39fb1c1e9373a9268589b8e6546617ed))
* **zh_CN:** Update ChineseChina translations ([bbd17f5](https://github.com/Alinto/sogo/commit/bbd17f55310e5b2e163eeaaf2cb259ae042f8557))
* **zh_TW:** Update ChineseTaiwan translations ([3ac01f7](https://github.com/Alinto/sogo/commit/3ac01f70516a25f6db65ffa5c03d6d5a833479fe))
## [5.12.0](https://github.com/Alinto/sogo/compare/SOGo-5.11.2...SOGo-5.12.0) (2025-03-24)
### Features
* **calendar:** Can defined the Jitsi server url for meeting created ([9f4f48a](https://github.com/Alinto/sogo/commit/9f4f48a44fe97685a5757ec6cec1de802454ccd7))
* **calendar:** Can now create Jitsi link when making event ([42c227b](https://github.com/Alinto/sogo/commit/42c227beca64066018d48e29e3d2594f9b99dcc0))
* **core:** Check password strength on login (SQL Source). Closes [#6025](https://bugs.sogo.nu/view.php?id=6025). ([178b1a3](https://github.com/Alinto/sogo/commit/178b1a3a0e2e549daea4c229cdf24980e76158d2))
* **dev:** add devcontainer config to test and dev on sogo ([8904350](https://github.com/Alinto/sogo/commit/8904350b711cf4ac21da0e1e8af6f33bc8a1df1a))
* **mail:** Deletion of mail older than x. Closes [#6023](https://bugs.sogo.nu/view.php?id=6023). ([6f86506](https://github.com/Alinto/sogo/commit/6f86506b28c79610b58e67c78c53548afecf979e) [ea427ea](https://github.com/Alinto/sogo/commit/ea427ea41af2275da249180eaf30377d76dd3727))
* **openID:** add OpenId SSO config ([458d39d](https://github.com/Alinto/sogo/commit/458d39d48a23390cf81350f53804565b8dc2bdf2) [c323488](https://github.com/Alinto/sogo/commit/c3234882eb0dc2a8b7a7fd1eed8f109f6e0b8f24))
### Enhancement
* **mail:** Add move to icon on the mail view. Closes [#6028](https://bugs.sogo.nu/view.php?id=6028). ([f65ab9b](https://github.com/Alinto/sogo/commit/f65ab9b43a829eebfa22d7332eb18100d55e61b4))
* **mail:** Add sort by recipient instead of from in sent folder. Change subject_or_to in sent folder for search instead of subject_or_from. Closes [#6030](https://bugs.sogo.nu/view.php?id=6030). ([2258d5c](https://github.com/Alinto/sogo/commit/2258d5cd60e3cddd400da305c38f928e065f6a5c))
* **mail:** Add 'Return-Receipt-To' header for mail receipt ([b3c77a0](https://github.com/Alinto/sogo/commit/b3c77a0e004409a5a55ffe02a171192a13d9e3dc))
### Bug Fixes
* **addressBook:** fix [#2](https://bugs.sogo.nu/view.php?id=2)f9c2cf show email if no display name for contact in list ([7328623](https://github.com/Alinto/sogo/commit/7328623e1172823cd15ded8fa7c42da393b1fcb5)), closes [#2f9c2](https://bugs.sogo.nu/view.php?id=2f9c2)
* **auth:** add missing method to auth class ([d1d9024](https://github.com/Alinto/sogo/commit/d1d9024eca8cc0de2674815788f87342463df5ee))
* **calendar:** Ensure organizers are properly removed from attendee's calendars. Fix issue where organizers were also set as attendees. Removed organizer in attendees list. ([da32b3f](https://github.com/Alinto/sogo/commit/da32b3f86d9cb1e730f5fab27d6767498d46167d) [c90e2b0](https://github.com/Alinto/sogo/commit/c90e2b0501ed40693ce2fa43cafbbf93a0863468))
* **calendar:** fix commit f1257088 ([0186398](https://github.com/Alinto/sogo/commit/01863987dd1ecb14b9f86b97cab02d9f1ea6db78))
* **calendar:** Fix issue where EXDATE removes modified occurence. The behavior is now identical to G Agenda. This fix may reduce the 'missing exception error'. ([5bab727](https://github.com/Alinto/sogo/commit/5bab72726aa8b08baaa189310ede27cf9747be5e))
* **calendar:** Fix SOGoDAVCalendarStartTimeLimit parameter. Events are retrieved when initial sync is done. ([c05b331](https://github.com/Alinto/sogo/commit/c05b331ac02520c294443bbb2ceda5e69b1667d0))
* **calendar:** if rrule is infinite don't count rdates as last dates ([e44bc1f](https://github.com/Alinto/sogo/commit/e44bc1fc91588976c4399724c034d3bae386119f))
* **calendar:** In some case, the startTime was not properly set ([169a0c6](https://github.com/Alinto/sogo/commit/169a0c61251a658e62f83a8f24a07e447d1dbcca))
* **calendar:** prevent to return the same user twice in ldap groups ([f125708](https://github.com/Alinto/sogo/commit/f1257088f2b0513219309286190e5671e7dec624))
* **calendar:** properly store the vevent is the correct order for reccurence and reccurence-id ([d15f0ee](https://github.com/Alinto/sogo/commit/d15f0ee80498231fcc3cd1d1a118f46f33ea4d36))
* **contacts:** Fix empty chip in contact group when c_cn is not populated ([2f9c2cf](https://github.com/Alinto/sogo/commit/2f9c2cf4da35b67ec5d9f4b7e887614608c8018b))
* **core:** Specify application name in WORequest to avoid computing app name in SOPE. Sometimes the app name is wrongly defined due to invalid URL calls. ([253d14c](https://github.com/Alinto/sogo/commit/253d14cfce7552615bbf1e0cf9b242bcd99552b8))
* **htmlViewer:** if the the tag img is not a url but a base64 image, keep it in the preview ([f8ff98b](https://github.com/Alinto/sogo/commit/f8ff98b657b61408208f7a14632bb323dec32a49))
* **mail:** Correct attachment handling when creating emails from templates ([617c1bb](https://github.com/Alinto/sogo/commit/617c1bbc64d49355bade711a7dc7523bf7450a14))
* **mail:** Fix assertion when failed to decode base64 mime body mail part ([0a828a7](https://github.com/Alinto/sogo/commit/0a828a739e10299605eaff72ffaf90a1908b54e8))
* **mail:** Fix ckeditor issue where the font-size disappear after mail sent. Use font-size instead of css class. ([70f72eb](https://github.com/Alinto/sogo/commit/70f72eb92f0f14501758a5660391aa43862e98e7))
* **mail:** Fix ckeditor margin for to make difference between line breaks and paragraph. Fixes [#6056](https://bugs.sogo.nu/view.php?id=6056). ([a09f4d8](https://github.com/Alinto/sogo/commit/a09f4d8f498932edee92976ed24b271ed3cd5204))
* **mail:** Fix error when searching string with quote ([b40d777](https://github.com/Alinto/sogo/commit/b40d777a86104d08dbd8168b8e12c198a3d4321a))
* **mail:** Fix issue where unread counter is invalid when whanging folder. Fixes [#6064](https://bugs.sogo.nu/view.php?id=6064). ([0364f7f](https://github.com/Alinto/sogo/commit/0364f7f2a426041d010ad664172e6206c4bbfd6f))
* **mail:** Fix mail sub folders sorting. Fixes [#6058](https://bugs.sogo.nu/view.php?id=6058). ([395a01e](https://github.com/Alinto/sogo/commit/395a01ed5204c6c138e7d855370dd8acf902e6b4))
* **totp:** correctly send a string and leading zero ([5cba10c](https://github.com/Alinto/sogo/commit/5cba10ccff81ccee12e03472c50f43c713d5abc4))
* **users:** don't look up for users when they change language on root page ([29e00f3](https://github.com/Alinto/sogo/commit/29e00f3e9eb92581e0fe5d4193a534f04a1d2b1a))
* **users:** try to always use the user domain in the basDN with %d ([78655ae](https://github.com/Alinto/sogo/commit/78655ae1270534339d1ea9d1860afe7699bfd98e))
* **users:** when using multi-domains configuration, only request the apopriate usersources. ([beb0d9c](https://github.com/Alinto/sogo/commit/beb0d9cb1bfbcac12650d3a77835d86c34245985))
### Localization
* **ar:** Update Arabic translations ([6de11e5](https://github.com/Alinto/sogo/commit/6de11e58ee9607b1d4884bca0035d09e87f43b47))
* **bg_BG:** Update Bulgarian translations ([60f2f1b](https://github.com/Alinto/sogo/commit/60f2f1b9fc2e0c4e32da86615f074336fce825e5))
* **bs_BA:** Update Bosnian translations ([5c2020d](https://github.com/Alinto/sogo/commit/5c2020dc3e184d9c9f6a674c8b0f51323d01d509))
* **ca:** Update Catalan translations ([83bdc14](https://github.com/Alinto/sogo/commit/83bdc145f9498201b6f3319af30adc1f5e86f4f9))
* **cs:** Update Czech translations ([ac6abb6](https://github.com/Alinto/sogo/commit/ac6abb66ec79c2e5ee4d083d80effdebc081248d))
* **cy:** Update Welsh translations ([7c36a65](https://github.com/Alinto/sogo/commit/7c36a65b7c1506d4dfe89869e9e810ea2928ebe4))
* **da_DK:** Update Danish translations ([2912e07](https://github.com/Alinto/sogo/commit/2912e07e0b32ed5c62ed4aae3d07dcc9a364e00b))
* **de:** Update German translations ([1f379d5](https://github.com/Alinto/sogo/commit/1f379d51fd8ca51d3fc3f9e2fe138e9cde9c8f92))
* **es_AR:** Update SpanishArgentina translations ([f273d3e](https://github.com/Alinto/sogo/commit/f273d3e513e4134389a81658e44131e00a4c0e17))
* **es_ES:** Update SpanishSpain translations ([da15327](https://github.com/Alinto/sogo/commit/da15327c92a7cfbbc97dd1b58a2e10180035d99e))
* **eu:** Update Basque translations ([0dccf10](https://github.com/Alinto/sogo/commit/0dccf105051fcd9631629419888397453804a1a2))
* **fi:** Update Finnish translations ([e067770](https://github.com/Alinto/sogo/commit/e0677705aa9c5376ad3f3e61761847a2e562e042))
* **fr:** Update French translations ([f6d18c2](https://github.com/Alinto/sogo/commit/f6d18c208e52a8fef1d2f7563442069d54f68a8a))
* **gl:** Update Galician translations ([a98d4b9](https://github.com/Alinto/sogo/commit/a98d4b99448e55952a8f87c9f2c976e846ed9790))
* **he:** Update Hebrew translations ([ef6f53f](https://github.com/Alinto/sogo/commit/ef6f53f48cbc251b212d185ad63c2298b6a73698))
* **hr_HR:** Update Croatian translations ([6bb9796](https://github.com/Alinto/sogo/commit/6bb97965500786fc89327fd5ec0127c493c4d2c0))
* **hu:** Update Hungarian translations ([51cf90d](https://github.com/Alinto/sogo/commit/51cf90d62067ec1b62f77236974f90abd582eb5c))
* **id_ID:** Update Indonesian translations ([7b0319d](https://github.com/Alinto/sogo/commit/7b0319d616c4ca3915f871b7ab39d38517f5445d))
* **is:** Update Icelandic translations ([0f2faec](https://github.com/Alinto/sogo/commit/0f2faec7d4a00b1db4b1b4a4dbadc8f0050718d4))
* **it:** Update Italian translations ([4d5cf31](https://github.com/Alinto/sogo/commit/4d5cf314b5f95608193b521f77a203757784e354))
* **ja:** Update Japanese translations ([4c09ebf](https://github.com/Alinto/sogo/commit/4c09ebfb6ed5124f335c5801f6f83d0521db1643))
* **kk:** Update Kazakh translations ([7617db7](https://github.com/Alinto/sogo/commit/7617db7383d5d5fc8f0a6cfe44ede6b7c6262c66))
* **lt:** Update Lithuanian translations ([2bf0780](https://github.com/Alinto/sogo/commit/2bf0780942fc4a2d43d50ce03338cd31cd31769e))
* **lv:** Update Latvian translations ([4367ca5](https://github.com/Alinto/sogo/commit/4367ca5247d85e1abf60f95df716a5ad7627763d))
* **mk_MK:** Update Macedonian translations ([d43f337](https://github.com/Alinto/sogo/commit/d43f3378a5098c1c6bee02cbf208335ab03783ff))
* **nb_NO:** Update NorwegianBokmal translations ([39fa4fc](https://github.com/Alinto/sogo/commit/39fa4fc38fa5515b3ae01d03d9714ef55978e4a2))
* **nl:** Update Dutch translations ([f110498](https://github.com/Alinto/sogo/commit/f110498d3f981024b4bef2c142477a6ba94cdef0))
* **nn_NO:** Update NorwegianNynorsk translations ([d23bb12](https://github.com/Alinto/sogo/commit/d23bb125a3d3eba5fe6ba96c289a032bd0955577))
* **pl:** Update Polish translations ([65f7b25](https://github.com/Alinto/sogo/commit/65f7b2552a640a32c466174e407064f25f2e24fb))
* **pt_BR:** Update BrazilianPortuguese translations ([0bc20b1](https://github.com/Alinto/sogo/commit/0bc20b1b791969eb146286bb6814bc1be7aa50e3))
* **pt:** Update Portuguese translations ([8140643](https://github.com/Alinto/sogo/commit/81406434d66b04c0098259bda890585ecdbacb79))
* **ro_RO:** Update Romanian translations ([4438a2e](https://github.com/Alinto/sogo/commit/4438a2e647edd63abe01ea842259b3fd0f8e0682))
* **ru:** Update Russian translations ([80abd1d](https://github.com/Alinto/sogo/commit/80abd1d896480aeb7f43b2b4abf1da4b433d561a))
* **sk:** Update Slovak translations ([5753a52](https://github.com/Alinto/sogo/commit/5753a52ab4726662dcff37be8002441d6031bfca))
* **sl_SI:** Update Slovenian translations ([9a3a06c](https://github.com/Alinto/sogo/commit/9a3a06c957df7221b1860cd3909bf6caa8bc74c3))
* **sr_ME@latin:** Update Montenegrin translations ([ae4d6a0](https://github.com/Alinto/sogo/commit/ae4d6a07f3079ca28e1e8ff5655e2c2156a90a09))
* **sr@latin:** Update SerbianLatin translations ([b86f594](https://github.com/Alinto/sogo/commit/b86f59411a8a31933b72da39001f845dd00881d8))
* **sr:** Update Serbian translations ([20d6b98](https://github.com/Alinto/sogo/commit/20d6b98f07e6ead91137ecad761ea86393e3f6b8))
* **sv:** Update Swedish translations ([397d0ee](https://github.com/Alinto/sogo/commit/397d0ee5fc892bb616187e2b3aa91d5ea5a9f4b3))
* **tr_TR:** Update TurkishTurkey translations ([a860101](https://github.com/Alinto/sogo/commit/a8601010030bc4dcad405435310cef546fa16297))
* **uk:** Update Ukrainian translations ([52ae03d](https://github.com/Alinto/sogo/commit/52ae03d0649eec6915e995896f1f04e4b69214a9))
* **zh_CN:** Update ChineseChina translations ([d72cc8f](https://github.com/Alinto/sogo/commit/d72cc8fdef7661ff084a1bef19115a47cf6298c2))
* **zh_TW:** Update ChineseTaiwan translations ([7d8b8a4](https://github.com/Alinto/sogo/commit/7d8b8a4ba3470da14f18a4129fcdd23775cd1676))
### [5.11.2](https://github.com/Alinto/sogo/compare/SOGo-5.11.1...SOGo-5.11.2) (2024-10-15)
+327 -140
View File
@@ -1,5 +1,4 @@
Installation and Configuration Guide
====================================
= Installation and Configuration Guide
////
This file is part of the SOGo project.
@@ -10,8 +9,8 @@ Installation and Configuration Guide
////
include::includes/global-attributes.asciidoc[]
About this Guide
----------------
== About this Guide
This guide will walk you through the installation and configuration of
the SOGo solution. It also covers the installation and configuration of
@@ -23,8 +22,8 @@ The instructions are based on version {release_version} of SOGo.
The latest version of this guide is available
at https://www.sogo.nu/support.html#/documentation.
Introduction
------------
== Introduction
SOGo is a free and modern scalable groupware server. It offers shared
calendars, address books, and emails through your favourite Web browser
@@ -48,8 +47,8 @@ device, or Outlook 2013/2016
SOGo is developed by a community of developers located mainly in North
America and Europe. More information can be found at https://sogo.nu/
Architecture and Compatibility
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
=== Architecture and Compatibility
image::images/architecture.png[System Architecture, 400, 964]
@@ -61,11 +60,11 @@ protocol are also supported.
To install and configure the Outlook CalDav Synchronizer, please refer
to the _Outlook Connector Configuration Guide_.
System Requirements
-------------------
Assumptions
~~~~~~~~~~~
== System Requirements
=== Assumptions
SOGo reuses many components in an infrastructure. Thus, it requires the
following:
@@ -73,7 +72,7 @@ following:
* Database server (MariaDB, MySQL, PostgreSQL or Oracle)
* LDAP server (OpenLDAP, Novell eDirectory, Microsoft Active Directory
and others) 
* SMTP server (Postfix, Sendmail and others)
* SMTP server (Postfix)
* IMAP server (Courier, Cyrus IMAP Server, Dovecot and others)
If you plan to use ActiveSync, an IMAP server supporting the ACL,
@@ -104,8 +103,8 @@ components, together with version numbers:
More recent versions of the software mentioned above can also be used.
Minimum Hardware Requirements
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
=== Minimum Hardware Requirements
The following table provides hardware recommendations for the server,
desktops and mobile devices:
@@ -157,8 +156,8 @@ Linux
Microsoft ActiveSync.
|=======================================================================
Operating System Requirements
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
=== Operating System Requirements
The following operating systems are currently supported by SOGo:
@@ -182,16 +181,19 @@ directly to the SOGo website at https://sogo.nu/faq/installation.html.
Note that once the SOGo packages are installed under Debian and Ubuntu,
this guide can be followed in order to fully configure SOGo.
Installation
------------
== Installation
This section will guide you through the installation of SOGo together
with its dependencies. The steps described here apply to an RPM-based
installation for a Red Hat or CentOS 7 distribution. Most of these steps
should apply to all supported operating systems.
Software Downloads
~~~~~~~~~~~~~~~~~~
=== Software Downloads
**In order to access the community build, go to https://www.sogo.nu/download.html[SOGo website]
and select "Development (nightly builds)" at the bottom of the page.**
[NOTE]
In order to access the production builds, you need a proper support contract
@@ -252,8 +254,8 @@ sed -i '/enabled=1/a exclude=gnustep* ytnef*' /etc/yum.repos.d/epel.repo
For more information on EPEL, visit http://fedoraproject.org/wiki/EPEL/.
Software Installation
~~~~~~~~~~~~~~~~~~~~~
=== Software Installation
Once the yum configuration file has been created, you are now ready to
install SOGo and its dependencies. To do so, proceed with the following
@@ -273,8 +275,8 @@ for Oracle. The installation command will thus look like this:
Once completed, SOGo will be fully installed on your server. You are now
ready to configure it.
Configuration
-------------
== Configuration
In this section, you'll learn how to configure SOGo to use your existing
LDAP, SMTP and database servers. As previously mentioned, we assume that
@@ -282,8 +284,8 @@ those components run on the same server on which SOGo is being
installed. If this is not the case, please adjust the configuration
parameters to reflect those changes.
GNUstep Environment Overview
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
=== GNUstep Environment Overview
SOGo makes use of the GNUstep environment. GNUstep is a free software
implementation of the OpenStep specification which provides many
@@ -316,8 +318,8 @@ wrapped within curly brackets `{ [configuration] }`. If SOGo refuses to
start due to syntax errors in its configuration file, `plparse` is helpful
for finding these, as it indicates the line containing the problem.
Preferences Hierarchy
~~~~~~~~~~~~~~~~~~~~~
=== Preferences Hierarchy
SOGo supports domain names segregation, meaning that you can separate
multiple groups of users within one installation of SOGo. A user
@@ -347,8 +349,8 @@ following abbreviations in the tables of this document:
Remember that the hierarchy paradigm allow the default value of a
parameter to be defined at a parent level.
General Preferences
~~~~~~~~~~~~~~~~~~~
=== General Preferences
The following table describes the general parameters that can be set:
@@ -490,6 +492,12 @@ the jitsi server used for creating the meeting link.
Defaults to `https://meet.jit.si` when unset.
|D |SOGoCalendarJitsiRoomPrefix
|Only used if SOGoCalendarEnableJitsiLink is set to YES. The string for
the Jitsi room prefix used for creating the meeting link.
Defaults to `SOGo_meeting/` when unset.
|S |SOGoSAML2PrivateKeyLocation
|The location of the SSL private key file on the filesystem that is used
by SOGo to sign and encrypt communications with the SAML2 identity
@@ -828,12 +836,20 @@ Obiously, if your users can connect without specifying a domain, let this parame
|S |SOGoDomainAllowed
|Parameter used to define which domains SOGo should allowed during a connection request. This parameter is an array of strings.
|S |SOGoURLCreateAccount
|Add a link below the login form and set the link using the value of this setting.
|S |SOGoPasswordRecoveryEnabled
|Boolean enable password recovery with secret question or secondary e-mail. Default value is `NO`.
|S |SOGoPasswordRecoveryBaseURLs
| *Since 5.12.11*. List of allowed base URL for password reset link.
`SOGoPasswordRecoveryBaseURLs = ("https://demo.sogo.nu");`
`SOGoPasswordRecoveryBaseURLs = ("https://platform1.sogo.nu", "https://platform2.sogo.nu);`
Do not end the URLs by '/'.
No defaults, will throw an error if empty or unset.
|S |SOGoPasswordRecoveryDomains
|List of domains where password recovery is enabled, for example `(example.org, example.net)`. If empty array `()`, disabled for all domains. If not set, enabled for all domains.
@@ -872,8 +888,8 @@ Obiously, if your users can connect without specifying a domain, let this parame
[[Secret-for-sensitive-data]]
Secret for sensitive data
~~~~~~~~~~~~~~~~~~~~~~~~~
=== Secret for sensitive data
_Since 5.10_
@@ -967,8 +983,7 @@ sogo-tool user-preferences unset default <user> AuxiliaryMailAccounts
user being the full mail address or just the username if domainless. After that, the user will have to set its auxiliary accounts again.
Authentication using LDAP
~~~~~~~~~~~~~~~~~~~~~~~~~
=== Authentication using LDAP
SOGo can use a LDAP server to authenticate users and, if desired, to
provide global address books. SOGo can also use an SQL backend for this
@@ -1378,8 +1393,8 @@ Defaults to `NO` when unset.
|=======================================================================
LDAP Attributes Indexing
~~~~~~~~~~~~~~~~~~~~~~~~
=== LDAP Attributes Indexing
To ensure proper performance of the SOGo application, the following LDAP
attributes must be fully indexed:
@@ -1395,8 +1410,8 @@ attributes must be fully indexed:
Please refer to the documentation of the software you use in order to
index those attributes.
LDAP Attributes Mapping
~~~~~~~~~~~~~~~~~~~~~~~
=== LDAP Attributes Mapping
Some LDAP attributes are mapped to contacts attributes in the SOGo UI.
The table below list most of them. It is possible to override these by
@@ -1456,8 +1471,8 @@ mapping = {
|Photo |photo
|===
Authenticating using C.A.S.
~~~~~~~~~~~~~~~~~~~~~~~~~~~
=== Authenticating using C.A.S.
SOGo natively supports C.A.S. authentication. For activating C.A.S.
authentication you need first to make sure that the
@@ -1560,8 +1575,8 @@ expected by pam_cas, otherwise it will fail to authenticate incoming
connection properly.
Authenticating using OPENID
~~~~~~~~~~~~~~~~~~~~~~~~~~~
[[openid-section]]
=== Authenticating using OPENID
SOGo natively supports OPENID authentication. For activating OpenId authentication you need first to make sure that
_SOGoAuthenticationType_ is set to `openid`,
@@ -1608,7 +1623,7 @@ Defaults to `0` when unset.
|S |SOGoOpenIdLogoutEnabled
|Allow user to end their openId with the webmail. Meaning that will disconnect them from
the others applicaitons as well.
the others applicaitons as well. The openid server must have a end_session_endpoint.
Defaults to `NO` when unset.
|=======================================================================
@@ -1634,8 +1649,8 @@ the session will stays in the table and be useless. That's why a new sogo-tool c
You can put it in a cron to do that periodicly. +
See _<<sogo-tool-clean-openid-sessions,sogo-tool clean-openid-sessions>>_.
Authenticating using SAML2
~~~~~~~~~~~~~~~~~~~~~~~~~~
=== Authenticating using SAML2
SOGo natively supports SAML2 authentication. Please refer to the documentation of your identity
provider and the SAML2 configuration keys that are listed above for proper setup. Once a SOGo
@@ -1668,8 +1683,7 @@ _NGImap4AuthMechanism_ is configured to use the `SAML` mechanism. If you
make use of the CrudeSAML PAM plugin, this value may be left empty.
Database Configuration
~~~~~~~~~~~~~~~~~~~~~~
=== Database Configuration
SOGo requires a relational database system in order to store
appointments, tasks and contacts information. It also uses the database
@@ -1916,10 +1930,9 @@ calendar.
Ensure the computer used for the test has emoji fonts installed.
[[Authentication-using-SQL]]
Authentication using SQL
~~~~~~~~~~~~~~~~~~~~~~~~
[[Authentication-using-SQL]]
=== Authentication using SQL
SOGo can use a SQL-based database server for authentication. The
configuration is very similar to LDAP-based authentication.
@@ -2156,8 +2169,8 @@ or username@domain.tld
Note that groups are currently not supported for SQL-based
authentication sources.
SMTP Server Configuration
~~~~~~~~~~~~~~~~~~~~~~~~~
=== SMTP Server Configuration
SOGo makes use of a SMTP server to send emails from the Web interface,
iMIP/iTIP messages and various notifications.
@@ -2171,7 +2184,6 @@ The following table describes the related parameters.
are:
[options="compact"]
* `sendmail` - to use the sendmail binary
* `smtp` - to use the SMTP protocol
|D |SOGoSMTPServer
@@ -2199,10 +2211,6 @@ Current, Are supported `PLAIN` and 'xoauth2' for openid.
|D |SOGoSMTPMasterUserPassword
|SMTP account password for master account (`SOGoSMTPMasterUserEnabled` enabled).
|S |WOSendMail
|The path of the sendmail binary.
Defaults to `/usr/lib/sendmail`.
|D |SOGoForceExternalLoginWithEmail
|Parameter used to specify if, when logging in to the SMTP server, the
@@ -2216,8 +2224,8 @@ Possible values are:
Defaults to `NO` when unset.
|=======================================================================
IMAP Server Configuration
~~~~~~~~~~~~~~~~~~~~~~~~~
=== IMAP Server Configuration
SOGo requires an IMAP server in order to let users consult their email
messages, manage their folders and more.
@@ -2385,8 +2393,8 @@ permissions for the individual user.
The default prefix is `$`. 
|=======================================================================
Web Interface Configuration
~~~~~~~~~~~~~~~~~~~~~~~~~~~
=== Web Interface Configuration
The following additional parameters only affect the Web interface
behaviour of SOGo.
@@ -2752,7 +2760,7 @@ Defaults to `inline` when unset.
|Show recipients or sender full email in mailboxes if set to `YES`. Default value is `NO`.
|U |SOGoMailHideInlineAttachments
|Hide attachements for inline images if set to `YES`. Default value is `NO`.
|Hide attachments for inline images if set to `YES`. Default value is `NO`.
|U |SOGoMailCustomFullName
@@ -2888,13 +2896,27 @@ SOGoMailJunkSettings = {
};
----
|D |mailJunkIcon
|Choose the Junk icon. Values are :
https://materialui.co/icon/thumb-down[thumb_down],
https://materialui.co/icon/gpp-bad[gpp_bad],
https://materialui.co/icon/local-fire-department[local_fire_department],
https://materialui.co/icon/bug-report[bug_report],
https://materialui.co/icon/error[error],
https://materialui.co/icon/warning[warning],
https://materialui.co/icon/dangerous[dangerous] and
https://materialui.co/icon/report-gmailerrorred[report_gmailerrorred].
Defaults to `thumb_down`.
|D |SOGoMailKeepDraftsAfterSend
|Parameter used to keep mails in the drafts folder once they have been
sent by SOGo. Defaults to `NO` when unset.
|=======================================================================
SOGo Configuration Summary
~~~~~~~~~~~~~~~~~~~~~~~~~~
=== SOGo Configuration Summary
The complete SOGo configuration file `/etc/sogo/sogo.conf` should look
like this:
@@ -2942,10 +2964,9 @@ like this:
}
----
[[multi-domains-configuration]]
Multi-domains Configuration
~~~~~~~~~~~~~~~~~~~~~~~~~~~
[[multi-domains-configuration]]
=== Multi-domains Configuration
If you want your installation to isolate two groups of users, you must
define a distinct authentication source for each _domain_. Your domain keys
@@ -3041,8 +3062,8 @@ Defaults to an empty array, which means domains are isolated from each
other.
|=======================================================================
Apache Configuration
~~~~~~~~~~~~~~~~~~~~
=== Apache Configuration
The SOGo configuration for Apache is located in
`/etc/httpd/conf.d/SOGo.conf`.
@@ -3071,8 +3092,8 @@ The default configuration will use `mod_proxy` and `mod_headers` to
relay requests to the `sogod` parent process. This is suitable for small
to medium deployments.
Starting Services
~~~~~~~~~~~~~~~~~
=== Starting Services
Once SOGo if fully installed and configured, start the services using
the following command:
@@ -3088,8 +3109,8 @@ modules and configuration files were added:
Finally, you should also make sure that the `memcached` service is
started and that it is also automatically started at boot time.
_Cronjob_ — EMail reminders
~~~~~~~~~~~~~~~~~~~~~~~~~~~
=== _Cronjob_ — EMail reminders
SOGo allows you to set email-based reminders for events and tasks. To
enable this, you must enable the `SOGoEnableEMailAlarms` preference and
@@ -3116,8 +3137,8 @@ SOGoSMTPMasterUserUsername = "foo";
SOGoSMTPMasterUserPassword = "bar";
```
_Cronjob_ — Vacation messages activation and expiration
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
=== _Cronjob_ — Vacation messages activation and expiration
When vacation messages are enabled (see the parameter
_SOGoVacationEnabled_), users can set an activation or expiration date
@@ -3138,8 +3159,8 @@ The _cronjob_ should look like this:
0 0 * * * sogo /usr/sbin/sogo-tool update-autoreply -p /etc/sogo/sieve.creds
----
_Password_ — Force user password change at login
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
=== _Password_ — Force user password change at login
The following commands force user to change his password at login :
@@ -3153,11 +3174,11 @@ Disable :
/usr/sbin/sogo-tool user-preferences unset settings [USER] ForceResetPassword
----
Managing User Accounts
----------------------
Creating the SOGo Administrative Account
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
== Managing User Accounts
=== Creating the SOGo Administrative Account
First, create the SOGo administrative account in your LDAP server. The
following LDIF file (`sogo.ldif`) can be used as an example:
@@ -3184,8 +3205,8 @@ administrative account using the following command:
ldappasswd -h 127.0.0.1 -x -w qwerty -D cn=Manager,dc=acme,dc=com uid=sogo,ou=users,dc=acme,dc=com -s qwerty
Creating a User Account
~~~~~~~~~~~~~~~~~~~~~~~
=== Creating a User Account
SOGo uses LDAP directories to authenticate users. Use the following LDIF
file (`jdoe.ldif`) as an example to create a SOGo user account:
@@ -3218,8 +3239,8 @@ easier. These GUI utilities can make use of templates to create and
pre-configure typical user accounts or any standardized LDAP record,
along with the correct object classes, fields and default values.
Microsoft Enterprise ActiveSync
-------------------------------
=== Microsoft Enterprise ActiveSync
SOGo supports the Microsoft ActiveSync protocol.
@@ -3355,8 +3376,8 @@ and send an email to iplicreq@microsoft.com
Alinto provides this software for free, but is not responsible for
anything related to its usage.
Microsoft Enterprise ActiveSync Tuning
--------------------------------------
== Microsoft Enterprise ActiveSync Tuning
First of all, it is important to know that most EAS devices will keep
HTTP connections open to SOGo (and thus, Apache) for a long time. This
@@ -3431,8 +3452,8 @@ SOGoMaximumSyncInterval = 3540;
SOGoInternalSyncInterval = 60;
----
S/MIME Support in SOGo
----------------------
== S/MIME Support in SOGo
SOGo supports S/MIME email signing and encryption. When receiving
S/MIME signed emails, SOGo automatically extracts the PKCS (Public-Key
@@ -3450,11 +3471,10 @@ please have a look at Actalis:
https://www.actalis.it/products/certificates-for-secure-electronic-mail.aspx
Using SOGo
----------
== Using SOGo
SOGo Web Interface
~~~~~~~~~~~~~~~~~~
=== SOGo Web Interface
To acces the SOGo Web Interface, point your Web browser, which is
running from the same server where SOGo was installed, to the following
@@ -3463,8 +3483,8 @@ URL: http://127.0.0.1/SOGo.
Log in using the "jdoe" user and the "qwerty" password. The underlying
database tables will automatically be created by SOGo.
Mozilla Thunderbird and Lightning
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
=== Mozilla Thunderbird and Lightning
Alternatively, you can access SOGo with a GroupDAV and a CalDAV client.
A typical well-integrated setup is to use Mozilla Thunderbird and
@@ -3506,8 +3526,8 @@ To access your personal calendar:
`http://127.0.0.1/SOGo/dav/jdoe/Calendar/personal/`
* Click on Continue.
Apple Calendar (macOS, iOS, iPadOS)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
=== Apple Calendar (macOS, iOS, iPadOS)
Apple Calendar on macOS, iOS, and iPadOS can also be used
as a client application for SOGo.
@@ -3525,8 +3545,8 @@ You have to add the profile to your device :
* Go to Settings / Profiles / Click on + / Continue
* Type your SOGo account password and click on install
Apple AddressBook
~~~~~~~~~~~~~~~~~
=== Apple AddressBook
Since Mac OS X 10.6 (Snow Leopard), Apple AddressBook can be configured
to use SOGo.
@@ -3574,8 +3594,8 @@ You have to add the profile to your device :
* Go to Settings / Profiles / Click on + / Continue
* Type your SOGo account password and click on install
Microsoft ActiveSync
~~~~~~~~~~~~~~~~~~~~
=== Microsoft ActiveSync
You can synchronize contacts, emails, events and tasks from SOGo with
any mobile devices that support Microsoft ActiveSync. Microsoft Outlook
@@ -3584,8 +3604,9 @@ any mobile devices that support Microsoft ActiveSync. Microsoft Outlook
The Microsoft ActiveSync server URL is generally something
like: `http://127.0.0.1/Microsoft-Server-ActiveSync`.
Using sogo-tool
---------------
== Using sogo-tool
The command _sogo-tool_ allows to do some operations on database and sieve filter. It is included with
the sogo package on Debian/Ubuntu but must be installed manually on RHEl/CentOS:
@@ -3594,8 +3615,8 @@ the sogo package on Debian/Ubuntu but must be installed manually on RHEl/CentOS:
*_WARNING_: Use sogo-tool with full awareness of what you are doing. This is an admin tool that can cause loss of data
or completely make the webmail unusable by a user.*
sogo-tool backup/restore
~~~~~~~~~~~~~~~~~~~~~~~~
=== sogo-tool backup/restore
The backup tool saves the information of a user into a file. The information saved are its preferences, its events and its contacts.
@@ -3676,8 +3697,8 @@ sogo-tool restore -F "Contacts/personal" tmp/backup user1
sogo-tool restore -F "Calendar/60C8-65323D80-7-4D9F7D80" tmp/backup user1
----
sogo-tool checkup
~~~~~~~~~~~~~~~~~
=== sogo-tool checkup
Check the events and contacts data's integrity of a user
@@ -3708,8 +3729,8 @@ sogo-tool checkup -d user1
[[sogo-tool-clean-openid-sessions]]
sogo-tool clean-openid-sessions
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
=== sogo-tool clean-openid-sessions
Obviously only usefull if you have set SOGo with openId authentication.
Will clean all expired openId sessions from the database.
@@ -3721,8 +3742,8 @@ Example:
sogo-tool clean-openid-sessions
----
sogo-tool cleanup
~~~~~~~~~~~~~~~~~
=== sogo-tool cleanup
Will purge all user's deleted events and contacts which the deletion is older than a number of days.
@@ -3746,8 +3767,7 @@ Purged 5 records from folder /Users/user2/Calendar/personal
----
sogo-tool create-folder
~~~~~~~~~~~~~~~~~~~~~~~
=== sogo-tool create-folder
Create a folder (Calendar or Address Book) for a user.
@@ -3764,8 +3784,31 @@ sogo-tool create-folder user2 Calendar Pro_Calendar
----
sogo-tool dump-defaults
~~~~~~~~~~~~~~~~~~~~~~~
=== sogo-tool init-user
Create the personal calendar and the personal address book of one or more users, and initialize
their preferences. Those folders and preferences are otherwise only created upon the user's first
login, which prevents any operation on them (setting ACLs or reading the user's preferences from a
provisioning tool, for instance) beforehand.
The resulting preferences are the same as the ones a login through the web interface would produce.
init-user [-l language] user1 [user2] ...
* *user* is the name of the user
* *language* is the language of the user's preferences, as it would be chosen at login. When
omitted, the language of the domain or of the system is used. The categories and labels stored in
the preferences are localized accordingly.
Example:
----
sogo-tool init-user user1
sogo-tool init-user user1 user2
sogo-tool init-user -l French user1
----
=== sogo-tool dump-defaults
Output all current defaults value of GNUstep and SOGo (sogo.conf)
@@ -3782,8 +3825,8 @@ sogo-tool dump-defaults all
sogo-tool dump-defaults -f /tmp/foo/conf.xml
----
sogo-tool expire-sessions
~~~~~~~~~~~~~~~~~~~~~~~~~
=== sogo-tool expire-sessions
Expires user sessions from database without activity for specified number of minutes. When a user log in to sogo for
the first time, sogo will create a entry in database's table OCSSessionsFolderURL with the user's information. Sogo will
@@ -3802,8 +3845,8 @@ sogo-tool expire-sessions 160 #Will remove session which last activity is ol
sogo-tool expire-sessions 0 #Will remove session which last activity is older than 0 minutes.
----
sogo-tool manage-acl
~~~~~~~~~~~~~~~~~~~~
=== sogo-tool manage-acl
Manage access-control list (ACL) of a user for folders (Calendar and Address Book).
@@ -3874,8 +3917,8 @@ Example:
sogo-tool manage-acl unsubscribe sogo-tests1 Contacts/5E1D-653FC400-1-1A330C40 sogo-tests2
----
sogo-tool manage-eas
~~~~~~~~~~~~~~~~~~~~
=== sogo-tool manage-eas
Manage EAS folders
@@ -3905,8 +3948,8 @@ sogo-tool manage-eas mergevcard janedow androidc316986417 YES
sogo-tool manage-eas mergevevent janedow androidc316986417 YES
----
sogo-tool remove
~~~~~~~~~~~~~~~~
=== sogo-tool remove
Remove all folders (Calendar and Address Book) and Preference settings of a user. The personal Calendar and Address Book
will stay but be emptied of all entries. The Preferences will go back to defaults values as for a new user.
@@ -3930,8 +3973,8 @@ Deleting /Users/user2/Contacts/B087-65363400-7-374DA380
Deleting /Users/user2/Contacts/personal
----
sogo-tool remove-doubles
~~~~~~~~~~~~~~~~~~~~~~~~
=== sogo-tool remove-doubles
remove duplicate contacts from the specified user addressbook
@@ -3956,8 +3999,8 @@ sogo-tool remove-doubles user1 personal
sogo-tool remove-doubles user2 489-65376E80-1-2D2BA000
----
sogo-tool rename-user
~~~~~~~~~~~~~~~~~~~~~
=== sogo-tool rename-user
Update records pertaining to a user after a change of user id. Will change all folders path, subscriptions from others users,
all mention of user id in database.
@@ -3975,8 +4018,8 @@ Example:
sogo-tool rename-user old_username new_username
----
sogo-tool truncate-calendar
~~~~~~~~~~~~~~~~~~~~~~~~~~~
=== sogo-tool truncate-calendar
Remove old calendar entries from the specified user calendar.
@@ -4006,8 +4049,7 @@ Removing 1 records...
Removed 1 records.
----
sogo-tool update-autoreply
~~~~~~~~~~~~~~~~~~~~~~~~~~
=== sogo-tool update-autoreply
_This command is only useful if your sieve server doesn't have the capabilities *date* or *relational*_
In that case this command will check vacation's setting of all the users. If vacation is enabled/disabled,
@@ -4027,8 +4069,7 @@ Example:
[[sogo-tool-update-secret]]
sogo-tool update-secret
~~~~~~~~~~~~~~~~~~~~~~~
=== sogo-tool update-secret
_New in 5.10_
@@ -4054,8 +4095,7 @@ If your data are already encrypted with 'oldSecret' but you want to decrypt them
sogo-tool update-secret -o oldSecret
----
sogo-tool user-preferences
~~~~~~~~~~~~~~~~~~~~~~~~~~
=== sogo-tool user-preferences
Get, set or unset user defaults / settings in the database.
@@ -4114,9 +4154,153 @@ sogo-tool user-preferences set defaults user1 Forward -f /path/filename -p cred
----
== API REST
Upgrading
---------
Starting from 5.12.2, an API with two endpoints is available.
All response will be on json format. In case of errors, the message will be:
```json
{"error" : "message"}
```
with an explicit message
=== API server url
_<scheme>_://_<domain>_/SOGo/SOGoAPI/_<action>_
• *scheme* : https or http
• *domain* : domain or ip:port of SOGo's server
• *action* : name of the action. No action does the Version action described below.
=== Authentication
Somes actions needs to be authenticated. There is two ways to do so:
* *Basic auth*
Add a header *Auhtorization* with value:
'Basic <credentials>'
*credentials* is the sitrng '<uid>:<password>' base64 encoded.
* *OpenID*
**Only works if you configure sogo to use openid. See <<openid-section, the related section>>**
Add a header *Auhtorization* with value:
'Bearer <access_token>'
*acces_token* is from the https://connect2id.com/products/server/docs/api/token#url[openid protocol]. It has to be fetch with the scope `openid`.
=== Action - Version
* *URL*: <scheme>://<domain>/SOGo/SOGoAPI/Version
* *Authentication needed*: NO
* *HTTP method allowed*: GET
* *Description*: Return the current version of sogo
* *Answer structure*:
```json
{
"major":5,
"patch":1,
"minor":12
}
```
=== Action - UserFolder
* *URL*: <scheme>://<domain>/SOGo/SOGoAPI/UserFolder
* *Authentication needed*: YES
* *HTTP method allowed*: GET
* *Description*: Return the caldav and cardav links of the authenticated user, plus their names.
* *Answer structure*:
```json
{
"calendar":[
{
"name":"DidyShared",
"url":"http://127.0.0.1/SOGo/dav/sogo-tests1@example.org/Calendar/12509-67F67D00-1-3105AF40"
},
{
"name":"LocalDidy",
"url":"http://127.0.0.1/SOGo/dav/sogo-tests1@example.org/Calendar/1BC38-67B60000-1-6E4B6880"
},
{
"name":"Personal Calendar",
"url":"http://127.0.0.1/SOGo/dav/sogo-tests1@example.org/Calendar/personal"
}
],
"username":"sogo-tests1@example.org",
"contact":[
{
"name":"Personal Address Book",
"url":"http://127.0.0.1/SOGo/dav/sogo-tests1@example.org/Contacts/personal"
}
]
}
```
* *Note*:
The Answer has 3 primary keys:
** *username*: uid of the user.
** *calendar*: array of calendar's folder info.
** *contact*: array of calendar's folder info.
A folder info is a dict with:
** *name*: Name of the folder.
** *url*: Dav link of the folder.
=== Errors and messages
Complete http response is `{“error:” : <message>}`.
*<action>* is the one used for the request: `<scheme>://<domain>/SOGo/SOGoAPI/<action>`
[%header,cols="1,3,3"]
|===
|Status |Message |Description
|400
|No backend API found for action: <action>
|The requested action doesn't exist
|500
|Can't alloc and init class: <classAction>
|The requested action exist but failed to be instantiated. <classAction> is the class's name
|400
|Method <method> not allowed for action <action>
|Http method not allowed. <methos> is the one used (GET, PUT, POST...)
|400
|Missing param <param> for action <action>
|Required param for action not found. <param> is the name of the missing parameter.
|401
|No authorization header found for <action>
|No Authorization header found
|401
|Authorization method incorrect: <auth> for action <action>
|Value of Authorization's header doesn't start with Basic or Bearer. <auth> is the full value.
|401
|User wrong login or not found for action <action>
|Fail to authenticate the user. Various causes possible: wrong login, wrong password, expired token...
|500
|Internal error during: <action>
|Internal error during the action
|===
To have more logs you can add `SOGoAPIDebugEnabled = YES;` to your sogo.conf.
== Upgrading
This section describes what needs to be done when upgrading to the
current version of SOGo from the previous release.
@@ -4124,6 +4308,9 @@ current version of SOGo from the previous release.
[cols="100a"]
|=======================================================================
h|5.12.11
|If you enable Password Recovery, new mandatory settings `SOGoPasswordRecoveryBaseURLs`
h|5.11
|Parameters `SOGoGlobalAddressBookFirstEntries` and `SOGoGlobalAddressBookFirstEntriesCount` has been removed. Please use `listRequiresDot` and `globalAddressBookFirstEntriesCount` instead. Signature are now between a div tag to avoid CKEditor changing the content - set `SOGoForceRawHtmlSignature` to `NO` to leave signature (https://bugs.sogo.nu/view.php?id=5920).
@@ -12,8 +12,8 @@
////
Additional Information
----------------------
== Additional Information
For more information, please consult the online FAQs (Frequently Asked
Questions) :
@@ -12,8 +12,7 @@
////
Commercial Support and Contact Information
------------------------------------------
== Commercial Support and Contact Information
For any questions or comments, do not hesitate to contact us by writing
an email to contact@sogo.nu.
+1
View File
@@ -9,6 +9,7 @@ SUBPROJECTS = \
SoObjects \
Main \
UI \
API \
Tools \
Tests/Unit \
+15 -4
View File
@@ -380,10 +380,15 @@ 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
{
//Here the user is expected to be name or name@domain.com
//However iOS 18.4 sanitize the caldav url and put %40 instead of @
login = [login stringByReplacingOccurrencesOfString: @"%40" withString: @"@"];
user = [SOGoUser userWithLogin: login roles: nil];
}
if (user)
userFolder = [$(@"SOGoUserFolder") objectWithName: login
inContainer: self];
@@ -412,7 +417,7 @@ static BOOL debugLeaks;
{
id obj;
WORequest *request;
BOOL isDAVRequest;
BOOL isDAVRequest, isAPIRequest;
SOGoSystemDefaults *sd;
/* put locale info into the context in case it's not there */
@@ -420,8 +425,14 @@ static BOOL debugLeaks;
sd = [SOGoSystemDefaults sharedSystemDefaults];
request = [_ctx request];
isAPIRequest = [[request requestHandlerKey] isEqualToString:@"SOGoAPI"];
isDAVRequest = [[request requestHandlerKey] isEqualToString:@"dav"];
if (isDAVRequest || [sd isWebAccessEnabled])
if(isAPIRequest && ![_key isEqualToString:@"SOGo"] && ![_key isEqualToString:@"SOGoAPI"])
{
//The request will be handle by the API Dispatcher
obj = nil;
}
else if (isDAVRequest || [sd isWebAccessEnabled])
{
if (isDAVRequest)
{
@@ -451,7 +462,7 @@ static BOOL debugLeaks;
{
obj = [self lookupUser: _key inContext: _ctx];
if (!obj && ![_key isEqualToString: @"public"])
obj = [self lookupUser: @"anonymous" inContext: _ctx];
obj = [self lookupUser: @"anonymous" inContext: _ctx];
}
}
}
+1
View File
@@ -76,6 +76,7 @@
- (BOOL)folderExistsAtPath:(NSString *)_path;
- (NSArray *)listSubFoldersAtPath:(NSString *)_path recursive:(BOOL)_flag;
- (NSArray *)listSubFoldersAndNamesAtPath:(NSString *)_path recursive:(BOOL)_recursive;
- (NSDictionary *) recordAtPath: (NSString *) _path;
- (GCSFolder *)folderAtPath:(NSString *)_path;
+216 -76
View File
@@ -32,10 +32,12 @@
#import <NGExtensions/NSObject+Logs.h>
#import <GDLAccess/EOAdaptorContext.h>
#import <GDLAccess/EOAdaptor.h>
#import <NGExtensions/NGResourceLocator.h>
#import "GCSChannelManager.h"
#import "EOAdaptorChannel+GCS.h"
#import "EOQualifier+GCS.h"
#import "GCSAlarmsFolder.h"
#import "GCSAdminFolder.h"
#import "GCSOpenIdFolder.h"
@@ -383,21 +385,12 @@ static BOOL _singleStoreMode = NO;
return [[self channelManager] canConnect:[self folderInfoLocation]];
}
- (NSArray *)performSQL:(NSString *)_sql {
EOAdaptorChannel *channel;
- (NSArray *)performSQL:(NSString *)_sql withChannel: (EOAdaptorChannel*) channel{
NSException *ex;
NSMutableArray *rows;
NSDictionary *row;
NSArray *attrs;
/* acquire channel */
if ((channel = [self acquireOpenChannel]) == nil) {
if (debugOn) [self debugWithFormat:@"could not acquire channel!"];
return nil;
}
if (debugOn) [self debugWithFormat:@"acquired channel: %@", channel];
/* run SQL */
if ((ex = [channel evaluateExpressionX:_sql]) != nil) {
@@ -513,9 +506,12 @@ static BOOL _singleStoreMode = NO;
- (NSString *)generateSQLWhereForInternalNames:(NSArray *)_names
exactMatch:(BOOL)_beExact orDirectSubfolderMatch:(BOOL)_directSubs
withChannel: (EOAdaptorChannel*) channel
{
/* generates a WHERE qualifier for matching the "quick" entries */
NSMutableString *sql;
EOAdaptorContext *adaptorContext;
EOAdaptor *adaptor;
unsigned i, count;
if ((count = [_names count]) == 0) {
@@ -523,10 +519,13 @@ static BOOL _singleStoreMode = NO;
__PRETTY_FUNCTION__];
return @"1 = 2";
}
sql = [NSMutableString stringWithCapacity:(count * 8)];
adaptorContext = [channel adaptorContext];
adaptor = [adaptorContext adaptor];
sql = [NSMutableString stringWithString:@""];
for (i = 0; i < quickPathCount; i++) {
NSString *pathColumn;
EOQualifier *qualifier;
char buf[32];
sprintf(buf, GCSPathColumnPattern, (i + 1));
@@ -537,8 +536,11 @@ static BOOL _singleStoreMode = NO;
if (i < count) {
/* exact match, regular column */
if ([sql length] > 0) [sql appendString:@" AND "];
[sql appendString:pathColumn];
[sql appendFormat:@" = '%@'", [_names objectAtIndex:i]];
qualifier = [[EOKeyValueQualifier alloc] initWithKey: pathColumn
operatorSelector: EOQualifierOperatorEqual
value: [_names objectAtIndex:i]];
[qualifier appendSQLToString: sql withAdaptor: adaptor];
}
else if (_beExact) {
/* exact match, ensure that all additional quick-cols are NULL */
@@ -569,9 +571,12 @@ static BOOL _singleStoreMode = NO;
}
if (_beExact && (count > quickPathCount)) {
[sql appendString:@" AND c_foldername = '"];
[sql appendString:[_names lastObject]];
[sql appendString:@"'"];
EOQualifier *qualifier;
[sql appendString:@" AND "];
qualifier = [[EOKeyValueQualifier alloc] initWithKey: @"c_foldername"
operatorSelector: EOQualifierOperatorEqual
value: [_names lastObject]];
[qualifier appendSQLToString: sql withAdaptor: adaptor];
}
return sql;
@@ -579,13 +584,15 @@ static BOOL _singleStoreMode = NO;
- (NSString *)generateSQLPathFetchForInternalNames:(NSArray *)_names
exactMatch:(BOOL)_beExact orDirectSubfolderMatch:(BOOL)_directSubs
withChannel: (EOAdaptorChannel*) channel
{
/* fetches the 'path' subset for a given quick-names */
NSMutableString *sql;
NSString *ws;
ws = [self generateSQLWhereForInternalNames:_names
exactMatch:_beExact orDirectSubfolderMatch:_directSubs];
exactMatch:_beExact orDirectSubfolderMatch:_directSubs
withChannel: channel];
if ([ws length] == 0)
return nil;
@@ -598,6 +605,29 @@ static BOOL _singleStoreMode = NO;
return sql;
}
- (NSString *)generateSQLPathAndNameFetchForInternalNames:(NSArray *)_names
exactMatch:(BOOL)_beExact orDirectSubfolderMatch:(BOOL)_directSubs
withChannel: (EOAdaptorChannel*) channel
{
/* fetches the 'path' subset for a given quick-names */
NSMutableString *sql;
NSString *ws;
ws = [self generateSQLWhereForInternalNames:_names
exactMatch:_beExact orDirectSubfolderMatch:_directSubs
withChannel: channel];
if ([ws length] == 0)
return nil;
sql = [NSMutableString stringWithCapacity:256];
[sql appendString:@"SELECT c_path, c_foldername FROM "];
[sql appendString:[self folderInfoTableName]];
[sql appendString:@" WHERE "];
[sql appendString:ws];
if (debugSQLGen) [self logWithFormat:@"PathFetch-SQL: %@", sql];
return sql;
}
/* handling folder names */
- (BOOL)_isStandardizedPath:(NSString *)_path {
@@ -705,6 +735,7 @@ static BOOL _singleStoreMode = NO;
NSString *fname, *sname, *sql;
NSArray *fnames, *records;
unsigned int count;
EOAdaptorChannel* channel;
NSDictionary *record;
BOOL result;
@@ -712,36 +743,41 @@ static BOOL _singleStoreMode = NO;
fnames = [self internalNamesFromPath: _path];
if (fnames)
{
sql = [self generateSQLPathFetchForInternalNames: fnames
exactMatch: YES
orDirectSubfolderMatch: NO];
if ([sql length])
{
records = [self performSQL: sql];
if (records)
{
count = [records count];
if (count)
{
fname = [self internalNameFromPath: _path];
if (count == 1)
{
record = [records objectAtIndex: 0];
sname = [record objectForKey: GCSPathRecordName];
result = [fname isEqualToString: sname];
}
else
[self logWithFormat: @"records: %@", records];
}
}
else
[self logWithFormat:@"ERROR(%s): executing SQL failed: '%@'",
__PRETTY_FUNCTION__, sql];
}
else
[self debugWithFormat:@"got no SQL for names: %@", fnames];
{
if ((channel = [self acquireOpenChannel]) == nil) {
return [NSException exceptionWithName:@"GCSNoChannel"
reason:@"could not "
userInfo:nil];
}
sql = [self generateSQLPathFetchForInternalNames: fnames
exactMatch: YES
orDirectSubfolderMatch: NO
withChannel: channel];
if ([sql length])
{
records = [self performSQL: sql withChannel: channel];
if (records)
{
count = [records count];
if (count)
{
fname = [self internalNameFromPath: _path];
if (count == 1)
{
record = [records objectAtIndex: 0];
sname = [record objectForKey: GCSPathRecordName];
result = [fname isEqualToString: sname];
}
else
[self logWithFormat: @"records: %@", records];
}
}
else
[self logWithFormat:@"ERROR(%s): executing SQL failed: '%@'", __PRETTY_FUNCTION__, sql];
}
else
[self debugWithFormat:@"got no SQL for names: %@", fnames];
}
else
[self debugWithFormat:@"got no internal names for path: '%@'", _path];
@@ -753,21 +789,29 @@ static BOOL _singleStoreMode = NO;
NSString *fname;
NSArray *fnames, *records;
NSString *sql;
EOAdaptorChannel *channel;
unsigned i, count;
if ((fnames = [self internalNamesFromPath:_path]) == nil) {
[self debugWithFormat:@"got no internal names for path: '%@'", _path];
return nil;
}
if ((channel = [self acquireOpenChannel]) == nil) {
return [NSException exceptionWithName:@"GCSNoChannel"
reason:@"could not "
userInfo:nil];
}
sql = [self generateSQLPathFetchForInternalNames:fnames
exactMatch:NO orDirectSubfolderMatch:(_recursive ? NO : YES)];
exactMatch:NO orDirectSubfolderMatch:(_recursive ? NO : YES) withChannel: channel];
if ([sql length] == 0) {
[self debugWithFormat:@"got no SQL for names: %@", fnames];
[self releaseChannel: channel];
return nil;
}
if ((records = [self performSQL:sql]) == nil) {
if ((records = [self performSQL:sql withChannel: channel]) == nil) {
[self logWithFormat:@"ERROR(%s): executing SQL failed: '%@'",
__PRETTY_FUNCTION__, sql];
return nil;
@@ -806,22 +850,105 @@ static BOOL _singleStoreMode = NO;
return result;
}
- (NSDictionary *) recordAtPath: (NSString *) _path
{
NSMutableString *sql;
NSArray *fnames, *records;
NSString *ws;
NSDictionary *record;
- (NSArray *)listSubFoldersAndNamesAtPath:(NSString *)_path recursive:(BOOL)_recursive{
NSMutableArray *result;
NSString *fname;
NSArray *fnames, *records;
NSString *sql;
unsigned i, count;
EOAdaptorChannel *channel;
if ((fnames = [self internalNamesFromPath:_path]) == nil) {
[self debugWithFormat:@"got no internal names for path: '%@'", _path];
return nil;
}
if ((channel = [self acquireOpenChannel]) == nil) {
return [NSException exceptionWithName:@"GCSNoChannel"
reason:@"could not "
userInfo:nil];
}
sql = [self generateSQLPathAndNameFetchForInternalNames:fnames
exactMatch:NO orDirectSubfolderMatch:(_recursive ? NO : YES) withChannel: channel];
if ([sql length] == 0) {
[self debugWithFormat:@"got no SQL for names: %@", fnames];
[self releaseChannel: channel];
return nil;
}
if ((records = [self performSQL:sql withChannel: channel]) == nil) {
[self logWithFormat:@"ERROR(%s): executing SQL failed: '%@'",
__PRETTY_FUNCTION__, sql];
return nil;
}
if ((count = [records count]) == 0) {
return emptyArray;
}
result = [NSMutableArray arrayWithCapacity:(count > 128 ? 128 : count)];
fname = [self internalNameFromPath:_path];
fname = [fname stringByAppendingString:@"/"]; /* add slash */
for (i = 0; i < count; i++) {
NSDictionary *record, *folderInfo;
NSString *sname, *spath, *foldername;
record = [records objectAtIndex:i];
sname = [record objectForKey:GCSPathRecordName];
if (![sname hasPrefix:fname]) /* does not match at all ... */
continue;
/* strip prefix and following slash */
sname = [sname substringFromIndex:[fname length]];
spath = [self pathPartFromInternalName:sname];
if (_recursive) {
if ([spath length] > 0){
foldername = [record objectForKey: @"c_foldername"];
folderInfo = [NSDictionary dictionaryWithObjectsAndKeys: spath, @"path", foldername, @"name", nil];
[result addObject:folderInfo];
}
}
else {
/* direct children only, so exclude everything with a slash */
if ([sname rangeOfString:@"/"].length == 0 && [spath length] > 0)
{
foldername = [record objectForKey: @"c_foldername"];
folderInfo = [NSDictionary dictionaryWithObjectsAndKeys: spath, @"path", foldername, @"name", nil];
[result addObject:folderInfo];
}
}
}
return result;
}
- (NSDictionary *) recordAtPath: (NSString *) _path
{
NSMutableString *sql;
NSArray *fnames, *records;
NSString *ws;
NSDictionary *record;
EOAdaptorChannel *channel;
if ((fnames = [self internalNamesFromPath:_path]) == nil) {
[self debugWithFormat:@"got no internal names for path: '%@'", _path];
return nil;
}
/* generate SQL to fetch folder attributes */
if ((channel = [self acquireOpenChannel]) == nil) {
return [NSException exceptionWithName:@"GCSNoChannel"
reason:@"could not "
userInfo:nil];
}
ws = [self generateSQLWhereForInternalNames:fnames
exactMatch:YES orDirectSubfolderMatch:NO];
exactMatch:YES orDirectSubfolderMatch:NO withChannel: channel];
sql = [NSMutableString stringWithCapacity:256];
[sql appendString:@"SELECT "];
@@ -838,7 +965,7 @@ static BOOL _singleStoreMode = NO;
/* fetching */
if ((records = [self performSQL:sql]) == nil) {
if ((records = [self performSQL:sql withChannel: channel]) == nil) {
[self logWithFormat:@"ERROR(%s): executing SQL failed: '%@'",
__PRETTY_FUNCTION__, sql];
return nil;
@@ -905,44 +1032,55 @@ static BOOL _singleStoreMode = NO;
andChannel: (EOAdaptorChannel *) channel
atPath: (NSString *) path
{
NSString *baseURL, *tableName, *quickTableName, *aclTableName, *createQuery, *sql;
NSString *baseURL, *tableName, *quickTableName, *aclTableName, *createQuery, *sql, *safeFolderName, *safePath;
GCSSpecialQueries *specialQuery;
EOAdaptorContext *aContext;
EOAdaptor *adaptor;
EOAttribute *attribute;
NSMutableArray *paths;
NSException *error;
NSRange range;
paths = [NSMutableArray arrayWithArray: [path componentsSeparatedByString: @"/"]];
aContext = [channel adaptorContext];
[aContext beginTransaction];
//escape foldername to avoid sql injection
adaptor = [aContext adaptor];
attribute = [EOAttribute new];
[attribute autorelease];
[attribute setExternalType: @"varchar"];
safeFolderName = [adaptor formatValue: folderName forAttribute: attribute];
safePath = [adaptor formatValue: path forAttribute: attribute];
paths = [NSMutableArray arrayWithArray: [safePath componentsSeparatedByString: @"/"]];
while ([paths count] < 5)
[paths addObject: @"NULL"];
aContext = [channel adaptorContext];
[aContext beginTransaction];
tableName = [self baseTableNameWithUID: [paths objectAtIndex: 2]];
quickTableName = [tableName stringByAppendingString: @"_quick"];
aclTableName = [tableName stringByAppendingString: @"_acl"];
// TBD: fix SQL injection issues.
// We no longer call stringByDeletingLastPathComponent since, since GNUstep 1.22,
// it'll replace // characters in the URL with /, so mysql:// becomes mysql:/
// This is to conform with recent Apple changes.
baseURL = [folderInfoLocation absoluteString];
range = [baseURL rangeOfString: @"/" options: NSBackwardsSearch];
if (range.location != NSNotFound)
baseURL = [baseURL substringToIndex: range.location];
//Mind the quote, safeFolderName and safePath already have them as they have been escaped, c_path4 already has one at the end
sql = [NSString stringWithFormat: @"INSERT INTO %@"
@" (c_path, c_path1, c_path2, c_path3, c_path4,"
@" c_foldername, c_location, c_quick_location,"
@" c_acl_location, c_folder_type)"
@" VALUES ('%@', '%@', '%@', '%@', '%@', '%@', '%@/%@',"
@" VALUES (%@, '%@', '%@', '%@', '%@, %@, '%@/%@',"
@" '%@/%@', '%@/%@', '%@')",
[self folderInfoTableName], path,
[self folderInfoTableName], safePath,
[paths objectAtIndex: 1], [paths objectAtIndex: 2],
[paths objectAtIndex: 3], [paths objectAtIndex: 4],
[folderName stringByReplacingString: @"'" withString: @"''"],
safeFolderName,
baseURL, tableName,
baseURL, quickTableName,
baseURL, aclTableName,
@@ -1027,6 +1165,12 @@ static BOOL _singleStoreMode = NO;
EOAdaptorChannel *channel;
NSException *ex;
if ((channel = [self acquireOpenChannel]) == nil) {
return [NSException exceptionWithName:@"GCSNoChannel"
reason:@"could not "
userInfo:nil];
}
if ((folder = [self folderAtPath:_path]) == nil) {
return [NSException exceptionWithName:@"GCSMissingFolder"
reason:@"missing folder"
@@ -1039,15 +1183,11 @@ static BOOL _singleStoreMode = NO;
}
ws = [self generateSQLWhereForInternalNames:fnames
exactMatch:YES orDirectSubfolderMatch:NO];
exactMatch:YES orDirectSubfolderMatch:NO withChannel: channel];
sql = [NSString stringWithFormat: @"DELETE FROM %@ WHERE %@",
[self folderInfoTableName], ws];
if ((channel = [self acquireOpenChannel]) == nil) {
return [NSException exceptionWithName:@"GCSNoChannel"
reason:@"could not "
userInfo:nil];
}
[[channel adaptorContext] beginTransaction];
+1 -1
View File
@@ -303,8 +303,8 @@ static NSString *openIdFolderURLString = nil;
newRecord = [NSDictionary dictionaryWithObjectsAndKeys: _user_session, @"c_user_session",
_old_session, @"c_old_session",
[NSNumber numberWithInt:now], @"c_session_started",
_refresh_token, @"c_refresh_token",
[NSNumber numberWithInt:nowExpire] , @"c_access_token_expires_in",
_refresh_token, @"c_refresh_token",
[NSNumber numberWithInt:nowRefreshExpire] , @"c_refresh_token_expires_in",
nil];
record = [self recordForSession: _user_session useOldSession: NO];
+15 -15
View File
@@ -214,11 +214,11 @@
{
static NSString *sqlFolderFormat
= (@"CREATE TABLE %@ ("
@" c_user_session VARCHAR(4096) NOT NULL,"
@" c_old_session VARCHAR(4096) NULL,"
@" c_user_session TEXT NOT NULL,"
@" c_old_session TEXT NULL,"
@" c_session_started INT4 NOT NULL,"
@" c_refresh_token VARCHAR(4096) NULL,"
@" c_access_token_expires_in INT4 NOT NULL,"
@" c_refresh_token TEXT NULL,"
@" c_access_token_expires_in INT4 NULL,"
@" c_refresh_token_expires_in INT4 NULL)");
return [NSString stringWithFormat: sqlFolderFormat, tableName];
@@ -274,7 +274,7 @@
static NSString *sqlFolderFormat
= (@"CREATE TABLE %@ ("
@" c_id VARCHAR(255) PRIMARY KEY,"
@" c_value VARCHAR(4096) NOT NULL,"
@" c_value TEXT NOT NULL,"
@" c_creationdate INT4 NOT NULL,"
@" c_lastseen INT4 NOT NULL)");
@@ -375,11 +375,11 @@
{
static NSString *sqlFolderFormat
= (@"CREATE TABLE %@ ("
@" c_user_session VARCHAR(4096) NOT NULL,"
@" c_old_session VARCHAR(4096) NULL,"
@" c_user_session TEXT NOT NULL,"
@" c_old_session TEXT NULL,"
@" c_session_started INT4 NOT NULL,"
@" c_refresh_token VARCHAR(4096) NULL,"
@" c_access_token_expires_in INT4 NOT NULL,"
@" c_refresh_token TEXT NULL,"
@" c_access_token_expires_in INT4 NULL,"
@" c_refresh_token_expires_in INT4 NULL)");
return [NSString stringWithFormat: sqlFolderFormat, tableName];
@@ -435,7 +435,7 @@
static NSString *sqlFolderFormat
= (@"CREATE TABLE %@ ("
@" c_id VARCHAR(255) PRIMARY KEY,"
@" c_value VARCHAR(4096) NOT NULL,"
@" c_value TEXT NOT NULL,"
@" c_creationdate INT NOT NULL,"
@" c_lastseen INT NOT NULL)");
@@ -536,11 +536,11 @@
{
static NSString *sqlFolderFormat
= (@"CREATE TABLE %@ ("
@" c_user_session VARCHAR2(4096) NOT NULL,"
@" c_old_session VARCHAR2(4096) NULL,"
@" c_user_session VARCHAR2(8192) NOT NULL,"
@" c_old_session VARCHAR2(8192) NULL,"
@" c_session_started INTEGER NOT NULL,"
@" c_refresh_token VARCHAR2(4096) NULL,"
@" c_access_token_expires_in INTEGER NOT NULL,"
@" c_refresh_token VARCHAR2(8192) NULL,"
@" c_access_token_expires_in INTEGER NULL,"
@" c_refresh_token_expires_in INTEGER NULL)");
return [NSString stringWithFormat: sqlFolderFormat, tableName];
@@ -595,7 +595,7 @@
static NSString *sqlFolderFormat
= (@"CREATE TABLE %@ ("
@" c_id VARCHAR2(255) PRIMARY KEY,"
@" c_value VARCHAR2(4096) NOT NULL,"
@" c_value VARCHAR2(8192) NOT NULL,"
@" c_creationdate INTEGER NOT NULL,"
@" c_lastseen INTEGER NOT NULL)");
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:Africa/Abidjan
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:Africa/Abidjan
BEGIN:STANDARD
TZNAME:GMT
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:Africa/Algiers
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:Africa/Algiers
BEGIN:STANDARD
TZNAME:CET
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:Africa/Bissau
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:Africa/Bissau
BEGIN:STANDARD
TZNAME:GMT
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:Africa/Cairo
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:Africa/Cairo
BEGIN:DAYLIGHT
TZNAME:EEST
+1 -1
View File
@@ -4,7 +4,7 @@ VERSION:2.0
BEGIN:VTIMEZONE
TZID:Africa/Casablanca
TZUNTIL:20870511T020001Z
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:Africa/Casablanca
BEGIN:STANDARD
TZNAME:%z
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:Africa/Ceuta
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:Africa/Ceuta
BEGIN:DAYLIGHT
TZNAME:CEST
+1 -1
View File
@@ -4,7 +4,7 @@ VERSION:2.0
BEGIN:VTIMEZONE
TZID:Africa/El_Aaiun
TZUNTIL:20870511T020001Z
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:Africa/El_Aaiun
BEGIN:STANDARD
TZNAME:%z
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:Africa/Johannesburg
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:Africa/Johannesburg
BEGIN:STANDARD
TZNAME:SAST
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:Africa/Juba
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:Africa/Juba
BEGIN:STANDARD
TZNAME:CAT
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:Africa/Khartoum
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:Africa/Khartoum
BEGIN:STANDARD
TZNAME:CAT
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:Africa/Lagos
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:Africa/Lagos
BEGIN:STANDARD
TZNAME:WAT
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:Africa/Maputo
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:Africa/Maputo
BEGIN:STANDARD
TZNAME:CAT
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:Africa/Monrovia
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:Africa/Monrovia
BEGIN:STANDARD
TZNAME:GMT
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:Africa/Nairobi
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:Africa/Nairobi
BEGIN:STANDARD
TZNAME:EAT
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:Africa/Ndjamena
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:Africa/Ndjamena
BEGIN:STANDARD
TZNAME:WAT
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:Africa/Sao_Tome
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:Africa/Sao_Tome
BEGIN:STANDARD
TZNAME:GMT
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:Africa/Tripoli
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:Africa/Tripoli
BEGIN:STANDARD
TZNAME:EET
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:Africa/Tunis
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:Africa/Tunis
BEGIN:STANDARD
TZNAME:CET
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:Africa/Windhoek
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:Africa/Windhoek
BEGIN:STANDARD
TZNAME:CAT
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Adak
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Adak
BEGIN:DAYLIGHT
TZNAME:HDT
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Anchorage
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Anchorage
BEGIN:DAYLIGHT
TZNAME:AKDT
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Araguaina
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Araguaina
BEGIN:STANDARD
TZNAME:%z
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Argentina/Buenos_Aires
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Argentina/Buenos_Aires
BEGIN:STANDARD
TZNAME:%z
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Argentina/Catamarca
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Argentina/Catamarca
BEGIN:STANDARD
TZNAME:%z
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Argentina/Cordoba
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Argentina/Cordoba
BEGIN:STANDARD
TZNAME:%z
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Argentina/Jujuy
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Argentina/Jujuy
BEGIN:STANDARD
TZNAME:%z
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Argentina/La_Rioja
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Argentina/La_Rioja
BEGIN:STANDARD
TZNAME:%z
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Argentina/Mendoza
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Argentina/Mendoza
BEGIN:STANDARD
TZNAME:%z
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Argentina/Rio_Gallegos
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Argentina/Rio_Gallegos
BEGIN:STANDARD
TZNAME:%z
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Argentina/Salta
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Argentina/Salta
BEGIN:STANDARD
TZNAME:%z
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Argentina/San_Juan
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Argentina/San_Juan
BEGIN:STANDARD
TZNAME:%z
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Argentina/San_Luis
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Argentina/San_Luis
BEGIN:STANDARD
TZNAME:%z
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Argentina/Tucuman
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Argentina/Tucuman
BEGIN:STANDARD
TZNAME:%z
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Argentina/Ushuaia
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Argentina/Ushuaia
BEGIN:STANDARD
TZNAME:%z
+3 -11
View File
@@ -3,21 +3,13 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Asuncion
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Asuncion
BEGIN:DAYLIGHT
TZNAME:%z
TZOFFSETFROM:-0400
TZOFFSETTO:-0300
DTSTART:19701004T000000
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU
END:DAYLIGHT
BEGIN:STANDARD
TZNAME:%z
TZOFFSETFROM:-0300
TZOFFSETTO:-0400
DTSTART:19700322T000000
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=4SU
TZOFFSETTO:-0300
DTSTART:19700101T000000
END:STANDARD
END:VTIMEZONE
END:VCALENDAR
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Bahia
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Bahia
BEGIN:STANDARD
TZNAME:%z
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Bahia_Banderas
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Bahia_Banderas
BEGIN:STANDARD
TZNAME:CST
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Barbados
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Barbados
BEGIN:STANDARD
TZNAME:AST
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Belem
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Belem
BEGIN:STANDARD
TZNAME:%z
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Belize
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Belize
BEGIN:STANDARD
TZNAME:CST
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Boa_Vista
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Boa_Vista
BEGIN:STANDARD
TZNAME:%z
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Bogota
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Bogota
BEGIN:STANDARD
TZNAME:%z
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Boise
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Boise
BEGIN:DAYLIGHT
TZNAME:MDT
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Cambridge_Bay
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Cambridge_Bay
BEGIN:DAYLIGHT
TZNAME:MDT
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Campo_Grande
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Campo_Grande
BEGIN:STANDARD
TZNAME:%z
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Cancun
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Cancun
BEGIN:STANDARD
TZNAME:EST
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Caracas
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Caracas
BEGIN:STANDARD
TZNAME:%z
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Cayenne
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Cayenne
BEGIN:STANDARD
TZNAME:%z
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Chicago
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Chicago
BEGIN:DAYLIGHT
TZNAME:CDT
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Chihuahua
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Chihuahua
BEGIN:STANDARD
TZNAME:CST
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Ciudad_Juarez
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Ciudad_Juarez
BEGIN:DAYLIGHT
TZNAME:MDT
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Costa_Rica
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Costa_Rica
BEGIN:STANDARD
TZNAME:CST
@@ -0,0 +1,15 @@
BEGIN:VCALENDAR
PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Coyhaique
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Coyhaique
BEGIN:STANDARD
TZNAME:%z
TZOFFSETFROM:-0300
TZOFFSETTO:-0300
DTSTART:19700101T000000
END:STANDARD
END:VTIMEZONE
END:VCALENDAR
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Cuiaba
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Cuiaba
BEGIN:STANDARD
TZNAME:%z
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Danmarkshavn
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Danmarkshavn
BEGIN:STANDARD
TZNAME:GMT
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Dawson
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Dawson
BEGIN:STANDARD
TZNAME:MST
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Dawson_Creek
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Dawson_Creek
BEGIN:STANDARD
TZNAME:MST
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Denver
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Denver
BEGIN:DAYLIGHT
TZNAME:MDT
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Detroit
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Detroit
BEGIN:DAYLIGHT
TZNAME:EDT
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Edmonton
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Edmonton
BEGIN:DAYLIGHT
TZNAME:MDT
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Eirunepe
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Eirunepe
BEGIN:STANDARD
TZNAME:%z
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/El_Salvador
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/El_Salvador
BEGIN:STANDARD
TZNAME:CST
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Fort_Nelson
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Fort_Nelson
BEGIN:STANDARD
TZNAME:MST
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Fortaleza
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Fortaleza
BEGIN:STANDARD
TZNAME:%z
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Glace_Bay
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Glace_Bay
BEGIN:DAYLIGHT
TZNAME:ADT
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Goose_Bay
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Goose_Bay
BEGIN:STANDARD
TZNAME:AST
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Grand_Turk
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Grand_Turk
BEGIN:STANDARD
TZNAME:EST
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Guatemala
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Guatemala
BEGIN:STANDARD
TZNAME:CST
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Guayaquil
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Guayaquil
BEGIN:STANDARD
TZNAME:%z
+1 -1
View File
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Guyana
LAST-MODIFIED:20241008T100856Z
LAST-MODIFIED:20250324T091428Z
X-LIC-LOCATION:America/Guyana
BEGIN:STANDARD
TZNAME:%z
Loaded 100 of 826 files, more files were not shown because too many files have changed in this diff. Show more