view libpurple/purple-notifications-example @ 24475:caf82c1cebf2

I've seen this crash a few times where cmd->param_count is 4 and we try to access params[4] which is invalid. The backtrace is: #0 0x0000003c4c4341ca in ____strtoll_l_internal () from /lib64/libc.so.6 #1 0x0000003c4c431ab2 in atoi () from /lib64/libc.so.6 #2 0x00000000005f0abe in ubm_cmd (cmdproc=0xc86eb30, cmd=0xc832e00) at notification.c:494 #3 0x00000000005efef1 in msn_cmdproc_process_cmd (cmdproc=0xc86eb30, cmd=0xc832e00) at cmdproc.c:321 #4 0x00000000005eff97 in msn_cmdproc_process_cmd_text (cmdproc=0xc86eb30, command=0xcadb390 "UBM somebody1@yahoo.com 32 1 170") at cmdproc.c:343 #5 0x00000000005f9d8f in read_cb (data=0xc86ea90, source=9, cond=PURPLE_INPUT_READ) at servconn.c:439 #6 0x00000000004db70c in pidgin_io_invoke (source=0xc8369f0, condition=G_IO_IN, data=0xc836570) at gtkeventloop.cc:79 Here are some other values I've seen for command in frame 4: UBM somebody1@yahoo.com 32 1 170 UBM somebody2@yahoo.com 32 2 91 UBM somebody3@yahoo.com 32 2 93
author Mark Doliner <mark@kingant.net>
date Tue, 18 Nov 2008 07:16:49 +0000
parents 61c2d36a38a3
children
line wrap: on
line source

#!/usr/bin/env python

# This is a simple purple notification server.
# It shows notifications when your buddy signs on or you get an IM message.
#
# This script requires Python 2.4 and PyGTK bindings
#
# Note that all function names are resolved dynamically, no
# purple-specific library is needed.

import dbus
import dbus.glib
import dbus.decorators
import gobject
import os

def ensureimconversation(conversation, account, name):
    if conversation != 0:
        return conversation
    else:
        # 1 = PURPLE_CONV_IM 
        return purple.PurpleConversationNew(1, account, name)

def receivedimmsg(account, name, message, conversation, flags):
    buddy = purple.PurpleFindBuddy(account, name)
    if buddy != 0:
        alias = purple.PurpleBuddyGetAlias(buddy)
    else:
        alias = name

    text = "%s says %s" % (alias, message)
    code = os.spawnlp(os.P_WAIT, "xmessage", "xmessage", "-buttons",
                      "'So what?','Show me',Close,Abuse", text)

    if code == 101:                     # so what?
        pass
    else:
        conversation = ensureimconversation(conversation, account, name)

    if code == 102:                     # show me
        window = purple.PurpleConversationGetWindow(conversation)
        purple.PurpleConvWindowRaise(window)

    if code == 103:                     # close 
        purple.PurpleConversationDestroy(conversation)

    if code == 104:                     # abuse
        im = purple.PurpleConversationGetImData(conversation)
        purple.PurpleConvImSend(im, "Go away you f...")
                                 
        
def buddysignedon(buddyid):
    alias = purple.PurpleBuddyGetAlias(buddyid)
    text = "%s is online" % alias

    code = os.spawnlp(os.P_WAIT, "xmessage", "xmessage", "-buttons",
                      "'So what?','Let's talk'", text)

    if code == 101:                     # so what?
        pass

    if code == 102:                     # talk
        name = purple.PurpleBuddyGetName(buddyid)
        account = purple.PurpleBuddyGetAccount(buddyid)
        purple.PurpleConversationNew(1, account, name)
    

bus = dbus.SessionBus()
obj = bus.get_object("im.pidgin.purple.PurpleService", "/im/pidgin/purple/PurpleObject")
purple = dbus.Interface(obj, "im.pidgin.purple.PurpleInterface")

bus.add_signal_receiver(receivedimmsg,
                        dbus_interface = "im.pidgin.purple.PurpleInterface",
                        signal_name = "ReceivedImMsg")

bus.add_signal_receiver(buddysignedon,
                        dbus_interface = "im.pidgin.purple.PurpleInterface",
                        signal_name = "BuddySignedOn")

print "This is a simple purple notification server."
print "It shows notifications when your buddy signs on or you get an IM message."

loop = gobject.MainLoop()
loop.run()