Changeset d2d2b80 for protocols/jabber


Ignore:
Timestamp:
2015-05-28T05:52:44Z (10 years ago)
Author:
dequis <dx@…>
Children:
51b14b8
Parents:
a1d30c5 (diff), b38f655 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'develop' into feat/hip-cat

Location:
protocols/jabber
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • protocols/jabber/iq.c

    ra1d30c5 rd2d2b80  
    2727static xt_status jabber_parse_roster(struct im_connection *ic, struct xt_node *node, struct xt_node *orig);
    2828static xt_status jabber_iq_display_vcard(struct im_connection *ic, struct xt_node *node, struct xt_node *orig);
     29static xt_status jabber_gmail_handle_new(struct im_connection *ic, struct xt_node *node);
    2930
    3031xt_status jabber_pkt_iq(struct xt_node *node, gpointer data)
     
    141142                    (strcmp(s, XMLNS_SI) == 0)) {
    142143                        return jabber_si_handle_request(ic, node, c);
     144                } else if ((c = xt_find_node(node->children, "new-mail")) &&
     145                           (s = xt_find_attr(c, "xmlns")) &&
     146                           (strcmp(s, XMLNS_GMAILNOTIFY) == 0)) {
     147                        return jabber_gmail_handle_new(ic, node);
    143148                } else if (!(c = xt_find_node(node->children, "query")) ||
    144149                           !(s = xt_find_attr(c, "xmlns"))) {
     
    342347                        return XT_ABORT;
    343348                }
     349                if (jd->flags & JFLAG_GMAILNOTIFY && node == NULL) {
     350                        jabber_iq_query_server(ic, jd->server, XMLNS_DISCO_INFO);
     351                }
    344352        } else if ((jd->flags & (JFLAG_WANT_BIND | JFLAG_WANT_SESSION)) == 0) {
    345353                if (!jabber_get_roster(ic)) {
     
    369377
    370378        return st;
     379}
     380
     381xt_status jabber_iq_query_gmail(struct im_connection *ic);
     382
     383static xt_status jabber_gmail_handle_new(struct im_connection *ic, struct xt_node *node)
     384{
     385        struct xt_node *response;
     386        struct jabber_data *jd = ic->proto_data;
     387
     388        response = jabber_make_packet("iq", "result", g_strdup_printf("%s@%s", jd->username, jd->server), NULL);
     389
     390        jabber_cache_add(ic, response, NULL);
     391        if (!jabber_write_packet(ic, response)) {
     392                return XT_ABORT;
     393        }
     394
     395        jabber_iq_query_gmail(ic);
     396
     397        return XT_HANDLED;
    371398}
    372399
     
    710737}
    711738
     739xt_status jabber_iq_parse_gmail(struct im_connection *ic, struct xt_node *node, struct xt_node *orig);
     740
     741xt_status jabber_iq_query_gmail(struct im_connection *ic)
     742{
     743        struct xt_node *node, *query;
     744        struct jabber_data *jd = ic->proto_data;
     745
     746        node = xt_new_node("query", NULL, NULL);
     747        xt_add_attr(node, "xmlns", XMLNS_GMAILNOTIFY);
     748        if (jd->gmail_time) {
     749                char *formatted = g_strdup_printf("%" G_GUINT64_FORMAT, (jd->gmail_time + 1));
     750                xt_add_attr(node, "newer-than-time", formatted);
     751                g_free(formatted);
     752        }
     753        if (jd->gmail_tid) {
     754                xt_add_attr(node, "newer-than-tid", jd->gmail_tid);
     755        }
     756
     757        if (!(query = jabber_make_packet("iq", "get", jd->me, node))) {
     758                imcb_log(ic, "WARNING: Couldn't generate server query");
     759                xt_free_node(node);
     760        }
     761
     762        jabber_cache_add(ic, query, jabber_iq_parse_gmail);
     763
     764        return jabber_write_packet(ic, query) ? XT_HANDLED : XT_ABORT;
     765}
     766
    712767xt_status jabber_iq_parse_server_features(struct im_connection *ic, struct xt_node *node, struct xt_node *orig);
    713768
     
    729784
    730785        return jabber_write_packet(ic, query) ? XT_HANDLED : XT_ABORT;
     786}
     787
     788xt_status jabber_iq_parse_gmail(struct im_connection *ic, struct xt_node *node, struct xt_node *orig)
     789{
     790        struct xt_node *c;
     791        struct jabber_data *jd = ic->proto_data;
     792        char *xmlns, *from;
     793        guint64 l_time = 0;
     794        char *tid = NULL;
     795        int max = 0;
     796
     797        if (!(c = xt_find_node(node->children, "mailbox")) ||
     798            !(from = xt_find_attr(node, "from")) ||
     799            !(xmlns = xt_find_attr(c, "xmlns")) ||
     800            (g_strcmp0(xmlns, XMLNS_GMAILNOTIFY) != 0)) {
     801                imcb_log(ic, "WARNING: Received incomplete mailbox packet for gmail notify");
     802                return XT_HANDLED;
     803        }
     804
     805        max = set_getint(&ic->acc->set, "mail_notifications_limit");
     806        c = c->children;
     807
     808        while ((max-- > 0) && (c = xt_find_node(c, "mail-thread-info"))) {
     809                struct xt_node *s;
     810                char *subject = "<no subject>";
     811                char *sender = "<no sender>";
     812                guint64 t_time;
     813
     814                t_time = g_ascii_strtoull(xt_find_attr(c, "date"), NULL, 10);
     815                if (t_time && t_time > l_time) {
     816                        l_time = t_time;
     817                        tid = xt_find_attr(c, "tid");
     818                }
     819
     820                if ((s = xt_find_node(c->children, "senders")) &&
     821                    (s = xt_find_node_by_attr(s->children, "sender", "unread", "1"))) {
     822                        sender = xt_find_attr(s, "name");
     823                }
     824
     825                if ((s = xt_find_node(c->children, "subject")) && s->text) {
     826                        subject = s->text;
     827                }
     828
     829                imcb_notify_email(ic, "New mail from %s: %s", sender, subject);
     830
     831                c = c->next;
     832        }
     833
     834        if (l_time && (!jd->gmail_time || l_time > jd->gmail_time)) {
     835                jd->gmail_time = l_time;
     836                if (tid) {
     837                        g_free(jd->gmail_tid);
     838                        jd->gmail_tid = g_strdup(tid);
     839                }
     840        }
     841
     842        return XT_HANDLED;
    731843}
    732844
     
    781893                        c = c->next;
    782894                }
     895
     896                if (jd->flags & JFLAG_GMAILNOTIFY) {
     897                        /* search for gmail notification feature */
     898                        c = xt_find_node(node->children, "query");
     899                        c = c->children;
     900                        while ((c = xt_find_node(c, "feature"))) {
     901                                if (strcmp(xt_find_attr(c, "var"), XMLNS_GMAILNOTIFY) == 0) {
     902                                        jabber_iq_query_gmail(ic);
     903                                }
     904                                c = c->next;
     905                        }
     906                }
     907
    783908        } else if (strcmp(xmlns, XMLNS_BYTESTREAMS) == 0) {
    784909                char *host, *jid, *port_s;
  • protocols/jabber/jabber.c

    ra1d30c5 rd2d2b80  
    100100
    101101        s = set_add(&acc->set, "xmlconsole", "false", set_eval_bool, acc);
     102
     103        s = set_add(&acc->set, "mail_notifications", "false", set_eval_bool, acc);
    102104        s->flags |= ACC_SET_OFFLINE_ONLY;
     105
     106        /* changing this is rarely needed so keeping it secret */
     107        s = set_add(&acc->set, "mail_notifications_limit", "5", set_eval_int, acc);
     108        s->flags |= SET_HIDDEN_DEFAULT;
     109
     110        s = set_add(&acc->set, "mail_notifications_handle", NULL, NULL, acc);
     111        s->flags |= ACC_SET_OFFLINE_ONLY | SET_NULL_OK;
    103112
    104113        acc->flags |= ACC_FLAG_AWAY_MESSAGE | ACC_FLAG_STATUS_MESSAGE |
     
    260269        }
    261270
     271        if (set_getbool(&acc->set, "mail_notifications")) {
     272                /* It's gmail specific, but it checks for server support before enabling it */
     273                jd->flags |= JFLAG_GMAILNOTIFY;
     274                if (set_getstr(&acc->set, "mail_notifications_handle")) {
     275                        imcb_add_buddy(ic, set_getstr(&acc->set, "mail_notifications_handle"), NULL);
     276                }
     277        }
     278
    262279        jabber_generate_id_hash(jd);
    263280}
     
    334351        g_free(jd->away_message);
    335352        g_free(jd->internal_jid);
     353        g_free(jd->gmail_tid);
    336354        g_free(jd->username);
    337355        g_free(jd->me);
  • protocols/jabber/jabber.h

    ra1d30c5 rd2d2b80  
    4646        JFLAG_XMLCONSOLE = 64,          /* If the user added an xmlconsole buddy. */
    4747        JFLAG_STARTTLS_DONE = 128,      /* If a plaintext session was converted to TLS. */
     48        JFLAG_GMAILNOTIFY = 256,        /* If gmail notification is enabled */
    4849
    4950        JFLAG_GTALK =  0x100000,        /* Is Google Talk, as confirmed by iq discovery */
     
    102103        const struct jabber_away_state *away_state;
    103104        char *away_message;
     105        guint64 gmail_time;
     106        char *gmail_tid;
    104107
    105108        md5_state_t cached_id_prefix;
     
    224227#define XMLNS_DELAY        "urn:xmpp:delay"                                      /* XEP-0203 */
    225228#define XMLNS_XDATA        "jabber:x:data"                                       /* XEP-0004 */
     229#define XMLNS_GMAILNOTIFY  "google:mail:notify"                                  /* Not a XEP */
    226230#define XMLNS_CHATSTATES   "http://jabber.org/protocol/chatstates"               /* XEP-0085 */
    227231#define XMLNS_DISCO_INFO   "http://jabber.org/protocol/disco#info"               /* XEP-0030 */
Note: See TracChangeset for help on using the changeset viewer.