Changes in / [b75671d:d832164]
- Files:
-
- 2 deleted
- 42 edited
Legend:
- Unmodified
- Added
- Removed
-
.travis.yml
rb75671d rd832164 4 4 - ./configure 5 5 - make check 6 - BITLBEE_SKYPE=plugindpkg-buildpackage -uc -us6 - dpkg-buildpackage -uc -us 7 7 8 8 before_install: 9 9 - sudo apt-get update -qq 10 - sudo apt-get install --no-install-recommends -qq libevent-dev libpurple-dev check10 - sudo apt-get install --no-install-recommends -qq asciidoc xsltproc xmlto lynx check libevent-dev libpurple-dev check 11 11 - wget http://dump.dequis.org/indexed/bitlbee-travis-libs/libotr5{,-dev}_4.1.0-2~bpo70+1_amd64.deb 12 12 - sudo dpkg -i *.deb -
Makefile
rb75671d rd832164 20 20 21 21 all: $(OUTFILE) $(OTR_PI) $(SKYPE_PI) doc systemd 22 ifdef SKYPE_PI 23 $(MAKE) -C protocols/skype doc 24 endif 22 25 23 26 doc: -
bitlbee.h
rb75671d rd832164 36 36 37 37 #define PACKAGE "BitlBee" 38 #define BITLBEE_VERSION "3.4 .1"38 #define BITLBEE_VERSION "3.4" 39 39 #define VERSION BITLBEE_VERSION 40 40 #define BITLBEE_VER(a, b, c) (((a) << 16) + ((b) << 8) + (c)) 41 #define BITLBEE_VERSION_CODE BITLBEE_VER(3, 4, 1)41 #define BITLBEE_VERSION_CODE BITLBEE_VER(3, 4, 0) 42 42 43 43 #define MAX_STRING 511 … … 93 93 #undef g_source_remove 94 94 #define g_source_remove __PLEASE_USE_B_EVENT_REMOVE__ 95 #undef g_source_remove_by_user_data 96 #define g_source_remove_by_user_data __PLEASE_USE_B_SOURCE_REMOVE_BY_USER_DATA__ 95 97 #undef g_main_run 96 98 #define g_main_run __PLEASE_USE_B_MAIN_RUN__ -
configure
rb75671d rd832164 67 67 get_version() { 68 68 REAL_BITLBEE_VERSION=$(grep '^#define BITLBEE_VERSION ' $srcdir/bitlbee.h | sed 's/.*\"\(.*\)\".*/\1/') 69 70 if [ -n "$BITLBEE_VERSION" ]; then71 # environment variable already set to something to spoof it72 # don't replace it with the git stuff73 return74 fi75 76 69 BITLBEE_VERSION=$REAL_BITLBEE_VERSION 77 70 … … 80 73 branch=$(cd $srcdir; git rev-parse --abbrev-ref HEAD) 81 74 82 search= '\(.*\)-\([0-9]*\)-\(g[0-9a-f]*\)'75 search="(.+)-([0-9]+)-(g[0-9a-f]+)" 83 76 replace="\1+$timestamp+$branch+\2-\3-git" 84 77 85 describe=$(cd $srcdir; git describe --long --tags 2>/dev/null) 86 if [ $? -ne 0 ]; then 87 describe=${REAL_BITLBEE_VERSION}-0-g$(cd $srcdir; git rev-parse --short HEAD) 88 fi 89 90 BITLBEE_VERSION=$(echo $describe | sed "s#$search#$replace#") 91 92 unset timestamp branch search replace describe 78 BITLBEE_VERSION=$(cd $srcdir; git describe --long --tags | sed -r "s/$search/$replace/") 79 80 unset timestamp branch search replace 93 81 fi 94 82 } … … 687 675 fi 688 676 689 if [ -z "$PYTHON" ]; then690 PYTHON=python691 fi692 693 677 if [ "$doc" = "1" ]; then 694 # check this here just in case someone tries to install it in python2.4... 695 if ! $PYTHON -m xml.etree.ElementTree > /dev/null 2>&1; then 678 if [ ! -e doc/user-guide/help.txt ] && \ 679 ! type xmlto > /dev/null 2> /dev/null || \ 680 ! type xsltproc > /dev/null 2> /dev/null 681 then 696 682 echo 697 echo 'ERROR: Python (>=2.5 or 3.x) is required to generate docs' 698 echo "(Use the PYTHON environment variable if it's in a weird location)" 699 exit 1 700 fi 701 echo "DOC=1" >> Makefile.settings 702 echo "PYTHON=$PYTHON" >> Makefile.settings 683 echo 'WARNING: Building from an unreleased source tree without prebuilt helpfile.' 684 echo 'Install xmlto and xsltproc if you want online help to work.' 685 else 686 echo "DOC=1" >> Makefile.settings 687 fi 688 689 if [ "$skype" = "1" -o "$skype" = "plugin" ]; then 690 # skype also needs asciidoc 691 if ! type a2x > /dev/null 2> /dev/null; then 692 echo 693 echo 'WARNING: The skyped man page requires asciidoc. It will not be generated.' 694 else 695 echo "ASCIIDOC=1" >> Makefile.settings 696 fi 697 fi 703 698 fi 704 699 -
debian/bitlbee-common.docs
rb75671d rd832164 1 doc/user-guide/user-guide.txt 2 doc/user-guide/user-guide.html 1 3 doc/AUTHORS 2 4 doc/CREDITS -
debian/control
rb75671d rd832164 5 5 Uploaders: Jelmer Vernooij <jelmer@debian.org> 6 6 Standards-Version: 3.9.5 7 Build-Depends: libglib2.0-dev (>= 2.4), libevent-dev, libgnutls28-dev | libgnutls-dev | gnutls-dev, po-debconf, libpurple-dev, libotr5-dev, debhelper (>= 6.0.7~) 7 Build-Depends: libglib2.0-dev (>= 2.4), libevent-dev, libgnutls28-dev | libgnutls-dev | gnutls-dev, po-debconf, libpurple-dev, libotr5-dev, debhelper (>= 6.0.7~), asciidoc 8 8 Homepage: http://www.bitlbee.org/ 9 9 Vcs-Bzr: http://code.bitlbee.org/bitlbee/ -
doc/CHANGES
rb75671d rd832164 3 3 4 4 https://github.com/bitlbee/bitlbee/commits/master 5 6 Version 3.4.1:7 - msn:8 * Upgraded protocol to MSNP21, works again (dx)9 * Contact list management, groupchats and skype username logins won't work.10 Next release!11 - jabber:12 * Add "hipchat" protocol, for smoother login. Takes the same username as13 the official client. Note that unlike the 'hip-cat' branch, this doesn't14 preload channels. https://wiki.bitlbee.org/HowtoHipchat for details (dx)15 * Fixed a bug when receiving topics set by people who left the channel (dx)16 * Create fake users instead of showing "unknown participant" errors (dx)17 * Gmail mail notifications support (Artem Savkov)18 * Lowering xmpp presence priority on away (Artem Savkov)19 - twitter:20 * Show quoted tweets/RTs with comment inline (wilmer)21 * Added "url" command, can be used to quote tweets (wilmer)22 * Make replies to self work (wilmer)23 - Building documentation is now done with a python script (both 2.x/3.x work)24 Asciidoc/xsltproc/xmlto are no longer build dependencies (dx)25 26 Finished 16 Jun 201527 5 28 6 Version 3.4: -
doc/Makefile
rb75671d rd832164 5 5 6 6 all: 7 $(MAKE) -C user-guide 7 # Only build the docs if this is a git tree 8 test ! '(' -d ../.git -o -d ../.bzr ')' || $(MAKE) -C user-guide 8 9 9 10 install: -
doc/user-guide/Makefile
rb75671d rd832164 4 4 endif 5 5 6 ifndef PYTHON 7 PYTHON = python 8 endif 6 EXTRAPARANEWLINE = 1 7 # EXTRAPARANEWLINE = 0 9 8 10 all: help.txt 11 12 user-guide: user-guide.txt user-guide.html # user-guide.pdf user-guide.ps user-guide.rtf 9 all: user-guide.txt user-guide.html help.txt # user-guide.pdf user-guide.ps user-guide.rtf 13 10 14 11 %.tex: %.db.xml … … 35 32 xsltproc --xinclude --output $@ docbook.xsl $< 36 33 37 help.txt: $(_SRCDIR_)help.xml $(_SRCDIR_)commands.xml $(_SRCDIR_)misc.xml $(_SRCDIR_)quickstart.xml38 $(PYTHON) $(_SRCDIR_)genhelp.py $<$@34 help.txt: help.xml help.xsl commands.xml misc.xml quickstart.xml 35 xsltproc --stringparam extraparanewline "$(EXTRAPARANEWLINE)" --xinclude help.xsl $< | perl -0077 -pe 's/\n\n%/\n%/s; s/_b_/\002/g;' > $@ 39 36 40 37 clean: … … 51 48 -rmdir $(DESTDIR)$(DATADIR) 52 49 53 .PHONY: clean install uninstall user-guide50 .PHONY: clean install uninstall -
doc/user-guide/commands.xml
rb75671d rd832164 1017 1017 <description> 1018 1018 <para> 1019 Some protocols (MSN, Yahoo!, GTalk) can notify via IM about new e-mail. Since most people use their Hotmail/Yahoo! addresses as a spam-box, this is disabled default. If you want these notifications, you can enable this setting. 1020 </para> 1021 </description> 1022 1023 </bitlbee-setting> 1024 1025 <bitlbee-setting name="mail_notifications_handle" type="string" scope="account"> 1026 <default>empty</default> 1027 1028 <description> 1029 <para> 1030 This setting is available for protocols with e-mail notification functionality. If set to empty all e-mail notifications will go to control channel, if set to some string - this will be the name of a contact who will PRIVMSG you on every new notification. 1019 Some protocols (MSN, Yahoo!) can notify via IM about new e-mail. Since most people use their Hotmail/Yahoo! addresses as a spam-box, this is disabled default. If you want these notifications, you can enable this setting. 1031 1020 </para> 1032 1021 </description> -
doc/user-guide/misc.xml
rb75671d rd832164 433 433 </sect1> 434 434 435 <sect1 id="whatsnew030401">436 <title>New stuff in BitlBee 3.4.1</title>437 438 <simplelist>439 <member><emphasis>msn:</emphasis> Upgraded protocol version to MSNP21, works again</member>440 <member><emphasis>jabber:</emphasis> Add "hipchat" protocol, for smoother login. Takes the same username as the official client. Note that unlike the 'hip-cat' branch, this doesn't preload channels. See the <emphasis>HowtoHipchat</emphasis> wiki page for details</member>441 <member><emphasis>jabber:</emphasis> Gmail notifications support</member>442 <member><emphasis>twitter:</emphasis> Show quoted tweets inline. Added "url" command, can be used to quote tweets.</member>443 </simplelist>444 445 </sect1>446 447 435 </chapter> -
irc_im.c
rb75671d rd832164 50 50 51 51 memset(nick, 0, MAX_NICK_LENGTH + 1); 52 str ncpy(nick, nick_get(bu), MAX_NICK_LENGTH);52 strcpy(nick, nick_get(bu)); 53 53 54 54 bu->ui_data = iu = irc_user_new(irc, nick); … … 723 723 g_free(channel); 724 724 channel = s; 725 } else {726 g_free(s);727 725 } 728 726 } -
irc_send.c
rb75671d rd832164 175 175 176 176 if (iu == irc->user) { 177 irc_write(irc, ":%s MODE %s +%s", irc->root->host, ic->name, ic->mode); 178 irc_send_names(ic); 177 179 if (ic->topic && *ic->topic) { 178 180 irc_send_topic(ic, FALSE); 179 181 } 180 irc_send_names(ic);181 182 } 182 183 } -
lib/events_glib.c
rb75671d rd832164 82 82 } 83 83 84 event_debug("gaim_io_invoke( %d, %d, %p)\n", g_io_channel_unix_get_fd(source), condition, data);84 event_debug("gaim_io_invoke( %d, %d, 0x%x )\n", g_io_channel_unix_get_fd(source), condition, data); 85 85 86 86 st = closure->function(closure->data, g_io_channel_unix_get_fd(source), gaim_cond); … … 101 101 static void gaim_io_destroy(gpointer data) 102 102 { 103 event_debug("gaim_io_destroy( 0 %p)\n", data);103 event_debug("gaim_io_destroy( 0x%x )\n", data); 104 104 g_free(data); 105 105 } … … 127 127 gaim_io_invoke, closure, gaim_io_destroy); 128 128 129 event_debug("b_input_add( %d, %d, %p, %p) = %d (%p)\n", source, condition, function, data, st, closure);129 event_debug("b_input_add( %d, %d, 0x%x, 0x%x ) = %d (%p)\n", source, condition, function, data, st, closure); 130 130 131 131 g_io_channel_unref(channel); … … 140 140 gint st = g_timeout_add(timeout, (GSourceFunc) func, data); 141 141 142 event_debug("b_timeout_add( %d, % p, %p) = %d\n", timeout, func, data, st);142 event_debug("b_timeout_add( %d, %d, %d ) = %d\n", timeout, func, data, st); 143 143 144 144 return st; -
lib/misc.c
rb75671d rd832164 751 751 return end - string; 752 752 } 753 754 /* Parses a guint64 from string, returns TRUE on success */755 gboolean parse_int64(char *string, int base, guint64 *number)756 {757 guint64 parsed;758 char *endptr;759 760 errno = 0;761 parsed = g_ascii_strtoull(string, &endptr, base);762 if (errno || endptr == string || *endptr != '\0') {763 return FALSE;764 }765 *number = parsed;766 return TRUE;767 }768 -
lib/misc.h
rb75671d rd832164 149 149 G_MODULE_EXPORT char *get_rfc822_header(const char *text, const char *header, int len); 150 150 G_MODULE_EXPORT int truncate_utf8(char *string, int maxlen); 151 G_MODULE_EXPORT gboolean parse_int64(char *string, int base, guint64 *number);152 151 153 152 #endif -
lib/oauth2.c
rb75671d rd832164 138 138 struct oauth2_access_token_data *cb_data = req->data; 139 139 char *atoken = NULL, *rtoken = NULL, *error = NULL; 140 char *content_type = NULL;140 char *content_type; 141 141 142 if (req->status_code <= 0 && !req->reply_body) { 143 cb_data->func(cb_data->data, NULL, NULL, req->status_string); 144 g_free(cb_data); 145 return; 146 } 147 148 if (getenv("BITLBEE_DEBUG")) { 142 if (getenv("BITLBEE_DEBUG") && req->reply_body) { 149 143 printf("%s\n", req->reply_body); 150 144 } -
nick.c
rb75671d rd832164 186 186 LC_CTYPE being set to something other than C/POSIX. */ 187 187 if (!(irc && irc->status & IRC_UTF8_NICKS)) { 188 asc = g_convert_with_fallback(part, -1, "ASCII//TRANSLIT", "UTF-8", "", NULL, NULL, NULL); 189 190 if (!asc) { 191 /* If above failed, try again without //TRANSLIT. 192 //TRANSLIT is a GNU iconv special and is not POSIX. 193 Other platforms may not support it. */ 194 asc = g_convert_with_fallback(part, -1, "ASCII", "UTF-8", "", NULL, NULL, NULL); 195 } 196 197 part = asc; 188 part = asc = g_convert_with_fallback(part, -1, "ASCII//TRANSLIT", 189 "UTF-8", "", NULL, NULL, NULL); 198 190 } 199 191 … … 376 368 377 369 if (tab['A'] == 0) { 378 /* initialize table so nonchars are mapped to themselves */379 for (i = 0; i < sizeof(tab); i++) {380 tab[i] = i;381 }382 /* replace uppercase chars with lowercase chars */383 370 for (i = 0; nick_lc_chars[i]; i++) { 384 371 tab[(int) nick_uc_chars[i]] = nick_lc_chars[i]; 372 tab[(int) nick_lc_chars[i]] = nick_lc_chars[i]; 385 373 } 386 374 } -
otr.c
rb75671d rd832164 193 193 void show_general_otr_info(irc_t *irc); 194 194 195 /* show info about a given OTR context and subcontexts/instances. bestctx 196 may be either NULL or preferred destination context (this is hilighted 197 in the output as being the target for a message) */ 198 void show_otr_context_info(irc_t *irc, ConnContext *ctx, ConnContext *bestctx); 195 /* show info about a given OTR context */ 196 void show_otr_context_info(irc_t *irc, ConnContext *ctx); 199 197 200 198 /* show the list of fingerprints associated with a given context */ … … 1104 1102 char *arg = g_strdup(args[1]); 1105 1103 char *myhandle, *handle = NULL, *protocol; 1106 ConnContext * bestctx = NULL, *ctx;1104 ConnContext *ctx; 1107 1105 1108 1106 /* interpret arg as 'user/protocol/account' if possible */ … … 1137 1135 return; 1138 1136 } 1139 /* This does no harm if it returns NULL */1140 bestctx = otrl_context_find(irc->otr->us, u->bu->handle, u->bu->ic->acc->user,1141 u->bu->ic->acc->prpl->name, OTRL_INSTAG_BEST, 0, NULL, NULL, NULL);1142 1137 } 1143 1138 1144 1139 /* show how we resolved the (nick) argument, if we did */ 1145 1140 if (handle != arg) { 1146 irc_rootmsg(irc, "%s:", args[1]); 1147 irc_rootmsg(irc, " they are: %s/%s", ctx->username, ctx->protocol); 1148 irc_rootmsg(irc, " we are: %s/%s", ctx->accountname, ctx->protocol); 1149 } 1150 show_otr_context_info(irc, ctx, bestctx); 1141 irc_rootmsg(irc, "%s is %s/%s; we are %s/%s to them", args[1], 1142 ctx->username, ctx->protocol, ctx->accountname, ctx->protocol); 1143 } 1144 show_otr_context_info(irc, ctx); 1151 1145 g_free(arg); 1152 1146 } … … 1555 1549 int count = 0; 1556 1550 1557 /* Is this a subcontext? If so, only list the active fingerprint */ 1558 if (ctx->m_context != ctx) { 1559 fp = ctx->active_fingerprint; 1560 } else { 1561 fp = &ctx->fingerprint_root; 1562 } 1563 1564 while (fp) { 1551 for (fp = &ctx->fingerprint_root; fp; fp = fp->next) { 1565 1552 if (!fp->fingerprint) { 1566 fp = fp->next;1567 1553 continue; 1568 1554 } … … 1575 1561 } 1576 1562 if (fp == ctx->active_fingerprint) { 1577 irc_rootmsg(irc, " 1563 irc_rootmsg(irc, " \x02%s (%s)\x02", human, trust); 1578 1564 } else { 1579 irc_rootmsg(irc, " %s (%s)", human, trust); 1580 } 1581 1582 /* Break if this is a subcontext - we only print active fp */ 1583 if (ctx->m_context != ctx) { 1584 break; 1585 } 1586 fp = fp->next; 1565 irc_rootmsg(irc, " %s (%s)", human, trust); 1566 } 1587 1567 } 1588 1568 if (count == 0) { 1589 irc_rootmsg(irc, " 1569 irc_rootmsg(irc, " (none)"); 1590 1570 } 1591 1571 } … … 1775 1755 /* list all contexts */ 1776 1756 /* XXX remove this, or split off as its own command */ 1757 /* XXX show instags? */ 1777 1758 irc_rootmsg(irc, "%s", ""); 1778 1759 irc_rootmsg(irc, "\x1f" "connection contexts:\x1f (bold=currently encrypted)"); 1779 1780 ctx = irc->otr->us->context_root; 1781 while (ctx) { 1782 ConnContext *subctx; 1760 for (ctx = irc->otr->us->context_root; ctx; ctx = ctx->next) { \ 1783 1761 irc_user_t *u; 1784 1762 char *userstring; 1785 char encrypted = 0;1786 1763 1787 1764 u = peeruser(irc, ctx->username, ctx->protocol); … … 1794 1771 } 1795 1772 1796 subctx = ctx; 1797 while (subctx && subctx->m_context == ctx) { 1798 if (subctx->msgstate == OTRL_MSGSTATE_ENCRYPTED) { 1799 encrypted = 1; 1800 } 1801 subctx = subctx->next; 1802 } 1803 1804 if(encrypted) { 1773 if (ctx->msgstate == OTRL_MSGSTATE_ENCRYPTED) { 1805 1774 irc_rootmsg(irc, " \x02%s\x02", userstring); 1806 1775 } else { … … 1808 1777 } 1809 1778 1810 /* Skip subcontexts/instances from output */1811 ctx = subctx;1812 1813 1779 g_free(userstring); 1814 1780 } 1815 1816 1781 if (ctx == irc->otr->us->context_root) { 1817 1782 irc_rootmsg(irc, " (none)"); … … 1819 1784 } 1820 1785 1821 void show_otr_context_info(irc_t *irc, ConnContext *ctx, ConnContext *bestctx) 1822 { 1823 ConnContext *subctx; 1824 int instcount = 0; 1825 1826 subctx = ctx; 1827 while (subctx && subctx->m_context == ctx) { 1828 if (subctx->m_context == subctx) { 1829 if (subctx == bestctx) { 1830 irc_rootmsg(irc, " \x02master context (target):\x02"); 1831 } else { 1832 irc_rootmsg(irc, " master context:"); 1833 } 1834 irc_rootmsg(irc, " known fingerprints (bold = active for v1 or v2):"); 1835 } else { 1836 if (subctx == bestctx) { 1837 irc_rootmsg(irc, " \x02instance %d (target):\x02", instcount); 1838 } else { 1839 irc_rootmsg(irc, " instance %d:", instcount); 1840 } 1841 irc_rootmsg(irc, " active fingerprint:"); 1842 instcount++; 1843 } 1844 1845 show_fingerprints(irc, subctx); 1846 1847 switch (subctx->msgstate) { 1848 case OTRL_MSGSTATE_PLAINTEXT: 1849 irc_rootmsg(irc, " connection state: cleartext"); 1850 break; 1851 case OTRL_MSGSTATE_ENCRYPTED: 1852 irc_rootmsg(irc, " connection state: encrypted (v%d)", subctx->protocol_version); 1853 break; 1854 case OTRL_MSGSTATE_FINISHED: 1855 irc_rootmsg(irc, " connection state: shut down"); 1856 break; 1857 default: 1858 irc_rootmsg(irc, " connection state: %d", subctx->msgstate); 1859 } 1860 1861 subctx = subctx->next; 1862 } 1786 void show_otr_context_info(irc_t *irc, ConnContext *ctx) 1787 { 1788 // XXX show all instags/subcontexts 1789 1790 switch (ctx->otr_offer) { 1791 case OFFER_NOT: 1792 irc_rootmsg(irc, " otr offer status: none sent"); 1793 break; 1794 case OFFER_SENT: 1795 irc_rootmsg(irc, " otr offer status: awaiting reply"); 1796 break; 1797 case OFFER_ACCEPTED: 1798 irc_rootmsg(irc, " otr offer status: accepted our offer"); 1799 break; 1800 case OFFER_REJECTED: 1801 irc_rootmsg(irc, " otr offer status: ignored our offer"); 1802 break; 1803 default: 1804 irc_rootmsg(irc, " otr offer status: %d", ctx->otr_offer); 1805 } 1806 1807 switch (ctx->msgstate) { 1808 case OTRL_MSGSTATE_PLAINTEXT: 1809 irc_rootmsg(irc, " connection state: cleartext"); 1810 break; 1811 case OTRL_MSGSTATE_ENCRYPTED: 1812 irc_rootmsg(irc, " connection state: encrypted (v%d)", ctx->protocol_version); 1813 break; 1814 case OTRL_MSGSTATE_FINISHED: 1815 irc_rootmsg(irc, " connection state: shut down"); 1816 break; 1817 default: 1818 irc_rootmsg(irc, " connection state: %d", ctx->msgstate); 1819 } 1820 1821 irc_rootmsg(irc, " fingerprints: (bold=active)"); 1822 show_fingerprints(irc, ctx); 1863 1823 } 1864 1824 -
protocols/bee.h
rb75671d rd832164 156 156 G_MODULE_EXPORT void imcb_buddy_msg(struct im_connection *ic, const char *handle, const char *msg, guint32 flags, 157 157 time_t sent_at); 158 G_MODULE_EXPORT void imcb_notify_email(struct im_connection *ic, char *format, ...) G_GNUC_PRINTF(2, 3);159 158 160 159 /* bee_chat.c */ -
protocols/bee_user.c
rb75671d rd832164 271 271 } 272 272 273 void imcb_notify_email(struct im_connection *ic, char *format, ...)274 {275 const char *handle;276 va_list params;277 char *msg;278 279 if (!set_getbool(&ic->acc->set, "mail_notifications")) {280 return;281 }282 283 va_start(params, format);284 msg = g_strdup_vprintf(format, params);285 va_end(params);286 287 /* up to the protocol to set_add this if they want to use this */288 handle = set_getstr(&ic->acc->set, "mail_notifications_handle");289 290 if (handle != NULL) {291 imcb_buddy_msg(ic, handle, msg, 0, 0);292 } else {293 imcb_log(ic, "%s", msg);294 }295 296 g_free(msg);297 }298 299 273 void imcb_buddy_typing(struct im_connection *ic, const char *handle, uint32_t flags) 300 274 { -
protocols/jabber/conference.c
rb75671d rd832164 354 354 struct xt_node *subject = xt_find_node(node->children, "subject"); 355 355 struct xt_node *body = xt_find_node(node->children, "body"); 356 struct groupchat *chat = NULL; 357 struct jabber_chat *jc = NULL; 358 char *from = NULL; 359 char *nick = NULL; 360 char *final_from = NULL; 361 char *bare_jid = NULL; 362 363 from = (bud) ? bud->full_jid : xt_find_attr(node, "from"); 364 365 if (from) { 366 nick = strchr(from, '/'); 356 struct groupchat *chat = bud ? jabber_chat_by_jid(ic, bud->bare_jid) : NULL; 357 struct jabber_chat *jc = chat ? chat->data : NULL; 358 char *s; 359 360 if (subject && chat) { 361 s = (bud && bud->ext_jid) ? strchr(bud->ext_jid, '/') : NULL; 362 if (s) { 363 *s = 0; 364 } 365 imcb_chat_topic(chat, bud ? bud->ext_jid : NULL, subject->text_len > 0 ? 366 subject->text : NULL, jabber_get_timestamp(node)); 367 if (s) { 368 *s = '/'; 369 } 370 } 371 372 if (bud == NULL || (jc && ~jc->flags & JCFLAG_MESSAGE_SENT && bud == jc->me)) { 373 char *nick; 374 375 if (body == NULL || body->text_len == 0) { 376 /* Meh. Empty messages aren't very interesting, no matter 377 how much some servers love to send them. */ 378 return; 379 } 380 381 s = xt_find_attr(node, "from"); /* pkt_message() already NULL-checked this one. */ 382 nick = strchr(s, '/'); 367 383 if (nick) { 384 /* If this message included a resource/nick we don't know, 385 we might still know the groupchat itself. */ 368 386 *nick = 0; 369 } 370 chat = jabber_chat_by_jid(ic, from); 371 if (nick) { 387 chat = jabber_chat_by_jid(ic, s); 372 388 *nick = '/'; 389 373 390 nick++; 374 } 375 } 376 377 jc = (chat) ? chat->data : NULL; 378 379 if (!bud) { 380 struct xt_node *c; 381 char *s; 382 383 /* Try some clever stuff to find out the real JID here */ 384 c = xt_find_node_by_attr(node->children, "delay", "xmlns", XMLNS_DELAY); 385 386 if (c && ((s = xt_find_attr(c, "from")) || 387 (s = xt_find_attr(c, "from_jid")))) { 388 /* This won't be useful if it's the MUC JID */ 389 if (!(jc && jabber_compare_jid(s, jc->name))) { 390 /* Hopefully this one makes more sense! */ 391 bud = jabber_buddy_by_jid(ic, s, GET_BUDDY_FIRST | GET_BUDDY_CREAT); 392 } 393 } 394 395 } 396 397 if (subject && chat) { 398 char *subject_text = subject->text_len > 0 ? subject->text : NULL; 399 if (g_strcmp0(chat->topic, subject_text) != 0) { 400 bare_jid = (bud) ? jabber_get_bare_jid(bud->ext_jid) : NULL; 401 imcb_chat_topic(chat, bare_jid, subject_text, 402 jabber_get_timestamp(node)); 403 g_free(bare_jid); 404 } 405 } 406 407 if (body == NULL || body->text_len == 0) { 408 /* Meh. Empty messages aren't very interesting, no matter 409 how much some servers love to send them. */ 391 } else { 392 /* message.c uses the EXACT_JID option, so bud should 393 always be NULL here for bare JIDs. */ 394 chat = jabber_chat_by_jid(ic, s); 395 } 396 397 if (nick == NULL) { 398 /* This is fine, the groupchat itself isn't in jd->buddies. */ 399 if (chat) { 400 imcb_chat_log(chat, "From conference server: %s", body->text); 401 } else { 402 imcb_log(ic, "System message from unknown groupchat %s: %s", s, body->text); 403 } 404 } else { 405 /* This can happen too, at least when receiving a backlog when 406 just joining a channel. */ 407 if (chat) { 408 imcb_chat_log(chat, "Message from unknown participant %s: %s", nick, body->text); 409 } else { 410 imcb_log(ic, "Groupchat message from unknown JID %s: %s", s, body->text); 411 } 412 } 413 410 414 return; 411 } 412 413 if (chat == NULL) { 414 if (nick == NULL) { 415 imcb_log(ic, "System message from unknown groupchat %s: %s", from, body->text); 416 } else { 417 imcb_log(ic, "Groupchat message from unknown JID %s: %s", from, body->text); 418 } 419 415 } else if (chat == NULL) { 416 /* How could this happen?? We could do kill( self, 11 ) 417 now or just wait for the OS to do it. :-) */ 420 418 return; 421 } else if (chat != NULL && bud == NULL && nick == NULL) { 422 imcb_chat_log(chat, "From conference server: %s", body->text); 423 return; 424 } else if (jc && jc->flags & JCFLAG_MESSAGE_SENT && bud == jc->me) { 425 /* exclude self-messages since they would get filtered out 426 * but not the ones in the backlog */ 427 return; 428 } 429 430 if (bud && jc && bud != jc->me) { 431 bare_jid = jabber_get_bare_jid(bud->ext_jid ? bud->ext_jid : bud->full_jid); 432 final_from = bare_jid; 433 } else { 434 final_from = nick; 435 } 436 437 imcb_chat_msg(chat, final_from, body->text, 0, jabber_get_timestamp(node)); 438 439 g_free(bare_jid); 440 } 419 } 420 if (body && body->text_len > 0) { 421 s = (bud->ext_jid) ? strchr(bud->ext_jid, '/') : NULL; 422 if (s) { 423 *s = 0; 424 } 425 imcb_chat_msg(chat, bud->ext_jid, body->text, 0, jabber_get_timestamp(node)); 426 if (s) { 427 *s = '/'; 428 } 429 } 430 } -
protocols/jabber/iq.c
rb75671d rd832164 27 27 static xt_status jabber_parse_roster(struct im_connection *ic, struct xt_node *node, struct xt_node *orig); 28 28 static xt_status jabber_iq_display_vcard(struct im_connection *ic, struct xt_node *node, struct xt_node *orig); 29 static xt_status jabber_gmail_handle_new(struct im_connection *ic, struct xt_node *node);30 29 31 30 xt_status jabber_pkt_iq(struct xt_node *node, gpointer data) … … 142 141 (strcmp(s, XMLNS_SI) == 0)) { 143 142 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);148 143 } else if (!(c = xt_find_node(node->children, "query")) || 149 144 !(s = xt_find_attr(c, "xmlns"))) { … … 347 342 return XT_ABORT; 348 343 } 349 if (jd->flags & JFLAG_GMAILNOTIFY && node == NULL) {350 jabber_iq_query_server(ic, jd->server, XMLNS_DISCO_INFO);351 }352 344 } else if ((jd->flags & (JFLAG_WANT_BIND | JFLAG_WANT_SESSION)) == 0) { 353 345 if (!jabber_get_roster(ic)) { … … 377 369 378 370 return st; 379 }380 381 xt_status jabber_iq_query_gmail(struct im_connection *ic);382 383 static 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;398 371 } 399 372 … … 737 710 } 738 711 739 xt_status jabber_iq_parse_gmail(struct im_connection *ic, struct xt_node *node, struct xt_node *orig);740 741 xt_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 767 712 xt_status jabber_iq_parse_server_features(struct im_connection *ic, struct xt_node *node, struct xt_node *orig); 768 713 … … 784 729 785 730 return jabber_write_packet(ic, query) ? XT_HANDLED : XT_ABORT; 786 }787 788 xt_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;843 731 } 844 732 … … 893 781 c = c->next; 894 782 } 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 908 783 } else if (strcmp(xmlns, XMLNS_BYTESTREAMS) == 0) { 909 784 char *host, *jid, *port_s; -
protocols/jabber/jabber.c
rb75671d rd832164 100 100 101 101 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);104 102 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;112 103 113 104 acc->flags |= ACC_FLAG_AWAY_MESSAGE | ACC_FLAG_STATUS_MESSAGE | … … 269 260 } 270 261 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 279 262 jabber_generate_id_hash(jd); 280 263 } … … 351 334 g_free(jd->away_message); 352 335 g_free(jd->internal_jid); 353 g_free(jd->gmail_tid);354 336 g_free(jd->username); 355 337 g_free(jd->me); … … 446 428 } 447 429 448 jabber_get_vcard(ic, who);430 jabber_get_vcard(ic, bud ? bud->full_jid : who); 449 431 } 450 432 -
protocols/jabber/jabber.h
rb75671d rd832164 46 46 JFLAG_XMLCONSOLE = 64, /* If the user added an xmlconsole buddy. */ 47 47 JFLAG_STARTTLS_DONE = 128, /* If a plaintext session was converted to TLS. */ 48 JFLAG_GMAILNOTIFY = 256, /* If gmail notification is enabled */49 48 50 49 JFLAG_GTALK = 0x100000, /* Is Google Talk, as confirmed by iq discovery */ … … 103 102 const struct jabber_away_state *away_state; 104 103 char *away_message; 105 guint64 gmail_time;106 char *gmail_tid;107 104 108 105 md5_state_t cached_id_prefix; … … 227 224 #define XMLNS_DELAY "urn:xmpp:delay" /* XEP-0203 */ 228 225 #define XMLNS_XDATA "jabber:x:data" /* XEP-0004 */ 229 #define XMLNS_GMAILNOTIFY "google:mail:notify" /* Not a XEP */230 226 #define XMLNS_CHATSTATES "http://jabber.org/protocol/chatstates" /* XEP-0085 */ 231 227 #define XMLNS_DISCO_INFO "http://jabber.org/protocol/disco#info" /* XEP-0030 */ … … 316 312 void jabber_error_free(struct jabber_error *err); 317 313 gboolean jabber_set_me(struct im_connection *ic, const char *me); 318 char *jabber_get_bare_jid(char *jid);319 314 320 315 extern const struct jabber_away_state jabber_away_state_list[]; -
protocols/jabber/jabber_util.c
rb75671d rd832164 820 820 return TRUE; 821 821 } 822 823 /* Returns new reference! g_free() afterwards. */824 char *jabber_get_bare_jid(char *jid)825 {826 char *s = NULL;827 828 if (jid == NULL) {829 return NULL;830 }831 832 if ((s = strchr(jid, '/'))) {833 return g_strndup(jid, s - jid);834 } else {835 return g_strdup(jid);836 }837 } -
protocols/jabber/presence.c
rb75671d rd832164 181 181 } 182 182 183 static char *choose_priority(struct im_connection *ic)184 {185 struct jabber_data *jd = ic->proto_data;186 char *prio = set_getstr(&ic->acc->set, "priority");187 188 if (jd->away_state->code != NULL) {189 int new_prio = (atoi(prio) - 5);190 if (new_prio < 0) {191 new_prio = 0;192 }193 return g_strdup_printf("%d", new_prio);194 }195 196 return g_strdup(prio);197 }198 199 183 /* Whenever presence information is updated, call this function to inform the 200 184 server. */ … … 205 189 GSList *l; 206 190 int st; 207 char *prio = choose_priority(ic);208 191 209 192 node = jabber_make_packet("presence", NULL, NULL, NULL); 210 xt_add_child(node, xt_new_node("priority", prio, NULL));193 xt_add_child(node, xt_new_node("priority", set_getstr(&ic->acc->set, "priority"), NULL)); 211 194 if (jd->away_state) { 212 195 xt_add_child(node, xt_new_node("show", jd->away_state->code, NULL)); … … 239 222 240 223 xt_free_node(node); 241 g_free(prio);242 224 return st; 243 225 } -
protocols/msn/gw.c
rb75671d rd832164 87 87 gw->polling = FALSE; 88 88 89 if (req->status_code != 200 || !req->reply_body) {90 gw->callback(gw->md, -1, B_EV_IO_READ);91 return;92 }93 94 89 if (getenv("BITLBEE_DEBUG")) { 95 90 fprintf(stderr, "\n\x1b[90mHTTP:%s\n", req->reply_body); 96 91 fprintf(stderr, "\n\x1b[97m\n"); 92 } 93 94 if (req->status_code != 200) { 95 gw->callback(gw->md, -1, B_EV_IO_READ); 96 return; 97 97 } 98 98 … … 113 113 if (req->body_size) { 114 114 g_byte_array_append(gw->in, (const guint8 *) req->reply_body, req->body_size); 115 116 if (!gw->callback(gw->md, -1, B_EV_IO_READ)) { 117 return; 118 } 115 gw->callback(gw->md, -1, B_EV_IO_READ); 119 116 } 120 117 -
protocols/msn/msn.c
rb75671d rd832164 46 46 s->flags |= ACC_SET_OFFLINE_ONLY; 47 47 48 s = set_add(&acc->set, "mail_notifications", "false", set_eval_bool, acc); 49 s->flags |= ACC_SET_OFFLINE_ONLY; 50 51 s = set_add(&acc->set, "mail_notifications_handle", NULL, NULL, acc); 52 s->flags |= ACC_SET_OFFLINE_ONLY | SET_NULL_OK; 48 set_add(&acc->set, "mail_notifications", "false", set_eval_bool, acc); 53 49 54 50 acc->flags |= ACC_FLAG_AWAY_MESSAGE | ACC_FLAG_STATUS_MESSAGE | … … 86 82 msn_ns_connect(ic, server, 87 83 set_getint(&ic->acc->set, "port")); 88 89 if (set_getbool(&acc->set, "mail_notifications") && set_getstr(&acc->set, "mail_notifications_handle")) {90 imcb_add_buddy(ic, set_getstr(&acc->set, "mail_notifications_handle"), NULL);91 }92 84 } 93 85 … … 152 144 { 153 145 struct bee_user *bu = bee_user_by_handle(ic->bee, ic, who); 154 msn_ns_send_message(ic, bu, message); 155 return 0; 146 147 #ifdef DEBUG 148 if (strcmp(who, "raw") == 0) { 149 msn_ns_write(ic, -1, "%s\r\n", message); 150 return 0; 151 } 152 #endif 153 154 msn_ns_sendmessage(ic, bu, message); 155 return(0); 156 156 } 157 157 … … 277 277 return 0; 278 278 } else if (typing & OPT_TYPING) { 279 return msn_ns_send_typing(ic, bu);279 return(msn_buddy_msg(ic, who, TYPING_NOTIFICATION_MESSAGE, 0)); 280 280 } else { 281 281 return 1; … … 338 338 339 339 g_tree_remove(md->domaintree, bu->handle); 340 } 341 342 GList *msn_buddy_action_list(bee_user_t *bu) 343 { 344 static GList *ret = NULL; 345 346 if (ret == NULL) { 347 static const struct buddy_action ba[2] = { 348 { "NUDGE", "Draw attention" }, 349 }; 350 351 ret = g_list_prepend(ret, (void *) ba + 0); 352 } 353 354 return ret; 355 } 356 357 void *msn_buddy_action(struct bee_user *bu, const char *action, char * const args[], void *data) 358 { 359 if (g_strcasecmp(action, "NUDGE") == 0) { 360 msn_buddy_msg(bu->ic, bu->handle, NUDGE_MESSAGE, 0); 361 } 362 363 return NULL; 340 364 } 341 365 … … 368 392 ret->buddy_data_add = msn_buddy_data_add; 369 393 ret->buddy_data_free = msn_buddy_data_free; 394 ret->buddy_action_list = msn_buddy_action_list; 395 ret->buddy_action = msn_buddy_action; 370 396 371 397 register_protocol(ret); -
protocols/msn/msn.h
rb75671d rd832164 27 27 #define _MSN_H 28 28 29 /* Some hackish magicstrings to make special-purpose messages/switchboards. 30 */ 31 #define TYPING_NOTIFICATION_MESSAGE "\r\r\rBEWARE, ME R TYPINK MESSAGE!!!!\r\r\r" 32 #define NUDGE_MESSAGE "\r\r\rSHAKE THAT THING\r\r\r" 33 #define GROUPCHAT_SWITCHBOARD_MESSAGE "\r\r\rME WANT TALK TO MANY PEOPLE\r\r\r" 34 35 #ifdef DEBUG_MSN 36 #define debug(text ...) imcb_log(ic, text); 37 #else 38 #define debug(text ...) 39 #endif 40 29 41 /* This should be MSN Messenger 7.0.0813 30 42 #define MSNP11_PROD_KEY "CFHUR$52U_{VIX5T" … … 65 77 #define MSN_MESSAGE_HEADERS MSN_BASE_HEADERS \ 66 78 "Messaging: 2.0\r\n" \ 67 "Message-Type: %s\r\n" \79 "Message-Type: Text\r\n" \ 68 80 "Content-Length: %zd\r\n" \ 69 81 "Content-Type: text/plain; charset=UTF-8\r\n" \ … … 91 103 "</user>" 92 104 105 #define MSN_TYPING_HEADERS "MIME-Version: 1.0\r\n" \ 106 "Content-Type: text/x-msmsgscontrol\r\n" \ 107 "TypingUser: %s\r\n" \ 108 "\r\n\r\n" 109 110 #define MSN_NUDGE_HEADERS "MIME-Version: 1.0\r\n" \ 111 "Content-Type: text/x-msnmsgr-datacast\r\n" \ 112 "\r\n" \ 113 "ID: 1\r\n" \ 114 "\r\n" 115 93 116 #define PROFILE_URL "http://members.msn.com/" 94 117 … … 219 242 void msn_auth_got_contact_list(struct im_connection *ic); 220 243 int msn_ns_finish_login(struct im_connection *ic); 221 int msn_ns_send_typing(struct im_connection *ic, struct bee_user *bu); 222 int msn_ns_send_message(struct im_connection *ic, struct bee_user *bu, const char *text); 244 int msn_ns_sendmessage(struct im_connection *ic, struct bee_user *bu, const char *text); 223 245 int msn_ns_command(struct msn_data *md, char **cmd, int num_parts); 224 246 int msn_ns_message(struct msn_data *md, char *msg, int msglen, char **cmd, int num_parts); -
protocols/msn/ns.c
rb75671d rd832164 181 181 imcb_error(ic, "Error while reading from server"); 182 182 imc_logout(ic, TRUE); 183 g_free(bytes);184 183 return FALSE; 185 184 } … … 189 188 g_free(bytes); 190 189 191 return msn_handler(md); 190 /* Ignore ret == 0, it's already disconnected then. */ 191 msn_handler(md); 192 193 return TRUE; 194 192 195 } 193 196 … … 394 397 395 398 if (inbox && folders) { 396 imcb_ notify_email(ic,397 "INBOX contains %s new messages, plus %s messages in other folders.", inbox,398 folders);399 imcb_log(ic, 400 "INBOX contains %s new messages, plus %s messages in other folders.", inbox, 401 folders); 399 402 } 400 403 … … 408 411 409 412 if (from && fromname) { 410 imcb_notify_email(ic, "Received an e-mail message from %s <%s>.", fromname, from); 413 imcb_log(ic, "Received an e-mail message from %s <%s>.", fromname, 414 from); 411 415 } 412 416 … … 416 420 } else if (g_strncasecmp(ct, "text/x-msmsgsactivemailnotification", 35) == 0) { 417 421 /* Notification that a message has been read... Ignore it */ 422 } else { 423 debug("Can't handle %s packet from notification server", ct); 418 424 } 419 425 … … 620 626 char l[4]; 621 627 622 if ((bd->flags & (MSN_BUDDY_FL | MSN_BUDDY_AL)) == 0 || (bd->flags & MSN_BUDDY_ADL_SYNCED)) {628 if ((bd->flags & 7) == 0 || (bd->flags & MSN_BUDDY_ADL_SYNCED)) { 623 629 return FALSE; 624 630 } … … 638 644 } 639 645 640 g_snprintf(l, sizeof(l), "%d", bd->flags & (MSN_BUDDY_FL | MSN_BUDDY_AL));646 g_snprintf(l, sizeof(l), "%d", bd->flags & 7); 641 647 c = xt_new_node("c", NULL, NULL); 642 648 xt_add_attr(c, "n", handle); … … 691 697 struct msn_buddy_data *bd = bu->data; 692 698 693 if (bu->ic != ic || (bd->flags & (MSN_BUDDY_FL | MSN_BUDDY_AL)) == 0) {699 if (bu->ic != ic || (bd->flags & 7) == 0) { 694 700 continue; 695 701 } … … 721 727 } 722 728 723 static int msn_ns_send_sdg(struct im_connection *ic, bee_user_t *bu, const char *message_type, const char *text) 729 // TODO: typing notifications, nudges lol, etc 730 int msn_ns_sendmessage(struct im_connection *ic, bee_user_t *bu, const char *text) 724 731 { 725 732 struct msn_data *md = ic->proto_data; … … 727 734 char *buf; 728 735 729 buf = g_strdup_printf(MSN_MESSAGE_HEADERS, bu->handle, ic->acc->user, md->uuid, message_type, strlen(text), text); 736 if (strncmp(text, "\r\r\r", 3) == 0) { 737 /* Err. Shouldn't happen but I guess it can. Don't send others 738 any of the "SHAKE THAT THING" messages. :-D */ 739 return 1; 740 } 741 742 buf = g_strdup_printf(MSN_MESSAGE_HEADERS, bu->handle, ic->acc->user, md->uuid, strlen(text), text); 730 743 retval = msn_ns_write(ic, -1, "SDG %d %zd\r\n%s", ++md->trId, strlen(buf), buf); 731 744 g_free(buf); 732 745 return retval; 733 746 } 734 735 int msn_ns_send_typing(struct im_connection *ic, bee_user_t *bu)736 {737 return msn_ns_send_sdg(ic, bu, "Control/Typing", "");738 }739 740 int msn_ns_send_message(struct im_connection *ic, bee_user_t *bu, const char *text)741 {742 return msn_ns_send_sdg(ic, bu, "Text", text);743 }744 -
protocols/oscar/oscar.c
rb75671d rd832164 456 456 b_event_remove(n->inpa); 457 457 } 458 n->inpa = 0;459 458 g_free(n->name); 460 459 g_free(n->show); … … 482 481 if (ic->inpa > 0) { 483 482 b_event_remove(ic->inpa); 484 ic->inpa = 0;485 483 } 486 484 if (odata->cnpa > 0) { 487 485 b_event_remove(odata->cnpa); 488 odata->cnpa = 0;489 486 } 490 487 if (odata->paspa > 0) { 491 488 b_event_remove(odata->paspa); 492 odata->paspa = 0;493 489 } 494 490 aim_session_kill(odata->sess); … … 641 637 aim_sendcookie(sess, bosconn, info->cookie); 642 638 b_event_remove(ic->inpa); 643 ic->inpa = 0;644 639 645 640 return 1; … … 2591 2586 if (cc->inpa > 0) { 2592 2587 b_event_remove(cc->inpa); 2593 cc->inpa = 0;2594 2588 } 2595 2589 aim_conn_kill(od->sess, &cc->conn); -
protocols/oscar/ssi.c
rb75671d rd832164 66 66 newitem->gid += 0x0001; 67 67 for (cur = *list, i = 0; ((cur) && (!i)); cur = cur->next) { 68 if ((cur-> bid == newitem->bid) && (cur->gid == newitem->gid)) {68 if ((cur->gid == newitem->gid) && (cur->gid == newitem->gid)) { 69 69 i = 1; 70 70 } -
protocols/purple/purple.c
rb75671d rd832164 238 238 s = set_add(&acc->set, "mail_notifications", "false", set_eval_bool, acc); 239 239 s->flags |= ACC_SET_OFFLINE_ONLY; 240 241 s = set_add(&acc->set, "mail_notifications_handle", NULL, NULL, acc);242 s->flags |= ACC_SET_OFFLINE_ONLY | SET_NULL_OK;243 240 } 244 241 … … 340 337 341 338 purple_account_set_enabled(pd->account, "BitlBee", TRUE); 342 343 if (set_getbool(&acc->set, "mail_notifications") && set_getstr(&acc->set, "mail_notifications_handle")) {344 imcb_add_buddy(ic, set_getstr(&acc->set, "mail_notifications_handle"), NULL);345 }346 339 } 347 340 … … 1267 1260 struct im_connection *ic = purple_ic_by_gc(gc); 1268 1261 1269 imcb_ notify_email(ic, "Received e-mail from %s for %s: %s <%s>", from, to, subject, url);1262 imcb_log(ic, "Received e-mail from %s for %s: %s <%s>", from, to, subject, url); 1270 1263 1271 1264 return NULL; -
protocols/skype/Makefile
rb75671d rd832164 7 7 INSTALL = install 8 8 9 all: 9 10 ifdef ASCIIDOC 11 MANPAGES = skyped.1 12 else 13 MANPAGES = 14 endif 15 16 all: $(MANPAGES) 17 10 18 clean: 19 rm -f $(MANPAGES) 11 20 12 21 # take this from the kernel … … 17 26 ./test.py 18 27 19 install-doc: 28 doc: $(MANPAGES) 29 30 install-doc: doc 31 ifdef ASCIIDOC 20 32 $(INSTALL) -d $(DESTDIR)$(MANDIR)/man1 21 $(INSTALL) -m644 $(_SRCDIR_)skyped.1 $(DESTDIR)$(MANDIR)/man1 33 $(INSTALL) -m644 $(MANPAGES) $(DESTDIR)$(MANDIR)/man1 34 endif 22 35 23 36 uninstall-doc: … … 25 38 26 39 %.1: $(_SRCDIR_)%.txt $(_SRCDIR_)asciidoc.conf 27 a2x --asciidoc-opts="-f $(_SRCDIR_)asciidoc.conf" -a bee_date=$(DATE) -f manpage $<40 a2x --asciidoc-opts="-f $(_SRCDIR_)asciidoc.conf" -a bee_date=$(DATE) -f manpage -D . $< -
protocols/twitter/twitter.c
rb75671d rd832164 469 469 g_regex_match(regex, msg, 0, &match_info); 470 470 while (g_match_info_matches(match_info)) { 471 gchar *s, *url; 472 473 url = g_match_info_fetch(match_info, 2); 471 gchar *url = g_match_info_fetch(match_info, 2); 474 472 url_len_diff += target_len - g_utf8_strlen(url, -1); 475 476 473 /* Add another character for https://t.co/... URLs */ 477 if ( (s = g_match_info_fetch(match_info, 3))) {474 if (g_match_info_fetch(match_info, 3) != NULL) { 478 475 url_len_diff += 1; 479 g_free(s);480 476 } 481 477 g_free(url); … … 487 483 } 488 484 489 int twitter_message_len(gchar *msg, int target_len) 490 { 485 static gboolean twitter_length_check(struct im_connection *ic, gchar * msg) 486 { 487 int max = set_getint(&ic->acc->set, "message_length"), len; 488 int target_len = set_getint(&ic->acc->set, "target_url_length"); 491 489 int url_len_diff = 0; 492 490 … … 495 493 } 496 494 497 return g_utf8_strlen(msg, -1) + url_len_diff; 498 } 499 500 static gboolean twitter_length_check(struct im_connection *ic, gchar * msg) 501 { 502 int max = set_getint(&ic->acc->set, "message_length"); 503 int target_len = set_getint(&ic->acc->set, "target_url_length"); 504 int len = twitter_message_len(msg, target_len); 505 506 if (max == 0 || len <= max) { 495 if (max == 0 || (len = g_utf8_strlen(msg, -1) + url_len_diff) <= max) { 507 496 return TRUE; 508 497 } … … 863 852 } 864 853 854 /* Parses a decimal or hex tweet ID, returns TRUE on success */ 855 static gboolean twitter_parse_id(char *string, int base, guint64 *id) 856 { 857 guint64 parsed; 858 char *endptr; 859 860 errno = 0; 861 parsed = g_ascii_strtoull(string, &endptr, base); 862 if (errno || endptr == string || *endptr != '\0') { 863 return FALSE; 864 } 865 *id = parsed; 866 return TRUE; 867 } 868 865 869 bee_user_t twitter_log_local_user; 866 870 … … 892 896 arg++; 893 897 } 894 if ( parse_int64(arg, 16, &id) && id < TWITTER_LOG_LENGTH) {898 if (twitter_parse_id(arg, 16, &id) && id < TWITTER_LOG_LENGTH) { 895 899 bu = td->log[id].bu; 896 900 id = td->log[id].id; 897 } else if ( parse_int64(arg, 10, &id)) {901 } else if (twitter_parse_id(arg, 10, &id)) { 898 902 /* Allow normal tweet IDs as well; not a very useful 899 903 feature but it's always been there. Just ignore … … 1012 1016 twitter_log(ic, "Tweet `%s' does not exist", cmd[1]); 1013 1017 } else { 1014 twitter_status_show_url(ic, id); 1018 /* More common link is twitter.com/$UID/status/$ID (and that's 1019 * what this will 302 to) but can't generate that since for RTs, 1020 * bu here points at the retweeter while id contains the id of 1021 * the original message. */ 1022 twitter_log(ic, "https://twitter.com/statuses/%lld", id); 1015 1023 } 1016 1024 goto eof; -
protocols/twitter/twitter_lib.c
rb75671d rd832164 1578 1578 g_free(args[1]); 1579 1579 } 1580 1581 static void twitter_http_status_show_url(struct http_request *req)1582 {1583 struct im_connection *ic = req->data;1584 json_value *parsed, *id;1585 const char *name;1586 1587 // Check if the connection is still active.1588 if (!g_slist_find(twitter_connections, ic)) {1589 return;1590 }1591 1592 if (!(parsed = twitter_parse_response(ic, req))) {1593 return;1594 }1595 1596 /* for the parson branch:1597 name = json_object_dotget_string(json_object(parsed), "user.screen_name");1598 id = json_object_get_integer(json_object(parsed), "id");1599 */1600 1601 name = json_o_str(json_o_get(parsed, "user"), "screen_name");1602 id = json_o_get(parsed, "id");1603 1604 if (name && id && id->type == json_integer) {1605 twitter_log(ic, "https://twitter.com/%s/status/%" G_GUINT64_FORMAT, name, id->u.integer);1606 } else {1607 twitter_log(ic, "Error: could not fetch tweet url.");1608 }1609 1610 json_value_free(parsed);1611 }1612 1613 void twitter_status_show_url(struct im_connection *ic, guint64 id)1614 {1615 char *url = g_strdup_printf("%s%" G_GUINT64_FORMAT "%s", TWITTER_STATUS_SHOW_URL, id, ".json");1616 twitter_http(ic, url, twitter_http_status_show_url, ic, 0, NULL, 0);1617 g_free(url);1618 } -
protocols/twitter/twitter_lib.h
rb75671d rd832164 96 96 void twitter_report_spam(struct im_connection *ic, char *screen_name); 97 97 void twitter_favourite_tweet(struct im_connection *ic, guint64 id); 98 void twitter_status_show_url(struct im_connection *ic, guint64 id);99 98 100 99 #endif //_TWITTER_LIB_H -
protocols/yahoo/yahoo.c
rb75671d rd832164 123 123 static void byahoo_init(account_t *acc) 124 124 { 125 set_t *s; 126 127 s = set_add(&acc->set, "mail_notifications", "false", set_eval_bool, acc); 128 s->flags |= ACC_SET_OFFLINE_ONLY; 129 130 s = set_add(&acc->set, "mail_notifications_handle", NULL, NULL, acc); 131 s->flags |= ACC_SET_OFFLINE_ONLY | SET_NULL_OK; 125 set_add(&acc->set, "mail_notifications", "false", set_eval_bool, acc); 132 126 133 127 acc->flags |= ACC_FLAG_AWAY_MESSAGE | ACC_FLAG_STATUS_MESSAGE; … … 151 145 yd->y2_id = yahoo_init(acc->user, acc->pass); 152 146 yahoo_login(yd->y2_id, yd->current_status); 153 154 if (set_getbool(&acc->set, "mail_notifications") && set_getstr(&acc->set, "mail_notifications_handle")) {155 imcb_add_buddy(ic, set_getstr(&acc->set, "mail_notifications_handle"), NULL);156 }157 147 } 158 148 … … 960 950 struct im_connection *ic = byahoo_get_ic_by_id(id); 961 951 962 if (from && subj) { 963 imcb_notify_email(ic, "Received e-mail message from %s with subject `%s'", from, subj); 952 if (!set_getbool(&ic->acc->set, "mail_notifications")) { 953 ; /* The user doesn't care. */ 954 } else if (from && subj) { 955 imcb_log(ic, "Received e-mail message from %s with subject `%s'", from, subj); 964 956 } else if (cnt > 0) { 965 imcb_ notify_email(ic, "Received %d new e-mails", cnt);957 imcb_log(ic, "Received %d new e-mails", cnt); 966 958 } 967 959 } -
protocols/yahoo/yahoo2.h
rb75671d rd832164 33 33 #undef malloc 34 34 #define malloc(x) g_malloc(x) 35 #undef calloc 36 #define calloc(x, y) g_calloc(x, y) 35 37 #undef realloc 36 38 #define realloc(x, y) g_realloc(x, y) -
sock.h
rb75671d rd832164 9 9 #define sock_make_nonblocking(fd) fcntl(fd, F_SETFL, O_NONBLOCK) 10 10 #define sock_make_blocking(fd) fcntl(fd, F_SETFL, 0) 11 #define sockerr_again() (errno == EINPROGRESS || errno == EINTR || errno == EAGAIN)11 #define sockerr_again() (errno == EINPROGRESS || errno == EINTR) 12 12 void closesocket(int fd); -
unix.c
rb75671d rd832164 212 212 argv[0], argv[0], argv[0], argv[0], argv[0]); 213 213 } else if (strcmp(argv[2], "enc") == 0) { 214 char *encoded; 215 216 pass_len = arc_encode(argv[4], strlen(argv[4]), &pass_cr, argv[3], 12); 217 218 encoded = base64_encode(pass_cr, pass_len); 219 printf("%s\n", encoded); 220 g_free(encoded); 221 g_free(pass_cr); 214 pass_len = arc_encode(argv[4], strlen(argv[4]), (unsigned char **) &pass_cr, argv[3], 12); 215 printf("%s\n", base64_encode(pass_cr, pass_len)); 222 216 } else if (strcmp(argv[2], "dec") == 0) { 223 pass_len = base64_decode(argv[4], &pass_cr);217 pass_len = base64_decode(argv[4], (unsigned char **) &pass_cr); 224 218 arc_decode(pass_cr, pass_len, (char **) &pass_cl, argv[3]); 225 219 printf("%s\n", pass_cl); 226 227 g_free(pass_cr);228 g_free(pass_cl);229 220 } else if (strcmp(argv[2], "hash") == 0) { 230 221 md5_byte_t pass_md5[21]; 231 222 md5_state_t md5_state; 232 char *encoded;233 223 234 224 random_bytes(pass_md5 + 16, 5); … … 238 228 md5_finish(&md5_state, pass_md5); 239 229 240 encoded = base64_encode(pass_md5, 21); 241 printf("%s\n", encoded); 242 g_free(encoded); 230 printf("%s\n", base64_encode(pass_md5, 21)); 243 231 } else if (strcmp(argv[2], "unhash") == 0) { 244 232 printf("Hash %s submitted to a massive Beowulf cluster of\n"
Note: See TracChangeset
for help on using the changeset viewer.