From patchwork Fri Mar 26 10:49:31 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chris Talbot X-Patchwork-Id: 12166317 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 58A9BC433E0 for ; Fri, 26 Mar 2021 10:50:18 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 22D626199F for ; Fri, 26 Mar 2021 10:50:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229730AbhCZKtq (ORCPT ); Fri, 26 Mar 2021 06:49:46 -0400 Received: from out2-smtp.messagingengine.com ([66.111.4.26]:51825 "EHLO out2-smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229782AbhCZKtd (ORCPT ); Fri, 26 Mar 2021 06:49:33 -0400 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id 9FFA75C14DD for ; Fri, 26 Mar 2021 06:49:32 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute4.internal (MEProxy); Fri, 26 Mar 2021 06:49:32 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=talbothome.com; h=message-id:subject:from:to:date:content-type:mime-version :content-transfer-encoding; s=fm2; bh=g3hZHxLzn2ulW9ihpuUJr6or9L NEkKTtgdkUxo7ws3I=; b=0bNoVPdvB1MdpE1sBY5CogHF/m/1JhrkRj8GE5v2z+ VGa5P5gZJPVZg0hTO1G0Wf2pNO1cYFilZIQz/dUbNWkXr3sv64h08XlsESpXcWoe eFU7YsxnYg62C0t55e37Hm4wpnRkK5Z2HGeVbBpCun+TNfLI7dssFwyhmGZF8YV4 By3vjXJSXPzqsTBX3nchN1F116jjv2R4SchmOMB/jC/DE0yylIUfMFoPvt4klDkJ nWEnP0k2k5frBMy/Vw+A5C1cTIQtzO9tt3ljyuph2v35rusHJsq6FowgK2nrUJsO 8XJ+7gjPDLskxRK8Qd/gL/TwF0mBdUWPkxAHu2O+sJrw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=content-transfer-encoding:content-type :date:from:message-id:mime-version:subject:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm2; bh=g3hZHx Lzn2ulW9ihpuUJr6or9LNEkKTtgdkUxo7ws3I=; b=AOSLEHvfs9xzLHDllsjpGd fKNuMAuVkIzZfu6aI/jqZXHfODmxHBpZbx5L73gg3RnHT64nYauaJepkVYTzpm+O UijnmQ1v2iI9pj1PsEOd3sfuFbLtDQ2T1eiCDmbZI4YKwkqFNSZgUUESxkgmKBED 61kdgvjeMBQjUzS0nGeO7Pmoc4M5zibpMVBLkWS71uKh45MDl4YhLHdUqHft1uVJ nbpc96bD7fhzDqBFa0qI5+fou6VAlzUwsDbnyZCnaAOUHx9dcbIMaVVHOlOc41F6 l9FrFnM7zEdZ4xFRVRee9p8eFij/RRMh3qorsyYk169XJ1JMXSHpS/tCmlYaxT4Q == X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduledrudehvddgvddtucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucgovfgvgihtqfhnlhihqddqteefjeefqddtgeculd ehtddmnecujfgurhepkffuhffvffgtfggggfesthejredttderjeenucfhrhhomhepvehh rhhishhtohhphhgvrhcuvfgrlhgsohhtuceotghhrhhishesthgrlhgsohhthhhomhgvrd gtohhmqeenucggtffrrghtthgvrhhnpeejudehtdelfffhkedvudelteeffeefgfeugfdu vdeltdefheeghfdvgfeijeevhfenucffohhmrghinhepshhrrdhhthenucfkphepjedvrd elhedrvdegfedrudehieenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgr ihhlfhhrohhmpegthhhrihhssehtrghlsghothhhohhmvgdrtghomh X-ME-Proxy: Received: from SpaceballstheLaptop.talbothome.com (unknown [72.95.243.156]) by mail.messagingengine.com (Postfix) with ESMTPA id 53D06240066 for ; Fri, 26 Mar 2021 06:49:32 -0400 (EDT) Message-ID: Subject: [PATCH 1/9] Fix mmsd to work with T-mobile From: Christopher Talbot To: netdev@vger.kernel.org Date: Fri, 26 Mar 2021 06:49:31 -0400 User-Agent: Evolution 3.30.5-1.1 MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This patch is based off of anteater's patch to enable T-Mobile ( https://git.sr.ht/~anteater/mmsd), but fixes a couple of hacks that were in it --- Makefile.am | 3 +- gweb/gresolv.c | 73 ++++++++++++++- gweb/gweb.c | 1 + plugins/ofono.c | 11 ++- src/mmsutil.c | 233 ++++++++++++++++++++++++++++++++++++++-------- src/mmsutil.h | 17 ++++ src/service.c | 58 ++++++++++-- test/send-message | 24 ++--- 8 files changed, 356 insertions(+), 64 deletions(-) attachments.append(dbus.Struct((dbus.String(r[0]), @@ -64,4 +64,4 @@ for a in sys.argv[3:]: path = service.SendMessage(recipients, smil, attachments) -print path +print(path) diff --git a/Makefile.am b/Makefile.am index ee2c715..99fdb76 100644 --- a/Makefile.am +++ b/Makefile.am @@ -88,7 +88,8 @@ unit_test_wsputil_SOURCES = unit/test-wsputil.c src/wsputil.c src/wsputil.h unit_test_wsputil_LDADD = @GLIB_LIBS@ unit_test_mmsutil_SOURCES = unit/test-mmsutil.c src/mmsutil.c src/mmsutil.h \ - src/wsputil.c src/wsputil.h + src/wsputil.c src/wsputil.h \ + src/log.c src/log.h unit_test_mmsutil_LDADD = @GLIB_LIBS@ TESTS = unit/test-wsputil unit/test-mmsutil diff --git a/gweb/gresolv.c b/gweb/gresolv.c index 79abc9b..bb1c32d 100644 --- a/gweb/gresolv.c +++ b/gweb/gresolv.c @@ -35,6 +35,7 @@ #include #include #include +#include #include "gresolv.h" @@ -764,13 +765,15 @@ static int connect_udp_channel(struct resolv_nameserver *nameserver) return -EINVAL; sk = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); + const int so_reuseaddr = 1; + setsockopt(sk, SOL_SOCKET, SO_REUSEADDR, &so_reuseaddr, sizeof so_reuseaddr); if (sk < 0) { freeaddrinfo(rp); return -EIO; } /* - * If nameserver points to localhost ip, their is no need to + * If nameserver points to localhost ip, there is no need to * bind the socket on any interface. */ if (nameserver->resolv->index > 0 && @@ -780,12 +783,63 @@ static int connect_udp_channel(struct resolv_nameserver *nameserver) memset(interface, 0, IF_NAMESIZE); if (if_indextoname(nameserver->resolv->index, interface) != NULL) { - if (setsockopt(sk, SOL_SOCKET, SO_BINDTODEVICE, - interface, IF_NAMESIZE) < 0) { + /* set up bind address */ + struct sockaddr_storage bind_addr; + int addr_size = 0; + memset(&bind_addr, 0, sizeof(bind_addr)); + bind_addr.ss_family = rp->ai_family; + + struct ifaddrs *ifa, *ifa_tmp; + if (getifaddrs(&ifa) == -1) { + perror("getifaddrs failed"); + return -errno; + } + ifa_tmp = ifa; + while (ifa_tmp) { + if (!strcmp(ifa_tmp->ifa_name, interface) && + ifa_tmp->ifa_addr) { + if (ifa_tmp->ifa_addr- >sa_family != rp->ai_family) { + printf("fam %d != expected %d\n", ifa_tmp->ifa_addr->sa_family, rp->ai_family); + ifa_tmp = ifa_tmp- >ifa_next; + continue; + } + if (ifa_tmp->ifa_addr- >sa_family == AF_INET) { + struct sockaddr_in *bind_addr4 = (struct sockaddr_in *)&bind_addr; + bind_addr4- >sin_addr.s_addr = ((struct sockaddr_in *)ifa_tmp->ifa_addr)- >sin_addr.s_addr; + bind_addr4->sin_port = 53; + printf("addr = %s\n", inet_ntoa(bind_addr4->sin_addr)); + addr_size = sizeof(*bind_addr4); + } else if (ifa_tmp->ifa_addr- >sa_family == AF_INET6) { + struct sockaddr_in6 *bind_addr6 = (struct sockaddr_in6 *)&bind_addr; + bind_addr6->sin6_addr = ((struct sockaddr_in6 *)ifa_tmp->ifa_addr)->sin6_addr; + bind_addr6->sin6_port = 53; + char buf[64]; + inet_ntop(AF_INET6, bind_addr6->sin6_addr.s6_addr, buf, 64); + printf("addr = %s\n", buf); + addr_size = sizeof(*bind_addr6); + } else { + printf("unknown fam\n"); + } + break; + } + ifa_tmp = ifa_tmp->ifa_next; + } + +/* if (bind_addr. && bind_addr.sin_addr.s_addr == 0) { + printf("interface not found\n"); + } + + if (bind_addr.sin6_addr.s_addr == 0) { + printf("interface6 not found\n"); + }*/ + + if (bind(sk, (struct sockaddr *)&bind_addr, addr_size) < 0) { + perror("bind failed"); close(sk); freeaddrinfo(rp); return -EIO; } + freeifaddrs(ifa); } } @@ -896,6 +950,7 @@ void g_resolv_set_debug(GResolv *resolv, GResolvDebugFunc func, gboolean g_resolv_add_nameserver(GResolv *resolv, const char *address, uint16_t port, unsigned long flags) { + printf ("adding nameserver %s\n", address); struct resolv_nameserver *nameserver; if (resolv == NULL) @@ -911,6 +966,7 @@ gboolean g_resolv_add_nameserver(GResolv *resolv, const char *address, nameserver->resolv = resolv; if (connect_udp_channel(nameserver) < 0) { + printf ("connect_udp_channel failed!\n"); free_nameserver(nameserver); return FALSE; } @@ -977,6 +1033,9 @@ guint g_resolv_lookup_hostname(GResolv *resolv, const char *hostname, if (resolv->nameserver_list == NULL) { int i; + printf("g_resolv_lookup_hostname: nameserver_list NULL\n"); + + printf("g_resolv_lookup_hostname: nscount=%d\n", resolv->res.nscount); for (i = 0; i < resolv->res.nscount; i++) { char buf[100]; @@ -989,15 +1048,19 @@ guint g_resolv_lookup_hostname(GResolv *resolv, const char *hostname, sa_addr = &resolv- >res._u._ext.nsaddrs[i]->sin6_addr; } - if (family != AF_INET && family != AF_INET6) + if (family != AF_INET && family != AF_INET6) { + printf("g_resolv_lookup_hostname: skipping b/c family=%d\n", family); continue; + } if (inet_ntop(family, sa_addr, buf, sizeof(buf))) g_resolv_add_nameserver(resolv, buf, 53, 0); } - if (resolv->nameserver_list == NULL) + if (resolv->nameserver_list == NULL) { + printf("g_resolv_lookup_hostname: nameserver_list *still* NULL\n"); g_resolv_add_nameserver(resolv, "127.0.0.1", 53, 0); + } } lookup = g_try_new0(struct resolv_lookup, 1); diff --git a/gweb/gweb.c b/gweb/gweb.c index 4c2f95c..f72e137 100644 --- a/gweb/gweb.c +++ b/gweb/gweb.c @@ -1008,6 +1008,7 @@ static inline int bind_socket(int sk, int index, int family) if (if_indextoname(index, interface) == NULL) return -1; + printf("binding %s\n", interface); err = setsockopt(sk, SOL_SOCKET, SO_BINDTODEVICE, interface, IF_NAMESIZE); if (err < 0) diff --git a/plugins/ofono.c b/plugins/ofono.c index e7324a7..24a147a 100644 --- a/plugins/ofono.c +++ b/plugins/ofono.c @@ -396,11 +396,14 @@ static void check_context_active(struct modem_data *modem, g_free(modem->context_proxy); modem->context_proxy = NULL; + DBG("context_active = false"); mms_service_bearer_notify(modem->service, FALSE, NULL, NULL); - } else if (modem->context_proxy != NULL) + } else if (modem->context_proxy != NULL) { + DBG("nonnull proxy"); mms_service_bearer_notify(modem->service, TRUE, modem- >context_interface, modem->context_proxy); + } } static void check_context_settings(struct modem_data *modem, @@ -452,6 +455,7 @@ static void check_context_settings(struct modem_data *modem, if (modem->context_active == FALSE) return; + DBG("about to bearer_notify"); mms_service_bearer_notify(modem->service, TRUE, modem->context_interface, modem->context_proxy); @@ -692,6 +696,7 @@ static void set_context_reply(DBusPendingCall *call, void *user_data) dbus_error_init(&err); if (dbus_set_error_from_message(&err, reply) == TRUE) { + DBG("set_ctx reply failure (%s: %s), about to bearer_notify", err.name, err.message); dbus_error_free(&err); mms_service_bearer_notify(modem->service, FALSE, NULL, NULL); } @@ -739,15 +744,17 @@ static void bearer_handler(mms_bool_t active, void *user_data) { struct modem_data *modem = user_data; - DBG("path %s active %d", modem->path, active); + DBG("path %s active %d context_active %d", modem->path, active, modem->context_active); if (active == TRUE && modem->context_active == TRUE) { + DBG("active and context_active, bearer_notify"); mms_service_bearer_notify(modem->service, TRUE, modem- >context_interface, modem->context_proxy); return; } + DBG("checking for failure"); if (active == FALSE && modem->context_active == FALSE) { mms_service_bearer_notify(modem->service, FALSE, NULL, NULL); return; diff --git a/src/mmsutil.c b/src/mmsutil.c index a9a12eb..5fcf358 100644 --- a/src/mmsutil.c +++ b/src/mmsutil.c @@ -32,6 +32,7 @@ #include "wsputil.h" #include "mmsutil.h" +#include "mms.h" #define MAX_ENC_VALUE_BYTES 6 @@ -75,7 +76,11 @@ enum mms_header { MMS_HEADER_SUBJECT = 0x16, MMS_HEADER_TO = 0x17, MMS_HEADER_TRANSACTION_ID = 0x18, - __MMS_HEADER_MAX = 0x19, + MMS_HEADER_RETRIEVE_STATUS = 0x19, + MMS_HEADER_RETRIEVE_TEXT = 0x20, + MMS_HEADER_READ_STATUS = 0x21, + MMS_HEADER_LAST_HANDLED = 0x21, + __MMS_HEADER_MAX = 0x22, MMS_HEADER_INVALID = 0x80, }; @@ -159,13 +164,18 @@ static gboolean extract_short(struct wsp_header_iter *iter, void *user) static const char *decode_text(struct wsp_header_iter *iter) { const unsigned char *p; - unsigned int l; + unsigned int l=32; - if (wsp_header_iter_get_val_type(iter) != WSP_VALUE_TYPE_TEXT) + if (wsp_header_iter_get_val_type(iter) != WSP_VALUE_TYPE_TEXT) { + p = wsp_header_iter_get_val(iter); + DBG("could not decode text of (dummy) length %u: %*s", l-1, l-1, p+1); return NULL; + } p = wsp_header_iter_get_val(iter); l = wsp_header_iter_get_val_len(iter); + DBG("claimed len: %u", l); + DBG("val: %*s", l - 1, p); return wsp_decode_text(p, l, NULL); } @@ -184,31 +194,14 @@ static gboolean extract_text(struct wsp_header_iter *iter, void *user) return TRUE; } -static gboolean extract_text_array_element(struct wsp_header_iter *iter, - void *user) -{ - char **out = user; - const char *element; - char *tmp; - - element = decode_text(iter); - if (element == NULL) - return FALSE; - - if (*out == NULL) { - *out = g_strdup(element); - return TRUE; - } - - tmp = g_strjoin(",", *out, element, NULL); - if (tmp == NULL) - return FALSE; - - g_free(*out); - - *out = tmp; - - return TRUE; +static char* remove_address_type_suffix(const char* addr, size_t len) { + return g_strdup(addr); +/* #define MMS_ADDR_SUFFIX_PUBLIC_LAND_MOBILE_NUMBER "/TYPE=PLMN" + if(g_str_has_suffix(addr, MMS_ADDR_SUFFIX_PUBLIC_LAND_MOBILE_NUMBER)) { + return g_strndup(addr, len - strlen(MMS_ADDR_SUFFIX_PUBLIC_LAND_MOBILE_NUMBER)); + } else { + return g_strdup(addr); + }*/ } static char *decode_encoded_string_with_mib_enum(const unsigned char *p, @@ -242,6 +235,57 @@ static char *decode_encoded_string_with_mib_enum(const unsigned char *p, &bytes_read, &bytes_written, NULL); } +static gboolean extract_text_array_element(struct wsp_header_iter *iter, + void *user) +{ + char **out = user; + const char *element = NULL; + char *tmp; + DBG(""); + + const unsigned char *p; + unsigned int l; + + p = wsp_header_iter_get_val(iter); + l = wsp_header_iter_get_val_len(iter); + + switch (wsp_header_iter_get_val_type(iter)) { + case WSP_VALUE_TYPE_TEXT: + /* Text-string */ + element = wsp_decode_text(p, l, NULL); + break; + case WSP_VALUE_TYPE_LONG: + /* (Value-len) Char-set Text-string */ + element = decode_encoded_string_with_mib_enum(p, l); + break; + case WSP_VALUE_TYPE_SHORT: + element = NULL; + break; + } + + if (element == NULL) { + DBG("failed, type=%d", wsp_header_iter_get_val_type(iter)); + return FALSE; + } + + if (*out == NULL) { + *out = g_strdup(element); + return TRUE; + } + + tmp = g_strjoin(",", *out, element, NULL); + if (tmp == NULL) { + DBG("join failed"); + return FALSE; + } + + g_free(*out); + + *out = tmp; + + return TRUE; +} + static gboolean extract_encoded_text(struct wsp_header_iter *iter, void *user) { char **out = user; @@ -361,26 +405,62 @@ static gboolean extract_from(struct wsp_header_iter *iter, void *user) const unsigned char *p; unsigned int l; const char *text; + unsigned char char_set = 0; - if (wsp_header_iter_get_val_type(iter) != WSP_VALUE_TYPE_LONG) + if (wsp_header_iter_get_val_type(iter) != WSP_VALUE_TYPE_LONG) { + DBG("val_type not LONG"); return FALSE; + } p = wsp_header_iter_get_val(iter); l = wsp_header_iter_get_val_len(iter); - if (p[0] != 128 && p[0] != 129) + /* From-value = Value-length (Address-present-token=128 Encoded-string-value | Insert-address-token=129) */ + /* Encoded-string-value = Text-string | Value-length Char-set Text-string */ + /* Value-length = Short-length | (Length-quote Length) */ + /* Short-length = val 0-30 */ + /* Length-quote = val 31 */ + /* Length = Uintvar-integer */ + + if (p[0] != 128 && p[0] != 129) { + DBG("not 128 or 129"); return FALSE; + } if (p[0] == 129) { *out = NULL; return TRUE; } + p += 1; l -= 1; /* token has been handled */ + + unsigned int val_len = l; + unsigned int str_len; + if (p[0] < 31) { /*short-length */ + val_len = p[0]; + char_set = p[1]; + p += 2; + val_len -= 1; /* count encoding against val_len */ + } else if (p[0] == 31) /* length quote then long length */ { + unsigned int consumed = 0; + gboolean ok = wsp_decode_uintvar(p, l, &val_len, &consumed); + if (!ok) + return FALSE; + char_set = p[1]; + p += consumed; + val_len -= 1; /* count encoding against val_len */ + } + str_len = val_len - 1; /* NUL at the end is not counted by strlen() */ + + DBG("trying to decode text of length %u: %*s", str_len, str_len, p); + text = wsp_decode_text(p, val_len, NULL); + DBG("text=\"%s\"", text); - text = wsp_decode_text(p + 1, l - 1, NULL); - if (text == NULL) + if (text == NULL) { + DBG("could not decode text of length %u: %*s", str_len, str_len, p); return FALSE; + } - *out = g_strdup(text); + *out = remove_address_type_suffix(text, str_len); return TRUE; } @@ -473,6 +553,50 @@ static gboolean extract_priority(struct wsp_header_iter *iter, void *user) return TRUE; } +static gboolean extract_read_status(struct wsp_header_iter *iter, void *user) +{ + enum mms_message_read_status *out = user; + const unsigned char *p; + + if (wsp_header_iter_get_val_type(iter) != WSP_VALUE_TYPE_SHORT) + return FALSE; + + p = wsp_header_iter_get_val(iter); + + if (p[0] == MMS_MESSAGE_READ_STATUS_READ || + p[0] == MMS_MESSAGE_READ_STATUS_DELETED_UNREAD) { + *out = p[0]; + return TRUE; + } + + return FALSE; +} + +static gboolean extract_retr_status(struct wsp_header_iter *iter, void *user) +{ + enum mms_message_retr_status *out = user; + const unsigned char *p; + + if (wsp_header_iter_get_val_type(iter) != WSP_VALUE_TYPE_SHORT) + return FALSE; + + p = wsp_header_iter_get_val(iter); + + switch (p[0]) { + case MMS_MESSAGE_RETR_STATUS_OK: + case MMS_MESSAGE_RETR_STATUS_ERR_TRANS_FAILURE: + case MMS_MESSAGE_RETR_STATUS_ERR_TRANS_MESSAGE_NOT_FOUND: + case MMS_MESSAGE_RETR_STATUS_ERR_PERM_FAILURE: + case MMS_MESSAGE_RETR_STATUS_ERR_PERM_SERVICE_DENIED: + case MMS_MESSAGE_RETR_STATUS_ERR_PERM_MESSAGE_NOT_FOUND: + case MMS_MESSAGE_RETR_STATUS_ERR_PERM_CONTENT_UNSUPPORTED: + *out = p[0]; + return TRUE; + } + + return FALSE; +} + static gboolean extract_rsp_status(struct wsp_header_iter *iter, void *user) { unsigned char *out = user; @@ -559,7 +683,7 @@ static header_handler handler_for_type(enum mms_header header) case MMS_HEADER_CONTENT_LOCATION: return extract_text; case MMS_HEADER_CONTENT_TYPE: - return extract_text; + return extract_text; /* extract_encoded_text? */ case MMS_HEADER_DATE: return extract_date; case MMS_HEADER_DELIVERY_REPORT: @@ -590,6 +714,12 @@ static header_handler handler_for_type(enum mms_header header) return extract_rsp_status; case MMS_HEADER_RESPONSE_TEXT: return extract_encoded_text; + case MMS_HEADER_RETRIEVE_STATUS: + return extract_retr_status; + case MMS_HEADER_RETRIEVE_TEXT: + return extract_encoded_text; + case MMS_HEADER_READ_STATUS: + return extract_read_status; case MMS_HEADER_SENDER_VISIBILITY: return extract_sender_visibility; case MMS_HEADER_STATUS: @@ -650,8 +780,12 @@ static gboolean mms_parse_headers(struct wsp_header_iter *iter, h = p[0] & 0x7f; handler = handler_for_type(h); - if (handler == NULL) + if (handler == NULL) { + DBG("no handler for type %u", h); return FALSE; + } + + DBG("saw header of type %u", h); /* Unsupported header, skip */ if (entries[h].data == NULL) @@ -662,9 +796,15 @@ static gboolean mms_parse_headers(struct wsp_header_iter *iter, !(entries[h].flags & HEADER_FLAG_ALLOW_MULTI)) continue; + DBG("running handler for type %u", h); + /* Parse the header */ - if (handler(iter, entries[h].data) == FALSE) + if (handler(iter, entries[h].data) == FALSE) { + DBG("handler %p for type %u returned false", handler, h); return FALSE; + } + + DBG("handler for type %u was success", h); entries[h].pos = i; entries[h].flags |= HEADER_FLAG_MARKED; @@ -672,8 +812,10 @@ static gboolean mms_parse_headers(struct wsp_header_iter *iter, for (i = 0; i < __MMS_HEADER_MAX + 1; i++) { if ((entries[i].flags & HEADER_FLAG_MANDATORY) && - !(entries[i].flags & HEADER_FLAG_MARKED)) + !(entries[i].flags & HEADER_FLAG_MARKED)) { + DBG("header %u was mandatory but not marked", i); return FALSE; + } } /* @@ -704,8 +846,10 @@ static gboolean mms_parse_headers(struct wsp_header_iter *iter, va_end(args); - if (entries[i].pos != expected_pos) + if (entries[i].pos != expected_pos) { + DBG("header %u was in position %u but expected in position %u", i, entries[i].pos, expected_pos); return FALSE; + } } return TRUE; @@ -770,6 +914,7 @@ static gboolean extract_content_id(struct wsp_header_iter *iter, void *user) return FALSE; *out = g_strdup(text); + DBG("extracted content-id %s\n", *out); return TRUE; } @@ -991,11 +1136,17 @@ gboolean mms_message_decode(const unsigned char *pdu, flags |= WSP_HEADER_ITER_FLAG_DETECT_MMS_MULTIPART; wsp_header_iter_init(&iter, pdu, len, flags); + DBG("about to check well known"); + CHECK_WELL_KNOWN_HDR(MMS_HEADER_MESSAGE_TYPE); + DBG("about to extract short"); + if (extract_short(&iter, &octet) == FALSE) return FALSE; + DBG("octet %u", octet); + if (octet < MMS_MESSAGE_TYPE_SEND_REQ || octet > MMS_MESSAGE_TYPE_DELIVERY_IND) return FALSE; @@ -1422,6 +1573,12 @@ static header_encoder encoder_for_type(enum mms_header header) return NULL; case MMS_HEADER_RESPONSE_TEXT: return NULL; + case MMS_HEADER_RETRIEVE_STATUS: + return NULL; + case MMS_HEADER_RETRIEVE_TEXT: + return NULL; + case MMS_HEADER_READ_STATUS: + return NULL; case MMS_HEADER_SENDER_VISIBILITY: return NULL; case MMS_HEADER_STATUS: diff --git a/src/mmsutil.h b/src/mmsutil.h index e32c761..00ecc39 100644 --- a/src/mmsutil.h +++ b/src/mmsutil.h @@ -50,6 +50,23 @@ enum mms_message_rsp_status { MMS_MESSAGE_RSP_STATUS_ERR_PERM_LACK_OF_PREPAID = 235, }; +enum mms_message_retr_status { + MMS_MESSAGE_RETR_STATUS_OK = 128, + MMS_MESSAGE_RETR_STATUS_ERR_TRANS_MIN = 192, + MMS_MESSAGE_RETR_STATUS_ERR_TRANS_FAILURE = 192, + MMS_MESSAGE_RETR_STATUS_ERR_TRANS_MESSAGE_NOT_FOUND = 194, + MMS_MESSAGE_RETR_STATUS_ERR_PERM_MIN = 224, + MMS_MESSAGE_RETR_STATUS_ERR_PERM_FAILURE = 224, + MMS_MESSAGE_RETR_STATUS_ERR_PERM_SERVICE_DENIED = 225, + MMS_MESSAGE_RETR_STATUS_ERR_PERM_MESSAGE_NOT_FOUND = 226, + MMS_MESSAGE_RETR_STATUS_ERR_PERM_CONTENT_UNSUPPORTED = 227, +}; + +enum mms_message_read_status { + MMS_MESSAGE_READ_STATUS_READ = 128, + MMS_MESSAGE_READ_STATUS_DELETED_UNREAD = 129, +}; + enum mms_message_notify_status { MMS_MESSAGE_NOTIFY_STATUS_RETRIEVED = 129, MMS_MESSAGE_NOTIFY_STATUS_REJECTED = 130, diff --git a/src/service.c b/src/service.c index b3ecc1e..c7ef255 100644 --- a/src/service.c +++ b/src/service.c @@ -609,7 +609,7 @@ static void emit_message_added(const struct mms_service *service, static void activate_bearer(struct mms_service *service) { - DBG("service %p", service); + DBG("service %p setup %d active %d", service, service- >bearer_setup, service->bearer_active); if (service->bearer_setup == TRUE) return; @@ -622,7 +622,7 @@ static void activate_bearer(struct mms_service *service) if (service->bearer_handler == NULL) return; - DBG("service %p", service); + DBG("service %p waiting for %d seconds", service, BEARER_SETUP_TIMEOUT); service->bearer_setup = TRUE; @@ -736,6 +736,8 @@ static DBusMessage *get_messages(DBusConnection *conn, GHashTableIter table_iter; gpointer key, value; + DBG(""); + reply = dbus_message_new_method_return(dbus_msg); if (reply == NULL) return NULL; @@ -1632,6 +1634,7 @@ static void append_attachment_properties(struct mms_attachment *part, dbus_message_iter_open_container(part_array, DBUS_TYPE_STRUCT, NULL, &entry); + DBG("content-id: %s\n", part->content_id); dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &part- >content_id); dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, @@ -1793,7 +1796,7 @@ static void append_msg_recipients(DBusMessageIter *dict, for (i = 0; tokens[i] != NULL; i++) { rcpt = mms_address_to_string(tokens[i]); - + DBG("rcpt=%s", rcpt); dbus_message_iter_append_basic(&array, DBUS_TYPE_STRING, &rcpt); } @@ -1814,25 +1817,31 @@ static void append_rc_msg_properties(DBusMessageIter *dict, const char *from_prefix; char *from; + DBG("status=%s", status); mms_dbus_dict_append_basic(dict, "Status", DBUS_TYPE_STRING, &status); + DBG("date=%s", date); mms_dbus_dict_append_basic(dict, "Date", DBUS_TYPE_STRING, &date); + DBG("subject=%s", msg->rc.subject); if (msg->rc.subject != NULL) mms_dbus_dict_append_basic(dict, "Subject", DBUS_TYPE_STRING, &msg- >rc.subject); + DBG("from=%s", msg->rc.from); from = g_strdup(msg->rc.from); if (from != NULL) { from_prefix = mms_address_to_string(from); + DBG("from_pfx=%s", from_prefix); mms_dbus_dict_append_basic(dict, "Sender", DBUS_TYPE_STRING, &from_prefix); g_free(from); } + DBG("to=%s", msg->rc.to); if (msg->rc.to != NULL) append_msg_recipients(dict, msg); } @@ -1862,6 +1871,8 @@ static void append_message(const char *path, const struct mms_service *service, mms_dbus_dict_open(iter, &dict); + DBG("type=%d", msg->type); + switch (msg->type) { case MMS_MESSAGE_TYPE_SEND_REQ: append_sr_msg_properties(&dict, msg); @@ -1873,7 +1884,7 @@ static void append_message(const char *path, const struct mms_service *service, case MMS_MESSAGE_TYPE_NOTIFYRESP_IND: break; case MMS_MESSAGE_TYPE_RETRIEVE_CONF: - append_rc_msg_properties(&dict, msg); + append_rc_msg_properties(&dict, msg); /* causes dbus disconnect! */ break; case MMS_MESSAGE_TYPE_ACKNOWLEDGE_IND: break; @@ -1884,6 +1895,7 @@ static void append_message(const char *path, const struct mms_service *service, if (msg->attachments != NULL) { char *pdu_path = mms_store_get_path(service->identity, msg- >uuid); + DBG("appending pdu path %s", pdu_path); append_msg_attachments(&dict, pdu_path, msg); g_free(pdu_path); } @@ -2059,8 +2071,10 @@ static gboolean result_request_notify_resp(struct mms_request *request) return FALSE; } - if (request->msg == NULL) + if (request->msg == NULL) { + mms_error("POST m.notify.resp.ind provided no message to register"); return FALSE; + } msg = mms_request_steal_message(request); @@ -2210,6 +2224,9 @@ static gboolean web_get_cb(GWebResult *result, gpointer user_data) complete: close(request->fd); + DBG("request->result_cb=%p vs. retrieve_conf=%p/send_conf=%p/notify_resp=%p", + request->result_cb, result_request_retrieve_conf, result_request_send_conf, result_request_notify_resp); + if (request->result_cb == NULL || request->result_cb(request) == TRUE) mms_request_destroy(request); else { @@ -2378,25 +2395,37 @@ void mms_service_push_notify(struct mms_service *service, return; } + DBG("about to push notify"); + if (mms_push_notify(data, len, &nread) == FALSE) goto out; + DBG("did push notify; about to store"); + uuid = mms_store(service->identity, data + nread, len - nread); if (uuid == NULL) goto out; + DBG("did store; about to decode"); + if (mms_message_decode(data + nread, len - nread, msg) == FALSE) goto error; + DBG("did decode message"); + if (msg->type == MMS_MESSAGE_TYPE_DELIVERY_IND) { msg->uuid = g_strdup(uuid); dump_delivery_ind(msg); + DBG("about to store_meta_open"); + meta = mms_store_meta_open(service->identity, uuid); if (meta == NULL) goto error; + DBG("did store_meta_open"); + g_key_file_set_string(meta, "info", "state", "notification"); mms_store_meta_close(service->identity, uuid, meta, TRUE); @@ -2404,17 +2433,25 @@ void mms_service_push_notify(struct mms_service *service, return; } + DBG("is type NI?"); + if (msg->type != MMS_MESSAGE_TYPE_NOTIFICATION_IND) goto error; + DBG("type is NI"); + msg->uuid = g_strdup(uuid); dump_notification_ind(msg); + DBG("about to store_meta_open 2"); + meta = mms_store_meta_open(service->identity, uuid); if (meta == NULL) goto error; + DBG("did store_meta_open 2"); + g_key_file_set_boolean(meta, "info", "read", FALSE); g_key_file_set_string(meta, "info", "state", "notification"); @@ -2427,6 +2464,8 @@ void mms_service_push_notify(struct mms_service *service, if (request == NULL) goto out; + DBG("did create_request"); + g_queue_push_tail(service->request_queue, request); activate_bearer(service); @@ -2442,12 +2481,16 @@ out: mms_error("Failed to handle incoming notification"); } +void debug_print(const char* s, void* data) { + printf("%s\n", s); +} + void mms_service_bearer_notify(struct mms_service *service, mms_bool_t active, const char *interface, const char *proxy) { int ifindex; - DBG("service %p active %d", service, active); + DBG("service=%p active=%d iface=%s proxy=%s", service, active, interface, proxy); if (service == NULL) return; @@ -2463,6 +2506,7 @@ void mms_service_bearer_notify(struct mms_service *service, mms_bool_t active, if (active == FALSE) goto interface_down; + DBG("interface %s proxy %s", interface, proxy); if (service->web != NULL) { @@ -2481,6 +2525,8 @@ void mms_service_bearer_notify(struct mms_service *service, mms_bool_t active, if (service->web == NULL) return; + g_web_set_debug(service->web, (GWebDebugFunc)debug_print, NULL); + /* Sometimes no proxy is reported as string instead of NULL */ if (g_strcmp0(proxy, "") != 0) g_web_set_proxy(service->web, proxy); diff --git a/test/send-message b/test/send-message index 558fdaa..8477e79 100755 --- a/test/send-message +++ b/test/send-message @@ -5,23 +5,23 @@ import dbus import csv if (len(sys.argv) < 4): - print "Usage: %s"\ + print("Usage: {}"\ " ,..."\ " "\ " <,,>,..."\ - % (sys.argv[0]) - print "Sample(Related): %s"\ + .format(sys.argv[0])) + print("Sample(Related): {}"\ " \"+33611111111,+33622222222\""\ " \"smil.txt\""\ " \"cid-1,text/plain,text.txt\""\ " \"cid-2,image/jpeg,image.jpg\""\ - % (sys.argv[0]) - print "Sample(Mixed): %s"\ + .format(sys.argv[0])) + print("Sample(Mixed): {}"\ " \"+33611111111,+33622222222\""\ " \"\""\ " \"cid-1,text/plain,text.txt\""\ " \"cid-2,image/jpeg,image.jpg\""\ - % (sys.argv[0]) + .format(sys.argv[0])) sys.exit(1) bus = dbus.SessionBus() @@ -38,23 +38,23 @@ service = dbus.Interface(bus.get_object('org.ofono.mms', path), recipients = dbus.Array([],signature=dbus.Signature('s')) reader = csv.reader([sys.argv[1]]) for r in reader: - print "Recipient list: %s" % r + print("Recipient list: {}".format(r)) for i in r: recipients.append(dbus.String(i)) if sys.argv[2] == "": - print "Send MMS as Mixed" + print("Send MMS as Mixed") smil = "" else: - print "Send MMS as Related" - print "Smil path: %s" % (sys.argv[2]) + print("Send MMS as Related") + print("Smil path: {}".format(sys.argv[2])) file = open(sys.argv[2],"r") smil = dbus.String(file.read()) attachments = dbus.Array([],signature=dbus.Signature('(sss)')) for a in sys.argv[3:]: - print "Attachment: (%s)" % a + print("Attachment: ({})".format(a)) reader = csv.reader([a]) for r in reader: From patchwork Fri Mar 26 10:50:04 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chris Talbot X-Patchwork-Id: 12166319 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 037D5C433DB for ; Fri, 26 Mar 2021 10:50:50 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id CE6B36194B for ; Fri, 26 Mar 2021 10:50:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229961AbhCZKul (ORCPT ); Fri, 26 Mar 2021 06:50:41 -0400 Received: from out2-smtp.messagingengine.com ([66.111.4.26]:36819 "EHLO out2-smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229832AbhCZKuF (ORCPT ); Fri, 26 Mar 2021 06:50:05 -0400 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id 02C605C0004 for ; Fri, 26 Mar 2021 06:50:05 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute4.internal (MEProxy); Fri, 26 Mar 2021 06:50:05 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=talbothome.com; h=message-id:subject:from:to:date:content-type:mime-version :content-transfer-encoding; s=fm2; bh=2r86slXb62o417xfxLF4ITtW5+ mCk4lgJBrKurWE6xw=; b=fefvthoh+BUSLca6s5cYeBrvYDFpIKH+mzQnp0Gd+q YZKqO1pRKyI3BHm7WjqaqfvVIlfzOw7JP/DVlVqGaT/5ZarHoIkWAL5smLUEh5zI a3xl8EVimlqyzGMDe/d/tmV6XAGFVtyI3gmbHOLiG6CNCCoZExTGlX1Hdp5jioas 3LJGVnRfsn5pNnHmvsYhLqN4Yc7r9Td1xsFuVrIbdo34KnaK68q9Wt9ISP8dUrz7 8E0ArBKzjSA/81P93nJ6spVOyt+osDEeL6Io96e8z4ORXJucDuqukAk2yG3j+p1m +BqpE9XqHXw7meLlw3heEKN2mG+80IY0x2FPUZ04A+RA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=content-transfer-encoding:content-type :date:from:message-id:mime-version:subject:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm2; bh=2r86sl Xb62o417xfxLF4ITtW5+mCk4lgJBrKurWE6xw=; b=MRySTrHmLulIqh/aTSetze L6qqOpHx+5I3kUwU8JiqXTSFT6He3pdDCypZyXHfi/OYeKfNsMiFCecWbQANLHeW ZCwhYVXa3RD3zP0/3/015jw9aMlMH6cUXgv7wL1RCWYqt3JT3ayOaHOAkhuMB7zB 43fPnYNQKe/wnO4ThSTY/L6pXuKjExD4RZaWt2BJG/7PoOA+BhYm4ggMA6x1jyVN RXeJ/p8XPXjmhu+D+0akWw9b3YbXvc3STa+oyIvtGMapbXiRzSPMTzpc6EdfI0CG EkdSPC+gVjoOaBL5mRmtA5hJQHdNJPi3n4SOHEySV9/Sy9+6+U+Aq8/XdRrX96IQ == X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduledrudehvddgvddtucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucenucfjughrpefkuffhvffftggfggfgsehtjeertd dtreejnecuhfhrohhmpeevhhhrihhsthhophhhvghrucfvrghlsghothcuoegthhhrihhs sehtrghlsghothhhohhmvgdrtghomheqnecuggftrfgrthhtvghrnhepieeitdevveegje euveeflefhhfeffeeijeffffeiteeifffhveeigeeghfevffdunecukfhppeejvddrleeh rddvgeefrdduheeinecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilh hfrhhomheptghhrhhishesthgrlhgsohhthhhomhgvrdgtohhm X-ME-Proxy: Received: from SpaceballstheLaptop.talbothome.com (unknown [72.95.243.156]) by mail.messagingengine.com (Postfix) with ESMTPA id CD37F240067 for ; Fri, 26 Mar 2021 06:50:04 -0400 (EDT) Message-ID: <082ccadaf9654e1580540e73cc8defc522d97b2d.camel@talbothome.com> Subject: [PATCH 2/9] Ensure Compatibility with Telus Canada From: Christopher Talbot To: netdev@vger.kernel.org Date: Fri, 26 Mar 2021 06:50:04 -0400 User-Agent: Evolution 3.30.5-1.1 MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org mmsd decodes a header that is not in the standard. This patch allows this header to be decoded --- src/mmsutil.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) struct header_handler_entry { @@ -781,8 +780,17 @@ static gboolean mms_parse_headers(struct wsp_header_iter *iter, handler = handler_for_type(h); if (handler == NULL) { - DBG("no handler for type %u", h); - return FALSE; + if(h == MMS_HEADER_INVALID) { + DBG("no handler for type %u", h); + return FALSE; + } else if (h == __MMS_HEADER_MAX) { + DBG("no handler for type %u", h); + return FALSE; + } else { + /* Telus has strange headers, so this handles it */ + DBG("type isn't a part of the standard? Skipping %u", h); + continue; + } } DBG("saw header of type %u", h); diff --git a/src/mmsutil.c b/src/mmsutil.c index 5fcf358..9430bf1 100644 --- a/src/mmsutil.c +++ b/src/mmsutil.c @@ -732,10 +732,9 @@ static header_handler handler_for_type(enum mms_header header) return extract_text; case MMS_HEADER_INVALID: case __MMS_HEADER_MAX: + default: return NULL; } - - return NULL; } From patchwork Fri Mar 26 10:50:26 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chris Talbot X-Patchwork-Id: 12166321 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9FB49C433E0 for ; Fri, 26 Mar 2021 10:51:22 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 67D8261A0D for ; Fri, 26 Mar 2021 10:51:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229839AbhCZKuu (ORCPT ); Fri, 26 Mar 2021 06:50:50 -0400 Received: from out2-smtp.messagingengine.com ([66.111.4.26]:55583 "EHLO out2-smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229892AbhCZKub (ORCPT ); Fri, 26 Mar 2021 06:50:31 -0400 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id 653275C03F9 for ; Fri, 26 Mar 2021 06:50:27 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute4.internal (MEProxy); Fri, 26 Mar 2021 06:50:27 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=talbothome.com; h=message-id:subject:from:to:date:content-type:mime-version :content-transfer-encoding; s=fm2; bh=IYlfc1XlDL9TKirFUtSm+ZAMmU IUqnlc5TJeSAd9y78=; b=h8MihDBW+gLqcU4bkzCxkKgMByK3uuZKH++pyg+uzB 1eSjb0RsxcLV1SqkLiZIh8GvvCvo43L9td6jJsV0iMfVOhEQ1U0PNMpjflVBhhed QgYqK6WndNjOev3cpppVIJeavRHxidsZF+dLLW/aT33UiLVeVgibpaQks5PKQboV nA8k8TwdJnxqTdmtTPuy1BEIH3f4eVZDEg0PM1dMsPUxPAHHhJ+d+ihNF7HXSs8n 9b5D/J5TgfyXL1XyUv6xMXX7KG2lQ591QL2eO+XZD55hHTNnAH8K85auvdI9oEsO 5L4Trjs7G7dL9CJ9FmnekOJCikU2TRsb1Z8B9NE5G1dw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=content-transfer-encoding:content-type :date:from:message-id:mime-version:subject:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm2; bh=IYlfc1 XlDL9TKirFUtSm+ZAMmUIUqnlc5TJeSAd9y78=; b=N2NXkBccP8ntt2xAtAM1KP IjJ5Ckg8l0PWlBiO58EbxPHW9/tCrA6YEgTjSm4iDCoV8IuKhyOn1GnJGOxf7VJD sRuR9IUWa2z81feR6N0mTq9vchGS60ARbHHlJxp36dv1QS8DC+Bog9T/BCU7b2Pc aqPOsNyfezWZTHqvXk7LttVnxdzuxFFgKffbdHo9sFCzSlD+lvShLh9g/HLsQwVm Fu9wtxslZOEYHJ88/uzTybwE8QRLJ9ngPg/Th5Ewoaio2vtCg6FSAMiqNxz2YBGC b98YetIV12b+aNSvyIYIEal1/02zWh2X5Fqeyr7gZQEDXPn4h5+N6QeCqyT8pY5A == X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduledrudehvddgvddtucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucenucfjughrpefkuffhvffftggfggfgsehtjeertd dtreejnecuhfhrohhmpeevhhhrihhsthhophhhvghrucfvrghlsghothcuoegthhhrihhs sehtrghlsghothhhohhmvgdrtghomheqnecuggftrfgrthhtvghrnhepieeitdevveegje euveeflefhhfeffeeijeffffeiteeifffhveeigeeghfevffdunecukfhppeejvddrleeh rddvgeefrdduheeinecuvehluhhsthgvrhfuihiivgepudenucfrrghrrghmpehmrghilh hfrhhomheptghhrhhishesthgrlhgsohhthhhomhgvrdgtohhm X-ME-Proxy: Received: from SpaceballstheLaptop.talbothome.com (unknown [72.95.243.156]) by mail.messagingengine.com (Postfix) with ESMTPA id 419BC240067 for ; Fri, 26 Mar 2021 06:50:27 -0400 (EDT) Message-ID: Subject: [PATCH 3/9] Ensure Compatibility with AT&T From: Christopher Talbot To: netdev@vger.kernel.org Date: Fri, 26 Mar 2021 06:50:26 -0400 User-Agent: Evolution 3.30.5-1.1 MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This patch fixes two issues to ensure compatibility with AT&T: 1) Explicity close connections to the mmsc 2) Allow MMS Proxies that are domain names --- gweb/gweb.c | 3 ++- src/service.c | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) if (g_strcmp0(proxy, "") != 0) g_web_set_proxy(service->web, proxy); diff --git a/gweb/gweb.c b/gweb/gweb.c index f72e137..995d12f 100644 --- a/gweb/gweb.c +++ b/gweb/gweb.c @@ -1309,7 +1309,8 @@ static guint do_request(GWeb *web, const char *url, session->address = g_strdup(session->host); memset(&hints, 0, sizeof(struct addrinfo)); - hints.ai_flags = AI_NUMERICHOST; + /* Comment out next line to have AT&T MMS proxy work */ + //hints.ai_flags = AI_NUMERICHOST; hints.ai_family = session->web->family; if (session->addr != NULL) { diff --git a/src/service.c b/src/service.c index c7ef255..a3b90c5 100644 --- a/src/service.c +++ b/src/service.c @@ -2527,6 +2527,9 @@ void mms_service_bearer_notify(struct mms_service *service, mms_bool_t active, g_web_set_debug(service->web, (GWebDebugFunc)debug_print, NULL); + /* Explicitly close connections to work with AT&T */ + g_web_set_close_connection(service->web,TRUE); + /* Sometimes no proxy is reported as string instead of NULL */ From patchwork Fri Mar 26 10:50:52 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chris Talbot X-Patchwork-Id: 12166323 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3BD35C433E2 for ; Fri, 26 Mar 2021 10:51:54 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id E6F3D61A2D for ; Fri, 26 Mar 2021 10:51:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229931AbhCZKvW (ORCPT ); Fri, 26 Mar 2021 06:51:22 -0400 Received: from out2-smtp.messagingengine.com ([66.111.4.26]:53277 "EHLO out2-smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230022AbhCZKux (ORCPT ); Fri, 26 Mar 2021 06:50:53 -0400 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id 4A91B5C070A for ; Fri, 26 Mar 2021 06:50:53 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute4.internal (MEProxy); Fri, 26 Mar 2021 06:50:53 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=talbothome.com; h=message-id:subject:from:to:date:content-type:mime-version :content-transfer-encoding; s=fm2; bh=a8KqjxTrvysHAqftoheby3QlpL QG9qIqt6QzMUYXEtU=; b=zCAKeG/pTR/GAuXB8PJz8qKDtFSnekK7ubu2mkYmNP HSKPj14wvHszZqPPb2OFaGu93D3/mQO/pg+1+aYhj9ufekDUQ+IQltkcoVMR4xf8 fCkKWuYhZu0+R510clD3zwZ82nV9onUu8dBFFRLhjrdDHvmh9U48KU9Rv7vA1QtH Hd3+sOxEoL6tf+TpY0F7KcDoLO//ZLnOY+xGa/jFq/p1yaIV7HU1QtbJwqPu7iGr pjKV6OvEzyXBgz4JFv32CuaX+OLdiSJX76iOTaEEludMKmqhgNpeHp1l711ZHfqo ORDFeWOS80T8VObny8JhOWwblKVeKIuCkjcATP8jyrOQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=content-transfer-encoding:content-type :date:from:message-id:mime-version:subject:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm2; bh=a8Kqjx TrvysHAqftoheby3QlpLQG9qIqt6QzMUYXEtU=; b=Uz6iVBsKq64Zo3AHa8ipCc FhlxqF9IcsYi/jGBlXZupQRHOnpgzuHdDXIL1vxxt77w2uw1tBZysPj28Yetprz0 uxl92YM4R8wb5jIvv22GAVSNWjFXvK8/Vt3EQr3/mMZx778Td9hJSFI3jdfqJ87x wIt3WXz5AygNoNPmAGhbp5UvsrDxRW6w/Ny03Goq6465RooUoLiBYP2vjkM+yiH2 z2r52mv8Kt+D9T3y6IdMgB+NPV1ET9FCk8coe5BXOqpz1dBpq9ktC/dvzTrDPXnn TgXmjT5GZGRH+73FHDa8Dj6F/R7Ahe9fwhkUDIqpJZdK11UqcQFmY0RgLAG6V/BQ == X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduledrudehvddgvddtucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucenucfjughrpefkuffhvffftggfggfgsehtjeertd dtreejnecuhfhrohhmpeevhhhrihhsthhophhhvghrucfvrghlsghothcuoegthhhrihhs sehtrghlsghothhhohhmvgdrtghomheqnecuggftrfgrthhtvghrnhepieeitdevveegje euveeflefhhfeffeeijeffffeiteeifffhveeigeeghfevffdunecukfhppeejvddrleeh rddvgeefrdduheeinecuvehluhhsthgvrhfuihiivgepvdenucfrrghrrghmpehmrghilh hfrhhomheptghhrhhishesthgrlhgsohhthhhomhgvrdgtohhm X-ME-Proxy: Received: from SpaceballstheLaptop.talbothome.com (unknown [72.95.243.156]) by mail.messagingengine.com (Postfix) with ESMTPA id 0D408240068 for ; Fri, 26 Mar 2021 06:50:53 -0400 (EDT) Message-ID: <7e6ec700d812d9d3a8d2ec6a621118dad2f8e9dd.camel@talbothome.com> Subject: [PATCH 4/9] Fix issue if there is an empty string in encoded text From: Christopher Talbot To: netdev@vger.kernel.org Date: Fri, 26 Mar 2021 06:50:52 -0400 User-Agent: Evolution 3.30.5-1.1 MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org A swedish carrier sends an empty string in the subject line. This patch allows mmsd to handle it --- src/mmsutil.c | 7 +++++++ 1 file changed, 7 insertions(+) /* Text-string */ diff --git a/src/mmsutil.c b/src/mmsutil.c index 9430bf1..615198f 100644 --- a/src/mmsutil.c +++ b/src/mmsutil.c @@ -297,6 +297,13 @@ static gboolean extract_encoded_text(struct wsp_header_iter *iter, void *user) p = wsp_header_iter_get_val(iter); l = wsp_header_iter_get_val_len(iter); + if(l == 0) { + DBG("Length is 0! Returning empty string"); + dec_text = g_strdup(""); + *out = dec_text; + return TRUE; + } + switch (wsp_header_iter_get_val_type(iter)) { case WSP_VALUE_TYPE_TEXT: From patchwork Fri Mar 26 10:51:24 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chris Talbot X-Patchwork-Id: 12166337 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,UNWANTED_LANGUAGE_BODY autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id EB26EC433DB for ; Fri, 26 Mar 2021 10:52:25 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id ADE67619BA for ; Fri, 26 Mar 2021 10:52:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229580AbhCZKv4 (ORCPT ); Fri, 26 Mar 2021 06:51:56 -0400 Received: from out2-smtp.messagingengine.com ([66.111.4.26]:57331 "EHLO out2-smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230104AbhCZKv0 (ORCPT ); Fri, 26 Mar 2021 06:51:26 -0400 Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailout.nyi.internal (Postfix) with ESMTP id 8376A5C0A31 for ; Fri, 26 Mar 2021 06:51:25 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute1.internal (MEProxy); Fri, 26 Mar 2021 06:51:25 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=talbothome.com; h=message-id:subject:from:to:date:content-type:mime-version :content-transfer-encoding; s=fm2; bh=mfLM54NkRzGihGMt1RtjFf1msn m+AjpFdY2ii5u1oQ4=; b=IBh8P9l1vEWPrFve79xNQI0K5wSnjGQO/10qRJdf9O objichibOJi6pqHlstsqE2SJEDAWN0U+1A09pXhwpfuJZcjkXlOsG9h4a7QMvJvv u3J9fZZiTondDjKL7nH7zyul7ZB4mMM4CrQFNKP3b7trvYzt+ppJ83t6E2O777YP BxyOrIIAHNKYhFtms7TBCntReoICnPXtfIiJdefjQjI4L2wS8jZZ5W06MXLh6WHy bIlwwOm4tWSMnaJMT/XJLNGyc7M1i/gLvaX5kFGMa7XxyoHxBHDFIqaSyTh5FAEZ sVUvjbiV/PsLr8BLx+szjPBj+x6qC80oLCyZrzOy7FDg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=content-transfer-encoding:content-type :date:from:message-id:mime-version:subject:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm2; bh=mfLM54 NkRzGihGMt1RtjFf1msnm+AjpFdY2ii5u1oQ4=; b=fFBLViJOiFnhepKCWA7Nd7 F8GUlCIm4GQDIRri1J6sMmMybbrs84WVr/+S1qb7xLuVwrzayxMWCuD0EM3zt9Q7 161O7lYxobxXZ/s0ZTf57nX1uP1r4WWki+AejysoPj9R+Zf5ZGyFkFQB7cgn9qvy 77qIiWZFBxHkjPP+eGBWcKcQWqg8htaz0A7dRY6PEFKVCHdvxCtukffH5K9B9NvV 4gB3iaiO3q6LvdRZlzXbivDPx7//iuF7KU95BqzrgiV/cUm9oGQuPDqK64Tjv1xn wnTKCnfbjV0MXj9IFuKszpko96rKC9mNH3aFm8oD8DDKj0RSAmYj9zdVieuKhqdQ == X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduledrudehvddgvdduucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucenucfjughrpefkuffhvffftggfggfgsehtjeertd dtreejnecuhfhrohhmpeevhhhrihhsthhophhhvghrucfvrghlsghothcuoegthhhrihhs sehtrghlsghothhhohhmvgdrtghomheqnecuggftrfgrthhtvghrnhepieeitdevveegje euveeflefhhfeffeeijeffffeiteeifffhveeigeeghfevffdunecukfhppeejvddrleeh rddvgeefrdduheeinecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilh hfrhhomheptghhrhhishesthgrlhgsohhthhhomhgvrdgtohhm X-ME-Proxy: Received: from SpaceballstheLaptop.talbothome.com (unknown [72.95.243.156]) by mail.messagingengine.com (Postfix) with ESMTPA id 46D6E24005B for ; Fri, 26 Mar 2021 06:51:25 -0400 (EDT) Message-ID: <152c1a9de39bf054725522dcf762097091e5a8a4.camel@talbothome.com> Subject: [PATCH 5/9] Allow for a user configurable maximum attachment size From: Christopher Talbot To: netdev@vger.kernel.org Date: Fri, 26 Mar 2021 06:51:24 -0400 User-Agent: Evolution 3.30.5-1.1 MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Android and iOS enforce a maximum attachment size for MMS messages. This patch enforces a maximum attachment size for MMS messages and makes it user configurable. The default maximum size is based off of Android, which has a maximum MMS size of 1.1 Megabytes --- src/service.c | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) ", + service- >max_attach_total_size); + } + mms_debug("Maximum Attachment Total Size (in bytes): %d", service->max_attach_total_size); + } static void mms_request_destroy(struct mms_request *request) @@ -414,10 +431,11 @@ static gboolean send_message_get_recipients(DBusMessageIter *top_iter, } static gboolean send_message_get_attachments(DBusMessageIter *top_iter, - struct mms_message *msg) + struct mms_message *msg, struct mms_service *service) { DBusMessageIter attachments; unsigned int attach_num = 0; + int attach_total_size = 0; dbus_message_iter_recurse(top_iter, &attachments); @@ -430,8 +448,10 @@ static gboolean send_message_get_attachments(DBusMessageIter *top_iter, struct mms_attachment *attach; void *ptr; - if (++attach_num > MAX_ATTACHMENTS_NUMBER) + if (++attach_num > MAX_ATTACHMENTS_NUMBER) { + mms_error("Error: Too many attachments!"); return FALSE; + } dbus_message_iter_recurse(&attachments, &entry); @@ -466,6 +486,16 @@ static gboolean send_message_get_attachments(DBusMessageIter *top_iter, return FALSE; } + attach_total_size = attach_total_size + attach->length; + + mms_debug("Total attachment size: %d", attach_total_size); + mms_debug("Maximum Attachment Total Size (in bytes): %d", service->max_attach_total_size); + + if (attach_total_size > service- >max_attach_total_size) { + mms_error("Error: Total Attachment size too large!"); + return FALSE; + } + attach->data = ptr; attach->content_id = g_strdup(id); @@ -490,7 +520,7 @@ static gboolean send_message_get_attachments(DBusMessageIter *top_iter, } static gboolean send_message_get_args(DBusMessage *dbus_msg, - struct mms_message *msg) + struct mms_message *msg, struct mms_service *service) { DBusMessageIter top_iter; const char *smil; @@ -536,7 +566,7 @@ static gboolean send_message_get_args(DBusMessage *dbus_msg, if (dbus_message_iter_get_arg_type(&top_iter) != DBUS_TYPE_ARRAY) return FALSE; - return send_message_get_attachments(&top_iter, msg); + return send_message_get_attachments(&top_iter, msg, service); } static struct mms_request *create_request(enum mms_request_type type, diff --git a/src/service.c b/src/service.c index a3b90c5..dede36d 100644 --- a/src/service.c +++ b/src/service.c @@ -56,6 +56,7 @@ #define MAX_ATTACHMENTS_NUMBER 25 #define MAX_ATTEMPTS 3 +#define DEFAULT_MAX_ATTACHMENT_TOTAL_SIZE 1100000 #define SETTINGS_STORE "mms" #define SETTINGS_GROUP "Settings" @@ -100,6 +101,7 @@ struct mms_service { GHashTable *messages; GKeyFile *settings; gboolean use_delivery_reports; + int max_attach_total_size; }; enum mms_request_type { @@ -146,7 +148,22 @@ static void mms_load_settings(struct mms_service *service) g_key_file_set_boolean(service->settings, SETTINGS_GROUP, "UseDeliveryReports", service- >use_delivery_reports); + error = NULL; } + + service->max_attach_total_size = + g_key_file_get_integer(service->settings, SETTINGS_GROUP, + "TotalMaxAttachmentSize ", &error); + + if (error) { + g_error_free(error); + service->max_attach_total_size = DEFAULT_MAX_ATTACHMENT_TOTAL_SIZE; + g_key_file_set_integer(service->settings, SETTINGS_GROUP, + "TotalMaxAttachmentSize From patchwork Fri Mar 26 10:51:51 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chris Talbot X-Patchwork-Id: 12166339 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id F30AFC433E0 for ; Fri, 26 Mar 2021 10:52:25 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id C709961A0D for ; Fri, 26 Mar 2021 10:52:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230097AbhCZKv4 (ORCPT ); Fri, 26 Mar 2021 06:51:56 -0400 Received: from out2-smtp.messagingengine.com ([66.111.4.26]:57885 "EHLO out2-smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230180AbhCZKvw (ORCPT ); Fri, 26 Mar 2021 06:51:52 -0400 Received: from compute5.internal (compute5.nyi.internal [10.202.2.45]) by mailout.nyi.internal (Postfix) with ESMTP id A158A5C0C73 for ; Fri, 26 Mar 2021 06:51:51 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute5.internal (MEProxy); Fri, 26 Mar 2021 06:51:51 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=talbothome.com; h=message-id:subject:from:to:date:content-type:mime-version :content-transfer-encoding; s=fm2; bh=IE5vgu08X3YiLpLNSVCSXrj96/ S4zgMPWk8c3r3u50s=; b=1x3ZQgv/ry9334d6/Sz7MvyaqiFLMtcSaN+sM84QDv wy/X0tDcIdVX5Y4NyQp7qkN1mRck9KUDZ+m9XSQ389PJrjOlUOVAvZW46bwhn+Jd tLcLRudyeHP9B4Xvpih8LcywVG9dd4K5fc2NLopMiOOBpeyjwX3iKu1MPq+fEgSK i2MYT4hOpmGpZSQcbc8OEnpPWybbVibE5JR4SUd2tizevQ4uS7iu/9Ov8YRk6Ouc ZqekqA+IqnznnVc4vA17LXXjQYoX1AmM65nb9Dlv3QBQ07hIAuNcE/9/1fs5dn/u 7g5C+VLpZu7any8/JJsC6UeM8oxu0WzQ0nkhqPr7qkIA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=content-transfer-encoding:content-type :date:from:message-id:mime-version:subject:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm2; bh=IE5vgu 08X3YiLpLNSVCSXrj96/S4zgMPWk8c3r3u50s=; b=R61EinIroOY8qiKxHhmwjW 2Xu+bXB/G0H7/pxq685mrfgsgxV6AMp1izd5K/OU+bYl0RZRUZwkAsDlww0UqFdq JyqhtHxqRKqnoNfsoDCg1LrT5EzjpLrVUU1tqPnAl3/uv9ynMIJ4J7rTQbYscRx9 67plqh+Du7LhUOz3Hr/sLTlvinGxpR57iib4X9xHmpkl183VHIlSapndqm0y/oet R9/AXfiaBRTFcmC82tLEjZZbmSAzjlxCu5+n8ENd6ThF8iNcHll6Tu8EHBdVs2OR g2leeGINMb5jQvZPtA/jZuy/zdqpT9mGgQ/9d+fsU1gLhf9q81jZzmAcN2aTAgSA == X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduledrudehvddgvddtucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucgovfgvgihtqfhnlhihqddqteefjeefqddtgeculd ehtddmnecujfgurhepkffuhffvffgtfggggfesthejredttderjeenucfhrhhomhepvehh rhhishhtohhphhgvrhcuvfgrlhgsohhtuceotghhrhhishesthgrlhgsohhthhhomhgvrd gtohhmqeenucggtffrrghtthgvrhhnpeejgeeuudetteeujeehjeeuheeigeeugffhueei gedthfekiedthffhueejgfduudenucffohhmrghinhepphhurhhirdhsmhenucfkphepje dvrdelhedrvdegfedrudehieenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhep mhgrihhlfhhrohhmpegthhhrihhssehtrghlsghothhhohhmvgdrtghomh X-ME-Proxy: Received: from SpaceballstheLaptop.talbothome.com (unknown [72.95.243.156]) by mail.messagingengine.com (Postfix) with ESMTPA id 5B60124005D for ; Fri, 26 Mar 2021 06:51:51 -0400 (EDT) Message-ID: <7b29e54909eae3a74f6c906339ab6561f2d5c768.camel@talbothome.com> Subject: [PATCH 6/9] Update README From: Christopher Talbot To: netdev@vger.kernel.org Date: Fri, 26 Mar 2021 06:51:51 -0400 User-Agent: Evolution 3.30.5-1.1 MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This updates the README for mmsd --- README | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 61 insertions(+), 5 deletions(-) + Whether you want delivery reports for MMSes you send + +TotalMaxAttachmentSize + The maximum size all of your attachments can be before mmsd rejects it. + NOTE: This value is carrier specific! Changing this value to a higher + number may cause your carrier to silently reject MMSes you send. + CHANGE AT YOUR OWN RISK! \ No newline at end of file diff --git a/README b/README index e33be69..cecc99f 100644 --- a/README +++ b/README @@ -2,20 +2,76 @@ Multimedia Messaging Service **************************** Copyright (C) 2010-2011 Intel Corporation. All rights reserved. +Updated 2021 by: Mohammad Sadiq, kent, kop316, + fuzzy7k, craftyguy, anteater +Parts adapted from: https://source.puri.sm/Librem5/purple-mm-sms + Copyright (C) 2018 Purism SPC + +About +=========================== +mmsd is a lower level daemon that transmits and recieves MMSes. It works with +both the ofono stack and the Modem Manager stack. +Please note that mmsd alone will not get MMS working! It is designed to work +with a higher level chat application to facilitate fetching and +sending MMS. It interfaces with other applications via the dbus. -Compilation and installation +Compiling mmsd ============================ - In order to compile proxy daemon you need following software packages: - GCC compiler - D-Bus library - GLib library +Installing mmsd +============================ + To configure run: - ./configure --prefix=/usr + ./bootstrap-configure --prefix=/usr/ Configure automatically searches for all required components and packages. -To compile and install run: - make && make install +To compile, run: + make + +And to Install: + make install + +mmsd will be installed in /${prefix}/libexec (if you are following this guide, +it is /usr/libexec ) + +To uninstall, simply remove the "mmsd" binary from /${prefix}/libexec or run: + sudo make uninstall + +Note that you must manually configure your favorite service manager to run +the daemon, as this installer does not configure it to autorun. + +Testing out mmsd +=========================== +To configure, run: + ./bootstrap-configure --enable-debug --enable-maintainer-mode + +Make it: + make + +Run daemon in foreground with debugging: + ./src/mmsd -n -d 'src/*' + +General Configuration +=========================== +On first run, mmsd will write a settings file at +"$HOME/.mms/$PLUGIN/mms" + +IMPORTANT NOTE: If you change settings in this file, mmsd MUST BE RESTARTED + for the changes to take effect! + +This settings file use sane defaults, but you can change them: + +UseDeliveryReports From patchwork Fri Mar 26 10:52:12 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chris Talbot X-Patchwork-Id: 12166341 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D4B47C433DB for ; Fri, 26 Mar 2021 10:52:57 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 805CF619BA for ; Fri, 26 Mar 2021 10:52:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229931AbhCZKw0 (ORCPT ); Fri, 26 Mar 2021 06:52:26 -0400 Received: from out2-smtp.messagingengine.com ([66.111.4.26]:56547 "EHLO out2-smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230192AbhCZKwO (ORCPT ); Fri, 26 Mar 2021 06:52:14 -0400 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id 5BA825C0DA9 for ; Fri, 26 Mar 2021 06:52:13 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute4.internal (MEProxy); Fri, 26 Mar 2021 06:52:13 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=talbothome.com; h=message-id:subject:from:to:date:content-type:mime-version :content-transfer-encoding; s=fm2; bh=CfK7y4/+k3ZNbNL/1R2+rWG26q vEUFxYYPBfkfs/JWI=; b=OmbR4ZfPhGzlKlnEQBWRObnI7Uq9sDSQOWVRBVUKDJ rqwfabEUQAaYc/WrDSQ+X9nIDu3wFMdpFc+CXdDMgE8AX5urRfd43b6Z/666jIc5 x3ZsjcTPglkeofL2+1pqcJv33Q9Vo0koV52zlFU7GPdvvTI4jPyhORlbcU7BTG4j qbbM3fV2Iu3Ef1gO26Lri/XEBWeOjMQPmkP3Rwls4laCVs2s6+h7DrGZi1Q0dHt8 9AltSKjeQWTIQ+zdic5NJHDRLek48CwAMKomdENZK93AT3/ID4Sl5RI7orLI5eRK YrwUjCQ1HCPpR67PUyhFSN+fWlc51OiNlsOboyDu6MCQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=content-transfer-encoding:content-type :date:from:message-id:mime-version:subject:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm2; bh=CfK7y4 /+k3ZNbNL/1R2+rWG26qvEUFxYYPBfkfs/JWI=; b=MLNxH4ilkmCWqIuN3i/nhC whRY70xqyJUISFGnqz1wiX6A38Tsq3OG23ISs294bbbbhFclrL/UtxtVutBDHK/d POb1IoENFW2gelfgrzKOaFqoTTD+BqlKYIqPHF9fe4e5Y1Q5sWMrLw9MUZvEGbnG C0IcPd4evLTP+qzGlEjT39f9PvjbB4mKuXOv13mt8W916vYDkuu/yqCQOt32z/gv mILvVp+gNTvgZl0QAfcd85J7cuOtY1BHDVlPgXp8xJ+hVpqthnkhBwfB5SHeHb3X 3JEtFh31spQ9V0VvA1llfNXX18LHeEEkQ8ApfeZrdKkxf2ckBVwW7ab4LFhxxSHA == X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduledrudehvddgvdduucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucenucfjughrpefkuffhvffftggfggfgsehtjeertd dtreejnecuhfhrohhmpeevhhhrihhsthhophhhvghrucfvrghlsghothcuoegthhhrihhs sehtrghlsghothhhohhmvgdrtghomheqnecuggftrfgrthhtvghrnhepieeitdevveegje euveeflefhhfeffeeijeffffeiteeifffhveeigeeghfevffdunecukfhppeejvddrleeh rddvgeefrdduheeinecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilh hfrhhomheptghhrhhishesthgrlhgsohhthhhomhgvrdgtohhm X-ME-Proxy: Received: from SpaceballstheLaptop.talbothome.com (unknown [72.95.243.156]) by mail.messagingengine.com (Postfix) with ESMTPA id 0AF2224005C for ; Fri, 26 Mar 2021 06:52:13 -0400 (EDT) Message-ID: Subject: [PATCH 7/9] Fix Draft and Sent Bugs From: Christopher Talbot To: netdev@vger.kernel.org Date: Fri, 26 Mar 2021 06:52:12 -0400 User-Agent: Evolution 3.30.5-1.1 MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This fixes some bugs related to sending MMSes: - Makes sure "sent" has an accurate time - Allows "Draft" to Go to "Sent" on the dbus - Allows the time to be preserved if mmsd is closed and opened in sent and recieved messages --- src/mmsutil.h | 2 ++ src/service.c | 60 +++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 48 insertions(+), 14 deletions(-) #include @@ -35,6 +36,8 @@ #include #include #include +#include +#include #include @@ -129,6 +132,11 @@ static DBusConnection *connection; static guint32 transaction_id_start = 0; + +static const char *time_to_str(const time_t *t); +void debug_print(const char* s, void* data); + + static void mms_load_settings(struct mms_service *service) { GError *error; @@ -220,6 +228,7 @@ static void emit_msg_status_changed(const char *path, const char *new_status) signal = dbus_message_new_signal(path, MMS_MESSAGE_INTERFACE, "PropertyChange d"); + if (signal == NULL) return; @@ -269,6 +278,7 @@ static DBusMessage *msg_mark_read(DBusConnection *conn, g_free(state); g_key_file_set_boolean(meta, "info", "read", TRUE); + mms->rc.status = MMS_MESSAGE_STATUS_READ; mms_store_meta_close(service->identity, mms->uuid, meta, TRUE); @@ -722,6 +732,7 @@ static gboolean result_request_send_conf(struct mms_request *request) g_key_file_set_string(meta, "info", "state", "sent"); g_key_file_set_string(meta, "info", "id", msg->sc.msgid); + request->msg->sr.status = MMS_MESSAGE_STATUS_SENT; mms_message_free(msg); @@ -1047,6 +1058,7 @@ static DBusMessage *send_message(DBusConnection *conn, struct mms_service *service = data; struct mms_request *request; GKeyFile *meta; + const char *datestr; msg = g_new0(struct mms_message, 1); if (msg == NULL) @@ -1059,7 +1071,13 @@ static DBusMessage *send_message(DBusConnection *conn, msg->sr.dr = service->use_delivery_reports; - if (send_message_get_args(dbus_msg, msg) == FALSE) { + time(&msg->sr.date); + + datestr = time_to_str(&msg->sr.date); + + msg->sr.datestamp = g_strdup(datestr); + + if (send_message_get_args(dbus_msg, msg, service) == FALSE) { mms_debug("Invalid arguments"); release_attachement_data(msg->attachments); @@ -1099,6 +1117,7 @@ static DBusMessage *send_message(DBusConnection *conn, if (meta == NULL) goto release_request; + g_key_file_set_string(meta, "info", "date", msg- >sr.datestamp); g_key_file_set_string(meta, "info", "state", "draft"); if (service->use_delivery_reports) { @@ -1339,10 +1358,12 @@ static gboolean load_message_from_store(const char *service_id, char *state = NULL; gboolean read_status; char *data_path = NULL; + char *datestr = NULL; gboolean success = FALSE; gboolean tainted = FALSE; void *pdu; size_t len; + struct tm tm; meta = mms_store_meta_open(service_id, uuid); if (meta == NULL) @@ -1354,6 +1375,13 @@ static gboolean load_message_from_store(const char *service_id, read_status = g_key_file_get_boolean(meta, "info", "read", NULL); + datestr = g_key_file_get_string(meta, "info", "date", NULL); + if (datestr != NULL) { + strptime(datestr, "%Y-%m-%dT%H:%M:%S%z", &tm); + } else { + mms_error("src/service.c:load_message_from_store() There is no date stamp!"); + } + data_path = mms_store_get_path(service_id, uuid); if (data_path == NULL) goto out; @@ -1372,25 +1400,28 @@ static gboolean load_message_from_store(const char *service_id, msg->uuid = g_strdup(uuid); - if (strcmp(state, "received") == 0 - && msg->type == MMS_MESSAGE_TYPE_RETRIEVE_CONF) { + if (strcmp(state, "received") == 0 && msg->type == MMS_MESSAGE_TYPE_RETRIEVE_CONF) { + msg->rc.datestamp = g_strdup(datestr); + msg->rc.date = mktime(&tm); if (read_status == TRUE) msg->rc.status = MMS_MESSAGE_STATUS_READ; else msg->rc.status = MMS_MESSAGE_STATUS_RECEIVED; - } else if (strcmp(state, "downloaded") == 0 - && msg->type == MMS_MESSAGE_TYPE_RETRIEVE_CONF) { + } else if (strcmp(state, "downloaded") == 0 && msg->type == MMS_MESSAGE_TYPE_RETRIEVE_CONF) { msg->rc.status = MMS_MESSAGE_STATUS_DOWNLOADED; if (msg->transaction_id == NULL) msg->transaction_id = ""; - } else if (strcmp(state, "sent") == 0 - && msg->type == MMS_MESSAGE_TYPE_SEND_REQ) + } else if (strcmp(state, "sent") == 0 && msg->type == MMS_MESSAGE_TYPE_SEND_REQ) { + msg->sr.datestamp = g_strdup(datestr); + msg->sr.date = mktime(&tm); msg->sr.status = MMS_MESSAGE_STATUS_SENT; - else if (strcmp(state, "draft") == 0 - && msg->type == MMS_MESSAGE_TYPE_SEND_REQ) + } + else if (strcmp(state, "draft") == 0 && msg->type == MMS_MESSAGE_TYPE_SEND_REQ) { + msg->sr.datestamp = g_strdup(datestr); + msg->sr.date = mktime(&tm); msg->sr.status = MMS_MESSAGE_STATUS_DRAFT; - else if (msg->type != MMS_MESSAGE_TYPE_NOTIFICATION_IND && - msg->type != MMS_MESSAGE_TYPE_DELIVERY_IND) + } + else if (msg->type != MMS_MESSAGE_TYPE_NOTIFICATION_IND && msg- >type != MMS_MESSAGE_TYPE_DELIVERY_IND) goto out; success = TRUE; @@ -1879,14 +1910,13 @@ static void append_rc_msg_properties(DBusMessageIter *dict, static void append_sr_msg_properties(DBusMessageIter *dict, struct mms_message *msg) { - const char *date = time_to_str(&msg->rc.date); const char *status = mms_message_status_get_string(msg- >sr.status); mms_dbus_dict_append_basic(dict, "Status", DBUS_TYPE_STRING, &status); mms_dbus_dict_append_basic(dict, "Date", - DBUS_TYPE_STRING, &date); + DBUS_TYPE_STRING, &msg- >sr.datestamp); if (msg->sr.to != NULL) append_msg_recipients(dict, msg); @@ -2120,6 +2150,9 @@ static gboolean result_request_notify_resp(struct mms_request *request) if (meta == NULL) return FALSE; + const char *datestr = time_to_str(&msg->rc.date); + msg->rc.datestamp = g_strdup(datestr); + g_key_file_set_string(meta, "info", "date", msg->rc.datestamp); g_key_file_set_string(meta, "info", "state", "received"); mms_store_meta_close(request->service->identity, @@ -2536,7 +2569,6 @@ void mms_service_bearer_notify(struct mms_service *service, mms_bool_t active, if (active == FALSE) goto interface_down; - DBG("interface %s proxy %s", interface, proxy); if (service->web != NULL) { diff --git a/src/mmsutil.h b/src/mmsutil.h index 00ecc39..ec139f1 100644 --- a/src/mmsutil.h +++ b/src/mmsutil.h @@ -120,12 +120,14 @@ struct mms_retrieve_conf { char *priority; char *msgid; time_t date; + char *datestamp; }; struct mms_send_req { enum mms_message_status status; char *to; time_t date; + char *datestamp; char *content_type; gboolean dr; }; diff --git a/src/service.c b/src/service.c index dede36d..b0c2428 100644 --- a/src/service.c +++ b/src/service.c @@ -18,6 +18,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110- 1301 USA * */ +#define _XOPEN_SOURCE 700 #ifdef HAVE_CONFIG_H From patchwork Fri Mar 26 10:52:32 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chris Talbot X-Patchwork-Id: 12166343 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E0CDDC433C1 for ; Fri, 26 Mar 2021 10:53:29 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id AAA5C61A48 for ; Fri, 26 Mar 2021 10:53:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229589AbhCZKxA (ORCPT ); Fri, 26 Mar 2021 06:53:00 -0400 Received: from out2-smtp.messagingengine.com ([66.111.4.26]:55653 "EHLO out2-smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230147AbhCZKwd (ORCPT ); Fri, 26 Mar 2021 06:52:33 -0400 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id 3D3155C0417 for ; Fri, 26 Mar 2021 06:52:33 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute4.internal (MEProxy); Fri, 26 Mar 2021 06:52:33 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=talbothome.com; h=message-id:subject:from:to:date:content-type:mime-version :content-transfer-encoding; s=fm2; bh=y2bM9dRopkzoEk8lqZkxxBzci4 WE3q4rVkAPN6fxBu4=; b=GkS61G1P15h4plo25xeOLGZhOYMLWKFJ1EvNP5JiVk HGPm0Sj7lzztpGHLF5cjk91jn26eFjyKagwSlDMswJGRRJYcHN060K3R4PB3wTZO VsTLVABZgo2AhHV2w1xMwAymu3Py2njYWZUobQeH35nCzxoa7ucwRPsajF02WIGH xvErP26UvHHK1tp7JaCxmoobvPBxUFW0miauwE52tlaU1ycPdrnJ9+Tn8qszNSUJ FN2cpQsVyAZiz+n3Avp+j3yAdovGhiVhbrKE/RPByR6EqsJIwFCMA+DdkNp90COh 0ND+MMfdWQ+2JJQFFYoGsQdifJt/otW5NOv3vs1LyODw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=content-transfer-encoding:content-type :date:from:message-id:mime-version:subject:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm2; bh=y2bM9d RopkzoEk8lqZkxxBzci4WE3q4rVkAPN6fxBu4=; b=GRUNmnuOLKOuIDXMT9r5bt rj1+fuv3PmveHPbOsWuoma4Gjx3pVCRgkekNPRHRln2snycHnvt7GCbwodoKtIwK t77NYTQF1E7TCcwlRLgSLc4s+6ie4fSMr9Q0+mY2ZSfNJBTWOXqIW5tqG2or3WqZ CcoqA/b20yDuwL+CWLAbkQ69H5DENdmVdP+mxKvVnnDEXNm2NERNc65WdGQSHl1C uiL1ynktZXvUWVIp0OLqnm2uwAitUeZUSv0O8LLPf9o0A4+79DvbAikyLww1o47F Xxh2uOr1OuEPQgWXvRi+eBM4/nnulm4/smeC0zhjVqNeXeTv5ws1wmjPHB0TfJ4A == X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduledrudehvddgvdduucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucenucfjughrpefkuffhvffftggfggfgsehtjeertd dtreejnecuhfhrohhmpeevhhhrihhsthhophhhvghrucfvrghlsghothcuoegthhhrihhs sehtrghlsghothhhohhmvgdrtghomheqnecuggftrfgrthhtvghrnhepieeitdevveegje euveeflefhhfeffeeijeffffeiteeifffhveeigeeghfevffdunecukfhppeejvddrleeh rddvgeefrdduheeinecuvehluhhsthgvrhfuihiivgepudenucfrrghrrghmpehmrghilh hfrhhomheptghhrhhishesthgrlhgsohhthhhomhgvrdgtohhm X-ME-Proxy: Received: from SpaceballstheLaptop.talbothome.com (unknown [72.95.243.156]) by mail.messagingengine.com (Postfix) with ESMTPA id 011BE24005A for ; Fri, 26 Mar 2021 06:52:32 -0400 (EDT) Message-ID: Subject: [PATCH 8/9] Allow Maintainer mode to compile without -WError From: Christopher Talbot To: netdev@vger.kernel.org Date: Fri, 26 Mar 2021 06:52:32 -0400 User-Agent: Evolution 3.30.5-1.1 MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Without this, compiling in maintainer mode errors out. --- acinclude.m4 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/acinclude.m4 b/acinclude.m4 index 329c6a9..314dbb1 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -15,7 +15,7 @@ AC_DEFUN([COMPILER_FLAGS], [ CFLAGS="-Wall -O2 -D_FORTIFY_SOURCE=2" fi if (test "$USE_MAINTAINER_MODE" = "yes"); then - CFLAGS+=" -Werror -Wextra" + CFLAGS+=" -Wextra" CFLAGS+=" -Wno-unused-parameter" CFLAGS+=" -Wno-missing-field-initializers" CFLAGS+=" -Wdeclaration-after-statement" From patchwork Fri Mar 26 10:52:54 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chris Talbot X-Patchwork-Id: 12166345 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 03B4BC433E0 for ; Fri, 26 Mar 2021 10:53:30 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id BC44361A4A for ; Fri, 26 Mar 2021 10:53:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230131AbhCZKxC (ORCPT ); Fri, 26 Mar 2021 06:53:02 -0400 Received: from out2-smtp.messagingengine.com ([66.111.4.26]:38057 "EHLO out2-smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229904AbhCZKw4 (ORCPT ); Fri, 26 Mar 2021 06:52:56 -0400 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id A72FB5C039E for ; Fri, 26 Mar 2021 06:52:55 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute4.internal (MEProxy); Fri, 26 Mar 2021 06:52:55 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=talbothome.com; h=message-id:subject:from:to:date:content-type:mime-version :content-transfer-encoding; s=fm2; bh=tIHnWTlAOk+32Qfbc3UgWb6FAU Wf/OOb0PkeXPS4kRQ=; b=kX6ZQRjUunvjuAy6WVZfoULlZ0ggwMS7eYuGfn4jQT Vf5irEpqoJR89c6DjF/YI21G97h9Y7NGMEuuHMvn6OC45WfyvIgujm0y5e6iWoFJ 7rScuqrnqV/fo76mX3a2Wxw1I5FN0+URMIkoJCkswHyelahzMwugWovuWtTEfX0D Rt7iL+l0RfcS0sC1kDHTexpoNg4NTLYnT4J1MEGwMx4wtLOYwJtBnXN2WyJa6l4O ugEyXh2Zw/+NtBLAZJJLCVAgx7UdhO6aucdCLsoo4cnkaw7yf8V2uxsrpGjhx7Pg JeCEewWo7CIQnJpRXZ+hz/EUuCmdgs2TPHao/dHUivxg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=content-transfer-encoding:content-type :date:from:message-id:mime-version:subject:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm2; bh=tIHnWT lAOk+32Qfbc3UgWb6FAUWf/OOb0PkeXPS4kRQ=; b=rOmdH5DQdC/ww/aqpKiuDp BHTOi2ilvQ6GCaKvY7wUBhOztZLon+QyQ+v/GvKXzh/f7MOD04zsqBSP6VtDwEee lqwbDmKQFOexXc8Cb5sztCHAb/Mp4AvRKdnLfQ8wTExviB2sIb0rGxjgc7UP8W/a ltCpJWzbin1xBMrpW3rmNIdRTVULoIOJUZvRvCohWE/gWxb+5KpehVuosq3YN3Eh Qq4ZE8rN5GBgDOGD/9AZlr/sxB0d21cUeosREgh2m1iSi4WTHGlpBawt//4IMUHf P2miEZlo/D9SpRN0g0lnJMQvlUK+O4V96CBIB5F6yqlP4kmfyzUchEL+JsEXwGNg == X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduledrudehvddgvdduucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucenucfjughrpefkuffhvffftggfggfgsehtjeertd dtreejnecuhfhrohhmpeevhhhrihhsthhophhhvghrucfvrghlsghothcuoegthhhrihhs sehtrghlsghothhhohhmvgdrtghomheqnecuggftrfgrthhtvghrnhepheeuhffhvedvie eggfduieehjeeihffhgeegfeehledtleejkeeiheehheeiuddunecuffhomhgrihhnpegv gigrmhhplhgvrdgtohhmpdhtqdhmohgsihhlvgdrtghomhdpphhurhhirdhsmhenucfkph epjedvrdelhedrvdegfedrudehieenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgr mhepmhgrihhlfhhrohhmpegthhhrihhssehtrghlsghothhhohhmvgdrtghomh X-ME-Proxy: Received: from SpaceballstheLaptop.talbothome.com (unknown [72.95.243.156]) by mail.messagingengine.com (Postfix) with ESMTPA id 5E86024005C for ; Fri, 26 Mar 2021 06:52:55 -0400 (EDT) Message-ID: <6d7de2009cfcae4108a19c6507f8793d051924ed.camel@talbothome.com> Subject: [PATCH 9/9] Add a Modem Manager Plugin From: Christopher Talbot To: netdev@vger.kernel.org Date: Fri, 26 Mar 2021 06:52:54 -0400 User-Agent: Evolution 3.30.5-1.1 MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This patch enables support for Modem Manager with mmsd. It has been tested on Mobian, PostmarketOS, and PureOS. It has also been tested on the Pinephone and Librem 5. It has also been tested on various carriers in the US, France, and Sweden. --- Makefile.am | 8 +- README | 81 +++- configure.ac | 5 + doc/modem-manager-api.txt | 102 ++++ plugins/modemmanager.c | 993 ++++++++++++++++++++++++++++++++++++++ src/service.c | 2 +- src/service.h | 2 + 7 files changed, 1187 insertions(+), 6 deletions(-) create mode 100644 doc/modem-manager-api.txt create mode 100644 plugins/modemmanager.c +void activate_bearer(struct mms_service *service); diff --git a/Makefile.am b/Makefile.am index 99fdb76..ecca9d8 100644 --- a/Makefile.am +++ b/Makefile.am @@ -12,8 +12,8 @@ builtin_sources = builtin_cflags = builtin_libadd = -builtin_modules += ofono -builtin_sources += plugins/ofono.c +builtin_modules += ofono modemmanager +builtin_sources += plugins/ofono.c plugins/modemmanager.c libexec_PROGRAMS = src/mmsd @@ -24,7 +24,7 @@ src_mmsd_SOURCES = $(gdbus_sources) $(gweb_sources) $(builtin_sources) \ src/push.h src/push.c src/store.h src/store.c \ src/wsputil.h src/wsputil.c src/mmsutil.h src/mmsutil.c -src_mmsd_LDADD = $(builtin_libadd) @GLIB_LIBS@ @DBUS_LIBS@ -lresolv -ldl +src_mmsd_LDADD = $(builtin_libadd) @GLIB_LIBS@ @DBUS_LIBS@ @MMGLIB_LIBS@ -lresolv -ldl src_mmsd_LDFLAGS = -Wl,--export-dynamic @@ -41,7 +41,7 @@ src/plugin.$(OBJEXT): src/builtin.h src/builtin.h: src/genbuiltin $(builtin_sources) $(AM_V_GEN)$(srcdir)/src/genbuiltin $(builtin_modules) > $@ -AM_CFLAGS = @GLIB_CFLAGS@ @DBUS_CFLAGS@ $(builtin_cflags) \ +AM_CFLAGS = @GLIB_CFLAGS@ @DBUS_CFLAGS@ @MMGLIB_CFLAGS@ $(builtin_cflags) \ -DMMS_PLUGIN_BUILTIN \ -DPLUGINDIR=\""$(plugindir)"\" \ -DPUSHCONFDIR=\""$(pushconfdir) "\" diff --git a/README b/README index cecc99f..d9da9f5 100644 --- a/README +++ b/README @@ -16,12 +16,33 @@ Please note that mmsd alone will not get MMS working! It is designed to work with a higher level chat application to facilitate fetching and sending MMS. It interfaces with other applications via the dbus. +Modem Manager specific notes +=========================== +Upon start up, mmsd looks for and tracks the state of the modem +that has Modem Messaging (i.e. SMS) capabilities. Since mmsd is a lower +level program, mmsd assumes that other parts of the OS stack/the +higher level chat application track/manage mobile connectivity and SMS. +This design decision was made as to not conflict with the OS stack and the +chat application. + +This decision has two primary consequences to be aware of: + - mmsd does NOT manage mobile connectivity, and does not track the state of + mobile connectivity. + - mmsd also NOT watch the Modem Manager SMS dbus interface for new SMS. + +Please note that due to limitations of Modem Manager, mmsd does not support +having multiple APNs at the same time (for carriers that seperate MMS APN +from Mobile Data APNs). + +Please read "Configuring the Modem Manager Plugin" for configuration. + Compiling mmsd ============================ In order to compile proxy daemon you need following software packages: - GCC compiler - D-Bus library - GLib library + - Modem Manager Library Installing mmsd ============================ @@ -74,4 +95,62 @@ TotalMaxAttachmentSize The maximum size all of your attachments can be before mmsd rejects it. NOTE: This value is carrier specific! Changing this value to a higher number may cause your carrier to silently reject MMSes you send. - CHANGE AT YOUR OWN RISK! \ No newline at end of file + CHANGE AT YOUR OWN RISK! + +Configuring the Modem Manager Plugin +=========================== +On first run, mmsd will write a settings file at +"$HOME/.mms/modemmanager/ModemManagerSettings" + +IMPORTANT NOTE: If you change any settings through the file, + mmsd MUST BE RESTARTED for the changes to take effect! + + You can change CarrierMMSC, CarrierMMSProxy, or MMS_APN via + dbus and they will take effect right away, but any + messages sent to the mmsd queue need to be processed + again. The easiest way to do this is to reset mmsd. + But it can be done with the dbus proxy call ProcessMessageQueue(). + +This settings file needs to be changed before mmsd will connect! The settings +are as follows: + +CarrierMMSC + Get this from your carrier. + + Carrier MMSC Format: "http://mms.example.com" + +CarrierMMSProxy + Get this from your carrier. + + MMS Proxy Format: "proxy.example.com:80" or "NULL" + Both the proxy address AND port are required, or else mmsd will not work! + The proxy is "proxy.example.com" + The proxy port is "80" + If you do NOT have a proxy, set this to "NULL" + +MMS_APN + Note that at this point, this plugin can only support one bearer at + a time (this works fine for carriers with a combined Internet/MMS APN + but will not function with carriers that have two APNS seperating + the two) + + MMS APN Format: "apn.example.com" + +AutoProcessOnConnection + Tell mmsd to automatically send and recieve messages when the modem + is connected. This will also allow mmsd to auto send/recieve if the + modem is disconnected and reconnects, suspends and unsuspends, etc. + + AutoProcessOnConnection Options: "true" or "false" + + +An example of what you are looking for is here: + https://www.t-mobile.com/support/devices/not-sold-by-t-mobile/byod-t-mobile-data-and-apn-settings + +From this: + +CarrierMMSC=http://mms.msg.eng.t-mobile.com/mms/wapenc +MMS_APN=fast.t-mobile.com +CarrierMMSProxy=NULL + + diff --git a/configure.ac b/configure.ac index 6b5e1b1..721eb19 100644 --- a/configure.ac +++ b/configure.ac @@ -78,4 +78,9 @@ PKG_CHECK_MODULES(DBUS, dbus-1 >= 1.2, dummy=yes, AC_SUBST(DBUS_CFLAGS) AC_SUBST(DBUS_LIBS) +PKG_CHECK_MODULES(MMGLIB, mm-glib >= 1.10, dummy=yes, + AC_MSG_ERROR(mm-glib >= 1.10 is required)) +AC_SUBST(MMGLIB_CFLAGS) +AC_SUBST(MMGLIB_LIBS) + AC_OUTPUT(Makefile) diff --git a/doc/modem-manager-api.txt b/doc/modem-manager-api.txt new file mode 100644 index 0000000..4a7f67f --- /dev/null +++ b/doc/modem-manager-api.txt @@ -0,0 +1,102 @@ +Message hierarchy +================= + +Service org.ofono.mms +Interface org.ofono.mms.ModemManager +Object path /org/ofono/mms + +NOTE: This is an independent bus from the rest of mmsd. In order to talk to + Modem Manager, this plugin must work with dbus 2.0. The rest of mmsd + operates on dbus 1.0. Be sure to connect independently to this bus! + +Methods + + PushNotify() + + Send mmsd the contents of an SMS WAP for it to process + See purple-mm-sms for how this is used + + Gvariant input Format String (ay) + This is the data contents of the SMS WAP + + ChangeSettings() + IMPORTANT NOTE: Settings changed here will work right away, but any + messages sent to the mmsd queue need to be processed + again. The easiest way to do this is to reset mmsd. + But it can be done with the dbus proxy call + ProcessMessageQueue() + + This sets and saves the Carrier MMSC, MMS Proxy, and MMS APN + + Gvariant Input Format String ((sss)) + Argument 1: Carrier MMSC + Argument 2: MMS Proxy + Argument 3: MMS APN + + Carrier MMSC + Get this from your carrier. + + Carrier MMSC Format: "http://mms.example.com" + + MMS Proxy + Get this from your carrier. + + MMS Proxy Format: "proxy.example.com:80" or "NULL" + The proxy is "proxy.example.com" + The Proxy port is "80" + Both the proxy address AND port is required, or else mmsd will not work! + If you do NOT have a proxy, set this to "NULL" + + MMS APN + Note that at this point, this plugin can only support one bearer at + a time (this works fine for carriers with a combined Internet/MMS APN + but will not function with carriers that have two APNS seperating + the two) + + MMS APN Format: "apn.example.com" + + Example Python Program to call "ChangeSettings": + + #!/usr/bin/python + + import pydbus + from pydbus import SessionBus + bus = SessionBus() + TestServer = bus.get("org.ofono.mms.ModemManager", "/org/ofono/mms") + TestServer.ChangeSettings(("http://mms.invalid", "NULL", "apn.invalid")) + #TestServer.ChangeSettings(("http://mms.invalid", "proxy.invalid:80", "apn.invalid")) + + ProcessMessageQueue() + This manually activates the Modem Manager Bearer to process any messages + not sent or recieved yet. The primary idea behind is two fold: + + a) If the Bearer Handler is misconfigured, the OS/higher level program + can change the settings via the dbus and test the bearer handler + to confirm it works. + + b) If modem data is disconnected (manually or due to modem suspend), + the OS/higher level program can also track this and can command + mmsd to now process any messages it needs to send/recieve once + modem data is active. + + Since BearerHandlerError() emits a signal for any errors activating the + modem contect, ProcessMessageQueue() does not return any value. + +Signals + BearerHandlerError() + If the bearer handler has an issue activating the context, it will emit + a signal of the error. The errors are shown above. + + NOTE: MMSD_MM_MODEM_CONTEXT_ACTIVE will never be emitted as a signal. + + Gvariant Output Format String (h) + enum { + MMSD_MM_MODEM_MMSC_MISCONFIGURED, //the MMSC is the default value + MMSD_MM_MODEM_NO_BEARERS_ACTIVE, //The Modem has no bearers + MMSD_MM_MODEM_INTERFACE_DISCONNECTED, //mmsd found the right bearer, but it is disconnected + MMSD_MM_MODEM_INCORRECT_APN_CONNECTED, //no APN is connected that matches the settings + MMSD_MM_MODEM_FUTURE_CASE_DISCONNECTED, //Reserved for future case + MMSD_MM_MODEM_CONTEXT_ACTIVE //No error, context activated properly + } mm_context_connection; + +Properties None diff --git a/plugins/modemmanager.c b/plugins/modemmanager.c new file mode 100644 index 0000000..1d67736 --- /dev/null +++ b/plugins/modemmanager.c @@ -0,0 +1,993 @@ +/* + * + * Multimedia Messaging Service + * + * Copyright (C) 2010-2011 Intel Corporation. All rights reserved. + * Updated 2021: kop316, fuzzy7k, craftyguy, Mohammad Sadiq + * + * Adapted from: https://source.puri.sm/Librem5/purple-mm-sms + * Copyright (C) 2018 Purism SPC + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program 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; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110- 1301 USA + * + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#include +#include +#include +#include "mms.h" + +// SETTINGS_STORE is synced with services.c +#define SETTINGS_STORE "ModemManagerSettings" +// SETTINGS_GROUP is where we store our settings for this plugin +#define SETTINGS_GROUP "Modem Manager" +//Identifier of the plugin +#define IDENTIFIER "modemmanager" +//dbus default timeout for Modem +#define MMSD_MM_MODEM_TIMEOUT 20000 + +enum { + MMSD_MM_STATE_NO_MANAGER, + MMSD_MM_STATE_MANAGER_FOUND, + MMSD_MM_STATE_NO_MODEM, + MMSD_MM_STATE_MODEM_FOUND, + MMSD_MM_STATE_NO_MESSAGING_MODEM, + MMSD_MM_STATE_MODEM_DISABLED, + MMSD_MM_STATE_MODEM_UNLOCK_ERROR, + MMSD_MM_STATE_READY +} e_mmsd_connection; + +enum { + MMSD_MM_MODEM_MMSC_MISCONFIGURED, //the MMSC is the default value + MMSD_MM_MODEM_NO_BEARERS_ACTIVE, //The Modem has no bearers + MMSD_MM_MODEM_INTERFACE_DISCONNECTED, //mmsd found the right bearer, but it is disconnected + MMSD_MM_MODEM_INCORRECT_APN_CONNECTED, //no APN is connected that matches the settings + MMSD_MM_MODEM_FUTURE_CASE_DISCONNECTED, //Reserved for future case + MMSD_MM_MODEM_CONTEXT_ACTIVE //No error, context activated properly +} mm_context_connection; + +struct modem_data { + struct mms_service *service; //Do not mess with the guts of this in plugin.c! + GKeyFile *modemsettings; + //These are pulled from the settings file, and can be set via the Dbus + char *message_center; // The mmsc + char *mms_apn; // The MMS APN + char *MMS_proxy; // I *think* this is where mms proxy goes? + // These are for settings the context (i.e. APN settings and if the bearer is active) + char *context_interface; // Bearer interface here (e.g. "wwan0") + char *context_path; // Dbus path of the bearer + dbus_bool_t context_active; // Whether the context is active + //The Bus org.ofono.mms.ModemManager + GDBusConnection *master_connection; + guint owner_id; + guint registration_id; + // This is a way to track the state of the modem if it is disabled + MmGdbusModem *gdbus_modem; + gulong modem_state_watch_id; + //These are modem manager related settings + MMManager *mm; + guint mm_watch_id; + MMObject *object; + MMModem *modem; + char *path; + MMSim *sim; + gchar *imsi; + MMModemMessaging *modem_messaging; + MMModemState state; + GPtrArray *device_arr; + gboolean modem_available; + gboolean manager_available; + gboolean plugin_registered; + gboolean auto_process_on_connection; +}; + +typedef struct { + MMObject *object; + MMModem *modem; + MMSim *sim; +} PurMmDevice; + +/* Introspection data for the service we are exporting */ +static const gchar introspection_xml[] = + "" + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + + " " + ""; + + +static GDBusNodeInfo *introspection_data = NULL; +struct modem_data *modem; + +static void mmsd_mm_state (int state); +static void mmsd_plugin_connect (void); +static void mmsd_plugin_disconnect (void); +static void free_device (PurMmDevice *device); +static void bearer_handler(mms_bool_t active, void *user_data); +static int set_context (void); +static void cb_mm_manager_new (GDBusConnection *connection, GAsyncResult *res, gpointer user_data); +static void mm_appeared_cb (GDBusConnection *connection, const gchar *name, const gchar *name_owner, gpointer user_data); +static void mm_vanished_cb (GDBusConnection *connection, const gchar *name, gpointer user_data); +static void mm_get_modem_manager (void); +static int modemmanager_init(void); +static void modemmanager_exit(void); + +static void +handle_method_call (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + if (g_strcmp0 (method_name, "PushNotify") == 0) + { + + GVariant *smswap; + const unsigned char *data; + gsize data_len; + if (modem->modem_available == TRUE) { + + g_variant_get (parameters, "(@ay)", &smswap); + data_len = g_variant_get_size (smswap); + data = g_variant_get_fixed_array (smswap, &data_len, 1); + mms_error("ModemManagerPlugin(): %s",__func__); + + mms_service_push_notify(modem->service, data, data_len); + g_dbus_method_invocation_return_value (invocation, NULL); + + } else { + g_dbus_method_invocation_return_dbus_error (invocation, + "org.ofono.mms.M odemManager", + "Modem is not active!"); + } + + } + else if (g_strcmp0 (method_name, "ChangeSettings") == 0) { + + const gchar *mmsc, *mmsproxy, *mmsapn; + g_variant_get (parameters, "((sss))", &mmsc, + &mmsproxy, + &mmsapn); + mms_error("ModemManagerPlugin(): args MMSC:%s MMS Proxy:%s MMS APN:%s", mmsc, mmsproxy, mmsapn); + modem->modemsettings = mms_settings_open(IDENTIFIER, SETTINGS_STORE); + + if (g_strcmp0(mmsc, "") != 0) { + g_free(modem->message_center); + modem->message_center = g_strdup(mmsc); + g_key_file_set_string(modem->modemsettings, SETTINGS_GROUP, + "CarrierMMSC", modem- >message_center); + } + + if (g_strcmp0(mmsproxy, "") != 0) { + g_free(modem->MMS_proxy); + modem->MMS_proxy = g_strdup(mmsproxy); + g_key_file_set_string(modem->modemsettings, SETTINGS_GROUP, + "CarrierMMSProxy", modem- >MMS_proxy); + if (g_strcmp0 (modem->MMS_proxy, "NULL") == 0) { + g_free(modem->MMS_proxy); + modem->MMS_proxy = NULL; + } + } + + if (g_strcmp0(mmsapn, "") != 0) { + g_free(modem->mms_apn); + modem->mms_apn = g_strdup(mmsapn); + g_key_file_set_string(modem->modemsettings, SETTINGS_GROUP, + "MMS_APN", modem->mms_apn); + } + mms_settings_close(IDENTIFIER, SETTINGS_STORE, + modem->modemsettings, TRUE); + + g_dbus_method_invocation_return_value (invocation, NULL); + } + else if (g_strcmp0 (method_name, "ProcessMessageQueue") == 0) { + if (modem->modem_available == TRUE) { + + /* + * Prevent a race condition from the connection turning active to usable + * for mmsd + */ + sleep(1); + + activate_bearer(modem->service); + g_dbus_method_invocation_return_value (invocation, NULL); + } else { + g_dbus_method_invocation_return_dbus_error (invocation, + "org.ofono.mms.M odemManager", + "Modem is not active!"); + } + } +} + +static const GDBusInterfaceVTable interface_vtable = +{ + handle_method_call +}; + +static void +on_bus_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + + modem->master_connection = connection; + + modem->registration_id = g_dbus_connection_register_object (connection, + "/org/ofono/mms ", + introspection_d ata->interfaces[0], + &interface_vtab le, + NULL, /* user_data */ + NULL, /* user_data_free_func */ + NULL); /* GError** */ + + g_assert (modem->registration_id > 0); +} + +static void +on_name_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ +} + +static void +on_name_lost (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ +} + +static void +mmsd_mm_init_modem (MMObject *obj) +{ + + modem->object = obj; + modem->modem = mm_object_get_modem (MM_OBJECT(obj)); + modem->path = mm_modem_dup_path (modem->modem); + + g_dbus_proxy_set_default_timeout (G_DBUS_PROXY(modem->modem), + MMSD_MM_MODEM_TIMEOUT); + + modem->modem_messaging = mm_object_get_modem_messaging (MM_OBJECT(obj)); + g_return_if_fail (MM_IS_MODEM_MESSAGING (modem- >modem_messaging)); + + mms_error("ModemManagerPlugin(): %s", __func__); +} + +static void +free_device (PurMmDevice *device) +{ + if (!device) + return; + + g_clear_object (&device->sim); + g_clear_object (&device->modem); + g_clear_object (&device->object); + g_free (device); +} + +static gboolean +device_match_by_object (PurMmDevice *device, + GDBusObject *object) + +{ + g_return_val_if_fail (G_IS_DBUS_OBJECT(object), FALSE); + g_return_val_if_fail (MM_OBJECT(device->object), FALSE); + + return object == G_DBUS_OBJECT (device->object); +} + +static void +mmsd_mm_add_object (MMObject *obj) +{ + PurMmDevice *device; + const gchar *object_path; + + object_path = g_dbus_object_get_object_path (G_DBUS_OBJECT (obj)); + + g_return_if_fail (object_path); + + if (g_ptr_array_find_with_equal_func (modem->device_arr, + obj, + (GEqualFunc)device_match_by_ob ject, + NULL)) { + mms_error("ModemManagerPlugin(): Device %s already added", object_path); + + return; + } + + mms_error("ModemManagerPlugin(): Added device at: %s", object_path); + + // TODO choose default modem if devices->len > 1 + + device = g_new0 (PurMmDevice, 1); + device->object = g_object_ref (MM_OBJECT (obj)); + device->modem = mm_object_get_modem (MM_OBJECT(obj)); + g_ptr_array_add (modem->device_arr, device); + + mmsd_mm_init_modem (obj); + + mmsd_mm_state (MMSD_MM_STATE_MODEM_FOUND); +} + +static void +mmsd_mm_get_modems (void) +{ + GList *list, *l; + gboolean has_modem = FALSE; + + g_return_if_fail (MM_IS_MANAGER (modem->mm)); + + list = g_dbus_object_manager_get_objects (G_DBUS_OBJECT_MANAGER (modem->mm)); + + for (l = list; l != NULL; l = l->next) { + if (!mm_object_peek_modem_messaging (l->data)) + continue; + + has_modem = TRUE; + mmsd_mm_add_object (MM_OBJECT(l->data)); + } + + if (!has_modem) { + mmsd_mm_state (MMSD_MM_STATE_NO_MODEM); + } else if (list) { + g_list_free_full (list, g_object_unref); + } +} + + +static void +cb_object_added (GDBusObjectManager *manager, + GDBusObject *object, + gpointer user_data) +{ + mms_error("ModemManagerPlugin(): %s", __func__); + if (mm_object_peek_modem_messaging (MM_OBJECT (object))) { + mms_error("ModemManagerPlugin(): New Object does not have Messaging feature, ignoring...."); + mmsd_mm_add_object (MM_OBJECT(object)); + } + + +} + + + +static void +cb_object_removed (GDBusObjectManager *manager, + GDBusObject *object, + gpointer user_data) +{ + guint index; + + + g_return_if_fail (G_IS_DBUS_OBJECT(object)); + g_return_if_fail (G_IS_DBUS_OBJECT_MANAGER(manager)); + + if (g_ptr_array_find_with_equal_func (modem->device_arr, + object, + (GEqualFunc)device_match_by_ob ject, + &index)) { + g_ptr_array_remove_index_fast (modem->device_arr, index); + } + + if (MM_OBJECT(object) == modem->object) { + mmsd_mm_state (MMSD_MM_STATE_NO_MODEM); + } + + mms_error("ModemManagerPlugin(): Modem removed: %s", g_dbus_object_get_object_path (object)); +} + + +static void +cb_name_owner_changed (GDBusObjectManager *manager, + GDBusObject *object, + gpointer user_data) +{ + gchar *name_owner; + + name_owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (manager)); + + if (!name_owner) { + mmsd_mm_state (MMSD_MM_STATE_NO_MANAGER); + } + + mms_error("ModemManagerPlugin(): Name owner changed"); + + g_free (name_owner); +} + +static void +cb_mm_manager_new (GDBusConnection *connection, + GAsyncResult *res, + gpointer user_data) +{ + gchar *name_owner; + g_autoptr(GError) error = NULL; + + + modem->mm = mm_manager_new_finish (res, &error); + modem->device_arr = g_ptr_array_new_with_free_func ((GDestroyNotify) free_device); + + if (modem->mm) { + + mmsd_mm_state (MMSD_MM_STATE_MANAGER_FOUND); + + g_signal_connect (modem->mm, + "interface-added", + G_CALLBACK (cb_object_added), + NULL); + + g_signal_connect (modem->mm, + "object-added", + G_CALLBACK (cb_object_added), + NULL); + + g_signal_connect (modem->mm, + "object-removed", + G_CALLBACK (cb_object_removed), + NULL); + + g_signal_connect (modem->mm, + "notify::name-owner", + G_CALLBACK (cb_name_owner_changed), + NULL); + + name_owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (modem->mm)); + mms_error("ModemManagerPlugin(): ModemManager found: %s\n", name_owner); + g_free (name_owner); + + mmsd_mm_get_modems (); + + } else { + mms_error("ModemManagerPlugin(): Error connecting to ModemManager: %s\n", error->message); + + mmsd_mm_state (MMSD_MM_STATE_NO_MANAGER); + } + +} + +static void +cb_get_sim_ready (MMModem *MMmodem, + GAsyncResult *res, + gpointer user_data) +{ + modem->sim = mm_modem_get_sim_finish (MMmodem, res, NULL); + + modem->imsi = mm_sim_dup_imsi (modem->sim); + + mms_error("ModemManagerPlugin(): Got SIM Path: %s Identifier: %s, imsi: %s", mm_sim_get_path (modem->sim), + mm_sim_get_identifier (modem->sim), modem->imsi); +} + +static void +mmsd_mm_get_modem_state (void) +{ + g_autoptr(GError) error = NULL; + + if (!modem->modem) { + mmsd_mm_state (MMSD_MM_STATE_NO_MODEM); + return; + } + + if (!modem->modem_messaging) { + mmsd_mm_state (MMSD_MM_STATE_NO_MESSAGING_MODEM); + return; + } + + if (modem->state < MM_MODEM_STATE_ENABLED) { + mms_error("ModemManagerPlugin(): Something May be wrong with the modem, checking...."); + switch (modem->state) { + case MM_MODEM_STATE_FAILED: + mms_error("ModemManagerPlugin(): MM_MODEM_STATE_FAILED"); + mmsd_mm_state (MMSD_MM_STATE_MODEM_DISABLED); + return; + case MM_MODEM_STATE_UNKNOWN: + mms_error("ModemManagerPlugin(): MM_MODEM_STATE_UNKNOWN"); + mmsd_mm_state (MMSD_MM_STATE_MODEM_DISABLED); + return; + case MM_MODEM_STATE_LOCKED: + mms_error("ModemManagerPlugin(): MM_MODEM_STATE_FAILED"); + mmsd_mm_state (MMSD_MM_STATE_MODEM_DISABLED); + return; + case MM_MODEM_STATE_INITIALIZING: + mms_error("ModemManagerPlugin(): MM_MODEM_STATE_INITIALIZING"); + mmsd_mm_state (MMSD_MM_STATE_MODEM_DISABLED); + return; + case MM_MODEM_STATE_DISABLED: + mms_error("ModemManagerPlugin(): MM_MODEM_STATE_DISABLED"); + mms_error("ModemManagerPlugin(): Turning on Modem...."); + mm_modem_set_power_state_sync (modem->modem, MM_MODEM_POWER_STATE_ON, NULL, &error); + mmsd_mm_state (MMSD_MM_STATE_MODEM_DISABLED); + return; + case MM_MODEM_STATE_DISABLING: + mms_error("ModemManagerPlugin(): MM_MODEM_STATE_DISABLING"); + mmsd_mm_state (MMSD_MM_STATE_MODEM_DISABLED); + return; + case MM_MODEM_STATE_ENABLING: + mms_error("ModemManagerPlugin(): MM_MODEM_STATE_ENABLING"); + mmsd_mm_state (MMSD_MM_STATE_MODEM_DISABLED); + return; + default: + mms_error("ModemManagerPlugin(): MM_MODEM_OTHER_BAD_STATE: %d", modem->state); + mmsd_mm_state (MMSD_MM_STATE_MODEM_DISABLED); + return; + } + } + mms_error("ModemManagerPlugin(): MM_MODEM_GOOD_STATE: %d", modem- >state); + mmsd_mm_state (MMSD_MM_STATE_READY); + + /* Automatically process unsent/unrecieved messages when the modem is connected */ + if (modem->state == MM_MODEM_STATE_CONNECTED) { + if (modem->auto_process_on_connection == TRUE) { + mms_error("Auto processing unsent/unrecieved messages per settings."); + /* + * Prevent a race condition from the connection + * turning active to usable for mmsd + */ + sleep(1); + + activate_bearer(modem->service); + } else { + mms_error("Not auto processing unsent/unrecieved messages per settings."); + } + } + return; +} + +static void +modem_state_changed_cb (MMModem *cb_modem, + MMModemState old, + MMModemState new, + MMModemStateChangeReason reason) +{ + mms_error("ModemManagerPlugin(): State Change: Old State: %d New State: %d, Reason: %d", old, new, reason); + modem->state = new; + mmsd_mm_get_modem_state (); + +} + + + +static void +mmsd_mm_state (int state) +{ + + switch (state) { + case MMSD_MM_STATE_MODEM_FOUND: + if (!modem->modem_available) { + if (modem->modem) { + mm_modem_get_sim (modem->modem, + NULL, + (GAsyncReadyCallback)cb_get_sim_ready, + NULL); + + modem->gdbus_modem = MM_GDBUS_MODEM(modem->modem); + + modem->modem_state_watch_id = g_signal_connect(modem- >gdbus_modem, + "state- changed", + G_CALLBACK( modem_state_changed_cb), + NULL); + } + modem->state = mm_modem_get_state (modem->modem); + mmsd_mm_get_modem_state (); + + } + break; + case MMSD_MM_STATE_NO_MODEM: + if (modem->modem_available) { + g_signal_handler_disconnect (modem->gdbus_modem, + modem->modem_state_watch_id); + mmsd_plugin_disconnect(); + mms_error("ModemManagerPlugin(): Modem vanished, Disabling plugin"); + + + } else { + mms_error("ModemManagerPlugin(): Could not connect to modem"); + } + modem->modem_available = FALSE; + mms_error("ModemManagerPlugin(): MMSD_MM_STATE_NO_MODEM"); + break; + + case MMSD_MM_STATE_NO_MESSAGING_MODEM: + g_signal_handler_disconnect (modem->gdbus_modem, + modem->modem_state_watch_id); + mmsd_plugin_disconnect(); + mms_error("ModemManagerPlugin(): Modem has no messaging capabilities"); + mms_error("ModemManagerPlugin(): MMSD_MM_STATE_NO_MESSAGING_MODEM"); + modem->modem_available = FALSE; + break; + + case MMSD_MM_STATE_MODEM_DISABLED: + + mms_error("ModemManagerPlugin(): Modem disabled"); + mms_error("ModemManagerPlugin(): MMSD_MM_STATE_MODEM_DISABLED"); + mms_service_set_bearer_handler(modem->service, NULL, NULL); + modem->modem_available = FALSE; + break; + + case MMSD_MM_STATE_MANAGER_FOUND: + if (!modem->manager_available) { + modem->manager_available = TRUE; + + modem->owner_id = g_bus_own_name (G_BUS_TYPE_SESSION, + "org.ofono.mms.ModemManager" , + G_BUS_NAME_OWNER_FLAGS_NONE, + on_bus_acquired, + on_name_acquired, + on_name_lost, + NULL, + NULL); + + } + + mms_error("ModemManagerPlugin(): MMSD_MM_STATE_MANAGER_FOUND"); + break; + + case MMSD_MM_STATE_NO_MANAGER: + if (modem->manager_available) { + mmsd_plugin_disconnect(); + g_clear_object (&modem->mm); + g_dbus_connection_unregister_object (modem->master_connection, + modem->registration_id); + g_bus_unown_name (modem->owner_id); + mms_error("ModemManagerPlugin(): ModemManager vanished"); + modem->modem_available = FALSE; + } else { + mms_error("ModemManagerPlugin(): Could not connect to ModemManager"); + } + + modem->manager_available = FALSE; + mms_error("ModemManagerPlugin(): MMSD_MM_STATE_NO_MANAGER"); + break; + + case MMSD_MM_STATE_MODEM_UNLOCK_ERROR: + mms_error("ModemManagerPlugin(): SIM card unlock failed"); + mms_error("ModemManagerPlugin(): MMSD_MM_STATE_MODEM_UNLOCK_ERROR"); + break; + + case MMSD_MM_STATE_READY: + mms_error("ModemManagerPlugin(): MMSD_MM_STATE_READY"); + modem->modem_available = TRUE; + mmsd_plugin_connect(); + break; + + default: + g_return_if_reached (); + } +} + +static void +mm_appeared_cb (GDBusConnection *connection, + const gchar *name, + const gchar *name_owner, + gpointer user_data) +{ + g_assert (G_IS_DBUS_CONNECTION (connection)); + + mm_manager_new (connection, + G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE, + NULL, + (GAsyncReadyCallback) cb_mm_manager_new, + NULL); + +} + +static void +mm_vanished_cb (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + g_assert (G_IS_DBUS_CONNECTION (connection)); + + mms_error("ModemManagerPlugin(): Modem Manager vanished"); + + mmsd_mm_state (MMSD_MM_STATE_NO_MANAGER); +} + +static void +mm_get_modem_manager (void) +{ + + modem->mm_watch_id = g_bus_watch_name (G_BUS_TYPE_SYSTEM, + MM_DBUS_SERVICE, + G_BUS_NAME_WATCHER_FLAGS_AUT O_START, + (GBusNameAppearedCallback) mm_appeared_cb, + (GBusNameVanishedCallback) mm_vanished_cb, + NULL, NULL); +} + +static void bearer_handler(mms_bool_t active, void *user_data) +{ + struct modem_data *modem = user_data; + gint32 response; + + /* Check for any errors within the context */ + response = set_context(); + if (response != MMSD_MM_MODEM_CONTEXT_ACTIVE) { + mms_error("ModemManagerPlugin(): Set MMSC: %s, Set Proxy: %s, Set MMS APN: %s", modem->message_center, modem->MMS_proxy, modem- >mms_apn); + g_dbus_connection_emit_signal (modem->master_connection, + NULL, + "/org/ofono/mms", + "org.ofono.mms.ModemManager", + "BearerHandlerError", + g_variant_new ("(h)", + response), + NULL); + } + + mms_error("ModemManagerPlugin(): At Bearer Handler: path %s active %d context_active %d", modem->path, active, modem- >context_active); + if (active == TRUE && modem->context_active == TRUE) { + mms_error("ModemManagerPlugin(): active and context_active, bearer_notify"); + mms_service_bearer_notify(modem->service, TRUE, modem- >context_interface, modem->MMS_proxy); + return; + } else if (active == TRUE && modem->context_active == FALSE) { + mms_error("ModemManagerPlugin(): Error activating context!"); + mms_service_bearer_notify(modem->service, FALSE, NULL, NULL); + return; + } + + mms_error("ModemManagerPlugin(): checking for failure"); + if (active == FALSE && modem->context_active == FALSE) { + mms_error("ModemManagerPlugin(): Context not active!"); + mms_service_bearer_notify(modem->service, FALSE, NULL, NULL); + return; + } else { + mms_error("ModemManagerPlugin(): No failures"); + mms_service_bearer_notify(modem->service, FALSE, modem- >context_interface, modem->MMS_proxy); + return; + } + +} + +static int set_context (void) { + guint max_bearers, active_bearers; + GList *bearer_list, *l; + MMBearer *modem_bearer; + MMBearerProperties *modem_bearer_properties; + const gchar *apn; + gboolean interface_disconnected; + gboolean bearer_connected; + + mms_error("ModemManagerPlugin(): Setting Context..."); + if (modem->context_active) { + g_free(modem->context_interface); + g_free(modem->context_path); + } + modem->context_active = FALSE; + interface_disconnected = FALSE; + mms_service_set_mmsc(modem->service, modem->message_center); + max_bearers = mm_modem_get_max_active_bearers (modem->modem); + mms_error("ModemManagerPlugin(): Max number of bearers: %d", max_bearers); + bearer_list = mm_modem_list_bearers_sync (modem->modem, NULL, NULL); + active_bearers = 0; + if (bearer_list != NULL) { + for (l = bearer_list; l != NULL; l = l->next) + { + active_bearers = active_bearers + 1; + modem_bearer = (MMBearer *) l->data; + modem_bearer_properties = mm_bearer_get_properties (modem_bearer); + apn = mm_bearer_properties_get_apn (modem_bearer_properties); + mms_error("ModemManagerPlugin(): Current Context APN: %s, mmsd settings MMS APN: %s", apn, modem->mms_apn); + bearer_connected = mm_bearer_get_connected (modem_bearer); + if (g_strcmp0 (apn, modem->mms_apn) == 0 ) { + if (modem->state != MM_MODEM_STATE_CONNECTED) { + mms_error("ModemManagerPlugin(): The modem interface is reporting it is disconnected!"); + mms_error("ModemManagerPlugin(): Reported State: %d", modem->state); + interface_disconnected = TRUE; + } else if (!bearer_connected) { + mms_error("ModemManagerPlugin(): The proper context is not connected!"); + interface_disconnected = TRUE; + } else { + mms_error("ModemManagerPlugin(): You are connected to the correct APN! Enabling context..."); + modem->context_interface = mm_bearer_dup_interface (modem_bearer); + modem->context_path = mm_bearer_dup_path (modem_bearer); + modem->context_active = TRUE; + } + } + } + g_list_free (bearer_list); + g_list_free (l); + if (!modem->context_active) { // I did not find the right context I wanted. + if(active_bearers == max_bearers) { + if(interface_disconnected) { + return MMSD_MM_MODEM_INTERFACE_DISCONNECTED; + } else { + mms_error("ModemManagerPlugin(): The modem is not connected to the correct APN!"); + return MMSD_MM_MODEM_INCORRECT_APN_CONNECTED; + } + } else if (active_bearers == 0) { + mms_error("ModemManagerPlugin(): The modem bearer is disconnected! Please enable modem data"); + return MMSD_MM_MODEM_NO_BEARERS_ACTIVE; + } + else if (active_bearers < max_bearers) { + /* + * TODO: Modem manager does not support this yet, but this is + * where to add code when Modem manager supports multiple + * contexts and/or a seperate MMS context. + * The Pinephone and Librem 5 only support + * one active bearer as well + */ + mms_error("ModemManagerPlugin(): This is a stub for adding a new context/bearer, but Modem Manager does not support this yet."); + return MMSD_MM_MODEM_FUTURE_CASE_DISCONNECTED; + } + } + } else { + mms_error("ModemManagerPlugin(): There are no modem bearers! Please enable modem data"); + return MMSD_MM_MODEM_NO_BEARERS_ACTIVE; + } + + if (g_strcmp0(modem->message_center, "http://mmsc.invalid") == 0) { + mms_error("ModemManagerPlugin(): The MMSC is not configured! Please configure the MMSC and restart mmsd."); + return MMSD_MM_MODEM_MMSC_MISCONFIGURED; + } + + return MMSD_MM_MODEM_CONTEXT_ACTIVE; + +} + +static void mmsd_plugin_connect (void) { + + if (modem->plugin_registered == FALSE) { + mms_error("ModemManagerPlugin(): Registering Modem Manager MMS Service"); + mms_service_register(modem->service); + modem-> plugin_registered = TRUE; + } + mms_error("ModemManagerPlugin(): Setting Bearer Handler"); + mms_service_set_bearer_handler(modem->service, bearer_handler, modem); + +} + + +static void mmsd_plugin_disconnect (void) { + + mms_error("ModemManagerPlugin(): Disabling Bearer Handler"); + mms_service_set_bearer_handler(modem->service, NULL, NULL); + g_object_unref(modem->sim); + g_free(modem->imsi); + g_free(modem->path); + g_clear_object (&modem->modem); + g_clear_object (&modem->modem_messaging); + modem->object = NULL; + if (modem->device_arr && modem->device_arr->len) { + g_ptr_array_set_size (modem->device_arr, 0); + g_ptr_array_unref(modem->device_arr); + } + modem->modem_available = FALSE; +} + +static int modemmanager_init(void) +{ + g_autoptr(GError) error = NULL; + /* Set up modem Structure to be used here */ + modem = g_try_new0(struct modem_data, 1); + + if (modem == NULL) { + mms_error("ModemManagerPlugin(): Could not allocate space for modem data!"); + return -ENOMEM; + } + modem->service = mms_service_create(); + mms_service_set_identity(modem->service, IDENTIFIER); + + // Opening/making config file at $HOME/.mms/modemmanager/ModemManagerSettings + modem->modemsettings = mms_settings_open(IDENTIFIER, SETTINGS_STORE); + + modem->message_center = g_key_file_get_string(modem- >modemsettings, + SETTINGS_GROUP, + "CarrierMMSC", &error); + if (error) { + mms_error("ModemManagerPlugin(): No MMSC was configured!"); + modem->message_center = g_strdup("http://mms.invalid"); + g_key_file_set_string(modem->modemsettings, SETTINGS_GROUP, + "CarrierMMSC", modem->message_center); + error = NULL; + } + + modem->mms_apn = g_key_file_get_string(modem->modemsettings, + SETTINGS_GROUP, + "MMS_APN", &error); + if (error) { + mms_error("ModemManagerPlugin(): No MMS APN was configured!"); + modem->mms_apn = g_strdup("apn.invalid"); + g_key_file_set_string(modem->modemsettings, SETTINGS_GROUP, + "MMS_APN", modem->mms_apn); + error = NULL; + } + + modem->MMS_proxy = g_key_file_get_string(modem->modemsettings, + SETTINGS_GROUP, + "CarrierMMSProxy", &error); + if (error) { + mms_error("ModemManagerPlugin(): No Context Proxy was configured! Setting to NULL."); + modem->MMS_proxy = g_strdup("NULL"); + g_key_file_set_string(modem->modemsettings, SETTINGS_GROUP, + "CarrierMMSProxy", modem->MMS_proxy); + error = NULL; + } + if (g_strcmp0 (modem->MMS_proxy, "NULL") == 0) { + g_free(modem->MMS_proxy); + modem->MMS_proxy = NULL; + } + + modem->auto_process_on_connection = g_key_file_get_boolean(modem- >modemsettings, + SETTING S_GROUP, + "AutoPr ocessOnConnection", + &error) ; + if (error) { + mms_error("ModemManagerPlugin(): Auto Process On Connection was not configured! Setting to TRUE."); + modem->auto_process_on_connection = TRUE; + g_key_file_set_boolean(modem->modemsettings, SETTINGS_GROUP, + "AutoProcessOnConnection", modem- >auto_process_on_connection); + error = NULL; + } + + mms_settings_close(IDENTIFIER, SETTINGS_STORE, + modem->modemsettings, TRUE); + introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL); + g_assert (introspection_data != NULL); + + modem->modem_available = FALSE; + modem->manager_available = FALSE; + modem->context_active = FALSE; + modem->plugin_registered = FALSE; + mm_get_modem_manager (); + + return 0; +} + +static void modemmanager_exit(void) +{ + if (modem->plugin_registered == TRUE) { + mms_service_unregister(modem->service); + } + if (modem->manager_available) { + mmsd_plugin_disconnect(); + g_clear_object (&modem->mm); + g_dbus_connection_unregister_object (modem->master_connection, + modem->registration_id); + g_bus_unown_name (modem->owner_id); + } + g_free(modem->message_center); + g_free(modem->MMS_proxy); + g_free(modem->mms_apn); + g_free(modem); + g_dbus_node_info_unref (introspection_data); + +} + +MMS_PLUGIN_DEFINE(modemmanager, modemmanager_init, modemmanager_exit) \ No newline at end of file diff --git a/src/service.c b/src/service.c index b0c2428..7df77da 100644 --- a/src/service.c +++ b/src/service.c @@ -647,7 +647,7 @@ static void process_request_queue(struct mms_service *service); static void emit_message_added(const struct mms_service *service, struct mms_message *msg); -static void activate_bearer(struct mms_service *service) +void activate_bearer(struct mms_service *service) { DBG("service %p setup %d active %d", service, service- >bearer_setup, service->bearer_active); diff --git a/src/service.h b/src/service.h index 56c0585..586ceca 100644 --- a/src/service.h +++ b/src/service.h @@ -52,3 +52,5 @@ int mms_message_register(struct mms_service *service, struct mms_message *msg); int mms_message_unregister(const struct mms_service *service, const char *msg_path); +