* [PATCH 7/9] Fix Draft and Sent Bugs @ 2021-03-26 10:56 Christopher Talbot 0 siblings, 0 replies; 5+ messages in thread From: Christopher Talbot @ 2021-03-26 10:56 UTC (permalink / raw) To: netdev 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(-) 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 #include <config.h> @@ -35,6 +36,8 @@ #include <glib.h> #include <glib/gstdio.h> #include <gdbus.h> +#include <time.h> +#include <stdio.h> #include <gweb/gweb.h> @@ -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) { -- 2.30.0 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 0/9] Updates for mmsd @ 2021-04-10 14:13 Chris Talbot 2021-04-10 14:17 ` [PATCH 1/9] Fix mmsd to work with T-mobile Chris Talbot 0 siblings, 1 reply; 5+ messages in thread From: Chris Talbot @ 2021-04-10 14:13 UTC (permalink / raw) To: ofono, netdev, debian-on-mobile-maintainers, librem-5-dev Hello, I am submitting a series of patches for mmsd that I have been working on. The patches have been successfully tested on PostmarketOS, Debian on Mobile (Mobian), PureOS, and Fedora. The patches fall into two catagories: 1) core fixes to mmsd to get it to work with several carriers (including T-Mobile USA, AT&T USA, Telus Canada, and a Swedish Carrier). 2) A new plugin to enable mmsd functionality on Modem Manager. The Patches have been tested on both the Pinephone and the Librem 5, and have been confirmed tested accross all major US carriers (as well as several minor US carriers), Canadian carriers, French carriers, and Swedish carriers. They been been likely tested on more carriers, but the author can only confirm the above ones (as he has gotten positive feedback for them). -- Respectfully, Chris Talbot ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 1/9] Fix mmsd to work with T-mobile 2021-04-10 14:13 [PATCH 0/9] Updates for mmsd Chris Talbot @ 2021-04-10 14:17 ` Chris Talbot 2021-04-10 14:20 ` [PATCH 2/9] Ensure Compatibility with Telus Canada Chris Talbot 0 siblings, 1 reply; 5+ messages in thread From: Chris Talbot @ 2021-04-10 14:17 UTC (permalink / raw) To: ofono, netdev, debian-on-mobile-maintainers, librem-5-dev This patch is a squashed version of a series of patches here: https://git.sr.ht/~anteater/mmsd It also includes some fixes to a few hacks in the code. Rather than submit two patches that need to go together, I just squashed it into one commit. --- 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(-) 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 <arpa/inet.h> #include <arpa/nameser.h> #include <net/if.h> +#include <ifaddrs.h> #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: {}"\ " <recipient>,..."\ " <smil-file-path>"\ " <<content-id>,<content-type>,<file-path>>,..."\ - % (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: 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) -- 2.30.2 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/9] Ensure Compatibility with Telus Canada 2021-04-10 14:17 ` [PATCH 1/9] Fix mmsd to work with T-mobile Chris Talbot @ 2021-04-10 14:20 ` Chris Talbot 2021-04-10 14:20 ` [PATCH 3/9] Ensure Compatibility with AT&T Chris Talbot 0 siblings, 1 reply; 5+ messages in thread From: Chris Talbot @ 2021-04-10 14:20 UTC (permalink / raw) To: ofono, netdev, debian-on-mobile-maintainers, librem-5-dev Telus Canada makes mmsd decode a header that is not in the standard. This patch allows this header to be decoded and allows for MMS support in Telus Canada. --- src/mmsutil.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) 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; } 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); -- 2.30.2 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 3/9] Ensure Compatibility with AT&T 2021-04-10 14:20 ` [PATCH 2/9] Ensure Compatibility with Telus Canada Chris Talbot @ 2021-04-10 14:20 ` Chris Talbot 2021-04-10 14:21 ` [PATCH 4/9] Fix issue if there is an empty string in encoded text Chris Talbot 0 siblings, 1 reply; 5+ messages in thread From: Chris Talbot @ 2021-04-10 14:20 UTC (permalink / raw) To: ofono, netdev, debian-on-mobile-maintainers, librem-5-dev 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(-) 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 */ if (g_strcmp0(proxy, "") != 0) g_web_set_proxy(service->web, proxy); -- 2.30.2 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 4/9] Fix issue if there is an empty string in encoded text 2021-04-10 14:20 ` [PATCH 3/9] Ensure Compatibility with AT&T Chris Talbot @ 2021-04-10 14:21 ` Chris Talbot 2021-04-10 14:22 ` [PATCH 5/9] Allow for a user configurable maximum attachment size Chris Talbot 0 siblings, 1 reply; 5+ messages in thread From: Chris Talbot @ 2021-04-10 14:21 UTC (permalink / raw) To: ofono, netdev, debian-on-mobile-maintainers, librem-5-dev 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(+) 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: /* Text-string */ -- 2.30.2 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 5/9] Allow for a user configurable maximum attachment size 2021-04-10 14:21 ` [PATCH 4/9] Fix issue if there is an empty string in encoded text Chris Talbot @ 2021-04-10 14:22 ` Chris Talbot 2021-04-10 14:22 ` [PATCH 6/9] Update README Chris Talbot 0 siblings, 1 reply; 5+ messages in thread From: Chris Talbot @ 2021-04-10 14:22 UTC (permalink / raw) To: ofono, netdev, debian-on-mobile-maintainers, librem-5-dev 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(-) 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, + "TotalMaxAttachmentSiz e", &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, + "TotalMaxAttachmentSiz e", + 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, -- 2.30.2 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 6/9] Update README 2021-04-10 14:22 ` [PATCH 5/9] Allow for a user configurable maximum attachment size Chris Talbot @ 2021-04-10 14:22 ` Chris Talbot 2021-04-10 14:23 ` Chris Talbot 0 siblings, 1 reply; 5+ messages in thread From: Chris Talbot @ 2021-04-10 14:22 UTC (permalink / raw) To: ofono, netdev, debian-on-mobile-maintainers, librem-5-dev This updates the README for mmsd --- README | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 61 insertions(+), 5 deletions(-) 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 + 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 -- 2.30.2 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 7/9] Fix Draft and Sent Bugs 2021-04-10 14:22 ` [PATCH 6/9] Update README Chris Talbot @ 2021-04-10 14:23 ` Chris Talbot 0 siblings, 0 replies; 5+ messages in thread From: Chris Talbot @ 2021-04-10 14:23 UTC (permalink / raw) To: ofono, netdev, debian-on-mobile-maintainers, librem-5-dev This patch fixes a few bugs: - 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 --- src/mmsutil.h | 2 ++ src/service.c | 60 +++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 48 insertions(+), 14 deletions(-) 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 #include <config.h> @@ -35,6 +36,8 @@ #include <glib.h> #include <glib/gstdio.h> #include <gdbus.h> +#include <time.h> +#include <stdio.h> #include <gweb/gweb.h> @@ -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, "PropertyChanged"); + 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) { -- 2.30.2 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 7/9] Fix Draft and Sent Bugs @ 2021-04-10 14:23 ` Chris Talbot 0 siblings, 0 replies; 5+ messages in thread From: Chris Talbot @ 2021-04-10 14:23 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 7214 bytes --] This patch fixes a few bugs: - 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 --- src/mmsutil.h | 2 ++ src/service.c | 60 +++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 48 insertions(+), 14 deletions(-) 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 #include <config.h> @@ -35,6 +36,8 @@ #include <glib.h> #include <glib/gstdio.h> #include <gdbus.h> +#include <time.h> +#include <stdio.h> #include <gweb/gweb.h> @@ -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, "PropertyChanged"); + 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) { -- 2.30.2 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 7/9] Fix Draft and Sent Bugs @ 2021-03-26 10:52 Christopher Talbot 0 siblings, 0 replies; 5+ messages in thread From: Christopher Talbot @ 2021-03-26 10:52 UTC (permalink / raw) To: netdev 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(-) 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 #include <config.h> @@ -35,6 +36,8 @@ #include <glib.h> #include <glib/gstdio.h> #include <gdbus.h> +#include <time.h> +#include <stdio.h> #include <gweb/gweb.h> @@ -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) { -- 2.30.0 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Patches For MMSD @ 2021-02-25 0:39 chris 2021-02-25 0:47 ` [PATCH 7/9] Fix Draft and Sent Bugs Christopher Talbot 0 siblings, 1 reply; 5+ messages in thread From: chris @ 2021-02-25 0:39 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 356 bytes --] Hello, I am submitting some patches for mmsd. My apoligies for the last time, I messed up the email chain on sending it. I also looked through, and I think I have fixed the errors on my Patches. I have a total of 9 patches. The first 8 are updates to the mmsd core, and the last one is a a plugin to have mmsd work with Modem Manager. Chris Talbot ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 7/9] Fix Draft and Sent Bugs 2021-02-25 0:39 Patches For MMSD chris @ 2021-02-25 0:47 ` Christopher Talbot 0 siblings, 0 replies; 5+ messages in thread From: Christopher Talbot @ 2021-02-25 0:47 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 7266 bytes --] 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(-) 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 #include <config.h> @@ -35,6 +36,8 @@ #include <glib.h> #include <glib/gstdio.h> #include <gdbus.h> +#include <time.h> +#include <stdio.h> #include <gweb/gweb.h> @@ -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) { -- 2.30.0 ^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2021-04-10 14:24 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2021-03-26 10:56 [PATCH 7/9] Fix Draft and Sent Bugs Christopher Talbot -- strict thread matches above, loose matches on Subject: below -- 2021-04-10 14:13 [PATCH 0/9] Updates for mmsd Chris Talbot 2021-04-10 14:17 ` [PATCH 1/9] Fix mmsd to work with T-mobile Chris Talbot 2021-04-10 14:20 ` [PATCH 2/9] Ensure Compatibility with Telus Canada Chris Talbot 2021-04-10 14:20 ` [PATCH 3/9] Ensure Compatibility with AT&T Chris Talbot 2021-04-10 14:21 ` [PATCH 4/9] Fix issue if there is an empty string in encoded text Chris Talbot 2021-04-10 14:22 ` [PATCH 5/9] Allow for a user configurable maximum attachment size Chris Talbot 2021-04-10 14:22 ` [PATCH 6/9] Update README Chris Talbot 2021-04-10 14:23 ` [PATCH 7/9] Fix Draft and Sent Bugs Chris Talbot 2021-04-10 14:23 ` Chris Talbot 2021-03-26 10:52 Christopher Talbot 2021-02-25 0:39 Patches For MMSD chris 2021-02-25 0:47 ` [PATCH 7/9] Fix Draft and Sent Bugs Christopher Talbot
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.