From 4a5818957b7ea9ded4aabc89e78c9fcdbda55432 Mon Sep 17 00:00:00 2001 From: Stefan Becker Date: Fri, 12 Jul 2013 17:33:16 +0300 Subject: [PATCH] cal: drop old EWS autodiscover implementation --- src/core/sipe-cal.c | 9 +-- src/core/sipe-cal.h | 6 +- src/core/sipe-domino.c | 2 +- src/core/sipe-ews.c | 197 +++++++------------------------------------------ 4 files changed, 34 insertions(+), 180 deletions(-) diff --git a/src/core/sipe-cal.c b/src/core/sipe-cal.c index 85b784ad..4958171c 100644 --- a/src/core/sipe-cal.c +++ b/src/core/sipe-cal.c @@ -194,9 +194,8 @@ sipe_cal_calendar_free(struct sipe_calendar *cal) } } -gboolean -sipe_cal_calendar_init(struct sipe_core_private *sipe_private, - gboolean *has_url) +void +sipe_cal_calendar_init(struct sipe_core_private *sipe_private) { if (!sipe_private->calendar) { struct sipe_calendar *cal; @@ -209,7 +208,6 @@ sipe_cal_calendar_init(struct sipe_core_private *sipe_private, /* user specified a service URL? */ value = sipe_backend_setting(SIPE_CORE_PUBLIC, SIPE_SETTING_EMAIL_URL); - if (has_url) *has_url = !is_empty(value); if (!is_empty(value)) { cal->as_url = g_strdup(value); cal->oof_url = g_strdup(value); @@ -229,9 +227,8 @@ sipe_cal_calendar_init(struct sipe_core_private *sipe_private, SIPE_SETTING_EMAIL_PASSWORD)); g_strfreev(domain_user); } - return TRUE; } - return FALSE; + return; } diff --git a/src/core/sipe-cal.h b/src/core/sipe-cal.h index 59514542..348ead85 100644 --- a/src/core/sipe-cal.h +++ b/src/core/sipe-cal.h @@ -59,7 +59,6 @@ struct sipe_calendar { int state; char *email; char *legacy_dn; - int auto_disco_method; int is_ews_disabled; int is_domino_disabled; int is_updated; @@ -100,9 +99,8 @@ sipe_cal_events_free(GSList *cal_events); void sipe_cal_calendar_free(struct sipe_calendar *cal); -gboolean -sipe_cal_calendar_init(struct sipe_core_private *sipe_private, - gboolean *has_url); +void +sipe_cal_calendar_init(struct sipe_core_private *sipe_private); /** * Returns hash of Calendar Event for comparison. diff --git a/src/core/sipe-domino.c b/src/core/sipe-domino.c index 6bf3f772..9fed1057 100755 --- a/src/core/sipe-domino.c +++ b/src/core/sipe-domino.c @@ -549,7 +549,7 @@ sipe_domino_update_calendar(struct sipe_core_private *sipe_private) SIPE_DEBUG_INFO_NOFORMAT("sipe_domino_update_calendar: started."); - sipe_cal_calendar_init(sipe_private, NULL); + sipe_cal_calendar_init(sipe_private); /* check if URL is valid if provided */ cal = sipe_private->calendar; diff --git a/src/core/sipe-ews.c b/src/core/sipe-ews.c index c20fd0dc..54625a1d 100644 --- a/src/core/sipe-ews.c +++ b/src/core/sipe-ews.c @@ -147,14 +147,11 @@ be great to implement too. "" #define SIPE_EWS_STATE_NONE 0 -#define SIPE_EWS_STATE_AUTODISCOVER_SUCCESS 1 -#define SIPE_EWS_STATE_AUTODISCOVER_1_FAILURE -1 -#define SIPE_EWS_STATE_AUTODISCOVER_2_FAILURE -2 -#define SIPE_EWS_STATE_AUTODISCOVER_3_FAILURE -3 -#define SIPE_EWS_STATE_AVAILABILITY_SUCCESS 4 -#define SIPE_EWS_STATE_AVAILABILITY_FAILURE -4 -#define SIPE_EWS_STATE_OOF_SUCCESS 5 -#define SIPE_EWS_STATE_OOF_FAILURE -5 +#define SIPE_EWS_STATE_IDLE 1 +#define SIPE_EWS_STATE_AVAILABILITY_SUCCESS 2 +#define SIPE_EWS_STATE_AVAILABILITY_FAILURE -2 +#define SIPE_EWS_STATE_OOF_SUCCESS 3 +#define SIPE_EWS_STATE_OOF_FAILURE -3 char * sipe_ews_get_oof_note(struct sipe_calendar *cal) @@ -368,81 +365,6 @@ static void sipe_ews_process_oof_response(SIPE_UNUSED_PARAMETER struct sipe_core } } -static void sipe_ews_process_autodiscover(SIPE_UNUSED_PARAMETER struct sipe_core_private *sipe_private, - guint status, - SIPE_UNUSED_PARAMETER GSList *headers, - const gchar *body, - gpointer data) -{ - struct sipe_calendar *cal = data; - - SIPE_DEBUG_INFO_NOFORMAT("sipe_ews_process_autodiscover: cb started."); - - cal->request = NULL; - - if ((status == SIPE_HTTP_STATUS_OK) && body) { - const sipe_xml *node; - /** ref: [MS-OXDSCLI] */ - sipe_xml *xml = sipe_xml_parse(body, strlen(body)); - - /* Autodiscover/Response/User/LegacyDN (trim()) */ - cal->legacy_dn = sipe_xml_data(sipe_xml_child(xml, "Response/User/LegacyDN")); - cal->legacy_dn = cal->legacy_dn ? g_strstrip(cal->legacy_dn) : NULL; - - /* Protocols */ - for (node = sipe_xml_child(xml, "Response/Account/Protocol"); - node; - node = sipe_xml_twin(node)) - { - char *type = sipe_xml_data(sipe_xml_child(node, "Type")); - if (sipe_strequal("EXCH", type)) { - cal->as_url = sipe_xml_data(sipe_xml_child(node, "ASUrl")); - cal->oof_url = sipe_xml_data(sipe_xml_child(node, "OOFUrl")); - cal->oab_url = sipe_xml_data(sipe_xml_child(node, "OABUrl")); - - SIPE_DEBUG_INFO("sipe_ews_process_autodiscover:as_url %s", - cal->as_url ? cal->as_url : ""); - SIPE_DEBUG_INFO("sipe_ews_process_autodiscover:oof_url %s", - cal->oof_url ? cal->oof_url : ""); - SIPE_DEBUG_INFO("sipe_ews_process_autodiscover:oab_url %s", - cal->oab_url ? cal->oab_url : ""); - - g_free(type); - break; - } else { - g_free(type); - continue; - } - } - - sipe_xml_free(xml); - - cal->state = SIPE_EWS_STATE_AUTODISCOVER_SUCCESS; - sipe_ews_run_state_machine(cal); - - } else if ((status == SIPE_HTTP_STATUS_CLIENT_FORBIDDEN) && cal->retry) { - /* - * Authentication succeeded but we still weren't allowed to view the page. - * At least at our work place this error is temporary, i.e. the next access - * with the exact same authentication succeeds. Simply retry once. - */ - SIPE_DEBUG_INFO_NOFORMAT("sipe_ews_process_autodiscover: failed, let's retry once."); - sipe_ews_run_state_machine(cal); - cal->retry = FALSE; - - } else { - switch (cal->auto_disco_method) { - case 1: - cal->state = SIPE_EWS_STATE_AUTODISCOVER_1_FAILURE; break; - case 2: - cal->state = SIPE_EWS_STATE_AUTODISCOVER_2_FAILURE; break; - case 3: - cal->state = SIPE_EWS_STATE_AUTODISCOVER_3_FAILURE; break; - } - sipe_ews_run_state_machine(cal); - } -} - static void sipe_ews_send_http_request(struct sipe_calendar *cal) { if (cal->request) { @@ -452,27 +374,6 @@ static void sipe_ews_send_http_request(struct sipe_calendar *cal) } } -static void sipe_ews_do_autodiscover(struct sipe_calendar *cal, - const gchar *autodiscover_url) -{ - gchar *body; - - SIPE_DEBUG_INFO("sipe_ews_do_autodiscover: going autodiscover url=%s", - autodiscover_url ? autodiscover_url : ""); - - body = g_strdup_printf(SIPE_EWS_AUTODISCOVER_REQUEST, cal->email); - cal->request = sipe_http_request_post(cal->sipe_private, - autodiscover_url, - NULL, - body, - "text/xml", - sipe_ews_process_autodiscover, - cal); - g_free(body); - - sipe_ews_send_http_request(cal); -} - static void sipe_ews_do_avail_request(struct sipe_calendar *cal) { if (cal->as_url) { @@ -539,65 +440,25 @@ static void sipe_ews_run_state_machine(struct sipe_calendar *cal) { switch (cal->state) { - case SIPE_EWS_STATE_NONE: - { - char *maildomain = strstr(cal->email, "@") + 1; - char *autodisc_url = g_strdup_printf("https://Autodiscover.%s/Autodiscover/Autodiscover.xml", maildomain); - - cal->retry = TRUE; - cal->auto_disco_method = 1; - - sipe_ews_do_autodiscover(cal, autodisc_url); - - g_free(autodisc_url); - break; - } - case SIPE_EWS_STATE_AUTODISCOVER_1_FAILURE: - { - char *maildomain = strstr(cal->email, "@") + 1; - char *autodisc_url = g_strdup_printf("http://Autodiscover.%s/Autodiscover/Autodiscover.xml", maildomain); - - cal->retry = TRUE; - cal->auto_disco_method = 2; - - sipe_ews_do_autodiscover(cal, autodisc_url); - - g_free(autodisc_url); - break; - } - case SIPE_EWS_STATE_AUTODISCOVER_2_FAILURE: - { - char *maildomain = strstr(cal->email, "@") + 1; - char *autodisc_url = g_strdup_printf("https://%s/Autodiscover/Autodiscover.xml", maildomain); - - cal->retry = TRUE; - cal->auto_disco_method = 3; - - sipe_ews_do_autodiscover(cal, autodisc_url); - - g_free(autodisc_url); - break; - } - case SIPE_EWS_STATE_AUTODISCOVER_3_FAILURE: - case SIPE_EWS_STATE_AVAILABILITY_FAILURE: - case SIPE_EWS_STATE_OOF_FAILURE: - cal->is_ews_disabled = TRUE; - break; - case SIPE_EWS_STATE_AUTODISCOVER_SUCCESS: - sipe_ews_do_avail_request(cal); - break; - case SIPE_EWS_STATE_AVAILABILITY_SUCCESS: - sipe_ews_do_oof_request(cal); - break; - case SIPE_EWS_STATE_OOF_SUCCESS: + case SIPE_EWS_STATE_AVAILABILITY_FAILURE: + case SIPE_EWS_STATE_OOF_FAILURE: + cal->is_ews_disabled = TRUE; + break; + case SIPE_EWS_STATE_IDLE: + sipe_ews_do_avail_request(cal); + break; + case SIPE_EWS_STATE_AVAILABILITY_SUCCESS: + sipe_ews_do_oof_request(cal); + break; + case SIPE_EWS_STATE_OOF_SUCCESS: { struct sipe_core_private *sipe_private = cal->sipe_private; - cal->state = SIPE_EWS_STATE_AUTODISCOVER_SUCCESS; + cal->state = SIPE_EWS_STATE_IDLE; cal->is_updated = TRUE; sipe_cal_presence_publish(sipe_private, TRUE); - break; } + break; } } @@ -608,7 +469,12 @@ static void sipe_calendar_ews_autodiscover_cb(SIPE_UNUSED_PARAMETER struct sipe_ struct sipe_calendar *cal = callback_data; if (ews_data) { - /* @TODO */ + cal->as_url = g_strdup(ews_data->as_url); + cal->legacy_dn = g_strdup(ews_data->legacy_dn); + cal->oab_url = g_strdup(ews_data->oab_url); + cal->oof_url = g_strdup(ews_data->oof_url); + cal->state = SIPE_EWS_STATE_IDLE; + sipe_ews_run_state_machine(cal); } else { SIPE_DEBUG_INFO_NOFORMAT("sipe_calendar_ews_autodiscover_cb: EWS disabled"); cal->is_ews_disabled = TRUE; @@ -619,26 +485,19 @@ void sipe_ews_update_calendar(struct sipe_core_private *sipe_private) { //char *autodisc_srv = g_strdup_printf("_autodiscover._tcp.%s", maildomain); struct sipe_calendar *cal; - gboolean has_url = FALSE; SIPE_DEBUG_INFO_NOFORMAT("sipe_ews_update_calendar: started."); - sipe_cal_calendar_init(sipe_private, &has_url); + sipe_cal_calendar_init(sipe_private); cal = sipe_private->calendar; - if (!cal->ews_autodiscover_triggered) { + if (cal->is_ews_disabled) { + SIPE_DEBUG_INFO_NOFORMAT("sipe_ews_update_calendar: disabled, exiting."); + } else if (!cal->as_url && !cal->ews_autodiscover_triggered) { cal->ews_autodiscover_triggered = TRUE; sipe_ews_autodiscover_start(sipe_private, sipe_calendar_ews_autodiscover_cb, cal); - - /* @TODO: remove once refactor is complete */ - if (has_url) - cal->state = SIPE_EWS_STATE_AUTODISCOVER_SUCCESS; - } - - if (cal->is_ews_disabled) { - SIPE_DEBUG_INFO_NOFORMAT("sipe_ews_update_calendar: disabled, exiting."); } else { sipe_ews_run_state_machine(cal); SIPE_DEBUG_INFO_NOFORMAT("sipe_ews_update_calendar: finished."); -- 2.11.4.GIT