pidgin/pidgin

Use the leaky bucket algorithm to rate limit irc messages.
release-2.x.y
2022-04-23, Gary Kramlich
c49dcf00bee6
Use the leaky bucket algorithm to rate limit irc messages.

The default values were suggested by an operator of libera.

We don't rate limit the login process, nor parts and quits. However, if you
paste a bunch of text and then part a channel, you will be spammed with a
bunch of "no such nick/channel" error dialogs. I tried to work around this,
but the alternative just makes irc unresponsive until all the pasted messages
are sent. That said, other messages are still delayed while these errors
dialogs are slowly popping up.

Testing Done:
Lots

Bugs closed: PIDGIN-11089

Reviewed at https://reviews.imfreedom.org/r/524/
#
# Makefile.mingw
#
# Description: Makefile for win32 (mingw) version of libpurple
#
PIDGIN_TREE_TOP := ..
include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak
TARGET = libpurple
NEEDED_DLLS = $(LIBXML2_TOP)/bin/libxml2-2.dll
# gcc 4.8 on windows moved to dynamically linking libgcc. So if we're building
# under msys2 we assume we're using gcc >= 4.8 and need to copy libgcc and
# libwinpthread from the system into our install bundle.
#
# See https://gcc.gnu.org/gcc-4.8/changes.html#windows for more info.
ifeq ($(MSYSTEM),MINGW32)
NEEDED_DLLS += $(MSYSTEM_PREFIX)/bin/libgcc_s_dw2-1.dll \
$(MSYSTEM_PREFIX)/bin/libwinpthread-1.dll
endif
ifeq ($(CYRUS_SASL), 1)
NEEDED_DLLS += $(CYRUS_SASL_TOP)/bin/libsasl2-3.dll
CYRUS_SASL_PLUGINS = \
$(CYRUS_SASL_TOP)/lib/sasl2/libanonymous-3.dll \
$(CYRUS_SASL_TOP)/lib/sasl2/libcrammd5-3.dll \
$(CYRUS_SASL_TOP)/lib/sasl2/libdigestmd5-3.dll \
$(CYRUS_SASL_TOP)/lib/sasl2/libplain-3.dll
endif
##
## INCLUDE PATHS
##
INCLUDE_PATHS += \
-I$(PURPLE_TOP) \
-I$(PURPLE_TOP)/win32 \
-I$(PIDGIN_TREE_TOP) \
-I$(GTK_TOP)/include \
-I$(GTK_TOP)/include/glib-2.0 \
-I$(GTK_TOP)/lib/glib-2.0/include \
-I$(LIBXML2_TOP)/include/libxml2
LIB_PATHS += -L$(GTK_TOP)/lib \
-L$(LIBXML2_TOP)/lib
##
## SOURCES, OBJECTS
##
C_SRC = \
account.c \
accountopt.c \
blist.c \
buddyicon.c \
certificate.c \
cipher.c \
ciphers/des.c \
ciphers/gchecksum.c \
ciphers/hmac.c \
ciphers/md4.c \
ciphers/md5.c \
ciphers/rc4.c \
ciphers/sha1.c \
ciphers/sha256.c \
circbuffer.c \
cmds.c \
connection.c \
conversation.c \
core.c \
debug.c \
dnsquery.c \
dnssrv.c \
eventloop.c \
ft.c \
idle.c \
imgstore.c \
log.c \
mediamanager.c \
media.c \
mime.c \
nat-pmp.c \
network.c \
notify.c \
ntlm.c \
plugin.c \
pluginpref.c \
pounce.c \
prefs.c \
privacy.c \
proxy.c \
prpl.c \
request.c \
roomlist.c \
savedstatuses.c \
server.c \
signals.c \
smiley.c \
sound-theme-loader.c \
sound-theme.c \
sound.c \
sslconn.c \
status.c \
stringref.c \
stun.c \
theme-loader.c \
theme-manager.c \
theme.c \
upnp.c \
util.c \
value.c \
version.c \
whiteboard.c \
xmlnode.c \
win32/giowin32.c \
win32/libc_interface.c \
win32/win32dep.c
RC_SRC = win32/libpurplerc.rc
OBJECTS = $(C_SRC:%.c=%.o) $(RC_SRC:%.rc=%.o)
PC_SRC = data/purple.pc.in data/purple-uninstalled.pc.in \
data/purple-2.pc.in data/purple-2-uninstalled.pc.in
PC_FILES = $(PC_SRC:%.pc.in=%.pc)
##
## LIBRARIES
##
LIBS = \
-ldnsapi \
-lglib-2.0 \
-lgthread-2.0 \
-lgobject-2.0 \
-lgmodule-2.0 \
-lintl \
-lws2_32 \
-lxml2
include $(PIDGIN_COMMON_RULES)
##
## TARGET DEFINITIONS
##
.PHONY: all install install_shallow clean
all: $(TARGET).dll $(PC_FILES)
$(MAKE) -C $(PURPLE_PROTOS_TOP) -f $(MINGW_MAKEFILE)
$(MAKE) -C $(PURPLE_PLUGINS_TOP) -f $(MINGW_MAKEFILE)
install_shallow: $(PURPLE_INSTALL_DIR) $(TARGET).dll
cp $(TARGET).dll $(PURPLE_INSTALL_DIR)
cp $(NEEDED_DLLS) $(PURPLE_INSTALL_DIR)
ifeq ($(CYRUS_SASL), 1)
mkdir -p $(PURPLE_INSTALL_DIR)/sasl2
cp $(CYRUS_SASL_PLUGINS) $(PURPLE_INSTALL_DIR)/sasl2
endif
install: install_shallow all
$(MAKE) -C $(PURPLE_PROTOS_TOP) -f $(MINGW_MAKEFILE) install
$(MAKE) -C $(PURPLE_PLUGINS_TOP) -f $(MINGW_MAKEFILE) install
./win32/libpurplerc.rc: ./win32/libpurplerc.rc.in $(PIDGIN_TREE_TOP)/VERSION
sed -e 's/@PURPLE_VERSION@/$(PURPLE_VERSION)/g' \
$@.in > $@
$(OBJECTS): $(PURPLE_CONFIG_H) $(PURPLE_VERSION_H) $(PURPLE_PURPLE_H)
$(TARGET).dll $(TARGET).dll.a: $(OBJECTS)
$(CC) -shared $(OBJECTS) $(LIB_PATHS) $(LIBS) $(DLL_LD_FLAGS) -Wl,--output-def,$(TARGET).def,--out-implib,$(TARGET).dll.a -o $(TARGET).dll
##
## CLEAN RULES
##
clean:
rm -f $(OBJECTS) $(RC_SRC) $(PURPLE_VERSION_H) $(PURPLE_PURPLE_H)
rm -f $(TARGET).dll $(TARGET).dll.a $(TARGET).def
rm -f data/pidgin.pc data/pidgin-uninstalled.pc
rm -f data/pidgin-2.pc data/pidgin-2-uninstalled.pc
$(MAKE) -C $(PURPLE_PROTOS_TOP) -f $(MINGW_MAKEFILE) clean
$(MAKE) -C $(PURPLE_PLUGINS_TOP) -f $(MINGW_MAKEFILE) clean
include $(PIDGIN_COMMON_TARGETS)