Compare commits

...
236 Commits
Author SHA1 Message Date
Hivert Quentin 55c477b193 fixbis 2025-11-27 16:42:25 +01:00
Hivert Quentin 7513f76be7 fix create folder that already exist 2025-11-27 16:14:47 +01:00
Hivert Quentin 78c6aa5236 test2 2025-11-27 15:27:36 +01:00
Hivert Quentin 1f48a7c95e test 2025-11-27 13:22:56 +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
Hivert Quentin 8904350b71 feat(dev): add devcontainer config to test and dev on sogo 2025-03-13 15:38:48 +01:00
Hivert Quentin c3234882eb feat(openID): second part with a lot of fixes and cleaning 2025-03-13 15:25:56 +01:00
Hivert Quentin 458d39d48a feat(openID): first stable version 2025-03-13 15:24:03 +01:00
Hivert Quentin 5cba10ccff fix(totp): correctly send a string and leading zero 2025-03-07 09:03:41 +01:00
André Rodier b48704e7ff Update SOGoRootPage.wox
Ensure the TOTP input field only accept number, so it is quicker to type on mobile devices.
Disable history of the TOTP input, which is not necessary.

See https://bugs.sogo.nu//view.php?id=5524
2025-03-04 14:10:03 +01:00
Hivert Quentin 69116d8eb7 fix(core): don't show link if SOGoURLCreateAccount is set but empty 2025-02-26 14:20:28 +01:00
Hivert Quentin d15f0ee804 fix(calendar): properly store the vevent is the correct order for reccurence and reccurence-id 2025-02-19 16:14:34 +01:00
Hivert Quentin a1e8a5c4af Revert "fix(calendar): Flatten cycle change: the day at 00:00 is now used to retrieve all occurrences. This change should resolve the issue where resource availability is not detected if the event is shorter than the occurrence duration in the resource."
This reverts commit 9941e2a04b.
2025-02-17 16:49:42 +01:00
y9048a 02dd5c3501 feat(mail) Introduce option SOGoVacationAllowZeroDays to allow a sieve vacation days value of 0 2025-02-11 17:17:58 +01:00
CLSMCSMII 7a7f85d1a7 Update UIxMailPartHTMLViewer.m For Thai charset (windows-874)
Fix bug 0006090: Web mail does not display Thai characters in emails sent from Exchange

As advised by qhivert
2025-02-11 11:20:56 +01:00
Hivert Quentin 6d4016dfdb chore(js/css): update generated files 2025-02-05 01:00:37 -05:00
Hivert Quentin e06a0d2035 chore(htmlViewer): remove space between lines 2025-02-04 15:29:36 +01:00
Hivert Quentin f8ff98b657 fix(htmlViewer): if the the tag img is not a url but a base64 image, keep it in the preview 2025-02-04 15:28:19 +01:00
Hivert Quentin 512f14f6d0 chore(js/css): update generated files 2025-02-04 01:00:39 -05:00
Hivert Quentin 9f4f48a44f feat(calendar): Can defined the Jitsi server url for meeting created 2025-02-03 14:19:02 +01:00
Hivert Quentin 092e7694e0 chore(js/css): update generated files 2025-01-28 01:00:36 -05:00
Hivert Quentin 42c227beca feat(calendar): Can now create Jitsi link when making event 2025-01-27 14:27:09 +01:00
Hivert Quentin c400f45ef1 chore(js/css): update generated files 2025-01-23 01:00:36 -05:00
Hivert Quentin 78655ae127 fix(users): try to always use the user domain in the basDN with %d 2025-01-22 16:16:47 +01:00
Hivert Quentin 29e00f3e9e fix(users): don't look up for users when they change language on root page 2025-01-22 16:16:47 +01:00
Hivert Quentin beb0d9cb1b fix(users): when using multi-domains configuration, only request the apopriate usersources. 2025-01-22 16:16:47 +01:00
Hivert Quentin 5c1278a895 chore(js/css): update generated files 2025-01-18 01:00:37 -05:00
smizrahi 616c9291e0 chore(ckeditor): Update to CKEditor 44.1.0 2025-01-17 10:58:37 +01:00
smizrahi 9941e2a04b fix(calendar): Flatten cycle change: the day at 00:00 is now used to retrieve all occurrences. This change should resolve the issue where resource availability is not detected if the event is shorter than the occurrence duration in the resource. 2025-01-07 18:39:02 +01:00
smizrahi b40d777a86 fix(mail): Fix error when searching string with quote 2024-12-23 15:35:19 +01:00
smizrahi 70f72eb92f fix(mail): Fix ckeditor issue where the font-size disappear after mail sent. Use font-size instead of css class. 2024-12-23 11:18:28 +01:00
881 changed files with 75140 additions and 2171 deletions

No files matched your search

+163
View File
@@ -0,0 +1,163 @@
FROM ubuntu:noble
# The standard user with which vscode-server will be executed
ARG USERNAME=sogo
ARG USER_ID=1000 GROUP_ID=1000
ENV CONTAINER_USERNAME=${USERNAME}
# rename user ubuntu to ${USERNAME}
RUN usermod -l ${CONTAINER_USERNAME} ubuntu && groupmod -n ${CONTAINER_USERNAME} ubuntu
RUN apt-get update && apt-get install -y sudo \
&& usermod -aG sudo ${CONTAINER_USERNAME} \
&& echo ${CONTAINER_USERNAME} ALL=\(ALL\) NOPASSWD:ALL > /etc/sudoers.d/${CONTAINER_USERNAME} \
&& chmod 0440 /etc/sudoers.d/${CONTAINER_USERNAME}
# Ensure sudo group users are not asked for a password
RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/${CONTAINER_USERNAME} && chmod 0440 /etc/sudoers.d/${CONTAINER_USERNAME}
ENV WORKSPACE=/workspace
RUN mkdir -p ${WORKSPACE} && chown -R ${CONTAINER_USERNAME}:${CONTAINER_USERNAME} ${WORKSPACE}
RUN apt-get clean && apt-get update --allow-unauthenticated --allow-insecure-repositories \
&& apt-get install -y --fix-missing git cmake libexpat-dev curl telnet nano
WORKDIR /tmp/build
RUN mkdir -p /src/libwbxml && mkdir -p /tmp/build/libwbxml
RUN git clone https://github.com/libwbxml/libwbxml.git /src/libwbxml/
RUN cmake -B/tmp/build/libwbxml -DCMAKE_INSTALL_PREFIX=$prefix /src/libwbxml && cd /tmp/build/libwbxml && make && make install
# For backward compatibility
WORKDIR ${WORKSPACE}
RUN ln -s /include/libwbxml-1.1 /usr/include/libwbxml-1.0
RUN ln -s /include/libwbxml-1.1 /usr/include/libwbxml
RUN ln -s /include/libwbxml-1.1 /usr/include/libwbxml-1.1
# download, prepare & compile
RUN echo "Download SOPE sources" \
&& git clone https://github.com/Alinto/sope.git /src/SOPE \
&& echo "install required packages" \
&& apt-get update \
&& apt-get upgrade --allow-unauthenticated -qy \
&& DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC apt-get install --allow-unauthenticated -qy --no-install-recommends \
gnustep-make \
gnustep-base-runtime \
libgnustep-base-dev \
pkg-config \
make \
gobjc \
g++ \
gdb gdbserver \
vim \
liblasso3-dev \
python-is-python3 \
libz-dev \
zlib1g-dev \
libpq-dev \
libmysqlclient-dev \
libcurl4-openssl-dev \
libsodium-dev \
libxml2-dev \
libssl-dev \
libldap2-dev \
libzip-dev \
mariadb-client \
postgresql-client \
tmpreaper \
python3-m2crypto \
python3-simplejson \
python3-vobject \
python3-dateutil \
postgresql-server-dev-all \
libmemcached-dev \
libcurl4-openssl-dev \
tzdata \
libytnef0 \
libytnef0-dev \
liboath-dev \
sudo \
lsof \
systemd \
tcpdump \
jq libxml2-utils
RUN echo "compiling sope" \
&& cd /src/SOPE \
&& ./configure --with-gnustep --enable-debug --disable-strip \
&& make \
&& make install
# copy sogo local sources
COPY / /src/SOGo
RUN chown -R ${CONTAINER_USERNAME}:${CONTAINER_USERNAME} /src/SOGo
# install sogo
RUN echo "compiling sogo"
# RUN chmod +x /src/SOGo/configure
WORKDIR /src/SOGo
RUN ./configure --enable-debug --disable-strip --enable-mfa
RUN make
RUN make install
RUN echo "register sogo library"
RUN echo "/usr/local/lib/sogo" > /etc/ld.so.conf.d/sogo.conf
RUN ldconfig
RUN echo "create directories and enforce permissions"
RUN install -o sogo -g sogo -m 755 -d /var/run/sogo
RUN install -o sogo -g sogo -m 750 -d /var/spool/sogo
RUN install -o sogo -g sogo -m 750 -d /var/log/sogo
WORKDIR ${WORKSPACE}
# Copy the binary file into /usr/local/bin
COPY .devcontainer/conf/sogo/compile_sogo.sh /usr/local/bin/compile_sogo.sh
# Set the appropriate permissions
RUN chmod +x /usr/local/bin/compile_sogo.sh
# Install nodejs
RUN curl -sL https://deb.nodesource.com/setup_16.x | bash -
RUN apt install -qy nodejs \
&& npm i -g grunt
# Users
RUN useradd sogo-tests1 && \
useradd sogo-tests2 && \
useradd sogo-tests3 && \
useradd sogo-tests-super
# Tests
RUN npm i -g xunit-viewer
# SOGo
RUN apt-get clean && apt-get install -y --no-install-recommends wget && cd /tmp && \
wget https://raw.githubusercontent.com/Alinto/sogo/master/packaging/debian/sogo.init && \
ln -s /usr/local/sbin/sogod /usr/sbin/sogod && \
mv sogo.init /etc/init.d/sogod && chmod +x /etc/init.d/sogod && \
mkdir /etc/sogo
COPY .devcontainer/conf/sogo/sogo.conf /etc/sogo/
ADD .devcontainer/conf/sogo/sogo.conf /etc/sogo/sogo-base.conf
# Clean
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# Dev env script
ADD .devcontainer/conf/sogo/devenv /usr/sbin/
ADD .devcontainer/conf/sogo/common.sh /include/
RUN chmod +x /usr/sbin/devenv
RUN chmod +x /include/common.sh
# Interface the environment
EXPOSE 50000 50001
# Entrypoint
ADD .devcontainer/conf/sogo/entrypoint.sh /
RUN chmod +x /entrypoint.sh
USER ${CONTAINER_USERNAME}
ENTRYPOINT ["/entrypoint.sh"]
+67
View File
@@ -0,0 +1,67 @@
CREATE USER IF NOT EXISTS 'sogobuild'@'%' IDENTIFIED BY 'sogo123';
GRANT ALL PRIVILEGES ON * . * TO 'sogobuild'@'%';
FLUSH PRIVILEGES;
CREATE DATABASE IF NOT EXISTS sogo;
USE sogo;
-- INSERT INTO
CREATE DATABASE IF NOT EXISTS sogo_integration_tests_auth;
USE sogo_integration_tests_auth;
-- MySQL dump 10.16 Distrib 10.1.48-MariaDB, for debian-linux-gnu (x86_64)
--
-- Host: localhost Database: sogo_integration_tests_auth
-- ------------------------------------------------------
-- Server version 10.1.48-MariaDB-0+deb9u2
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `sogoauth`
--
DROP TABLE IF EXISTS `sogoauth`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `sogoauth` (
`c_uid` varchar(255) NOT NULL,
`c_name` varchar(255) NOT NULL,
`c_password` varchar(255) DEFAULT NULL,
`c_cn` varchar(255) DEFAULT NULL,
`mail` varchar(255) DEFAULT NULL,
`kind` varchar(255) DEFAULT NULL,
`multiplebookings` int(11) DEFAULT NULL,
PRIMARY KEY (`c_uid`),
UNIQUE KEY `c_name` (`c_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `sogoauth`
--
LOCK TABLES `sogoauth` WRITE;
/*!40000 ALTER TABLE `sogoauth` DISABLE KEYS */;
INSERT INTO `sogoauth` VALUES ('res','res','sogo','Resource no overbook','res@example.org','location',1),('res-nolimit','res-nolimit','sogo','Resource can overbook','res-nolimit@example.org','location',0),('sogo-tests-super','sogo-tests-super','sogo','sogo test super','sogo-tests-super@example.org',NULL,NULL),('sogo-tests1','sogo-tests1','sogo','sogo One','sogo-tests1@example.org',NULL,NULL),('sogo-tests2','sogo-tests2','sogo','sogo Two','sogo-tests2@example.org',NULL,NULL),('sogo-tests3','sogo-tests3','sogo','sogo Three','sogo-tests3@example.org',NULL,NULL);
/*!40000 ALTER TABLE `sogoauth` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2023-02-22 4:15:31
+72
View File
@@ -0,0 +1,72 @@
# From https://github.com/dovecot/docker/blob/main/2.3.21.1/
FROM debian:11-slim
LABEL org.opencontainers.image.authors="dovecot@dovecot.org"
ENV container=docker \
LC_ALL=C
ARG DEBIAN_FRONTEND=noninteractive
ADD dovecot.gpg /etc/apt/keyrings/dovecot.gpg
ADD dovecot.list /etc/apt/sources.list.d
RUN apt-get -y update && apt-get -y install \
tini \
dovecot-core \
dovecot-gssapi \
dovecot-imapd \
dovecot-ldap \
dovecot-lmtpd \
dovecot-managesieved \
dovecot-mysql \
dovecot-pgsql \
dovecot-pop3d \
dovecot-sieve \
dovecot-solr \
dovecot-sqlite \
dovecot-submissiond \
ca-certificates \
ssl-cert && \
rm -rf /var/lib/apt/lists && \
groupadd -g 1000 vmail && \
useradd -u 1000 -g 1000 vmail -d /srv/vmail && \
passwd -l vmail && \
rm -rf /etc/dovecot && \
mkdir /srv/mail && \
chown vmail:vmail /srv/mail && \
make-ssl-cert generate-default-snakeoil && \
mkdir /etc/dovecot && \
ln -s /etc/ssl/certs/ssl-cert-snakeoil.pem /etc/dovecot/cert.pem && \
ln -s /etc/ssl/private/ssl-cert-snakeoil.key /etc/dovecot/key.pem
#ADD dovecot.conf /etc/dovecot/dovecot.conf
# Add for SOGo env
RUN apt-get update --allow-insecure-repositories && \
apt-get install --allow-unauthenticated -y dovecot-ldap dovecot-sieve dovecot-managesieved dovecot-lmtpd
RUN chown -R dovecot:dovecot /var/mail
RUN mkdir /var/sieve && \
chmod -R 755 /var/sieve && \
chown -R vmail:vmail /var/sieve
ADD dovecot.conf /etc/dovecot/dovecot.conf
ADD conf.d /etc/dovecot/conf.d
ADD dovecot-ldap.conf.ext /etc/dovecot/dovecot-ldap.conf.ext
# Clean
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# End add for SOGo env
ADD wait-for-it.sh /wait-for-it.sh
EXPOSE 24
EXPOSE 110
EXPOSE 143
EXPOSE 587
EXPOSE 990
EXPOSE 993
EXPOSE 4190
VOLUME ["/etc/dovecot", "/srv/mail"]
ENTRYPOINT ["/usr/bin/tini", "--"]
CMD ["./wait-for-it.sh", "openldap:389", "--", "/usr/sbin/dovecot", "-F"]
@@ -0,0 +1,3 @@
disable_plaintext_auth = no
auth_mechanisms = plain login
!include auth-ldap.conf.ext
@@ -0,0 +1,11 @@
mail_location = maildir:/var/mail/%n
namespace inbox {
inbox = yes
}
mail_privileged_group = mail
protocol !indexer-worker {
}
protocol imap {
mail_plugins = $mail_plugins acl
}
@@ -0,0 +1,88 @@
service imap-login {
inet_listener imap {
#port = 143
}
inet_listener imaps {
#port = 993
#ssl = yes
}
}
service pop3-login {
inet_listener pop3 {
#port = 110
}
inet_listener pop3s {
#port = 995
#ssl = yes
}
}
service submission-login {
inet_listener submission {
#port = 587
}
}
service lmtp {
unix_listener /var/spool/dovecot-lmtp {
mode = 0660
user = root
group = root
}
inet_listener lmtp {
port = 24
}
}
service imap {
# Most of the memory goes to mmap()ing files. You may need to increase this
# limit if you have huge mailboxes.
#vsz_limit = $default_vsz_limit
# Max. number of IMAP processes (connections)
#process_limit = 1024
}
service pop3 {
# Max. number of POP3 processes (connections)
#process_limit = 1024
}
service submission {
# Max. number of SMTP Submission processes (connections)
#process_limit = 1024
}
service auth {
unix_listener auth-userdb {
#mode = 0666
#user =
#group =
}
# Postfix smtp-auth
#unix_listener /var/spool/postfix/private/auth {
# mode = 0666
#}
# Auth process is run as this user.
#user = $default_internal_user
}
service auth-worker {
# Auth worker process is run as root by default, so that it can access
# /etc/shadow. If this isn't necessary, the user should be changed to
# $default_internal_user.
#user = root
}
service dict {
# If dict proxy is used, mail processes should have access to its socket.
# For example: mode=0660, group=vmail and global mail_access_groups=vmail
unix_listener dict {
#mode = 0600
#user =
#group =
}
}
@@ -0,0 +1,5 @@
protocol lmtp {
postmaster_address = postmaster@example.org
# Space separated list of plugins to load (default is global mail_plugins).
mail_plugins = $mail_plugins sieve
}
@@ -0,0 +1,3 @@
plugin {
acl = vfile
}
@@ -0,0 +1,3 @@
plugin {
sieve = file:/var/sieve/%n@example.org;active=/var/sieve/%n@example.org/.dovecot.sieve
}
@@ -0,0 +1,17 @@
passdb {
driver = ldap
# Path for LDAP configuration file, see example-config/dovecot-ldap.conf.ext
args = /etc/dovecot/dovecot-ldap.conf.ext
}
userdb {
driver = ldap
args = /etc/dovecot/dovecot-ldap.conf.ext
# Default fields can be used to specify defaults that LDAP may override
#default_fields = home=/home/virtual/%u
}
mail_gid = 8
@@ -0,0 +1,9 @@
hosts = openldap:389
dn = cn=admin,dc=example,dc=org
dnpass = password
debug_level = -1
auth_bind = yes
ldap_version = 3
base = ou=users,dc=example,dc=org
user_filter = (&(objectClass=posixAccount)(uid=%u))
user_filter = (|(uid=%u)(mail=%u))
+13
View File
@@ -0,0 +1,13 @@
## Dovecot configuration file
!include_try /usr/share/dovecot/protocols.d/*.protocol
!include conf.d/*.conf
protocols = imap lmtp sieve
!include_try local.conf
log_path = /dev/stderr
auth_verbose = yes
auth_debug = yes
mail_debug = yes
mail_plugins = acl
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
deb [signed-by=/etc/apt/keyrings/dovecot.gpg] http://repo.dovecot.org/ce-2.3.21.1/debian/bullseye bullseye main
+182
View File
@@ -0,0 +1,182 @@
#!/usr/bin/env bash
# Use this script to test if a given TCP host/port are available
WAITFORIT_cmdname=${0##*/}
echoerr() { if [[ $WAITFORIT_QUIET -ne 1 ]]; then echo "$@" 1>&2; fi }
usage()
{
cat << USAGE >&2
Usage:
$WAITFORIT_cmdname host:port [-s] [-t timeout] [-- command args]
-h HOST | --host=HOST Host or IP under test
-p PORT | --port=PORT TCP port under test
Alternatively, you specify the host and port as host:port
-s | --strict Only execute subcommand if the test succeeds
-q | --quiet Don't output any status messages
-t TIMEOUT | --timeout=TIMEOUT
Timeout in seconds, zero for no timeout
-- COMMAND ARGS Execute command with args after the test finishes
USAGE
exit 1
}
wait_for()
{
if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
echoerr "$WAITFORIT_cmdname: waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
else
echoerr "$WAITFORIT_cmdname: waiting for $WAITFORIT_HOST:$WAITFORIT_PORT without a timeout"
fi
WAITFORIT_start_ts=$(date +%s)
while :
do
if [[ $WAITFORIT_ISBUSY -eq 1 ]]; then
nc -z $WAITFORIT_HOST $WAITFORIT_PORT
WAITFORIT_result=$?
else
(echo -n > /dev/tcp/$WAITFORIT_HOST/$WAITFORIT_PORT) >/dev/null 2>&1
WAITFORIT_result=$?
fi
if [[ $WAITFORIT_result -eq 0 ]]; then
WAITFORIT_end_ts=$(date +%s)
echoerr "$WAITFORIT_cmdname: $WAITFORIT_HOST:$WAITFORIT_PORT is available after $((WAITFORIT_end_ts - WAITFORIT_start_ts)) seconds"
break
fi
sleep 1
done
return $WAITFORIT_result
}
wait_for_wrapper()
{
# In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692
if [[ $WAITFORIT_QUIET -eq 1 ]]; then
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
else
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
fi
WAITFORIT_PID=$!
trap "kill -INT -$WAITFORIT_PID" INT
wait $WAITFORIT_PID
WAITFORIT_RESULT=$?
if [[ $WAITFORIT_RESULT -ne 0 ]]; then
echoerr "$WAITFORIT_cmdname: timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
fi
return $WAITFORIT_RESULT
}
# process arguments
while [[ $# -gt 0 ]]
do
case "$1" in
*:* )
WAITFORIT_hostport=(${1//:/ })
WAITFORIT_HOST=${WAITFORIT_hostport[0]}
WAITFORIT_PORT=${WAITFORIT_hostport[1]}
shift 1
;;
--child)
WAITFORIT_CHILD=1
shift 1
;;
-q | --quiet)
WAITFORIT_QUIET=1
shift 1
;;
-s | --strict)
WAITFORIT_STRICT=1
shift 1
;;
-h)
WAITFORIT_HOST="$2"
if [[ $WAITFORIT_HOST == "" ]]; then break; fi
shift 2
;;
--host=*)
WAITFORIT_HOST="${1#*=}"
shift 1
;;
-p)
WAITFORIT_PORT="$2"
if [[ $WAITFORIT_PORT == "" ]]; then break; fi
shift 2
;;
--port=*)
WAITFORIT_PORT="${1#*=}"
shift 1
;;
-t)
WAITFORIT_TIMEOUT="$2"
if [[ $WAITFORIT_TIMEOUT == "" ]]; then break; fi
shift 2
;;
--timeout=*)
WAITFORIT_TIMEOUT="${1#*=}"
shift 1
;;
--)
shift
WAITFORIT_CLI=("$@")
break
;;
--help)
usage
;;
*)
echoerr "Unknown argument: $1"
usage
;;
esac
done
if [[ "$WAITFORIT_HOST" == "" || "$WAITFORIT_PORT" == "" ]]; then
echoerr "Error: you need to provide a host and port to test."
usage
fi
WAITFORIT_TIMEOUT=${WAITFORIT_TIMEOUT:-15}
WAITFORIT_STRICT=${WAITFORIT_STRICT:-0}
WAITFORIT_CHILD=${WAITFORIT_CHILD:-0}
WAITFORIT_QUIET=${WAITFORIT_QUIET:-0}
# Check to see if timeout is from busybox?
WAITFORIT_TIMEOUT_PATH=$(type -p timeout)
WAITFORIT_TIMEOUT_PATH=$(realpath $WAITFORIT_TIMEOUT_PATH 2>/dev/null || readlink -f $WAITFORIT_TIMEOUT_PATH)
WAITFORIT_BUSYTIMEFLAG=""
if [[ $WAITFORIT_TIMEOUT_PATH =~ "busybox" ]]; then
WAITFORIT_ISBUSY=1
# Check if busybox timeout uses -t flag
# (recent Alpine versions don't support -t anymore)
if timeout &>/dev/stdout | grep -q -e '-t '; then
WAITFORIT_BUSYTIMEFLAG="-t"
fi
else
WAITFORIT_ISBUSY=0
fi
if [[ $WAITFORIT_CHILD -gt 0 ]]; then
wait_for
WAITFORIT_RESULT=$?
exit $WAITFORIT_RESULT
else
if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
wait_for_wrapper
WAITFORIT_RESULT=$?
else
wait_for
WAITFORIT_RESULT=$?
fi
fi
if [[ $WAITFORIT_CLI != "" ]]; then
if [[ $WAITFORIT_RESULT -ne 0 && $WAITFORIT_STRICT -eq 1 ]]; then
echoerr "$WAITFORIT_cmdname: strict mode, refusing to execute subprocess"
exit $WAITFORIT_RESULT
fi
exec "${WAITFORIT_CLI[@]}"
else
exit $WAITFORIT_RESULT
fi
+277
View File
@@ -0,0 +1,277 @@
BEGIN:VCALENDAR
PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Denver
X-LIC-LOCATION:America/Denver
BEGIN:DAYLIGHT
TZOFFSETFROM:-0700
TZOFFSETTO:-0600
TZNAME:MDT
DTSTART:19700308T020000
RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETFROM:-0600
TZOFFSETTO:-0700
TZNAME:MST
DTSTART:19701101T020000
RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
CREATED:20120117T215905Z
LAST-MODIFIED:20120117T215919Z
DTSTAMP:20120117T215919Z
UID:58f2f5bb-3be9-43d5-998b-088c593dbc85
SUMMARY:New Year's Day
DTSTART;TZID=America/Denver:20120101T081500
DTEND;TZID=America/Denver:20120101T090500
END:VEVENT
BEGIN:VEVENT
CREATED:20120117T215933Z
LAST-MODIFIED:20120117T215941Z
DTSTAMP:20120117T215941Z
UID:7fdfe99e-3485-4af4-8949-2b0c8c829d17
SUMMARY:Epiphany
DTSTART;VALUE=DATE:20120106
DTEND;VALUE=DATE:20120107
END:VEVENT
BEGIN:VEVENT
CREATED:20120117T215959Z
LAST-MODIFIED:20120117T220007Z
DTSTAMP:20120117T220007Z
UID:112cd226-2600-48d3-b5e8-55ab497c7a10
SUMMARY:Groundhog Day
DTSTART;VALUE=DATE:20120202
DTEND;VALUE=DATE:20120203
END:VEVENT
BEGIN:VEVENT
CREATED:20120117T220032Z
LAST-MODIFIED:20120117T220040Z
DTSTAMP:20120117T220040Z
UID:42daa2c5-42e0-4cbc-a614-1284b2f3378b
SUMMARY:Valentine's Day
DTSTART;VALUE=DATE:20120214
DTEND;VALUE=DATE:20120215
END:VEVENT
BEGIN:VEVENT
CREATED:20120117T220145Z
LAST-MODIFIED:20120117T220156Z
DTSTAMP:20120117T220156Z
UID:d35c66b7-cc8f-4fa8-b980-eae06732a679
SUMMARY:St. Patrick's Day
DTSTART;VALUE=DATE:20120317
DTEND;VALUE=DATE:20120318
END:VEVENT
BEGIN:VEVENT
CREATED:20120117T220208Z
LAST-MODIFIED:20120117T220215Z
DTSTAMP:20120117T220215Z
UID:15440c4b-f459-4599-9d92-5906555eb6d1
SUMMARY:Good Friday
DTSTART;VALUE=DATE:20120406
DTEND;VALUE=DATE:20120407
END:VEVENT
BEGIN:VEVENT
CREATED:20120117T220225Z
LAST-MODIFIED:20120117T220232Z
DTSTAMP:20120117T220232Z
UID:00c93d5e-4c1a-45b0-a4f5-3a60b4ba865b
SUMMARY:Easter Sunday
DTSTART;VALUE=DATE:20120408
DTEND;VALUE=DATE:20120409
END:VEVENT
BEGIN:VEVENT
CREATED:20120117T220244Z
LAST-MODIFIED:20120117T220251Z
DTSTAMP:20120117T220251Z
UID:8443f87e-ccc7-4bbc-bdc2-8244f459638f
SUMMARY:Vimy Ridge Day
DTSTART;VALUE=DATE:20120409
DTEND;VALUE=DATE:20120410
END:VEVENT
BEGIN:VEVENT
CREATED:20120117T220301Z
LAST-MODIFIED:20120117T220307Z
DTSTAMP:20120117T220307Z
UID:3b2035b3-1b4c-4f08-8a38-5ab3d57ef4bb
SUMMARY:Easter Monday
DTSTART;VALUE=DATE:20120409
DTEND;VALUE=DATE:20120410
END:VEVENT
BEGIN:VEVENT
CREATED:20120117T220407Z
LAST-MODIFIED:20120117T220411Z
DTSTAMP:20120117T220411Z
UID:dc725c0c-587a-4f7d-997f-521478528973
SUMMARY:Canada Day
DTSTART;VALUE=DATE:20120701
DTEND;VALUE=DATE:20120702
END:VEVENT
BEGIN:VEVENT
CREATED:20120117T220615Z
LAST-MODIFIED:20120117T220622Z
DTSTAMP:20120117T220622Z
UID:5663c847-3a29-492b-aeab-1d009852ad67
SUMMARY:Halloween
DTSTART;VALUE=DATE:20121031
DTEND;VALUE=DATE:20121101
END:VEVENT
BEGIN:VEVENT
CREATED:20120117T220859Z
LAST-MODIFIED:20120117T220905Z
DTSTAMP:20120117T220905Z
UID:ab6e8de1-e4cd-46c2-a031-5e030d7d56d2
SUMMARY:Christmas Eve
DTSTART;VALUE=DATE:20121224
DTEND;VALUE=DATE:20121225
END:VEVENT
BEGIN:VEVENT
CREATED:20120117T220911Z
LAST-MODIFIED:20120117T220917Z
DTSTAMP:20120117T220917Z
UID:6a7de4c3-bb70-477c-91b8-5d780c19d4ca
SUMMARY:Christmas
DTSTART;VALUE=DATE:20121225
DTEND;VALUE=DATE:20121226
END:VEVENT
BEGIN:VEVENT
CREATED:20120117T220920Z
LAST-MODIFIED:20120117T220943Z
DTSTAMP:20120117T220943Z
UID:4913c6ab-5332-4094-811a-f6060616fda3
SUMMARY:Boxing Day (Most regions)
DTSTART;VALUE=DATE:20121226
DTEND;VALUE=DATE:20121227
X-MOZ-GENERATION:1
END:VEVENT
BEGIN:VEVENT
CREATED:20120117T220956Z
LAST-MODIFIED:20120117T221003Z
DTSTAMP:20120117T221003Z
UID:43bc10df-bd29-4f2b-aa0f-c6cc8cf3839f
SUMMARY:New Year's Eve
DTSTART;VALUE=DATE:20121231
DTEND;VALUE=DATE:20130101
END:VEVENT
BEGIN:VEVENT
CREATED:20120117T221726Z
LAST-MODIFIED:20120117T221734Z
DTSTAMP:20120117T221734Z
UID:a51d1d54-72c6-4fe7-8080-bb78b3ab0c09
SUMMARY:New Year's Day
DTSTART;VALUE=DATE:20120101
DTEND;VALUE=DATE:20120102
END:VEVENT
BEGIN:VEVENT
CREATED:20120117T220055Z
LAST-MODIFIED:20120117T221850Z
DTSTAMP:20120117T221850Z
UID:31cc39a6-9b41-4a5f-9fd2-f5c43ad686fb
SUMMARY:Family Day (AB\, ON\, SK)
DTSTART;VALUE=DATE:20120220
DTEND;VALUE=DATE:20120221
X-MOZ-GENERATION:1
END:VEVENT
BEGIN:VEVENT
CREATED:20120117T220125Z
LAST-MODIFIED:20120117T221906Z
DTSTAMP:20120117T221906Z
UID:4370e2c8-0863-456c-b1d0-e64ec8a06ef1
SUMMARY:Commonwealth Day
DTSTART;VALUE=DATE:20120312
DTEND;VALUE=DATE:20120313
X-MOZ-GENERATION:1
END:VEVENT
BEGIN:VEVENT
CREATED:20120117T220321Z
LAST-MODIFIED:20120117T221951Z
DTSTAMP:20120117T221951Z
UID:722dc2f8-c0c8-457b-902c-30e94aee23bb
SUMMARY:Victoria Day (Most regions)
DTSTART;VALUE=DATE:20120521
DTEND;VALUE=DATE:20120522
X-MOZ-GENERATION:1
END:VEVENT
BEGIN:VEVENT
CREATED:20120117T220346Z
LAST-MODIFIED:20120117T222004Z
DTSTAMP:20120117T222004Z
UID:f782fb4f-7d96-425c-ae58-839d0f8a9283
SUMMARY:National Aboriginal Day
DTSTART;VALUE=DATE:20120621
DTEND;VALUE=DATE:20120622
X-MOZ-GENERATION:1
END:VEVENT
BEGIN:VEVENT
CREATED:20120117T220419Z
LAST-MODIFIED:20120117T222100Z
DTSTAMP:20120117T222100Z
UID:e9a8bda0-2fa1-4cdf-94e1-5eb5467869ff
SUMMARY:Canada Day - statutory holiday
DTSTART;VALUE=DATE:20120702
DTEND;VALUE=DATE:20120703
X-MOZ-GENERATION:1
END:VEVENT
BEGIN:VEVENT
CREATED:20120117T220450Z
LAST-MODIFIED:20120117T222123Z
DTSTAMP:20120117T222123Z
UID:074e1958-329b-45b8-b918-3d6807c9deb4
SUMMARY:Civic/Provincial Day (Many regions)
DTSTART;VALUE=DATE:20120806
DTEND;VALUE=DATE:20120807
X-MOZ-GENERATION:1
END:VEVENT
BEGIN:VEVENT
CREATED:20120117T220527Z
LAST-MODIFIED:20120117T222135Z
DTSTAMP:20120117T222135Z
UID:e2bc628c-79da-4f09-bfbb-b1d1ea9ca79f
SUMMARY:Labour Day (All)
DTSTART;VALUE=DATE:20120903
DTEND;VALUE=DATE:20120904
X-MOZ-GENERATION:1
END:VEVENT
BEGIN:VEVENT
CREATED:20120117T220553Z
LAST-MODIFIED:20120117T222145Z
DTSTAMP:20120117T222145Z
UID:ed33f08c-fcb1-44ee-9173-1bd7051093fb
SUMMARY:Thanksgiving Day (All)
DTSTART;VALUE=DATE:20121008
DTEND;VALUE=DATE:20121009
X-MOZ-GENERATION:1
END:VEVENT
BEGIN:VEVENT
CREATED:20120117T220635Z
LAST-MODIFIED:20120117T222159Z
DTSTAMP:20120117T222159Z
UID:27bff647-69a4-4be8-9647-6dd1ad3b4d60
SUMMARY:Remembrance Day (Most regions)
DTSTART;VALUE=DATE:20121111
DTEND;VALUE=DATE:20121112
X-MOZ-GENERATION:2
END:VEVENT
BEGIN:VEVENT
CREATED:20120117T220727Z
LAST-MODIFIED:20120117T222205Z
DTSTAMP:20120117T222205Z
UID:487d87a7-618f-4f07-bba2-9f472be8c836
SUMMARY:Remembrance Day observed (Many regions)
DTSTART;VALUE=DATE:20121112
DTEND;VALUE=DATE:20121113
X-MOZ-GENERATION:1
END:VEVENT
BEGIN:VEVENT
CREATED:20120117T220816Z
LAST-MODIFIED:20120117T222220Z
DTSTAMP:20120117T222220Z
UID:696de927-4e80-4d07-a283-550f51ec324e
SUMMARY:Anniversary of the Statute of Westminster
DTSTART;VALUE=DATE:20121211
DTEND;VALUE=DATE:20121212
X-MOZ-GENERATION:1
END:VEVENT
END:VCALENDAR
+3
View File
@@ -0,0 +1,3 @@
FROM httpd:2.4
ADD httpd.conf /usr/local/apache2/conf/httpd.conf
+772
View File
@@ -0,0 +1,772 @@
#
# This is the main Apache HTTP server configuration file. It contains the
# configuration directives that give the server its instructions.
# See <URL:http://httpd.apache.org/docs/2.4/> for detailed information.
# In particular, see
# <URL:http://httpd.apache.org/docs/2.4/mod/directives.html>
# for a discussion of each configuration directive.
#
# Do NOT simply read the instructions in here without understanding
# what they do. They're here only as hints or reminders. If you are unsure
# consult the online docs. You have been warned.
#
# Configuration and logfile names: If the filenames you specify for many
# of the server's control files begin with "/" (or "drive:/" for Win32), the
# server will use that explicit path. If the filenames do *not* begin
# with "/", the value of ServerRoot is prepended -- so "logs/access_log"
# with ServerRoot set to "/usr/local/apache2" will be interpreted by the
# server as "/usr/local/apache2/logs/access_log", whereas "/logs/access_log"
# will be interpreted as '/logs/access_log'.
#
# ServerRoot: The top of the directory tree under which the server's
# configuration, error, and log files are kept.
#
# Do not add a slash at the end of the directory path. If you point
# ServerRoot at a non-local disk, be sure to specify a local disk on the
# Mutex directive, if file-based mutexes are used. If you wish to share the
# same ServerRoot for multiple httpd daemons, you will need to change at
# least PidFile.
#
ServerRoot "/usr/local/apache2"
#
# Mutex: Allows you to set the mutex mechanism and mutex file directory
# for individual mutexes, or change the global defaults
#
# Uncomment and change the directory if mutexes are file-based and the default
# mutex file directory is not on a local disk or is not appropriate for some
# other reason.
#
# Mutex default:logs
#
# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, instead of the default. See also the <VirtualHost>
# directive.
#
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
Listen 80
Listen 81
Listen 443
#
# Dynamic Shared Object (DSO) Support
#
# To be able to use the functionality of a module which was built as a DSO you
# have to place corresponding `LoadModule' lines at this location so the
# directives contained in it are actually available _before_ they are used.
# Statically compiled modules (those listed by `httpd -l') do not need
# to be loaded here.
#
# Example:
# LoadModule foo_module modules/mod_foo.so
#
LoadModule mpm_event_module modules/mod_mpm_event.so
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
LoadModule authn_file_module modules/mod_authn_file.so
#LoadModule authn_dbm_module modules/mod_authn_dbm.so
#LoadModule authn_anon_module modules/mod_authn_anon.so
#LoadModule authn_dbd_module modules/mod_authn_dbd.so
#LoadModule authn_socache_module modules/mod_authn_socache.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_user_module modules/mod_authz_user.so
#LoadModule authz_dbm_module modules/mod_authz_dbm.so
#LoadModule authz_owner_module modules/mod_authz_owner.so
#LoadModule authz_dbd_module modules/mod_authz_dbd.so
LoadModule authz_core_module modules/mod_authz_core.so
#LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
#LoadModule authnz_fcgi_module modules/mod_authnz_fcgi.so
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule auth_basic_module modules/mod_auth_basic.so
#LoadModule auth_form_module modules/mod_auth_form.so
#LoadModule auth_digest_module modules/mod_auth_digest.so
#LoadModule allowmethods_module modules/mod_allowmethods.so
#LoadModule isapi_module modules/mod_isapi.so
#LoadModule file_cache_module modules/mod_file_cache.so
#LoadModule cache_module modules/mod_cache.so
#LoadModule cache_disk_module modules/mod_cache_disk.so
#LoadModule cache_socache_module modules/mod_cache_socache.so
#LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
#LoadModule socache_dbm_module modules/mod_socache_dbm.so
#LoadModule socache_memcache_module modules/mod_socache_memcache.so
#LoadModule socache_redis_module modules/mod_socache_redis.so
#LoadModule watchdog_module modules/mod_watchdog.so
#LoadModule macro_module modules/mod_macro.so
#LoadModule dbd_module modules/mod_dbd.so
#LoadModule bucketeer_module modules/mod_bucketeer.so
#LoadModule dumpio_module modules/mod_dumpio.so
#LoadModule echo_module modules/mod_echo.so
#LoadModule example_hooks_module modules/mod_example_hooks.so
#LoadModule case_filter_module modules/mod_case_filter.so
#LoadModule case_filter_in_module modules/mod_case_filter_in.so
#LoadModule example_ipc_module modules/mod_example_ipc.so
#LoadModule buffer_module modules/mod_buffer.so
#LoadModule data_module modules/mod_data.so
#LoadModule ratelimit_module modules/mod_ratelimit.so
LoadModule reqtimeout_module modules/mod_reqtimeout.so
#LoadModule ext_filter_module modules/mod_ext_filter.so
#LoadModule request_module modules/mod_request.so
#LoadModule include_module modules/mod_include.so
LoadModule filter_module modules/mod_filter.so
#LoadModule reflector_module modules/mod_reflector.so
#LoadModule substitute_module modules/mod_substitute.so
#LoadModule sed_module modules/mod_sed.so
#LoadModule charset_lite_module modules/mod_charset_lite.so
#LoadModule deflate_module modules/mod_deflate.so
#LoadModule xml2enc_module modules/mod_xml2enc.so
#LoadModule proxy_html_module modules/mod_proxy_html.so
#LoadModule brotli_module modules/mod_brotli.so
LoadModule mime_module modules/mod_mime.so
#LoadModule ldap_module modules/mod_ldap.so
LoadModule log_config_module modules/mod_log_config.so
#LoadModule log_debug_module modules/mod_log_debug.so
#LoadModule log_forensic_module modules/mod_log_forensic.so
#LoadModule logio_module modules/mod_logio.so
#LoadModule lua_module modules/mod_lua.so
LoadModule env_module modules/mod_env.so
#LoadModule mime_magic_module modules/mod_mime_magic.so
#LoadModule cern_meta_module modules/mod_cern_meta.so
#LoadModule expires_module modules/mod_expires.so
LoadModule headers_module modules/mod_headers.so
#LoadModule ident_module modules/mod_ident.so
#LoadModule usertrack_module modules/mod_usertrack.so
#LoadModule unique_id_module modules/mod_unique_id.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule version_module modules/mod_version.so
#LoadModule remoteip_module modules/mod_remoteip.so
LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_connect_module modules/mod_proxy_connect.so
#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
#LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
#LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
#LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so
#LoadModule proxy_fdpass_module modules/mod_proxy_fdpass.so
#LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
#LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
#LoadModule proxy_express_module modules/mod_proxy_express.so
#LoadModule proxy_hcheck_module modules/mod_proxy_hcheck.so
#LoadModule session_module modules/mod_session.so
#LoadModule session_cookie_module modules/mod_session_cookie.so
#LoadModule session_crypto_module modules/mod_session_crypto.so
#LoadModule session_dbd_module modules/mod_session_dbd.so
#LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
#LoadModule slotmem_plain_module modules/mod_slotmem_plain.so
LoadModule ssl_module modules/mod_ssl.so
#LoadModule optional_hook_export_module modules/mod_optional_hook_export.so
#LoadModule optional_hook_import_module modules/mod_optional_hook_import.so
#LoadModule optional_fn_import_module modules/mod_optional_fn_import.so
#LoadModule optional_fn_export_module modules/mod_optional_fn_export.so
#LoadModule dialup_module modules/mod_dialup.so
#LoadModule http2_module modules/mod_http2.so
#LoadModule proxy_http2_module modules/mod_proxy_http2.so
#LoadModule md_module modules/mod_md.so
#LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
#LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
#LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
#LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so
LoadModule unixd_module modules/mod_unixd.so
#LoadModule heartbeat_module modules/mod_heartbeat.so
#LoadModule heartmonitor_module modules/mod_heartmonitor.so
#LoadModule dav_module modules/mod_dav.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
#LoadModule asis_module modules/mod_asis.so
#LoadModule info_module modules/mod_info.so
#LoadModule suexec_module modules/mod_suexec.so
<IfModule !mpm_prefork_module>
#LoadModule cgid_module modules/mod_cgid.so
</IfModule>
<IfModule mpm_prefork_module>
#LoadModule cgi_module modules/mod_cgi.so
</IfModule>
#LoadModule dav_fs_module modules/mod_dav_fs.so
#LoadModule dav_lock_module modules/mod_dav_lock.so
#LoadModule vhost_alias_module modules/mod_vhost_alias.so
#LoadModule negotiation_module modules/mod_negotiation.so
LoadModule dir_module modules/mod_dir.so
#LoadModule imagemap_module modules/mod_imagemap.so
#LoadModule actions_module modules/mod_actions.so
#LoadModule speling_module modules/mod_speling.so
#LoadModule userdir_module modules/mod_userdir.so
LoadModule alias_module modules/mod_alias.so
LoadModule rewrite_module modules/mod_rewrite.so
<IfModule unixd_module>
#
# If you wish httpd to run as a different user or group, you must run
# httpd as root initially and it will switch.
#
# User/Group: The name (or #number) of the user/group to run httpd as.
# It is usually good practice to create a dedicated user and group for
# running httpd, as with most system services.
#
User www-data
Group www-data
</IfModule>
# 'Main' server configuration
#
# The directives in this section set up the values used by the 'main'
# server, which responds to any requests that aren't handled by a
# <VirtualHost> definition. These values also provide defaults for
# any <VirtualHost> containers you may define later in the file.
#
# All of these directives may appear inside <VirtualHost> containers,
# in which case these default settings will be overridden for the
# virtual host being defined.
#
#
# ServerAdmin: Your address, where problems with the server should be
# e-mailed. This address appears on some server-generated pages, such
# as error documents. e.g. admin@your-domain.com
#
ServerAdmin you@example.com
#
# ServerName gives the name and port that the server uses to identify itself.
# This can often be determined automatically, but we recommend you specify
# it explicitly to prevent problems during startup.
#
# If your host doesn't have a registered DNS name, enter its IP address here.
#
#ServerName www.example.com:80
#
# Deny access to the entirety of your server's filesystem. You must
# explicitly permit access to web content directories in other
# <Directory> blocks below.
#
<Directory />
AllowOverride none
Require all granted
</Directory>
#
# Note that from this point forward you must specifically allow
# particular features to be enabled - so if something's not working as
# you might expect, make sure that you have specifically enabled it
# below.
#
#
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "/usr/local/apache2/htdocs"
<Directory "/usr/local/apache2/htdocs">
#
# Possible values for the Options directive are "None", "All",
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
# The Options directive is both complicated and important. Please see
# http://httpd.apache.org/docs/2.4/mod/core.html#options
# for more information.
#
Options Indexes FollowSymLinks
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# AllowOverride FileInfo AuthConfig Limit
#
AllowOverride None
#
# Controls who can get stuff from this server.
#
Require all granted
</Directory>
#
# DirectoryIndex: sets the file that Apache will serve if a directory
# is requested.
#
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
#
# The following lines prevent .htaccess and .htpasswd files from being
# viewed by Web clients.
#
<Files ".ht*">
Require all denied
</Files>
#
# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a <VirtualHost>
# container, error messages relating to that virtual host will be
# logged here. If you *do* define an error logfile for a <VirtualHost>
# container, that host's errors will be logged there and not here.
#
ErrorLog /proc/self/fd/2
#
# LogLevel: Control the number of messages logged to the error_log.
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
#
LogLevel warn
<IfModule log_config_module>
#
# The following directives define some format nicknames for use with
# a CustomLog directive (see below).
#
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
# You need to enable mod_logio.c to use %I and %O
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
#
# The location and format of the access logfile (Common Logfile Format).
# If you do not define any access logfiles within a <VirtualHost>
# container, they will be logged here. Contrariwise, if you *do*
# define per-<VirtualHost> access logfiles, transactions will be
# logged therein and *not* in this file.
#
CustomLog /proc/self/fd/1 common
#
# If you prefer a logfile with access, agent, and referer information
# (Combined Logfile Format) you can use the following directive.
#
#CustomLog "logs/access_log" combined
</IfModule>
<IfModule alias_module>
#
# Redirect: Allows you to tell clients about documents that used to
# exist in your server's namespace, but do not anymore. The client
# will make a new request for the document at its new location.
# Example:
# Redirect permanent /foo http://www.example.com/bar
#
# Alias: Maps web paths into filesystem paths and is used to
# access content that does not live under the DocumentRoot.
# Example:
# Alias /webpath /full/filesystem/path
#
# If you include a trailing / on /webpath then the server will
# require it to be present in the URL. You will also likely
# need to provide a <Directory> section to allow access to
# the filesystem path.
#
# ScriptAlias: This controls which directories contain server scripts.
# ScriptAliases are essentially the same as Aliases, except that
# documents in the target directory are treated as applications and
# run by the server when requested rather than as documents sent to the
# client. The same rules about trailing "/" apply to ScriptAlias
# directives as to Alias.
#
ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"
</IfModule>
<IfModule cgid_module>
#
# ScriptSock: On threaded servers, designate the path to the UNIX
# socket used to communicate with the CGI daemon of mod_cgid.
#
#Scriptsock cgisock
</IfModule>
#
# "/usr/local/apache2/cgi-bin" should be changed to whatever your ScriptAliased
# CGI directory exists, if you have that configured.
#
<Directory "/usr/local/apache2/cgi-bin">
AllowOverride None
Options None
Require all granted
</Directory>
<IfModule headers_module>
#
# Avoid passing HTTP_PROXY environment to CGI's on this or any proxied
# backend servers which have lingering "httpoxy" defects.
# 'Proxy' request header is undefined by the IETF, not listed by IANA
#
RequestHeader unset Proxy early
</IfModule>
<IfModule mime_module>
#
# TypesConfig points to the file containing the list of mappings from
# filename extension to MIME-type.
#
TypesConfig conf/mime.types
#
# AddType allows you to add to or override the MIME configuration
# file specified in TypesConfig for specific file types.
#
#AddType application/x-gzip .tgz
#
# AddEncoding allows you to have certain browsers uncompress
# information on the fly. Note: Not all browsers support this.
#
#AddEncoding x-compress .Z
#AddEncoding x-gzip .gz .tgz
#
# If the AddEncoding directives above are commented-out, then you
# probably should define those extensions to indicate media types:
#
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
#
# AddHandler allows you to map certain file extensions to "handlers":
# actions unrelated to filetype. These can be either built into the server
# or added with the Action directive (see below)
#
# To use CGI scripts outside of ScriptAliased directories:
# (You will also need to add "ExecCGI" to the "Options" directive.)
#
#AddHandler cgi-script .cgi
# For type maps (negotiated resources):
#AddHandler type-map var
#
# Filters allow you to process content before it is sent to the client.
#
# To parse .shtml files for server-side includes (SSI):
# (You will also need to add "Includes" to the "Options" directive.)
#
#AddType text/html .shtml
#AddOutputFilter INCLUDES .shtml
</IfModule>
#
# The mod_mime_magic module allows the server to use various hints from the
# contents of the file itself to determine its type. The MIMEMagicFile
# directive tells the module where the hint definitions are located.
#
#MIMEMagicFile conf/magic
#
# Customizable error responses come in three flavors:
# 1) plain text 2) local redirects 3) external redirects
#
# Some examples:
#ErrorDocument 500 "The server made a boo boo."
#ErrorDocument 404 /missing.html
#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
#ErrorDocument 402 http://www.example.com/subscription_info.html
#
#
# MaxRanges: Maximum number of Ranges in a request before
# returning the entire resource, or one of the special
# values 'default', 'none' or 'unlimited'.
# Default setting is to accept 200 Ranges.
#MaxRanges unlimited
#
# EnableMMAP and EnableSendfile: On systems that support it,
# memory-mapping or the sendfile syscall may be used to deliver
# files. This usually improves server performance, but must
# be turned off when serving from networked-mounted
# filesystems or if support for these functions is otherwise
# broken on your system.
# Defaults: EnableMMAP On, EnableSendfile Off
#
#EnableMMAP off
#EnableSendfile on
# Supplemental configuration
#
# The configuration files in the conf/extra/ directory can be
# included to add extra features or to modify the default configuration of
# the server, or you may simply copy their contents here and change as
# necessary.
# Server-pool management (MPM specific)
#Include conf/extra/httpd-mpm.conf
# Multi-language error messages
#Include conf/extra/httpd-multilang-errordoc.conf
# Fancy directory listings
#Include conf/extra/httpd-autoindex.conf
# Language settings
#Include conf/extra/httpd-languages.conf
# User home directories
#Include conf/extra/httpd-userdir.conf
# Real-time info on requests and configuration
#Include conf/extra/httpd-info.conf
# Virtual hosts
#Include conf/extra/httpd-vhosts.conf
# Local access to the Apache HTTP Server Manual
#Include conf/extra/httpd-manual.conf
# Distributed authoring and versioning (WebDAV)
#Include conf/extra/httpd-dav.conf
# Various default settings
#Include conf/extra/httpd-default.conf
# Configure mod_proxy_html to understand HTML4/XHTML1
<IfModule proxy_html_module>
Include conf/extra/proxy-html.conf
</IfModule>
# Secure (SSL/TLS) connections
#Include conf/extra/httpd-ssl.conf
#
# Note: The following must must be present to support
# starting without SSL on platforms with no /dev/random equivalent
# but a statically compiled-in mod_ssl.
#
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>
###########################
#
# SOGo HTTP
#
###########################
<VirtualHost *:80>
ServerAdmin support@sogo.nu
ServerName dev.sogo
Alias /SOGo.woa/WebServerResources/ /usr/local/lib/GNUstep/SOGo/WebServerResources/
Alias /SOGo/WebServerResources/ /usr/local/lib/GNUstep/SOGo/WebServerResources/
<Directory /usr/lib/GNUstep/SOGo/>
<IfVersion < 2.4>
Order deny,allow
Allow from all
</IfVersion>
<IfVersion >= 2.4>
Require all granted
</IfVersion>
# Explicitly allow caching of static content to avoid browser specific behavior.
# A resource's URL MUST change in order to have the client load the new version.
<IfModule expires_module>
ExpiresActive On
ExpiresDefault "access plus 1 year"
</IfModule>
</Directory>
CustomLog /tmp/sogo.log combined
ProxyRequests Off
SetEnv proxy-nokeepalive 1
ProxyPreserveHost On
ProxyPass /SOGo http://sogo:50000/SOGo retry=0
ProxyPass /Microsoft-Server-ActiveSync http://sogo:50000/SOGo/Microsoft-Server-ActiveSync retry=0 connectiontimeout=5 timeout=3600
ProxyPass /keycloak http://keycloak:8080/keycloak retry=0
ProxyPassReverse /keycloak http://keycloak:8080/keycloak
<Proxy http://sogo:50000/SOGo>
## adjust the following to your configuration
RequestHeader set "x-webobjects-server-port" "80"
RequestHeader set "x-webobjects-server-name" "127.0.0.1"
RequestHeader set "x-webobjects-server-url" "http://127.0.0.1"
RequestHeader set "x-webobjects-server-protocol" "HTTP/1.0"
RequestHeader set "x-webobjects-remote-host" "127.0.0.1"
AddDefaultCharset UTF-8
Order allow,deny
Allow from all
</Proxy>
RewriteEngine On
RewriteRule ^/SOGo/(.*)$ /SOGo/$1 [env=REMOTE_HOST:%{REMOTE_ADDR},PT]
# For Apple autoconfiguration
<IfModule rewrite_module>
RewriteEngine On
RewriteRule ^/.well-known/caldav/?$ /SOGo/dav [R=301]
RewriteRule ^/.well-known/carddav/?$ /SOGo/dav [R=301]
</IfModule>
<Directory /src/SOGo/Tests/results>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
Alias /tests /src/SOGo/Tests/results
</VirtualHost>
###########################
#
# SOGo HTTP (for tests)
#
###########################
<VirtualHost *:81>
ServerAdmin support@sogo.nu
ServerName dev.sogo
Alias /SOGo.woa/WebServerResources/ /usr/local/lib/GNUstep/SOGo/WebServerResources/
Alias /SOGo/WebServerResources/ /usr/local/lib/GNUstep/SOGo/WebServerResources/
<Directory /usr/lib/GNUstep/SOGo/>
<IfVersion < 2.4>
Order deny,allow
Allow from all
</IfVersion>
<IfVersion >= 2.4>
Require all granted
</IfVersion>
# Explicitly allow caching of static content to avoid browser specific behavior.
# A resource's URL MUST change in order to have the client load the new version.
<IfModule expires_module>
ExpiresActive On
ExpiresDefault "access plus 1 year"
</IfModule>
</Directory>
CustomLog /tmp/sogo.log combined
ProxyRequests Off
SetEnv proxy-nokeepalive 1
ProxyPreserveHost On
ProxyPass /SOGo http://sogo:50000/SOGo retry=0
ProxyPass /Microsoft-Server-ActiveSync http://sogo:50000/SOGo/Microsoft-Server-ActiveSync retry=0 connectiontimeout=5 timeout=3600
<Proxy http://sogo:50000/SOGo>
## adjust the following to your configuration
RequestHeader set "x-webobjects-server-port" "81"
RequestHeader set "x-webobjects-server-name" "httpd"
RequestHeader set "x-webobjects-server-url" "http://httpd"
RequestHeader set "x-webobjects-server-protocol" "HTTP/1.0"
RequestHeader set "x-webobjects-remote-host" "httpd"
AddDefaultCharset UTF-8
Order allow,deny
Allow from all
</Proxy>
RewriteEngine On
RewriteRule ^/SOGo/(.*)$ /SOGo/$1 [env=REMOTE_HOST:%{REMOTE_ADDR},PT]
# For Apple autoconfiguration
<IfModule rewrite_module>
RewriteEngine On
RewriteRule ^/.well-known/caldav/?$ /SOGo/dav [R=301]
RewriteRule ^/.well-known/carddav/?$ /SOGo/dav [R=301]
</IfModule>
</VirtualHost>
###########################
#
# SOGo HTTPS
#
###########################
<VirtualHost *:443>
ServerAdmin support@sogo.nu
ServerName dev.sogo
Alias /SOGo.woa/WebServerResources/ /usr/local/lib/GNUstep/SOGo/WebServerResources/
Alias /SOGo/WebServerResources/ /usr/local/lib/GNUstep/SOGo/WebServerResources/
SSLEngine on
SSLCertificateFile /ssl/apache-selfsigned.crt
SSLCertificateKeyFile /ssl/apache-selfsigned.key
<Directory /usr/lib/GNUstep/SOGo/>
<IfVersion < 2.4>
Order deny,allow
Allow from all
</IfVersion>
<IfVersion >= 2.4>
Require all granted
</IfVersion>
# Explicitly allow caching of static content to avoid browser specific behavior.
# A resource's URL MUST change in order to have the client load the new version.
<IfModule expires_module>
ExpiresActive On
ExpiresDefault "access plus 1 year"
</IfModule>
</Directory>
CustomLog /tmp/sogo.log combined
ProxyRequests Off
SetEnv proxy-nokeepalive 1
ProxyPreserveHost On
ProxyPass /SOGo http://sogo:50000/SOGo retry=0
ProxyPass /Microsoft-Server-ActiveSync http://sogo:50000/SOGo/Microsoft-Server-ActiveSync retry=0 connectiontimeout=5 timeout=3600
ProxyPass /keycloak http://keycloak:8080/keycloak retry=0
ProxyPassReverse /keycloak http://keycloak:8080/keycloak
<Proxy http://sogo:50000/SOGo>
## adjust the following to your configuration
RequestHeader set "x-webobjects-server-port" "443"
RequestHeader set "x-webobjects-server-name" "127.0.0.1"
RequestHeader set "x-webobjects-server-url" "https://127.0.0.1"
RequestHeader set "x-webobjects-server-protocol" "HTTP/1.0"
RequestHeader set "x-webobjects-remote-host" "127.0.0.1"
AddDefaultCharset UTF-8
Order allow,deny
Allow from all
</Proxy>
RewriteEngine On
RewriteRule ^/SOGo/(.*)$ /SOGo/$1 [env=REMOTE_HOST:%{REMOTE_ADDR},PT]
# For Apple autoconfiguration
<IfModule rewrite_module>
RewriteEngine On
RewriteRule ^/.well-known/caldav/?$ /SOGo/dav [R=301]
RewriteRule ^/.well-known/carddav/?$ /SOGo/dav [R=301]
</IfModule>
<Directory /src/SOGo/Tests/results>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
Alias /tests /src/SOGo/Tests/results
</VirtualHost>
@@ -0,0 +1,20 @@
-----BEGIN CERTIFICATE-----
MIIDOTCCAiGgAwIBAgIUCMtp7zGBSm27mjkmvqMww9BtkBowDQYJKoZIhvcNAQEL
BQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yNDA3MjcyMjM4MTdaFw0zNDA3
MjUyMjM4MTdaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw
HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEB
AQUAA4IBDwAwggEKAoIBAQCtpzPeBvnCJJD36iaTClW1dprzqs9yMqEyLHaczOIm
VEsUG6ykWx1XpH4adAfVuVkyKgIuVWK57F4wmDq6mpyycfIbhT2r93fWkW5k10vU
c1QG6CPiQs01n0H3BqMXfbkYmJ5Re63cDawRT5aofpc2ClSk7odrL2cF0keb84qB
4b6M4D2fGEL9dkwzXeKysMqmcur6jsfAv1ojB4lie+q2UR3VIvU2OP8NQckJJ4le
O5i20gR5iX71KykgCy4J2OelU18RH3yY9AZd+m6rWokIqqvS3Izz1hTRC7TQUDql
RCWCCyLZolWs9T5K2i23lpswWX+bjtkR1NAqPy+W0WJfAgMBAAGjITAfMB0GA1Ud
DgQWBBTUzyYg3BCKqzFWJSu/iTNxknyphjANBgkqhkiG9w0BAQsFAAOCAQEAouJq
l6vdg5x/nOBRO+opqIetyc0iux/aJb4QxcMgMgH0c756+EhIFtkx6oxMf7PfNqXF
xykkjE5qRMWdtYRsR9unYX/aXJG22iHce9rbK7NgQe0UvqfTZcHCLuvjJA+Iyxnk
KPUboPoBqE9ByOhX9NnMBkmhJPe/l4pE0h8hXPEFYvTDfAYYFh6+4JAtEqF+E8ZW
UBPZLG+nM48TuPte8iWRHZyn70h2dGQ05Wzlov58ftV1AY5BAo7z3b/ZCEz3gTNe
+TcN413F1drctxjSXAd5OuqTEUOutaUwdwAbRQpOXuMDabXGQvTXMIRnHG0QLmQo
YzVEGaUAWP4MeXrvIQ==
-----END CERTIFICATE-----
@@ -0,0 +1,16 @@
-----BEGIN CERTIFICATE REQUEST-----
MIICijCCAXICAQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUx
ITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcN
AQEBBQADggEPADCCAQoCggEBAK2nM94G+cIkkPfqJpMKVbV2mvOqz3IyoTIsdpzM
4iZUSxQbrKRbHVekfhp0B9W5WTIqAi5VYrnsXjCYOrqanLJx8huFPav3d9aRbmTX
S9RzVAboI+JCzTWfQfcGoxd9uRiYnlF7rdwNrBFPlqh+lzYKVKTuh2svZwXSR5vz
ioHhvozgPZ8YQv12TDNd4rKwyqZy6vqOx8C/WiMHiWJ76rZRHdUi9TY4/w1ByQkn
iV47mLbSBHmJfvUrKSALLgnY56VTXxEffJj0Bl36bqtaiQiqq9LcjPPWFNELtNBQ
OqVEJYILItmiVaz1PkraLbeWmzBZf5uO2RHU0Co/L5bRYl8CAwEAAaAAMA0GCSqG
SIb3DQEBCwUAA4IBAQBgCABl1ViXYbRIMtZR4UA2Cd0jY5kqMq0CePWHDYOI+eUP
qcnx+sVNZN5ixDdm3Dv6g7dwu3g8FZ3oC/jS/JhTJbbVubPq21T3nv0ZIOL3rmMp
hJsWBBanVgLi3MD+UsF/2IrJYf7mOR2OEVmb4dglUJNgkcbuaTA4nF5nFS/gVZxg
id6wvGygNuoGXhWVOC1amr+xYqt6Wv/U2vA8fQ9LWL7L7/eU2ol2VurC8bEAQYRR
7O8WOk9j2njDRzE8HHKg7iSSDleMiYtAcs2HIljlTAB7mQolkYpcfyIOE1wFWG14
IhS/p2SxHfvUKvJIgauG7DkFeURRtnqEioB2JwyE
-----END CERTIFICATE REQUEST-----
@@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCtpzPeBvnCJJD3
6iaTClW1dprzqs9yMqEyLHaczOImVEsUG6ykWx1XpH4adAfVuVkyKgIuVWK57F4w
mDq6mpyycfIbhT2r93fWkW5k10vUc1QG6CPiQs01n0H3BqMXfbkYmJ5Re63cDawR
T5aofpc2ClSk7odrL2cF0keb84qB4b6M4D2fGEL9dkwzXeKysMqmcur6jsfAv1oj
B4lie+q2UR3VIvU2OP8NQckJJ4leO5i20gR5iX71KykgCy4J2OelU18RH3yY9AZd
+m6rWokIqqvS3Izz1hTRC7TQUDqlRCWCCyLZolWs9T5K2i23lpswWX+bjtkR1NAq
Py+W0WJfAgMBAAECggEAETSSfFp56d/FnUqjLR5xBNxjgzur93HyFrk2Z1gaxWwZ
+ZFkYZnFe9GId7EstY2lEMX+FqkkcazBsv7iPWrkQP9D2wYwk2v0K7DtHICturb9
NFH70YcyMzCRpfAPvgbEOB5RprEiYL3aC+e0KFhNPcV4QtR/W6yuqxz9NgPDTWru
g061RKNlqkeNUp5cnOWhj2Z98SfyZEmN8eIYNW0/neGHiYzXgrpWNvlu5Y1yuZxF
ztapr4Oigl6CK7uJ0fOMRsGDdpjfAmOaXGJn2Y848VjUDvlj4HuyW2InPvDwd5t2
Do/1zqasMMPl+xa7729Sr5oWYu4IaG/sTTLGQNC2gQKBgQDoeXAQDtwxche3Bddw
WEn6ZtpbgDyeoDroZ4P9Fzyq5Rc3HJxv4WFILlYR16buJlPn7QARUD8r2/n+oTiA
CN75z5YDKoRmKbCflp2OHmSWWCd7lIzpxaOoOwtPYhOWyaR4BEfaGPjowUz0XBfr
Zp80APMOhNZKeeLUOR+Skk09VwKBgQC/Oevluv9rvELX2h09BvE63ZwHjdqW0xaz
udSGATpssOeu+9k4E0WKqbyzIhYzR0tGYDHqgdAvU5sr++q/ImhIrz4qRgBSBZs1
/1DvbarjogoSZK4lKB20vme+b329sv4TE1c+tusFmLQc+beS67MWfCtvoRzT79Lj
WVjhUWjWOQKBgQDParIykZ+iukIweRTMVunCcYw3gYYUna+RdfKMmPP3IimBcZSe
Of/bMAR5LOjyqN3KG2opCGkkj8NQjbXkfoW7a5xTvNaedGnzKaXvjGyAu6yWlWbY
mQ845V1k+YOy0LxenKsjC47h1L39dEGfNVOsSYCTHrA3iOJ6KXFjDAfARwKBgAqK
yet/VKd+2HyH5MbBhDkHkJuGAYABISZFX2cH2E23rv4hmkcSIOpVEzcY8PpgutCl
avsPrwd853gUSkvBPNiM+LNh6pCbCISAj9izRhGIlF+RN1yLCqA1Qwjnopn7rTAm
B9BIS0qisYNLbQhngBcEP2zHCAzTEuA/w7ugPlRZAoGBAK2wW8ByG3DagT2S4BPB
kR/199rdPlNDr6x/BUdceYD76+ZvUsE+mJpzyluU4ECJwNlWLQZkw4uAaRWUNGP6
wPYQH2LwXLoj9kxckHEdrC9S0uyEs7A8j60SrGGEtylLG7xS9LyGWj3ZwrycmPoA
DOKRLBQCahiob4BAfDfQjXDg
-----END PRIVATE KEY-----
+7
View File
@@ -0,0 +1,7 @@
#!/bin/bash
rm -f apache-selfsigned.key apache-selfsigned.csr apache-selfsigned.crt
openssl genpkey -algorithm RSA -out apache-selfsigned.key
openssl req -new -key apache-selfsigned.key -out apache-selfsigned.csr
openssl x509 -req -days 3650 -in apache-selfsigned.csr -signkey apache-selfsigned.key -out apache-selfsigned.crt
+166
View File
@@ -0,0 +1,166 @@
# extended LDIF
#
# LDAPv3
# base <dc=example,dc=org> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# example.org
dn: dc=example,dc=org
objectClass: dcObject
objectClass: organization
dc: example
o: example
# users, example.org
dn: ou=users,dc=example,dc=org
objectClass: organizationalUnit
ou: users
dn: ou=groups,dc=example,dc=org
objectClass: organizationalUnit
ou: groups
dn: uid=sogo,ou=users,dc=example,dc=org
uid: sogo
cn: Sogo
sn: Sogo
mail: sogo@example.org
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
userPassword:: c29nbw==
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/sogo
dn: uid=cyrus,ou=users,dc=example,dc=org
uid: cyrus
cn: cyrus
sn: cyrus
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
userPassword:: c29nbw==
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/cyrus
dn: uid=sogo-tests1,ou=users,dc=example,dc=org
uid: sogo-tests1
cn: Dude
sn: Love
givenName: Dude
homePhone: +1 (123) 456-7890
l: Vladivostok
telephoneNumber: +1 (120) 987-6543
mail: sogo-tests1@example.org
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
userPassword:: c29nbw==
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/sogo-tests1
dn: uid=sogo-tests2,ou=users,dc=example,dc=org
uid: sogo-tests2
cn: Hewill
sn: Crashit
givenName: Hewill
homePhone: +1 (123) 456-7890
l: Vladivostok
telephoneNumber: +1 (120) 987-6543
mail: sogo-tests2@example.org
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
userPassword:: c29nbw==
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/sogo-tests2
dn: uid=sogo-tests3,ou=users,dc=example,dc=org
uid: sogo-tests3
cn: Ithas
sn: Exploded
givenName: Ithas
homePhone: +1 (123) 456-7890
l: Vladivostok
telephoneNumber: +1 (120) 987-6543
mail: sogo-tests3@example.org
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
userPassword:: c29nbw==
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/sogo-tests3
dn: uid=sogo-tests-super,ou=users,dc=example,dc=org
uid: sogo-tests-super
cn: John Doe
sn: Doe
givenName: John
homePhone: +1 (123) 456-7890
l: Vladivostok
telephoneNumber: +1 (120) 987-6543
mail: sogo-tests-super@example.org
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
userPassword:: c29nbw==
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/sogo-tests-super
dn: uid=res,ou=users,dc=example,dc=org
uid: res
cn: resource No Overbook
sn: source
departmentNumber: 1
description: location
givenName: res
mail: res@example.org
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
userPassword:: c29nbw==
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/res
dn: uid=res-nolimit,ou=users,dc=example,dc=org
uid: res-nolimit
cn: resource Overbook
sn: source
departmentNumber: 0
description: location
givenName: res-nolimit
mail: res-nolimit@example.org
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
userPassword:: c29nbw==
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/res-nolimit
# readers, users, example.org
dn: uid=readers,ou=users,dc=example,dc=org
objectClass: extensibleObject
objectClass: groupOfNames
cn: readers
mail: readers@example.org
member: uid=sogo-tests1,ou=users,dc=example,dc=org
member: uid=sogo-tests2,ou=users,dc=example,dc=org
member: uid=sogo-tests3,ou=users,dc=example,dc=org
# search result
search: 2
result: 0 Success
# numResponses: 14
# numEntries: 13
+8
View File
@@ -0,0 +1,8 @@
# original catatnight/postfix
FROM agiledigital/postfix:latest
ADD main.cf /etc/postfix/main.cf
ADD mailname /etc/mailname
ADD virtual /etc/postfix/virtual
ADD entrypoint.sh /entrypoint.sh
+12
View File
@@ -0,0 +1,12 @@
#!/bin/bash
cp /etc/postfix/main.cf /etc/postfix/main.cf.bak
chown root:root /etc/postfix/virtual
chown root:root /etc/postfix/virtual.db
postmap /etc/postfix/virtual
/opt/install.sh
# /opt/install.sh make changes /etc/postfix/main.cf, so restore bak file
rm -f /etc/postfix/main.cf
cp /etc/postfix/main.cf.bak /etc/postfix/main.cf
/usr/bin/supervisord -c /etc/supervisor/supervisord.conf
+1
View File
@@ -0,0 +1 @@
example.org
+52
View File
@@ -0,0 +1,52 @@
# Debian specific: Specifying a file name will cause the first
# line of that file to be used as the name. The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
# appending .domain is the MUA's job.
append_dot_mydomain = no
# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h
readme_directory = no
# See http://www.postfix.org/COMPATIBILITY_README.html -- default to 3.6 on
# fresh installs.
compatibility_level = 3.6
# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_tls_security_level=may
smtp_tls_CApath=/etc/ssl/certs
smtp_tls_security_level=may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtp_sender_dependent_authentication = yes
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = localhost
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = example.org
mydomain = example.org
relayhost =
mailbox_size_limit = 51200000
recipient_delimiter =
inet_interfaces = all
inet_protocols = all
maillog_file = /var/log/mail.log
myorigin = /etc/mailname
default_transport = error
relay_transport = error
mailbox_transport = lmtp:inet:imapd:24
local_recipient_maps = hash:/etc/postfix/virtual
+1
View File
@@ -0,0 +1 @@
@example.org root
+518
View File
@@ -0,0 +1,518 @@
#!/bin/bash
TESTS_RET=0
SRC_SOPE=$1
SRC_SOGO=$2
TESTS_FAILED=false
TESTS_RESULTS=()
JSON_TEST_RESULTS_PATH="/tmp/tests_results.json"
export TERM=xterm
# formatting
bold=$(tput bold)
normal=$(tput sgr0)
underline=$(tput smul)
no_underline=$(tput rmul)
red=$(tput setaf 1)
green=$(tput setaf 2)
yellow=$(tput setaf 3)
blue=$(tput setaf 4)
magenta=$(tput setaf 5)
cyan=$(tput setaf 6)
white=$(tput setaf 7)
title() {
echo "${bold}${cyan}$1${normal}"
}
subtitle() {
echo "${magenta}$1${normal}"
}
subsubtitle() {
echo "${cyan}$1${normal}"
}
texterror() {
echo "${bold}${red}$1${normal}"
}
textwarning() {
echo "${bold}${yellow}$1${normal}"
}
textsuccess() {
echo "${bold}${green}$1${normal}"
}
stepsuccess() {
echo -e "$1 ${bold}${green}✔ ${normal}${bold}$2${normal}"
}
steperror() {
echo -e "$1 ${bold}${red}𐄂 ${normal}${bold}$2${normal}"
}
in_array() {
local SEARCH_ELEMENT
SEARCH_ELEMENT="$1"
shift
local ELEMENT
for ELEMENT in "$@"; do
if [[ "$ELEMENT" == "$SEARCH_ELEMENT" ]]; then
return 0
fi
done
return 1
}
is_in_docker() {
if [ -f /.dockerenv ]; then
return 0
else
return 1
fi
}
get_latest_github_commit_hash() {
REPO="$1"
BRANCH="${2:-master}"
TOKEN="$3"
GITHUB_API_URL="https://api.github.com/repos/$REPO/commits/$BRANCH"
LATEST_COMMIT_HASH=$(curl -s -k -H "Authorization: token $TOKEN" $GITHUB_API_URL | grep '"sha"' | head -n 1 | awk '{print $2}' | tr -d '",')
echo "$LATEST_COMMIT_HASH"
}
build_system_header() {
echo "${white} "
echo "${white} "
echo "${white} "
echo "${white} ${green}▒▒▒▒${white} "
echo "${white} ${green}▒▒▒${white} ${green}▒▒▒▒${white} "
echo "${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒${white} "
echo "${white} ${green}▒▒▒${white} ${green}▒▒${white} ${green}▒▒${white} ${green}▒▒${white} "
echo "${white} ${green}▒▒▒▒▒▒▒▒▒▒${white} ${green}▒▒▒▒▒▒▒▒▒▒▒${white} ${green}▒▒▒▒▒▒▒▒▒▒▒▒${white} ${green}▒▒${white} ${green}▒▒${white} ${green}▒▒${white} ${green}▒▒${white} "
echo "${white} ${green}▒▒${white} ${green}▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒${white} ${green}▒▒▒▒▒▒${white} ${green}▒▒▒${white} "
echo "${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒${white} ${green}▒▒▒${white} ${green}▒▒${white} ${green}▒▒▒${white} "
echo "${white} ${green}▒▒▒▒▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒▒▒▒▒▒▒${white} "
echo "${white} ${green}▒▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒${white} ${green}▒▒${white} ${green}▒▒▒${white} "
echo "${white} ${green}▒▒▒${white} ${green}▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒${white} "
echo "${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} "
echo "${white} ${green}▒▒▒▒▒▒▒▒▒${white} ${green}▒▒▒▒▒▒▒▒▒▒${white} ${green}▒▒▒▒▒▒▒▒▒▒${white} "
echo "${white} ${green}▒▒▒${white} "
echo "${white} ${green}▒▒${white} "
echo "${white} ${green}▒▒▒▒▒▒▒▒▒▒▒▒▒${white} "
echo "${white} ${green}▒▒▒${white} ${green}▒▒▒${white} "
echo "${white} ${green}▒▒${white} ${green}▒▒▒${white} "
echo "${white} ${green}▒▒${white} ${green}▒▒${white} "
echo "${white} ${green}▒▒▒▒${white} ${green}▒▒▒▒${white} "
echo "${white} ${green}▒▒▒▒▒▒▒▒▒▒${white} "
echo "${white} "
echo "${white} ${bold}${green}BUILD SYSTEM${normal} "
echo "${white} "
echo ""
}
check_exit_code() {
local EXIT_CODE=$?
if [ $EXIT_CODE -ne 0 ]; then
return $EXIT_CODE
fi
}
function prep_tests {
# install node modules
cd "$SRC_SOGO/Tests" && \
npm config set loglevel=error && \
npm install > /dev/null
RC=$?
GRC=$(($GRC+$RC))
if [ $RC -ne 0 ]; then
MSG="$MSG\nError installing node modules"
error_out
fi
# fixup the tests configuration
cd "$SRC_SOGO/Tests/lib" && \
cat >config.js <<EOF
export default {
hostname: "httpd",
port: "81",
username: "sogo-tests1",
password: "sogo",
superuser: "sogo-tests-super",
superuser_password: "sogo",
subscriber_username: "sogo-tests2",
subscriber_password: "sogo",
attendee1: "sogo-tests2@example.org",
attendee1_username: "sogo-tests2",
attendee1_password: "sogo",
attendee1_delegate: "sogo-tests3@example.org",
attendee1_delegate_username: "sogo-tests3",
attendee1_delegate_password: "sogo",
resource_no_overbook: "res",
resource_can_overbook: "res-nolimit",
white_listed_attendee: {
"sogo-tests1": "John Doe <sogo-tests1@example.org>"
},
mailserver: "dovecot",
testput_nbrdays: 30,
sieve_server: "dovecot",
sieve_port: 4190,
sogo_user: "sogo",
sogo_tool_path: "/usr/sbin/sogo-tool",
webCalendarURL: "http://httpd/CanadaHolidays.ics",
timeout: 600000
}
EOF
RC=$?
GRC=$(($GRC+$RC))
if [ $RC -ne 0 ]; then
MSG="$MSG\nError creating config.js"
error_out
fi
sleep 1
}
function prep_tests_mysql {
rm /etc/sogo/sogo.conf
cp /etc/sogo/sogo-tests-mysql-ldap.conf /etc/sogo/sogo.conf
TMP_FILE=$(mktemp)
chmod 600 $TMP_FILE
cat <<EOF > $TMP_FILE
[client]
user = sogobuild
password = sogo123
host = mariadb
EOF
# drop the mysql database and recreate it
echo "drop database sogo_integration_tests;" | mysql --defaults-extra-file=$TMP_FILE -h mariadb
echo "create database sogo_integration_tests charset=utf8;" | mysql --defaults-extra-file=$TMP_FILE -h mariadb
rm $TMP_FILE
RC=$?
GRC=$(($GRC+$RC))
if [ $RC -ne 0 ]; then
MSG="$MSG\nError recreating MySQL database"
error_out
fi
}
function prep_tests_postgresql {
rm /etc/sogo/sogo.conf
cp /etc/sogo/sogo-tests-postgresql-ldap.conf /etc/sogo/sogo.conf
# drop the postgresql database and recreate it
# the env var is unsafe, i know... just easier and non sensitive anyway
PGPASSWORD=sogo123 dropdb -U sogobuild -h postgres sogo_integration_tests
PGPASSWORD=sogo123 createdb -O sogobuild -U sogobuild -h postgres sogo_integration_tests
RC=$?
GRC=$(($GRC+$RC))
if [ $RC -ne 0 ]; then
MSG="$MSG\nError recreating postgresql database"
error_out
fi
}
function prep_tests_mysql_auth {
rm /etc/sogo/sogo.conf
cp /etc/sogo/sogo-tests-mysql.conf /etc/sogo/sogo.conf
}
function prep_tests_postgresql_auth {
rm /etc/sogo/sogo.conf
cp /etc/sogo/sogo-tests-postgresql.conf /etc/sogo/sogo.conf
}
function prep_tests_mysql_combined {
rm /etc/sogo/sogo.conf
cp /etc/sogo/sogo-tests-mysql-ldap-combined.conf /etc/sogo/sogo.conf
}
function prep_tests_mysql_auth_combined {
rm /etc/sogo/sogo.conf
cp /etc/sogo/sogo-tests-mysql-combined.conf /etc/sogo/sogo.conf
}
function prep_tests_postgresql_combined {
rm /etc/sogo/sogo.conf
cp /etc/sogo/sogo-tests-postgresql-ldap-combined.conf /etc/sogo/sogo.conf
}
function prep_tests_postgresql_auth_combined {
rm /etc/sogo/sogo.conf
cp /etc/sogo/sogo-tests-postgresql-combined.conf /etc/sogo/sogo.conf
}
function error_out {
set +x
echo -e "$MSG"
exit 1
}
function check_tests {
FAIL=$(cat /tmp/out.log | grep -m 1 -Eo "([0-9]+)\s+failure" | cut -d' ' -f 1)
TOTAL=$(cat /tmp/out.log | grep -m 1 -Eo "([0-9]+)\s+spec" | cut -d' ' -f 1)
NOT_EXECUTED=$(cat /tmp/out.log | grep -m 1 -Eo "([0-9]+)\s+pending" | cut -d' ' -f 1)
# If test fail
if [ $FAIL -gt 0 ]
then
TESTS_RET=1
fi
# Console
echo -e "\033[1mTests results for $1\033[0m" >> "$SRC_SOGO/Tests/results/tests_results.txt"
echo -e "Total : $TOTAL" >> "$SRC_SOGO/Tests/results/tests_results.txt"
if [ $FAIL -gt 0 ]
then
echo -e "\033[0;31mFailed : $FAIL\033[0m" >> "$SRC_SOGO/Tests/results/tests_results.txt"
else
echo -e "Failed : $FAIL" >> "$SRC_SOGO/Tests/results/tests_results.txt"
fi
echo -e "Not executed : $NOT_EXECUTED" >> "$SRC_SOGO/Tests/results/tests_results.txt"
if [ $FAIL -gt 0 ]
then
echo -e "\033[0;31mTests failed\033[0m" >> "$SRC_SOGO/Tests/results/tests_results.txt"
else
echo -e "\033[0;36mTests success\033[0m" >> "$SRC_SOGO/Tests/results/tests_results.txt"
fi
echo "" >> "$SRC_SOGO/Tests/results/tests_results.txt"
# HTML
echo "<table style=\"margin-bottom: 10px;\"><tbody><tr><td colspan=\"3\" style=\"background-color: aquamarine;\"><strong>$1</strong></td></tr><tr>" >> "$SRC_SOGO/Tests/results/index.html"
echo "<td>Total</td><td>Failed</td><td>Not executed</td></tr><tr>" >> "$SRC_SOGO/Tests/results/index.html"
if [ $FAIL -gt 0 ]
then
echo "<td>$TOTAL</td><td style=\"color: red;\">$FAIL</td><td>$NOT_EXECUTED</td>" >> "$SRC_SOGO/Tests/results/index.html"
echo "</tr><tr><td colspan=\"3\" style=\"color: red;\"><strong>Tests failed</strong></td>" >> "$SRC_SOGO/Tests/results/index.html"
else
echo "<td>$TOTAL</td><td>$FAIL</td><td>$NOT_EXECUTED</td>" >> "$SRC_SOGO/Tests/results/index.html"
echo "</tr><tr><td colspan=\"3\" style=\"color: #170;\"><strong>Tests success</strong></td>" >> "$SRC_SOGO/Tests/results/index.html"
fi
echo "</tr><tr><td colspan=\"3\"><a href=\"$2.html\" target=\"_blank\">View test report</a></td>" >> "$SRC_SOGO/Tests/results/index.html"
echo "</tr></tbody></table>" >> "$SRC_SOGO/Tests/results/index.html"
if [ $TESTS_RET -eq 1 ]
then
echo -e "\033[0;31mFailed\033[0m"
return 131
else
echo -e "\033[0;36mSuccess\033[0m"
fi
}
function run_tests {
RET=0
USE_PKILL=$3
# create empty logfile
cat /dev/null >/tmp/out.log
if [ "$USE_PKILL" -eq 1 ]; then
pkill -9 sogod
else
service sogod stop
fi
# Kill residual SOGo process
LSOF_OUT=$(lsof -i TCP@127.0.0.1 -Fp | tr -d p)
if [ ! -z "$LSOF_OUT" ]; then
kill -9 $LSOF_OUT
fi
# restart services
if [ "$USE_PKILL" -eq 1 ]; then
su -s /bin/bash -c "/usr/sbin/sogod -WOWorkersCount 3 -WOPidFile /var/run/sogo/sogo.pid -WOLogFile /var/log/sogo/sogo.log" sogo
else
service sogod start
fi
# wait for it to settle
sleep 3
# run the tests and gather output
cd "$SRC_SOGO/Tests"
RC=$?
GRC=$(($GRC+$RC))
if [ $RC -ne 0 ]; then
MSG="$MSG\nCan't cd into the Tests folder..."
error_out
fi
npm run test-junit 2>&1 | tee -a /tmp/out.log
RC=$?
GRC=$(($GRC+$RC))
if [ $RC -ne 0 ]; then
MSG="$MSG\nError running the integration tests"
error_out
fi
# source GNUstep.sh
# set +x
#. /usr/share/GNUstep/Makefiles/GNUstep.sh
# set -x
# teststrings
# run only once, no point in running with all the backend
# substitutions
# if [[ -z ${TEST_RUN_COUNT} || ${TEST_RUN_COUNT} -lt 1 ]]; then
# cd Integration
# ./teststrings.sh 2>&1 | tee -a /tmp/out.log
# fi
# stop sogo when we're done
if [ "$USE_PKILL" -eq 1 ]; then
pkill -9 sogod
else
service sogod stop
fi
XML_FILE="$SRC_SOGO/Tests/results/$2"
mv /tmp/results.xml "$XML_FILE"
check_tests "$1" "$2"
# Generate JSON
TOTAL_TESTS=$(xmllint --xpath 'sum(//testsuite/@tests)' "$XML_FILE")
TOTAL_FAILURES=$(xmllint --xpath 'sum(//testsuite/@failures)' "$XML_FILE")
TOTAL_ERRORS=$(xmllint --xpath 'sum(//testsuite/@errors)' "$XML_FILE")
TOTAL_FAILED=$(($TOTAL_FAILURES + $TOTAL_ERRORS))
TOTAL_SUCCESS=$(($TOTAL_TESTS - $TOTAL_FAILED))
if [ "$TOTAL_FAILED" -gt 0 ]; then
FAILED=true
TESTS_FAILED=true
else
FAILED=false
fi
JSON_DATA=$(jq -n \
--argjson total_tests "$TOTAL_TESTS" \
--argjson total_failed "$TOTAL_FAILED" \
--argjson total_success "$TOTAL_SUCCESS" \
--arg description "$1" \
--arg scenario "$2" \
--argjson failed "$FAILED" \
'{scenario: $scenario, description: $description, total_tests: $total_tests, total_failed: $total_failed, total_success: $total_success, failed: $failed}')
TESTS_RESULTS+=("$JSON_DATA")
}
test() {
#set -x
USE_PKILL=${1:-0}
TESTS_FAILED=false
TESTS_RESULTS=()
rm -f "$JSON_TEST_RESULTS_PATH"
if [ "${SKIP_TESTS:-0}" -eq 1 ]; then
subsubtitle "Skipping tests"
return 0;
fi
# INTEGRATION TESTS
if [[ -d "$SRC_SOGO/Tests/results" ]]; then
rm -Rf "$SRC_SOGO/Tests/results"
fi
mkdir -p "$SRC_SOGO/Tests/results"
echo "" > "$SRC_SOGO/Tests/results/tests_results.txt"
echo "<html><head><style>table, th, td {border: 1px solid darkgrey;border-collapse: collapse; width: 400px; font-family: monospace;}</style></head><body>" > "$SRC_SOGO/Tests/results/index.html"
test_title_color="${bold}${yellow}"
# MySQL
echo "${test_title_color}Running tests with LDAP auth and MySQL backend${normal}"
prep_tests
prep_tests_mysql
run_tests "Running tests with LDAP auth and MySQL backend" "results-mysql-ldap.xml" $USE_PKILL
echo "${test_title_color}Running tests with MySQL auth and MySQL backend${normal}"
prep_tests
prep_tests_mysql
prep_tests_mysql_auth
run_tests "Running tests with MySQL auth and MySQL backend" "results-mysql.xml" $USE_PKILL
echo "${test_title_color}Running tests with LDAP auth and MySQL backend, combined database tables${normal}"
prep_tests
prep_tests_mysql
prep_tests_mysql_combined
run_tests "Running tests with LDAP auth and MySQL backend, combined database tables" "results-mysql-ldap-combined.xml" $USE_PKILL
echo "${test_title_color}Running tests with MySQL auth and MySQL backend, combined database tables${normal}"
prep_tests
prep_tests_mysql
prep_tests_mysql_auth_combined
run_tests "Running tests with MySQL auth and MySQL backend, combined database tables" "results-mysql-combined.xml" $USE_PKILL
# PGSQL
echo "${test_title_color}Running tests with LDAP auth and postgresql backend${normal}"
prep_tests
prep_tests_postgresql
run_tests "Running tests with LDAP auth and postgresql backend" "results-postgresql-ldap.xml" $USE_PKILL
echo "${test_title_color}Running tests with postgresql auth and postgresql backend${normal}"
prep_tests
prep_tests_postgresql
prep_tests_postgresql_auth
run_tests "Running tests with postgresql auth and postgresql backend" "results-postgresql.xml" $USE_PKILL
echo "${test_title_color}Running tests with LDAP auth and postgresql backend, combined database tables${normal}"
prep_tests
prep_tests_postgresql
prep_tests_postgresql_combined
run_tests "Running tests with LDAP auth and postgresql backend, combined database tables" "results-postgresql-ldap-combined.xml" $USE_PKILL
echo "${test_title_color}Running tests with postgresql auth and postgresql backend, combined database tables${normal}"
prep_tests
prep_tests_postgresql
prep_tests_postgresql_auth_combined
run_tests "Running tests with postgresql auth and postgresql backend, combined database tables" "results-postgresql-combined.xml" $USE_PKILL
# set -x
# JUnit
for file in $SRC_SOGO/Tests/results/*.xml #$xmlfiles
do
xunit-viewer -r $file -c -o "$file.html"
done
cat "$SRC_SOGO/Tests/results/tests_results.txt"
echo "</body>" >> "$SRC_SOGO/Tests/results/index.html"
chown 644 -R "$SRC_SOGO/Tests/results"
chown -R www-data:www-data "$SRC_SOGO/Tests/results"
# Restore conf
rm /etc/sogo/sogo.conf
cp /etc/sogo/sogo-base.conf /etc/sogo/sogo.conf
if [ "$USE_PKILL" -eq 1 ]; then
pkill -9 sogod
su -s /bin/bash -c "/usr/sbin/sogod -WOWorkersCount 3 -WOPidFile /var/run/sogo/sogo.pid -WOLogFile /var/log/sogo/sogo.log" sogo
else
service sogod restart > /dev/null
fi
# Global json results
TESTS_RESULTS_JSON=$(printf '%s\n' "${TESTS_RESULTS[@]}" | jq -s .)
FINAL_JSON=$(jq -n \
--argjson tests_failed "$TESTS_FAILED" \
--argjson tests "$TESTS_RESULTS_JSON" \
'{failed: $tests_failed, tests: $tests}')
echo "$FINAL_JSON" > $JSON_TEST_RESULTS_PATH
result_link="${bold}${magenta}--------------------------------------------------\nTests results : https://127.0.0.1/tests/index.html${normal}"
# If test fail
if [ $TESTS_RET -eq 1 ]
then
echo -e "$result_link [${bold}${red}Failed${normal}]\n"
return 131
else
echo -e "$result_link [${bold}${green}Success${normal}]\n"
return 0
fi
}
+14
View File
@@ -0,0 +1,14 @@
#!/bin/bash
cd ${WORKSPACE} \
./configure --enable-debug --disable-strip --enable-mfa \
make \
make install \
echo "register sogo library" \
echo "/usr/local/lib/sogo" > /etc/ld.so.conf.d/sogo.conf \
ldconfig \
echo "create directories and enforce permissions" \
install -o sogo -g sogo -m 755 -d /var/run/sogo \
install -o sogo -g sogo -m 750 -d /var/spool/sogo \
install -o sogo -g sogo -m 750 -d /var/log/sogo
su -s /bin/bash - sogo -c "echo \"set debuginfod enabled off\" >> ~/.gdbinit"
+147
View File
@@ -0,0 +1,147 @@
#!/bin/bash
SRC_SOPE=/src/SOPE/
SRC_SOGO=/src/SOGo/
source /include/common.sh $SRC_SOPE $SRC_SOGO
options="h:b:ba:br:d"
long_options="help,build,build-all,build-resources,debug"
parsed_options=$(getopt -o $options -l $long_options)
# Check for errors in parsing
if [ $? -ne 0 ]; then
exit 1
fi
# Evaluate the parsed options
#eval set -- "$parsed_options"
help() {
echo "${green} ----------------------"
echo "| ${bold}SOGo Dev env${normal}${green} |"
echo " ----------------------"
echo
echo "${normal}Options are :${cyan}"
echo -e "-h, --help\t\tShow help"
echo -e "-b, --build\t\tBuild sogo app"
echo -e "-ba, --build-all\tClean, build sogo and sope"
echo -e "-br, --build-resources\tBuild only sogo JS/CSS resources"
echo -e "-d, --debug\t\tStart sogo in debug with gdb"
echo "${normal}"
}
ssl_fix() {
if [[ -z "${LD_PRELOAD}" ]]; then
LIBSSL_LOCATION=$(find / -type f -name "libssl.so.*" -print -quit);echo "LD_PRELOAD=$LIBSSL_LOCATION" >> /etc/default/sogo
echo "LD_LIBRARY_PATH=/usr/local/lib/sogo:/usr/local/lib:$LD_LIBRARY_PATH" >> /etc/default/sogo
export LD_PRELOAD=$LIBSSL_LOCATION
else
echo "LD_PRELOAD=$LD_PRELOAD" >> /etc/default/sogo
echo "LD_LIBRARY_PATH=/usr/local/lib/sogo:/usr/local/lib:$LD_LIBRARY_PATH" >> /etc/default/sogo
export LD_PRELOAD=$LD_PRELOAD
fi
}
build_resources() {
cd $SRC_SOGO
npm config set loglevel=error
git config --global --add safe.directory '*'
cd UI/WebServerResources
make dev
make install
}
build_sogo() {
service sogod stop
ssl_fix
cd $SRC_SOGO
cd ActiveSync
make && make install
cd ..
./configure --enable-saml2 --enable-debug --disable-strip --enable-mfa
make
make install
build_resources
RC=$?
if [ $RC -ne 0 ]; then
exit $RC
fi
if [ -z "$1" ]
then
service sogod start
fi
}
build_all() {
service sogod stop
cd $SRC_SOPE
make clean
./configure --with-gnustep --enable-debug --disable-strip
make
make install
cd $SRC_SOGO
cd ActiveSync
make clean
cd ..
make clean
build_sogo
RC=$?
if [ $RC -ne 0 ]; then
exit $RC
fi
}
debug() {
build_sogo "norestart"
echo "${magenta}================"
echo "GDB reminders :"
echo " * run : Run app (set breakpoints before)"
echo " * break SOGo.m:494 : Add breakpoint example"
echo " * c : continue"
echo " * n : next"
echo " * list 504 : show lines around"
echo " * p var : print variable 'var'"
echo " * po var : print object 'var'"
echo " * bt : Show stacktrace"
echo " * bt full : Show stacktrace with all vars"
echo "================${normal}"
echo ""
su -s /bin/bash - sogo -c "gdb --args /usr/local/sbin/sogod -WOUseWatchDog NO -WONoDetach YES -WOPort 0.0.0.0:50000 -WOWorkersCount 1 -WOPidFile /var/run/sogo/sogo.pid"
}
# Process the options
while true; do
case "$1" in
-b|--build)
build_sogo
exit 0
;;
-ba|--build-all)
build_all
exit 0
;;
-br|--build-resources)
build_resources
exit 0
;;
-d|--debug)
debug
exit 0
;;
-h|--help)
help
exit 0
;;
--)
shift
break
;;
*)
help
exit 1
;;
esac
done
+53
View File
@@ -0,0 +1,53 @@
#!/bin/bash
bold=$(tput bold)
normal=$(tput sgr0)
green=$(tput setaf 2)
white=$(tput setaf 7)
magenta=$(tput setaf 5)
cyan=$(tput setaf 6)
underline=$(tput smul)
no_underline=$(tput rmul)
cd /src/SOGo
echo "${white} "
echo "${white} "
echo "${white} "
echo "${white} ${green}▒▒▒▒${white} "
echo "${white} ${green}▒▒▒${white} ${green}▒▒▒▒${white} "
echo "${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒${white} "
echo "${white} ${green}▒▒▒${white} ${green}▒▒${white} ${green}▒▒${white} ${green}▒▒${white} "
echo "${white} ${green}▒▒▒▒▒▒▒▒▒▒${white} ${green}▒▒▒▒▒▒▒▒▒▒▒${white} ${green}▒▒▒▒▒▒▒▒▒▒▒▒${white} ${green}▒▒${white} ${green}▒▒${white} ${green}▒▒${white} ${green}▒▒${white} "
echo "${white} ${green}▒▒${white} ${green}▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒${white} ${green}▒▒▒▒▒▒${white} ${green}▒▒▒${white} "
echo "${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒${white} ${green}▒▒▒${white} ${green}▒▒${white} ${green}▒▒▒${white} "
echo "${white} ${green}▒▒▒▒▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒▒▒▒▒▒▒${white} "
echo "${white} ${green}▒▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒${white} ${green}▒▒${white} ${green}▒▒▒${white} "
echo "${white} ${green}▒▒▒${white} ${green}▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒${white} "
echo "${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} "
echo "${white} ${green}▒▒▒▒▒▒▒▒▒${white} ${green}▒▒▒▒▒▒▒▒▒▒${white} ${green}▒▒▒▒▒▒▒▒▒▒${white} "
echo "${white} ${green}▒▒▒${white} "
echo "${white} ${green}▒▒${white} "
echo "${white} ${green}▒▒▒▒▒▒▒▒▒▒▒▒▒${white} "
echo "${white} ${green}▒▒▒${white} ${green}▒▒▒${white} "
echo "${white} ${green}▒▒${white} ${green}▒▒▒${white} "
echo "${white} ${green}▒▒${white} ${green}▒▒${white} "
echo "${white} ${green}▒▒▒▒${white} ${green}▒▒▒▒${white} "
echo "${white} ${green}▒▒▒▒▒▒▒▒▒▒${white} "
echo "${white} "
echo "${white} ${bold}${green}DEVELOPER${normal} "
echo "${white} "
echo "${bold}${magenta}Access : https://127.0.0.1/SOGo/${normal}"
echo "${bold}${cyan}Use ${underline}devenv${no_underline} command to start${normal}"
echo ""
HAS_OLD_SOGO_INSTANCE=$(find /usr/local/lib/sogo/ -type f -name libSOGoUI.so.* | wc -l)
if [ "$HAS_OLD_SOGO_INSTANCE" -gt 1 ]; then
echo "${bold}${red}/!\ You have an instable dev environment (two sogo libraries versions). This can be caused by a disynchronized SOGo code source (docker and local environment) This can be fixed by updating your local git repositories, delete and rebuild docker compose. You can also run devenv -ba.${normal}"
fi
/etc/init.d/sogod restart
# Run for ever
tail -f /dev/null
+107
View File
@@ -0,0 +1,107 @@
{
/* ********************* Main SOGo configuration file **********************
* *
* Since the content of this file is a dictionary in OpenStep plist format, *
* the curly braces enclosing the body of the configuration are mandatory. *
* See the Installation Guide for details on the format. *
* *
* C and C++ style comments are supported. *
* *
* This example configuration contains only a subset of all available *
* configuration parameters. Please see the installation guide more details. *
* *
* ~sogo/GNUstep/Defaults/.GNUstepDefaults has precedence over this file, *
* make sure to move it away to avoid unwanted parameter overrides. *
* *
* **************************************************************************/
/* Database configuration (mysql://, postgresql:// or oracle://) */
WOPort = "0.0.0.0:50000";
// MySQL
SOGoProfileURL = "mysql://sogobuild:sogo123@mariadb:3306/sogo/sogo_user_profile";
OCSFolderInfoURL = "mysql://sogobuild:sogo123@mariadb:3306/sogo/sogo_folder_info";
OCSSessionsFolderURL = "mysql://sogobuild:sogo123@mariadb:3306/sogo/sogo_sessions_folder";
OCSEMailAlarmsFolderURL = "mysql://sogobuild:sogo123@mariadb:3306/sogo/sogo_alarms_folder";
OCSCacheFolderURL = "mysql://sogobuild:sogo123@mariadb:3306/sogo/sogo_cache_folder";
OCSStoreURL = "mysql://sogobuild:sogo123@mariadb:3306/sogo/sogo_store";
OCSAclURL = "mysql://sogobuild:sogo123@mariadb:3306/sogo/sogo_acl";
//Password
SOGoPasswordChangeEnabled = YES;
SOGoPasswordRecoveryEnabled = YES;
SOGoFirstWeekOfYear = "January1";
WOWorkersCount = 10;
WOWatchDogRequestTimeout = 5;
WOListenQueueSize = 15;
SOGoUserSources = (
{
CNFieldName = cn;
IDFieldName = uid;
UIDFieldName = uid;
baseDN = "ou=users,dc=example,dc=org";
bindDN = "cn=admin,dc=example,dc=org";
bindPassword = "password";
canAuthenticate = YES;
displayName = "Shared Addresses";
hostname = "openldap";
id = public;
isAddressBook = YES;
port = 389;
KindFieldName = description;
MultipleBookingsFieldName="departmentNumber";
}
);
SOGoDisableSharing = ();
SOGoDisableExport = ();
SOGoDisableSharingAnyAuthUser = ();
//Identities
SOGoMailAuxiliaryUserAccountsEnabled = YES;
SOGoPageTitle = NewName;
SOGoSieveScriptsEnabled = YES;
SOGoForwardEnabled = YES;
SOGoNotificationEnabled = YES;
SOGoVacationEnabled = YES;
SOGoEnableEMailAlarms = YES;
SOGoEnablePublicAccess = YES;
SOGoTimeZone = Europe/Paris;
SOGoIMAPServer = "imapd:143";
NGImap4AuthMechanism = "plain";
SOGoSieveServer = "sieve://imapd:4190";
SOGoMailingMechanism = smtp;
SOGoSMTPServer = "smtpd";
SOGoCalendarDefaultRoles = ("PublicDAndTViewer");
SOGoAppointmentSendEMailNotifications = YES;
SOGoMailDomain = "example.org";
SOGoLanguage = "English";
SOGoSuperUsernames = ("sogo-tests-super");
SOGoCalendarDefaultRoles = ("PublicDAndTViewer");
SOGoMemcachedHost = "memcached";
SOGoXSRFValidationEnabled = NO;
NGImap4ConnectionStringSeparator = "/";
/* Debug */
SoDebugBaseURL = YES;
SOGoDebugRequests = YES;
ImapDebugEnabled = YES;
LDAPDebugEnabled = YES;
PGDebugEnabled = YES;
SMTPDebugEnabled = YES;
MySQL4DebugEnabled = YES;
SOGoUIxDebugEnabled = YES;
WOLogFile = /var/log/sogo/sogo.log;
SOGoDebugLeaks = YES;
}
+15
View File
@@ -0,0 +1,15 @@
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/docker-existing-dockerfile
{
"name": "sogo",
"dockerComposeFile": "docker-compose.yml",
"service": "sogo",
"workspaceFolder": "/workspace",
"customizations": {
"vscode": {
"extensions": [
"ms-azuretools.vscode-docker"
]
}
}
}
+108
View File
@@ -0,0 +1,108 @@
services:
memcached:
image: memcached:1.6
container_name: sogo_memcached
restart: unless-stopped
httpd:
build:
context: ./conf/httpd/
dockerfile: Dockerfile
container_name: sogo_httpd
restart: unless-stopped
depends_on:
- sogo
ports:
- 80:80
- 443:443
volumes:
- ./conf/httpd/ssl:/ssl
- ./conf/httpd/CanadaHolidays.ics:/usr/local/apache2/htdocs/CanadaHolidays.ics
- sogo-static-files:/usr/local/lib/GNUstep
mariadb:
image: mariadb:11
container_name: sogo_mariadb
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: db
ports:
- 3307:3306
volumes:
- sogo-mariadb:/var/lib/mysql
- ./conf/db/mysql.sql:/docker-entrypoint-initdb.d/init-sogo.sql
openldap:
image: bitnami/openldap:2.5
container_name: sogo_openldap
restart: unless-stopped
ports:
- "389:389"
environment:
LDAP_PORT_NUMBER: 389
LDAP_ADMIN_USERNAME: "admin"
LDAP_ADMIN_PASSWORD: "password"
LDAP_BIND_PASSWORD: "password"
LDAP_ROOT: "dc=example,dc=org"
LDAP_ADMIN_DN: "cn=admin,dc=example,dc=org"
LDAP_CUSTOM_LDIF_DIR: "/ldifs"
#BITNAMI_DEBUG: true
volumes:
- ./conf/ldap/users.ldif:/ldifs/users.ldif # User data
imapd: # Dovecot
build:
context: ./conf/dovecot/
dockerfile: Dockerfile
container_name: sogo_dovecot
restart: unless-stopped
depends_on:
- openldap
ports:
- "143:143"
- "993:993"
- "4190:4190"
- "24:24"
volumes:
- sogo-mail-data:/var/mail
- sogo-sieve-data:/var/sieve
smtpd: # Postfix
build:
context: ./conf/postfix/
dockerfile: Dockerfile
container_name: sogo_postfix
restart: unless-stopped
ports:
- "25:25"
depends_on:
- imapd
- openldap
entrypoint: /entrypoint.sh
sogo:
container_name: sogo_dev
restart: unless-stopped
tty: true
build:
context: ../
dockerfile: .devcontainer/Dockerfile.devcontainer
ports:
- 50000:50000
cap_add:
- SYS_PTRACE
- NET_ADMIN
- NET_RAW
depends_on:
- openldap
- memcached
- mariadb
- imapd
- smtpd
volumes:
- ..:/workspace
- sogo-static-files:/usr/local/lib/GNUstep
- ./conf/sogo/sogo.conf:/etc/sogo/sogo.conf
# - /path/to/sope_folder:/src/SOPE # Uncomment this line if you want to mount SOPE source code
volumes:
sogo-mariadb:
sogo-postgres:
sogo-mail-data:
sogo-sieve-data:
sogo-static-files:
+74
View File
@@ -0,0 +1,74 @@
## Dev Container
The SOGo dev container will deploy a complete environnement to work and test with SOGo
This environnement contains:
- a mariadb database
- an imap server (dovecot) and a smtp server (postfix)
- a ldap server for the user source
- an Apache server
- The SOGo instance
## How to use the devcontainer
Simply clone the source code of the SOGo repo and open id with Visual Code Studio. If this is not already the case, you will need the [Dev Container Extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers). Then, simply execute the command "New Dev COntainer" and VCS will start building it.
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 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
### To modify the source and build
After modifyng the source in VCS, in your container's terminalthere is a command tool `devenv` with following options for building:
```
-b, --build Build sogo app
-ba, --build-all Clean, build sogo and sope
-br, --build-resources Build only sogo JS/CSS resources
```
To build sogo simplye does
```shell
sudo devenv -b
```
- The options -br will only build the front
- The options -ba will also build [SOPE](https://github.com/Alinto/sope) (low-level of SOGo, needs to be build before SOGo)
### To use the debugger
Inside the sogo container there is a tool to launch SOGo with the [debugger gdb](https://sourceware.org/gdb/).
Use one of the following command:
```shell
sudo devenv -d
sudo devenv --debug
```
### To change sogo.conf
The sogo.conf is linked to the one here [.devcontainer/conf/sogo/sogo.conf](conf/sogo/sogo.conf)
Modify it as you wish then you need to restart the sogo service inside the container:
```shell
service sogod restart
```
### To modify SOPE
Sometimes, you may have to change SOPE source code. In order to do that:
- First, clone the SOPE repo locally.
- Uncomment line 101 of the docker-compose.yml file and put the correct path to your SOPE folder. It should end with 'sope' like this: `/home/myuser/github/sope`
- Then, you have to rebuild your devcontainer.
- Now you can modify the source of SOPE and build it by going inside the sogo_dev container and do.
```shell
sudo devenv -ba
```
+4 -1
View File
@@ -10,6 +10,7 @@
*/obj/
.scss-lint-config.yml_
ActiveSync/ActiveSync.SOGo
API/API.SOGo
Documentation/*.docbook
Documentation/*.pdf
Documentation/*.html
@@ -55,4 +56,6 @@ Tests/results.xml
Tests/results
# SAML2 autogenerated files
SoObjects/SOGo/SOGoSAML2Exceptions.*
SoObjects/SOGo/SOGoSAML2Exceptions.*
node_modules
+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
[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";
};
};
};
};
}
+10 -3
View File
@@ -370,7 +370,9 @@ void handle_eas_terminate(int signum)
NSMutableString *s;
NSData *d;
int type;
int type, status;
status = 1;
parentId = [[(id)[theDocumentElement getElementsByTagName: @"ParentId"] lastObject] textValue];
displayName = [[(id)[theDocumentElement getElementsByTagName: @"DisplayName"] lastObject] textValue];
@@ -413,7 +415,12 @@ void handle_eas_terminate(int signum)
// FIXME
// handle exists (status == 2)
// handle right synckey
if ([newFolder create])
if([newFolder exists])
{
nameInContainer = [newFolder nameInContainer];
status = 2;
}
else if ([newFolder create])
{
SOGoMailAccount *accountFolder;
NSDictionary *imapGUIDs;
@@ -528,7 +535,7 @@ void handle_eas_terminate(int signum)
[s appendString: @"<?xml version=\"1.0\" encoding=\"utf-8\"?>"];
[s appendString: @"<!DOCTYPE ActiveSync PUBLIC \"-//MICROSOFT//DTD ActiveSync//EN\" \"http://www.microsoft.com/\">"];
[s appendString: @"<FolderCreate xmlns=\"FolderHierarchy:\">"];
[s appendFormat: @"<Status>%d</Status>", 1];
[s appendFormat: @"<Status>%d</Status>", status];
[s appendFormat: @"<SyncKey>%@</SyncKey>", syncKey];
[s appendFormat: @"<ServerId>%@</ServerId>", [nameInContainer stringByEscapingURL]];
[s appendString: @"</FolderCreate>"];
+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];
+261
View File
@@ -2,6 +2,267 @@
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.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)
+388 -133
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:
@@ -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:
@@ -437,8 +439,8 @@ Defaults to `300`.
|S |SOGoAuthenticationType
|Parameter used to define the way by which users will be authenticated.
For C.A.S., specify `cas`. For SAML2, specify `saml2`. For anything
else, leave that value empty.
For C.A.S., specify `cas`. For SAML2, specify `saml2`. For opendID Connect, specify `openid`.
For anything else, leave that value empty.
|S |SOGoTrustProxyAuthentication
|Parameter used to set whether HTTP username should be trusted.
@@ -477,6 +479,25 @@ example.
Defaults to `YES` when unset.
|S |SOGoCalendarEnableJitsiLink
|Parameter allowing users to create Jitsi link when creating an event.
Be aware that a least one of the attendees will need an account from a
platform that Jitsi supports: Google, Facebook or Github
Defaults to `NO` when unset.
|D |SOGoCalendarJitsiBaseUrl
|Only used if SOGoCalendarEnableJitsiLink is set to YES. String for the URL of
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
@@ -815,8 +836,6 @@ 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`.
@@ -859,8 +878,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_
@@ -954,8 +973,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
@@ -1365,8 +1383,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:
@@ -1382,8 +1400,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
@@ -1443,8 +1461,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
@@ -1546,8 +1564,83 @@ SOGoIMAPCASServiceName should be set to the actual imap service name
expected by pam_cas, otherwise it will fail to authenticate incoming
connection properly.
Authenticating using SAML2
~~~~~~~~~~~~~~~~~~~~~~~~~~
[[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`,
_SOGoXSRFValidationEnabled_ is set to `NO` and set the following parameters:
[cols="^4,46,50a"]
|=======================================================================
|S |OCSOpenIdURL
|Parameter used to set the database URL for openID session.
For MariaDB/MySQL, set the database URL to something like: mysql://sogo:sogo@127.0.0.1:3306/sogo/sogo_openid.
|S |SOGoOpenIdConfigUrl
|Parameter used to specify the endpoint of OpenID Provider Configuration, mandatory. For example:
https://myopenid.net/.well-known/openid-configuration
|S |SOGoOpenIdClient
|Name of your openid client, mandatory.
|S |SOGoOpenIdClientSecret
|Secret of your openid client, mandatory
|S |SOGoOpenIdScope
|Scope or your openid client, mandatory. List of words space separated like this:
"openid profile email"
|S |SOGoOpenIdEmailParam
|Name of the parameter from user profile that contains the mail/uid.
Defaults to `email` when unset.
|S |SOGoOpenIdEnableRefreshToken
|Set to `YES` to Enable the mechanism of refresh token if provided. You may have to configure
and/or add a value to your scope for it to work.
Defaults to `NO` when unset.
|S |SOGoOpenIdTokenCheckInterval
|Number of seconds before sogo check again the user's access token validity.
This is to prevent sogo to do too much request to the openid server.
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 openid server must have a end_session_endpoint.
Defaults to `NO` when unset.
|=======================================================================
The tricky part shows up for the imap and smtp sever. SOGo doesn't know the password
of the user and only have its access token. A new auth mechanism has been implemented,
the https://developers.google.com/gmail/imap/xoauth2-protocol#initial_client_response[xoauth2]
You can set it with the parameter _NGImap4AuthMechanism_ and/or _SOGoSMTPAuthenticationType_
*With dovecot:* +
Dovecot natively supports xoauth2 and can be figured as such: https://doc.dovecot.org/2.3/configuration_manual/authentication/oauth2/
*With cyrus:* +
Cyrus doesn't support xoauth2 mechanism and pluggins or homemade solutions must be found. +
_Please note, as Alinto uses dovecot, we didn't investigate cyrus' case. If one member of the community
finds a solution, we will be happy to update this documentation._
As you can see, a new database table is used for handling openid session. The table is automaticcaly created when _OCSOpenIdURL_ is set.
If the user quits the webmail without logging out or trough another application,
the session will stays in the table and be useless. That's why a new sogo-tool command has been added to clean this table.
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
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
@@ -1580,8 +1673,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
@@ -1828,10 +1920,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.
@@ -2068,8 +2159,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.
@@ -2100,8 +2191,7 @@ To disable TLS verification for localhost domains, add
|D |SOGoSMTPAuthenticationType
|Activate SMTP authentication and specifies which type is in use.
Current, only `PLAIN` is supported and other values will cause
the authentication to fail.
Current, Are supported `PLAIN` and 'xoauth2' for openid.
|D |SOGoSMTPMasterUserEnabled
|Enable specific SMTP user account for system e-mails (notifications, reminders, ...). Default is `NO`.
@@ -2129,8 +2219,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.
@@ -2284,6 +2374,7 @@ SASL mechanism. Using `AUTHENTICATE` instead of `LOGIN` is also necessary
to enable UTF-8 characters in users' passwords. To enable simple use of
`AUTHENTICATE` for this purpose, set this setting to `plain`. Please note
that this feature might be limited at this time.
Now support `xoauth2` mechanism when using openid. Be sure you imap server undesrtands this mechanism.
|D |NGImap4ConnectionGroupIdPrefix
|Prefix to prepend to names in IMAP ACL transactions, to indicate the
@@ -2297,8 +2388,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.
@@ -2430,6 +2521,16 @@ appended to the user's vacation message. For example:
See `SOGoVacationHeaderTemplateFile` for available template variables.
|D |SOGoVacationAllowZeroDays
|Parameter used to enable an option of 0 for the vacation days setting.
A value of 0 means that auto response mails are sent for every incoming mail.
This option has to be supported by the IMAP host
(see https://doc.dovecot.org/2.3/settings/pigeonhole-ext/vacation/#pigeonhole_setting-sieve_vacation_min_period
for instructions regarding Dovecot/Pigeonhole).
Defaults to `NO` when unset.
|D |SOGoForwardEnabled
|Parameter used to activate the edition from the preferences window of a
forwarding email address. Requires Sieve script support on the IMAP
@@ -2654,7 +2755,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
@@ -2795,8 +2896,8 @@ SOGoMailJunkSettings = {
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:
@@ -2844,10 +2945,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
@@ -2943,8 +3043,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`.
@@ -2973,8 +3073,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:
@@ -2990,8 +3090,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
@@ -3018,8 +3118,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
@@ -3040,8 +3140,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 :
@@ -3055,11 +3155,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:
@@ -3086,8 +3186,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:
@@ -3120,8 +3220,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.
@@ -3257,8 +3357,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
@@ -3333,8 +3433,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
@@ -3352,11 +3452,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
@@ -3365,8 +3464,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
@@ -3408,8 +3507,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.
@@ -3427,8 +3526,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.
@@ -3476,8 +3575,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
@@ -3486,8 +3585,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:
@@ -3496,8 +3596,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.
@@ -3578,8 +3678,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
@@ -3607,8 +3707,24 @@ sogo-tool checkup user1
sogo-tool checkup -d user1
----
sogo-tool cleanup
~~~~~~~~~~~~~~~~~
[[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.
sogo-tool clean-openid-sessions
Example:
----
sogo-tool clean-openid-sessions
----
=== sogo-tool cleanup
Will purge all user's deleted events and contacts which the deletion is older than a number of days.
@@ -3632,8 +3748,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.
@@ -3650,8 +3765,7 @@ sogo-tool create-folder user2 Calendar Pro_Calendar
----
sogo-tool dump-defaults
~~~~~~~~~~~~~~~~~~~~~~~
=== sogo-tool dump-defaults
Output all current defaults value of GNUstep and SOGo (sogo.conf)
@@ -3668,8 +3782,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
@@ -3688,8 +3802,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).
@@ -3760,8 +3874,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
@@ -3791,8 +3905,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.
@@ -3816,8 +3930,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
@@ -3842,8 +3956,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.
@@ -3861,8 +3975,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.
@@ -3892,8 +4006,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,
@@ -3913,8 +4026,7 @@ Example:
[[sogo-tool-update-secret]]
sogo-tool update-secret
~~~~~~~~~~~~~~~~~~~~~~~
=== sogo-tool update-secret
_New in 5.10_
@@ -3940,8 +4052,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.
@@ -4000,9 +4111,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.
@@ -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 \
+35 -16
View File
@@ -288,16 +288,16 @@ static BOOL debugLeaks;
e = [urlStrings objectEnumerator];
while (ok && (tmp = [e nextObject]))
{
value = [defaults stringForKey: tmp];
if (value)
[self _checkTableWithCM: cm tableURL: value andType: tmp];
else
{
value = [defaults stringForKey: tmp];
if (value)
[self _checkTableWithCM: cm tableURL: value andType: tmp];
else
{
[self errorWithFormat: @"No value specified for '%@'", tmp];
ok = NO;
}
[self errorWithFormat: @"No value specified for '%@'", tmp];
ok = NO;
}
}
if (combined)
{
@@ -322,9 +322,15 @@ static BOOL debugLeaks;
// Create the email alarms table, if required
if ([defaults enableEMailAlarms])
{
[[fm alarmsFolder] createFolderIfNotExists];
}
{
[[fm alarmsFolder] createFolderIfNotExists];
}
//Create mandatory openId table, if used
if([defaults hasOpenIdType])
{
[[fm openIdFolder] createFolderIfNotExists];
}
}
return ok;
@@ -374,8 +380,15 @@ static BOOL debugLeaks;
request = [_ctx request];
login = [SOGoUser getDecryptedUsernameIfNeeded: _key request: request];
user = [SOGoUser userWithLogin: login roles: nil];
if([login isEqualToString: @"changeLanguage"])
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];
@@ -404,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 */
@@ -412,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)
{
@@ -443,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];
}
}
}
+4
View File
@@ -27,6 +27,10 @@ The source code of the SOGo Connector extension for Thunderbird 78+ can be obtai
Please refer to the [FAQ](https://sogo.nu/support.html#/faq) for [compilation instructions](https://sogo.nu/support/faq/how-do-i-compile-sogo.html).
## Dev Container
A dev container is available to use, read more there [read more there](.devcontainer/readme.md)
## Translations
SOGo and its associated components are available in various languages. The following list describes the official translations alongside their maintainers:
+5 -1
View File
@@ -31,7 +31,7 @@
*/
@class NSString, NSArray, NSURL, NSDictionary, NSException;
@class GCSChannelManager, GCSAlarmsFolder, GCSAdminFolder, GCSFolder, GCSFolderType, GCSSessionsFolder;
@class GCSChannelManager, GCSAlarmsFolder, GCSAdminFolder, GCSFolder, GCSFolderType, GCSSessionsFolder, GCSOpenIdFolder;
@interface GCSFolderManager : NSObject
{
@@ -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;
@@ -92,6 +93,9 @@
/* admin */
- (GCSAdminFolder *)adminFolder;
/* openid */
- (GCSOpenIdFolder *) openIdFolder;
/* folder types */
- (GCSFolderType *)folderTypeWithName:(NSString *)_name;
+94
View File
@@ -38,6 +38,7 @@
#import "EOAdaptorChannel+GCS.h"
#import "GCSAlarmsFolder.h"
#import "GCSAdminFolder.h"
#import "GCSOpenIdFolder.h"
#import "GCSFolder.h"
#import "GCSFolderType.h"
#import "GCSSessionsFolder.h"
@@ -504,6 +505,12 @@ static BOOL _singleStoreMode = NO;
return [GCSAdminFolder adminFolderWithFolderManager: self];
}
/* openId */
- (GCSOpenIdFolder *) openIdFolder
{
return [GCSOpenIdFolder openIdFolderWithFolderManager: self];
}
- (NSString *)generateSQLWhereForInternalNames:(NSArray *)_names
exactMatch:(BOOL)_beExact orDirectSubfolderMatch:(BOOL)_directSubs
{
@@ -591,6 +598,27 @@ static BOOL _singleStoreMode = NO;
return sql;
}
- (NSString *)generateSQLPathAndNameFetchForInternalNames:(NSArray *)_names
exactMatch:(BOOL)_beExact orDirectSubfolderMatch:(BOOL)_directSubs
{
/* fetches the 'path' subset for a given quick-names */
NSMutableString *sql;
NSString *ws;
ws = [self generateSQLWhereForInternalNames:_names
exactMatch:_beExact orDirectSubfolderMatch:_directSubs];
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 {
@@ -799,6 +827,72 @@ static BOOL _singleStoreMode = NO;
return result;
}
- (NSArray *)listSubFoldersAndNamesAtPath:(NSString *)_path recursive:(BOOL)_recursive{
NSMutableArray *result;
NSString *fname;
NSArray *fnames, *records;
NSString *sql;
unsigned i, count;
if ((fnames = [self internalNamesFromPath:_path]) == nil) {
[self debugWithFormat:@"got no internal names for path: '%@'", _path];
return nil;
}
sql = [self generateSQLPathAndNameFetchForInternalNames:fnames
exactMatch:NO orDirectSubfolderMatch:(_recursive ? NO : YES)];
if ([sql length] == 0) {
[self debugWithFormat:@"got no SQL for names: %@", fnames];
return nil;
}
if ((records = [self performSQL:sql]) == 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;
+57
View File
@@ -0,0 +1,57 @@
/* GCSAdminFolder.h - this file is part of $PROJECT_NAME_HERE$
*
* Copyright (C) 2023 Alinto
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This file 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef GCSOPENIDFOLDER_H
#define GCSOPENIDOLDER_H
@class NSCalendarDate;
@class NSException;
@class NSNumber;
@class NSString;
@class GCSFolderManager;
@interface GCSOpenIdFolder : NSObject
{
GCSFolderManager *folderManager;
}
+ (id)openIdFolderWithFolderManager:(GCSFolderManager *)newFolderManager;
- (void) setFolderManager: (GCSFolderManager *) newFolderManager;
/* operations */
- (void) createFolderIfNotExists;
- (BOOL) canConnectStore;
- (NSString *) getRefreshToken: (NSString *) _user_session useOldSession: (BOOL) use_old_session;
- (NSString *) getNewToken: (NSString *) _old_session;
- (NSException *) writeOpenIdSession: (NSString *) _user_session
withOldSession: (NSString *) _old_session
withRefreshToken: (NSString *) _refresh_token
withExpire: (NSNumber *) _expire
withRefreshExpire: (NSNumber *) _refresh_expire;
- (NSException *) deleteOpenIdSessionFor: (NSString *) _user_session;
@end
#endif /* GCSALARMSFOLDER_H */
+363
View File
@@ -0,0 +1,363 @@
/* GCSAdminFolder.m - this file is part of SOGo
*
* Copyright (C) 2023 Alinto
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This file 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#import <NGExtensions/NSObject+Logs.h>
#import <NGExtensions/NSNull+misc.h>
#import <GDLAccess/EOAdaptorContext.h>
#import <GDLAccess/EOAttribute.h>
#import <GDLAccess/EOEntity.h>
#import <GDLAccess/EOSQLQualifier.h>
#import "EOQualifier+GCS.h"
#import "GCSChannelManager.h"
#import "GCSFolderManager.h"
#import "GCSSpecialQueries.h"
#import "NSURL+GCS.h"
#import "GCSOpenIdFolder.h"
static NSString *openIdFolderURLString = nil;
#warning GCSOpenIdFolder should share a common ancestor with GCSFolder
@implementation GCSOpenIdFolder
+ (void) initialize
{
NSUserDefaults *ud;
if (!openIdFolderURLString)
{
ud = [NSUserDefaults standardUserDefaults];
ASSIGN (openIdFolderURLString, [ud stringForKey: @"OCSOpenIdURL"]);
}
}
+ (id) openIdFolderWithFolderManager: (GCSFolderManager *) newFolderManager
{
GCSOpenIdFolder *newFolder;
if (openIdFolderURLString)
{
newFolder = [self new];
[newFolder autorelease];
[newFolder setFolderManager: newFolderManager];
}
else
{
[self errorWithFormat: @"'OCSOpenIdURL' is not set"];
newFolder = nil;
}
return newFolder;
}
- (void) setFolderManager: (GCSFolderManager *) newFolderManager
{
ASSIGN (folderManager, newFolderManager);
}
/* accessors */
- (NSURL *) _location
{
NSURL *location;
if (openIdFolderURLString)
location = [NSURL URLWithString: openIdFolderURLString];
else
{
[self warnWithFormat: @"'OCSOpenIdURL' is not set"];
location = nil;
}
return location;
}
- (GCSChannelManager *) _channelManager
{
return [folderManager channelManager];
}
- (NSString *) _storeTableName
{
return [[self _location] gcsTableName];
}
- (EOEntity *) _storeTableEntityForChannel: (EOAdaptorChannel *) tc
{
static EOEntity *entity = nil;
EOAttribute *attribute;
NSString *tableName;
NSString *columns[] = {@"c_user_session", @"c_old_session", @"c_session_started", @"c_refresh_token", @"c_access_token_expires_in", @"c_refresh_token_expires_in", nil };
NSString **column;
NSMutableArray *keys;
NSDictionary *types;
if (!entity)
{
entity = [EOEntity new];
tableName = [self _storeTableName];
[entity setName: tableName];
[entity setExternalName: tableName];
types = [[tc specialQueries] openIdAttributeTypes];
column = columns;
while (*column)
{
attribute = [EOAttribute new];
[attribute setName: *column];
[attribute setColumnName: *column];
[attribute setExternalType: [types objectForKey: *column]];
[entity addAttribute: attribute];
[attribute release];
column++;
}
keys = [NSMutableArray arrayWithCapacity: 1];
[keys addObject: [entity attributeNamed: @"c_user_session"]];
[entity setPrimaryKeyAttributes: keys];
keys = [NSMutableArray arrayWithCapacity: 5];
[keys addObject: [entity attributeNamed: @"c_old_session"]];
[keys addObject: [entity attributeNamed: @"c_session_started"]];
[keys addObject: [entity attributeNamed: @"c_refresh_token"]];
[keys addObject: [entity attributeNamed: @"c_access_token_expires_in"]];
[keys addObject: [entity attributeNamed: @"c_refresh_token_expires_in"]];
[entity setClassProperties: keys];
[entity setAttributesUsedForLocking: [NSArray array]];
}
return entity;
}
/* connection */
- (EOAdaptorChannel *) _acquireStoreChannel
{
return [[self _channelManager] acquireOpenChannelForURL: [self _location]];
}
- (void) _releaseChannel: (EOAdaptorChannel *) _channel
{
[[self _channelManager] releaseChannel:_channel immediately: YES];
}
- (BOOL) canConnectStore
{
return [[self _channelManager] canConnect:[self _location]];
}
- (void) createFolderIfNotExists
{
EOAdaptorChannel *tc;
NSString *sql, *tableName;
GCSSpecialQueries *queries;
tc = [self _acquireStoreChannel];
tableName = [self _storeTableName];
queries = [tc specialQueries];
sql = [NSString stringWithFormat: @"SELECT 1 FROM %@ WHERE 1 = 2", tableName];
if ([tc evaluateExpressionX: sql])
{
sql = [queries createOpenIdFolderWithName: tableName];
if (![tc evaluateExpressionX: sql])
[self logWithFormat: @"openid folder table '%@' successfully created!", tableName];
}
else
[tc cancelFetch];
[self _releaseChannel: tc];
}
/* operations */
/* table has the following fields:
c_user_session varchar(255) NOT NULL,
c_session_started int(11) NOT NULL,
c_refresh_token varchar(4096) DEFAULT '',
c_access_token_expires_in int(11) NOT NULL,
c_refresh_token_expires_in int(11) DEFAULT NULL,
*/
- (NSDictionary *) recordForSession: (NSString *) _user_session useOldSession: (BOOL) use_old_session
{
EOAdaptorChannel *tc;
EOAdaptorContext *context;
NSException *error;
NSArray *attrs;
NSDictionary *record;
EOEntity *entity;
EOSQLQualifier *qualifier;
record = nil;
tc = [self _acquireStoreChannel];
if (tc)
{
context = [tc adaptorContext];
entity = [self _storeTableEntityForChannel: tc];
if(!use_old_session)
qualifier = [[EOSQLQualifier alloc] initWithEntity: entity
qualifierFormat: @"c_user_session='%@'", _user_session];
else
qualifier = [[EOSQLQualifier alloc] initWithEntity: entity
qualifierFormat: @"c_old_session='%@'", _user_session];
[qualifier autorelease];
[context beginTransaction];
error = [tc selectAttributesX: [entity attributesUsedForFetch]
describedByQualifier: qualifier
fetchOrder: nil
lock: NO];
if (error)
[self errorWithFormat:@"%s: cannot execute fetch: %@", __PRETTY_FUNCTION__, error];
else
{
attrs = [tc describeResults: NO];
record = [tc fetchAttributes: attrs withZone: NULL];
[tc cancelFetch];
}
[context rollbackTransaction];
[self _releaseChannel: tc];
}
return record;
}
- (NSString *) getRefreshToken: (NSString *) _user_session
{
NSDictionary *r;
r = [self recordForSession: _user_session useOldSession: NO];
if (r && [r objectForKey:@"c_refresh_token"])
return [r objectForKey:@"c_refresh_token"];
return nil;
}
- (NSString *) getNewToken: (NSString *) _old_session
{
NSDictionary *r;
r = [self recordForSession: _old_session useOldSession: YES];
if (r && [r objectForKey:@"c_user_session"])
return [r objectForKey:@"c_user_session"];
return nil;
}
- (NSException *) writeOpenIdSession: (NSString *) _user_session
withOldSession: (NSString *) _old_session
withRefreshToken: (NSString *) _refresh_token
withExpire: (NSNumber *) _expire
withRefreshExpire: (NSNumber *) _refresh_expire
{
NSDictionary *record, *newRecord;
NSException *error;
NSCalendarDate *nowDate;
int now, nowExpire, nowRefreshExpire;
EOAdaptorChannel *tc;
EOAdaptorContext *context;
EOEntity *entity;
EOSQLQualifier *qualifier;
error = nil;
tc = [self _acquireStoreChannel];
if (tc)
{
context = [tc adaptorContext];
nowDate = [NSCalendarDate date];
now = (nowDate ? (int)[nowDate timeIntervalSince1970] : 0);
nowExpire = now + [_expire intValue];
if(_refresh_expire)
nowRefreshExpire = now + [_refresh_expire intValue];
else
nowRefreshExpire = -1;
if(!_old_session)
_old_session = @"";
newRecord = [NSDictionary dictionaryWithObjectsAndKeys: _user_session, @"c_user_session",
_old_session, @"c_old_session",
[NSNumber numberWithInt:now], @"c_session_started",
[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];
entity = [self _storeTableEntityForChannel: tc];
[context beginTransaction];
if (!record)
{
//If the session already exist no need to update it as it is unique
error = [tc insertRowX: newRecord forEntity: entity];
}
if (error)
{
[context rollbackTransaction];
[self errorWithFormat:@"%s: cannot write record: %@", __PRETTY_FUNCTION__, error];
}
else
[context commitTransaction];
[self _releaseChannel: tc];
}
return error;
}
- (NSException *) deleteOpenIdSessionFor: (NSString *) _user_session
{
EOAdaptorChannel *tc;
EOAdaptorContext *context;
EOEntity *entity;
EOSQLQualifier *qualifier;
NSException *error;
error = nil;
tc = [self _acquireStoreChannel];
if (tc)
{
context = [tc adaptorContext];
entity = [self _storeTableEntityForChannel: tc];
qualifier = [[EOSQLQualifier alloc] initWithEntity: entity
qualifierFormat: @"c_user_session='%@'",_user_session];
[qualifier autorelease];
[context beginTransaction];
error = [tc deleteRowsDescribedByQualifierX: qualifier];
if (error)
{
[context rollbackTransaction];
[self errorWithFormat:@"%s: cannot delete record: %@", __PRETTY_FUNCTION__, error];
}
else
[context commitTransaction];
[self _releaseChannel: tc];
}
return error;
}
@end
+3
View File
@@ -42,6 +42,9 @@
- (NSString *)createAdminFolderWithName:(NSString *)tableName;
- (NSDictionary *)adminAttributeTypes;
- (NSString *)createOpenIdFolderWithName:(NSString *)tableName;
- (NSDictionary *)openIdAttributeTypes;
- (NSString *) updateCPathInFolderInfo:(NSString *)tableName
withCPath2:(NSString *)c_path2;
+114 -3
View File
@@ -95,6 +95,21 @@
return nil;
}
- (NSString *) createOpenIdFolderWithName: (NSString *) tableName
{
[self subclassResponsibility: _cmd];
return nil;
}
- (NSDictionary *) openIdAttributeTypes
{
[self subclassResponsibility: _cmd];
return nil;
}
- (NSString *) createFolderTableWithName: (NSString *) tableName
{
[self subclassResponsibility: _cmd];
@@ -195,6 +210,38 @@
return types;
}
- (NSString *) createOpenIdFolderWithName: (NSString *) tableName
{
static NSString *sqlFolderFormat
= (@"CREATE TABLE %@ ("
@" c_user_session TEXT NOT NULL,"
@" c_old_session TEXT NULL,"
@" c_session_started 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];
}
- (NSDictionary *) openIdAttributeTypes
{
static NSMutableDictionary *types = nil;
if (!types)
{
types = [NSMutableDictionary new];
[types setObject: @"varchar" forKey: @"c_user_session"];
[types setObject: @"varchar" forKey: @"c_old_session"];
[types setObject: @"int" forKey: @"c_session_started"];
[types setObject: @"varchar" forKey: @"c_refresh_token"];
[types setObject: @"int" forKey: @"c_access_token_expires_in"];
[types setObject: @"int" forKey: @"c_refresh_token_expires_in"];
}
return types;
}
- (NSString *) createFolderTableWithName: (NSString *) tableName
{
static NSString *sqlFolderFormat
@@ -227,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)");
@@ -324,6 +371,38 @@
return types;
}
- (NSString *) createOpenIdFolderWithName: (NSString *) tableName
{
static NSString *sqlFolderFormat
= (@"CREATE TABLE %@ ("
@" c_user_session TEXT NOT NULL,"
@" c_old_session TEXT NULL,"
@" c_session_started 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];
}
- (NSDictionary *) openIdAttributeTypes
{
static NSMutableDictionary *types = nil;
if (!types)
{
types = [NSMutableDictionary new];
[types setObject: @"varchar" forKey: @"c_user_session"];
[types setObject: @"varchar" forKey: @"c_old_session"];
[types setObject: @"int" forKey: @"c_session_started"];
[types setObject: @"varchar" forKey: @"c_refresh_token"];
[types setObject: @"int" forKey: @"c_access_token_expires_in"];
[types setObject: @"int" forKey: @"c_refresh_token_expires_in"];
}
return types;
}
- (NSString *) createFolderTableWithName: (NSString *) tableName
{
static NSString *sqlFolderFormat
@@ -356,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)");
@@ -453,6 +532,38 @@
return types;
}
- (NSString *) createOpenIdFolderWithName: (NSString *) tableName
{
static NSString *sqlFolderFormat
= (@"CREATE TABLE %@ ("
@" c_user_session VARCHAR2(8192) NOT NULL,"
@" c_old_session VARCHAR2(8192) NULL,"
@" c_session_started 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];
}
- (NSDictionary *) openIdAttributeTypes
{
static NSMutableDictionary *types = nil;
if (!types)
{
types = [NSMutableDictionary new];
[types setObject: @"varchar2" forKey: @"c_user_session"];
[types setObject: @"varchar2" forKey: @"c_old_session"];
[types setObject: @"integer" forKey: @"c_session_started"];
[types setObject: @"varchar2" forKey: @"c_refresh_token"];
[types setObject: @"integer" forKey: @"c_access_token_expires_in"];
[types setObject: @"integer" forKey: @"c_refresh_token_expires_in"];
}
return types;
}
- (NSString *) createFolderTableWithName: (NSString *) tableName
{
static NSString *sqlFolderFormat
@@ -484,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)");
+6 -4
View File
@@ -28,13 +28,14 @@ libGDLContentStore_HEADER_FILES += \
GCSAdminFolder.h \
GCSContext.h \
GCSFieldInfo.h \
GCSFolder.h \
GCSFolder.h \
GCSFolderManager.h \
GCSFolderType.h \
GCSChannelManager.h \
GCSOpenIdFolder.h \
GCSSessionsFolder.h \
GCSSpecialQueries.h \
GCSStringFormatter.h \
GCSStringFormatter.h \
libGDLContentStore_OBJC_FILES += \
NSURL+GCS.m \
@@ -45,13 +46,14 @@ libGDLContentStore_OBJC_FILES += \
GCSAdminFolder.m \
GCSContext.m \
GCSFieldInfo.m \
GCSFolder.m \
GCSFolder.m \
GCSFolderManager.m \
GCSFolderType.m \
GCSChannelManager.m \
GCSOpenIdFolder.m \
GCSSessionsFolder.m \
GCSSpecialQueries.m \
GCSStringFormatter.m \
GCSStringFormatter.m \
# framework support
+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
Loaded 100 of 881 files, more files were not shown because too many files have changed in this diff. Show more