gajim.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2026
October
September
August
July
June
May
April
March
February
January
2025
December
November
October
September
August
July
June
May
April
March
February
January
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
December
November
October
September
August
July
June
May
April
March
February
January
2006
December
November
October
September
August
July
June
May
April
List overview
Download
Commits
September 2016
----- 2026 -----
October 2026
September 2026
August 2026
July 2026
June 2026
May 2026
April 2026
March 2026
February 2026
January 2026
----- 2025 -----
December 2025
November 2025
October 2025
September 2025
August 2025
July 2025
June 2025
May 2025
April 2025
March 2025
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
commits@gajim.org
1 participants
78 discussions
Start a n
N
ew thread
gajim: Merged...
by Gajim
06 Sep '16
06 Sep '16
changeset 73696744a9c0 in /home/hg/repos/gajim author: tmolitor <thilo(a)eightysoft.de> branches:
details:http://hg.gajim.org/gajim?cmd=changeset;node=73696744a9c0
description: Merged... diffstat: src/common/configpaths.py | 44 +++++++++++++++++++++++++++++++++----------- src/gajim.py | 17 +++++++++++------ 2 files changed, 44 insertions(+), 17 deletions(-) diffs (136 lines): diff -r 334cce896289 -r 73696744a9c0 src/common/configpaths.py --- a/src/common/configpaths.py Tue Sep 06 22:49:57 2016 +0200 +++ b/src/common/configpaths.py Tue Sep 06 23:08:09 2016 +0200 @@ -134,19 +134,22 @@ for key in self.paths.keys(): yield (key, self[key]) - def init(self, root=None, profile=''): + def init(self, root=None, profile='', profile_separation=False): if root is not None: self.config_root = self.cache_root = self.data_root = root - if len(profile) > 0: + self.init_profile(profile) + + if len(profile) > 0 and profile_separation: profile = u'.' + profile - + else: + profile = '' + d = {'LOG_DB': 'logs.db', 'MY_CACERTS': 'cacerts.pem', 'MY_EMOTS': 'emoticons', 'MY_ICONSETS': 'iconsets', 'MY_MOOD_ICONSETS': 'moods', 'MY_ACTIVITY_ICONSETS': 'activities', 'PLUGINS_USER': 'plugins', - 'RNG_SEED': 'rng_seed', - 'SECRETS_FILE': 'secrets', 'MY_PEER_CERTS': 'certs'} + 'RNG_SEED': 'rng_seed'} for name in d: d[name] += profile self.add(name, TYPE_DATA, windowsify(d[name])) @@ -156,8 +159,7 @@ self.add('MY_DATA', TYPE_DATA, '') d = {'CACHE_DB': 'cache.db', 'VCARD': 'vcards', - 'AVATAR': 'avatars', - 'PID_FILE': 'gajim.pid'} + 'AVATAR': 'avatars'} for name in d: d[name] += profile self.add(name, TYPE_CACHE, windowsify(d[name])) @@ -166,10 +168,6 @@ else: self.add('MY_CACHE', TYPE_CACHE, '') - d = {'CONFIG_FILE': 'config', 'PLUGINS_CONFIG_DIR': 'pluginsconfig', 'MY_CERT': 'localcerts'} - for name in d: - d[name] += profile - self.add(name, TYPE_CONFIG, windowsify(d[name])) if len(profile): self.add('MY_CONFIG', TYPE_CONFIG, 'config.dir') else: @@ -194,4 +192,28 @@ except (ImportError, AttributeError): pass + def init_profile(self, profile): + conffile = windowsify('config') + pidfile = windowsify('gajim') + secretsfile = windowsify('secrets') + pluginsconfdir = windowsify('pluginsconfig') + certsdir = windowsify(u'certs') + localcertsdir = windowsify(u'localcerts') + + if len(profile) > 0: + conffile += '.' + profile + pidfile += '.' + profile + secretsfile += '.' + profile + pluginsconfdir += '.' + profile + certsdir += u'.' + profile + localcertsdir += u'.' + profile + + pidfile += '.pid' + self.add('SECRETS_FILE', TYPE_DATA, secretsfile) + self.add('MY_PEER_CERTS', TYPE_DATA, certsdir) + self.add('PID_FILE', TYPE_CACHE, pidfile) + self.add('CONFIG_FILE', TYPE_CONFIG, conffile) + self.add('PLUGINS_CONFIG_DIR', TYPE_CONFIG, pluginsconfdir) + self.add('MY_CERT', TYPE_CONFIG, localcertsdir) + gajimpaths = ConfigPaths() diff -r 334cce896289 -r 73696744a9c0 src/gajim.py --- a/src/gajim.py Tue Sep 06 22:49:57 2016 +0200 +++ b/src/gajim.py Tue Sep 06 23:08:09 2016 +0200 @@ -130,11 +130,12 @@ def parseOpts(): profile_ = '' config_path_ = None - + profile_separation_ = False + try: - shortargs = 'hqvl:p:c:' + shortargs = 'hqsvl:p:c:' # add gtk/gnome session option as gtk_get_option_group is not wrapped - longargs = 'help quiet verbose loglevel= profile= config-path=' + longargs = 'help quiet separate verbose loglevel= profile= config-path=' longargs += ' class= name= screen= gtk-module= sync g-fatal-warnings' longargs += ' sm-client-id= sm-client-state-file= sm-disable' opts = getopt.getopt(sys.argv[1:], shortargs, longargs.split())[0] @@ -151,6 +152,8 @@ _('Show this help message and exit') + \ '\n -q, --quiet ' + \ _('Show only critical errors') + \ + '\n -s, --separate ' + \ + _('Separate profile files completely (even history db and plugins)') + \ '\n -v, --verbose ' + \ _('Print xml stanzas and other debug information') + \ '\n -p, --profile ' + \ @@ -163,6 +166,8 @@ sys.exit() elif o in ('-q', '--quiet'): logging_helpers.set_quiet() + elif o in ('-s', '--separate'): + profile_separation_ = True elif o in ('-v', '--verbose'): logging_helpers.set_verbose() elif o in ('-p', '--profile'): # gajim --profile name @@ -171,14 +176,14 @@ logging_helpers.set_loglevels(a) elif o in ('-c', '--config-path'): config_path_ = a - return profile_, config_path_ + return profile_, config_path_, profile_separation_ import locale -profile, config_path = parseOpts() +profile, config_path, profile_separation = parseOpts() del parseOpts import common.configpaths -common.configpaths.gajimpaths.init(config_path, profile) +common.configpaths.gajimpaths.init(config_path, profile, profile_separation) del config_path del profile
1
0
0
0
gajim: Make complete profile separation configurable via command...
by Gajim
06 Sep '16
06 Sep '16
changeset 55eefca1f745 in /home/hg/repos/gajim author: tmolitor <thilo(a)eightysoft.de> branches:
details:http://hg.gajim.org/gajim?cmd=changeset;node=55eefca1f745
description: Make complete profile separation configurable via commandline switch. Use -s or --separate to use the new complete profile separation or omit this switch to retain the old behaviour. diffstat: src/common/configpaths.py | 44 +++++++++++++++++++++++++++++++++----------- src/gajim.py | 17 +++++++++++------ 2 files changed, 44 insertions(+), 17 deletions(-) diffs (136 lines): diff -r f9e24a65652e -r 55eefca1f745 src/common/configpaths.py --- a/src/common/configpaths.py Tue Sep 06 21:48:41 2016 +0200 +++ b/src/common/configpaths.py Tue Sep 06 23:02:24 2016 +0200 @@ -134,19 +134,22 @@ for key in self.paths.keys(): yield (key, self[key]) - def init(self, root=None, profile=''): + def init(self, root=None, profile='', profile_separation=False): if root is not None: self.config_root = self.cache_root = self.data_root = root - if len(profile) > 0: + self.init_profile(profile) + + if len(profile) > 0 and profile_separation: profile = u'.' + profile - + else: + profile = '' + d = {'LOG_DB': 'logs.db', 'MY_CACERTS': 'cacerts.pem', 'MY_EMOTS': 'emoticons', 'MY_ICONSETS': 'iconsets', 'MY_MOOD_ICONSETS': 'moods', 'MY_ACTIVITY_ICONSETS': 'activities', 'PLUGINS_USER': 'plugins', - 'RNG_SEED': 'rng_seed', - 'SECRETS_FILE': 'secrets', 'MY_PEER_CERTS': 'certs'} + 'RNG_SEED': 'rng_seed'} for name in d: d[name] += profile self.add(name, TYPE_DATA, windowsify(d[name])) @@ -156,8 +159,7 @@ self.add('MY_DATA', TYPE_DATA, '') d = {'CACHE_DB': 'cache.db', 'VCARD': 'vcards', - 'AVATAR': 'avatars', - 'PID_FILE': 'gajim.pid'} + 'AVATAR': 'avatars'} for name in d: d[name] += profile self.add(name, TYPE_CACHE, windowsify(d[name])) @@ -166,10 +168,6 @@ else: self.add('MY_CACHE', TYPE_CACHE, '') - d = {'CONFIG_FILE': 'config', 'PLUGINS_CONFIG_DIR': 'pluginsconfig', 'MY_CERT': 'localcerts'} - for name in d: - d[name] += profile - self.add(name, TYPE_CONFIG, windowsify(d[name])) if len(profile): self.add('MY_CONFIG', TYPE_CONFIG, 'config.dir') else: @@ -194,4 +192,28 @@ except (ImportError, AttributeError): pass + def init_profile(self, profile): + conffile = windowsify('config') + pidfile = windowsify('gajim') + secretsfile = windowsify('secrets') + pluginsconfdir = windowsify('pluginsconfig') + certsdir = windowsify(u'certs') + localcertsdir = windowsify(u'localcerts') + + if len(profile) > 0: + conffile += '.' + profile + pidfile += '.' + profile + secretsfile += '.' + profile + pluginsconfdir += '.' + profile + certsdir += u'.' + profile + localcertsdir += u'.' + profile + + pidfile += '.pid' + self.add('SECRETS_FILE', TYPE_DATA, secretsfile) + self.add('MY_PEER_CERTS', TYPE_DATA, certsdir) + self.add('PID_FILE', TYPE_CACHE, pidfile) + self.add('CONFIG_FILE', TYPE_CONFIG, conffile) + self.add('PLUGINS_CONFIG_DIR', TYPE_CONFIG, pluginsconfdir) + self.add('MY_CERT', TYPE_CONFIG, localcertsdir) + gajimpaths = ConfigPaths() diff -r f9e24a65652e -r 55eefca1f745 src/gajim.py --- a/src/gajim.py Tue Sep 06 21:48:41 2016 +0200 +++ b/src/gajim.py Tue Sep 06 23:02:24 2016 +0200 @@ -130,11 +130,12 @@ def parseOpts(): profile_ = '' config_path_ = None - + profile_separation_ = False + try: - shortargs = 'hqvl:p:c:' + shortargs = 'hqsvl:p:c:' # add gtk/gnome session option as gtk_get_option_group is not wrapped - longargs = 'help quiet verbose loglevel= profile= config-path=' + longargs = 'help quiet separate verbose loglevel= profile= config-path=' longargs += ' class= name= screen= gtk-module= sync g-fatal-warnings' longargs += ' sm-client-id= sm-client-state-file= sm-disable' opts = getopt.getopt(sys.argv[1:], shortargs, longargs.split())[0] @@ -151,6 +152,8 @@ _('Show this help message and exit') + \ '\n -q, --quiet ' + \ _('Show only critical errors') + \ + '\n -s, --separate ' + \ + _('Separate profile files completely (even history db and plugins)') + \ '\n -v, --verbose ' + \ _('Print xml stanzas and other debug information') + \ '\n -p, --profile ' + \ @@ -163,6 +166,8 @@ sys.exit() elif o in ('-q', '--quiet'): logging_helpers.set_quiet() + elif o in ('-s', '--separate'): + profile_separation_ = True elif o in ('-v', '--verbose'): logging_helpers.set_verbose() elif o in ('-p', '--profile'): # gajim --profile name @@ -171,14 +176,14 @@ logging_helpers.set_loglevels(a) elif o in ('-c', '--config-path'): config_path_ = a - return profile_, config_path_ + return profile_, config_path_, profile_separation_ import locale -profile, config_path = parseOpts() +profile, config_path, profile_separation = parseOpts() del parseOpts import common.configpaths -common.configpaths.gajimpaths.init(config_path, profile) +common.configpaths.gajimpaths.init(config_path, profile, profile_separation) del config_path del profile
1
0
0
0
gajim: fix Gajim version comparison for plugins. Fixes #8389
by Gajim
06 Sep '16
06 Sep '16
changeset 334cce896289 in /home/hg/repos/gajim author: Yann Leboulanger <asterix(a)lagaule.org> branches:
details:http://hg.gajim.org/gajim?cmd=changeset;node=334cce896289
description: fix Gajim version comparison for plugins. Fixes #8389 diffstat: src/plugins/pluginmanager.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diffs (12 lines): diff -r f9e24a65652e -r 334cce896289 src/plugins/pluginmanager.py --- a/src/plugins/pluginmanager.py Tue Sep 06 21:48:41 2016 +0200 +++ b/src/plugins/pluginmanager.py Tue Sep 06 22:49:57 2016 +0200 @@ -454,7 +454,7 @@ min_v = conf.get('info', 'min_gajim_version', fallback=None) max_v = conf.get('info', 'max_gajim_version', fallback=None) - gajim_v = gajim.config.get('version') + gajim_v = gajim.config.get('version').split('-', 1)[0] gajim_v_cmp = parse_version(gajim_v) if min_v and gajim_v_cmp < parse_version(min_v):
1
0
0
0
gajim: correctly update database schema
by Gajim
06 Sep '16
06 Sep '16
changeset f9e24a65652e in /home/hg/repos/gajim author: Yann Leboulanger <asterix(a)lagaule.org> branches:
details:http://hg.gajim.org/gajim?cmd=changeset;node=f9e24a65652e
description: correctly update database schema diffstat: src/common/defs.py | 2 +- src/common/optparser.py | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diffs (47 lines): diff -r ed67ab06dcca -r f9e24a65652e src/common/defs.py --- a/src/common/defs.py Tue Sep 06 16:19:44 2016 +0200 +++ b/src/common/defs.py Tue Sep 06 21:48:41 2016 +0200 @@ -27,7 +27,7 @@ basedir = '../' localedir = '../po' -version = '0.16.10.1' +version = '0.16.10.2' import subprocess try: node = subprocess.Popen('hg tip --template "{node|short}"', shell=True, diff -r ed67ab06dcca -r f9e24a65652e src/common/optparser.py --- a/src/common/optparser.py Tue Sep 06 16:19:44 2016 +0200 +++ b/src/common/optparser.py Tue Sep 06 21:48:41 2016 +0200 @@ -233,6 +233,8 @@ self.update_config_to_01641() if old < [0, 16, 10, 1] and new >= [0, 16, 10, 1]: self.update_config_to_016101() + if old < [0, 16, 10, 2] and new >= [0, 16, 10, 2]: + self.update_config_to_016102() gajim.logger.init_vars() gajim.logger.attach_cache_database() @@ -945,10 +947,12 @@ gajim.config.set('video_input_device', 'autovideosrc') if self.old_values['video_input_device'] == 'videotestsrc is-live=true ! video/x-raw-yuv,framerate=10/1': gajim.config.set('video_input_device', 'videotestsrc is-live=true ! video/x-raw,framerate=10/1') - + gajim.config.set('version', '0.16.10.1') + + def update_config_to_016102(self): for account in self.old_values['accounts'].keys(): gajim.config.del_per('accounts', account, 'minimized_gc') - + back = os.getcwd() os.chdir(logger.LOG_DB_FOLDER) con = sqlite.connect(logger.LOG_DB_FILE) @@ -964,5 +968,5 @@ except sqlite.OperationalError: pass con.close() - - gajim.config.set('version', '0.16.10.1') + + gajim.config.set('version', '0.16.10.2')
1
0
0
0
gajim: Remove ternary operator, fixes #8388
by Gajim
06 Sep '16
06 Sep '16
changeset ed67ab06dcca in /home/hg/repos/gajim author: tmolitor <thilo(a)eightysoft.de> branches:
details:http://hg.gajim.org/gajim?cmd=changeset;node=ed67ab06dcca
description: Remove ternary operator, fixes #8388 diffstat: src/common/configpaths.py | 15 ++++++++++++--- 1 files changed, 12 insertions(+), 3 deletions(-) diffs (37 lines): diff -r 5a9f890059c2 -r ed67ab06dcca src/common/configpaths.py --- a/src/common/configpaths.py Mon Sep 05 23:58:59 2016 +0200 +++ b/src/common/configpaths.py Tue Sep 06 16:19:44 2016 +0200 @@ -150,7 +150,10 @@ for name in d: d[name] += profile self.add(name, TYPE_DATA, windowsify(d[name])) - self.add('MY_DATA', TYPE_DATA, len(profile) ? 'data.dir' + profile : '') + if len(profile): + self.add('MY_DATA', TYPE_DATA, 'data.dir') + else: + self.add('MY_DATA', TYPE_DATA, '') d = {'CACHE_DB': 'cache.db', 'VCARD': 'vcards', 'AVATAR': 'avatars', @@ -158,13 +161,19 @@ for name in d: d[name] += profile self.add(name, TYPE_CACHE, windowsify(d[name])) - self.add('MY_CACHE', TYPE_CACHE, len(profile) ? 'cache.dir' + profile : '') + if len(profile): + self.add('MY_CACHE', TYPE_CACHE, 'cache.dir') + else: + self.add('MY_CACHE', TYPE_CACHE, '') d = {'CONFIG_FILE': 'config', 'PLUGINS_CONFIG_DIR': 'pluginsconfig', 'MY_CERT': 'localcerts'} for name in d: d[name] += profile self.add(name, TYPE_CONFIG, windowsify(d[name])) - self.add('MY_CONFIG', TYPE_CONFIG, len(profile) ? 'config.dir' + profile : '') + if len(profile): + self.add('MY_CONFIG', TYPE_CONFIG, 'config.dir') + else: + self.add('MY_CONFIG', TYPE_CONFIG, '') basedir = fse(os.environ.get('GAJIM_BASEDIR', defs.basedir)) self.add('DATA', None, os.path.join(basedir, windowsify('data')))
1
0
0
0
gajim-plugins: Add file storing to harddisk and thumbnail cache
by Gajim Plugins
05 Sep '16
05 Sep '16
changeset 2e06b12f3938 in /home/hg/repos/gajim-plugins author: lovetox <forenjunkie(a)chelo.at> branches: details:gajim-plugins?cmd=changeset;node=2e06b12f3938 description: Add file storing to harddisk and thumbnail cache diffstat: url_image_preview/manifest.ini | 2 +- url_image_preview/url_image_preview.py | 392 ++++++++++++++++++++------------ 2 files changed, 241 insertions(+), 153 deletions(-) diffs (truncated from 651 to 300 lines): diff -r 1938ce0462db -r 2e06b12f3938 url_image_preview/manifest.ini --- a/url_image_preview/manifest.ini Fri Sep 02 22:33:45 2016 +0200 +++ b/url_image_preview/manifest.ini Sun Sep 04 23:30:39 2016 +0200 @@ -1,7 +1,7 @@ [info] name: Url image preview short_name: url_image_preview -version: 0.7.5 +version: 0.8.0 description: Url image preview in chatbox.<br/> Based on patch in <a href="
http://trac.gajim.org/attachment/ticket/5300
">ticket #5300</a>. authors = Denis Fomin <fominde(a)gmail.com> diff -r 1938ce0462db -r 2e06b12f3938 url_image_preview/url_image_preview.py --- a/url_image_preview/url_image_preview.py Fri Sep 02 22:33:45 2016 +0200 +++ b/url_image_preview/url_image_preview.py Sun Sep 04 23:30:39 2016 +0200 @@ -4,7 +4,9 @@ import gobject import re import os +import sys import urllib2 +import hashlib from urlparse import urlparse import logging @@ -12,6 +14,7 @@ from common import gajim from common import ged from common import helpers +from common import configpaths from plugins import GajimPlugin from plugins.helpers import log_calls, log from plugins.gui import GajimPluginConfigDialog @@ -24,6 +27,12 @@ log = logging.getLogger('gajim.plugin_system.url_image_preview') +try: + from PIL import Image + pil_available = True +except: + pil_available = False + log.debug('PIL not available') try: if os.name == 'nt': @@ -53,13 +62,11 @@ self.gui_extension_points = { 'chat_control_base': (self.connect_with_chat_control, self.disconnect_from_chat_control), - 'print_special_text': (self.print_special_text, - self.print_special_text1), } + 'print_special_text': (self.print_special_text, None), } self.config_default_values = { 'PREVIEW_SIZE': (150, 'Preview size(10-512)'), 'MAX_FILE_SIZE': (524288, 'Max file size for image preview')} - self.chat_control = None - self.controls = [] + self.controls = {} # remove oob tag if oob url == message text def handle_message_received(self, event): @@ -69,37 +76,35 @@ if oob_node: oob_url = oob_node.getTagData('url') oob_desc = oob_node.getTagData('desc') - if oob_url and oob_url == event.msgtxt and (not oob_desc or oob_desc == ""): - log.debug("Detected oob tag containing same url as the message text, deleting oob tag...") + if oob_url and oob_url == event.msgtxt and \ + (not oob_desc or oob_desc == ""): + log.debug("Detected oob tag containing same" + "url as the message text, deleting oob tag...") event.stanza.delChild(oob_node) @log_calls('UrlImagePreviewPlugin') def connect_with_chat_control(self, chat_control): - - self.chat_control = chat_control - control = Base(self, self.chat_control) - self.controls.append(control) + account = chat_control.contact.account.name + jid = chat_control.contact.jid + if account not in self.controls: + self.controls[account] = {} + self.controls[account][jid] = Base(self, chat_control) @log_calls('UrlImagePreviewPlugin') def disconnect_from_chat_control(self, chat_control): - for control in self.controls: - control.disconnect_from_chat_control() - self.controls = [] + account = chat_control.contact.account.name + jid = chat_control.contact.jid + del self.controls[account][jid] def print_special_text(self, tv, special_text, other_tags, graphics=True, iter_=None): - for control in self.controls: - if control.chat_control.conv_textview != tv: + account = tv.account + for jid in self.controls[account]: + if self.controls[account][jid].chat_control.conv_textview != tv: continue - control.print_special_text(special_text, other_tags, graphics=True, - iter_=iter_) - - def print_special_text1(self, chat_control, special_text, other_tags=None, - graphics=True, iter_=None): - for control in self.controls: - if control.chat_control == chat_control: - control.disconnect_from_chat_control() - self.controls.remove(control) + self.controls[account][jid].print_special_text( + special_text, other_tags, graphics=True, iter_=iter_) + return class Base(object): @@ -112,6 +117,15 @@ else: self.backend = default_backend() + self.directory = os.path.join(configpaths.gajimpaths['MY_CACHE'], + 'downloads') + self.thumbpath = os.path.join(self.directory, 'thumb') + + try: + self.create_path(self.thumbpath) + except Exception as e: + log.debug(e) + def print_special_text(self, special_text, other_tags, graphics=True, iter_=None): # remove qip bbcode @@ -122,9 +136,9 @@ if special_text.startswith('ftp.'): special_text = 'ftp://' + special_text - parts = urlparse(special_text) - if parts.scheme not in ["https", "http", "ftp", "ftps"] or \ - not parts.netloc: + urlparts = urlparse(special_text) + if urlparts.scheme not in ["https", "http", "ftp", "ftps"] or \ + not urlparts.netloc: log.info("Not accepting URL for image preview: %s" % special_text) return @@ -132,96 +146,113 @@ if not iter_: iter_ = buffer_.get_end_iter() - # Detect XHTML-IM link + # Show URL, until image is loaded (if ever) ttt = buffer_.get_tag_table() - tags_ = [(ttt.lookup(t) if isinstance(t, str) else t) for t in other_tags] - for t in tags_: - is_xhtml_link = getattr(t, 'href', None) - if is_xhtml_link: - break - - # Show URL, until image is loaded (if ever) repl_start = buffer_.create_mark(None, iter_, True) - buffer_.insert_with_tags(iter_, special_text, \ + buffer_.insert_with_tags(iter_, special_text, *[(ttt.lookup(t) if isinstance(t, str) else t) for t in ["url"]]) repl_end = buffer_.create_mark(None, iter_, True) - # First get the http head request with does not fetch data, just headers - gajim.thread_interface(self._get_http_head, [self.textview.account, - special_text], self._check_mime_size, [special_text, repl_start, repl_end]) + filename = os.path.basename(urlparts.path) + ext = os.path.splitext(filename)[1] + name = os.path.splitext(filename)[0] + namehash = hashlib.sha1(special_text).hexdigest() + newfilename = name + '_' + namehash + ext + thumbfilename = name + '_' + namehash + '_thumb' + ext + + filepath = os.path.join(self.directory, newfilename) + thumbpath = os.path.join(self.thumbpath, thumbfilename) + filepaths = [filepath, thumbpath] + + if os.path.exists(filepath): + def open_file(): + with open(filepath, 'rb') as f: + mem = f.read() + f.closed + log.debug('File from disk') + return (mem, '') + + if pil_available: + if not os.path.exists(thumbpath): + self.save_thumbnail(filepaths) + tup = (True, '') + gajim.thread_interface(self._update_img, + [tup, special_text, repl_start, + repl_end, filepaths]) + else: + gajim.thread_interface( + open_file, [], + self._update_img, [special_text, repl_start, + repl_end, filepaths]) + + else: + key = '' + iv = '' + encrypted = False + if len(urlparts.fragment): + fragment = [] + for i in range(0, len(urlparts.fragment), 2): + fragment.append(chr(int(urlparts.fragment[i:i + 2], 16))) + fragment = ''.join(fragment) + key = fragment[16:] + iv = fragment[:16] + if len(key) == 32 and len(iv) == 16: + encrypted = True + + if encrypted: + if decryption_available: + # First get the http head request + # which does not fetch data, just headers + gajim.thread_interface( + self._get_http_head, + [self.textview.account, special_text], + self._check_mime_size, + [special_text, repl_start, repl_end, + filepaths, key, iv, encrypted]) + else: + log.debug('Please install Crytography to decrypt pictures') + else: + # First get the http head request + # which does not fetch data, just headers + gajim.thread_interface( + self._get_http_head, [self.textview.account, special_text], + self._check_mime_size, [special_text, repl_start, repl_end, + filepaths, key, iv, encrypted]) # Don't print the URL in the message window (in the calling function) self.textview.plugin_modified = True - def _check_mime_size(self, (file_mime, file_size), url, repl_start, repl_end): + def _check_mime_size(self, (file_mime, file_size), + url, repl_start, repl_end, filepaths, + key, iv, encrypted): # Check if mime type is acceptable if file_mime == '' and file_size == 0: - log.info("Failed to load HEAD Request for URL: '%s' (see debug log for more info)" % url) + log.info("Failed to load HEAD Request for URL: '%s'" + "(see debug log for more info)" % url) # URL is already displayed return if file_mime.lower() not in ACCEPTED_MIME_TYPES: - log.info("Not accepted mime type '%s' for URL: '%s'" % (file_mime.lower(), url)) + log.info("Not accepted mime type '%s' for URL: '%s'" + % (file_mime.lower(), url)) # URL is already displayed return # Check if file size is acceptable if file_size > self.plugin.config['MAX_FILE_SIZE'] or file_size == 0: - log.info("File size (%s) too big or unknown (zero) for URL: '%s'" % (str(file_size), url)) + log.info("File size (%s) too big or unknown (zero) for URL: '%s'" + % (str(file_size), url)) # URL is already displayed return - # check for encryption (conversations mode) - urlparts = urlparse(url) - key = '' - iv = '' - if len(urlparts.fragment): - fragment = [] - for i in range(0, len(urlparts.fragment), 2): - fragment.append(chr(int(urlparts.fragment[i:i + 2], 16))) - fragment = ''.join(fragment) - key = fragment[16:] - iv = fragment[:16] + attributes = {'src': url, + 'max_size': self.plugin.config['MAX_FILE_SIZE'], + 'filepaths': filepaths, + 'key': key, + 'iv': iv} - # decrypt if the encryption parameters are correct - if len(urlparts.fragment) and len(key) == 32 and len(iv) == 16: - def _decryptor((mem, alt), url, file_mime, repl_start, repl_end, key, iv): - if not mem: - log.error('Could not download image for URL: %s -- %s' % (url, alt)) - return - # start self._decrypt_url() in own thread and self._update_img() afterwards - gajim.thread_interface( - self._decrypt_url, - [(mem, alt), key, iv, url], - self._update_img, - [url, file_mime, repl_start, repl_end, True]) - - # Start downloading image (_decryptor is callback when download has finished) - gajim.thread_interface(self._download_image, [ self.textview.account, { - 'src': url, 'max_size': self.plugin.config['MAX_FILE_SIZE'] } ], - _decryptor, [url, file_mime, repl_start, repl_end, key, iv]) - else: - # Start downloading image (self._update_img() is callback when download has finished)
1
0
0
0
gajim: Make transition to new profile path handling more smooth ...
by Gajim
05 Sep '16
05 Sep '16
changeset 5a9f890059c2 in /home/hg/repos/gajim author: tmolitor <thilo(a)eightysoft.de> branches:
details:http://hg.gajim.org/gajim?cmd=changeset;node=5a9f890059c2
description: Make transition to new profile path handling more smooth for the default profile. diffstat: src/common/configpaths.py | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diffs (28 lines): diff -r 9a7d6628a4dc -r 5a9f890059c2 src/common/configpaths.py --- a/src/common/configpaths.py Mon Sep 05 23:07:31 2016 +0200 +++ b/src/common/configpaths.py Mon Sep 05 23:58:59 2016 +0200 @@ -150,7 +150,7 @@ for name in d: d[name] += profile self.add(name, TYPE_DATA, windowsify(d[name])) - self.add('MY_DATA', TYPE_DATA, 'data.dir' + profile) + self.add('MY_DATA', TYPE_DATA, len(profile) ? 'data.dir' + profile : '') d = {'CACHE_DB': 'cache.db', 'VCARD': 'vcards', 'AVATAR': 'avatars', @@ -158,13 +158,13 @@ for name in d: d[name] += profile self.add(name, TYPE_CACHE, windowsify(d[name])) - self.add('MY_CACHE', TYPE_CACHE, 'cache.dir' + profile) + self.add('MY_CACHE', TYPE_CACHE, len(profile) ? 'cache.dir' + profile : '') d = {'CONFIG_FILE': 'config', 'PLUGINS_CONFIG_DIR': 'pluginsconfig', 'MY_CERT': 'localcerts'} for name in d: d[name] += profile self.add(name, TYPE_CONFIG, windowsify(d[name])) - self.add('MY_CONFIG', TYPE_CONFIG, 'config.dir' + profile) + self.add('MY_CONFIG', TYPE_CONFIG, len(profile) ? 'config.dir' + profile : '') basedir = fse(os.environ.get('GAJIM_BASEDIR', defs.basedir)) self.add('DATA', None, os.path.join(basedir, windowsify('data')))
1
0
0
0
gajim: Added ability to use additional_data for directly sent me...
by Gajim
05 Sep '16
05 Sep '16
changeset 9a7d6628a4dc in /home/hg/repos/gajim author: tmolitor <thilo(a)eightysoft.de> branches:
details:http://hg.gajim.org/gajim?cmd=changeset;node=9a7d6628a4dc
description: Added ability to use additional_data for directly sent messages not coming from history db. diffstat: src/chat_control.py | 14 +++++++------- src/common/connection.py | 2 +- src/roster_window.py | 2 +- src/session.py | 8 +++++--- 4 files changed, 14 insertions(+), 12 deletions(-) diffs (117 lines): diff -r 8d4992011113 -r 9a7d6628a4dc src/chat_control.py --- a/src/chat_control.py Mon Sep 05 21:17:46 2016 +0200 +++ b/src/chat_control.py Mon Sep 05 23:07:31 2016 +0200 @@ -791,11 +791,11 @@ label = self.get_seclabel() - def _cb(msg, cb, *cb_args): + def _cb(obj, msg, cb, *cb_args): self.last_sent_msg = msg self.last_sent_txt = cb_args[0] if cb: - cb(msg, *cb_args) + cb(obj, msg, *cb_args) if self.correcting and self.last_sent_msg: correction_msg = self.last_sent_msg @@ -2319,7 +2319,7 @@ GLib.source_remove(self.possible_inactive_timeout_id) self._schedule_activity_timers() - def _on_sent(msg_stanza, message, encrypted, xhtml, label, old_txt): + def _on_sent(obj, msg_stanza, message, encrypted, xhtml, label, old_txt): id_ = msg_stanza.getID() if self.contact.supports(NS_RECEIPTS) and gajim.config.get_per( 'accounts', self.account, 'request_receipt'): @@ -2333,14 +2333,14 @@ if self.correcting and \ self.conv_textview.last_sent_message_marks[0]: self.conv_textview.correct_last_sent_message(message, xhtml, - self.get_our_nick(), old_txt) + self.get_our_nick(), old_txt, additional_data=obj.additional_data) self.correcting = False self.msg_textview.override_background_color( Gtk.StateType.NORMAL, self.old_message_tv_color) return self.print_conversation(message, self.contact.jid, encrypted=encrypted, xep0184_id=xep0184_id, xhtml=xhtml, - displaymarking=displaymarking) + displaymarking=displaymarking, additional_data=obj.additional_data) ChatControlBase.send_message(self, message, keyID, type_='chat', chatstate=chatstate_to_send, xhtml=xhtml, callback=_on_sent, @@ -2457,7 +2457,7 @@ def print_conversation(self, text, frm='', tim=None, encrypted=False, subject=None, xhtml=None, simple=False, xep0184_id=None, - displaymarking=None, msg_log_id=None, correct_id=None): + displaymarking=None, msg_log_id=None, correct_id=None, additional_data={}): """ Print a line in the conversation @@ -2522,7 +2522,7 @@ ChatControlBase.print_conversation_line(self, text, kind, name, tim, subject=subject, old_kind=self.old_msg_kind, xhtml=xhtml, simple=simple, xep0184_id=xep0184_id, displaymarking=displaymarking, - msg_log_id=msg_log_id, correct_id=correct_id) + msg_log_id=msg_log_id, correct_id=correct_id, additional_data=additional_data) if text.startswith('/me ') or text.startswith('/me\n'): self.old_msg_kind = None else: diff -r 8d4992011113 -r 9a7d6628a4dc src/common/connection.py --- a/src/common/connection.py Mon Sep 05 21:17:46 2016 +0200 +++ b/src/common/connection.py Mon Sep 05 23:07:31 2016 +0200 @@ -2176,7 +2176,7 @@ jid=jid, message=msg, keyID=keyID, chatstate=obj.chatstate, automatic_message=obj.automatic_message, msg_id=msg_id, additional_data=obj.additional_data)) if obj.callback: - obj.callback(msg_iq, *obj.callback_args) + obj.callback(obj, msg_iq, *obj.callback_args) if not obj.is_loggable: return diff -r 8d4992011113 -r 9a7d6628a4dc src/roster_window.py --- a/src/roster_window.py Mon Sep 05 21:17:46 2016 +0200 +++ b/src/roster_window.py Mon Sep 05 23:07:31 2016 +0200 @@ -1861,7 +1861,7 @@ tim = time.localtime(float(result[2])) session.roster_message(jid, result[1], tim, msg_type='chat', - msg_log_id=result[0]) + msg_log_id=result[0], additional_data=additional_data) gajim.logger.set_shown_unread_msgs(result[0]) elif (time.time() - result[2]) > 2592000: diff -r 8d4992011113 -r 9a7d6628a4dc src/session.py --- a/src/session.py Mon Sep 05 21:17:46 2016 +0200 +++ b/src/session.py Mon Sep 05 23:07:31 2016 +0200 @@ -267,7 +267,7 @@ def roster_message(self, jid, msg, tim, encrypted=False, msg_type='', subject=None, resource='', msg_log_id=None, user_nick='', xhtml=None, - form_node=None, displaymarking=None): + form_node=None, displaymarking=None, additional_data={}): """ Display the message or show notification in the roster """ @@ -333,7 +333,8 @@ typ = 'error' self.control.print_conversation(msg, typ, tim=tim, encrypted=encrypted, - subject=subject, xhtml=xhtml, displaymarking=displaymarking) + subject=subject, xhtml=xhtml, displaymarking=displaymarking, + additional_data=additional_data) if msg_log_id: gajim.logger.set_read_messages([msg_log_id]) @@ -356,7 +357,8 @@ event = event_t(msg, subject, msg_type, tim, encrypted, resource, msg_log_id, xhtml=xhtml, session=self, form_node=form_node, displaymarking=displaymarking, sent_forwarded=False, - show_in_roster=show_in_roster, show_in_systray=show_in_systray) + show_in_roster=show_in_roster, show_in_systray=show_in_systray, + additional_data=additional_data) gajim.events.add_event(self.conn.name, fjid, event)
1
0
0
0
gajim: Also write additional_data to history db when mam message...
by Gajim
05 Sep '16
05 Sep '16
changeset 8d4992011113 in /home/hg/repos/gajim author: tmolitor <thilo(a)eightysoft.de> branches:
details:http://hg.gajim.org/gajim?cmd=changeset;node=8d4992011113
description: Also write additional_data to history db when mam messages are received. diffstat: src/common/logger.py | 4 ++-- src/common/message_archiving.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diffs (33 lines): diff -r ad7120868929 -r 8d4992011113 src/common/logger.py --- a/src/common/logger.py Mon Sep 05 21:11:02 2016 +0200 +++ b/src/common/logger.py Mon Sep 05 21:17:46 2016 +0200 @@ -1110,7 +1110,7 @@ (account_jid_id,)) self._timeout_commit() - def save_if_not_exists(self, with_, direction, tim, msg='', nick=None): + def save_if_not_exists(self, with_, direction, tim, msg='', nick=None, additional_data={}): if tim: time_col = int(float(time.mktime(tim))) else: @@ -1154,7 +1154,7 @@ log.debug('Log already in DB, ignoring it') return log.debug('New log received from server archives, storing it') - self.write(type_, with_, message=msg, tim=tim) + self.write(type_, with_, message=msg, tim=tim, additional_data=additional_data) def _nec_gc_message_received(self, obj): tim_f = float(time.mktime(obj.timestamp)) diff -r ad7120868929 -r 8d4992011113 src/common/message_archiving.py --- a/src/common/message_archiving.py Mon Sep 05 21:11:02 2016 +0200 +++ b/src/common/message_archiving.py Mon Sep 05 21:17:46 2016 +0200 @@ -113,7 +113,7 @@ if obj.conn.name != self.name: return gajim.logger.save_if_not_exists(obj.with_, obj.direction, obj.tim, - msg=obj.msgtxt, nick=obj.nick) + msg=obj.msgtxt, nick=obj.nick, additional_data=obj.additional_data) def request_archive(self, start=None, end=None, with_=None, after=None, max=30):
1
0
0
0
gajim: Added ability to diconnect muc from tab context menu
by Gajim
05 Sep '16
05 Sep '16
changeset ad7120868929 in /home/hg/repos/gajim author: tmolitor <thilo(a)eightysoft.de> branches:
details:http://hg.gajim.org/gajim?cmd=changeset;node=ad7120868929
description: Added ability to diconnect muc from tab context menu diffstat: data/gui/gc_control_popup_menu.ui | 7 +++++++ src/conversation_textview.py | 2 ++ src/groupchat_control.py | 13 +++++++++++++ 3 files changed, 22 insertions(+), 0 deletions(-) diffs (79 lines): diff -r 2caf7d2aaea7 -r ad7120868929 data/gui/gc_control_popup_menu.ui --- a/data/gui/gc_control_popup_menu.ui Mon Sep 05 20:24:13 2016 +0200 +++ b/data/gui/gc_control_popup_menu.ui Mon Sep 05 21:11:02 2016 +0200 @@ -107,5 +107,12 @@ <property name="use_underline">True</property> </object> </child> + <child> + <object class="GtkMenuItem" id="disconnect_menuitem"> + <property name="can_focus">False</property> + <property name="label" translatable="yes">_Disconnect</property> + <property name="use_underline">True</property> + </object> + </child> </object> </interface> diff -r 2caf7d2aaea7 -r ad7120868929 src/conversation_textview.py --- a/src/conversation_textview.py Mon Sep 05 20:24:13 2016 +0200 +++ b/src/conversation_textview.py Mon Sep 05 21:11:02 2016 +0200 @@ -1494,6 +1494,8 @@ text, text_tags, graphics, iter_, additional_data) if self.plugin_modified: return self.tv.get_buffer().get_end_iter() + #needed, if buffer is manipulated by plugins without setting plugin_modified to True + iter_ = self.tv.get_buffer().get_end_iter() # detect urls formatting and if the user has it on emoticons return self.detect_and_print_special_text(text, text_tags, graphics=graphics, diff -r 2caf7d2aaea7 -r ad7120868929 src/groupchat_control.py --- a/src/groupchat_control.py Mon Sep 05 20:24:13 2016 +0200 +++ b/src/groupchat_control.py Mon Sep 05 21:11:02 2016 +0200 @@ -301,6 +301,7 @@ ChatControlBase.__init__(self, self.TYPE_ID, parent_win, 'groupchat_control', contact, acct) + self.force_non_minimizable = False self.is_continued = is_continued self.is_anonymous = True @@ -829,6 +830,7 @@ destroy_room_menuitem = xml.get_object('destroy_room_menuitem') change_subject_menuitem = xml.get_object('change_subject_menuitem') history_menuitem = xml.get_object('history_menuitem') + disconnect_menuitem = xml.get_object('disconnect_menuitem') minimize_menuitem = xml.get_object('minimize_menuitem') request_voice_menuitem = xml.get_object('request_voice_menuitem') bookmark_separator = xml.get_object('bookmark_separator') @@ -921,6 +923,10 @@ id_ = history_menuitem.connect('activate', self._on_history_menuitem_activate) self.handlers[id_] = history_menuitem + + id_ = disconnect_menuitem.connect('activate', + self._on_disconnect_menuitem_activate) + self.handlers[id_] = disconnect_menuitem id_ = request_voice_menuitem.connect('activate', self._on_request_voice_menuitem_activate) @@ -2038,6 +2044,8 @@ return 'visitor' def minimizable(self): + if self.force_non_minimizable: + return False if self.contact.jid not in gajim.config.get_per('accounts', self.account, 'non_minimized_gc').split(' '): return True @@ -2219,6 +2227,11 @@ _('Please specify the new subject:'), input_str=self.subject, ok_handler=on_ok) + def _on_disconnect_menuitem_activate(self, widget): + self.force_non_minimizable = True + self.parent_win.remove_tab(self, self.parent_win.CLOSE_COMMAND) + self.force_non_minimizable = False + def _on_change_nick_menuitem_activate(self, widget): if 'change_nick_dialog' in gajim.interface.instances: gajim.interface.instances['change_nick_dialog'].dialog.present()
1
0
0
0
← Newer
1
2
3
4
5
6
7
8
Older →
Jump to page:
1
2
3
4
5
6
7
8
Results per page:
10
25
50
100
200