Compare commits

...
Sign in to create a new pull request.

74 commits

Author SHA1 Message Date
Ben Wiederhake
2e303492b9 Fix imagined buffor overflow in tgl on 32-bit 2017-06-26 22:16:42 +02:00
Ben Wiederhake
ceec1a9435 Fix existance check when kicking
The effect of this bug was that kicking a non-existant user crashed pidgin.
Whoops.

Cannot be a 'g_return_if_fail', as that would leave
messages looking like errors in the log.
2017-06-21 21:34:52 +02:00
Ben Wiederhake
66ce19898c Re-generate NSI file, fix dependency bug in Makefile 2017-06-21 21:27:49 +02:00
Ben Wiederhake
87abf57060 l10n: generalize language names, re-add Spanish (sorry!) 2017-06-21 21:26:27 +02:00
Ben Wiederhake
38a4c095c7 Update copyright years
I can't believe that the copyright notice in Makefile.in was
forgotten for over a year.  Whoops.
2017-06-21 21:25:38 +02:00
Ben Wiederhake
0a4ab8a419 Makefile.in: factorize CFLAGS and LDFLAGS 2017-06-17 15:14:57 +02:00
Ben Wiederhake
da805f8c02 Import new tgl version (mostly win32 fixes) 2017-06-17 15:14:57 +02:00
Ben Wiederhake
cb96ff77aa Fix "rpl_malloc not found" when cross-compiling, re-run autoreconf
AC_FUNC_MALLOC & AC_FUNC_REALLOC cause link errors when cross-compiling.

It seems the preferred solution is to just remove them, and optionally adding
them to the AC_CHECK_FUNCS section.

Examples:
- https://github.com/LLNL/ior/issues/4
- 47331724c1
- 6667e4cb91
  (used as template for this commit message; thanks!)
- https://rickfoosusa.blogspot.de/2011/11/howto-fix-undefined-reference-to.html
- c58d62b509
2017-06-16 17:20:00 +02:00
Ben Wiederhake
550dc485c0 Strip Pidgin's broken <span> markers
Fixes #305, fixes #339, fixes #394

Quick and dirty solution, by just checking for these tags by string matching.
This technically introduces a new bug:
If pidgin adds *two* tags like this:
    <span>First text</span><span>Second text</span>
… then everything goes bad.  We won't try to salvage messages which are broken like this.
2017-06-15 20:31:53 +02:00
Anton Khirnov
78e920337c Add support for connecting via IPv6.
Enabled through a new "ipv6" option.
2017-05-31 22:02:42 +02:00
mjentsch
0c9fa0b230 Handle roomlist requests during connection 2017-05-16 23:12:54 +02:00
mjentsch
8c19fd44b9 Revert "Set the roomlist progress for compatibility"
This reverts commit 7dc7f61ca4.
2017-05-16 23:12:54 +02:00
Ben Wiederhake
05b24fc52d Reduce usage of -Werror
Affects #288, and potentially Affects #381
2017-04-17 17:03:24 +02:00
Ben Wiederhake
798fc13578 Add translation comments 2017-04-12 01:23:20 +02:00
Ben Wiederhake
72102258ab Create new POT file, initiate new translation cycle 2017-04-12 00:58:33 +02:00
Ben Wiederhake
6679d14882 Auto-test installation routines 2017-04-12 00:58:33 +02:00
Ben Wiederhake
11a14a0784 Don't 'install' non-existant file 2017-04-12 00:50:03 +02:00
mjentsch
755929bffb Remove public key from adium project 2017-04-11 22:55:43 +02:00
mjentsch
98c655b49d Clarify chat handling option
Clarify that the file transfer handling option refers to file
transfers bigger than the threshold
2017-04-11 22:35:10 +02:00
mjentsch
43ef291cb8 Merge branch 'dev-1.4.0' of https://github.com/majn/telegram-purple into dev-1.4.0 2017-04-11 21:56:23 +02:00
mjentsch
7dc7f61ca4 Set the roomlist progress for compatibility
Spectrum2 doesn't seem to display the roomlist
without it, see #365
2017-04-11 21:43:19 +02:00
Ben Wiederhake
a443ee1a5a Merge pull request #374 from BenWiederhake/dev-builtinkey-debian
Don't use a file for the pubkey; merge Debian stuff

- Don't use a file for the pubkey: Reading the pubkey caused a lot of pain in the past. Nobody complained about the format change, and there is only one Telegram pubkey anyway. So it's reasonable to assume that this feature is completely pointless. Also, tgl carries a hardcoded copy of the key anyway. So reading the key from memory instead of the filesystem is much less painful, and has essentially no cost.
- merge Debian stuff: I stopped trying to push this into the Debian repository, since Telegram, tgl, and telegram-purple are too fast-paced and unstable. However, there was someone who wanted a package, and I dislike the bad state of the Ubuntu package. Including this complete and up-to-date debian/ folder means: users can easily build their own .deb package, and the Ubuntu package will hopefully see an increase in quality (at least debian/copyright, please).
2017-04-11 12:01:37 +02:00
mjentsch
1567e17883 Merge branch 'dev-1.3.1' into dev-1.4.0 2017-04-11 08:25:19 +02:00
Ben Wiederhake
6c3f37392a Update documentation about Debian 2017-04-10 23:44:46 +02:00
Ben Wiederhake
0e585650c4 Update Debian links 2017-04-10 23:31:20 +02:00
Ben Wiederhake
d93c601446 Merge branch 'debian-develop' into dev-1.4.0 2017-04-10 23:17:00 +02:00
Ben Wiederhake
784489392c Tell explicitly that all checks have passed 2017-04-10 23:15:40 +02:00
Ben Wiederhake
edc06b82c5 Remove public key from repo 2017-04-10 23:15:40 +02:00
Ben Wiederhake
53c92303a2 Don't read pubkey from file anymore 2017-04-10 23:15:39 +02:00
Ben Wiederhake
512eeed013 Update nsi file to reflect changes in po/LINGUAS 2017-04-10 23:15:39 +02:00
Ben Wiederhake
05d1d512cf Silence warnings about bad .po files
Sadly, Transifex doesn't seem to acknowledge that the generated files
are bad.  Also, I don't want to introduce any infrastructure to
fix the files every time after I download them.
So they stay broken, and the warnings must be silenced.
Sadly, this means that future warnings will get ignored, too.
Let's hope this won't go too bad.
2017-04-10 22:18:17 +02:00
mjentsch
712bc530c6 Add option to auto-load or discard file transfers 2017-04-02 19:23:52 +02:00
mjentsch
e097f38278 Refactoring 2017-04-02 19:23:52 +02:00
Ben Wiederhake
3895bc12f0 Fix correct ITP 2016-08-22 21:52:09 +02:00
Ben Wiederhake
7a7f24c6a5 Finally: release 1.3.0 2016-08-22 21:02:14 +02:00
Ben Wiederhake
db37644412 Remove breaking hardening-flag 2016-08-22 20:31:14 +02:00
Ben Wiederhake
e198ab92ab Merge branch 'dev-1.3.0' into debian-develop 2016-08-08 11:52:14 +02:00
Ben Wiederhake
744a585502 d/watch: fix filenamemangle 2016-08-08 11:50:18 +02:00
Ben Wiederhake
974b16a9bd d/changelog: supergroups and channels 2016-08-08 11:50:18 +02:00
Ben Wiederhake
81f2a5117f Rewrite updating process, links, typos 2016-08-08 11:50:18 +02:00
Ben Wiederhake
7b31bee4e6 Clean up obsolete Debianizations 2016-08-08 11:50:18 +02:00
Ben Wiederhake
78314fd316 Merge branch 'dev-1.3.0' into debian-develop 2016-08-02 01:53:52 +02:00
Ben Wiederhake
7968ca4007 Rewrite d/watch, update d/rules to include get-orig-source 2016-03-01 11:25:26 +01:00
Ben Wiederhake
15570de448 Clean up d/rules 2016-01-13 22:24:39 +01:00
Ben Wiederhake
924e59b91f Bump version 2016-01-05 18:05:58 +01:00
Ben Wiederhake
64354d6305 Add d/upstream/metadata 2016-01-05 18:05:58 +01:00
Ben Wiederhake
a6afa1867f Fix changelog and control 2016-01-05 15:14:04 +01:00
Ben Wiederhake
3fd945465d Merge tag 'v1.2.4' into debian-develop 2016-01-05 08:47:23 +01:00
Ben Wiederhake
ac1763c596 fixup! Explain how to adapt and upgrade 2016-01-03 20:28:39 +01:00
Ben Wiederhake
6865a5e370 Add further notes about the packaging decisions 2016-01-03 19:39:46 +01:00
Ben Wiederhake
b4253a2419 Explain how to adapt and upgrade 2016-01-03 19:36:08 +01:00
Ben Wiederhake
17001c910d Fix changelog, control, rules
Added rationales for the choice of the URL in Vcs-Git and the package name.
2016-01-03 15:09:42 +01:00
Ben Wiederhake
b8eadf92d5 Fix typo in d/copyright 2015-12-31 21:53:28 +01:00
Ben Wiederhake
8ab007099f Merge branch 'master' into debian-develop 2015-12-31 19:58:51 +01:00
Ben Wiederhake
12fe25086a Override dh_auto_clean
It attempts to call 'make distclean', which appears to be a sane default.
However, telegram-purple does not have a concept of distclean, and we're
unwilling to introduce one only for Debian. So just go for the target 'clean'
instead, which currently does to right thing, which is: remove *everything*
that can be regenerated during build.
2015-12-31 19:58:21 +01:00
Ben Wiederhake
ee5fa68778 Run w-a-s -as
Remember to use wrap-and-sort with the option -as in future.
2015-12-31 19:58:21 +01:00
Ben Wiederhake
cc98501725 Include the metadata file 2015-12-31 19:58:21 +01:00
Ben Wiederhake
f849ddd18a Update debian/changelog 2015-12-31 19:58:17 +01:00
Ben Wiederhake
f432e7f1f8 Fix issues around portable-endian.h
Thanks to Ben Finney and debian-mentors for telling me a better way to
solve this.
2015-12-30 16:31:28 +01:00
Ben Wiederhake
ee3b122e52 Remove lodepng's copyright info 2015-12-30 15:43:25 +01:00
Ben Wiederhake
79f54842bc Merge branch 'dev-1.2.3' into debian-develop 2015-12-30 15:27:12 +01:00
Ben Wiederhake
3dad3f91e3 Add copyright information about portable-endian.h 2015-12-03 01:58:37 +01:00
Ben Wiederhake
b4a88942c1 Enable hardening 2015-11-28 14:43:03 +01:00
Ben Wiederhake
6edcdb8b60 Watchfile: anchor versions correctly 2015-11-14 14:46:54 +01:00
Ben Wiederhake
a9084dd497 Update changelog 2015-11-14 14:43:43 +01:00
Ben Wiederhake
9a43d7d98c Fix maintainer/uploader order 2015-11-14 14:43:43 +01:00
Ben Wiederhake
a355bcbf5a Merge branch 'master' into debian-develop 2015-11-14 10:52:15 +01:00
Ben Wiederhake
9baf48d923 Enable parallel builds 2015-10-14 03:04:58 +02:00
Ben Wiederhake
2fcaea9d13 Ignore autogenerated files 2015-10-14 03:04:58 +02:00
Ben Wiederhake
9aefb97075 Create origtar deterministically 2015-10-14 03:04:58 +02:00
Meitar Moscovitz
8eb09f9adf Add raw git-archive-all.sh script
Please note that the script is not at all production-ready,
but it's juuust so enough for our purposes.

I have no idea how other people generate reproducible tars. I tried:
- 'tar' simply doesn't honor --exclude-cvs-ignore on my machine.
- 'tar' with --exclude-from=.gitignore requires including
  `git config --global core.excludesfile`, which requires
  tilde-expansion, which I simply don't grasp.
- `git archive` doesn't include submodules.
2015-10-14 03:04:58 +02:00
Ben Wiederhake
9053eaf124 Add watchfile.
Tested with uscan, looks like it's working.
Remember to test updates of this file before pushing them!
2015-10-14 01:15:14 +02:00
Ben Wiederhake
bcb0af12f9 Add gitignore for dh files 2015-10-14 01:15:14 +02:00
Hugues Morisset
0a8f7bbf8e Add Debian package files 2015-10-14 01:15:14 +02:00
41 changed files with 734 additions and 455 deletions

View file

@ -14,6 +14,9 @@ script:
- ./configure $CONFIGURE_FLAGS
- make -j2
- make check
# Test both installation routines:
- sudo make install
- make local_install
compiler:
- clang
- gcc

View file

@ -14,7 +14,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
#
# Copyright Matthias Jentsch, Vitaly Valtman, Christopher Althaus, Markus Endres 2014-2015
# Copyright Matthias Jentsch, Vitaly Valtman, Christopher Althaus, Markus Endres 2014-2017
srcdir=@srcdir@
prefix=@prefix@
@ -22,8 +22,14 @@ datarootdir=@datarootdir@
localedir=@localedir@
gettext_package=@GETTEXT_PACKAGE@
CFLAGS=@CFLAGS@ @PURPLE_CFLAGS@ @DEFS@ -DENABLE_NLS -DLOCALEDIR='"$(localedir)"' -Wall -Wextra -Wno-deprecated-declarations -Wno-unused-parameter -I${srcdir} -I. -fno-strict-aliasing -fPIC -D_FORTIFY_SOURCE=2
LDFLAGS=@LDFLAGS@ @OPENSSL_LIBS@ @PURPLE_LIBS@ @LIBS@ -rdynamic -ggdb
CFLAGS_INTL=-DENABLE_NLS -DLOCALEDIR='"$(localedir)"'
CFLAGS_WARN=-Wall -Wextra -Wno-deprecated-declarations -Wno-unused-parameter
CFLAGS_EXTRA=-I${srcdir} -I. -fno-strict-aliasing -fPIC -D_FORTIFY_SOURCE=2
CFLAGS=@CFLAGS@ @PURPLE_CFLAGS@ @DEFS@ ${CFLAGS_INTL} ${CFLAGS_WARN} ${CFLAGS_EXTRA}
LDFLAGS_EXTRA=-rdynamic -ggdb
LDFLAGS=@LDFLAGS@ @OPENSSL_LIBS@ @PURPLE_LIBS@ @LIBS@ ${LDFLAGS_EXTRA}
DIR_PERM=0755
FILE_PERM=0644
@ -108,7 +114,7 @@ ${PLUGIN_OBJECTS}: ${OBJ}/%.o: ${srcdir}/%.c tgl/libs/libtgl.a | create_dirs
echo $@ && ${CC} ${CFLAGS} ${CPPFLAGS} -I ${srcdir}/tgl -c -MP -MD -MF ${DEP}/$*.d -MQ ${OBJ}/$*.o -o $@ $<
po/%.mo: po/%.po
${MSGFMT_PATH} -cf -o $@ $<
${MSGFMT_PATH} -cf -o $@ $< >/dev/null 2>&1
${PRPL_LIBNAME}: ${PLUGIN_OBJECTS} tgl/libs/libtgl.a | create_dirs
${CC} -shared -o $@ $^ ${LDFLAGS}
@ -121,7 +127,6 @@ noicon_install: $(PRPL_LIBNAME) $(LOCALE_MOS)
mkdir -m $(DIR_PERM) -p $(DESTDIR)$(PLUGIN_DIR_PURPLE)
install -m $(FILE_PERM) $(PRPL_LIBNAME) $(DESTDIR)$(PLUGIN_DIR_PURPLE)/$(PRPL_NAME)
mkdir -m $(DIR_PERM) -p $(DESTDIR)/etc/telegram-purple
install -m $(FILE_PERM) tg-server.tglpub $(DESTDIR)/etc/telegram-purple/server.tglpub
# Assume that the user does not use AppStream if she doesn't want icons
@for lang in $(LOCALES); do \
mkdir -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES; \
@ -133,7 +138,7 @@ noicon_install: $(PRPL_LIBNAME) $(LOCALE_MOS)
noicon_uninstall:
rm -f $(DESTDIR)$(PLUGIN_DIR_PURPLE)/$(PRPL_NAME)
rm -f $(DESTDIR)/etc/telegram-purple/server.pub # TODO: Remove this in later versions
rm -f $(DESTDIR)/etc/telegram-purple/server.tglpub
rm -f $(DESTDIR)/etc/telegram-purple/server.tglpub # TODO: Remove this in later versions
# TODO: Delete all installed .mo's, no matter what LINGUAS says.
@for lang in $(LOCALES); do \
echo "removing $(localedir)/$$lang/LC_MESSAGES/$(gettext_package).mo"; \
@ -168,14 +173,11 @@ uninstall: noicon_uninstall
local_install:
mkdir -m $(DIR_PERM) -p $(DESTDIR)$(HOME)/.purple/plugins
install -m $(FILE_PERM) $(PRPL_LIBNAME) $(DESTDIR)$(HOME)/.purple/plugins/$(PRPL_NAME)
# See telegram-base.c, function get_user_pk_path for justification:
mkdir -m $(DIR_PERM) -p $(DESTDIR)$(HOME)/.purple/telegram-purple
install -m $(FILE_PERM) tg-server.tglpub $(DESTDIR)$(HOME)/.purple/telegram-purple/server.tglpub
.PHONY: local_uninstall
local_uninstall:
rm -f $(DESTDIR)$(HOME)/.purple/plugins/$(PRPL_NAME)
rm -f $(DESTDIR)$(HOME)/.purple/telegram-purple/server.tglpub
rm -f $(DESTDIR)$(HOME)/.purple/telegram-purple/server.tglpub # TODO: Remove this in later versions
### == Handling and maintenance. Subject to rapid change, shouldn't be used in scripts. == ###
@ -188,7 +190,9 @@ strip: $(PRPL_LIBNAME)
$(STRIP) --strip-unneeded $(PRPL_LIBNAME)
.PHONY: build-nsi
build-nsi: telegram-purple.nsi.awk telegram-purple.nsi.awk-in
build-nsi: telegram-purple.nsi
telegram-purple.nsi: telegram-purple.nsi.awk telegram-purple.nsi.awk-in po/LINGUAS
awk -f telegram-purple.nsi.awk telegram-purple.nsi.awk-in > telegram-purple.nsi
.PHONY: run

View file

@ -106,7 +106,6 @@ strip: $(PRPL_LIBNAME)
install: $(PRPL_LIBNAME) $(LOCALES)
mkdir -m $(DIR_PERM) -p $(PLUGIN_DIR_PURPLE)
install -m $(FILE_PERM) $(PRPL_LIBNAME) $(PLUGIN_DIR_PURPLE)/$(PRPL_NAME)
install -m $(FILE_PERM) tg-server.tglpub $(DATA_ROOT_DIR_PURPLE)/server.tglpub
ifeq ($(COPY_ICONS),no)
@echo "Not copying icons due to configure-option --disable-icons."
@echo " If you're using Finch, Empathy, or Telepathy, then this is a good idea."

View file

@ -41,10 +41,8 @@ https://aur.archlinux.org/packages/telegram-purple/
#### Debian
At the time of writing, the package hasn't been accepted yet.
Please first check if it's already available to you: `sudo apt-get install telegram-purple`
If this doesn't work because the package doesn't exist (yet), please build it from source.
You can build it from source (see following section) or build a `.deb` file
for your package manager.
Building From Source
@ -85,12 +83,6 @@ this indicates that this version is in fact much further than just
##### Debian / Ubuntu
We are working on a Debian package! Please first check if it's already available to you: `sudo apt-get install telegram-purple`
If the above works, then you should stop here: It is now installed.
If the above fails: Don't worry, just continue building it by yourself. Next you need to install these dependencies:
sudo apt-get install libgcrypt20-dev libpurple-dev libwebp-dev gettext build-essential
@ -223,17 +215,16 @@ Building the Debian Package
If you just need a `.deb`, simply do:
sudo apt-get install debhelper
git checkout debian-master
git submodule update --recursive
fakeroot ./debian/rules binary
And you're done! The `.deb` is in the directory at which you started.
And you're done! The `telegram-purple_….deb` and `telegram-purple-dbgsym_….deb` files
are in the parent directory.
To show some info about it, try this:
dpkg --info telegram-purple_*.deb
`debian-master` always points to a version that was submitted to Debian. (Note that this doesn't exist yet, as we haven't released to Debian yet.)
`debian-develop` is the candidate for the next submission.
Please note that installing the debugging symbols (`dbgsym`)
help a lot in troubleshooting, so please do install them, too!
#### Debian Maintainers ####
@ -244,16 +235,15 @@ Here's how you can generate a `.orig.tar.gz`:
make dist
Note that these are incompatible with the old `debian/genorigtar.sh`
tarballs, and can't be made compatible easily. If you need the tarball
from "back then", see the documentation there.
This command requires the original tar to exist (and will fail otherwise,
although the error message will be misleading) will build all further files,
The following command requires the original tar to exist,
and will build all further files,
specifically `.debian.tar.xz`, `.dsc`, `.deb`, and `.changes`:
dpkg-buildpackage
If this fails with a cryptic error message,
first make sure that the `….orig.tar` really is in place.
For the upload, you should use `pbuilder` and similar to build the package
in a more minimalistic environment. That covers the official part of the work-flow.
@ -265,6 +255,8 @@ and `.dsc` files, do this:
false # Move tar to parent directory, by hand
dpkg-source -b .
Note that we no longer actively try to get it into the Debian repository.
Discussion / Help
-----------------
@ -273,15 +265,11 @@ Discussion / Help
As we want to avoid OpenSSL, it has become necessary to replace the PEM file format. This means that if you use a custom pubkey (which you really REALLY shouldn't be doing), you have to adapt, sorry.
We no longer ship `tg-server.pub` (old format), but instead `tg-server.tglpub` (new format). If you have a `.pub` and want to continue using telegram-purple, please use this (hopefully highly portable) tool: [pem2bignum](https://github.com/BenWiederhake/pem2bignum)
You can also write your own conversion tool if you prefer. The format is really simple:
1. `e`, the public exponent, encoded as big endian 32 bit fixed length (e.g. `0x00 01 00 01` for 65537)
2. `n_len`, the length of `n` in bytes, encoded as big endian 32 bit fixed length (e.g. `0x00 00 01 00` for a 2048-bit = 256-byte key)
3. `n_raw`, the raw modulus, encoded as big endian, using the previously indicated length (e.g. `0xC1 50 02 3E [248 bytes omitted] 21 79 25 1F` in the case of telegram's public RSA key.)
If you are interested in developing a non-OpenSSL-licensed converter, look into [insane-triangle-banana](https://github.com/BenWiederhake/insane-triangle-banana).
We no longer read the public key of the Telegram servers from a file.
If you really need a different public key, and know what you're doing
(e.g., connecting to some kind of test environment internal to Telegram,
which also is a very bad idea), you need to find the call to `tgl_set_rsa_key_direct` in `telegram-purple.c`,
and provide the key directly by yourself.
FAQ

View file

@ -24,8 +24,7 @@
/* Define to 1 if you have `z' library (-lz) */
#undef HAVE_LIBZ
/* Define to 1 if your system has a GNU libc compatible `malloc' function, and
to 0 otherwise. */
/* Define to 1 if you have the `malloc' function. */
#undef HAVE_MALLOC
/* Define to 1 if you have the <memory.h> header file. */
@ -91,8 +90,5 @@
/* Define to 1 if you have the ANSI C header files. */
#undef STDC_HEADERS
/* Define to rpl_malloc if the replacement function should be used. */
#undef malloc
/* Define to `unsigned int' if <sys/types.h> does not define. */
#undef size_t

71
configure vendored
View file

@ -620,11 +620,11 @@ ac_includes_default="\
#endif"
ac_subst_vars='LTLIBOBJS
LIBOBJS
GETTEXT_PACKAGE
MSGFMT_PATH
CHECK_GETTEXT
PURPLE_CPPFLAGS
LIBOBJS
PURPLE_LIBS
PURPLE_CFLAGS
PKG_CONFIG_LIBDIR
@ -4444,74 +4444,7 @@ fi
# Checks for library functions.
for ac_header in stdlib.h
do :
ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default"
if test "x$ac_cv_header_stdlib_h" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_STDLIB_H 1
_ACEOF
fi
done
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5
$as_echo_n "checking for GNU libc compatible malloc... " >&6; }
if ${ac_cv_func_malloc_0_nonnull+:} false; then :
$as_echo_n "(cached) " >&6
else
if test "$cross_compiling" = yes; then :
ac_cv_func_malloc_0_nonnull=no
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#if defined STDC_HEADERS || defined HAVE_STDLIB_H
# include <stdlib.h>
#else
char *malloc ();
#endif
int
main ()
{
return ! malloc (0);
;
return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
ac_cv_func_malloc_0_nonnull=yes
else
ac_cv_func_malloc_0_nonnull=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5
$as_echo "$ac_cv_func_malloc_0_nonnull" >&6; }
if test $ac_cv_func_malloc_0_nonnull = yes; then :
$as_echo "#define HAVE_MALLOC 1" >>confdefs.h
else
$as_echo "#define HAVE_MALLOC 0" >>confdefs.h
case " $LIBOBJS " in
*" malloc.$ac_objext "* ) ;;
*) LIBOBJS="$LIBOBJS malloc.$ac_objext"
;;
esac
$as_echo "#define malloc rpl_malloc" >>confdefs.h
fi
for ac_func in memset strdup
for ac_func in malloc memset strdup
do :
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"

View file

@ -75,8 +75,7 @@ AC_CHECK_HEADERS([arpa/inet.h fcntl.h netdb.h netinet/in.h stdlib.h string.h sys
AC_TYPE_SIZE_T
# Checks for library functions.
AC_FUNC_MALLOC
AC_CHECK_FUNCS([memset strdup])
AC_CHECK_FUNCS([malloc memset strdup])
AC_SUBST(PURPLE_CFLAGS)
AC_SUBST(PURPLE_CPPFLAGS)

8
debian/.gitignore vendored Normal file
View file

@ -0,0 +1,8 @@
/files
/telegram-purple/
/telegram-purple.*
/.debhelper/
/autoreconf.after
/autoreconf.before
/debhelper-build-stamp

121
debian/README.source vendored Normal file
View file

@ -0,0 +1,121 @@
Packing, unpacking, and modifying (as per §4.14)
================================================
1. Generate the fully patched source, in a form ready for editing, that
would be built to create Debian packages.
This step does not need any special attention. The standard invocation
of "dpkg-source -x" does exactly what is needed.
2. Modify the source and save those modifications so that they will be
applied when building the package.
== AND ==
3. Remove source modifications that are currently being applied when
building the package.
There is no standard procedure for this package. Please note that:
- quilt seems to be the default tool for this kind of work.
- git-buildpackage (gbp) might not work as expected, so I refrained
from trying it for this task. See below.
So far, issues reported against the project have been resolved quickly
enough to avoid scenarios that usually need the d/patches/ directory.
4. Generate a *.orig.tar.gz from the git repository, e.g., upgrade the
Debian source package to a new upstream version.
Easy way:
use the provided orig-tars, e.g., 'telegram-purple_1.2.6.orig.tar.gz'
Hard way (the procedure used to create these files):
$ git clone --recursive --branch debian-master \
https://github.com/majn/telegram-purple.git
$ cd telegram-purple
...$ make dist
The output should look like this:
Refresh commit.h
./gen-origtar
mv -f bin/result.tar.gz telegram-purple_deb-v1.2.4-2-161-gb5272d4.orig.tar.gz
The following approaches do NOT work:
- Github's "download source tar", as this leaves out submodules.
- git-buildpackage (gpb). No support for submodules-within-submodules.
The file README.md of the project contains some hints about how to
build packages, so here's a cheat sheet:
- Just build a *.deb, ideal for local use:
fakeroot ./debian/rules binary
- Build the package for analysis, e.g. lintian:
dpkg-buildpackage
- Only produce a *.dsc and *.debian.tar.xz file:
( cd .. && dpkg-source -b telegram-purple )
- Run pbuilder (needs the previous step):
( cd .. && sudo pbuilder --build telegram-purple_*.dsc )
Package name
============
At the time of writing (2016-01-03), the Debian repository contained
the following libpurple-backends:
- pidgin-encryption
- pidgin-latex
- pidgin-otr
- pidgin-plugin-pack
- pidgin-privacy-please
So following that tradition, this package would be called "pidgin-telegram".
However, this would have a lot of disadvantages:
- This is a frontend-agnostic backend that works with Adium, pidgin,
and Finch. We hope that it works nicely with all other frontends, too.
Calling it "pidgin-something" would be highly misleading.
- All error messages and their translations would need to be adapted
- paths would need to change that aren't configurable
- some users are expecting the name to be "telegram-purple"
(at least initially)
Overall, we consider this a needlessly confusing convention, and
intentionally break with it.
Packaging libtgl separately (as per §4.13)
==========================================
No.
So far, ABI-compatibility was broken between virtually every other
commit to libtgl, and the library is still under development. The
latest "stable" release is heavily outdated and can no longer be used
productively (missing features, known breaking bugs, etc.), so if we were to
package tgl we would need to repackage it constantly, with no defined
concept of version, soname, or anything reliable. No other program
(*including* tg-cli) can be expected to use the same version of libtgl
as telegram-purple does. (This might happen every now and then, but
that would be random chance. Finally, it's highly unlikely that someone
installs and uses both telegram-purple and tg-cli.)
Packaging "tl-parser" or the intermediate "generate" program is also a
bad idea: One *could* do that, but it's only useful for libtgl. So
there is a significant lack of users.
Note that tl-parser is a relatively (in comparison to the rest of
libtgl) stable, portable application (not library). The output format
hasn't changed in a over a year. If you believe that these six files
will be used by a lot of people, I'll be happy to package tl-parser for
you. However, please note that this would require at least two
packages: tl-parser (binary), tl-parser-dev (headers), and possibly
libtl-parser (common object files).
In short: there's no set of component that could be packaged in a more
clever way.
About this document
===================
This is not written in Markdown. All formatting is in the hope of
making it easy to read.

27
debian/changelog vendored Normal file
View file

@ -0,0 +1,27 @@
telegram-purple (1.3.1-1) UNRELEASED; urgency=medium
* New upstream release
* No longer actively try to push it into Debian: too unstable.
If you really want a .deb file, see README.md in the toplevel directory.
-- Ben Wiederhake <Ben.Wiederhake@gmail.com> Mon, 10 Apr 2017 23:31:32 +0200
telegram-purple (1.3.0-1) unstable; urgency=medium
[ Hugues Morisset ]
* Initial Release (Closes: #833793)
[ Ben Wiederhake ]
* Please note that due to the format-switch in 1.2.6, the file
/etc/telegram-purple/server.pub is obsolete for all version after it.
It is ignored to allow for smooth transition from old, manual
installations, and may be removed in future versions.
* New upstream release
- Add translations and plural support
- Fix lots of bugs around secret chats (still not perfect, though)
- Fix behavior around hibernation
- Fix display errors and false warnings
- Fix crash on 'unsupported' media
- Support supergroups and channels
-- Ben Wiederhake <Ben.Wiederhake@gmail.com> Mon, 22 Aug 2016 20:59:47 +0200

1
debian/compat vendored Normal file
View file

@ -0,0 +1 @@
9

42
debian/control vendored Normal file
View file

@ -0,0 +1,42 @@
Source: telegram-purple
Section: net
Priority: optional
Maintainer: Ben Wiederhake <Ben.Wiederhake@gmail.com>
Uploaders:
Hugues Morisset <morisset.hugues@gmail.com>
Build-Depends:
autotools-dev,
debhelper (>= 9),
dh-autoreconf,
libgcrypt20-dev,
libglib2.0-dev,
libpurple-dev,
libwebp-dev,
pkg-config,
zlib1g-dev
Standards-Version: 3.9.8
Homepage: https://github.com/majn/telegram-purple
Vcs-Git: https://github.com/majn/telegram-purple.git
Vcs-Browser: https://github.com/majn/telegram-purple
Package: telegram-purple
Architecture: any
Depends:
${misc:Depends},
${shlibs:Depends}
Suggests:
pidgin | finch
Description: Purple plugin to support Telegram
Plugin for purple which lets you use and manage your Telegram account
like any other account in purple. Some features like self-destruct
messages are currently in development.
X-Comment: Traditionally, this plugin should be named "telegram-pidgin".
However, this plugin is also designed to work with at least Adium,
Finch, and hopefully all other libpurple-frontends, so this name would
be highly misleading. Furthermore, the plugin refers to itself as
"telegram-purple", and changing this (e.g. via a patch) would be highly
non-trivial and fragile. Finally, several users know this plugin under
the name telegram-purple only, so naming the Debian package differently
would be another source of confusion. Thus we intentionally break with
this tradition, and re-used the name telegram-purple from the original
project.

102
debian/copyright vendored Normal file
View file

@ -0,0 +1,102 @@
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: pidgin-telegram
Source: https://github.com/majn/telegram-purple
Files: *
Copyright: 2014-2015 Matthias Jentsch <mtthsjntsch@gmail.com>
2014 Vitaly Valtman <mail@vysheng.ru>
2014 Christopher Althaus <althaus.christopher@gmail.com>
2014 Markus Endres <endresma45241@th-nuernberg.de>
License: GPL-2+
Files: AppStream/telegram-purple.metainfo.untranslated.xml
Copyright: 2015 Jiri Eischmann <eischmann@redhat.com>
License: GFDL-NIV
License-Grant:
<metadata_license>GFDL-1.3</metadata_license>
Files: debian/*
Copyright: 2015 Hugues Morisset <morisset.hugues@gmail.com>
2015 Ben Wiederhake <BenWiederhake.GitHub@gmail.com>
License: GPL-2+
Files: tgl/*
Copyright: 2013-2015 Vitaly Valtman <mail@vysheng.ru>
2015 Matthias Jentsch <mtthsjntsch@gmail.com>
2015 Ben Wiederhake <BenWiederhake.GitHub@gmx.de>
License: LGPL-2.1+
Files: tgl/tl-parser/*
Copyright: 2015 Matthias Jentsch <mtthsjntsch@gmail.com>
2015 Vitaly Valtman <mail@vysheng.ru>
2015 Christopher Althaus <althaus.christopher@gmail.com>
2015 Markus Endres <endresma45241@th-nuernberg.de>
License: GPL-2+
Files: tgl/tl-parser/portable_endian.h
Copyright: 2013-2014 Mathias Panzenböck <grosser.meister.morti@gmx.net>
2015 PkmX <pkmx.tw@gmail.com>
License: BSD-3-clause or Expat or Apache-2
License-Grant:
I, Mathias Panzenböck, place this file hereby into the public domain.
Use it at your own risk for whatever you like. In case there are
jurisdictions that don't support putting things in the public domain
you can also consider it to be "dual licensed" under the BSD, MIT and
Apache licenses, if you want to. This code is trivial anyway. Consider
it an example on how to get the endian conversion functions on
different platforms.
FIXME:
This is a tag for the sole purpose and hope that one day, someone
searches for "Fixme" (possibly case-sensitive). Thus, the issue in the
following "Comment" field can be found in both the Debian archive and
the original project.
Comment:
This is a comment from the person who wrote this debian/copyright file.
.
The licensing was obviously meant to be "use whatever". However, we
have to mirror it precisely, and verbatim. I took the freedom to
interprete the terms "the MIT licenses" as "Expat"; "the BSD licenses"
as BSD 3-clause; and "the Apache licenses" as Apache 2.0. I do this
in order to keep the list reasonably small and close enough. However,
someone who understands the legal implications should take a close
look at this.
License: LGPL-2.1+
On Debian systems, the complete text of the GNU Lesser General
Public License can be found in "/usr/share/common-licenses/LGPL-2.1".
License: GPL-2+
On Debian systems, the complete text of the GNU General Public License
version 2 can be found in "/usr/share/common-licenses/GPL-2".
License: BSD-3-clause
On Debian systems, the complete text of the Revised BSD License
(3-clause) can be found in "/usr/share/common-licenses/GPL-3".
License: Apache-2
On Debian systems, the complete text of version 2.0 of the Apache License
can be found in /usr/share/common-licenses/Apache-2.0.
License: GFDL-NIV
On Debian systems, the complete text of version 1.3 of the GNU Free
Document License /usr/share/common-licenses/GFDL-1.3.
License: Expat
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
.
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

1
debian/docs vendored Normal file
View file

@ -0,0 +1 @@
AUTHORS

22
debian/rules vendored Executable file
View file

@ -0,0 +1,22 @@
#!/usr/bin/make -f
DPKG_EXPORT_BUILDFLAGS = 1
include /usr/share/dpkg/default.mk
%:
dh $@ --parallel --with autoreconf
# dh_auto_clean tries to "make distclean", but we don't have that target.
override_dh_auto_clean:
test ! -e Makefile || $(MAKE) clean
## http://wiki.debian.org/onlyjob/get-orig-source
PKD := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
PKG := $(shell dpkg-parsechangelog -l$(PKD)/changelog --show-field=Source)
VER ?= $(shell dpkg-parsechangelog -l$(PKD)/changelog --show-field=Version | cut -d- -f1)
.PHONY: get-orig-source
get-orig-source: $(info I: $(PKG)_$(VER))
@echo "# Downloading for ${PKD}"
uscan --noconf --verbose --rename --destdir=$(CURDIR) \
--check-dirname-level=0 --force-download --download-version "$(VER)" $(PKD)

1
debian/source/format vendored Normal file
View file

@ -0,0 +1 @@
3.0 (quilt)

1
debian/source/options vendored Normal file
View file

@ -0,0 +1 @@
extend-diff-ignore = "(^|/)(config\.(h|log|status)|Makefile)$"

27
debian/upstream/metadata vendored Normal file
View file

@ -0,0 +1,27 @@
Bug-Database: https://github.com/majn/telegram-purple/issues/
Bug-Submit: https://github.com/majn/telegram-purple/issues/new
#Cite-As: <a href="https://github.com/majn/telegram-purple">telegram-purple</ a>
## Intentionally left out, to make sure that we don't accidentally break someone's
## workflow. We err on the side of not prescribing anyone how to cite this work.
#Changelog: https://github.com/majn/telegram-purple/blob/master/CHANGELOG.md
## Intentionally left out as it's already outdated at the time of writing.
#Contact: https://goo.gl/QHttTR
## The development chat group.
## Intentionally left out as the link changes constantly.
## https://github.com/majn/telegram-purple#group-chat
## for a recent link.
#Donation: See 'Contact'
#FAQ: https://github.com/majn/telegram-purple/#faq
## Intentionally left out: no real content yet.
Name: telegram-purple
## Might be superfluous, but I want to confirm that the upstream name is
## indeed telegram-purple, hence the package name in Debian.
Repository: https://github.com/majn/telegram-purple/
Repository-Browse: https://github.com/majn/telegram-purple/
Security-Contact:
Main developer: Matthias Jentch <mtthsjntsch AT gmail DOT com>
Debian packager: Ben Wiederhake <Ben DOT Wiederhake AT gmail DOT com>
# Development channel (public): https://goo.gl/QHttTR
## Intentionally left out as the link changes constantly.
## https://github.com/majn/telegram-purple#group-chat
## for a recent link.

17
debian/watch vendored Normal file
View file

@ -0,0 +1,17 @@
version=4
opts="\
downloadurlmangle=s/tag\/v(.*)$/download\/v$1\/telegram-purple_$1.orig.tar.gz/,\
filenamemangle=s/.*tag\/v(.*)$/telegram-purple_$1.orig.tar.gz/,\
uversionmangle=s/-(beta\d*)$/~$1/,\
" \
https://github.com/majn/telegram-purple/releases \
/tag/v([\d\.]*(?:-beta\d*)?) \
debian \
uupdate
# Rationales (from bottom up):
# - There will always be tags of the style "v1.2.5", so search for that
# - The "beta" group must be non-capturing, otherwise uscan tries to concatenate them (e.g. "1.2.3-beta.-beta")
# - Github tars are unusable; use the (hopefully attached) origtar
# - Beta-releases should be ordered before the "main" release (was never relevant so far)
# - Spacing in order to have exactly one rule per line

View file

@ -1,11 +1,12 @@
bg
cs_CZ
de_DE
cs
de
es
es_AR
fr
it_IT
it
nl
pl_PL
pl
ru_RU
sq
uk

View file

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-08-31 22:53+0200\n"
"POT-Creation-Date: 2017-04-12 01:22+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -18,189 +18,195 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
#: ../telegram-base.c:500
#: ../telegram-base.c:424
msgid "Couldn't create group"
msgstr ""
#: ../telegram-base.c:501
#: ../telegram-base.c:425
msgid "Please select at least one other user."
msgstr ""
#: ../telegram-base.c:555
#: ../telegram-base.c:479
msgid "Query Failed"
msgstr ""
#: ../telegram-purple.c:162
#: ../telegram-purple.c:159
msgid "Secret chat ready."
msgstr ""
#: ../telegram-purple.c:170
#: ../telegram-purple.c:167
msgid "Secret chat terminated."
msgstr ""
#: ../telegram-purple.c:182
#: ../telegram-purple.c:179
msgid "Telegram"
msgstr ""
#: ../telegram-purple.c:229
#: ../telegram-purple.c:226
msgid "Message marked as read."
msgstr ""
#: ../telegram-purple.c:339
#: ../telegram-purple.c:336
#, c-format
msgid "Invite link: %s"
msgstr ""
#. FIXME: Can TGLCHF_MODERATOR export links?
#: ../telegram-purple.c:350
#: ../telegram-purple.c:347
msgid "Creating chat link failed"
msgstr ""
#: ../telegram-purple.c:351
#: ../telegram-purple.c:348
msgid "You need to be admin of the group to do that."
msgstr ""
#: ../telegram-purple.c:416
#: ../telegram-purple.c:432
msgid "Chat joined"
msgstr ""
#: ../telegram-purple.c:417
#: ../telegram-purple.c:433
msgid "Chat added to list of chat rooms."
msgstr ""
#: ../telegram-purple.c:443
#: ../telegram-purple.c:459
msgid "Start secret chat..."
msgstr ""
#. Generate Public Link
#: ../telegram-purple.c:450
#: ../telegram-purple.c:466
msgid "Invite users by link..."
msgstr ""
#. Delete self from chat
#: ../telegram-purple.c:458
#: ../telegram-purple.c:474
msgid "Delete and exit..."
msgstr ""
#: ../telegram-purple.c:546
#, c-format
msgid "Unable to sign on as %s: file (public key) not found."
msgstr ""
#: ../telegram-purple.c:550
#, c-format
msgid ""
"Make sure telegram-purple is installed properly,\n"
"including the .tglpub file.\n"
"If you're running SELinux (e.g. when using Tails),\n"
"try 'make local_install', or simply copy\n"
"%1$s to %2$s."
msgstr ""
#: ../telegram-purple.c:572
#: ../telegram-purple.c:553
#, c-format
msgid ""
"Unable to sign on as %s: problem in the underlying library 'tgl'. Please "
"submit a bug report with the debug log."
msgstr ""
#: ../telegram-purple.c:576
#: ../telegram-purple.c:557
msgid "Problem in tgl"
msgstr ""
#. TRANSLATORS: Please fill in your own prefix!
#: ../telegram-purple.c:584
#: ../telegram-purple.c:565
#, c-format
msgid ""
"Unable to sign on as %s: phone number lacks country prefix. Numbers must "
"start with the full international prefix code, e.g. +1 for USA."
msgstr ""
#: ../telegram-purple.c:589
#: ../telegram-purple.c:570
msgid "Incomplete phone number"
msgstr ""
#: ../telegram-purple.c:642
#: ../telegram-purple.c:628
msgid "Secret chat was already deleted"
msgstr ""
#: ../telegram-purple.c:644
#: ../telegram-purple.c:630
msgid "Secret chat is not ready"
msgstr ""
#: ../telegram-purple.c:652
#: ../telegram-purple.c:638
msgid "Only the creator of a channel can post messages."
msgstr ""
#: ../telegram-purple.c:695
#: ../telegram-purple.c:681
msgid "Cannot invite buddy to chat"
msgstr ""
#: ../telegram-purple.c:696
#: ../telegram-purple.c:682
msgid "Specified user does not exist."
msgstr ""
#: ../telegram-purple.c:709
#: ../telegram-purple.c:695
msgid "phone no. (+ country prefix)"
msgstr ""
#: ../telegram-purple.c:790
msgid "kick <user>: Kick a user from the room."
msgstr ""
#. Login
#: ../telegram-purple.c:817
#: ../telegram-purple.c:812
msgid "Password (two factor authentication)"
msgstr ""
#: ../telegram-purple.c:822
#: ../telegram-purple.c:817
msgid ""
"Fallback SMS verification\n"
"(Helps when not using Pidgin and you aren't being prompted for the code)"
msgstr ""
#: ../telegram-purple.c:828
msgid "always"
#. Whether to do fallback SMS verification
#: ../telegram-purple.c:824
msgid "Always"
msgstr ""
#: ../telegram-purple.c:829
msgid "never"
#. Whether to do fallback SMS verification
#: ../telegram-purple.c:826
msgid "Never"
msgstr ""
#. Whether to do fallback SMS verification
#. How to handle "large" files
#: ../telegram-purple.c:828 ../telegram-purple.c:849
msgid "Ask"
msgstr ""
#: ../telegram-purple.c:830
msgid "ask"
msgstr ""
#: ../telegram-purple.c:832
msgid "Accept secret chats"
msgstr ""
#: ../telegram-purple.c:836
#: ../telegram-purple.c:834
msgid "Display buddies offline after (days)"
msgstr ""
#: ../telegram-purple.c:840
#: ../telegram-purple.c:838
msgid ""
"Don't fetch history older than (days)\n"
"(0 for unlimited)"
msgstr ""
#. Media
#. How to handle "large" files
#: ../telegram-purple.c:845
msgid "Autoload media size (kb)"
msgid "Discard"
msgstr ""
#. How to handle "large" files
#: ../telegram-purple.c:847
msgid "Auto load"
msgstr ""
#: ../telegram-purple.c:851
msgid "Auto load file transfers up to (kb)"
msgstr ""
#: ../telegram-purple.c:855
msgid "Bigger file transfers"
msgstr ""
#. Chats
#: ../telegram-purple.c:850
#: ../telegram-purple.c:859
msgid "Add all group chats to buddy list"
msgstr ""
#. Read notifications
#: ../telegram-purple.c:855
#. Receipts
#: ../telegram-purple.c:864
msgid "Display notices of receipt"
msgstr ""
#: ../telegram-purple.c:859
#: ../telegram-purple.c:868
msgid "Send notices of receipt when present"
msgstr ""
#: ../telegram-purple.c:884
#: ../telegram-purple.c:893
msgid "Telegram Protocol Plugin."
msgstr ""
@ -273,51 +279,59 @@ msgid "Channel %1$s created"
msgstr ""
#. FIXME: check if this makes sense
#: ../tgp-msg.c:165 ../tgp-chat.c:124 ../tgp-chat.c:576
#: ../tgp-msg.c:165 ../tgp-chat.c:124 ../tgp-chat.c:654
msgid "Telegram Channels"
msgstr ""
#: ../tgp-msg.c:191
#: ../tgp-msg.c:211
msgid "Sending message failed."
msgstr ""
#: ../tgp-msg.c:253
#: ../tgp-msg.c:274
msgid "Sending image failed."
msgstr ""
#: ../tgp-msg.c:417
#: ../tgp-msg.c:429
#, c-format
msgid "%s sent a sticker."
msgstr ""
#: ../tgp-msg.c:463
#: ../tgp-msg.c:475
msgid "failed loading message"
msgstr ""
#: ../tgp-msg.c:498
msgid "[animation]"
#. Content of a file transfer
#: ../tgp-msg.c:522 ../tgp-msg.c:572
msgid "document"
msgstr ""
#: ../tgp-msg.c:515
msgid "[audio]"
#. Content of a file transfer
#: ../tgp-msg.c:525
msgid "audio"
msgstr ""
#: ../tgp-msg.c:515
msgid "[video]"
#. Content of a file transfer
#: ../tgp-msg.c:528
msgid "animation"
msgstr ""
#: ../tgp-msg.c:604
#. Content of a file transfer
#: ../tgp-msg.c:531
msgid "video"
msgstr ""
#: ../tgp-msg.c:649
#, c-format
msgid "<b>Forwarded message from: %s</b><br>%s"
msgstr ""
#. FIXME: sometimes users aren't part of the response when receiving a forwarded message
#: ../tgp-msg.c:607
#: ../tgp-msg.c:652
#, c-format
msgid "<b>Forwarded message:</b><br>%s"
msgstr ""
#: ../tgp-msg.c:720
#: ../tgp-msg.c:765
msgid "loading document or picture failed"
msgstr ""
@ -540,7 +554,7 @@ msgstr ""
msgid "unknown"
msgstr ""
#: ../tgp-chat.c:108 ../tgp-chat.c:582
#: ../tgp-chat.c:108 ../tgp-chat.c:660
msgid "Telegram Chats"
msgstr ""
@ -548,34 +562,34 @@ msgstr ""
msgid "You have already left this chat."
msgstr ""
#: ../tgp-chat.c:224
#: ../tgp-chat.c:296
msgid "Subject:"
msgstr ""
#: ../tgp-chat.c:230
#: ../tgp-chat.c:302
msgid "Invite link:"
msgstr ""
#: ../tgp-chat.c:236
#: ../tgp-chat.c:308
msgid "Chat ID:"
msgstr ""
#: ../tgp-chat.c:342
#: ../tgp-chat.c:416
msgid "Supergroup"
msgstr ""
#: ../tgp-chat.c:342
#: ../tgp-chat.c:416
msgid "Channel"
msgstr ""
#: ../tgp-chat.c:345
#: ../tgp-chat.c:419
msgid "Group"
msgstr ""
#: ../tgp-chat.c:367
#: ../tgp-chat.c:443
msgid "Users in chat"
msgstr ""
#: ../tgp-chat.c:370
#: ../tgp-chat.c:446
msgid "Type"
msgstr ""

View file

@ -32,7 +32,6 @@ extern void purple_init_telegram_plugin();
- (void) installPlugin
{
pk_path = [self getPkName];
purple_init_telegram_plugin();
[TelegramService registerService];
}

View file

@ -43,7 +43,6 @@
C4B57BF01B1598D4006997F4 /* libtgl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C4B57BEF1B1598D4006997F4 /* libtgl.a */; };
C4D12DF01BC534CF00C0F6E1 /* tgp-blist.c in Sources */ = {isa = PBXBuildFile; fileRef = C4D12DEF1BC534CF00C0F6E1 /* tgp-blist.c */; };
C4D3EB5A1C3824C5003C895B /* tgp-info.c in Sources */ = {isa = PBXBuildFile; fileRef = C4D3EB581C3824C5003C895B /* tgp-info.c */; };
C4D432D81BC2783C00561667 /* tg-server.tglpub in Resources */ = {isa = PBXBuildFile; fileRef = C4D432D71BC2783C00561667 /* tg-server.tglpub */; };
C4D819061A5C862E0044CBA9 /* tgp-structs.c in Sources */ = {isa = PBXBuildFile; fileRef = C4D819041A5C862E0044CBA9 /* tgp-structs.c */; };
C4D9185B1C1C6B3900AECCA2 /* libgpg-error.0.dylib in Resources */ = {isa = PBXBuildFile; fileRef = C4D9185A1C1C6B3900AECCA2 /* libgpg-error.0.dylib */; };
C4D9185C1C1C6B9C00AECCA2 /* libgpg-error.0.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = C4D9185A1C1C6B3900AECCA2 /* libgpg-error.0.dylib */; };
@ -333,7 +332,6 @@
files = (
C4D9185B1C1C6B3900AECCA2 /* libgpg-error.0.dylib in Resources */,
C465FC231C0D01B5001CCEE8 /* libgcrypt.20.dylib in Resources */,
C4D432D81BC2783C00561667 /* tg-server.tglpub in Resources */,
C438CE271A12BEAF00E1DA0F /* telegram.png in Resources */,
C4B4BE391AB613950064AC17 /* TelegramJoinChatView.xib in Resources */,
C4B4BE2E1AB392F80064AC17 /* TelegramAccountView.xib in Resources */,

View file

@ -35,68 +35,6 @@
#define STATE_FILE_MAGIC 0x28949a93
#define SECRET_CHAT_FILE_MAGIC 0x37a1988a
static gboolean read_ui32 (int fd, unsigned int *ret) {
typedef char check_int_size[(sizeof (int) >= 4) ? 1 : -1];
(void) sizeof (check_int_size);
unsigned char buf[4];
if (4 != read (fd, buf, 4)) {
return 0;
}
// Ugly but works.
*ret = 0;
*ret |= buf[0];
*ret <<= 8;
*ret |= buf[1];
*ret <<= 8;
*ret |= buf[2];
*ret <<= 8;
*ret |= buf[3];
return 1;
}
int read_pubkey_file (const char *name, struct rsa_pubkey *dst) {
// Just to make sure nobody reads garbage.
dst->e = 0;
dst->n_len = 0;
dst->n_raw = NULL;
int pubkey_fd = open (name, O_RDONLY | O_BINARY);
if (pubkey_fd < 0) {
return 0;
}
unsigned int e;
unsigned int n_len;
if (!read_ui32 (pubkey_fd, &e) || !read_ui32 (pubkey_fd, &n_len) // Ensure successful reads
|| n_len < 128 || n_len > 1024 || e < 5) { // Ensure (at least remotely) sane parameters.
close (pubkey_fd);
return 0;
}
unsigned char *n_raw = malloc (n_len);
if (!n_raw) {
close (pubkey_fd);
return 0;
}
gint readret;
readret = read (pubkey_fd, n_raw, n_len);
if (readret <= 0 || (n_len != (guint) readret)) {
free (n_raw);
close (pubkey_fd);
return 0;
}
close (pubkey_fd);
dst->e = e;
dst->n_len = n_len;
dst->n_raw = n_raw;
info ("read pubkey file: n_len=%u e=%u", n_len, e);
return 1;
}
void read_state_file (struct tgl_state *TLS) {
char *name = 0;
name = g_strdup_printf("%s/%s", TLS->base_path, "state");
@ -174,8 +112,14 @@ void write_files_schedule (struct tgl_state *TLS) {
}
}
struct write_dc_extra {
int auth_file;
int flags;
};
void write_dc (struct tgl_dc *DC, void *extra) {
int auth_file_fd = *(int *)extra;
struct write_dc_extra *ex = extra;
int auth_file_fd = ex->auth_file;
if (!DC) {
int x = 0;
assert (write (auth_file_fd, &x, 4) == 4);
@ -187,15 +131,16 @@ void write_dc (struct tgl_dc *DC, void *extra) {
assert (DC->flags & TGLDCF_LOGGED_IN);
assert (write (auth_file_fd, &DC->options[0]->port, 4) == 4);
int l = strlen (DC->options[0]->ip);
assert (write (auth_file_fd, &DC->options[ex->flags]->port, 4) == 4);
int l = strlen (DC->options[ex->flags]->ip);
assert (write (auth_file_fd, &l, 4) == 4);
assert (write (auth_file_fd, DC->options[0]->ip, l) == l);
assert (write (auth_file_fd, DC->options[ex->flags]->ip, l) == l);
assert (write (auth_file_fd, &DC->auth_key_id, 8) == 8);
assert (write (auth_file_fd, DC->auth_key, 256) == 256);
}
void write_auth_file (struct tgl_state *TLS) {
struct write_dc_extra extra;
char *name = 0;
name = g_strdup_printf("%s/%s", TLS->base_path, "auth");
int auth_file_fd = open (name, O_CREAT | O_RDWR | O_BINARY, 0600);
@ -206,7 +151,10 @@ void write_auth_file (struct tgl_state *TLS) {
assert (write (auth_file_fd, &TLS->max_dc_num, 4) == 4);
assert (write (auth_file_fd, &TLS->dc_working_num, 4) == 4);
tgl_dc_iterator_ex (TLS, write_dc, &auth_file_fd);
extra.auth_file = auth_file_fd;
extra.flags = TLS->ipv6_enabled ? 1 : 0;
tgl_dc_iterator_ex (TLS, write_dc, &extra);
assert (write (auth_file_fd, &TLS->our_id, 4) == 4);
close (auth_file_fd);
@ -228,7 +176,7 @@ void read_dc (struct tgl_state *TLS, int auth_file_fd, int id, unsigned ver) {
assert (read (auth_file_fd, &auth_key_id, 8) == 8);
assert (read (auth_file_fd, auth_key, 256) == 256);
bl_do_dc_option (TLS, 0, id, "DC", 2, ip, l, port);
bl_do_dc_option (TLS, TLS->ipv6_enabled ? 1: 0, id, "DC", 2, ip, l, port);
bl_do_set_auth_key (TLS, id, auth_key);
bl_do_dc_signed (TLS, id);
debug ("read dc: id=%d", id);
@ -252,11 +200,19 @@ void empty_auth_file (struct tgl_state *TLS) {
bl_do_dc_option (TLS, 0, 3, "", 0, TG_SERVER_TEST_3, strlen (TG_SERVER_TEST_3), 443);
bl_do_set_working_dc (TLS, TG_SERVER_TEST_DEFAULT);
} else {
bl_do_dc_option (TLS, 0, 1, "", 0, TG_SERVER_1, strlen (TG_SERVER_1), 443);
bl_do_dc_option (TLS, 0, 2, "", 0, TG_SERVER_2, strlen (TG_SERVER_2), 443);
bl_do_dc_option (TLS, 0, 3, "", 0, TG_SERVER_3, strlen (TG_SERVER_3), 443);
bl_do_dc_option (TLS, 0, 4, "", 0, TG_SERVER_4, strlen (TG_SERVER_4), 443);
bl_do_dc_option (TLS, 0, 5, "", 0, TG_SERVER_5, strlen (TG_SERVER_5), 443);
if (TLS->ipv6_enabled) {
bl_do_dc_option (TLS, 1, 1, "", 0, TG_SERVER_IPV6_1, strlen (TG_SERVER_IPV6_1), 443);
bl_do_dc_option (TLS, 1, 2, "", 0, TG_SERVER_IPV6_2, strlen (TG_SERVER_IPV6_2), 443);
bl_do_dc_option (TLS, 1, 3, "", 0, TG_SERVER_IPV6_3, strlen (TG_SERVER_IPV6_3), 443);
bl_do_dc_option (TLS, 1, 4, "", 0, TG_SERVER_IPV6_4, strlen (TG_SERVER_IPV6_4), 443);
bl_do_dc_option (TLS, 1, 5, "", 0, TG_SERVER_IPV6_5, strlen (TG_SERVER_IPV6_5), 443);
} else {
bl_do_dc_option (TLS, 0, 1, "", 0, TG_SERVER_1, strlen (TG_SERVER_1), 443);
bl_do_dc_option (TLS, 0, 2, "", 0, TG_SERVER_2, strlen (TG_SERVER_2), 443);
bl_do_dc_option (TLS, 0, 3, "", 0, TG_SERVER_3, strlen (TG_SERVER_3), 443);
bl_do_dc_option (TLS, 0, 4, "", 0, TG_SERVER_4, strlen (TG_SERVER_4), 443);
bl_do_dc_option (TLS, 0, 5, "", 0, TG_SERVER_5, strlen (TG_SERVER_5), 443);
}
bl_do_set_working_dc (TLS, TG_SERVER_DEFAULT);
}
}
@ -440,20 +396,6 @@ gchar *get_config_dir (char const *username) {
return dir;
}
gchar *get_user_pk_path () {
/*
This can't be conditional on whether or not we're using telepathy, because
then we would need to make sure that `make local_install` also knows about
that location. So we *always* use ${HOME}/.purple/telegram-purple,
even when the other files aren't in this folder.
Note that this is only visible when using Telepathy/Empathy with
local_install, which should be kinda rare anyway (use telepathy-morse!).
*/
return g_strconcat (g_get_home_dir(), G_DIR_SEPARATOR_S, ".purple",
G_DIR_SEPARATOR_S, "telegram-purple",
G_DIR_SEPARATOR_S, user_pk_filename, NULL);
}
gchar *get_download_dir (struct tgl_state *TLS) {
assert (TLS->base_path);
static gchar *dir;

View file

@ -22,14 +22,6 @@
#include "telegram-purple.h"
struct rsa_pubkey {
unsigned int e;
unsigned int n_len;
unsigned char *n_raw;
};
gboolean read_pubkey_file (const char *name, struct rsa_pubkey *dst);
void read_state_file (struct tgl_state *TLS);
void read_auth_file (struct tgl_state *TLS);
void write_auth_file (struct tgl_state *TLS);
@ -40,7 +32,6 @@ void write_secret_chat_file (struct tgl_state *TLS);
void write_secret_chat_gw (struct tgl_state *TLS, void *extra, int success, struct tgl_secret_chat *E);
gchar *get_config_dir (char const *username);
gchar *get_user_pk_path ();
gchar *get_download_dir (struct tgl_state *TLS);
int tgp_visualize_key (struct tgl_state *TLS, unsigned char* sha1_key);

View file

@ -18,6 +18,8 @@
Copyright Matthias Jentsch, Vitaly Valtman, Ben Wiederhake, Christopher Althaus 2014-2015
*/
#include <mtproto-key.h>
#include "telegram-purple.h"
#include "commit.h"
@ -37,12 +39,6 @@ static void update_secret_chat_handler (struct tgl_state *TLS, struct tgl_secret
static void update_on_failed_login (struct tgl_state *TLS);
const char *config_dir = "telegram-purple";
const char *user_pk_filename = "server.tglpub";
#ifdef WIN32
const char *pk_path = "server.tglpub";
#else
const char *pk_path = "/etc/telegram-purple/server.tglpub";
#endif
struct tgl_update_callback tgp_callback = {
.new_msg = update_message_handler,
@ -187,7 +183,7 @@ static void update_secret_chat_handler (struct tgl_state *TLS, struct tgl_secret
}
if (flags & TGL_UPDATE_REQUESTED) {
const char* choice = purple_account_get_string (tls_get_pa (TLS), "accept-secret-chats", "ask");
const char* choice = purple_account_get_string (tls_get_pa (TLS), TGP_KEY_ACCEPT_SECRET_CHATS, "ask");
if (! strcmp (choice, "always")) {
tgl_do_accept_encr_chat_request (TLS, U, write_secret_chat_gw, 0);
} else if (! strcmp (choice, "ask")) {
@ -236,6 +232,8 @@ static void update_marked_read (struct tgl_state *TLS, int num, struct tgl_messa
static void on_get_dialog_list_done (struct tgl_state *TLS, void *extra, int success, int size,
tgl_peer_id_t peers[], tgl_message_id_t *last_msg_id[], int unread_count[]) {
info ("Fetched dialogue list of size: %d", size);
connection_data *conn = tls_get_data(TLS);
if (tgp_error_if_false (TLS, success, "Fetching dialogue list failed", TLS->error)) {
return;
}
@ -259,7 +257,12 @@ static void on_get_dialog_list_done (struct tgl_state *TLS, void *extra, int suc
}
}
// now that the dialogue list is loaded, handle all pending chat joins
// handle pending roomlist request
if (conn->roomlist != NULL && purple_roomlist_get_in_progress (conn->roomlist)) {
tgp_chat_roomlist_populate (TLS);
}
// handle all pending chat joins
tls_get_data (TLS)->dialogues_ready = TRUE;
tgp_chat_join_all_pending (TLS);
}
@ -541,46 +544,9 @@ static void tgprpl_login (PurpleAccount * acct) {
tgl_set_download_directory (TLS, get_download_dir(TLS));
debug ("base configuration path: '%s'", TLS->base_path);
struct rsa_pubkey pubkey;
#ifdef WIN32
gchar *global_pk_path = g_strdup_printf("%s/%s", DATADIR, pk_path);
#else
gchar *global_pk_path = g_strdup(pk_path);
#endif
debug ("trying global pubkey at %s", global_pk_path);
gboolean global_pk_loaded = read_pubkey_file (global_pk_path, &pubkey);
g_free(global_pk_path);
tgl_set_verbosity (TLS, 4);
if (global_pk_loaded) {
info ("using global pubkey");
tgl_set_rsa_key_direct (TLS, pubkey.e, pubkey.n_len, pubkey.n_raw);
} else {
char *user_pk_path = get_user_pk_path ();
debug ("trying local pubkey at %s", user_pk_path);
gboolean user_pk_loaded = read_pubkey_file (user_pk_path, &pubkey);
if (user_pk_loaded) {
info ("using local pubkey");
tgl_set_rsa_key_direct (TLS, pubkey.e, pubkey.n_len, pubkey.n_raw);
} else {
failure ("both didn't work. abort.");
char *cause = g_strdup_printf (_("Unable to sign on as %s: file (public key) not found."),
purple_account_get_username (acct));
purple_connection_error_reason (gc, PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, cause);
char *long_hint = g_strdup_printf (
_("Make sure telegram-purple is installed properly,\n"
"including the .tglpub file.\n"
"If you're running SELinux (e.g. when using Tails),\n"
"try 'make local_install', or simply copy\n"
"%1$s to %2$s."), pk_path, user_pk_path);
purple_notify_message (_telegram_protocol, PURPLE_NOTIFY_MSG_ERROR, cause,
long_hint, NULL, NULL, NULL);
g_free (cause);
g_free (long_hint);
return;
}
}
tgl_set_rsa_key_direct (TLS, tglmp_get_default_e(),
tglmp_get_default_key_len(),
tglmp_get_default_key());
tgl_set_ev_base (TLS, conn);
tgl_set_net_methods (TLS, &tgp_conn_methods);
@ -601,6 +567,9 @@ static void tgprpl_login (PurpleAccount * acct) {
return;
}
if (purple_account_get_bool (acct, TGP_KEY_USE_IPV6, FALSE))
tgl_enable_ipv6(TLS);
if (! tgp_startswith (purple_account_get_username (acct), "+")) {
// TRANSLATORS: Please fill in your own prefix!
char *cause = g_strdup_printf (_("Unable to sign on as %s: phone number lacks country prefix."
@ -860,15 +829,18 @@ static void tgprpl_init (PurplePlugin *plugin) {
prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, opt);
// Messaging
GList *verification_values = NULL;
ADD_VALUE(verification_values, _("always"), "always");
ADD_VALUE(verification_values, _("never"), "never");
ADD_VALUE(verification_values, _("ask"), "ask");
GList *choices = NULL;
// Whether to do fallback SMS verification
ADD_VALUE(choices, _("Always"), "always");
// Whether to do fallback SMS verification
ADD_VALUE(choices, _("Never"), "never");
// Whether to do fallback SMS verification
ADD_VALUE(choices, _("Ask"), "ask");
opt = purple_account_option_list_new (_("Accept secret chats"),
TGP_KEY_ACCEPT_SECRET_CHATS, verification_values);
TGP_KEY_ACCEPT_SECRET_CHATS, choices);
prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, opt);
opt = purple_account_option_int_new (_("Display buddies offline after (days)"),
TGP_KEY_INACTIVE_DAYS_OFFLINE, TGP_DEFAULT_INACTIVE_DAYS_OFFLINE);
prpl_info.protocol_options = g_list_append (prpl_info.protocol_options, opt);
@ -876,26 +848,42 @@ static void tgprpl_init (PurplePlugin *plugin) {
opt = purple_account_option_int_new (_("Don't fetch history older than (days)\n(0 for unlimited)"),
TGP_KEY_HISTORY_RETRIEVAL_THRESHOLD, TGP_DEFAULT_HISTORY_RETRIEVAL_THRESHOLD);
prpl_info.protocol_options = g_list_append (prpl_info.protocol_options, opt);
// Media
opt = purple_account_option_int_new (_("Autoload media size (kb)"), TGP_KEY_MEDIA_SIZE,
TGP_DEFAULT_MEDIA_SIZE);
// Media and documents
choices = NULL;
// How to handle "large" files
ADD_VALUE(choices, _("Discard"), "discard");
// How to handle "large" files
ADD_VALUE(choices, _("Auto load"), "autoload");
// How to handle "large" files
ADD_VALUE(choices, _("Ask"), "ask");
opt = purple_account_option_int_new (_("Auto load file transfers up to (kb)"), TGP_KEY_MEDIA_SIZE,
TGP_DEFAULT_MEDIA_SIZE);
prpl_info.protocol_options = g_list_append (prpl_info.protocol_options, opt);
opt = purple_account_option_list_new (_("Bigger file transfers"), TGP_KEY_FT_HANDLING, choices);
prpl_info.protocol_options = g_list_append (prpl_info.protocol_options, opt);
// Chats
opt = purple_account_option_bool_new (_("Add all group chats to buddy list"),
TGP_KEY_JOIN_GROUP_CHATS, TGP_DEFAULT_JOIN_GROUP_CHATS);
prpl_info.protocol_options = g_list_append (prpl_info.protocol_options, opt);
// Read notifications
// Receipts
opt = purple_account_option_bool_new (_("Display notices of receipt"),
TGP_KEY_DISPLAY_READ_NOTIFICATIONS, TGP_DEFAULT_DISPLAY_READ_NOTIFICATIONS);
prpl_info.protocol_options = g_list_append (prpl_info.protocol_options, opt);
opt = purple_account_option_bool_new (_("Send notices of receipt when present"),
TGP_KEY_SEND_READ_NOTIFICATIONS, TGP_DEFAULT_SEND_READ_NOTIFICATIONS);
prpl_info.protocol_options = g_list_append (prpl_info.protocol_options, opt);
// IPv6
opt = purple_account_option_bool_new (_("Use IPv6 for connecting"),
TGP_KEY_USE_IPV6, TGP_DEFAULT_USE_IPV6);
prpl_info.protocol_options = g_list_append (prpl_info.protocol_options, opt);
_telegram_protocol = plugin;
debug ("tgprpl_init finished: This is " PACKAGE_VERSION "+g" GIT_COMMIT " on libtgl " TGL_VERSION);
}

View file

@ -67,6 +67,9 @@
#define TGP_MAX_MSG_SIZE 4096
#define TGP_DEFAULT_MAX_MSG_SPLIT_COUNT 4
#define TGP_DEFAULT_FT_HANDLING "ask"
#define TGP_KEY_FT_HANDLING "media-handling-behavior"
#define TGP_DEFAULT_MEDIA_SIZE 32768
#define TGP_KEY_MEDIA_SIZE "media-size-threshold"
@ -93,6 +96,9 @@
#define TGP_DEFAULT_CHANNEL_MEMBERS 500
#define TGP_KEY_CHANNEL_MEMBERS "channel-member-count"
#define TGP_DEFAULT_USE_IPV6 FALSE
#define TGP_KEY_USE_IPV6 "ipv6"
#define TGP_KEY_RESET_AUTH "reset-authorization"
#define TGP_CHANNEL_HISTORY_LIMIT 500

View file

@ -92,19 +92,19 @@ Section "MainSection" SEC01
SetOutPath "$PidginDir\locale"
File /nonfatal "/oname=bg\LC_MESSAGES\telegram-purple.mo" "po\bg.mo"
File /nonfatal "/oname=de_DE\LC_MESSAGES\telegram-purple.mo" "po\de_DE.mo"
File /nonfatal "/oname=cs\LC_MESSAGES\telegram-purple.mo" "po\cs.mo"
File /nonfatal "/oname=de\LC_MESSAGES\telegram-purple.mo" "po\de.mo"
File /nonfatal "/oname=es\LC_MESSAGES\telegram-purple.mo" "po\es.mo"
File /nonfatal "/oname=es_AR\LC_MESSAGES\telegram-purple.mo" "po\es_AR.mo"
File /nonfatal "/oname=fr\LC_MESSAGES\telegram-purple.mo" "po\fr.mo"
File /nonfatal "/oname=it_IT\LC_MESSAGES\telegram-purple.mo" "po\it_IT.mo"
File /nonfatal "/oname=it\LC_MESSAGES\telegram-purple.mo" "po\it.mo"
File /nonfatal "/oname=nl\LC_MESSAGES\telegram-purple.mo" "po\nl.mo"
File /nonfatal "/oname=pl_PL\LC_MESSAGES\telegram-purple.mo" "po\pl_PL.mo"
File /nonfatal "/oname=pt_BR\LC_MESSAGES\telegram-purple.mo" "po\pt_BR.mo"
File /nonfatal "/oname=pl\LC_MESSAGES\telegram-purple.mo" "po\pl.mo"
File /nonfatal "/oname=ru_RU\LC_MESSAGES\telegram-purple.mo" "po\ru_RU.mo"
File /nonfatal "/oname=sq\LC_MESSAGES\telegram-purple.mo" "po\sq.mo"
File /nonfatal "/oname=uk\LC_MESSAGES\telegram-purple.mo" "po\uk.mo"
SetOutPath "$PidginDir"
File "/oname=server.tglpub" "tg-server.tglpub"
File "${WIN32_DEV_TOP}\libgpg-error-1.12-2\bin\libgpg-error-0.dll"
File "${WIN32_DEV_TOP}\libgcrypt-1.6.3\bin\libgcrypt-20.dll"
File "${WIN32_DEV_TOP}\libwebp-0.4.3-1\bin\libwebp-5.dll"

View file

@ -94,7 +94,6 @@ Section "MainSection" SEC01
File /nonfatal "/oname=%\LC_MESSAGES\telegram-purple.mo" "po\%.mo"
SetOutPath "$PidginDir"
File "/oname=server.tglpub" "tg-server.tglpub"
File "${WIN32_DEV_TOP}\libgpg-error-1.12-2\bin\libgpg-error-0.dll"
File "${WIN32_DEV_TOP}\libgcrypt-1.6.3\bin\libgcrypt-20.dll"
File "${WIN32_DEV_TOP}\libwebp-0.4.3-1\bin\libwebp-5.dll"

View file

@ -16,6 +16,7 @@ ${PLUGIN_TESTS}: %: test/bin/% test/tmp/user
.PHONY: check
check: ${PLUGIN_TESTS} test/tmp/user
@echo "'make check' passed."
.PHONY: recheck
recheck: clean-test check

Binary file not shown.

2
tgl

@ -1 +1 @@
Subproject commit 3ce5b5d856e537fe4693a99c26b5d17f7200f674
Subproject commit 147af9250832a09567ba354b6f45b2ce17b8745a

View file

@ -36,11 +36,19 @@ connection_data *tls_get_data (struct tgl_state *TLS) {
return TLS->ev_base;
}
int tls_get_media_threshold (struct tgl_state *TLS) {
int tls_get_ft_threshold (struct tgl_state *TLS) {
return purple_account_get_int (tls_get_pa (TLS),
TGP_KEY_MEDIA_SIZE, TGP_DEFAULT_MEDIA_SIZE) << 10;
}
int tls_get_ft_autoload (struct tgl_state *TLS) {
return ! strcmp (purple_account_get_string (tls_get_pa (TLS), TGP_KEY_FT_HANDLING, TGP_DEFAULT_FT_HANDLING), "autoload");
}
int tls_get_ft_discard (struct tgl_state *TLS) {
return ! strcmp (purple_account_get_string (tls_get_pa (TLS), TGP_KEY_FT_HANDLING, TGP_DEFAULT_FT_HANDLING), "discard");
}
connection_data *gc_get_data (PurpleConnection *gc) {
return purple_connection_get_protocol_data (gc);
}

View file

@ -27,7 +27,9 @@
PurpleAccount *tls_get_pa (struct tgl_state *TLS);
PurpleConnection *tls_get_conn (struct tgl_state *TLS);
connection_data *tls_get_data (struct tgl_state *TLS);
int tls_get_media_threshold (struct tgl_state *TLS);
int tls_get_ft_threshold (struct tgl_state *TLS);
int tls_get_ft_discard (struct tgl_state *TLS);
int tls_get_ft_autoload (struct tgl_state *TLS);
connection_data *gc_get_data (PurpleConnection *gc);
connection_data *pa_get_data (PurpleAccount *pa);
connection_data *pbn_get_data (PurpleBlistNode *node);

View file

@ -285,7 +285,9 @@ void tgprpl_kick_from_chat (PurpleConnection *gc, int id, const char *who) {
g_return_if_fail(P != NULL);
tgl_peer_t *other_id = tgp_blist_lookup_peer_get (gc_get_tls (gc), who);
g_return_if_fail(P != NULL);
if (other_id == NULL) {
return;
}
tgl_do_del_user_from_chat (gc_get_tls (gc), P->id, other_id->id, tgp_notify_on_error_gw, NULL);
}
@ -400,7 +402,7 @@ char *tgprpl_get_chat_name (GHashTable * data) {
return g_strdup (g_hash_table_lookup (data, "subject"));
}
static void tgp_chat_roomlist_it (tgl_peer_t *P, void *extra) {
static void tgp_chat_roomlist_add (tgl_peer_t *P, void *extra) {
connection_data *conn = extra;
if ((tgl_get_peer_type (P->id) == TGL_PEER_CHAT || tgl_get_peer_type (P->id) == TGL_PEER_CHANNEL)
@ -422,6 +424,26 @@ static void tgp_chat_roomlist_it (tgl_peer_t *P, void *extra) {
}
}
void tgp_chat_roomlist_populate (struct tgl_state *TLS) {
connection_data *conn = tls_get_data (TLS);
g_return_if_fail(purple_roomlist_get_in_progress (conn->roomlist));
GList *fields = NULL;
PurpleRoomlistField *f = purple_roomlist_field_new (PURPLE_ROOMLIST_FIELD_STRING, "", "id", TRUE);
fields = g_list_append (fields, f);
f = purple_roomlist_field_new (PURPLE_ROOMLIST_FIELD_INT, _("Users in chat"), "users", FALSE);
fields = g_list_append (fields, f);
f = purple_roomlist_field_new (PURPLE_ROOMLIST_FIELD_STRING, _("Type"), "type", FALSE);
fields = g_list_append (fields, f);
purple_roomlist_set_fields (conn->roomlist, fields);
tgl_peer_iterator_ex (conn->TLS, tgp_chat_roomlist_add, conn);
purple_roomlist_set_in_progress (conn->roomlist, FALSE);
}
PurpleRoomlist *tgprpl_roomlist_get_list (PurpleConnection *gc) {
debug ("tgprpl_roomlist_get_list()");
connection_data *conn = gc_get_data (gc);
@ -429,21 +451,16 @@ PurpleRoomlist *tgprpl_roomlist_get_list (PurpleConnection *gc) {
if (conn->roomlist) {
purple_roomlist_unref (conn->roomlist);
}
conn->roomlist = purple_roomlist_new (purple_connection_get_account (gc));
GList *fields = NULL;
PurpleRoomlistField *f = purple_roomlist_field_new (PURPLE_ROOMLIST_FIELD_STRING, "", "id", TRUE);
fields = g_list_append (fields, f);
f = purple_roomlist_field_new (PURPLE_ROOMLIST_FIELD_INT, _("Users in chat"), "users", FALSE);
fields = g_list_append (fields, f);
f = purple_roomlist_field_new (PURPLE_ROOMLIST_FIELD_STRING, _("Type"), "type", FALSE);
fields = g_list_append (fields, f);
purple_roomlist_set_fields (conn->roomlist, fields);
tgl_peer_iterator_ex (conn->TLS, tgp_chat_roomlist_it, conn);
purple_roomlist_set_in_progress (conn->roomlist, TRUE);
// spectrum2 calls this function when the account is still connection
// all roomlists in progress are being initialised by tgp_on_ready
if (conn->dialogues_ready) {
tgp_chat_roomlist_populate (conn->TLS);
}
return conn->roomlist;
}

View file

@ -52,6 +52,7 @@ void tgprpl_chat_join (PurpleConnection *gc, GHashTable *data);
GList *tgprpl_chat_join_info (PurpleConnection *gc);
PurpleRoomlist *tgprpl_roomlist_get_list (PurpleConnection *gc);
void tgprpl_roomlist_cancel (PurpleRoomlist *list);
void tgp_chat_roomlist_populate (struct tgl_state *TLS);
GHashTable *tgprpl_chat_info_defaults (PurpleConnection *gc, const char *chat_name);
void tgp_chat_join_all_pending (struct tgl_state *TLS);
void tgprpl_kick_from_chat (PurpleConnection *gc, int id, const char *who);

150
tgp-msg.c
View file

@ -186,6 +186,26 @@ static char *format_geo_link_osm (double lat, double lon) {
return link;
}
static char *format_document (const char *path, const char *filename, const char* caption, const char *mime, long long size) {
gchar *format;
gchar *capt = g_markup_escape_text (caption, -1);
gchar *pth = g_markup_escape_text (path, -1);
gchar *fle = g_markup_escape_text (filename, -1);
gchar *mme = g_markup_escape_text (mime, -1);
gchar *fsize = g_format_size (size);
format = g_strdup_printf ("[%s <a href=\"file:///%s\">%s</a> %s %s]", capt, pth, fle, mme, fsize);
g_free (capt);
g_free (pth);
g_free (fle);
g_free (mme);
g_free (fsize);
return format;
}
static void tgp_msg_send_done (struct tgl_state *TLS, void *callback_extra, int success, struct tgl_message *M) {
if (! success) {
char *err = _("Sending message failed.");
@ -296,6 +316,16 @@ static char *tgp_msg_markdown_convert (const char *msg) {
int len = (int) strlen (msg);
char *html = g_new0(gchar, 3 * len);
// strip any known-breaking html tags
#define STRIP_BROKEN_HTML(PREFIX,SUFFIX) \
if (g_str_has_prefix (msg, (PREFIX)) && g_str_has_suffix (msg, (SUFFIX))) { \
msg += sizeof(PREFIX) - 1; \
len -= (sizeof(PREFIX) - 1) + (sizeof(SUFFIX) - 1); \
}
STRIP_BROKEN_HTML("<SPAN style=\"direction:rtl;text-align:right;\">","</SPAN>");
// more STRIP_BROKEN_HTML invocations here, if necessary
#undef STRIP_BROKEN_HTML
int open = FALSE;
int i, j;
for (i = 0, j = 0; i < len; i ++) {
@ -321,7 +351,6 @@ static char *tgp_msg_markdown_convert (const char *msg) {
}
int tgp_msg_send (struct tgl_state *TLS, const char *message, tgl_peer_id_t to) {
// send all inline images
GList *imgs = tgp_msg_imgs_parse (message);
debug ("parsed %d images in messages", g_list_length (imgs));
@ -376,15 +405,6 @@ int tgp_msg_send (struct tgl_state *TLS, const char *message, tgl_peer_id_t to)
return 0;
}
static char *tgp_msg_file_display (const char *path, const char *filename, const char* caption, const char *mime, long long size) {
gchar *fsize = g_format_size(size);
gchar *format;
format = g_strdup_printf ("[%s <a href=\"file:///%s\">%s</a> %s %s]", g_markup_escape_text (caption, -1), g_markup_escape_text (path, -1),
g_markup_escape_text (filename, -1), g_markup_escape_text (mime, -1), fsize);
g_free (fsize);
return format;
}
static char *tgp_msg_photo_display (struct tgl_state *TLS, const char *filename, int *flags) {
connection_data *conn = TLS->ev_base;
int img = p2tgl_imgstore_add_with_id (filename);
@ -490,55 +510,61 @@ static void tgp_msg_display (struct tgl_state *TLS, struct tgp_msg_loading *C) {
}
break;
}
case tgl_message_media_document:
case tgl_message_media_video:
case tgl_message_media_audio:
if (M->media.document->flags & TGLDF_STICKER) {
g_return_if_fail(C->data != NULL);
text = tgp_msg_sticker_display (TLS, M->from_id, C->data, &flags);
} else if (M->media.document->flags & TGLDF_ANIMATED) {
g_return_if_fail(C->data != NULL);
text = tgp_msg_file_display (C->data, M->media.document->caption, _("animation"),
M->media.document->mime_type, M->media.document->size);
} else if (M->media.document->flags & TGLDF_IMAGE) {
} else if (M->media.document->flags & TGLDF_IMAGE && !(M->media.document->flags & TGLDF_ANIMATED)) {
g_return_if_fail(C->data != NULL);
text = tgp_msg_photo_display (TLS, C->data, &flags);
} else {
if (! tgp_our_msg (TLS, M)) {
if (C->data) {
text = tgp_msg_file_display (C->data, M->media.document->caption, _("document"),
M->media.document->mime_type, M->media.document->size);
} else {
tgprpl_recv_file (tls_get_conn (TLS), tgp_blist_lookup_purple_name (TLS, M->from_id), M);
return;
// Automatically loaded files have C->data set to the file path
if (C->data) {
const char* path = C->data;
// Content of a file transfer
const char *caption = _("document");
if (M->media.document->flags & TGLDF_AUDIO) {
// Content of a file transfer
caption = _("audio");
} else if (M->media.document->flags & TGLDF_ANIMATED) {
// Content of a file transfer
caption = _("animation");
} else if (M->media.document->flags & TGLDF_VIDEO) {
// Content of a file transfer
caption = _("video");
}
const char *filename = M->media.document->caption;
if (! str_not_empty (filename)) {
// audio and video snippets recorded from Telegram don't have captions
const char *segment = path + strlen(path) - 1;
while (segment > (char *)path && *segment != G_DIR_SEPARATOR) {
segment --;
}
filename = segment + 1;
}
const char *mime = "";
if (str_not_empty (M->media.document->mime_type)) {
mime = M->media.document->mime_type;
}
text = format_document (path, filename, caption, mime, M->media.document->size);
} else {
if (! tgp_our_msg (TLS, M) && ! tls_get_ft_discard (TLS)) {
tgprpl_recv_file (tls_get_conn (TLS), tgp_blist_lookup_purple_name (TLS, M->from_id), M);
}
return;
}
}
break;
case tgl_message_media_video:
case tgl_message_media_audio: {
if (! tgp_our_msg (TLS, M)) {
if (C->data) {
const char *filename = C->data + strlen(C->data) - 1;
while (filename > (char *)C->data && *filename != G_DIR_SEPARATOR) {
filename --;
}
filename ++;
text = tgp_msg_file_display (C->data, filename,
M->media.type == tgl_message_media_audio ? _("audio") : _("video"),
M->media.document->mime_type, M->media.document->size);
} else {
tgprpl_recv_file (tls_get_conn (TLS), tgp_blist_lookup_purple_name (TLS, M->from_id), M);
return;
}
}
}
break;
case tgl_message_media_document_encr:
if (M->media.encr_document->flags & TGLDF_STICKER) {
g_return_if_fail(C->data != NULL);
@ -551,7 +577,8 @@ static void tgp_msg_display (struct tgl_state *TLS, struct tgp_msg_loading *C) {
} else {
if (! tgp_our_msg (TLS, M)) {
if (C->data) {
text = tgp_msg_file_display (C->data, M->media.encr_document->caption, _("document"),
// Content of a file transfer
text = format_document (C->data, M->media.encr_document->caption, _("document"),
M->media.encr_document->mime_type, M->media.encr_document->size);
} else {
@ -836,6 +863,7 @@ void tgp_msg_recv (struct tgl_state *TLS, struct tgl_message *M, GList *before)
}
if (! (M->flags & TGLMF_SERVICE)) {
debug ("service msg");
// handle all messages that need to load content before they can be displayed
if (M->media.type != tgl_message_media_none) {
@ -854,42 +882,34 @@ void tgp_msg_recv (struct tgl_state *TLS, struct tgl_message *M, GList *before)
// documents that are stickers or images will be displayed just like regular photo messages
// and need to be loaded beforehand
case tgl_message_media_document:
case tgl_message_media_video:
case tgl_message_media_audio:
if (M->media.document->flags & (TGLDF_STICKER | TGLDF_IMAGE)) {
++ C->pending;
tgl_do_load_document (TLS, M->media.document, tgp_msg_on_loaded_document, C);
} else {
// adium doesn't support file links, autoloading media would mean that it
// wouldn't be possible to show a usable link to the user
// adium doesn't support printing an inline file link to the downloaded file
#ifndef __ADIUM_
if (M->media.document->size <= tls_get_media_threshold (TLS)) {
if (M->media.document->size <= tls_get_ft_threshold (TLS) || tls_get_ft_autoload (TLS)) {
++ C->pending;
if (M->media.document->flags & TGLDF_AUDIO) {
tgl_do_load_audio (TLS, M->media.document, tgp_msg_on_loaded_document, C);
} else if (M->media.document->flags & TGLDF_VIDEO) {
tgl_do_load_video (TLS, M->media.document, tgp_msg_on_loaded_document, C);
} else {
tgl_do_load_document (TLS, M->media.document, tgp_msg_on_loaded_document, C);
}
}
#endif
}
break;
#ifndef __ADIUM_
case tgl_message_media_video:
if (M->media.document->size <= tls_get_media_threshold (TLS)) {
++ C->pending;
tgl_do_load_video (TLS, M->media.document, tgp_msg_on_loaded_document, C);
}
break;
case tgl_message_media_audio:
if (M->media.document->size <= tls_get_media_threshold (TLS)) {
++ C->pending;
tgl_do_load_audio (TLS, M->media.document, tgp_msg_on_loaded_document, C);
}
break;
#endif
}
break;
case tgl_message_media_document_encr:
if (M->media.encr_document->flags & TGLDF_STICKER || M->media.encr_document->flags & TGLDF_IMAGE) {