Compare commits

...

1608 Commits

Author SHA1 Message Date
Travis Burtrum 197352b669 Read support for 12-byte IVs in addition to 16-byte IVs 2017-08-09 23:42:35 -04:00
Daniel Gultsch d8d1c1192f code cleanup and synchronized getMarkableMessage() 2017-08-09 09:43:41 +02:00
Daniel Gultsch 995d975127 removed support for fixed IV mode in otr jingle file transfer that hasn't been used since v0.4 or something 2017-08-09 09:43:12 +02:00
Daniel Gultsch cce5a7b39f parse jid from CN in client certs if nothing else is available 2017-08-07 16:02:48 +02:00
Daniel Gultsch 4a43df8c97 do not crash on some very rare logging 2017-08-07 15:55:56 +02:00
Daniel Gultsch ed4a190793 Merge branch 'master' of github.com:siacs/Conversations 2017-08-05 19:53:36 +02:00
Daniel Gultsch 719102d02f change bounty source badge to open bounties 2017-08-05 19:52:17 +02:00
Daniel Gultsch c3926a9ef8 Merge pull request #2483 from uchchishta/patch-1
add badges in README.md & align center
2017-08-05 19:51:01 +02:00
Daniel Gultsch 1ab391931d some code cleanup. and avoid scheduling reconnect task for negative interval 2017-08-05 19:13:29 +02:00
Daniel Gultsch 490115d20e do not run file observer on hidden directories 2017-08-05 19:12:44 +02:00
Daniel Gultsch 911e392006 update mini dns 2017-08-05 15:17:10 +02:00
Daniel Gultsch b925f436fd add more logging to http download connection and reset file params after setting expected size 2017-08-04 11:58:12 +02:00
Daniel Gultsch 5cee46cda5 version bump to 1.12.0-beta + changelog (untagged/unreleased) 2017-08-03 14:21:48 +02:00
Daniel Gultsch 014643b9c4 pulled translations from transifex 2017-08-03 14:21:22 +02:00
Daniel Gultsch c3cbb21133 cache some information generated from body like isEmojiOnly, fileParams and isGeoUri 2017-08-03 13:24:41 +02:00
Daniel Gultsch 7bcf173866 remove all whitespaces in emoji only messages 2017-08-03 10:55:14 +02:00
Daniel Gultsch 225cca4566 provide extra 'network is unreachable' account state 2017-08-02 18:58:51 +02:00
Daniel Gultsch 4ff3c36ed9 updated build tools and some library versions 2017-08-02 17:42:21 +02:00
Daniel Gultsch 768eadde36 use random string generator instead of BigInteger in DigestMd5 2017-08-01 12:27:26 +02:00
Daniel Gultsch 82c5924434 display messages that only contain emoji slightly larger 2017-07-30 22:04:58 +02:00
Daniel Gultsch e11277c70f use base64 instead of base36 when creating random strings 2017-07-30 11:39:47 +02:00
Daniel Gultsch 01b207d44d avoid empty strings when figuring out display name 2017-07-30 11:39:16 +02:00
Daniel Gultsch d3194172c5 update dependencies 2017-07-29 13:50:59 +02:00
Daniel Gultsch f5da4791ad avoid unnecessary roster sync in OMEMO code. fixed startup performance regression 2017-07-29 13:50:32 +02:00
Daniel Gultsch 837c212931 refresh omemo activity after failing to fetch keys due to lack of ids 2017-07-28 18:37:07 +02:00
Daniel Gultsch ad601e47c8 fixed roster items w/o subscription (request) not being shown 2017-07-28 18:34:55 +02:00
Daniel Gultsch ea6289c02e pulled translations from transifex 2017-07-26 13:23:40 +02:00
Daniel Gultsch d6e51288c3 Merge pull request #2564 from yushijinhun/fix-decryption-blocked
Give up PGP decryption when intent is cancelled
2017-07-25 09:20:51 +02:00
yushijinhun 48147b7fd1
Give up PGP decryption when intent is cancelled
When receiving a PGP message which is not encrypted with YOUR key,
OpenKeychain shows a dialog, which tells you the private key to decrypt
the message is unavailable. However, Conversations won't give up
decrypting the message. So whether the subsequent messages are
decryptable or not, the decryption is blocked at the current message.
The commit fixes the bug in this way: Give up the current message when
the decryption intent is cancelled, so that subsequent messages can be
handled.
2017-07-25 15:09:18 +08:00
Daniel Gultsch 432598f896 Merge branch 'bugfixes' 2017-07-23 07:53:09 +02:00
Daniel Gultsch 7ac26952d7 version bump to 1.19.5 + changelog 2017-07-23 07:51:13 +02:00
Daniel Gultsch c8bd5bc1f5 made OF selfSigned() workaround only available >=kitkat
this undos 8a729061d5. as it turns out 4.1
and 4.0 only break when checking if a cert is self signed.
2017-07-23 07:47:39 +02:00
Daniel Gultsch 2fc216bfc4 skip initial socket closing if thread was already interrupted 2017-07-21 08:30:16 +02:00
Daniel Gultsch 74cde1d60a incorporate support for publish-options into server info 2017-07-18 12:51:15 +02:00
Daniel Gultsch 85dc0c284d made omemo always available but in public mucs 2017-07-18 12:51:15 +02:00
Daniel Gultsch 002dbf2e17 enable all encryption options 2017-07-18 12:51:15 +02:00
Daniel Gultsch da87eac48e provide upgrade path for accounts with publish-options 2017-07-18 12:51:15 +02:00
Daniel Gultsch 9a57673130 use publish-options instead of always pushing node configuration 2017-07-18 12:51:15 +02:00
Daniel Gultsch 8d6b2074cb let hasPendingFetches() return true when fetching device ids 2017-07-18 12:51:15 +02:00
Daniel Gultsch 7a2856ac86 fetch required device ids on demand 2017-07-18 12:51:15 +02:00
Daniel Gultsch f7258d16e1 explicitly fetch device ids before building sessions in single mode conversation 2017-07-18 12:51:15 +02:00
Daniel Gultsch 25e993693f change access model of omemo pep nodes after every publish 2017-07-18 12:51:15 +02:00
Daniel Gultsch 6c95897f09 fetch device ids for muc members w/o known devices 2017-07-18 12:51:15 +02:00
Daniel Gultsch 2a198793b1 fixed otr jingle file size reporting 2017-07-18 12:43:53 +02:00
Daniel Gultsch 58f3787795 increment version code for 1.19.4 2017-07-17 23:14:02 +02:00
Daniel Gultsch 8a729061d5 use CN-workaround for pre-kitkat 2017-07-17 23:13:55 +02:00
Daniel Gultsch 8285a4fe1c pulled translations from transifex 2017-07-17 22:06:56 +02:00
Daniel Gultsch 217335703c fix regression introduces with OF fix. properly fall back to common name 2017-07-17 21:11:15 +02:00
Daniel Gultsch 0a20b87ebe check length first in timestamp parser 2017-07-16 21:03:59 +02:00
Daniel Gultsch febee9863f catch IllegalArgumentException caused by invalid custom hostname 2017-07-16 21:02:56 +02:00
Daniel Gultsch 2dce71cd96 version bump to 1.19.4 + changelog 2017-07-16 11:38:17 +02:00
Daniel Gultsch 8afe7efc2c workaround for OpenFire: check CN first in self signed certs
The self signed certificates created by OpenFire (Not sure if other
certs are affected as well) will crash the Java/Android TLS stack when
accessing getSubjectAlternativeNames() on the the peer certificate.

This usually goes unnoticed in other applications since the
DefaultHostnameVerifier checkes the CN first. That however is a
violation of RFC6125 section 6.4.4 which requires us to check for the
existence of SAN first.

This commit adds a work around where in self signed certificates we
check for the CN first as well. (Avoiding the call to
getSubjectAlternativeNames())
2017-07-16 11:05:25 +02:00
Daniel Gultsch dfa17d1339 more migration fixes for updating from 1.6.0 to 1.19.3 2017-07-14 10:34:01 +02:00
Daniel Gultsch 91119ab691 add reminder to remove minidns workarounds once those are fixed 2017-07-14 09:09:26 +02:00
Daniel Gultsch ea6b756c0f fixed bug in db migrations when going from <15 to something recent 2017-07-13 19:28:16 +02:00
Daniel Gultsch 3d0b127a8f verify with hostname in direct tls connections 2017-07-13 19:27:43 +02:00
Daniel Gultsch 7623accfd5 prefer DNS servers from VPNs 2017-07-12 22:19:45 +02:00
Daniel Gultsch 35a4b848a5 version bump to 1.19.3 + changelog 2017-07-12 14:46:12 +02:00
Daniel Gultsch 45f92553c4 pulled translations from transifex 2017-07-12 11:54:05 +02:00
Daniel Gultsch ecc0ef45c5 disable foreground service if all accounts are disabled 2017-07-12 11:03:32 +02:00
Daniel Gultsch edb28ccb31 throw state changing exception on failed tls only if no more connection options left 2017-07-11 23:25:59 +02:00
Daniel Gultsch 19c1484053 catch runtime exceptions from minidns 2017-07-11 23:24:09 +02:00
Daniel Gultsch 8de81e0bc8 sync around Conversation.getLatestMessage() 2017-07-11 23:09:51 +02:00
Daniel Gultsch 4d1b6d4404 version bump to 1.19.2 + changelog 2017-07-10 12:38:48 +02:00
Daniel Gultsch c5824a3b2a catch all exceptions around minidns :( 2017-07-10 12:33:04 +02:00
Daniel Gultsch a1f9f5e774 version bump to 1.19.1 + changelog 2017-07-10 10:06:20 +02:00
Daniel Gultsch 8415f27cac pulled translations from transifex 2017-07-10 10:06:08 +02:00
Daniel Gultsch abf84e065d made DNSEC hostname validation opt-in 2017-07-10 09:59:25 +02:00
Daniel Gultsch da00a58902 work around idn short comings in minidns 2017-07-10 08:50:01 +02:00
Daniel Gultsch 7cbef529ae resolve non-srv domains in resolver class as well
this allows us to prefer ipv4
2017-07-10 08:49:22 +02:00
Daniel Gultsch c400f74918 prefer ipv4 over ipv6 2017-07-09 19:05:23 +02:00
Daniel Gultsch 67bc032ccc fixed fallback to normal DNS query after DNSSEC failed 2017-07-09 18:03:26 +02:00
Daniel Gultsch ae0ba3bbc1 version bump to 1.19.0 + changelog 2017-07-05 13:16:54 +02:00
Daniel Gultsch 7df0f3fd28 pulled translations from transifex 2017-07-05 11:29:42 +02:00
Daniel Gultsch ef980ff5cf show date separators. fixes #2271 2017-07-04 11:01:20 +02:00
Daniel Gultsch 2ada4d5cfe allow users to send PMs in mucs w/o voice 2017-07-03 23:58:34 +02:00
Daniel Gultsch f2409ed95e set focusable=false instead of enabled=false for rooms w/o voice 2017-07-03 19:55:21 +02:00
Daniel Gultsch 5cac4397dd catch state changing error when sending timeout to iq callbacks 2017-07-03 19:44:01 +02:00
Daniel Gultsch 7cf360fabf do not keep files in waiting when file size exceeds http upload limit in groups. fixes #2533 2017-07-01 19:31:48 +02:00
Daniel Gultsch 2b9cdde558 refactored retrieval of default preferences 2017-07-01 13:41:24 +02:00
Daniel Gultsch 7d4d5c437a pulled translations from transifex 2017-06-30 21:28:02 +02:00
Daniel Gultsch 311c99bb6d put settings defaults into resource file 2017-06-30 21:22:35 +02:00
Daniel Gultsch 4a2e222b34 deduplicate disco items before disco#info 2017-06-30 08:45:16 +02:00
Daniel Gultsch 7c1e1132b0 make scan barcode icon survive rotations 2017-06-29 20:23:28 +02:00
Daniel Gultsch b2aae44645 show scan button in TrustKeys only if there is something to scan 2017-06-29 14:01:12 +02:00
Daniel Gultsch cbbf6f439b add publish-options helper class 2017-06-27 22:50:39 +02:00
Daniel Gultsch 90afaab8ed version bump to 1.19.0-beta.2 + changelog 2017-06-27 16:30:01 +02:00
Daniel Gultsch 59e39304dd use DND instead of XA when phone is silent 2017-06-27 12:24:26 +02:00
Daniel Gultsch c85b3bbacc revised resolver strategy 2017-06-26 14:03:38 +02:00
Daniel Gultsch 6dad1c0dde refactored resolver to fall back to DNS and use reliable method 2017-06-25 22:46:56 +02:00
Daniel Gultsch 4faf0f2ec9 use ResolverApi.reliable(..) 2017-06-25 19:30:03 +02:00
Daniel Gultsch 2c5250a82c new resolver fall back to normal dns if dnssec verfication fails 2017-06-25 18:35:40 +02:00
Daniel Gultsch cbce73c301 fixed fingerprint trust (was messed up after library upgrade) 2017-06-25 18:18:13 +02:00
Daniel Gultsch 24ab765e11 pulled translations from transifex 2017-06-25 16:01:37 +02:00
Daniel Gultsch 6ec8e57fbb change order of settings. move heads-up notifications up 2017-06-25 16:00:07 +02:00
Daniel Gultsch 14fd41cd7f fixed patterns source code url 2017-06-25 12:03:26 +02:00
Daniel Gultsch 19b4207c3a Merge branch 'master' of https://github.com/BlauerHunger/Conversations into BlauerHunger-master 2017-06-24 16:16:34 +02:00
Daniel Gultsch d24022d755 cleanup nameWithoutVersion() code 2017-06-24 16:13:55 +02:00
Ferdinand Pöll f8e031ac86 Added preference to control Heads-up Notifications (turned off by default) 2017-06-24 15:38:16 +02:00
Daniel Gultsch 5fd4169720 don't use version part of identity name in presence selection. fixes #2519 2017-06-23 14:51:08 +02:00
Daniel Gultsch 3c90dbe723 fixed ip reporting for dns look ups 2017-06-22 00:09:59 +02:00
Daniel Gultsch 2ed71df01a also check for hostname in in certs if hostname is from trusted source 2017-06-21 23:40:01 +02:00
Daniel Gultsch 2e380ed792 upgrade minidns. refactored dns utils 2017-06-21 23:28:01 +02:00
Daniel Gultsch 5d9d725446 offer to open website if ibb offers oob redirect. fixes #2503 2017-06-19 20:02:41 +02:00
Daniel Gultsch 95405fde5f mark message as failed after canceling ft w/o transferable. fixes #2513 2017-06-19 13:23:20 +02:00
Daniel Gultsch 24768d051d upgrade to signal-protocol-java. thanks @ysangkok
fixes #1384
closes #2509
2017-06-18 16:36:30 +02:00
Daniel Gultsch f67baab983 revised strategy for http upload read timeout 2017-06-18 16:32:01 +02:00
Daniel Gultsch a1fe8f1c87 make http upload read timeout depend on file size 2017-06-14 16:27:38 +02:00
Daniel Gultsch 00bb527333 recreate settingsactivity when theme changed 2017-06-05 14:57:09 +02:00
Daniel Gultsch 10025123e9 make MemorizingTrustManager use Build-Tools 25.0.3 2017-06-05 10:43:18 +02:00
Daniel Gultsch f7f6e8dfd5 make launching app shortcuts work with disabled accounts 2017-06-05 10:18:02 +02:00
Daniel Gultsch 012f60be56 use proper alpha for dark themed icons 2017-06-04 00:05:02 +02:00
Daniel Gultsch 51badfa721 enable forground service for sony smartphones by default 2017-06-02 13:00:20 +02:00
Daniel Gultsch e722ef6477 do not accept LMC for files 2017-06-02 13:00:02 +02:00
Daniel Gultsch 612e0afa63 do not parse delay tag for unavailable presences when it comes form own server 2017-06-01 16:45:00 +02:00
Daniel Gultsch ed7882fe69 fix NPE when bookmark jid is null on creating suggestions 2017-06-01 16:44:35 +02:00
Daniel Gultsch 3889c0eb01 use application/pgp-encrypted mime type when necessary for http upload 2017-06-01 07:35:18 +02:00
Daniel Gultsch 9dcd0bf16b 'end this conversation afterwards' checked by default
closes #2364 #2382
2017-05-31 19:58:54 +02:00
Daniel Gultsch 2cf05528b4 add the 4 most frequently contacted contacts as app shortcuts 2017-05-31 16:45:51 +02:00
Daniel Gultsch e48517b0c8 version bump to 1.18.5 + changelog 2017-05-31 11:38:30 +02:00
Daniel Gultsch 7b271bcf67 pulled translations from transifex 2017-05-31 11:38:16 +02:00
Daniel Gultsch 50f61a4d91 do not check if namespace equals prefix for attributes 2017-05-30 19:05:36 +02:00
Daniel Gultsch 6ccdd1227e parse all delayed tags. use min date 2017-05-30 08:39:04 +02:00
Daniel Gultsch e973117aed deal with namespace attributes. fixes #2495 2017-05-30 08:38:33 +02:00
Daniel Gultsch 3ece613a5d rename resource on bind conflict 2017-05-25 14:40:59 +02:00
Daniel Gultsch fe29b51290 rename downgrade attack to downgraded sasl mechanism 2017-05-24 19:12:37 +02:00
Daniel Gultsch 51d1223198 invoke statusChanged callback after syncronization 2017-05-19 15:28:25 +02:00
Daniel Gultsch 5a5eb5bdd3 do not turn send button green unless history is caught up. fixes #1232 2017-05-19 13:39:44 +02:00
Daniel Gultsch 7cd4ed78b2 synchronize on dedicated lock for catchup instead of account 2017-05-19 13:30:57 +02:00
Daniel Gultsch 9fd6539534 clean up client cert selection code 2017-05-18 11:31:31 +02:00
uchchishta 7e5e32e9eb add badges & align center 2017-05-13 20:58:31 +05:30
Daniel Gultsch 41b3df0d43 fall back to jingle only in 1:1. fixes #2482 2017-05-13 08:11:24 +02:00
Daniel Gultsch 2f577097d1 work around for brokens ROMs that expose file uris as notification sound 2017-05-13 08:10:47 +02:00
Daniel Gultsch 5056a28553 differentiate starttls failure and sasl failure 2017-05-13 08:08:05 +02:00
Daniel Gultsch 91db2023d3 use mam reference instead of timestamp 2017-05-07 21:05:35 +02:00
Daniel Gultsch 185dac6953 synchronize around adding query to query map 2017-05-07 15:47:18 +02:00
Daniel Gultsch a5d9932b08 version bump to 1.18.4 + changelog 2017-05-07 15:39:50 +02:00
Daniel Gultsch b0a8da35db add ability to distrust inactive/trusted keys 2017-05-06 18:38:23 +02:00
Daniel Gultsch 0f2e60d576 pulled translations from transifex 2017-05-06 15:37:35 +02:00
Daniel Gultsch 9a7d925b97 do not synchronize startXmpp() and sendPacket() on the same object as this can block the ui 2017-05-06 15:37:22 +02:00
Daniel Gultsch be371ac5df reset resource after bind failure 2017-05-05 09:38:58 +02:00
Daniel Gultsch 7b6d49f329 unified all account state exceptions 2017-05-05 09:33:05 +02:00
Daniel Gultsch 404cf808b0 set catchup flag on mam only when doing that 2017-05-04 22:11:46 +02:00
Daniel Gultsch f98888d796 display open pgp key id in account details and allow to delete. fixes #2470 2017-05-04 13:02:46 +02:00
Daniel Gultsch 839178b269 suggest bookmarked conferences servers in join conference dialog 2017-05-04 11:28:54 +02:00
Daniel Gultsch cc1402442a don't load signed prekeys on startup 2017-05-04 11:03:58 +02:00
Daniel Gultsch f47cf7ae67 make jingle implementation send file hash when using ft5 2017-05-03 11:03:04 +02:00
Daniel Gultsch ef78721f94 fixed regression from previous commit and brought back 'select text' 2017-05-02 10:42:50 +02:00
Daniel Gultsch 7c31a981bb unified copy text and share with context menu entries 2017-04-30 21:03:44 +02:00
Daniel Gultsch cec9b9b35a send read marker after reading message in android auto 2017-04-30 21:02:50 +02:00
Daniel Gultsch 5cadc81de4 support for jingle ft:5. fixes #2458 2017-04-30 16:21:13 +02:00
Daniel Gultsch 84baa3ae68 avoid race conditions when downloading files or decrypting pgp messages and waiting for sm catchup 2017-04-30 16:19:39 +02:00
Daniel Gultsch 15e5ccd1f4 avoid race condition that lead to double notification sound 2017-04-30 13:59:45 +02:00
Daniel Gultsch 1a72683b52 close http download connection after download 2017-04-29 22:59:36 +02:00
Daniel Gultsch 7ba81177c6 Merge pull request #2468 from morgenroth/feature/Android-auto-support
Fix: Add messages to Notifications for Android Auto on Android M and older
2017-04-29 21:47:21 +02:00
Johannes Morgenroth adff2baa4a Add messages to Notification for Android Auto on Android M and older
In the previous implementation for Android Auto, messages are only added
on Android N and above. In order to support older Android versions, the
messages need to be added always.
2017-04-29 19:25:57 +02:00
Daniel Gultsch b3d4d0608f version bump to 1.18.3 + changelog 2017-04-27 17:27:39 +02:00
Daniel Gultsch a5e15d5a10 code cleanup: made conversation property final in message object 2017-04-26 12:43:52 +02:00
Daniel Gultsch f6c1af2b06 Merge pull request #2463 from participante0/patch-1
Update strings.xml
2017-04-26 11:05:17 +02:00
participante0 48e3726071 Update strings.xml
Added a comma.
2017-04-25 18:06:03 -03:00
Daniel Gultsch a55d0a691c while restoring state deal with conversations that don't have accounts 2017-04-25 18:17:23 +02:00
Daniel Gultsch 8e0fb6a23a avoid rare race condition when saving draft message 2017-04-25 18:16:55 +02:00
Daniel Gultsch 4d1308e138 fixed click area for pgp key in contact details 2017-04-25 15:23:01 +02:00
Daniel Gultsch e6eb58f2d7 send pgp signature when creating ad hoc conferences 2017-04-25 15:22:31 +02:00
Daniel Gultsch 2cfa3ce288 limited offline support for pgp group chats
use pgp key from contact if not set in muc
fixes #283
2017-04-25 15:19:54 +02:00
Daniel Gultsch 848c339c8d make sure context is not null before setting content description on send button 2017-04-25 14:11:45 +02:00
Daniel Gultsch c837e0616a make sure tag writer thread shuts down 2017-04-22 10:08:51 +02:00
Daniel Gultsch c93b1a86bb version bump to 1.18.2 + changelog 2017-04-21 18:55:53 +02:00
Daniel Gultsch 9f5a089d5c reworked unique id generation for notification intents 2017-04-21 15:13:08 +02:00
Daniel Gultsch c33f4b704c Merge branch 'android-auto-support' of https://github.com/morgenroth/Conversations into morgenroth-android-auto-support 2017-04-20 13:03:18 +02:00
Daniel Gultsch 9cc37a7bdb re-add redownload context menu entry for deleted files. fixes #2453 2017-04-20 11:52:54 +02:00
Daniel Gultsch ae85a9e87b made nimbuzz work around work with newly created conferences as well 2017-04-20 11:35:38 +02:00
Daniel Gultsch 067daa81f4 Merge pull request #2445 from SamWhited/send_content_description
Add content description to send button
2017-04-17 12:56:36 +02:00
Daniel Gultsch d86a4642e9 Merge pull request #2448 from morgenroth/Android-wear-action-icons
Add reply button in wear design
2017-04-17 12:54:35 +02:00
Johannes Morgenroth a4454bcff2 Add reply button in wear design
The existing reply button for Android wear has been re-used from the action
bar. Instead of a 'send' icon, a 'reply' icon better matches the intended
action. Moreover, action icons for Android wear are solid white instead of
half transparent.
2017-04-17 12:19:14 +02:00
Sam Whited 4a915c60e9 Add content description to send button
This can be used by screen readers and other accessibility aids.
2017-04-16 16:37:32 -05:00
Daniel Gultsch 6c34763d32 transform aesgcm:// links back to https:// before connecting through Tor
fixes #2444
2017-04-16 08:44:26 +02:00
Daniel Gultsch 1ac0c2f453 show 'try again' button when remote server wasn't found in previously active muc 2017-04-15 17:18:15 +02:00
Daniel Gultsch 483304c697 recognize muc self presence on nimbuzz.com
Apparently nimbuzz.com doesn't include status code 110 in muc self presence
It does however include the full real jid in the presence’s item.
We can use that as a work around to detect a self presence.
2017-04-15 15:14:12 +02:00
Daniel Gultsch c86134e523 version bump to 1.18.1 + changelog 2017-04-15 15:10:24 +02:00
Daniel Gultsch d220d9db05 pulled translations from transifex 2017-04-15 15:09:50 +02:00
Johannes Morgenroth 403eff3d19 Add Android Auto support to notifications
This patch adds required additions in order to show notifications
in Android Auto. Messages are read aloud and voice reply is
offered. The functionaliy has been tested with the Android Auto
standalone app as well as with the DHU simulator as describes
here:

https://developer.android.com/training/auto/testing/index.html
2017-04-14 13:32:01 +02:00
Daniel Gultsch bf07196707 don't count >number% as quote 2017-04-13 17:29:11 +02:00
Daniel Gultsch 0904ba42f8 use async message loading only when called from UI 2017-04-13 00:12:23 +02:00
Daniel Gultsch 0229a1605e properly unregister bookmark from conversations when deleting bookmark 2017-04-12 23:41:59 +02:00
Daniel Gultsch 8742194f4b fixed message merge logic. merge only messages with lower status 2017-04-12 22:24:29 +02:00
Daniel Gultsch 4fd11a4c2b show first instead of last message in notification preview 2017-04-12 20:54:32 +02:00
Daniel Gultsch 4bbf2dab99 include RSM max in mam query in case server doesn't specify own max 2017-04-12 20:53:19 +02:00
Daniel Gultsch d4c2b12f95 Merge pull request #2437 from cijo7/f1
Removed unused imports from the entire project.
2017-04-12 20:52:06 +02:00
cijo-saju 3467a67e75 Removed unused imports from entire project. 2017-04-12 20:24:36 +05:30
Daniel Gultsch 03fff3179e Merge pull request #2431 from cijo7/f1
Minor code clean up
2017-04-08 10:18:05 +02:00
cijo-saju 5a27da848b Clean up 2017-04-08 11:04:20 +05:30
cijo-saju 41112d29bd Removed unnecessary string builder 2017-04-08 10:12:40 +05:30
cijo-saju ed8336ee54 Made variable local 2017-04-08 10:08:28 +05:30
cijo-saju 11e26e71f6 Code clean up 2017-04-08 10:05:13 +05:30
Daniel Gultsch e98f7e57b0 be more careful with corner cases when mentioning multiple people 2017-04-07 19:47:33 +02:00
Daniel Gultsch cc1aa9e431 exclude >= from being recognized as quote 2017-04-07 14:30:30 +02:00
Daniel Gultsch 56f202d4b8 do not linkify urls starting with a dot 2017-04-07 14:29:55 +02:00
Daniel Gultsch d91c314ac2 use comma seperation for multiple mentions 2017-04-06 18:06:07 +02:00
Daniel Gultsch 65b3655a8b version bump to 1.18.0 + changelog 2017-04-06 14:05:50 +02:00
Daniel Gultsch 06d1e1752c pulled translations from transifex 2017-04-06 12:01:17 +02:00
Daniel Gultsch 649d1243d5 avoid crash on urls with missing protocols 2017-04-06 11:59:15 +02:00
Daniel Gultsch 99565a6876 treat URL as file if URL is in oob or contains key 2017-04-05 22:35:42 +02:00
Daniel Gultsch 26badb7f4c send urls pointing to pgp encrypted files directly in body+oob 2017-04-05 21:01:29 +02:00
Daniel Gultsch 3b3121b9c5 pulled translations from transifex 2017-04-05 21:00:16 +02:00
Daniel Gultsch 401329caaa use aesgcm:// uri scheme for omemo encrypted http upload 2017-04-05 18:46:56 +02:00
Daniel Gultsch f75eb6bc43 unread badge: show >999 as infinity symbol 2017-04-05 18:39:27 +02:00
Daniel Gultsch 081c33b886 do not parse bodies with http urls as downloadable in omemo encrypted message. fixes #1756 2017-04-04 22:20:05 +02:00
Daniel Gultsch b34a1f7f5e parse message that only contain oob tag. fixes #2359 2017-04-04 22:15:38 +02:00
Daniel Gultsch 75749d7c7b Merge branch 'develop' of https://github.com/cijo7/Conversations into cijo7-develop 2017-03-31 09:34:38 +02:00
Daniel Gultsch 9682f4d454 Merge branch 'deprecated-method' of https://github.com/hareshkh/Conversations into hareshkh-deprecated-method 2017-03-31 09:27:22 +02:00
Daniel Gultsch 4bfc54e51d show file size for files smaller 1024 bytes. fixes #2415 2017-03-31 09:26:55 +02:00
Daniel Gultsch cf96a5e840 Merge pull request #2423 from jcgruenhage/patch-1
Fixed Markdown Headings
2017-03-31 08:34:01 +02:00
Jan Christian Grünhage 92ac82f94d Fixed Markdown Headings 2017-03-30 20:11:55 +02:00
cijo-saju 3171dcac8d Fixed deprecated call 2017-03-30 16:27:11 +05:30
cijo-saju 4e898fa4f2 Run in background instead of writing instantaneously 2017-03-30 16:27:11 +05:30
Haresh Khanna c7912ed7ef Changes the deprecated getColor() method 2017-03-29 22:05:35 +05:30
cijo-saju 37465db817 Fixed package access 2017-03-28 21:02:20 +05:30
cijo-saju 024dbd1c32 Removed unused import and fixed some annotations 2017-03-28 20:46:20 +05:30
cijo-saju cb96911da3 Saves some memory 2017-03-28 20:43:14 +05:30
cijo-saju d8901441f6 Deleted unused variable 2017-03-28 20:41:08 +05:30
Daniel Gultsch 892b1b02af Merge pull request #2409 from cijo7/master
Fixed typo in comment
2017-03-26 20:11:37 +02:00
cijo-saju b4318996ac Fixed typo in comment 2017-03-26 22:07:39 +05:30
Daniel Gultsch 3af30d7563 omemo: put auth tag into key (verify auth tag as well) 2017-03-26 12:39:18 +02:00
Daniel Gultsch 2302122d8e made a few exceptions to quote parser for emoticons and quotes 2017-03-26 12:29:12 +02:00
Daniel Gultsch 00e8ba00c4 count messages in backlog to not renotify on prior notifications 2017-03-23 15:34:52 +01:00
Daniel Gultsch 010b341251 do not pipeline first SM request because that might fail when resume fails 2017-03-21 18:08:20 +01:00
Daniel Gultsch c97c5def2c experimental: wait for SM catchup before triggering notifications
wait for a first SM ACK before calculating if we need to trigger any notifications
might have to be changed to an XEP-0199 ping later on. for now sending <r/> after resume seems to work outfine
2017-03-21 17:58:08 +01:00
Daniel Gultsch 76b9010c39 rework last activity logic to something that should work pretty well in Conversations only enviroments 2017-03-20 17:58:58 +01:00
Daniel Gultsch 644a3a729d define strangers as people not in roster instead of no mutual presence subscription 2017-03-20 13:25:36 +01:00
Daniel Gultsch e58f72c20f show strangers with jid instead of name in conversation list 2017-03-20 13:24:33 +01:00
Daniel Gultsch c2c6904eda offer to block entire domain in message from stranger snackbar. fixes #2391 2017-03-20 12:55:48 +01:00
Daniel Gultsch 4171e2b90e do not show block stranger snackbar when blocking command is unavailable. fixes #2393 2017-03-20 12:16:25 +01:00
Daniel Gultsch 0db5928031 version bump to 1.17.1 + changelog 2017-03-20 11:15:23 +01:00
Daniel Gultsch e5f08a5eae pulled translations from transifex 2017-03-20 11:07:27 +01:00
Daniel Gultsch 4d2a1afaf9 call EditText.setText() instead of clear because clear causes problems on some keyboards 2017-03-20 00:09:23 +01:00
Daniel Gultsch 6167ddb4a8 don't mark message as delivery_failed when cancel didn't work. fixes #2387 2017-03-19 20:16:11 +01:00
Daniel Gultsch 30ed6b3cec call messageSent() from UI thread after encrypting pgp message 2017-03-19 20:15:07 +01:00
Daniel Gultsch ce336690e2 pulled translations from transifex 2017-03-17 13:19:37 +01:00
Daniel Gultsch 91a69d7d85 use qr codes instead of aztec. Barcode Scanner is terrible at reading aztec. fixes #2375 2017-03-17 12:56:55 +01:00
Daniel Gultsch 935ac25cbd update unread counter for image messages. fixes #2376 2017-03-17 12:55:33 +01:00
Daniel Gultsch ba32217152 pulled translations from transifex 2017-03-14 11:09:45 +01:00
Daniel Gultsch 95e33b5a97 never mark conversation w/ own server as stranger 2017-03-14 11:09:34 +01:00
Daniel Gultsch 09d68ae603 fixed entity time for timezones with minutes !=0 2017-03-10 17:25:43 +01:00
Daniel Gultsch 0b11d0f7f2 version bump to 1.17.0 + changelog 2017-03-10 10:14:06 +01:00
Daniel Gultsch 9c588ae9eb pulled translations from transifex 2017-03-10 10:10:07 +01:00
Daniel Gultsch 0ee13bbecb send chat states only to private and non-anon mucs 2017-03-09 15:42:27 +01:00
Daniel Gultsch 1fd3bbfe25 display chat states in conferences 2017-03-09 10:58:44 +01:00
Daniel Gultsch 5ea4322d3f send and parse Chat States to and from conferences 2017-03-09 10:58:44 +01:00
Daniel Gultsch 8a3c996164 update gradle version 2017-03-09 10:58:33 +01:00
Daniel Gultsch cdf2bd07df use async avatar loading in AccountAdapter 2017-03-09 10:58:11 +01:00
Daniel Gultsch c3b2f33956 hide keyboard after setting up account 2017-03-09 10:57:33 +01:00
Daniel Gultsch d56fb3cec2 pulled translations from transifex 2017-03-09 08:33:44 +01:00
Daniel Gultsch 19b7179bcd version bump to 1.17.0-beta.2 2017-03-08 22:07:37 +01:00
Daniel Gultsch 7747fc0ea1 notify for muc messages after mam catchup 2017-03-08 22:02:09 +01:00
Daniel Gultsch 6b72e18982 add <x/> element to outgoing MUC PM 2017-03-08 22:01:20 +01:00
Daniel Gultsch 1f3be1597c add origin-id to outgoing messages 2017-03-08 21:30:12 +01:00
Daniel Gultsch 9d043076e8 only take 1:1 conversations into account when determining catchup timestamp 2017-03-08 20:54:13 +01:00
Daniel Gultsch 8ca16a6f63 do not interpret grin >< as quote 2017-03-08 20:21:04 +01:00
Daniel Gultsch 064926a18b fixed regression that caused stanza-ids not to be saved 2017-03-08 20:20:34 +01:00
Daniel Gultsch a3b51f7654 do not show 'block stranger' snackbar in empty conversations 2017-03-08 11:54:52 +01:00
Daniel Gultsch 233ee8a51c version bump to 1.17.0-beta + changelog 2017-03-07 20:01:16 +01:00
Daniel Gultsch 721250c7d9 pulled translations from transifex 2017-03-07 18:55:05 +01:00
Daniel Gultsch 8502d519c1 changed string from unread conversation to messages in notification 2017-03-07 18:12:33 +01:00
Daniel Gultsch 5b17734287 Merge branch 'dev' of https://github.com/badarsh2/Conversations into badarsh2-dev 2017-03-07 17:21:14 +01:00
Daniel Gultsch 254edc48f5 show conversation time as last clear date when empty 2017-03-07 11:46:12 +01:00
Daniel Gultsch 3c951ce2cd set last clear date to time of last message 2017-03-07 11:45:35 +01:00
B Adarsh 87f0c4a646 Modifies notification for MUC conversations
Minor fixes

Replaces html.fromHTML with SpannableString
2017-03-07 16:10:45 +05:30
Daniel Gultsch 5fae9465d1 show snackbar in conversations with stranger to block. fixes #2358 2017-03-07 11:07:57 +01:00
Daniel Gultsch 7306e0286f do not notify for messages from strangers by default 2017-03-07 10:50:46 +01:00
Daniel Gultsch 857c761c68 fixed sender label for empty conversations 2017-03-07 09:22:42 +01:00
Daniel Gultsch 79b2f34685 added colon to seperate sender and message preview. only show first name 2017-03-06 19:42:27 +01:00
Daniel Gultsch 9f3543a650 Merge branch 'message-marker' of https://github.com/hareshkh/Conversations into hareshkh-message-marker 2017-03-06 19:07:27 +01:00
Daniel Gultsch 9ba5335ae7 cleaned code of muc name generator 2017-03-06 19:06:16 +01:00
Haresh Khanna 633aad3193 Adds a message sender label in each conversation for text messages 2017-03-06 23:25:13 +05:30
Daniel Gultsch 1c56b74e41 closing the corresponding conversations after blocking a contact. fixes #2347 2017-03-06 16:53:54 +01:00
Daniel Gultsch 5a00b11594 extract stanza-id from muc reflections 2017-03-06 13:30:13 +01:00
Daniel Gultsch 4a7dbaab1e deduplicate every message with a stanza-id from the server 2017-03-06 11:24:04 +01:00
Daniel Gultsch 6088913fb6 fixed multi-session-nick renaming behaviour 2017-03-05 17:42:17 +01:00
Daniel Gultsch aa24a057fc allow Conversations to access user trust store 2017-03-05 11:42:29 +01:00
Daniel Gultsch cae993a95f renamed enter jid menu item id 2017-03-05 11:40:48 +01:00
Daniel Gultsch bb7780eae6 Merge branch 'issue_#2336' of https://github.com/vikiCoder/Conversations into vikiCoder-issue_#2336 2017-03-05 08:48:01 +01:00
Daniel Gultsch b0ada55b28 use min width of 32dp for swipe handle 2017-03-04 21:20:39 +01:00
Daniel Gultsch f414998307 use default priority notifications. disables heads up notifications 2017-03-04 21:19:55 +01:00
vikiCoder 72537b76c5 fixes #2336 : added an option to directly add a jid to block list from blocklist activity 2017-03-05 01:01:41 +05:30
Daniel Gultsch b86dd584dc made swipe handle more unified and smaller across various screen sizes 2017-03-04 15:07:25 +01:00
Daniel Gultsch cb203f5fd3 Keep draft even when correcting previously sent msg
fixes #1822. Thank you @singhalok641
2017-03-04 08:05:42 +01:00
Daniel Gultsch d166309393 Merge branch 'hareshkh-master' 2017-03-03 23:59:34 +01:00
Haresh Khanna f2d2966b31 Squash : Adds number of unread messages for every conversation. Fixes #2181 2017-03-04 04:26:19 +05:30
Daniel Gultsch 5c789b75cc fixed messages vanishing after pgp raised error on editing a message 2017-03-03 15:21:42 +01:00
Daniel Gultsch 58595fccfe show icons in pop menu with reflection. imagespan was not centred vertically 2017-03-03 12:26:33 +01:00
Daniel Gultsch 768d79c621 Merge branch 'issue_#1200' of https://github.com/vikiCoder/Conversations into vikiCoder-issue_#1200 2017-03-03 12:01:00 +01:00
Daniel Gultsch afa34ce15a block send action while encrypting pgp message 2017-03-03 11:56:08 +01:00
Daniel Gultsch 469cf72e56 make notification icon size depend on 'Large Text' setting 2017-03-03 11:55:07 +01:00
vikiCoder 51ef096e01 fixes #1200 : Added icons for the attach options according to material design guidlines 2017-03-03 16:01:44 +05:30
Daniel Gultsch 8cce653a1f changed default setting for enter_is_send on devices with keyboard 2017-03-02 13:03:30 +01:00
Daniel Gultsch c740386297 rename the Xmlns class to Namespace 2017-03-01 13:01:46 +01:00
Daniel Gultsch ea1e28267b bump mam namespace to :2 2017-03-01 12:50:58 +01:00
Daniel Gultsch ecd53580c0 show 'show inactive keys' button also when there are no active keys 2017-03-01 12:50:46 +01:00
Daniel Gultsch 23a91e5019 use priority low when creating notification without sound/vibration.
should prevent notifcations showing up in ambient display
2017-02-28 15:32:57 +01:00
Daniel Gultsch 4cddf31ad2 properly handle onNewIntent() in StartConversations activity
* fixes a glitch a caused xmpp uris not to open when activiy was already started
2017-02-28 11:48:28 +01:00
Daniel Gultsch 1f4c5ff97c properly trim() incoming imto: uris 2017-02-27 22:48:25 +01:00
Daniel Gultsch c7ec82679f Merge branch 'master' of github.com:siacs/Conversations 2017-02-24 20:00:54 +01:00
Daniel Gultsch 8e0e81a603 bump notification priority to high as per android design guidelines 2017-02-24 19:59:13 +01:00
Daniel Gultsch 0c0ff882a9 make x509 verification node world readable 2017-02-24 19:58:46 +01:00
Daniel Gultsch a28116753a Merge pull request #2315 from licaon-kter/lecagy-typo
Fix a typo in legacy
2017-02-19 18:43:21 +01:00
licaon-kter d3dd80eec9 Fix a typo in legacy 2017-02-19 15:47:57 +02:00
Daniel Gultsch 0d00ff0c15 migrate domain and host exemption into seperate class 2017-02-19 13:05:40 +01:00
Daniel Gultsch abaabae853 only change actionbar display options when changed 2017-02-18 18:08:37 +01:00
Daniel Gultsch 79858278e0 version bump to 1.16.2 + changelog 2017-02-18 18:08:01 +01:00
Daniel Gultsch c69ad8f52c npe checks 2017-02-17 10:26:42 +01:00
Daniel Gultsch cf9ab4d302 synchronize modifications of output stream in tag writer 2017-02-17 10:26:12 +01:00
Daniel Gultsch 4f0e1b71c0 explicitly turn off vibration when disabled. fixes #1255 2017-02-16 13:31:26 +01:00
Daniel Gultsch caa16a8517 experimental mam legacy compat layer 2017-02-15 16:42:35 +01:00
Daniel Gultsch 6e62b62b80 respond to xep-0184 requests in muc pms 2017-02-15 12:09:36 +01:00
Daniel Gultsch c7e95d105c fixed behaviour in message parser when doing mam catchup 2017-02-15 00:08:49 +01:00
Daniel Gultsch bb249e0881 only extract stanza-id from live messages when disco feature is set 2017-02-14 23:16:51 +01:00
Daniel Gultsch b90a1fe1db bump mam namespace 2017-02-14 17:19:45 +01:00
Daniel Gultsch 2665c3a1e0 rethink mam catchup strategies 2017-02-14 16:50:33 +01:00
Daniel Gultsch 9116782cdc fixed adhoc conference creation behaviour. properly show errors. fixes #2290 2017-02-13 17:32:26 +01:00
Daniel Gultsch c8f97be68e only force close tagwriter before creating a new one 2017-02-13 13:01:00 +01:00
Daniel Gultsch 6b81ff70e5 clear avatar cache when system name changes 2017-02-10 20:26:21 +01:00
Daniel Gultsch 5e367cb115 version bump to 1.16.1 + changelog 2017-02-10 14:26:40 +01:00
Daniel Gultsch edb3f57242 pulled translations from transifex 2017-02-10 14:19:36 +01:00
Daniel Gultsch 54ae8abcb7 add no_padding, no_wrap to file upload slots 2017-02-10 13:50:20 +01:00
Daniel Gultsch 82385e38f6 pulled translations from transifex 2017-02-09 20:14:44 +01:00
Daniel Gultsch 55e9067b27 do not auto link non-http URLs 2017-02-09 20:14:36 +01:00
Daniel Gultsch c76b073b8e do not sync thumbnail creation on cache. fixes #2283 2017-02-09 14:32:50 +01:00
Daniel Gultsch f60dd98d3c only count push as available when sm is to avoid race conditions 2017-02-08 16:52:35 +01:00
Daniel Gultsch 7317f5015a version bump to 1.16.0 + changelog 2017-02-08 16:51:49 +01:00
Daniel Gultsch 6569f20737 update shortcut badger. fixes #2268 2017-02-08 10:49:30 +01:00
Daniel Gultsch d9e2ab62b2 add index to message.conversationUuid 2017-02-07 21:17:08 +01:00
Daniel Gultsch 24fab162e2 renamed omemo:// to aesgcm:// 2017-02-07 20:07:57 +01:00
Daniel Gultsch 71ad18beb9 support omemo:// style urls 2017-02-07 19:32:12 +01:00
Daniel Gultsch c37117b940 update copyright information 2017-02-07 19:31:54 +01:00
Daniel Gultsch 6be3ae8ef0 pulled translations from transifex 2017-02-07 17:57:24 +01:00
Daniel Gultsch e35ada4997 only store messages up to a length of 1M chars 2017-02-07 17:45:01 +01:00
Daniel Gultsch 6313c3c92e Merge pull request #2270 from moparisthebest/master
Stop Conversations force closing over sqlite errors due to long messages
2017-02-07 17:35:25 +01:00
Daniel Gultsch 853862ec9c Merge branch 'master' of github.com:siacs/Conversations 2017-02-07 17:31:10 +01:00
Daniel Gultsch e459616123 fixed wording for not getting messages from server 2017-02-07 14:03:48 +01:00
Daniel Gultsch 8ab166e817 fixed scrolling and async loading of message of new conversation start 2017-02-07 14:03:23 +01:00
Daniel Gultsch d7198bd68c fixed rare npe when doing file migration 2017-02-07 10:20:13 +01:00
Daniel Gultsch 6fc67d9a60 catch all throwables when working with content provider to retrieve mime 2017-02-07 10:19:45 +01:00
Daniel Gultsch 5fd91fcd8e Merge pull request #2272 from mimi89999/patch-3
Correct a typo in the README
2017-01-31 21:45:43 +01:00
Michel Le Bihan cd3ce76115 Correct a typo in the README 2017-01-31 18:09:42 +01:00
Travis Burtrum 2a34ece571 Stop Conversations force closing over sqlite errors due to long messages 2017-01-30 00:03:51 -05:00
Daniel Gultsch 8a1ebf2bbe Merge pull request #2260 from alexara/patch-1
Fixed typos in the readme
2017-01-26 19:45:29 +01:00
Daniel Gultsch 0d199c8ceb Update README.md 2017-01-26 19:45:06 +01:00
Daniel Gultsch 7651700c2a Merge branch 'master' into patch-1 2017-01-26 19:42:57 +01:00
Daniel Gultsch eea1bc8090 Merge pull request #2259 from mabkenar/patch-2
small typo fix
2017-01-26 19:40:57 +01:00
Daniel Gultsch 53241f2ef1 add explicit encryption hints to outgoing messages 2017-01-26 19:19:08 +01:00
alexara e4524e2c7b Fixed typos in the readme 2017-01-26 19:18:22 +01:00
Daniel Gultsch c9e6d05fa0 use base64 encoding for file names uploaded with http 2017-01-26 18:39:25 +01:00
Masoud Abkenar be84443921 small typo fix 2017-01-26 16:46:19 +01:00
Daniel Gultsch bbceee7f61 pulled translation from transifex 2017-01-26 12:35:34 +01:00
Daniel Gultsch 40ee1a0bfc reset messagesLoaded when changing retention settings 2017-01-25 18:35:22 +01:00
Daniel Gultsch a86b2fefd9 add database and file migrations for 1.16.0 2017-01-25 13:22:20 +01:00
Daniel Gultsch f2d9539d90 share uri for bookmark direclty from Start Conversation 2017-01-25 00:15:50 +01:00
Daniel Gultsch 66457c9f2e transcode videos before sharing. change storage location 2017-01-24 20:17:36 +01:00
Daniel Gultsch 9b6ae6d75f configurable local message retention period. (untested) 2017-01-23 17:14:30 +01:00
Daniel Gultsch 4c6ef3b24e cleaning up crypto targets when conference member is getting removed 2017-01-22 18:58:49 +01:00
Daniel Gultsch b48bf39e08 change behaviour of back button to close finish activity. fixes #704 2017-01-22 18:26:47 +01:00
Daniel Gultsch 7035f38e0b Merge branch 'master' of github.com:siacs/Conversations 2017-01-22 13:08:44 +01:00
Daniel Gultsch d53c813408 make sure to set open conversations after connection with background service 2017-01-22 13:08:21 +01:00
Daniel Gultsch b72d7ec8d0 make sure to properly stop tagwriter 2017-01-22 12:54:39 +01:00
Daniel Gultsch 5dde977233 upgrade dependency to ShortcutBadger 2017-01-22 12:37:16 +01:00
Daniel Gultsch 2f4eee1fa7 Merge pull request #2230 from AnBuKu/patch-1
Added XEP-0384
2017-01-22 10:41:45 +01:00
Daniel Gultsch 96a6460744 don't quote text when '>' is followed by numeber 2017-01-21 11:07:23 +01:00
Daniel Gultsch 780d1daf7e fixed some issues around ibb 2017-01-20 22:37:50 +01:00
Daniel Gultsch 0f870223c4 version bump to 1.15.5 + changelog 2017-01-20 15:03:01 +01:00
Daniel Gultsch 5faa05ca19 pulled translations from transifex 2017-01-20 15:02:19 +01:00
Daniel Gultsch 97ba0a0d49 write text in bold when highlighted in received muc message 2017-01-20 14:54:59 +01:00
Daniel Gultsch cb9c4d4327 disable automatic foreground enabler. fixes #2239 2017-01-20 14:21:59 +01:00
Daniel Gultsch c324f0c8df modified highlight nick behaviour to better work with quotes 2017-01-20 13:45:09 +01:00
Daniel Gultsch 59f82cbd34 fixed regression introduced in previous commit. 2017-01-20 13:44:29 +01:00
Daniel Gultsch 143ad48be1 don't prematurly mark conversation as read during activity start. fixes #2245 2017-01-20 10:43:50 +01:00
Daniel Gultsch 1dcf804618 fixed pgp encrypted text quick sharing. fixes #2237 2017-01-17 15:56:21 +01:00
Daniel Gultsch ac2eee8e81 Merge pull request #2233 from SamWhited/scram-sha-2
Add SCRAM-SHA-2 support
2017-01-16 13:14:48 +01:00
Daniel Gultsch 764026b87e fixed behaviour with non-default encryption masks 2017-01-16 13:09:36 +01:00
Daniel Gultsch 7219e077f4 version bump to 1.15.4 + changelog 2017-01-16 12:07:50 +01:00
Sam Whited bfc2cffc2f Add SCRAM-SHA-2 support 2017-01-15 23:43:44 -06:00
Daniel Gultsch f7c5a5c42e pulled translations from transifex 2017-01-15 19:22:18 +01:00
Daniel Gultsch 9bdd2bf1ae Merge branch 'master' of github.com:siacs/Conversations 2017-01-15 18:55:15 +01:00
Daniel Gultsch d028f4b398 refactored whispermessage processing 2017-01-15 18:54:47 +01:00
Daniel Gultsch b085426d22 fixed linkifier 2017-01-15 18:54:15 +01:00
Daniel Gultsch a71e3d0653 pulled translations from transifex 2017-01-14 18:10:18 +01:00
Daniel Gultsch 8f39a594ff partially improved logging for receiving omemo messages 2017-01-14 18:10:04 +01:00
Daniel Gultsch ebf8ae231a fixed subheading of domain hosting faq entry 2017-01-13 12:14:27 +01:00
Daniel Gultsch aa7bfe9fe7 update readme to refer to domain hosting 2017-01-13 12:12:09 +01:00
Daniel Gultsch b2e9b4aeb1 pulled translations from transifex 2017-01-12 23:28:30 +01:00
Daniel Gultsch 8e025cbb9e show doze warning when push is running on prosody 2017-01-12 23:22:02 +01:00
Daniel Gultsch 1876b444fa refactor getServerIdentity() to parse disco result directly 2017-01-12 23:17:52 +01:00
Daniel Gultsch c03e3b5965 don't include 'before' reference in mam queries bound by timestamp 2017-01-12 20:56:55 +01:00
Daniel Gultsch fd7216b6a0 finish of backlog only for one particular account 2017-01-12 20:56:27 +01:00
Daniel Gultsch 585a538340 don't show key tile in contact details when there are no keys 2017-01-12 20:50:53 +01:00
Daniel Gultsch b050ff2576 only call UI thread from downloading thread every 250ms 2017-01-12 16:02:09 +01:00
Daniel Gultsch bfacc180c5 don't allow to purge keys. offer distrut instead 2017-01-12 15:59:13 +01:00
Daniel Gultsch 2c1d3ef968 fixed avatar republish missing the mime type 2017-01-12 12:20:10 +01:00
AnBuKu 313baca84e Added XEP-0384
Maybe style [XEP-0384: OMEMO Encryption](http://xmpp.org/extensions/xep-0384.html) would be better for user's convenience; of course for other XEP's as well
2017-01-10 15:18:01 +01:00
Daniel Gultsch f0c3b31a42 treat omemo keys >= 32 bytes as containing auth tag. add config flag to put auth tag in key 2017-01-09 21:47:07 +01:00
Daniel Gultsch a1cb855739 adding prekey='true' to omemo messages if applicable 2017-01-09 20:20:02 +01:00
Daniel Gultsch ef4ed90811 pulled translations from transifex 2017-01-09 19:54:44 +01:00
Daniel Gultsch 39bb8ad05f automatically bookmark private, non-anonymous mucs where inviter is trusted. fixes #2035 #937 2017-01-09 19:54:27 +01:00
Daniel Gultsch b09b8136d2 version bump to 1.15.3 + changelog 2017-01-09 19:52:46 +01:00
Daniel Gultsch a994d8f847 fixed typo in variable name 2017-01-09 18:05:58 +01:00
Daniel Gultsch b19572ba8c use 7.1 web url pattern matching on old platforms as well. fixes #2228 2017-01-09 17:58:11 +01:00
Daniel Gultsch d192c529e0 add spaces to otr fingerprints copied to clipboard. fixes #2226 2017-01-09 17:57:37 +01:00
Daniel Gultsch b116926bb1 unify getFileUri across share and open intents 2017-01-09 17:00:08 +01:00
Daniel Gultsch 39c8867ed7 add more punctuations to message preview 2017-01-06 20:56:44 +01:00
Daniel Gultsch 1269123816 Merge pull request #2224 from illegalprime/fix-travis-android-25
Updated travis and Trust Manager to fix build
2017-01-06 20:46:27 +01:00
Michael Eden cd772360db updated travis and trust manager 2017-01-06 14:28:57 -05:00
Daniel Gultsch 4a299920dc add overlay to indicate that image is gif 2017-01-03 14:05:10 +01:00
Daniel Gultsch e6ba8484fa update build tools and some dependencies 2017-01-03 12:33:46 +01:00
Daniel Gultsch 470d244414 Merge branch 'feature-gboardgifs' of https://github.com/illegalprime/Conversations into illegalprime-feature-gboardgifs 2017-01-03 11:44:14 +01:00
Daniel Gultsch 2bb7bc1455 show offline contacts as grayed out in conference details 2017-01-03 11:40:29 +01:00
Michael Eden 5a670c88b0 Do not compress GIFs, allow GBoard to send GIFs 2017-01-01 16:16:35 -05:00
Daniel Gultsch fa70bd7536 disable automatic foreground service activation if related config paramaters are set to zero 2016-12-30 20:24:35 +01:00
Daniel Gultsch b8b2051f4c get rid of unecessary config debug paramater that has been replaced by exepert setting 2016-12-30 20:23:50 +01:00
Daniel Gultsch 8c34bb3c6f hide inactive devices by default in contact details 2016-12-30 13:17:45 +01:00
Daniel Gultsch 40a9f70478 always open account details when scanning one of our own keys. fixes #2211 2016-12-29 12:50:18 +01:00
Daniel Gultsch fcd9ab17fe don't throw assertion error when building session with same device id from other contact 2016-12-28 22:15:24 +01:00
Daniel Gultsch b8f67bfaa3 deduplicate corrected messages 2016-12-26 15:13:38 +01:00
Daniel Gultsch 82c2e89d21 stop using broken parallax distance in sliding pane layout 2016-12-25 18:57:30 +01:00
Daniel Gultsch 593dd259a9 version bump to 1.15.2 + changelog 2016-12-23 21:27:27 +01:00
Daniel Gultsch c43f224e8b pulled translations from transifex 2016-12-23 21:22:16 +01:00
Daniel Gultsch 9972f5eabc fixed npe cause by race condition when axolotl service isn't initialized 2016-12-23 21:19:38 +01:00
Daniel Gultsch 28c64c2bd1 skip empty lines in message preview. prevents indexoutofbounds exception 2016-12-23 21:19:11 +01:00
Daniel Gultsch d03c431137 use original message to parse pep 2016-12-23 21:16:58 +01:00
Daniel Gultsch 6c10f8a232 version bump to 1.15.1+ changelog 2016-12-21 14:04:56 +01:00
Daniel Gultsch f77afd9596 pulled translations from transifex 2016-12-20 16:38:07 +01:00
Daniel Gultsch b011d46ff2 don't show quoted text in message preview 2016-12-20 16:35:08 +01:00
Daniel Gultsch e5fff42b10 added omemo padding but disabled by Config.java flag 2016-12-20 16:12:12 +01:00
Daniel Gultsch fbbf1a37b4 disable removing of broken devices by default 2016-12-18 11:49:27 +01:00
Daniel Gultsch dbda2afd6d remove broken devices only once to prevent loops 2016-12-18 11:47:42 +01:00
Daniel Gultsch 87746ca2ba remove own fetch errors from device announcement 2016-12-16 17:12:26 +01:00
Daniel Gultsch da914ba09c make sure to display encryption indicatior 2016-12-16 11:30:51 +01:00
Daniel Gultsch 75ee14cfdf don't reconnect accout when system reports no internet connection 2016-12-10 13:20:05 +01:00
Daniel Gultsch 55b60f6b0f don't correct a message if that would create a duplicate 2016-12-09 20:03:48 +01:00
Daniel Gultsch 88321c1e8c use POSH only when system CAs are trusted 2016-12-09 19:56:49 +01:00
Daniel Gultsch 8abfbf82fa use verified symbol instead of colored lock icons 2016-12-09 18:46:32 +01:00
Daniel Gultsch 8d127f70d0 follow redirects in posh 2016-12-08 14:21:15 +01:00
Daniel Gultsch 8eb292d16a don't show unavailable quick actions in settings 2016-12-06 23:44:39 +01:00
Daniel Gultsch 1739af2a41 fixed http resume 2016-12-06 23:27:29 +01:00
Daniel Gultsch b879fb3753 don't use posh for IPs and set a 5s timeout 2016-12-06 12:23:40 +01:00
Daniel Gultsch cbc9c1fb20 add support for RFC7711 to MTM 2016-12-05 21:52:44 +01:00
Daniel Gultsch 1e7b4030bb show jid monospaced in verify dialog 2016-12-04 13:39:08 +01:00
Daniel Gultsch 1a89915b31 disable 'show blocklist' if blocklist is empty. fixes #2164 2016-12-03 23:49:00 +01:00
Daniel Gultsch a5b3c579c4 redraw options menu after rotation in muc details. fixes #2161 2016-12-03 23:25:31 +01:00
Daniel Gultsch 56991bbaeb add omemo fingerprints to web links as well 2016-12-03 13:37:26 +01:00
Daniel Gultsch 6e289b8738 show warning dialog beforing verifying keys via a link 2016-12-03 13:19:56 +01:00
Daniel Gultsch 599f7dad2c Merge branch 'feature-quotation' of https://github.com/Mishiranu/Conversations into Mishiranu-feature-quotation 2016-12-02 14:01:26 +01:00
Daniel Gultsch d4b1119240 default using internal storage to false 2016-12-02 11:35:00 +01:00
Daniel Gultsch 6b0242523b Merge branch 'master' of https://github.com/Fenisu/Conversations into Fenisu-master 2016-12-02 11:25:14 +01:00
Daniel Gultsch 5d4aa04e5d support for jid escapting when displaying localpart only 2016-12-01 20:49:18 +01:00
Daniel Gultsch 58de10bcab use prepped string when building axolotl session 2016-12-01 20:48:39 +01:00
Daniel Gultsch e127ba9361 don't use own jid joined from another client to generate muc title 2016-12-01 19:57:40 +01:00
Daniel Gultsch 6e95ad4bdf don't show share button before account is setup 2016-12-01 13:07:18 +01:00
Daniel Gultsch 168ad50ddd only show contact related snackbars when conversation is single 2016-12-01 12:50:40 +01:00
Daniel Gultsch f0f2aab92d made provider authorities relativ to deal with different package ids 2016-12-01 12:09:49 +01:00
Daniel Gultsch 96a992353b avoid binding multiple times from BarcodeService 2016-12-01 11:34:04 +01:00
Daniel Gultsch c62f3f99be increment version code and release version 1.15.0 2016-11-30 10:48:30 +01:00
Daniel Gultsch a7ec23ef30 pulled translations from transifex 2016-11-30 10:47:25 +01:00
Daniel Gultsch 1b9a91eb2f renamed foreground service preference 2016-11-30 10:45:39 +01:00
Daniel Gultsch 9d744add38 pulled translations from transifex 2016-11-29 13:51:34 +01:00
Daniel Gultsch 9e7a54849d better handle the case when same user is joined with multiple nicks in the same room 2016-11-29 13:43:52 +01:00
Daniel Gultsch 33e6d8a1ce pulled translations from transifex 2016-11-28 15:51:52 +01:00
Daniel Gultsch e5d7357e6e mark conversations as read after receiving blocklist push for that conversations 2016-11-28 15:51:11 +01:00
Daniel Gultsch 84a2fa0041 allow fingerprint verification via context menu 2016-11-28 15:11:44 +01:00
Daniel Gultsch bbe01c9a6a add support for body paramater in xmpp uri 2016-11-28 15:09:02 +01:00
Daniel Gultsch fb6f0649c3 sent messages from unverified devices show red lock 2016-11-28 15:08:33 +01:00
Daniel Gultsch fdf19ae287 pulled translations from transifex 2016-11-25 17:06:23 +01:00
Daniel Gultsch d983f0bc71 fixed migrations from pre-btbv phase 2016-11-25 17:04:23 +01:00
Daniel Gultsch 22ca8200fa Merge branch 'master' of github.com:siacs/Conversations 2016-11-25 16:58:37 +01:00
Daniel Gultsch 988cce6320 Merge pull request #2147 from licaon-kter/patch-5
Typo in Readme
2016-11-25 16:57:43 +01:00
Mishiranu f4a769080b Add quotation support 2016-11-25 17:06:43 +03:00
Daniel Gultsch f36dff485e changed blind trust before verification summary to a slightly longer one 2016-11-24 19:59:57 +01:00
licaon-kter 6320a3ca7c Typo in Readme 2016-11-24 18:35:10 +02:00
Daniel Gultsch 43fd5e5fe6 Merge pull request #2146 from licaon-kter/patch-4
Add FAQ about the new trust concept
2016-11-24 15:39:51 +01:00
licaon-kter 84a4f4d66d Add FAQ about the new trust concept 2016-11-24 15:17:02 +02:00
Daniel Gultsch a87f7903c6 always force close a connection when disabling from error state 2016-11-24 12:44:24 +01:00
Daniel Gultsch 1e59a9517a bumped gradle to 1.15.0-beta 2016-11-24 12:06:15 +01:00
Daniel Gultsch 6a5d2e35b5 pulled translations from transifex 2016-11-24 12:05:52 +01:00
Daniel Gultsch cbd45d3ee5 changed design language to match BTBV proposal
* untrusted messages have red background
* unverified message have normal background and red lock
2016-11-24 11:29:26 +01:00
Daniel Gultsch 2ec7165381 update the conversations view (and the lock icon) after receiving device list 2016-11-24 11:28:04 +01:00
Daniel Gultsch 20d3a41b52 explictly scan for aztec and qr codes only 2016-11-23 11:01:58 +01:00
Daniel Gultsch 839ef8e14b introduced blind trust before verification mode
read more about the concept on https://gultsch.de/trust.html
2016-11-23 10:42:27 +01:00
Daniel Gultsch 4720ac94d3 Merge branch 'master' of github.com:siacs/Conversations 2016-11-22 22:32:05 +01:00
Daniel Gultsch 07fe434cc7 added share button to account details 2016-11-22 22:31:46 +01:00
Daniel Gultsch d2268c6a6f show proper avatar for 'self' contact. fixes #2138 2016-11-22 12:34:16 +01:00
Daniel Gultsch d76b0a3104 offer verification directly from the trust keys screen 2016-11-22 12:03:21 +01:00
Daniel Gultsch 1a7e0fd153 use aztec code instead of qr 2016-11-21 12:01:01 +01:00
Daniel Gultsch 6631705aea use constants for some preferences 2016-11-21 11:03:38 +01:00
Daniel Gultsch 7b99346a4b when swiping don't clean startup counter entirely. just don't count last startup 2016-11-21 10:48:59 +01:00
Daniel Gultsch 1c31b96920 Merge pull request #2130 from da2x/patch-2
Fix up the langauge in some Settings strings
2016-11-20 00:39:57 +01:00
Daniel Gultsch 568d6c8392 Merge branch 'master' of github.com:siacs/Conversations 2016-11-20 00:39:25 +01:00
Daniel Gultsch 64e8035f6d introduced custom tls socket factory to make tls1.2 work for http connections 2016-11-20 00:39:01 +01:00
Daniel Gultsch b71aa6d3a4 remove omemo devices from annoucement after 7 days of inactivity 2016-11-19 21:39:16 +01:00
Daniel Gultsch 2614706d39 don't show omemo keys by default in account details 2016-11-19 21:32:40 +01:00
Daniel Gultsch cb639f3fdd don't use xmpp uri for self verification if account is disabled 2016-11-19 21:31:41 +01:00
Daniel Gultsch 6362799d56 save last activation time in fingerprint status 2016-11-19 13:34:54 +01:00
Daniel Gultsch 40c747660d removed some unecessary locking 2016-11-19 13:34:27 +01:00
Daniel Gultsch 8132480b82 close socket after failed stream open 2016-11-19 12:20:31 +01:00
Daniel Gultsch 3bf2876e09 check if thread was interrupted before doing operations on socket 2016-11-19 10:44:40 +01:00
Daniel Gultsch 1820b163a1 fixed regression that would crash create contact dialog. fixes #2131 2016-11-19 10:29:08 +01:00
Daniel Aleksandersen 965f73f95a Fix up the langauge in some Settings strings 2016-11-19 05:00:16 +01:00
Daniel Gultsch 2b9b3be3f1 show 'clear devices' button underneath own devices 2016-11-18 21:49:52 +01:00
Daniel Gultsch a86a36f570 removed some unecessary logging from omemo message generation 2016-11-18 20:13:09 +01:00
Daniel Gultsch 01f92ef4ee lower own otr fingerprint 2016-11-18 20:12:45 +01:00
Daniel Gultsch d68b7cfcfc issue ping after network change 2016-11-18 14:00:05 +01:00
Daniel Gultsch fef601b4ae lower reconnection time 2016-11-18 13:58:01 +01:00
Daniel Gultsch 0303c28ad9 synchronzie on xmpp service around all state changes 2016-11-18 13:58:01 +01:00
Daniel Gultsch 1ed2445c1d don't reset last connect time on network change 2016-11-18 13:55:02 +01:00
Daniel Gultsch a7ee8f8a74 use lower case otr fingerprints for comparison 2016-11-18 13:13:29 +01:00
Daniel Gultsch 9d9a9e63ad removed some very verbose logging from axolotl service 2016-11-18 13:03:02 +01:00
Daniel Gultsch 99a41265b8 lower casing fingerprints when parsing URI 2016-11-18 13:02:33 +01:00
Daniel Gultsch 7ec38bd202 added section to FAQ about default encryption 2016-11-18 12:03:02 +01:00
Daniel Gultsch 211354ee26 put omemo fingerprint in own uri (qr code / nfc) 2016-11-17 22:28:45 +01:00
Daniel Gultsch 7e2e42cb11 parse omemo fingerprints from uris 2016-11-17 20:09:42 +01:00
Daniel Gultsch 3f3b360eee fixed back and forth between Welcome- and EditAccountActivity 2016-11-17 11:40:29 +01:00
Daniel Gultsch ad9a8c2281 use base64.nowrap for omemo keys 2016-11-17 10:58:44 +01:00
Daniel Gultsch 4d965e96ed reset startup count when swiped away (only count kills) 2016-11-17 10:58:26 +01:00
Daniel Gultsch 5007aa1b07 update shortcut badger 2016-11-16 14:03:25 +01:00
Daniel Gultsch d8bff08f1f slightly darken verified icon + mark inactive 2016-11-16 09:39:44 +01:00
Daniel Gultsch ec63900ef3 work around -1 in next encryption 2016-11-15 21:11:35 +01:00
Daniel Gultsch 48afeb571b refactor omemo fingerprint UI code 2016-11-15 20:00:52 +01:00
Daniel Gultsch e84af51272 distinguish between general i/o error and write exception when copying files 2016-11-15 15:43:04 +01:00
Daniel Gultsch d61b00604d fixed enabling trust toggle. unknown->untrusted 2016-11-15 15:14:21 +01:00
Daniel Gultsch 05fc15be3d refactore trust enum to be FingerprintStatus class with trust and active 2016-11-14 22:27:41 +01:00
Daniel Gultsch 6da8b50d95 increase restart threshold 2016-11-14 19:49:17 +01:00
Daniel Gultsch a753e28ad2 pulled ru translation from transifex 2016-11-13 19:26:27 +01:00
Daniel Gultsch 1d3167b520 extract affiliations from unavailable presence 2016-11-13 19:25:58 +01:00
Daniel Gultsch 035d0c7957 Stop automagically select default encryption
Selecting a default encryption (in our case OMEMO) has several down sides.
First of all users might have perfectly valid reasons not to use encryption
at all such as using the same private server. Second of all the way it was
implemented Conversations would automatically fall back to plain text as soon
as the conditions changed (recipient switches to device with no encryption)
which lead to unexpected situations.
Thirdly having a default encryptions speaks against the 'mission
statement' of Conversations of not forcing its security and privacey
aspects upon the user.
And last but not least the goal of implementing this feature in the
first place: Be encrypted by default didn't work at all. I don't think
there was a single user that we succesfully 'tricked' into using OMEMO
who otherwise wouldn't have used it.
2016-11-13 17:11:13 +01:00
Daniel Gultsch bec048407a offer message correction in private convs 2016-11-12 20:25:02 +01:00
Daniel Gultsch fe62ef32ae don't add outcasts or non-members in members-only rooms back to list 2016-11-12 20:21:11 +01:00
Daniel Gultsch f7c2cd4807 pulled translations from transifex 2016-11-11 15:01:31 +01:00
Daniel Gultsch e8cc959a7f don't offer message correction in anonymous mucs 2016-11-11 15:01:15 +01:00
Daniel Gultsch bd578c59bf version bump to 1.14.9 + changelog 2016-11-08 21:38:12 +01:00
Daniel Gultsch bb4952c89e pulled translations from transifex 2016-11-08 21:37:59 +01:00
Daniel Gultsch 698ddadbee brought restart threshold down to 8 times in 8h 2016-11-08 21:37:44 +01:00
Daniel Gultsch 1ef8d0a746 don't mark previous conversation as read when processing pending intent. fixes #2079 2016-11-08 12:42:13 +01:00
Daniel Gultsch bca8f11c9c add frequent restart detection 2016-11-08 12:20:07 +01:00
Ignacio Quezada 297c0a792f Private files using a boolean flag from Config.java. 2016-11-08 11:45:20 +01:00
Daniel Gultsch 1a57599da2 lower case incoming dns records 2016-11-08 10:14:34 +01:00
Daniel Gultsch 00b3d5ee35 Merge branch 'master' of github.com:siacs/Conversations 2016-11-08 10:08:58 +01:00
Daniel Gultsch b3c19f039c Merge pull request #2108 from licaon-kter/patch-2
Fix typo
2016-11-08 10:08:48 +01:00
licaon-kter d341904c4d Fix typo 2016-11-08 01:46:46 +02:00
Daniel Gultsch 7978fd768e fixed regression of showing delivery failed after receipt 2016-11-07 21:57:08 +01:00
Daniel Gultsch b390908610 Merge pull request #2105 from ReadmeCritic/master
Fix typos in README
2016-11-07 17:58:47 +01:00
ReadmeCritic 64ad93dad6 Fix typos in README 2016-11-07 08:46:35 -08:00
Daniel Gultsch 9edbddd7e1 show warning in account details when data saver is enabled 2016-11-07 10:49:43 +01:00
Daniel Gultsch d369ec767f expanded section on adb in readme 2016-11-02 15:21:45 +01:00
Daniel Gultsch 2c004857f6 handle file attachment when missing connection 2016-11-02 15:21:26 +01:00
Daniel Gultsch 544c5b4a21 removed unnecessary push_mode 2016-11-02 11:04:33 +01:00
Daniel Gultsch e582b9fc10 leaving low ping timeout mode after coming online 2016-11-02 09:36:14 +01:00
Daniel Gultsch e538272417 version bump to 1.14.8 + changelog 2016-11-01 10:27:19 +01:00
Daniel Gultsch 20ddba2aa9 fixed npe when jingle partner is using unknown candidate 2016-11-01 10:27:01 +01:00
Daniel Gultsch 07a71d312a extracting stanza-id where by=account 2016-10-31 12:07:08 +01:00
Daniel Gultsch a5181b22e0 always use ipv4 localhost when using orbot http proxy 2016-10-31 09:53:14 +01:00
Daniel Gultsch ffebb4677a Revert "use file provider on android M as well"
This reverts commit a4020e85f6.
2016-10-30 20:27:39 +01:00
Daniel Gultsch a44f35ed69 schedule correct wakeup call when in low ping timeout mode 2016-10-29 21:45:01 +02:00
Daniel Gultsch 1e4b1a3346 version bump to 1.14.7 + changelog 2016-10-26 12:28:18 +02:00
Daniel Gultsch 8557120ef8 add error message to failed messages. accessible via context menu 2016-10-26 12:26:04 +02:00
Daniel Gultsch a4020e85f6 use file provider on android M as well 2016-10-23 09:03:36 +02:00
Daniel Gultsch 8c1bb058da connect instantly in low ping mode after going offline 2016-10-23 09:03:17 +02:00
Daniel Gultsch 10398cab51 don't leave low timeout mode prematurely 2016-10-20 20:04:16 +02:00
Daniel Gultsch f2696b66ba Merge branch 'feature-remove-merge-separator' of https://github.com/Mishiranu/Conversations into Mishiranu-feature-remove-merge-separator 2016-10-20 18:18:25 +02:00
Daniel Gultsch 52d4be4249 Merge branch 'feature-remove-spans' of https://github.com/Mishiranu/Conversations into Mishiranu-feature-remove-spans 2016-10-20 18:10:52 +02:00
Daniel Gultsch 0f62ff6736 introduced low ping timeout mode after gcm push 2016-10-20 18:02:11 +02:00
Daniel Gultsch 44ce5df359 write prepped string to db. use display version everywhere else 2016-10-20 17:31:46 +02:00
Mishiranu fd4e15ba97 Remove MERGE_SEPARATOR 2016-10-20 01:03:51 +03:00
Mishiranu 8835f08cf7 Remove spans on copying or pasting a text 2016-10-19 20:47:41 +03:00
Daniel Gultsch c3423d6ffe include pgp signature only in non anonymous mucs 2016-10-19 12:31:11 +02:00
Daniel Gultsch dce8149aae retrigger key selection if openpgp key was deleted 2016-10-19 11:53:55 +02:00
Daniel Gultsch 7226fc0010 update conversation in database background thread 2016-10-18 13:06:24 +02:00
Daniel Gultsch 50780debf7 don't trigger context menu in message adapter manually. fixes #2077 2016-10-18 11:16:43 +02:00
Daniel Gultsch f8c21caec9 Merge branch 'feature-selection' of https://github.com/Mishiranu/Conversations into Mishiranu-feature-selection 2016-10-17 09:53:32 +02:00
Daniel Gultsch 22d13a3dcd add exception handling when loading default resource 2016-10-17 09:53:08 +02:00
Daniel Gultsch dc02e2b498 small code reformation in pgp decryption service 2016-10-17 09:52:43 +02:00
Daniel Gultsch 6371d2b7a9 Merge pull request #2063 from thacoon/patch-1
Fix OpenPGP link
2016-10-13 12:21:54 +02:00
Daniel Gultsch 2a73b8d76e clarified fineprint a little bit 2016-10-13 12:17:20 +02:00
Daniel Gultsch f6cfa27741 synchronize access to json key storage in account model 2016-10-13 11:27:26 +02:00
Daniel Gultsch 501152bcfd version bump to 1.14.6 + changelog 2016-10-10 17:54:34 +02:00
Daniel Gultsch 9e54fd5c92 don't use sending state on muc pms without smacks 2016-10-09 19:40:30 +02:00
Daniel Gultsch cd1c05a7c3 add password to direct muc invite 2016-10-09 19:40:03 +02:00
Daniel Gultsch f7d51b8890 pulled more translations from transifex 2016-10-09 18:06:19 +02:00
Daniel Gultsch c5bdb04490 pulled translations from transifex 2016-10-09 11:13:45 +02:00
Daniel Gultsch 74087b873f added disclaimer that conversations.im account is 8 euro / year 2016-10-08 18:24:20 +02:00
Constantin Soffner ad8b9eb054 Fix OpenPGP link
I have just updated the link to the OpenPGP website.
2016-10-08 14:40:13 +02:00
Daniel Gultsch f3ef8d4978 fetch new conference configuration on every conf update 2016-10-08 12:10:53 +02:00
Daniel Gultsch 9efef24a04 reset sending to waiting on every error 2016-10-07 14:54:35 +02:00
Daniel Gultsch 5a73a6b139 fixed account hash calculation 2016-10-07 14:54:06 +02:00
Daniel Gultsch 1f7f82da7b respond to chat marker request only when mutual presence subscription exists 2016-10-07 10:05:08 +02:00
Daniel Gultsch 26e33de79a create new instances of key manager every time it's used 2016-10-07 10:04:36 +02:00
Daniel Gultsch 187825d6c6 warn user if account is offline during avatar publication 2016-10-06 22:06:09 +02:00
Daniel Gultsch 6d5f23213b refresh error notification after 'try again' 2016-10-06 22:05:40 +02:00
Daniel Gultsch 0af13fc746 be more careful parsing integers in omemo 2016-10-06 22:05:18 +02:00
Daniel Gultsch 5530b0b0e2 Merge branch 'master' of github.com:siacs/Conversations 2016-10-06 18:39:19 +02:00
Daniel Gultsch 40e5090bdd issue ping after push was received 2016-10-06 18:09:55 +02:00
Daniel Gultsch 9f060f477f parse smacks delay from messages 2016-10-06 18:09:44 +02:00
Daniel Gultsch 8d8cb92e43 try to fix messages stuck at sending 2016-10-06 17:23:35 +02:00
Daniel Gultsch 27af6a4b1e Add client recommandition to readme. fixes #2048 2016-10-05 09:05:53 +02:00
Daniel Gultsch 082c06a486 make error notification dismissable. fixes #1815 2016-10-04 11:16:59 +02:00
Daniel Gultsch 5ac0e9267d fixed omemo shown as unavailable in 1:1 chats 2016-10-03 21:04:10 +02:00
Daniel Gultsch cea52b0722 resolve take photo uri for internal use 2016-10-03 18:26:11 +02:00
Daniel Gultsch f4a883848c properly index take photo uris from file provider 2016-10-03 11:25:15 +02:00
Daniel Gultsch b6e7def9db add more logging to attaching file process 2016-10-03 11:13:04 +02:00
Daniel Gultsch 7c6d1d19d5 when activating omemo in conference always check preferences 2016-10-03 10:42:43 +02:00
Daniel Gultsch dcd6ef8f84 explicit logging when copying files to storage 2016-10-03 10:13:45 +02:00
Daniel Gultsch d6c2ff9782 version bump to 1.14.5 + changelog 2016-10-01 15:49:09 +02:00
Daniel Gultsch b0fb9fd9ee added nick to conference jid example 2016-09-28 13:20:52 +02:00
Daniel Gultsch e275fd8143 Merge pull request #2027 from danielegobbetti/wear-reply-dismiss-notification
Dismiss the notification when replying from a wear notification [needs review!]
2016-09-28 12:39:00 +02:00
Daniel Gultsch 43f5dfe174 simplified code that invokes the export logs service 2016-09-28 12:35:52 +02:00
Daniel Gultsch f0dbcce58f expert 'setting' to remove omemo identity. fixes #2038 2016-09-28 12:24:50 +02:00
Daniele Gobbetti 41db773b08 Allow to dismiss the notification from a wear reply.
- use different IDs in the same method for the PendingIntent
- fix reply for GPG encrypted replies (untested)
2016-09-27 17:39:23 +02:00
Daniel Gultsch 5cd8917122 remove dubplicate play service dependency from build 2016-09-27 11:45:11 +02:00
Daniel Gultsch bb48f67a30 always use ipv4 localhost for Orbot connections 2016-09-27 11:44:50 +02:00
Daniel Gultsch 1339b9c464 don't reset encryption choice to auto on archiving 2016-09-24 21:29:00 +02:00
Daniel Gultsch cee3c98a23 version bump to 1.14.4 + changelog 2016-09-24 21:24:55 +02:00
Daniel Gultsch 343d895a26 don't react to null and empty voice replies 2016-09-21 19:04:16 +02:00
Daniel Gultsch 13ed27f91e don't use file provider for photo uris on android < N. fixes #2030 2016-09-21 18:20:53 +02:00
Daniel Gultsch 401759cdc7 don't wait for disco when not having stream managment 2016-09-21 12:55:40 +02:00
Daniel Gultsch 61f58b3dbd add timeouts to HTTPUrlConnections and allow cancelation of all sending files 2016-09-20 20:02:25 +02:00
Daniel Gultsch de7c0c5121 Merge pull request #2028 from Mishiranu/feature-more-tables
Fix "Server info" table layout
2016-09-20 16:43:51 +02:00
Mishiranu 9aaa5b78f4 Update Russian translation 2016-09-20 16:15:46 +03:00
Mishiranu 18ab826413 Fix "More table" layout
Retain "More table" visibility on screen orientation change
2016-09-20 16:10:25 +03:00
Daniel Gultsch 5790d4c4ab fixed styling in blocking dialog 2016-09-20 14:21:41 +02:00
Daniel Gultsch 98ab9beec7 version bump to 1.14.3 + changelog 2016-09-20 11:25:33 +02:00
Daniel Gultsch 7bda624723 pulled translations from transifex 2016-09-20 11:22:26 +02:00
Daniel Gultsch 7eac903277 add support for XEP-0377: Spam Reporting 2016-09-18 23:21:05 +02:00
Daniel Gultsch badc97e280 don't simply ignore null in message body but try to avoid it 2016-09-18 22:15:02 +02:00
Daniel Gultsch 7c608c8862 recreate activities when theme changed 2016-09-18 20:26:47 +02:00
Daniel Gultsch 6b904d4de1 use proper paddings in dialogs on android < 5 2016-09-18 20:09:39 +02:00
Mishiranu 858a327299 Retain TextView selection after list updating 2016-09-18 16:35:14 +03:00
Daniel Gultsch 7bdd4166c0 catch all throwables when loading contacts 2016-09-17 11:31:35 +02:00
Daniel Gultsch 00c04cd413 version bump to 1.14.2 + changelog 2016-09-17 11:30:52 +02:00
Mishiranu 3e6747c880 Add "Select text" context menu option 2016-09-17 01:18:34 +03:00
Daniel Gultsch 9d0a333372 Merge branch 'master' of github.com:siacs/Conversations 2016-09-16 12:35:57 +02:00
Daniel Gultsch af55aeca58 pulled translations from transifex 2016-09-16 12:29:26 +02:00
Daniel Gultsch 521469a57d dont show delete file button when outside conversations directory. fixes #2007 2016-09-16 12:29:12 +02:00
Daniel Gultsch 569b7bf6d0 hint that you should use latest version of ejabberd 2016-09-16 11:59:46 +02:00
Daniel Gultsch 3cdf5f9afc Merge branch 'Mishiranu-master' 2016-09-16 11:14:06 +02:00
Daniel Gultsch 15c807730e Merge branch 'master' of https://github.com/Mishiranu/Conversations into Mishiranu-master 2016-09-16 11:08:37 +02:00
Daniel Gultsch 7b445bc4c7 use history clear date as minimum date for mam 2016-09-16 11:07:52 +02:00
Mishiranu 8ca5eb4429 Allow text selection with multiple links in message 2016-09-16 02:15:07 +03:00
Daniel Gultsch ab63dba8aa deal with null bodys in message preview 2016-09-15 18:51:51 +02:00
Daniel Gultsch 4359afacb4 store jid if it was changed during bind 2016-09-14 12:26:38 +02:00
Daniel Gultsch 7b52e6984c Merge pull request #2018 from SamWhited/sasl_anonymous
SASL ANONYMOUS (no UI)
2016-09-14 09:34:20 +02:00
Daniel Gultsch 869ee3d438 Merge branch 'pebble-notification' of https://github.com/danielegobbetti/Conversations into danielegobbetti-pebble-notification 2016-09-12 22:49:22 +02:00
Daniel Gultsch d3dfecae8a don't use display version of jids 2016-09-12 22:48:51 +02:00
Daniel Gultsch 6cb2b0b5d1 remember scroll position on rotate. fixes #2011 2016-09-12 21:18:56 +02:00
Sam Whited 1a0b538166 Use JID returned by the server during bind
Not just the resourcepart
2016-09-12 11:33:36 -05:00
Sam Whited 805717673c Support ANONYMOUS SASL 2016-09-12 11:30:03 -05:00
Daniele Gobbetti e6e46651c9 Use the last message in the content text instead of the first.
This fixes the issue where the first message in the notification was sent to pebble
(and possibly to other wear devices) for every update in the conversation, as
reported in #1249.

This is the same patch propoed in https://github.com/siacs/Conversations/issues/1249#issuecomment-245878335
2016-09-11 18:42:05 +02:00
Daniel Gultsch 75fcab3170 Merge pull request #2014 from licaon-kter/patch-1
Fix typo
2016-09-11 17:40:27 +02:00
licaon-kter 59b2e281a3 Fix typo 2016-09-10 22:16:14 +03:00
Daniel Gultsch 6fd9888b3b add xep-0084 to docs/xep.md. wikipedia was complaining about it missing 2016-09-10 16:24:41 +02:00
Daniel Gultsch c3b11e515e download own vcard avatar if none is set. fixes #2008 2016-09-09 11:04:05 +02:00
Daniel Gultsch edf0ae9aa6 version bump to 1.14.1 + changelog 2016-09-09 11:03:22 +02:00
Daniel Gultsch 00cbf8458a pulled translations from transifex 2016-09-08 11:19:03 +02:00
Daniel Gultsch ac9f13a9f2 provide hint on why conference can not be encrypted 2016-09-08 11:01:27 +02:00
Daniel Gultsch a54a7dca30 Merge branch 'master' of github.com:siacs/Conversations 2016-09-07 16:14:33 +02:00
Daniel Gultsch 416481bb65 be a bit more careful when deleting and deactivating accounts 2016-09-07 14:34:58 +02:00
Daniel Gultsch ba6b4763d2 add faq about grayed out omemo 2016-09-07 13:01:02 +02:00
Daniel Gultsch e1d2c32e63 show server not found muc error 2016-09-06 12:15:08 +02:00
Daniel Gultsch 257d1e42d8 remove explicit pebble support. treat as wear device 2016-09-06 12:14:49 +02:00
Daniel Gultsch 7e81149869 show reply action on wear devices 2016-09-06 12:13:50 +02:00
Daniel Gultsch 1dc55f72e3 don't use fileprovider when opening files on android M and below 2016-09-04 22:59:40 +02:00
Daniel Gultsch d2c475d501 don't crash when correcting waiting pgp encrypted messages 2016-09-04 22:59:15 +02:00
Daniel Gultsch ad09d7dc49 version bump to 1.14.0 2016-09-02 23:49:32 +02:00
Daniel Gultsch aca7054174 fixed recreation issues in StartConversationActivity 2016-08-31 17:04:43 +02:00
Daniel Gultsch f7d8580969 fixed typo 2016-08-31 17:02:50 +02:00
Daniel Gultsch f14ab4c391 don't show duplicate nofications on android 4 2016-08-31 17:02:42 +02:00
Daniel Gultsch 7917c19d18 broader exception catchers 2016-08-30 13:15:00 +02:00
Daniel Gultsch 3685c8cd2a use file provider for taking pictures 2016-08-30 13:14:38 +02:00
Daniel Gultsch d32cbcc70d don't show up navigation in startConversation when there are no open conversations 2016-08-30 13:13:06 +02:00
Daniel Gultsch af329eff46 add more logging to pgp engine 2016-08-30 13:12:09 +02:00
Daniel Gultsch b747afb44c version bump to 1.14.0-beta + changelog 2016-08-27 15:30:41 +02:00
Daniel Gultsch 2c187d0e7c mark conversation as read when swiping a notification with quick reply away 2016-08-27 15:25:37 +02:00
Daniel Gultsch caafd03130 don't automatically download files and avatars when datasaver is on 2016-08-27 13:35:52 +02:00
Daniel Gultsch 3d5940cb76 bring back connectivity changed events on android n 2016-08-27 12:15:25 +02:00
Daniel Gultsch 78e962ce67 don't overwrite edited information in editaccount on rotate 2016-08-26 21:48:14 +02:00
Daniel Gultsch ea0e6d0619 don't set notification mode to background when on pause 2016-08-26 21:13:33 +02:00
Daniel Gultsch ad994a2f4c add missing depency to gradle file 2016-08-26 16:43:30 +02:00
Daniel Gultsch fd54dc5aff wrap dynamic tags into multiple lines. fixes #2003 2016-08-26 16:34:42 +02:00
Daniel Gultsch 76cbb4f727 some multi-window optimizations. set min width to 300 2016-08-26 16:05:38 +02:00
Daniel Gultsch e33d8451a8 attach contact to notification 2016-08-26 13:35:01 +02:00
Daniel Gultsch f931c08da7 add snackbar for request presence subscription 2016-08-26 10:19:59 +02:00
Daniel Gultsch b52f079292 always display allow contact perm dialog after intro 2016-08-26 10:19:42 +02:00
Daniel Gultsch 9e0145a8f6 survive rotation in editaccount 2016-08-26 09:10:59 +02:00
Daniel Gultsch e98ab37c9d made payment required error standard compliant 2016-08-25 23:42:42 +02:00
Daniel Gultsch cbda5a5016 reformat build.gradle 2016-08-25 22:53:27 +02:00
Daniel Gultsch 910b38ec13 add file provider to share files on android n 2016-08-25 22:41:33 +02:00
Daniel Gultsch b0cdc2745c fix travis 2016-08-25 19:35:37 +02:00
Daniel Gultsch 2e4713897d offer quick reply on android N 2016-08-25 17:30:44 +02:00
Daniel Gultsch 542626758d use N style stacked notifications 2016-08-25 15:20:06 +02:00
Daniel Gultsch a4d342683e use N Api and build tools 2016-08-25 15:19:51 +02:00
Daniel Gultsch 0b9d38cf32 send register IQs without full from 2016-08-25 13:50:54 +02:00
Daniel Gultsch f1ecbf2ff8 made image preview size smaller for low res images 2016-08-25 13:46:33 +02:00
Daniel Gultsch 6f72128c45 version bump to 1.13.9 + changelog 2016-08-20 10:45:14 +02:00
Daniel Gultsch 8927ba8065 various null pointer checks 2016-08-20 10:44:50 +02:00
Daniel Gultsch a0038565c5 pulled translations from transifex 2016-08-19 21:47:51 +02:00
Daniel Gultsch 285d86b375 display error status for missing internet permission 2016-08-19 21:47:08 +02:00
Daniel Gultsch cf909afc60 check for rare null pointer platform bug in share intent handling 2016-08-19 21:46:47 +02:00
Daniel Gultsch 2a139a4b47 Merge pull request #1987 from licaon-kter/patch-2
Make 'export log' option function clearer
2016-08-16 10:49:04 +02:00
Daniel Gultsch 0528a47b8a pulled translations from transifex 2016-08-16 10:45:52 +02:00
Daniel Gultsch b5d3859b22 add payment required error 2016-08-16 10:39:59 +02:00
Daniel Gultsch 343bb7ff28 don't close otr session on every presence change 2016-08-13 12:43:06 +02:00
Daniel Gultsch 94aee445e7 start file observer in background 2016-08-13 12:40:48 +02:00
Daniel Gultsch 4736d12e99 make lastMessageTransmitted return max(clear_date,last_message) 2016-08-13 12:36:30 +02:00
Daniel Gultsch eb8b6165d7 be more careful in recursive file observer. limit depth 2016-08-13 12:35:10 +02:00
licaon-kter 81b0f60860 Clear export option function 2016-08-11 21:07:25 +03:00
Daniel Gultsch 8b6f06f0f9 version bump to 1.13.8 + changelog 2016-08-11 10:01:41 +02:00
Daniel Gultsch 08725ba2bb use direct ssl when port was manually set to 5223
this should create a work around for the oracle xmpp server
2016-08-10 12:34:05 +02:00
Daniel Gultsch 9bfdbc708e close tcp connection after 30s of inactivity when in push_mode 2016-08-09 19:21:54 +02:00
Daniel Gultsch 856029a611 don't do idle ping if close_tcp option is set 2016-08-09 17:26:18 +02:00
Daniel Gultsch a51de9fcd9 explictly set account status to offline when waiting for push 2016-08-09 17:25:45 +02:00
Daniel Gultsch 121312d103 catch all throwables when parsing xml 2016-08-02 10:58:54 +02:00
Daniel Gultsch d02e24248f catch platform bug when getting ringer mode 2016-08-02 10:58:31 +02:00
Daniel Gultsch 8b331895d1 catch NPE in getVideoPreview() because getFrame sometimes returns null 2016-08-02 10:57:50 +02:00
Daniel Gultsch ed2fa20414 handle invalid prekey ids in bundle 2016-08-02 10:40:24 +02:00
Daniel Gultsch 9dc8e3db9d set tablet, phone or pc identity 2016-07-31 22:32:51 +02:00
Daniel Gultsch 1b114beb0b add logging when swiping away from recents is being ignored 2016-07-31 22:32:10 +02:00
Daniel Gultsch 3c48b14448 catch exception when trying to get video preview of pgp encrypted file 2016-07-31 22:31:47 +02:00
Daniel Gultsch 0e96e0a796 show identity type for device selection 2016-07-28 22:58:37 +02:00
Daniel Gultsch c06aceaae9 version bump to 1.13.7 + changelog 2016-07-28 22:43:43 +02:00
Daniel Gultsch 04976fe333 pulled translations from transifex 2016-07-28 22:41:14 +02:00
Daniel Gultsch 178229ac60 add OS to version response 2016-07-27 20:58:13 +02:00
Daniel Gultsch dbab43e423 fixed rare null pointer in avatar creation 2016-07-27 20:11:22 +02:00
Daniel Gultsch cf7df84cab add trillian to html otr parsing fixes #1963 2016-07-27 20:11:02 +02:00
Daniel Gultsch 701140fe92 pulled translations from transifex 2016-07-27 20:01:09 +02:00
Daniel Gultsch 58a3ef46ce fixed regression in file delete detection due to missing ! 2016-07-26 20:44:28 +02:00
Daniel Gultsch 82908fb54b added more logging for file deletion 2016-07-26 20:43:05 +02:00
Daniel Gultsch 3409399ef1 display specific error message when password is too weak on registration 2016-07-25 15:57:47 +02:00
Daniel Gultsch 198a9f2226 refactored how view intents are handled
processing view intents before saved instance caused troubles when the activity was destroyed
fixes #1969
2016-07-25 14:16:09 +02:00
Daniel Gultsch 89a05265ea refactored deleted file detection to monitor entire sd card. fixes #1968 2016-07-23 16:12:45 +02:00
Daniel Gultsch 3d372cb339 feed version response from app name instead of static variable 2016-07-22 18:22:21 +02:00
Daniel Gultsch 6dcce76568 don't crash when opening 'xmpp:' uris 2016-07-22 16:33:09 +02:00
Daniel Gultsch 3a5735e717 provide black background video thumbnail if preview couldn't be generated 2016-07-22 16:32:38 +02:00
Daniel Gultsch e9c00c0427 push file offered notification when initial HTTP HEAD req. fails 2016-07-21 19:17:26 +02:00
Daniel Gultsch c8188ee52c offer back/cancel button when using magic create 2016-07-21 19:16:41 +02:00
Daniel Gultsch 2843a0af26 announce OTR support as per XEP-0378 2016-07-17 22:51:40 +02:00
Daniel Gultsch e90e333f29 allow message correction by default since security implications are negligible
Conversations only allows correction of the *last* message. so nudging a message into oblivion by adding a message correction doesn't work. also conversations checks the fingerprint for encrypted messages
2016-07-17 22:42:37 +02:00
Daniel Gultsch eb3ac1c326 additional null pointer checks when verifying otr keys 2016-07-17 22:02:08 +02:00
Daniel Gultsch 3e50d4831f show toast hint when touching inactive omemo fingerprints 2016-07-17 20:31:04 +02:00
Daniel Gultsch 0bc5dbdf94 version bump to 1.13.6 + changelog 2016-07-16 19:38:07 +02:00
Daniel Gultsch baa149924a show error notification in connecting state as well 2016-07-14 23:23:13 +02:00
Daniel Gultsch 1db85e582e add more error states for stream errors 2016-07-14 17:05:43 +02:00
Daniel Gultsch 2803d342e1 include pgp and omemo fallback message only when unencrypted is enabled 2016-07-14 16:06:05 +02:00
Daniel Gultsch 223d50c1a0 don't take stanza-id into account when deduping muc pms 2016-07-14 09:01:15 +02:00
Daniel Gultsch 27690865a6 respond to XEP-0202: Entity Time 2016-07-13 18:10:10 +02:00
Daniel Gultsch 58d5d2a1be don't time out disco request but just send bind request 2016-07-13 00:20:57 +02:00
Daniel Gultsch ff1b23b4d9 call update file params from thread
now that file params has more work to do we should make sure we always call it from a sperate thread
2016-07-13 00:20:38 +02:00
Daniel Gultsch be4aa2afc9 show a preview for video files 2016-07-11 21:24:33 +02:00
Daniel Gultsch 01a4d2ea25 fixed typo in changelog 2016-07-11 11:31:22 +02:00
Daniel Gultsch f9aca85edf version bump to 1.13.5 + changelog 2016-07-09 13:33:46 +02:00
Daniel Gultsch 57e51bc735 don't crash when tabbing through muc user list with offline users 2016-07-08 13:24:14 +02:00
Daniel Gultsch cdee91363c simplified muc users ordering 2016-07-04 19:30:19 +02:00
Daniel Gultsch ac8aa63916 do not crash on jingle connection when contact doesn't use disco 2016-07-04 19:29:46 +02:00
Daniel Gultsch 369e7172d6 version bump to 1.13.4 + changelog 2016-07-02 12:46:14 +02:00
Daniel Gultsch 09aba0a062 pulled translations from transifex 2016-07-01 13:08:44 +02:00
Daniel Gultsch 9efa242d96 use direct invites to re-invite muc members 2016-06-30 23:09:16 +02:00
Daniel Gultsch 30110431ba use dnd as overriding status 2016-06-30 23:08:55 +02:00
Daniel Gultsch 91c3732c63 don't show 'disable foreground service' button. fixes #1933 2016-06-29 17:20:27 +02:00
Daniel Gultsch f7933c26d7 don't crash on broken base64 in omemo messages. fixes #1934 2016-06-29 17:18:57 +02:00
Daniel Gultsch 1d79a677c8 support jingle ft:4 to be compatible with swift
Conversations and Gajim both have an implementation bug that sends the jingle session id instead of the transport id (compare XEP-260 2.2). This commit has a work around for this that remains buggy when using ft:3. If gajim is ever to fix this we will be incompatbile. gajim should implement ft:4 instead. (gajim to gajim is broken as well)
2016-06-29 17:16:40 +02:00
Daniel Gultsch b5caa8fa35 don't show 'create conference' toast on invite 2016-06-28 10:34:43 +02:00
Daniel Gultsch 8882c6b6fd parse §5.1.2 full jids from muc archives for OMEMO messages 2016-06-28 10:33:46 +02:00
Daniel Gultsch e63d6b4bf2 only keep offline members in members only conferences 2016-06-28 10:32:06 +02:00
Daniel Gultsch 9a7f51520e render ic_launcher. fixes #1919 2016-06-28 08:00:04 +02:00
Daniel Gultsch 4e6d16c49b version bump to 1.13.3 2016-06-25 13:07:33 +02:00
Daniel Gultsch e52f662569 pulled translations from transifex 2016-06-25 13:07:22 +02:00
Daniel Gultsch 72a2622c84 introduced share button in contact details. remove show qr 2016-06-24 15:16:01 +02:00
Daniel Gultsch 97fe14c4be code cleanup in jingle socks5 transport 2016-06-24 13:36:37 +02:00
Daniel Gultsch 78e3afc1af show error toasts on ui thread 2016-06-24 13:36:06 +02:00
Daniel Gultsch d2ca0c7fe8 catch exceptions when retrieving uri file extension 2016-06-24 13:35:39 +02:00
Daniel Gultsch 4d5e0c291e remove white spaces from hostname 2016-06-22 12:23:11 +02:00
Daniel Gultsch 982a20fef5 refactor code that reads real jid from muc 2016-06-22 12:22:57 +02:00
Daniel Gultsch 4ba5472d0c respond to block list push 2016-06-22 12:22:36 +02:00
Daniel Gultsch d28d968985 make sure that we always release wake lock even after throwing exception 2016-06-22 12:22:03 +02:00
Daniel Gultsch 34454ef2ec synchronize stanza count increment and write 2016-06-22 12:21:33 +02:00
Daniel Gultsch 4d1640d6ff Merge pull request #1923 from alexxthehood/patch-1
Update create_conference_dialog.xml to also match dark theme.
2016-06-21 23:25:51 +02:00
alexxthehood e88f01923f Update create_conference_dialog.xml
Updated to the text color attribute so it fits to the bright and dark theme appropriately.
2016-06-21 19:08:38 +02:00
Daniel Gultsch 1166619539 version bump to 1.13.2 + changelog 2016-06-20 15:56:09 +02:00
Daniel Gultsch 28dc888159 display toast on pgp error 2016-06-19 11:08:17 +02:00
Daniel Gultsch ea1e4c773d add some missing XEPs to docs 2016-06-19 11:07:49 +02:00
Daniel Gultsch 37e7175a86 log reason for not showing notification 2016-06-19 11:04:59 +02:00
Daniel Gultsch 85c82d9b3b remove ascii control chars when creating xml 2016-06-19 00:07:15 +02:00
Daniel Gultsch 829720409d updated screenshots in README. fixes #1580 2016-06-17 14:01:20 +02:00
Daniel Gultsch f91d16cbe7 don't fail on missing jid in bookmarks 2016-06-16 20:38:35 +02:00
Daniel Gultsch b92b3863b9 don't handle chat states in muc or from archive 2016-06-16 20:38:02 +02:00
Daniel Gultsch fc3aefd56e show toast when connection to openkeychain could not be made 2016-06-16 20:37:32 +02:00
Daniel Gultsch dcc13d7a3d log download failure caused by missing content length 2016-06-16 20:36:51 +02:00
Daniel Gultsch 48a7818e88 mark used otr fingprint in contact details and highlight pgp 2016-06-16 12:12:24 +02:00
Daniel Gultsch 1eb776f39c synchronize message body changes for message correction 2016-06-16 11:47:40 +02:00
Daniel Gultsch f8b1e8098c extract relevant extension from file name when processing share intent 2016-06-16 11:46:25 +02:00
Daniel Gultsch 60588af825 replace corrected messages in decryption queue 2016-06-15 14:29:25 +02:00
Daniel Gultsch f99f21ab9b pulled translations from transifex 2016-06-15 14:11:27 +02:00
Daniel Gultsch 5f4471a45e only dismiss sent message after encryption 2016-06-15 13:53:34 +02:00
Daniel Gultsch cb5393c32f refresh UI to redraw message hint after switching to pgp 2016-06-15 13:52:49 +02:00
Daniel Gultsch 5f40a7042d delay notification until after pgp decryption 2016-06-15 12:44:29 +02:00
Daniel Gultsch e0575642b5 log all fail reasons 2016-06-15 12:33:59 +02:00
Daniel Gultsch 73679b97f1 show xep-0172 nick only for contacts with mutual presence subscription 2016-06-15 09:44:01 +02:00
Daniel Gultsch 49de43b364 clear muc tiles when avatar of member changes 2016-06-14 17:11:31 +02:00
Daniel Gultsch f9600b950f sort muc users by affiliation, name. fixes #1913 2016-06-14 14:41:32 +02:00
Daniel Gultsch 95a51ea2e0 synchronize access to stanza queue 2016-06-14 10:17:37 +02:00
Daniel Gultsch 39ad426ca9 remove messages from decryption queue when trimming a conversation 2016-06-13 19:06:09 +02:00
Daniel Gultsch 40f81f19df make sure tagwriter is clear before force closing socket 2016-06-13 19:05:32 +02:00
Daniel Gultsch 587fb3cca3 refactored pgp decryption 2016-06-13 13:32:14 +02:00
Daniel Gultsch 490a1ca3cf version bump to 1.13.1 + changelog 2016-06-13 12:32:49 +02:00
Daniel Gultsch ea667a1a73 pulled translations from transifex 2016-06-12 14:49:21 +02:00
Daniel Gultsch f4e3cd5098 actually do add fall back message for omemo 2016-06-12 14:49:04 +02:00
Daniel Gultsch c4680e3198 make text color of last-seen match theme 2016-06-12 13:15:28 +02:00
Daniel Gultsch 31dd7b5a21 parse real jid from muc mam messages. (disabled)
parsing this is dangerous if server doesn't filter properly
thus it is disabled in config
2016-06-12 12:50:53 +02:00
Daniel Gultsch 74d376be68 close db cursor after reading cert 2016-06-12 12:50:31 +02:00
Daniel Gultsch 5017e8564c made background color of swiped conversations darker 2016-06-10 23:22:16 +02:00
Daniel Gultsch a70f57358e use darker green as background for chat bubbles in dark theme 2016-06-10 22:39:02 +02:00
Daniel Gultsch 4bf9a1e809 use darker colors for actionbar on dark theme 2016-06-10 20:15:09 +02:00
Daniel Gultsch e2a803ee04 version bump to 1.13.0 + changelog 2016-06-10 11:15:12 +02:00
Daniel Gultsch 4b9b7257a9 pulled translations from transifex 2016-06-09 21:00:51 +02:00
Daniel Gultsch cb7c47bc62 catch conversations sort exception. not vital at this point 2016-06-09 14:50:13 +02:00
Daniel Gultsch 33a02faad9 fixed spelling in last activity summary 2016-06-08 21:36:29 +02:00
Daniel Gultsch a018935b23 pulled translations from transifex 2016-06-08 20:17:10 +02:00
Daniel Gultsch 112a4d389e Merge branch 'Wanztwurst-darkTheme' fixes #529 2016-06-08 20:10:21 +02:00
Steffen Keiper 7932244c51 Dark theme, theme switch, icons, style, strings
added some white icons,
changed hardcoded icons to theme attributes,
changed icon_edit_dark to icon_edit_body to reflect icons position,
grey message bubbles in dark theme,
misc

purged ic_action_chat as it wasn't used

preference use_white_background changed to use_green_background, default true

grey chat bubbles darker, text white

replaced all grey600 with black icons and 0.54 alpha attribute

highlightColor in dark grey chat bubble now darker than background
2016-06-08 20:07:40 +02:00
Daniel Gultsch b88128241e Merge pull request #1895 from pp3345/right-alt
Do not treat Right Alt key as a modifier for key combos
2016-06-05 23:19:56 +02:00
Daniel Gultsch 9f42ead747 spelling in readme 2016-06-05 23:19:03 +02:00
Yussuf Khalil 92bad0fa1e Do not treat right alt key as a modifier for key combos 2016-06-05 20:21:44 +02:00
Daniel Gultsch d089ceac13 add paragraph on running your own server to readme 2016-06-05 12:04:49 +02:00
Daniel Gultsch 8e6f054e52 make non interactive verfier non interactive 2016-06-05 11:56:56 +02:00
Daniel Gultsch 36ae840d76 log all background stanzas when background logging is enabled 2016-06-05 02:04:31 +02:00
Daniel Gultsch 7a97da6d21 swap sending presence and csi 2016-06-04 22:42:12 +02:00
Daniel Gultsch 794353ad0c renamed last activity to last user interaction 2016-06-04 22:37:14 +02:00
Daniel Gultsch 71e9117176 opt-in to send last userinteraction in presence 2016-06-04 16:16:14 +02:00
Daniel Gultsch 6639d0f23b added section on backup to FAQ 2016-06-04 09:24:27 +02:00
Daniel Gultsch becc3eb867 version bump to 1.12.9 + changelog 2016-06-03 23:57:18 +02:00
Daniel Gultsch 7398424f3b trim nick from bookmark before checking if it's empty 2016-06-03 19:24:11 +02:00
Daniel Gultsch e26d842549 don't use a bookmarks name if it's empty 2016-06-03 18:43:45 +02:00
Andreas Straub 17c62b5991 Fix typo 2016-06-03 18:16:44 +02:00
Daniel Gultsch 161fdf7340 throw writeexecption in downloader if flush fails 2016-06-03 14:27:05 +02:00
Daniel Gultsch e402348f9b disconnect account in background after deletion. fixes #1861 2016-06-03 14:18:43 +02:00
Daniel Gultsch 583aba1b44 print specific toast when download failed because of write error 2016-06-02 21:37:52 +02:00
Daniel Gultsch 594aab56db fixed regression that would not show clear devices 2016-06-02 20:46:01 +02:00
Daniel Gultsch 25211f13b3 make grace period configurable 2016-06-02 00:24:37 +02:00
Daniel Gultsch e43a01159c deactive grace period when receiving screen on action 2016-06-01 21:51:46 +02:00
Daniel Gultsch 45cc33ca36 deactivate grace period when coming to foreground 2016-06-01 21:30:50 +02:00
Daniel Gultsch 20ba1add1e pulled translation from transifex 2016-06-01 11:38:57 +02:00
Daniel Gultsch 91732b89ea log background msgs not foreground msgs 2016-06-01 11:37:03 +02:00
Daniel Gultsch add8e2cb74 don't replace \n\t\r 2016-06-01 09:04:08 +02:00
Daniel Gultsch 15316e6a7f only log inner stanza but display isCarbon 2016-06-01 09:03:21 +02:00
Daniel Gultsch 5c5d5cc4e3 don't show empty templates 2016-06-01 00:25:14 +02:00
Daniel Gultsch 24ea66c9fc display invite again menu item for offline members 2016-06-01 00:12:14 +02:00
Daniel Gultsch ffba53777c check if session is optional 2016-05-31 23:09:45 +02:00
Daniel Gultsch ea6a008b39 execute phone contact changes in singlethreadexecutor 2016-05-31 17:20:21 +02:00
Daniel Gultsch 1838023c88 log failure reason in http upload on wrong response code 2016-05-31 17:19:56 +02:00
Daniel Gultsch b3337c4ad7 don't scroll to pos 0 when uuid wasn't found 2016-05-31 16:44:59 +02:00
Daniel Gultsch b7c8ce1511 version bump to 1.12.8 2016-05-30 21:16:14 +02:00
Daniel Gultsch 6d0e5f4354 pulled translation from transifex 2016-05-30 21:16:04 +02:00
Daniel Gultsch 5b9ba79495 use whitespace as message seperator 2016-05-30 21:12:19 +02:00
Daniel Gultsch 9321ccc775 handle app links for conferences 2016-05-30 21:12:04 +02:00
Daniel Gultsch 8eb1640a26 remove unicode control chars before sending 2016-05-30 21:11:34 +02:00
Daniel Gultsch be0fc59314 handle app links with @ in them 2016-05-30 13:06:42 +02:00
Daniel Gultsch 272cffe797 Revert "always notify by default in conferences"
This reverts commit e9494af098.

Now that new conferences are private by default this setting makes more sense
2016-05-29 22:55:01 +02:00
Daniel Gultsch 762820072a version bump to 1.12.7 2016-05-29 21:25:39 +02:00
Daniel Gultsch ea18ceae4a avoid npe when sending omemo messages to group 2016-05-29 21:25:27 +02:00
Daniel Gultsch 71787bd2e1 version bump to 1.12.6 2016-05-29 20:54:41 +02:00
Daniel Gultsch 49cefd1c0c handle app links
invites in the form of https://conversations/i/localpart/domainpart
2016-05-29 20:44:58 +02:00
Daniel Gultsch 9afafe387a fix creation of conferences with 1 participant 2016-05-29 20:21:53 +02:00
Daniel Gultsch 107ab85a22 version bump to 1.12.5 + changelog 2016-05-29 13:09:15 +02:00
Daniel Gultsch d89d7ade84 pulled translations from transifex 2016-05-29 13:00:02 +02:00
Daniel Gultsch c3ec3ea70a don't merge messages over the char limit 2016-05-29 10:32:07 +02:00
Daniel Gultsch 2c55954ddd show in ui when text was shortened 2016-05-29 01:14:45 +02:00
Daniel Gultsch aaf5233efe limit text size in message adapter to 2k and also limit text size in conversations adapter 2016-05-28 23:48:39 +02:00
Daniel Gultsch 422fd1847f only rendering first 5k chars of each message 2016-05-28 23:13:47 +02:00
Daniel Gultsch ce0888b077 explicitly include version in issue template 2016-05-28 22:42:18 +02:00
Daniel Gultsch fde27f447f count xmpp uris when disableing text selection 2016-05-28 17:01:05 +02:00
Daniel Gultsch b3f50d1ad0 Merge branch 'master' of https://github.com/gjedeer/Conversations into gjedeer-master 2016-05-28 16:07:25 +02:00
Daniel Gultsch bc326efd2c schedule first idle ping on service creation 2016-05-28 16:07:16 +02:00
Daniel Gultsch bc36f1950f added idle ping in 10min intervals 2016-05-28 14:44:22 +02:00
Daniel Gultsch ae7543bbfc put bug report jid in config. include package signature in report 2016-05-28 11:04:18 +02:00
Daniel Gultsch 06bef5de8d use EOT as message seperator 2016-05-28 11:03:29 +02:00
Daniel Gultsch 25f6651848 pulled translations from transifex 2016-05-27 20:07:39 +02:00
Daniel Gultsch 29bd1103c0 refactored toasts shown when adhoc creating mucs 2016-05-27 20:05:40 +02:00
Daniel Gultsch a241ab66de use activity title 'choose participants' when doing that 2016-05-27 19:17:57 +02:00
Daniel Gultsch f70fcc7bb8 use first letter to draw tiles for avatars
some users or conferences might have emojis in their names
2016-05-27 11:34:12 +02:00
Daniel Gultsch 44833c1499 don't push default muc conf twice 2016-05-27 10:35:00 +02:00
GDR! 82c3cbaf2a Add geo: link support in longer messages 2016-05-26 23:26:38 +02:00
Daniel Gultsch 21ebb35e44 add 'create conference' dialog 2016-05-26 22:53:55 +02:00
Daniel Gultsch d9ff61ea2e show contact avatar in muc users unless that contact has its own avatar 2016-05-26 22:37:00 +02:00
Daniel Gultsch 841e718d6a make newly created conferences private by default 2016-05-26 12:39:31 +02:00
Daniel Gultsch c4e82eb3f8 change hint in edit subject dialog 2016-05-26 12:39:04 +02:00
Daniel Gultsch c06e2787c7 sending warning to receiving client if that client doesn't support omemo.
fixes #1873
2016-05-25 23:24:36 +02:00
Daniel Gultsch 83adbb6052 hide fingerprints in UI if encryption is disabled 2016-05-25 22:12:13 +02:00
Daniel Gultsch 5137837f6d only publish keys if omemo is enabled 2016-05-25 21:55:01 +02:00
Daniel Gultsch c65c314801 only subscribe to omemo pep events if omemo is enabled 2016-05-25 21:54:46 +02:00
Daniel Gultsch 79796b0079 don't respond to otr messages in muc pms 2016-05-25 21:05:51 +02:00
Daniel Gultsch b69ab65b12 show regitration failed try again later in UI 2016-05-24 13:26:30 +02:00
Daniel Gultsch abbdf232c6 show hint in subject quick edit. only show subject as preset 2016-05-22 18:20:57 +02:00
Daniel Gultsch d84cf4e6d1 pulled translations from transifex 2016-05-22 17:53:10 +02:00
Daniel Gultsch e5b8302fd9 show first unread message on top after reinit 2016-05-22 17:52:27 +02:00
Daniel Gultsch 33218ec32a version bump to 1.12.4 + changelog 2016-05-21 13:58:15 +02:00
Daniel Gultsch a8420c9ad0 disable stanza logging 2016-05-21 10:45:10 +02:00
Daniel Gultsch 277e3d59c8 update ui after affiliation changes 2016-05-21 09:25:37 +02:00
Daniel Gultsch e1cf7b8cb6 refactore exceptionhandler to have one line file writer 2016-05-21 08:54:29 +02:00
Daniel Gultsch 9ce2cfa3d2 resetting fetch status error when mutual subscription is reestablished 2016-05-19 10:47:27 +02:00
Daniel Gultsch 8d595c1fc2 sync around individual calls instead of synchronizing entire object 2016-05-19 10:47:03 +02:00
Daniel Gultsch ef27055434 show password dialog when account was magic created 2016-05-19 10:46:19 +02:00
Daniel Gultsch 3f65b0e985 access disco over caching mechanism instead of querying db 2016-05-19 10:44:16 +02:00
Daniel Gultsch 70497318dd remove unwanted 'use previous encryption' lookup 2016-05-19 10:42:57 +02:00
Daniel Gultsch 0eb8d4226e also save form elements in disco storage 2016-05-19 10:41:56 +02:00
Daniel Gultsch 627bf18f8c don't NPE on rare race condition while fetching MAM 2016-05-19 10:40:03 +02:00
Daniel Gultsch afa3883089 synchronize around identity key generation 2016-05-19 10:39:47 +02:00
Daniel Gultsch b478eca315 improved ordering of muc participants 2016-05-17 15:01:56 +02:00
Daniel Gultsch 61726f4994 refactored muc item parsing to also parse muc status messages 2016-05-17 14:25:58 +02:00
Daniel Gultsch 14952ba5e5 offer offline members to be invited again 2016-05-17 10:43:48 +02:00
Daniel Gultsch fc5304c6fe change affiliation for in memory users that are currently not joined in a conference 2016-05-16 19:58:36 +02:00
Daniel Gultsch 8d0693ed6a keep conference members in memory and show them in conference details 2016-05-16 19:58:36 +02:00
Daniel Gultsch d7c5264ad0 cap exponential backoff at 300s (10 attempts) 2016-05-16 19:58:24 +02:00
Daniel Gultsch 331cbf3696 cap messages after 256 lines in UI 2016-05-16 19:52:10 +02:00
Daniel Gultsch 6f1a4494eb use the same typo in both saving disco and reading disco 2016-05-15 12:35:51 +02:00
Daniel Gultsch cf5ca27a06 escape HTML in OTR messages if other client is Pidgin 2016-05-15 12:35:31 +02:00
Daniel Gultsch c9e9dc2ef2 include name in locations received in MUCs 2016-05-15 11:08:00 +02:00
Daniel Gultsch a25912c32c log incoming iq requests 2016-05-15 09:55:06 +02:00
Daniel Gultsch 540f6f3d7a send caps hash in muc join
this prevents desktop clients from iq'ing use when they join
2016-05-15 09:54:49 +02:00
Daniel Gultsch 018f978a22 version bump to 1.12.3 + changelog 2016-05-13 12:01:07 +02:00
Daniel Gultsch 6a28b5a9fa don't show duplicate status message in contact details 2016-05-13 11:57:02 +02:00
Daniel Gultsch e41a9483bd only default to omemo when all our devices support it 2016-05-13 11:47:29 +02:00
Daniel Gultsch aced9d2697 do not process self presence
we don't want our own resource show up in the self contact
2016-05-13 11:20:27 +02:00
Daniel Gultsch b756d61c45 show presence of other resources as template 2016-05-13 10:45:30 +02:00
Daniel Gultsch e6ff1539b4 Update ISSUE_TEMPLATE.md 2016-05-13 09:02:10 +02:00
Daniel Gultsch 72f541140f create contributing guidelines 2016-05-13 08:59:43 +02:00
Daniel Gultsch acad161344 Create issue template 2016-05-13 08:32:10 +02:00
Daniel Gultsch b8c1bd2cba reset attempt count when reconnecting because of timeout 2016-05-12 21:57:07 +02:00
Daniel Gultsch 2014f388b1 interrupt XMPPConnection Thread
in some cases the the DNS query might take too long (even though we specified a timeout)
if that happens we need a secondary solution (besides killing the socket) to stop the thread
2016-05-12 21:54:46 +02:00
Daniel Gultsch cbdb413613 prefer IPv4 DNS servers
some devices might have problems contacting the IPv6 DNS server while in sleep mode
2016-05-12 21:39:47 +02:00
Daniel Gultsch f4369b29ae improve keyboard handling. fixes #1387
* start a new Conversations by pressing mod+space
* automatically start searching when pressing keys in StartConversationsActivity
* when hitting enter when number of search results == 1 open that conversation
2016-05-12 18:49:54 +02:00
Daniel Gultsch 7113e21a43 use 'phone' or 'tablet' as default resource 2016-05-12 18:47:41 +02:00
Daniel Gultsch 908aa19a36 make omemo default when all resources support it 2016-05-12 14:20:11 +02:00
Daniel Gultsch 09e20f6e01 check if pgpengine is still bound before using it 2016-05-12 11:30:53 +02:00
Daniel Gultsch 1bc92482e9 scroll to bottom after sending multi-line message 2016-05-12 10:39:04 +02:00
Daniel Gultsch cc209afc51 stop processing PreKeyWhisperMessage if there is no PreKeyId
fixes #1832
2016-05-10 18:11:13 +02:00
Daniel Gultsch 8e3948e495 don’t let attempt count fall below zero 2016-05-10 17:48:09 +02:00
Daniel Gultsch c37b5af2ca add lock domain and magic create domain to known hosts 2016-05-10 10:53:44 +02:00
Daniel Gultsch e542dd3923 always show download button when link is encrypted
dont check for known mime type
2016-05-10 10:32:25 +02:00
Daniel Gultsch 549be9bb3d report host-account as account state in UI 2016-05-10 10:29:02 +02:00
Daniel Gultsch 27b245ac35 do not show last-seen metric in UI 2016-05-10 09:41:30 +02:00
Daniel Gultsch 488780d2ce fix logging wrong variable for failed resume 2016-05-08 21:53:45 +02:00
Daniel Gultsch 6f3b8f64d1 check for h attribute in 'failed' nonza 2016-05-08 21:45:18 +02:00
Daniel Gultsch 784df0c218 version bump to 1.12.2 + changelog 2016-05-07 11:35:12 +02:00
Daniel Gultsch fb7525e0b9 catch all exceptions thrown by xml pull parser 2016-05-07 11:34:45 +02:00
Daniel Gultsch 76889b9c58 handle invalid base64 is SASl SCRAM response 2016-05-07 11:34:17 +02:00
Daniel Gultsch e2d3bef739 Merge pull request #1829 from sebastianv89/patch-1
Remove copy of innerkey
2016-05-05 20:23:03 +02:00
Daniel Gultsch a7cd05bd4e report bind failure as account state 2016-05-05 20:22:47 +02:00
Daniel Gultsch 0157039e87 log more information about HTTP’s max upload size 2016-05-05 19:34:44 +02:00
Sebastian 544e1dee65 Remove copy of innerkey
The line overwrites this.innerkey with the value that was already there.
2016-05-05 17:09:01 +02:00
Daniel Gultsch 6e0ec9b924 republish pgp signature when changing status 2016-05-05 13:17:04 +02:00
Daniel Gultsch 12704fa640 refactor captcha response handling to avoid network on main thread exception 2016-05-05 09:58:35 +02:00
Daniel Gultsch 8a81f85734 version bump to 1.12.1 + changelog 2016-05-04 22:24:07 +02:00
Daniel Gultsch c27663c456 clear password field before setting new one 2016-05-04 18:23:36 +02:00
Daniel Gultsch fb41a4ffaa fixed npe when calling changepassword activity directly 2016-05-04 18:22:17 +02:00
Daniel Gultsch 16eb1bfbd0 pulled translations from transifex 2016-05-04 13:19:07 +02:00
Daniel Gultsch b334582eff Merge pull request #1827 from ka7/spelling_fix_no_translations
spelling fixes
2016-05-04 10:47:00 +02:00
klemens 7047d68165 spelling fixes 2016-05-04 10:29:29 +02:00
Daniel Gultsch dee7fd3eab Merge pull request #1826 from sebastianv89/patch-1
Renaming of variable
2016-05-04 09:28:46 +02:00
Sebastian cf374ec4ef Renaming of variable
Was probably just a copy/paste typo.
2016-05-03 23:35:57 +02:00
Daniel Gultsch 59f02f7766 Merge branch 'master' of github.com:siacs/Conversations 2016-05-03 22:17:16 +02:00
Daniel Gultsch cef2eb58a7 fixed presence template dedup for 'online' status 2016-05-03 22:16:51 +02:00
Daniel Gultsch fad8b702aa use app name in resource suggestions 2016-05-03 12:41:37 +02:00
Daniel Gultsch cfa31beaf7 fixed spelling in readme 2016-05-03 09:39:30 +02:00
Daniel Gultsch f444390617 update 'create account' faq entry 2016-05-02 14:39:58 +02:00
Daniel Gultsch 06a561743a ping all accounts at the same time 2016-05-02 14:31:30 +02:00
Daniel Gultsch 7674e01585 version bump to 1.12.0 + changelog 2016-05-02 11:05:53 +02:00
Daniel Gultsch bf92ef6cd3 pulled translations from transifex 2016-05-02 11:05:31 +02:00
Daniel Gultsch d23178acb9 show only username when registering account with magic create 2016-05-02 10:37:28 +02:00
Daniel Gultsch 98ecac0ffa removed unnecessary logging 2016-04-30 13:34:20 +02:00
Daniel Gultsch 936006173c properly cancel avatar tasks 2016-04-29 20:38:23 +02:00
Daniel Gultsch d5608cb4f3 catch ActivityNotFoundException when requesting battery op 2016-04-29 13:58:37 +02:00
Daniel Gultsch c7882b7225 port all android drop down list items to our own 2016-04-29 13:48:30 +02:00
Daniel Gultsch 6d9ca25915 catch rare NPE when determining max http size 2016-04-29 13:24:26 +02:00
Daniel Gultsch 252d015b71 synchronize around thumbnail cache to avoid loading images twice 2016-04-28 20:15:28 +02:00
Daniel Gultsch 1d2e2f71c2 cancel potential tasks when receiving image preview from cache 2016-04-28 20:14:53 +02:00
Daniel Gultsch 51753a1d39 cleaned up captcha dialog 2016-04-28 20:13:58 +02:00
Daniel Gultsch 5021b9a5dd don't request disco from self 2016-04-28 19:02:20 +02:00
Daniel Gultsch 29616d02a8 removed unused config variables 2016-04-27 16:43:02 +02:00
Daniel Gultsch ebcb13c8eb made it possible to go back to welcome screen from edit account 2016-04-27 10:35:08 +02:00
Daniel Gultsch e6b526230a renamed welcome header to untranslatable 'Start your Conversations' 2016-04-27 09:59:25 +02:00
Daniel Gultsch 9c3e910dc4 prevent user from accidentally changing password after using magic create 2016-04-26 23:23:48 +02:00
Daniel Gultsch 59652ecaf2 fixed table creation 2016-04-25 11:06:17 +02:00
Daniel Gultsch 6a677a172b Merge pull request #1821 from kriztan/patch-1
Update build.gradle
2016-04-24 11:26:01 +02:00
Christian S 94983ca3ed Update build.gradle
this seems be be never used and could be removed
2016-04-23 21:46:45 +02:00
Daniel Gultsch a363e0a5d8 don't create templates for empty status messages 2016-04-23 15:10:35 +02:00
Daniel Gultsch cd1fbf60ec add change prescence to manage account context menu 2016-04-23 12:33:56 +02:00
Daniel Gultsch a9c1768107 show status messages in contact details 2016-04-23 12:19:00 +02:00
Daniel Gultsch 1901abd05f expert setting to manually change presence 2016-04-22 21:25:06 +02:00
Daniel Gultsch 195b745efc put welcome screen in scrollview 2016-04-22 00:17:08 +02:00
Daniel Gultsch 1a073ca454 added magic create welcome screen 2016-04-19 18:03:24 +02:00
Daniel Gultsch bfe01c4322 version bump to 1.11.7 + changelog 2016-04-14 23:13:44 +02:00
Daniel Gultsch e9494af098 always notify by default in conferences 2016-04-14 22:37:05 +02:00
Daniel Gultsch eb63cdb9ad removed unnecessary call to stopSelf() after logging out 2016-04-14 21:45:36 +02:00
Daniel Gultsch 72aa10b536 add setting for quick sharing 2016-04-14 21:12:44 +02:00
Daniel Gultsch 39e717ed94 removed unused call to cancel events 2016-04-14 00:16:59 +02:00
Daniel Gultsch c53c6cb6b6 create Config varibale to show the disable foreground service button 2016-04-13 18:00:12 +02:00
Daniel Gultsch 594e65bb2b hacky workaround to determine if uri points to private file on < lolipop 2016-04-13 11:14:36 +02:00
Daniel Gultsch 4332b0df44 return own jid as true counterpart on self messages in muc 2016-04-13 11:13:47 +02:00
Daniel Gultsch 3e654bea0e added share uri button to conference details 2016-04-12 18:30:02 +02:00
Daniel Gultsch 2a4db01709 reverse order in contact chooser 2016-04-12 18:29:41 +02:00
Daniel Gultsch 7223b5b274 minor code cleanup 2016-04-12 17:52:58 +02:00
Daniel Gultsch 7ff890e513 republish avatar if server offers non-persistent pep :-( 2016-04-11 22:20:32 +02:00
Daniel Gultsch 23a0beab43 version bump to 1.11.6 + changelog 2016-04-10 21:20:13 +02:00
Daniel Gultsch 77f4513862 pulled translations from transifex 2016-04-10 21:19:50 +02:00
Daniel Gultsch 677269606c add entries to gitignore 2016-04-10 00:31:25 +02:00
Daniel Gultsch 5786e75374 don't throw IO exception at end of stream 2016-04-10 00:19:53 +02:00
Daniel Gultsch 91b17c6925 fixed 'connecting…' button 2016-04-10 00:19:20 +02:00
Daniel Gultsch 607b7d1593 moved authentication into seperate method. force close socket before changing status 2016-04-10 00:18:14 +02:00
Daniel Gultsch 83fab06508 introduced setting to turn of notification led 2016-04-09 21:48:06 +02:00
Daniel Gultsch 4652541b61 update gradle and gradle plugin 2016-04-09 21:47:10 +02:00
Daniel Gultsch 65548ddccb use startdate as lower bound when querying archive with after=x 2016-04-09 12:31:08 +02:00
Daniel Gultsch b99d70bfe7 don't show contact details when in conversations with self 2016-04-09 10:59:54 +02:00
Daniel Gultsch 2713fd50c8 use last received message id when querying archive 2016-04-09 10:29:34 +02:00
Daniel Gultsch 14b46c3ee7 transform nimbuzz workaround into a more general 'waitForDisco' condition 2016-04-09 08:53:58 +02:00
Daniel Gultsch a8ebc5fafc add required disco#items query to timeout list 2016-04-08 20:20:37 +02:00
Daniel Gultsch c22b384680 increase version code to fix nasty bug in 1.11.5 beta 2016-04-08 18:29:32 +02:00
Daniel Gultsch db0301310b removed ernoexception in exchange for a regular exeption to prevent verify error on <5.0 2016-04-08 18:28:40 +02:00
Daniel Gultsch 7a84cfdfa2 version bump to 1.11.5 + changelog 2016-04-08 10:41:55 +02:00
Daniel Gultsch c55f7645a4 pulled translations from transifex 2016-04-08 10:41:37 +02:00
Daniel Gultsch 0460702710 check file owner when attaching files or using them as avatar 2016-04-07 20:29:40 +02:00
Daniel Gultsch 290f0a123e prevent null pointer when checking http upload max size 2016-04-07 19:20:45 +02:00
Daniel Gultsch 275d6a858c tell people to build debug instead of release 2016-04-06 21:33:32 +02:00
Daniel Gultsch b4ad2de2e5 version bump to 1.11.4 + changelog 2016-04-05 23:10:55 +02:00
Daniel Gultsch ecaf75e5ec better detect broken pep
mark pep as broken when publishing bundle or device list failed
reset 'brokenness' when account is getting disabled
2016-04-05 13:31:03 +02:00
Daniel Gultsch a968260b18 fixing travis 2016-04-04 21:25:44 +02:00
Daniel Gultsch 0385e3a8d6 switched around info and items query to avoid race condition 2016-04-04 20:35:40 +02:00
Daniel Gultsch e94e06246b pulled translations from transifex 2016-04-04 20:21:00 +02:00
Daniel Gultsch 5787687997 removed unnecessary wait for disconnect 2016-04-04 20:07:09 +02:00
Daniel Gultsch 61997912fd made sure the disco#items query has returned before finalizing the bind 2016-04-04 20:06:07 +02:00
Daniel Gultsch 5eedce91f9 version bump to 1.11.3 and changelog 2016-04-02 18:09:07 +02:00
Daniel Gultsch 701742f550 don't ask for resource when server uses http upload v0.1 2016-04-02 18:07:38 +02:00
Daniel Gultsch 2549ce89b0 check max http file size when attaching files 2016-04-01 00:03:14 +02:00
Daniel Gultsch 74c496fe3e add methods to check max file size for http upload 2016-03-31 21:56:59 +02:00
Daniel Gultsch e074104004 save otr fingerprint in message 2016-03-31 21:15:49 +02:00
Daniel Gultsch 867d0ef191 include form fields into caps hash calculation 2016-03-31 14:21:56 +02:00
Daniel Gultsch 8d98c52803 closed some cursors under error conditions 2016-03-31 13:55:46 +02:00
Daniel Gultsch 343a6b4e6b made setting aes keys in DownloadableFile more readable 2016-03-31 13:55:25 +02:00
Daniel Gultsch d115f38361 Merge pull request #1784 from kriztan/patch-2
Update ShortcutBadger to version 1.1.4
2016-03-28 14:15:35 +02:00
Christian S 1d458e8ab3 Update ShortcutBadger to version 1.1.4 2016-03-27 20:17:51 +02:00
Daniel Gultsch 46be514b4d version bump to 1.11.2 and changelog 2016-03-23 19:24:54 +01:00
Daniel Gultsch a9b66e3ea5 allow to delete attachments. fixes #1539 2016-03-23 19:23:22 +01:00
Daniel Gultsch 281cb65046 only add image files to media scanner 2016-03-23 12:20:09 +01:00
Daniel Gultsch 564113669e update build deps 2016-03-23 12:04:23 +01:00
Daniel Gultsch 0baa2dd03e Merge pull request #1780 from licaon-kter/patch-1
Typo `attempt`
2016-03-22 11:00:37 +01:00
licaon-kter 6ba90ec43c Typo `attempt` 2016-03-22 11:54:45 +02:00
Daniel Gultsch 135c8567a5 show room nick for /me command in sent muc messages. fixes #1773 2016-03-20 17:33:42 +01:00
Daniel Gultsch ac09011690 be less strict when sharing EXTRA_TEXT intents 2016-03-20 17:25:16 +01:00
Daniel Gultsch 7df24407dc be more careful to avoid creating multiple connections 2016-03-20 17:24:41 +01:00
Daniel Gultsch b51ce43d36 don't show v\omemo keys as such if not enabled 2016-03-20 17:24:15 +01:00
Daniel Gultsch c4b1f6171d version bump to 1.11.1 and changelog 2016-03-16 18:12:36 +01:00
Daniel Gultsch b17ca3543f made it possible to share text files 2016-03-16 18:09:19 +01:00
Daniel Gultsch 48be5af55f reworked sharewith activity to stay open during sharing
closing the activity prematuraly caused uri permissions to be revoked
2016-03-16 10:46:33 +01:00
Daniel Gultsch 323d31ba05 Merge pull request #1767 from fiaxh/path_file_accessible
Check if path for URI is accessible
2016-03-16 10:44:13 +01:00
fiaxh eaddfa7fd1 Check if path for URI is accessible
The path extracted from the Cursor might not be accessible for Conversations. FileUtils accesses URI information through the ContentProvider, so this wouldn't be noticed.
Fixes sharing from open-keychain's TemporaryContentProvider
2016-03-15 11:42:13 +01:00
Daniel Gultsch 678bc7b4d4 removed requirement of external component for http upload 2016-03-14 12:16:36 +01:00
Daniel Gultsch 815c534da8 pulled translations from transifex 2016-03-13 17:43:43 +01:00
Daniel Gultsch 0af8ee341c simplified getUsers(max) code 2016-03-13 17:42:17 +01:00
Daniel Gultsch 1153e6120d added logging in case fragment wasn't attached 2016-03-13 17:41:38 +01:00
Daniel Gultsch 290f53f4a6 fixed recursive call instead of call to super in PublishProfileActivity 2016-03-13 17:39:13 +01:00
Daniel Gultsch 817d344521 log reason for bind failure 2016-03-11 09:01:40 +01:00
Daniel Gultsch 9548f43998 close cursor in caps db query 2016-03-11 09:01:27 +01:00
Daniel Gultsch 7eb736227e mention mod_smacks_offline and ejabberds settings in readme 2016-03-10 14:47:55 +01:00
Daniel Gultsch 1e75283250 version bump to 1.11.0 2016-03-07 11:06:41 +01:00
Daniel Gultsch 24aefa109c pulled translations from transifex 2016-03-06 21:35:59 +01:00
Daniel Gultsch e6a9829dd2 don't show opt-out of battery optimization dialog when push is enabled 2016-03-06 15:53:49 +01:00
Daniel Gultsch 86fff5839a warn in conversations when account is disabled 2016-03-06 12:16:29 +01:00
Daniel Gultsch 8339ebf3dc version bump to 1.11.0-beta.3 2016-03-05 09:49:43 +01:00
Daniel Gultsch d3542202b5 Merge branch 'Mess' of https://github.com/tarun018/Conversations into tarun018-Mess 2016-03-04 21:31:54 +01:00
Daniel Gultsch e9b4a2a021 show host in file size checker 2016-03-04 21:30:34 +01:00
Daniel Gultsch 09d87965fb mark oob messages and always display download button 2016-03-04 20:09:21 +01:00
Daniel Gultsch aa24a0f779 don't automatically crop avatar 2016-03-04 14:32:38 +01:00
Daniel Gultsch 89eea3636f add a few more know file extensions 2016-03-04 11:24:53 +01:00
Daniel Gultsch 07263370d9 allow to copy original url even while downloading. fixes #1743 2016-03-04 11:24:40 +01:00
Daniel Gultsch cc67bfd8db version bump to 1.11.0-beta.2 2016-03-03 14:07:48 +01:00
Daniel Gultsch bc5f64bffe moved avatarfetcher reset code to bind 2016-03-03 13:33:02 +01:00
Daniel Gultsch 4cb2d0ca93 avoid unnecessary disconnect. prevent NetworkOnMainThreadException 2016-03-03 13:31:59 +01:00
Daniel Gultsch c9e4b332bf don't break with srcoll events on empty message lists 2016-03-03 11:14:59 +01:00
Daniel Gultsch aaf64732b0 expert option to treat vibrate as silent mode for XA. fixes #1530 2016-03-01 19:00:18 +01:00
Daniel Gultsch 15a1873d97 removed unused config variable 2016-03-01 18:58:33 +01:00
Daniel Gultsch fd246f7e5a properly persist accepted crypto targets 2016-03-01 12:22:20 +01:00
Daniel Gultsch ab4d86dde7 version bump to 1.11.0-beta, changelog and updated readme 2016-03-01 11:44:51 +01:00
Daniel Gultsch 198dc2c6b4 let users confirm each member in a conference even if that contact is already trusted 2016-03-01 11:26:59 +01:00
Tarun df7b399e04 Fix Issue #1634 : Shows XMPP URI as links.
Shows XMPP URI as links, other than Web URL's and Email Addresses. Also performs respective actions on clicking XMPP URI.
2016-02-29 23:35:50 +05:30
Daniel Gultsch 134c75ae01 use correct jid when leaving a conference. fixes #1732 2016-02-29 16:32:24 +01:00
Daniel Gultsch 9e0466d1e6 refactored omemo to take multiple recipients 2016-02-29 13:18:07 +01:00
Daniel Gultsch 199ae3a4d8 rename purge keys positive button to 'purge keys' 2016-02-28 23:10:50 +01:00
Daniel Gultsch 4ba41540fd made hashtable in roster store jids instead of strings 2016-02-28 20:45:50 +01:00
Daniel Gultsch 5cdfd0ec50 removed unneeded proguard files 2016-02-27 20:04:05 +01:00
Daniel Gultsch 24a9ac2908 always search offline contacts as well. fixes #1653 2016-02-27 15:41:34 +01:00
Daniel Gultsch 2c224d0f18 Merge branch 'master' of github.com:siacs/Conversations 2016-02-27 11:26:09 +01:00
Daniel Gultsch 3cf21e2d37 Merge pull request #1721 from fiaxh/export_logs_storage_permission
Request WRITE_EXTERNAL_STORAGE for ExportLogsPreference in >= M
2016-02-27 11:25:56 +01:00
Daniel Gultsch 60ab03afb1 changed single_account config into more simple lock_settings 2016-02-27 10:25:31 +01:00
Daniel Gultsch c393e60891 version bump to 1.10.1 and changelog 2016-02-26 09:53:02 +01:00
Daniel Gultsch 7fd6a37e67 disallow message correction by default. fixes #1720 2016-02-26 09:48:58 +01:00
Daniel Gultsch dc00a92499 execute pending mam queries every time we come online 2016-02-26 09:46:25 +01:00
Daniel Gultsch 5d3ee60ca4 hide add account icons when single_account is set to true 2016-02-24 17:12:29 +01:00
Daniel Gultsch bbede8bbeb optionally lock conference domains as well and hide known domains in ui 2016-02-24 16:53:19 +01:00
fiaxh e1a2f248af Request WRITE_EXTERNAL_STORAGE for ExportLogsPreference in >= M 2016-02-24 16:35:26 +01:00
fiaxh a88c2d48c0 No possibility of multiple invocation of log export 2016-02-24 15:10:41 +01:00
Daniel Gultsch d1a456f3e3 made hard coded choice for encryptions more flexible and disable parsing 2016-02-24 14:47:49 +01:00
Daniel Gultsch ddafa65849 Merge pull request #1715 from fiaxh/gpg_decryption_failed
PGP Retry decryption from message menu
2016-02-24 09:23:30 +01:00
Daniel Gultsch 17b1fcc3ea set noMessagesLeftOnServer before conference configuration fetch 2016-02-23 16:15:55 +01:00
Daniel Gultsch 34f2a63190 update notification after message correction 2016-02-23 16:15:23 +01:00
Daniel Gultsch 0298f0181e reset pending subscription request when receiving roster update 2016-02-23 16:14:55 +01:00
fiaxh 894b5892a9 Retry decryption from message menu 2016-02-23 16:05:42 +01:00
Daniel Gultsch 20eebe638b Revert "disable predexing on travis"
This reverts commit ad063d00cc.
2016-02-23 14:33:03 +01:00
Daniel Gultsch ad063d00cc disable predexing on travis 2016-02-23 14:25:13 +01:00
Daniel Gultsch beb216c300 made presences object final in contact 2016-02-23 14:25:01 +01:00
Daniel Gultsch 7f45e210af fixed typo in travis.yml 2016-02-23 13:54:24 +01:00
Daniel Gultsch f1c947f0d6 fixed formating in travis config 2016-02-23 11:20:44 +01:00
Daniel Gultsch 9ae997cab8 added remark that users don't need their own app server 2016-02-23 10:15:07 +01:00
Daniel Gultsch 4a9753bebc tell travis to build free version 2016-02-23 09:29:18 +01:00
Daniel Gultsch 5eb2d9af83 update build instructions in readme 2016-02-23 09:07:47 +01:00
Daniel Gultsch 689ded1607 properly trigger show load more messages in mucs 2016-02-22 20:28:58 +01:00
Daniel Gultsch a0d0ed34ae turned muc errors into enum. added error codes for service shutdown 2016-02-22 20:19:58 +01:00
Daniel Gultsch c20d8ac69e version bump to 1.10.0 2016-02-21 23:03:30 +01:00
Daniel Gultsch d2cfac222e show load more messages when auto loading is disabled and messages are still left on server 2016-02-21 17:32:46 +01:00
Daniel Gultsch b00c561f81 check for uuid change when decrypting pgp messages 2016-02-21 11:43:03 +01:00
Daniel Gultsch ed740b4868 some mucs may grant voice to visitors in unmoderated rooms 2016-02-21 11:42:41 +01:00
Daniel Gultsch 43b466704a pulled translations from transifex 2016-02-20 10:25:23 +01:00
Daniel Gultsch 3bde4dbedb change uuid when replacing messages 2016-02-20 00:01:39 +01:00
Daniel Gultsch e6f8b7d9fa decrypt pgp message corrections 2016-02-19 21:02:33 +01:00
Daniel Gultsch a2cb009f4c skip avatar ui when pep is not available. fixes #1706 2016-02-19 20:54:53 +01:00
Daniel Gultsch df992d2566 don't reset whisper on reInit. fixes #1637 2016-02-19 20:54:43 +01:00
Daniel Gultsch ad60bc002c pulled translations from transifex 2016-02-19 11:14:16 +01:00
Daniel Gultsch 49a3f6f281 never parse show in presences as offline 2016-02-19 11:09:28 +01:00
Daniel Gultsch ac687d6bbd don't log start reason 2016-02-17 16:52:57 +01:00
Daniel Gultsch 59978e157c only offer message correction for the very last message 2016-02-17 16:51:36 +01:00
Daniel Gultsch 3626e4b3a0 fixed regression that caused messages in muc not being send 2016-02-17 16:50:48 +01:00
Daniel Gultsch c2fbdbde83 log reason why otr message won't be parsed 2016-02-16 14:22:47 +01:00
Daniel Gultsch 86b1865eec fixed regression that caused ui to redraw a lot 2016-02-16 14:22:21 +01:00
Daniel Gultsch 726393f8da version bump to 1.10.0-beta and changelog 2016-02-16 12:59:54 +01:00
Daniel Gultsch 349dd8291d made clear that archiving preferences are server side 2016-02-16 12:52:31 +01:00
Daniel Gultsch c39008983e Merge pull request #1700 from petmue/master
Fixed some typos in the README.md
2016-02-16 12:27:29 +01:00
petmue a27cbfbf56 Fixed some typos. 2016-02-16 12:18:43 +01:00
Daniel Gultsch 7d63b06d84 Update README.md 2016-02-16 10:36:40 +01:00
Daniel Gultsch d06013fbaf updated XEP list 2016-02-16 10:04:03 +01:00
Daniel Gultsch a5e40672c1 added gcm values file to gitignore 2016-02-16 09:58:26 +01:00
Daniel Gultsch a9b957e8a2 added setting to opt-out of message correction. renamed preferences and options to settings 2016-02-16 09:57:59 +01:00
Daniel Gultsch 0ca4a33bfb added some OTR logging 2016-02-16 09:15:41 +01:00
Daniel Gultsch c0b3a3ff0c basic support for XEP-0308: Last Message Correction. fixes #864 2016-02-15 23:15:04 +01:00
Daniel Gultsch 335058b78b removed unnecessary conditions when sending read marker 2016-02-15 23:09:42 +01:00
Daniel Gultsch c4b1df1bf3 add missing type='submit' attribute to enable push form 2016-02-15 22:12:39 +01:00
Daniel Gultsch c3f0503a91 pulled translations from transifex 2016-02-15 12:35:35 +01:00
Daniel Gultsch 8ccb2005b3 only show load more messages button when mam is available
also update ui after that button has been pressed. fixes #1695
2016-02-14 23:53:17 +01:00
Daniel Gultsch 356199978e fixed server info push not showing up when unavailable 2016-02-14 18:19:11 +01:00
Daniel Gultsch 92a6e956fd be more carefull when checking push availability 2016-02-14 15:36:37 +01:00
Daniel Gultsch 300326fba3 deleted invalid gcm strings 2016-02-14 14:14:53 +01:00
Daniel Gultsch 251f2479c2 optional mode to close tcp connection when going into background
acts only when push is available. disable all non-push accounts to test properly
2016-02-14 13:20:23 +01:00
Daniel Gultsch 6f9f871928 send push enable to server. simplified logging 2016-02-13 14:20:07 +01:00
Daniel Gultsch c7a14092a8 fixed compile bug in free version 2016-02-13 00:03:57 +01:00
Daniel Gultsch 6217e33a87 removed gcm plugin from gradle. fixes #1693 2016-02-12 23:38:30 +01:00
Daniel Gultsch c430848ade push gcm token on bind instead of every connect 2016-02-12 23:37:42 +01:00
Daniel Gultsch bac249c8dd add play services to travis config 2016-02-12 12:06:35 +01:00
Daniel Gultsch 32da65f910 client side support for XEP-0357: Push Notifications 2016-02-12 11:39:27 +01:00
Daniel Gultsch 93dad9b737 pulled translations from transifex 2016-02-11 22:45:40 +01:00
Daniel Gultsch d58d822215 version bump to 1.9.4 + changelog 2016-02-11 17:13:17 +01:00
Daniel Gultsch f37098a54f catch all axolotl parse exception at once. fixes #1692 2016-02-11 12:26:43 +01:00
Daniel Gultsch 1bb38e25f2 send muc messages after join 2016-02-10 09:53:48 +01:00
Daniel Gultsch f16690ae1f allow user to set MAM preferences 2016-02-09 13:01:17 +01:00
Daniel Gultsch 91ec4839ac prepend instead off append mam messages to conversations when going in reverse 2016-02-04 16:40:18 +01:00
Daniel Gultsch 28733e052f fixed performance regression in on scroll listener 2016-02-04 16:29:17 +01:00
Daniel Gultsch 4fdb0d92fe prevent previoulsly cleared messages from reloading. fixes #1110 2016-02-04 14:39:16 +01:00
Daniel Gultsch f88b8c703e add more fault tolerant checks for messages left on server 2016-02-04 11:55:42 +01:00
Daniel Gultsch 17791a703e removed unecessary logging when muc tiles update 2016-02-04 10:27:38 +01:00
Daniel Gultsch 7dd9545ea3 use TLSv1.2 as SSL context on supported plattforms 2016-02-03 18:17:16 +01:00
Daniel Gultsch 1d572c61d0 cache server caps 2016-02-03 17:19:05 +01:00
Daniel Gultsch 0911669b07 count all messages in a query 2016-02-03 16:04:21 +01:00
Daniel Gultsch 1274b0ef39 Revert "get rid of broken totalMessageCount for mam queries"
This reverts commit 58c6f9bfb2.
2016-02-03 10:40:44 +01:00
Daniel Gultsch f0798216d5 refactored disco cache. avoid making duplicate call. check hash 2016-02-03 10:40:02 +01:00
Daniel Gultsch 4a1a59f0c8 Merge branch 'disco-caps' of https://github.com/singpolyma/Conversations into singpolyma-disco-caps 2016-02-02 18:19:26 +01:00
Daniel Gultsch 01bad12708 fixed 'unencrypted' not showing up for conferences when encryption is forced 2016-02-02 18:15:57 +01:00
Daniel Gultsch 58c6f9bfb2 get rid of broken totalMessageCount for mam queries 2016-02-02 15:39:46 +01:00
Daniel Gultsch fab0a45955 re-read common name from certificates on startup 2016-02-02 13:43:20 +01:00
Daniel Gultsch ba9ba8ffe2 avoid npe when accessing the pgp connection service 2016-02-02 11:21:29 +01:00
Daniel Gultsch f30df7a535 catch a few NPE when parsing invalid pep nodes 2016-02-02 11:21:07 +01:00
Daniel Gultsch ae83efe4a6 version bump to 1.9.3 2016-02-01 14:25:59 +01:00
Daniel Gultsch 3978c04782 respect autojoin setting on newly created bookmarks as well 2016-02-01 14:22:52 +01:00
Daniel Gultsch 1e7647e385 opt out handling of the autojoin flag. fixes #1666 2016-02-01 13:54:08 +01:00
Daniel Gultsch d1fc90f981 Merge branch 'master' of github.com:siacs/Conversations 2016-02-01 12:33:03 +01:00
Daniel Gultsch 336daea875 made create context menu call in StartConversationsActivity more failsafe 2016-02-01 12:31:46 +01:00
Daniel Gultsch a3e11415ec refactored user handling in conferences. show try again button when conference has errors 2016-02-01 12:11:40 +01:00
Daniel Gultsch 2eef37174e fixed false set of subject in conference with empty body tag 2016-01-31 14:42:35 +01:00
Daniel Gultsch 19c2ca520c Update README.md 2016-01-31 11:25:17 +01:00
Daniel Gultsch 82870b27ed prefer dns servers from networsk with the default route 2016-01-29 12:12:23 +01:00
Daniel Gultsch c416948f8b be more careful with resetting the stream id 2016-01-29 12:09:55 +01:00
Daniel Gultsch 28ebf927fb try to make in-valid-session detection work for pgp 2016-01-29 12:09:31 +01:00
Daniel Gultsch d2c5a939ed show values in formfieldwrappers and allow form to be set to read only 2016-01-26 17:23:24 +01:00
Daniel Gultsch edc6ce4ff2 hide jid row in list item list when jid is null 2016-01-26 14:47:34 +01:00
Daniel Gultsch 7c0eae8059 expert setting to trigger extended connection options 2016-01-25 21:17:53 +01:00
Stephen Paul Weber ae84ff2f0c Do disco for caps hashes we have never seen
Then cache it
2016-01-24 17:46:08 -05:00
Stephen Paul Weber 000f59d614 Fetch cached caps result on new presence 2016-01-24 17:46:08 -05:00
Stephen Paul Weber bf5b2f73f5 Use a Presence class for presence information
Only has status for now, but doing it so I can add disco to it
2016-01-24 17:46:08 -05:00
Daniel Gultsch 31fd425c9a changed FileBackend API to allow files instead of messages to be copied and resized 2016-01-24 12:17:00 +01:00
Daniel Gultsch 8850a1fbe3 added FormWrapper and form field validation 2016-01-23 20:32:00 +01:00
Stephen Paul Weber ad36a4ba89 Persisitence and loading for ServiceDiscoveryResult 2016-01-23 10:53:56 -05:00
Stephen Paul Weber 56f8fff935 Implement toJSON on ServiceDiscoveryResult 2016-01-23 10:52:45 -05:00
Stephen Paul Weber 1e335d527b Generate capHash from any discovery result 2016-01-23 10:52:44 -05:00
Stephen Paul Weber fccce229c6 Factor out a representation of XEP-0030 results
And the parser from Element to this representation.
2016-01-23 10:52:40 -05:00
Daniel Gultsch 0569a1e769 introduced boolean form field wrapper 2016-01-23 16:23:23 +01:00
Daniel Gultsch 39fdf4a333 added support for field types jid-single and text-private 2016-01-23 12:44:08 +01:00
Daniel Gultsch 6140861143 reset stanza queue when resetting xmppconnection 2016-01-23 11:40:32 +01:00
Daniel Gultsch 43521891f0 show fetch errors in trust keys activity 2016-01-23 11:39:02 +01:00
Daniel Gultsch ba98fe4f86 use extract account from intent method and final EXTRA_ACCOUNT variable 2016-01-22 20:46:24 +01:00
Daniel Gultsch a6c5430cdd added UI wrapper for (some) form fields 2016-01-22 20:22:47 +01:00
Daniel Gultsch a47430c2f7 added convenience method to extract account from intent 2016-01-22 20:21:45 +01:00
Daniel Gultsch 40005cec1b added config variable to allow non-tls connections 2016-01-22 11:20:31 +01:00
Daniel Gultsch 77c0fb0b2a changed spacing in create dialogs and notify user when no accounts are activated 2016-01-22 11:14:56 +01:00
Daniel Gultsch 3ff40a9733 increased padding in create contact/conference dialog 2016-01-21 18:10:19 +01:00
Daniel Gultsch eacc7ed1e6 add convenience to get an account object from a spinner 2016-01-21 17:57:24 +01:00
Daniel Gultsch 62a88a4db8 version bump to 1.9.2 + changelog 2016-01-20 17:30:33 +01:00
Daniel Gultsch 20f6a4704c pulled translations from transifex 2016-01-20 17:18:53 +01:00
Daniel Gultsch e71acdef29 catch security exception when user prevents access to address book 2016-01-20 16:18:15 +01:00
Daniel Gultsch 0619685e55 add intent!=null check in onActivityResultin PublishProfilePicture 2016-01-20 16:11:17 +01:00
Daniel Gultsch ba143a2730 Merge branch 'master' of github.com:siacs/Conversations 2016-01-16 22:48:27 +01:00
Daniel Gultsch 0b239243d9 Merge pull request #1655 from adithyaphilip/pgp-fix
Fixes having to choose PGP twice, upgrades openpgp-api to 10
2016-01-16 21:35:38 +01:00
Daniel Gultsch 3acaec7bcd pulled translations from transifex 2016-01-16 21:21:14 +01:00
Daniel Gultsch a83365ee95 make ConversationsActivity more resistent against being restarted 2016-01-16 21:18:59 +01:00
Daniel Gultsch 7b1efe15cd reuse same xmppconnection for reconnects 2016-01-16 19:21:11 +01:00
Daniel Gultsch 41ae4af1b8 made constructor private in Account entity 2016-01-16 18:57:47 +01:00
Daniel Gultsch ad5bcb7d43 removed some unused methods from db backend 2016-01-16 18:57:19 +01:00
Adithya Abraham Philip a9a3ef0f67 fixed PGP having to be selected twice 2016-01-16 04:26:01 +05:30
Adithya Abraham Philip f64018d0a2 upgraded to OpenKeychain api v10 2016-01-16 04:26:01 +05:30
Daniel Gultsch ca7b397828 version bump to 1.9.1 2016-01-15 23:48:04 +01:00
Daniel Gultsch 494a04ffb1 hide prepare image toasts when attaching multiple images 2016-01-15 23:47:55 +01:00
Daniel Gultsch d85854b686 show toast when image cropper get oom 2016-01-15 23:47:16 +01:00
Daniel Gultsch 943d0391d4 catch exception when reading message id from database 2016-01-15 23:46:52 +01:00
Daniel Gultsch c5743067ad nimbuzz.com: don't wait for disco replies to set account to online 2016-01-15 14:26:23 +01:00
Daniel Gultsch 635210d278 pulled translations for 1.9.0 release from transifex 2016-01-14 21:52:17 +01:00
Daniel Gultsch 0dede0e1de version bump to 1.9.0 2016-01-14 20:51:09 +01:00
Daniel Gultsch aa6955a0d6 fixed typo when reading battery_op setting 2016-01-14 20:38:16 +01:00
Daniel Gultsch 12fd5c46ef show /me messages in conference notifications without the name of the sender 2016-01-13 17:36:04 +01:00
Daniel Gultsch 3b3aa5b584 version bump to 1.9.0-beta.3 2016-01-13 12:20:24 +01:00
Daniel Gultsch 14428da108 show key fetch error in activity when there are no keys to be used 2016-01-13 12:19:56 +01:00
Daniel Gultsch 571eb2f7f9 check for file storage permission before selecting avatar 2016-01-13 12:05:59 +01:00
Daniel Gultsch 5f63c397fa Merge pull request #1649 from dhiru1602/master
use batch transactions when writing roster
2016-01-13 10:56:29 +01:00
Dheeraj CVR ffb49c7217 use batch transactions when writing roster
Fixes https://github.com/siacs/Conversations/issues/1648
2016-01-13 11:56:35 +04:00
Daniel Gultsch 3e9fd0185a throw security exception instead of going to next srv entry 2016-01-12 23:42:47 +01:00
Daniel Gultsch da298cfe59 Merge branch 'master' of github.com:siacs/Conversations 2016-01-12 23:41:35 +01:00
Daniel Gultsch 38c936b8ef Merge pull request #1647 from SamWhited/TorStringFix
s/TOR/Tor/g
2016-01-12 22:58:51 +01:00
Sam Whited a6b729df43 s/TOR/Tor/g 2016-01-12 15:41:39 -06:00
Daniel Gultsch d122d224bb pulled translations from transifex 2016-01-12 16:43:38 +01:00
Daniel Gultsch 64420f79e5 version bump to 1.9.0-beta.2 2016-01-12 16:39:04 +01:00
Daniel Gultsch 893751a1d2 move some ssl socket modifiers into a seperate helper class 2016-01-12 16:33:15 +01:00
Daniel Gultsch 5f1e30288a Merge branch 'master' of https://github.com/moparisthebest/Conversations into moparisthebest-master 2016-01-12 15:35:50 +01:00
Daniel Gultsch 921d567dcb use match_parent as height in conversations overview 2016-01-12 15:35:23 +01:00
Daniel Gultsch da6076028f Revert "Add additional warnings to OMEMO purge key function"
This reverts commit 3bea5b25cd.
2016-01-12 09:48:49 +01:00
Andreas Straub 3bea5b25cd Add additional warnings to OMEMO purge key function
People continue to press the "don't press this" button. Maybe adding
some warnings indicating that this button will not fix their problems
will help...
2016-01-12 09:33:54 +01:00
Travis Burtrum 217f6603c0 Implement XEP-0368: SRV records for XMPP over TLS 2016-01-11 17:25:16 -05:00
Daniel Gultsch 20ec9ff2c6 reworked that loop that iterates over various servers 2016-01-11 19:05:25 +01:00
Daniel Gultsch a85bba0010 new art renders 2016-01-11 18:29:02 +01:00
Daniel Gultsch 6af02b2cc5 Merge branch 'logo_fixes' of https://github.com/fiaxh/Conversations into logo_fixes 2016-01-11 16:03:56 +01:00
fiaxh 000bec2c7b Cleaned up logo 2016-01-11 15:57:24 +01:00
Daniel Gultsch 7f1de73784 don't use the word phone in strings 2016-01-11 15:34:26 +01:00
Daniel Gultsch 07a5ccf4d7 Merge branch 'master' of github.com:siacs/Conversations 2016-01-11 14:28:15 +01:00
Daniel Gultsch 4d38ba906f pulled translations from transifex 2016-01-11 11:19:41 +01:00
Daniel Gultsch 616241be11 add changelog for 1.9.0 2016-01-11 11:17:57 +01:00
Daniel Gultsch c296d6f446 ask to be excluded from battery optimization 2016-01-11 11:17:45 +01:00
Andreas Straub 41afd552e9 Clean up Conversations logo SVG
The previous version of the logo had some wonky alignments and other
artifacts in some places on the dashed line. This commit provides a new
version of the logo with perfect alignments.

It also includes a single path for the dashed line, which can be used
to ease further modifications to the logo.
2016-01-10 20:17:33 +01:00
Daniel Gultsch 95db6db935 bump version code for beta 2016-01-09 16:45:10 +01:00
Daniel Gultsch 4ab8fe13de let the user decide on whether or not to compress pictures 2016-01-09 16:17:39 +01:00
Daniel Gultsch 708d7c5b98 automatically adjust image compression to keep files under 512MiB 2016-01-09 16:16:18 +01:00
Daniel Gultsch 6acb80a83a added Config.java variable to change the default notification behaviour to always 2016-01-08 22:07:23 +01:00
Daniel Gultsch 9dce42ac7f don't show snackbar when notifications are disabled or paused 2016-01-08 21:35:20 +01:00
Daniel Gultsch a3e136b550 show per conference notification settings in details activity 2016-01-08 21:30:46 +01:00
Daniel Gultsch 0bb3ae37f0 show icon in conversations overview when notifications are disabled 2016-01-08 14:41:55 +01:00
Daniel Gultsch 5dd5685885 Merge pull request #1641 from fiaxh/uuid-fix
Correct uuid check according to RFC 4122
2016-01-08 00:17:21 +01:00
Daniel Gultsch c59eb75a59 avoid duplicate messages when sending files to mucs. fixes #1635 2016-01-06 12:59:13 +01:00
fiaxh 62d0eebe5c Correct uuid check according to RFC 4122 2016-01-05 20:07:29 +01:00
Daniel Gultsch c3e2d2cfba added missing synchronize when pushing messages from mam backlog 2016-01-04 20:14:29 +01:00
Daniel Gultsch fb97f9d18f null check in getOriginalPath 2016-01-04 20:14:08 +01:00
Daniel Gultsch abdb8bfb65 version bump to 1.8.4 and changelog 2016-01-04 17:36:46 +01:00
Daniel Gultsch 501034fe0e Allow entering a JID from 'choose contact'. thanks @singpolyma
fixes #1611
fixes #1602
2016-01-04 17:27:54 +01:00
Daniel Gultsch fdb6b0e30d only report error after third unsuccesful attempt to connect 2016-01-04 15:33:11 +01:00
Daniel Gultsch f815a7cd26 properly rotate avatars 2016-01-04 15:17:02 +01:00
Daniel Gultsch 95bf0630f0 show trust keys activties if own keys are undecided 2016-01-04 12:11:58 +01:00
Daniel Gultsch c116f735dc add obb url to unencrypted messages 2016-01-03 19:39:06 +01:00
Daniel Gultsch a319446d41 edit account activity was still showing the omemo key with leading 0x05. fixes #1631 2016-01-03 19:38:48 +01:00
Daniel Gultsch d875061407 removed xhtml body. fixes #1594 2016-01-01 16:52:32 +01:00
Daniel Gultsch 73e2389eee use actual message timestamp instead of delay when updating last seen. fixes #1618 2015-12-31 18:06:11 +01:00
Andreas Straub 58d213f291 Fix OMEMO session creating loggin
Now prints the correct JID to the log when finding devices without
sessions.
2015-12-31 15:48:43 +01:00
Daniel Gultsch 42fb9539f8 version bump and changelog 2015-12-29 12:54:58 +01:00
Daniel Gultsch cfccf5e90d handle null names in getColorForName 2015-12-29 10:32:54 +01:00
Daniel Gultsch 7bb67ee660 strip leading 0x05 off omemo fingerprints 2015-12-27 18:37:31 +01:00
Daniel Gultsch 703d95fcf8 lower case all fingerprints. fixes #1521 2015-12-27 18:37:12 +01:00
Daniel Gultsch c3bdec1ce9 dedublicate bookmarks 2015-12-27 17:29:32 +01:00
Daniel Gultsch bcf99db3df fixed stuck at omemo encryption when x509 verification is being used 2015-12-27 17:29:19 +01:00
Daniel Gultsch f49158a44b register context menu long click listener on message text. fixes #1614 2015-12-27 17:28:42 +01:00
Daniel Gultsch be91c0741f made text selectable again unless text contains more than 1 link
fixes #1615
2015-12-26 19:18:37 +01:00
Daniel Gultsch c40372fc0d code cleanup 2015-12-23 22:30:14 +01:00
Daniel Gultsch f46cbb38a9 show certificate information 2015-12-23 19:18:53 +01:00
Daniel Gultsch d0bad09f13 save certificate when verifying with x509 2015-12-23 17:41:26 +01:00
Daniel Gultsch 1867571368 version bump to 1.8.2 2015-12-20 19:37:33 +01:00
Daniel Gultsch ae491764f2 pulled translations from transifex 2015-12-20 19:37:27 +01:00
Daniel Gultsch 534013fd0c store identity key in XmppAxolotlSession instead of the fingerprint 2015-12-19 15:44:11 +01:00
Daniel Gultsch ade89beb96 use presence name not server name when verification is being used 2015-12-19 13:07:38 +01:00
Daniel Gultsch 15c8cb8ac6 add more debugging to certificate checks after new omemo session was established 2015-12-19 12:44:55 +01:00
Daniel Gultsch e8bf5cada4 only offer plain and omemo encryption when x509 verification is enabled 2015-12-19 12:44:12 +01:00
Daniel Gultsch f05f97251c prefer server name over address book name when x509 verification is being used 2015-12-19 12:43:09 +01:00
Daniel Gultsch 20b4e756fe add 'store' message hint to displayed chat markers 2015-12-17 15:32:03 +01:00
Daniel Gultsch f510b2ba2d pulled translations from transifex 2015-12-17 15:20:28 +01:00
Daniel Gultsch 0f9058ffef throw exception at the end of the stream 2015-12-17 15:20:06 +01:00
Daniel Gultsch e10a0b0c4c let message parser not artifically fail on messages with no to attribute 2015-12-17 14:30:00 +01:00
Daniel Gultsch 43dd681239 timeout service discovery after 20s 2015-12-15 19:24:05 +01:00
Daniel Gultsch 85f36e9dbc default force encryption to false 2015-12-14 10:58:55 +01:00
Daniel Gultsch f6b22dad20 splite PARANOIA_MODE into three different options 2015-12-14 10:54:55 +01:00
Daniel Gultsch 042939e44d make message text non-selectable. fixes #1606 2015-12-14 10:44:43 +01:00
Daniel Gultsch aa472a0098 pulled translations from transifex 2015-12-13 11:09:42 +01:00
Daniel Gultsch b0a314411f version code bump and tagging 1.8.1 2015-12-13 11:06:56 +01:00
Daniel Gultsch 50817956c2 changed order of send presence and execute mam queries 2015-12-12 16:01:33 +01:00
Daniel Gultsch 88523bbb50 more detailed logging 2015-12-12 15:58:22 +01:00
Daniel Gultsch 5e4b55a0ff notfiy after mam catchup only if message count > 0 2015-12-11 20:43:50 +01:00
Daniel Gultsch 5e79e94e77 bump version code 2015-12-11 20:37:52 +01:00
Daniel Gultsch a1ac4fd665 fix cancelation of http downloads and enable resume 2015-12-11 20:33:41 +01:00
Daniel Gultsch b2c278c91b set bookmark name to room subject if no subject has been set before 2015-12-11 19:28:44 +01:00
Daniel Gultsch 293e820a58 get rid of lastMessageTransmitted in favor of db query 2015-12-11 13:52:04 +01:00
Daniel Gultsch 61b0681109 pulled translations from transifex 2015-12-11 13:27:33 +01:00
Daniel Gultsch 5ffb87059c renamed pretty-please-store message hint to store 2015-12-10 23:37:38 +01:00
Daniel Gultsch 4cae283cff version bump to 1.8.1 and changelog 2015-12-10 23:17:11 +01:00
Daniel Gultsch 15f220747f some more NPE checks 2015-12-10 23:16:39 +01:00
Daniel Gultsch 55c1129a65 notify on mam catchup messages 2015-12-10 23:05:11 +01:00
Daniel Gultsch 2262921ff4 properly clean up timed out mam queries 2015-12-10 18:28:47 +01:00
Daniel Gultsch ede92235d7 disable sm logging 2015-12-10 18:26:31 +01:00
Daniel Gultsch 5bd70cfee8 always show conversations with pending subscription requests 2015-12-09 12:18:06 +01:00
Daniel Gultsch 5e151c7311 wait with status change to online after all disco queries have been made 2015-12-09 11:16:03 +01:00
Daniel Gultsch 11e58607c9 when no avatar found show avatar of contact and not the muc user in conferences 2015-12-09 10:30:26 +01:00
Daniel Gultsch aea664a0ec show sender name for notications in conferences. fixes #1581 2015-12-09 10:26:30 +01:00
Daniel Gultsch 1de74c2337 also verify sessions in CBE mode that got created by key transport messages 2015-12-08 17:15:08 +01:00
Daniel Gultsch b9fc7ebe24 pulled translations from transifex 2015-12-07 13:54:59 +01:00
Daniel Gultsch 312387d844 add new build-tools version to travis 2015-12-07 13:26:01 +01:00
Daniel Gultsch ac06cb2e4f modified contact permission dialog 2015-12-07 13:24:41 +01:00
Daniel Gultsch 739648e909 ask for contact permissions when first opening StartConversationActivity 2015-12-07 13:24:41 +01:00
Daniel Gultsch c3e8fb3446 request storage permission when needed on Android 6.0 2015-12-07 13:24:41 +01:00
Daniel Gultsch 739a2d609d implement direct sharing in android 6.0. fixes #1321 2015-12-07 13:24:41 +01:00
Daniel Gultsch 164d341915 version bump to 1.8.0 2015-12-07 13:20:00 +01:00
Daniel Gultsch 904edf5d59 hide prepare file toast after preparing the file 2015-12-06 11:57:11 +01:00
Daniel Gultsch bd765c59ce check availabiltiy of pgp before sharing files 2015-12-05 19:03:17 +01:00
Daniel Gultsch b7f326372d be more carefull with pending uris 2015-12-05 19:02:57 +01:00
Daniel Gultsch 6358f641e7 check for query object as condition to trigger deduplication instead of serverId 2015-12-05 18:41:38 +01:00
Daniel Gultsch 72b781b845 updated changelog 2015-12-05 16:29:38 +01:00
Daniel Gultsch 41dcd8005b parse stanza-id from messages 2015-12-04 22:03:46 +01:00
Daniel Gultsch cd9a29718b properly clear muc user avatar caches 2015-12-04 21:36:48 +01:00
Daniel Gultsch 9d1e8a34b2 fixed showing avatars for contacts in muc 2015-12-04 18:39:09 +01:00
Daniel Gultsch 196c8e593f Merge pull request #1595 from fiaxh/pgp_database_signature
Regenerate PGP signatures once
2015-12-04 15:35:51 +01:00
Daniel Gultsch 0664d6ac7b avoid some NPEs 2015-12-04 15:35:22 +01:00
Daniel Gultsch 3e3cb047be rely on message id if message id is uuid and pgp encryption was used to deduplicate messages. fixes #1357 2015-12-04 15:34:45 +01:00
Daniel Gultsch 242887447c use proposed nick as default nick in mucoptions 2015-12-04 14:07:16 +01:00
Daniel Gultsch 6b592435cd parse vcard avatars from muc presences 2015-12-03 18:18:34 +01:00
Daniel Gultsch f1c0b7372f enabled previously disabled http upload 2015-12-03 12:45:12 +01:00
fiaxh e5f154316c Unset all PGP signatures once
... so they will be redone to match the changed status.
2015-12-02 18:06:48 +00:00
Daniel Gultsch b60c902810 pulled new translations from transifex 2015-12-02 17:27:56 +01:00
Daniel Gultsch 6f8f35031f version bump to 1.8.0-beta 2015-12-02 17:25:22 +01:00
Daniel Gultsch 3553b15c9f renamed x509 verified omemo to v\OMEMO 2015-12-02 17:24:56 +01:00
Daniel Gultsch aa21797f43 Merge branch 'master' of github.com:siacs/Conversations 2015-12-02 16:38:33 +01:00
Daniel Gultsch 0eaf7669f7 Merge pull request #1545 from SamWhited/show_new_contact_request_messages
Show status message when contact requests presence
2015-12-02 16:38:08 +01:00
Sam Whited a3eb540f05 Show status message when contact requests presence
Remove presence when conversation closed
2015-12-02 08:50:52 -06:00
Daniel Gultsch 025cbf7d44 show tor config in paranoid mode 2015-12-02 15:34:09 +01:00
Daniel Gultsch 02c6793ca9 fixed avatar loading for non-file uris 2015-12-02 15:30:03 +01:00
Philip Flohr 0329c9c738 users are now able to crop their avatar pictures using the android-crop
library
2015-12-02 14:25:20 +01:00
Daniel Gultsch 8455e5b5dd hide message content in notifications in paranoia mode 2015-12-02 12:54:55 +01:00
Sam Whited e1aeb376ac s/.../…/ in default strings 2015-12-01 21:59:44 -06:00
Daniel Gultsch dc8967d8fc introduced build-time paranoia mode that disables unencrypted chats and forces TOR 2015-12-01 22:41:58 +01:00
Daniel Gultsch 65b5504e68 introduce config.java variable to optionally show number of connected accounts in notification 2015-12-01 17:15:36 +01:00
Daniel Gultsch 2cd43f7042 fixed crashes when activity got destroyed when selecting pgp key 2015-12-01 14:18:07 +01:00
Daniel Gultsch d42c82abf2 combine multiple message receipts into single message 2015-12-01 12:22:47 +01:00
Daniel Gultsch 2225b0b6d5 add error state for unavailable tor network 2015-12-01 12:00:50 +01:00
Daniel Gultsch b4a259837e always use http proxy for http requests. (socks is leaking dns) 2015-12-01 12:00:50 +01:00
Daniel Gultsch 8ffcc11f27 refactored socks5 connection code. make jingle transport use that new code 2015-12-01 12:00:50 +01:00
Daniel Gultsch ebccb67a72 do socks5 connect manually 2015-12-01 12:00:50 +01:00
Daniel Gultsch f0b1761ec3 initial tor support 2015-12-01 12:00:50 +01:00
Daniel Gultsch 06cadab7cc changed method signature of calcSampleSize 2015-11-30 16:03:04 +01:00
Daniel Gultsch aeba964a65 increment version code 2015-11-26 17:44:44 +01:00
Daniel Gultsch 60211a315e hide subject edit button if not editable by user 2015-11-26 17:44:29 +01:00
Daniel Gultsch 23ef1c660a encrypt pgp messages to self 2015-11-26 17:44:11 +01:00
Daniel Gultsch fd6ed5b989 detect server identity and added muc-workaround for slack 2015-11-26 06:55:57 +01:00
Daniel Gultsch 26ec6f7782 version bump to 1.7.3 2015-11-26 06:53:52 +01:00
Daniel Gultsch 84120a341a removed unnecessary configuration fetch after join 2015-11-26 06:53:24 +01:00
Daniel Gultsch 210de7d781 removed unecessary chat state 2015-11-26 06:53:02 +01:00
Daniel Gultsch ecb4615f2a fail jingle file transfer if axolotl key message could not be created. fixes #1576 2015-11-26 06:52:46 +01:00
Daniel Gultsch a557d38e4d pgp fixes and revert configuration changes 2015-11-25 20:47:02 +01:00
Daniel Gultsch 8228e82f51 Merge pull request #1569 from fiaxh/conference_one_other_occupant
Show own avatar in tile for conferences with only one other occupant next to theirs
2015-11-24 07:09:12 +01:00
Daniel Gultsch fbb7cb99f7 Merge pull request #1558 from fiaxh/pgp_api_9.0
Use OpenPGP-API 9.0
2015-11-24 06:52:24 +01:00
Daniel Gultsch 8a1c4fe69e Merge pull request #1570 from fiaxh/pgp_pgpengine_nullpointer_fix
PGP fix
2015-11-24 06:51:52 +01:00
fiaxh 2c1f7e115c PgpEngine: Get account from conversation instead of from contact. fixes #1568, fixes #1544 2015-11-15 13:24:07 +00:00
fiaxh 724ca8c9a9 Own contact picture in tile for conferences with only one other occupant 2015-11-15 10:34:10 +00:00
fiaxh c7a519498a Sign empty status 2015-11-09 13:50:02 +00:00
fiaxh fac1d4e0bd Use OpenPGP-API 9.0 2015-11-09 13:49:57 +00:00
Andreas Straub c6e54e7e5a Move migration 19 before 17
Migration 17 depends on Account deserialization, so any migrations that
touch the accounts table need to be applied beforehand.

Re-writing the migration to work directly on the database would lead to
a lot of code duplication, so it's not worth it at this time, but might
become necessary later on to avoid dependency cycles.
2015-11-06 14:50:55 +01:00
Daniel Gultsch 8471fbd9b7 updated FAQ to account for incompatible server 2015-11-01 14:22:01 +01:00
Daniel Gultsch fb9ba0a734 don't close socket on disconnect 2015-11-01 07:45:00 +01:00
Daniel Gultsch baf76d883c indicate cbe in chat message hint 2015-10-31 22:55:04 +01:00
Daniel Gultsch bca29cf7fd explicitly mark verified omemo keys in UI 2015-10-31 10:57:57 +01:00
Daniel Gultsch b9de159e97 versrion bump to 1.7.2 2015-10-30 12:05:44 +01:00
Daniel Gultsch 34bcc59f72 fixed session objects not being build on start up 2015-10-30 12:05:21 +01:00
Daniel Gultsch 6a458b853c Merge pull request #1513 from fiaxh/pgp_background_decryption
PGP messages background decryption
2015-10-30 10:18:27 +01:00
Daniel Gultsch 1ec3d86eb7 version bump to 1.7.1 2015-10-29 23:16:39 +01:00
Daniel Gultsch 8553d5a563 moved db calls made from UI into serial background thread 2015-10-29 17:20:01 +01:00
Daniel Gultsch ef7857ac8d avoid npe when checking for stream restart 2015-10-29 14:38:35 +01:00
Daniel Gultsch c7ff196f58 push CN into nick pep node when uploading certificate. subscribe to nick node 2015-10-29 13:41:08 +01:00
Daniel Gultsch 7410e2023a Merge branch 'master' of github.com:siacs/Conversations 2015-10-29 12:08:32 +01:00
Daniel Gultsch 1221cff561 load avatars in message adapter in background task 2015-10-29 12:08:15 +01:00
Daniel Gultsch a7fd629c05 show encryption type in warned/red messages 2015-10-28 22:40:09 +01:00
fiaxh 016a57f123 Show PGP "please wait" message only when actually decrypting 2015-10-28 20:57:15 +00:00
fiaxh 29a849cb92 Decrypt PGP messages in background 2015-10-28 19:57:11 +00:00
Daniel Gultsch d65273ce39 Merge pull request #1523 from SamWhited/presence_sync_fix
Don't synchronize on non-final field
2015-10-27 17:16:18 +01:00
Sam Whited e747ecef4d Don't synchronize on non-final field 2015-10-26 20:13:48 -05:00
Daniel Gultsch ec473a4437 Merge pull request #1520 from saqura/self_handle_orientation
Handle some orientation changes manually
2015-10-26 09:30:08 +01:00
saqura 48f172fc9e Reset the margins manually after rotating 2015-10-26 00:59:32 +01:00
Daniel Gultsch d4877177b7 version bump to 1.7.0 2015-10-25 22:48:02 +01:00
Daniel Gultsch 56afdcc94a invalidate menu after backend connection.
fixes the menu not being shown after rotation in edit account details
2015-10-25 22:46:06 +01:00
saqura 1f2b2c8834 Handle some orientation changes manually
Currently most activities get destroyed/recreated when rotating the
device. This commit prevents this from happening where it is not
necessary.

The most obvious improvements are:

 * The options menu in the EditAccountActivity does not disappear when
   rotating the device.

 * CSI inactive/active states are no longer sent on every rotate.
2015-10-25 21:34:16 +01:00
Daniel Gultsch 1bd68a42b2 join muc even if initial conference configuration fetch failed 2015-10-22 11:20:36 +02:00
Daniel Gultsch 3c45f00443 fixed read conversations showing up as notifications after a restart 2015-10-21 17:41:44 +02:00
Daniel Gultsch d56214f096 version bump to 1.7.0-beta.2 2015-10-21 11:14:00 +02:00
Daniel Gultsch f4a33a007c open unknown files with wildcard intent 2015-10-20 17:41:07 +02:00
Daniel Gultsch 569b9f4e66 open manage account + certificate chooser when cbe mode is enabled 2015-10-20 15:27:33 +02:00
Daniel Gultsch 53125dbccc move chat state reset from background switch to foreground switch to account for chat states sent in the mean time 2015-10-19 23:22:29 +02:00
Daniel Gultsch 9b07059b6e update last seen in mucs. fixes #1508 2015-10-19 23:20:33 +02:00
Daniel Gultsch efab290c28 add nick to bookmark when entering full jid in join conference dialog 2015-10-19 23:20:00 +02:00
Daniel Gultsch adca670196 synchronize around the disco object 2015-10-19 23:03:19 +02:00
Daniel Gultsch 0bd4105b1d version bump to 1.7.0-beta 2015-10-17 16:11:13 +02:00
Daniel Gultsch be38b1e5f4 disconnet in background thread 2015-10-17 16:10:56 +02:00
Daniel Gultsch e956c7b2a2 only try EXTERNAL auth if client certificate is set for account 2015-10-17 16:10:31 +02:00
Daniel Gultsch 3c6c424d31 don't retry building broken omemo keys 2015-10-17 15:51:21 +02:00
Daniel Gultsch 0f405c2e11 allow redownloading files from remote hosts. fixes #1504 2015-10-17 15:23:46 +02:00
Daniel Gultsch e9e31b1c9b load axolotl session cache on first device update 2015-10-17 14:44:59 +02:00
Daniel Gultsch a83aae341f improved error reporting in trust keys activity 2015-10-17 14:09:26 +02:00
Daniel Gultsch cfeb67d71d introduced code to verify omemo device keys with x509 certificates.
cleaned up TrustKeysActivity to automatically close if there is nothing to do
2015-10-16 23:48:42 +02:00
Daniel Gultsch fb7359e6a3 block code when doing unforced disconnect 2015-10-16 09:58:31 +02:00
Daniel Gultsch c1716a35e3 moved other name parsing into seperate method 2015-10-15 20:05:55 +02:00
Daniel Gultsch fc96dcaa4d use constants for oids in xmppdomainverifier 2015-10-15 19:14:41 +02:00
Daniel Gultsch 5b271e1ed8 more checks for xmppdomainverifier and better wildcard handling 2015-10-15 18:06:26 +02:00
Daniel Gultsch e75c2cd731 use own XmppDomainVerifier instead of deprecated StrictHostnameVerifier. fixes #1189 2015-10-15 17:08:38 +02:00
Daniel Gultsch 1738673c53 pulled translations from transifex 2015-10-14 23:05:00 +02:00
Daniel Gultsch 4b93351f8f changed some source strings 2015-10-14 23:03:01 +02:00
Daniel Gultsch 30dbf97a1c clear bitmap cache before running out of memory 2015-10-14 22:55:59 +02:00
Daniel Gultsch 5f9476448f make unread status and notifications presistent across restarts 2015-10-14 21:18:34 +02:00
Daniel Gultsch 0587ba2ad2 work with muc services that change the message id 2015-10-14 11:15:18 +02:00
Daniel Gultsch beca748634 pulled translations from transifex 2015-10-13 23:36:16 +02:00
Daniel Gultsch 76828950ee cleaned up some code. log last tag 2015-10-13 23:34:09 +02:00
Daniel Gultsch 8b44400940 Merge pull request #1500 from SafwatHalaby/readme
Minor README changes
2015-10-13 23:30:13 +02:00
Safwat Halaby b5e7e528eb Minor README changes 2015-10-13 21:16:12 +03:00
Daniel Gultsch f24649c819 set cursor to end of jid in edit account 2015-10-13 16:58:08 +02:00
Daniel Gultsch 212d1a8c91 add config variable to enable x509 verification 2015-10-12 13:18:20 +02:00
Daniel Gultsch 933538a39d code clean up 2015-10-12 12:36:54 +02:00
Daniel Gultsch b519411d34 enable SASL EXTERNAL (certificate login 2015-10-11 20:45:01 +02:00
Daniel Gultsch 7be331bbb2 add menu item in account details to renew certificate 2015-10-11 16:10:52 +02:00
Daniel Gultsch 09816b61df make add account from key visible 2015-10-11 16:10:52 +02:00
Andreas Straub fdd88aa530 Clean up
Fixes some random linter warnings.
2015-10-11 16:05:44 +02:00
Andreas Straub a7c7a42136 Improve InvalidJidException handling in Jid class
This code should never be triggered anway, so with this 'fix', we should
at least get more meaningful stack traces. Plus, it makes the linter
happy by preventing NullPointerExceptions.
2015-10-11 16:05:44 +02:00
Daniel Gultsch da31582911 Merge pull request #1461 from akallabeth/captcha_support
Implemented account registration with captcha
2015-10-11 15:56:42 +02:00
Daniel Gultsch 540f6510de Merge branch 'master' of github.com:siacs/Conversations 2015-10-11 14:27:41 +02:00
Daniel Gultsch 9e1393bc1c prevent null pointer when trying to display device fingerprints of not existing sessions 2015-10-11 14:27:09 +02:00
Armin Novak 6a6cb43b17 Captcha support. 2015-10-11 13:11:50 +02:00
Daniel Gultsch ca1fe61f09 Merge pull request #1482 from SafwatHalaby/readme
Added OMEMO to Readme
2015-10-10 14:15:42 +02:00
Safwat Halaby 0407111416 Added OMEMO to Readme 2015-10-10 14:46:14 +03:00
Andreas Straub 2b1286585b Merge pull request #1480 from SafwatHalaby/patch-1
Update build system in README
2015-10-10 13:18:09 +02:00
Safwat Halaby 0cfc1a738e Update build system in README
Fixes #1479.
2015-10-10 14:16:24 +03:00
Daniel Gultsch 4d6e5a8b08 Merge pull request #1478 from SafwatHalaby/patch-1
Fixed a typo in string.xml
2015-10-10 11:14:04 +02:00
Safwat Halaby 08174e3b05 Fixed a typo in string.xml 2015-10-10 12:03:25 +03:00
Daniel Gultsch b23cb5a9e4 initial UI work to allow setting up accounts from certifcates 2015-10-09 13:37:08 +02:00
Daniel Gultsch ef605e4cbd do not dismiss editAccountActivity when still trying to register new account 2015-10-09 10:49:30 +02:00
Daniel Gultsch e65068d226 catch exception when unregistering receivers that have not been registered before 2015-10-08 00:52:04 +02:00
Daniel Gultsch f81e44d339 removed oob element from file messages 2015-10-08 00:35:23 +02:00
Daniel Gultsch 52a5e72b02 introduced expert options to set status to away and xa if screen is off or if phone is silenced 2015-10-08 00:35:04 +02:00
Daniel Gultsch 043e19dd65 add xhtml image tag to unencrypted image urls. add oob tag to all files that are on remote hosts 2015-10-07 12:08:25 +02:00
Daniel Gultsch 8f066d00e0 do mam query after join 2015-10-06 16:58:56 +02:00
saqura fd61d67dab Use MAM for MUC initial history retrieval
If the MUC supports MAM (XEP-0313), use it to retrieve the history
when joining.
2015-10-06 16:23:45 +02:00
saqura 05d0c9f4fe Properly check for MUC MAM support
Only use MAM (XEP-0313) in MUCs if it is supported.

This should fix #1264
2015-10-06 16:23:18 +02:00
saqura 403db3b080 Show whether MAM is supported in MUCs
The conference details in "Advanced Mode" now indicate whether MAM is
supported by the conference server.
2015-10-06 16:23:05 +02:00
Daniel Gultsch 32abc76689 changed store path for files 2015-10-06 16:18:23 +02:00
Daniel Gultsch 1d2a24c9c0 clean up log exporting service. properly end service after exporting 2015-10-06 14:13:07 +02:00
Daniel Gultsch e6af502055 clear notification and activate grace period when receiving chat marker from another instance 2015-10-06 11:44:27 +02:00
Daniel Gultsch 89edd83609 pulled translations from transifex 2015-10-05 16:45:33 +02:00
Daniel Gultsch 160dfa49a0 try to catch plattform bugs 2015-10-02 11:58:03 +02:00
Daniel Gultsch 9bb8683048 increased version code 2015-10-02 11:40:51 +02:00
Daniel Gultsch 4b62bd256d properly recycle bitmaps 2015-10-02 11:39:30 +02:00
Daniel Gultsch 2b9b700c96 don't put conference joins into pending on initial bind 2015-10-01 16:01:19 +02:00
Daniel Gultsch 6a0b9971aa reset muc options immediately befor join 2015-10-01 13:03:15 +02:00
Daniel Gultsch f2ccf073bd version bump and changelog 2015-09-30 23:43:32 +02:00
Daniel Gultsch 9dcf074a79 request stanza count after every ibb data stanza to not fill our own stanza queue 2015-09-30 23:42:02 +02:00
Daniel Gultsch 648e29db2c only invoke MTM in interactive mode after direct user input
fixes #1027
fixes #792
fixes #1439
2015-09-29 19:24:52 +02:00
Daniel Gultsch 64dbb069ab rotate thumbnails. fixes #1438 2015-09-29 12:25:32 +02:00
Daniel Gultsch 5fb77a9739 fixed NPE when executing rename callback in muc 2015-09-28 15:36:55 +02:00
Daniel Gultsch 8881b71079 do tab completion only if neither ctrl nor alt are being pressed 2015-09-28 14:36:10 +02:00
Daniel Gultsch f4d6b676e9 catch rare activity not found exception when opening downloaded files 2015-09-27 21:27:07 +02:00
Daniel Gultsch bbbc30e823 allow tab completion in conferences 2015-09-27 19:17:44 +02:00
Daniel Gultsch 5a5e0e7121 use Conversations 1.x.y as user agent string in http upload and download 2015-09-23 18:05:51 +02:00
Daniel Gultsch 8d90b3fbf1 swapped icons for foreground services 2015-09-22 08:50:54 +02:00
Daniel Gultsch 6f7fb7dec6 Merge pull request #1426 from fiaxh/export_logs
Preference to backup logs to SD card
2015-09-22 07:54:27 +02:00
fiaxh a3a13dd9dc Export logs to SD card preference 2015-09-21 18:53:29 +01:00
fiaxh 024e697cee Iterator to go through all messages of a conversation 2015-09-20 22:17:32 +01:00
Daniel Gultsch 9636627ef0 version bump to 1.6.10 2015-09-20 14:31:50 +02:00
Daniel Gultsch a954e32b16 let DnsHelper provide a fallback solution 2015-09-19 17:31:24 +02:00
Daniel Gultsch 069ddddbc1 fixed content-type indication in http upload 2015-09-19 17:29:33 +02:00
Daniel Gultsch efc8fc5353 update build tools 2015-09-19 17:28:59 +02:00
Daniel Gultsch 7453f2ca9a Merge pull request #1420 from betheg/fix_1419
remove the from attribute from sendStartStream() fixes #1419
2015-09-19 17:23:29 +02:00
Michael 8f69017d5a remove the from attribute from sendStartStream() fixes #1419 2015-09-19 15:58:33 +02:00
Daniel Gultsch b54b4ca78a introduced Config variable to use legacy namespace for http upload 2015-09-17 14:42:50 +02:00
Daniel Gultsch 506b83ddc6 be more careful when publishing device bundle 2015-09-17 14:18:06 +02:00
Daniel Gultsch c173d78950 ignore spoofed stanzas in facebook chat 2015-09-17 14:13:38 +02:00
Daniel Gultsch 07c7f5bc08 catch IndexOutOfBoundsException when swiping away conversations 2015-09-17 14:02:28 +02:00
Daniel Gultsch 7e712d9d4c fixed rare NPE in DnsHelper. fixed spelling and added logging 2015-09-17 13:55:27 +02:00
Daniel Gultsch b1b13ba0e5 pulled translations from transifex 2015-09-15 22:56:02 +02:00
Daniel Gultsch 4a4ced1e69 Merge branch 'master' of github.com:siacs/Conversations 2015-09-15 22:53:06 +02:00
Daniel Gultsch b9002d7fd5 added missing type='submit' to mam queries
fixed some nasty inheritance problems along the way
fixes #1411
2015-09-15 22:52:39 +02:00
Daniel Gultsch b5719fd747 work around a NPE caused by arace condition in the http upload 2015-09-15 22:49:43 +02:00
Daniel Gultsch 183dad281c Merge pull request #1409 from sespivak/master
some string localization for russian language
2015-09-14 17:06:27 +02:00
Daniel Gultsch 999d65c187 pulled translations from transifex 2015-09-14 16:53:39 +02:00
Sergey Spivak 7e06065df2 some string localization for russian language 2015-09-14 18:36:58 +04:00
Daniel Gultsch 8d13a77bc6 changed http upload namespace to reflect the one in the XEP 2015-09-14 13:22:10 +02:00
Daniel Gultsch 96575d6290 added possibiltiy to set conferences as moderated (only visible in advanced mode) 2015-09-13 17:13:46 +02:00
Daniel Gultsch add4302385 pulled new translations from transifex 2015-09-13 11:07:22 +02:00
Daniel Gultsch 4220fa948b added mp4 to well known extensions. fixes #1403 2015-09-12 10:42:56 +02:00
Daniel Gultsch bd986834fc added referrer to playstore links 2015-09-12 10:42:14 +02:00
Daniel Gultsch 15d1623ec6 increment version code 2015-09-10 11:16:53 +02:00
Daniel Gultsch 811e2eaeec increased dns timeout 2015-09-10 10:54:15 +02:00
Daniel Gultsch cf62fb5605 version bump to 1.6.9 + changelog 2015-09-09 23:34:42 +02:00
Daniel Gultsch 650abf1c52 added alt as possible modifier key. use mod+(0..9) to jump to a conversation 2015-09-09 23:28:37 +02:00
Daniel Gultsch 6bb9983d58 added rotation detection to up/down navigation 2015-09-07 20:45:21 +02:00
Daniel Gultsch 6308dcfdd4 added some key binding
* ctrl + tab will open the conversations overview (when available)
* ctrl + up / down will navigate between conversations
2015-09-07 15:46:27 +02:00
Daniel Gultsch 88cdd03f0f catch npe in setupIme method 2015-09-07 13:31:24 +02:00
Daniel Gultsch bf64276fa7 version bump to 1.6.8 and changelog 2015-09-06 19:46:26 +02:00
Daniel Gultsch eff173ebc2 indicate broken pep in server info 2015-09-06 19:40:28 +02:00
Andreas Straub a95c451f1e Only show that have sessions in fingerprint list
Doesn't access database directly anymore but goes through AxolotlService
now to obtain list of fingerprints associated with an Account/Contact.
This should prevent orphaned keys littering the UI which previously
couldn't be removed through the Clear Devices function.

Together with 1c79982da84964c1d81179a0927d9cd1eadf53de this fixes #1393
2015-09-06 15:15:57 +02:00
Andreas Straub 2bb033267b Don't manually add keys to the store
There is no need to preemptively add the keys to the store oneself.
SessionBuilder will take care of this for us. What's more, this will
prevent IdentityKeys from otherwise invalid bundles to show up in our
UI.
2015-09-06 15:15:57 +02:00
Daniel Gultsch 2c4a6b0912 add null pointer check to db migration 2015-09-05 18:47:37 +02:00
Andreas Straub e2d506c96a Never build a session with oneself
If we detect our own ID is not in our own devicelist on receiving an
update, we reannounce ourselves. This used to have the side effect of
modifying the list of devices we thought were in the update set, causing
us to accidentally build a session with ourselves.

This lead to our own key being set to TRUSTED_INACTIVE, resulting in red
lock icons on messages sent by the own device.

We fix this by having publishOwnDeviceId() operate on a copy of the
original set. This commit also includes a db migration which deletes
sessions with oneself and sets own keys back to TRUSTED.
2015-09-05 17:29:58 +02:00
Daniel Gultsch a32a577e36 ignore timeout exceptions on secondary dns requests 2015-09-05 14:26:31 +02:00
Daniel Gultsch 7eb228d1a5 Issues with URLs with multiple dots in file. fixes #1373 2015-09-04 19:58:53 +02:00
Daniel Gultsch 1848b46195 invoke onEnterPressed callback only if shift is not pressed 2015-09-04 19:33:31 +02:00
Daniel Gultsch 9baa87e5c9 minimize softkeyboard only if it has been in fullscreen mode 2015-09-04 18:02:53 +02:00
Daniel Gultsch 204cee4a17 show an send button instead of the enter key in softkeyboards when enterIsSend and showEnterKey are both set 2015-09-04 14:48:00 +02:00
Andreas Straub b265341848 Ensure uris is empty before onStart adds to it
Fixes #1382
2015-09-02 22:03:15 +02:00
Daniel Gultsch fc594e249a added special error state for dns timeout 2015-09-01 22:37:52 +02:00
Daniel Gultsch 91b0605bc2 use same method to add message hints to otr message everywhere it is needed 2015-09-01 22:36:56 +02:00
Daniel Gultsch 74cf8320bc tag axolotl messages with pretty-please-store 2015-09-01 00:13:19 +02:00
Daniel Gultsch aaf3ecaf41 made useImageAsIs determination a bit more foolproof (samsung) 2015-08-31 20:19:26 +02:00
Daniel Gultsch ca262d3523 single task mode for start conversations activity 2015-08-30 11:37:52 +02:00
Daniel Gultsch b0c19d6bac fixed bug that prevented newly opened conversations to load the entire history via mam. fixes #1328 2015-08-30 11:24:37 +02:00
Daniel Gultsch 8f4b7686c9 catch invalid base64 on omemo key decoding 2015-08-30 11:11:54 +02:00
Daniel Gultsch 3db7087658 use build in method on >= lolipop devices to discover dns servers 2015-08-28 13:05:34 +02:00
Daniel Gultsch 9a56e1620b version bump to 1.6.7 + changelog 2015-08-28 13:05:15 +02:00
Daniel Gultsch bc9f6d91ac pulled updated translations from transifex 2015-08-28 13:04:57 +02:00
Daniel Gultsch 384c441990 reformating and upper bound for waiting on stanza writer 2015-08-28 11:42:11 +02:00
Daniel Gultsch 5298f4e2aa fixed type=timeout 2015-08-28 11:41:41 +02:00
Daniel Gultsch cb70df7a34 added XEP number for http file upload 2015-08-27 19:18:35 +02:00
Daniel Gultsch eff9e417e0 use dedicated colors for primary and primary_dark 2015-08-26 21:17:29 +02:00
Daniel Gultsch 593f5cdcbe version bump to 1.6.6 and changelog 2015-08-26 21:13:20 +02:00
Daniel Gultsch c5abddc584 fixed highlight text color for white chat bubbles 2015-08-26 21:12:19 +02:00
Andreas Straub 1156ccbce2 Fix error handling for announce check retrieval
Only aborts when a timeout was received. Error conditions (most notably
item-not-found) are interpreted as no other devices existing.
2015-08-26 20:52:44 +02:00
Daniel Gultsch cd451856b2 explictitly handle iq timeouts in bind and session iqs 2015-08-26 20:47:08 +02:00
Andreas Straub c4a548ada0 Only announce device after publishing bundle 2015-08-26 15:45:21 +02:00
Daniel Gultsch f6b7a25e29 moved actual iq callback out of synchronized find callback block 2015-08-26 14:01:37 +02:00
Daniel Gultsch ea2ce78d6e be more restrictive about marking messages as sent_received in muc parser 2015-08-26 12:11:12 +02:00
Daniel Gultsch 3e0636367a Revert "improved compatibility with muc components that change the message id"
This reverts commit df86b0fc47.
2015-08-26 11:39:18 +02:00
Daniel Gultsch 4424a818df version bump to 1.6.5 + changelog 2015-08-26 00:32:42 +02:00
Andreas Straub 0eeaccd974 Fix key publishing
Remove invalid check for result code, which prevented publishing if the
node was empty to begin with.

Fix pepBroken check
2015-08-26 00:27:39 +02:00
Daniel Gultsch 05d3015421 version bump to 1.6.4 and changelog 2015-08-25 23:28:25 +02:00
Andreas Straub 25a9d59412 Add more logging to pep attemp counter logic 2015-08-25 18:52:36 +02:00
Andreas Straub eafcf38ec9 Limit number of PEP publish tries
If PEP publish tries are repeatedly triggered by empty PEP updates, stop
attempting to publish after 3 tries. This should work around broken PEP
implementations in older ejabberd and OpenFire versions.
2015-08-25 18:43:44 +02:00
Daniel Gultsch 11b9fc3191 Merge pull request #1365 from betheg/remove_imports
remove unused imports.
2015-08-25 14:14:13 +02:00
Daniel Gultsch 04e21660b6 Merge pull request #1364 from betheg/jdk15on
update bcprov-jdk15on to v1.52
2015-08-25 12:41:27 +02:00
Michael ae9de26f59 remove unused imports. 2015-08-25 12:40:22 +02:00
Andreas Straub b84fecf51a Pass through device IDs when updating own list 2015-08-25 12:17:09 +02:00
Daniel Gultsch 5eae1e52d2 cleared up some error messages in axolotl service and execute publishOwnDevicesWhenNeeded() only if processing our own jid 2015-08-25 11:43:10 +02:00
Michael 61c0f8adb0 update bcprov-jdk15on to v1.52 2015-08-25 11:17:05 +02:00
Daniel Gultsch 25c49d5e34 catch some db query exceptions 2015-08-25 11:12:10 +02:00
Daniel Gultsch 7617a19280 additonal null checks in file backend 2015-08-25 11:11:53 +02:00
Daniel Gultsch 476db24c10 fixed session time 2015-08-25 11:11:32 +02:00
Daniel Gultsch dd20f41f1b Merge pull request #1363 from betheg/minidns
update minidns to v0.1.7
2015-08-25 11:09:11 +02:00
Michael a898d9d5f7 update minidns to v0.1.7 2015-08-25 10:55:57 +02:00
Daniel Gultsch 919c3a47be Merge pull request #1362 from betheg/roundedimageview
update roundedimageview to v2.2.0
2015-08-25 10:50:39 +02:00
Michael 3552b96c8a update roundedimageview to v2.2.0 2015-08-25 10:18:00 +02:00
Daniel Gultsch 4f87413b16 Merge branch 'betheg-sdk_version' into development 2015-08-24 22:21:24 +02:00
Daniel Gultsch 120810b9ca Merge branch 'sdk_version' of https://github.com/betheg/Conversations into betheg-sdk_version 2015-08-24 22:21:04 +02:00
Daniel Gultsch 3da90638c6 version bump to 1.7.0-beta 2015-08-24 21:25:33 +02:00
Daniel Gultsch f6374f466b increased carbon grace period to 90s 2015-08-24 21:25:04 +02:00
Daniel Gultsch 98e7d9c74e pulled translations from transifex 2015-08-24 21:24:48 +02:00
Daniel Gultsch 730a5c644b renamed plain text to unencrypted. fixes #1331 2015-08-24 21:15:47 +02:00
Daniel Gultsch 865e08401b fixed regression with mlinks stream managment. fixes #1206 2015-08-24 20:56:36 +02:00
Daniel Gultsch fb0b4bb445 added setting to allow for white backgrounds in incoming message bubbles 2015-08-24 20:56:25 +02:00
Daniel Gultsch d36ae091b6 Merge branch 'master' into development 2015-08-24 18:18:24 +02:00
Daniel Gultsch d0b8bd0f8a catch invalid base64 in axolotl key parsing 2015-08-24 18:18:01 +02:00
Michael 97c28b13a6 add the the previously deleted build-tools. 2015-08-24 11:32:21 +02:00
Michael 4cc48f01df update travis.yml 2015-08-24 11:26:17 +02:00
Michael 5f0ed62833 update android sdk and support library.
make use of the archivesBaseName and
rename only 'zipaligned' release build.
2015-08-24 10:59:52 +02:00
Daniel Gultsch deb9c20e5e Merge branch 'master' into development 2015-08-23 21:06:58 +02:00
Daniel Gultsch 91a3cee6d2 Merge branch 'master' into development 2015-08-23 19:44:58 +02:00
Daniel Gultsch 412efe93c0 Merge branch 'master' into development 2015-08-23 18:06:40 +02:00
Daniel Gultsch 7bd0f31244 Merge branch 'master' into development 2015-08-23 17:57:53 +02:00
Daniel Gultsch 777dd4b51e Merge branch 'master' into development 2015-08-23 17:29:46 +02:00
Daniel Gultsch b0710cdf04 Merge branch 'master' into development 2015-08-23 13:57:14 +02:00
Daniel Gultsch bea7b2bcc1 Merge pull request #1348 from betheg/zxing
update zxing to v3.2.1
2015-08-23 13:36:08 +02:00
Michael 10a9bd3864 update zxing to v3.2.1 2015-08-23 13:27:06 +02:00
Daniel Gultsch 06fffc13cd Merge branch 'master' into development 2015-08-19 13:16:59 +02:00
Daniel Gultsch 9e26375d2f simulate old behaviour with messages being set to waiting while offline 2015-08-19 13:00:52 +02:00
Daniel Gultsch c9b2638778 Merge branch 'master' into development 2015-08-19 12:49:24 +02:00
Daniel Gultsch dafcee6a5b Merge branch 'master' into development 2015-08-19 12:29:23 +02:00
Daniel Gultsch 9edcca1045 Merge branch 'master' into development 2015-08-16 15:01:06 +02:00
Daniel Gultsch e8e0eccd82 version bump to 1.7.0-alpha to start new development cycle 2015-08-15 19:26:52 +02:00
Daniel Gultsch 5501502e89 Merge branch 'depend_on_sm' into development 2015-08-15 19:18:38 +02:00
Daniel Gultsch 83e1e6468e fully depend on sm 2015-08-15 16:57:07 +02:00
767 changed files with 40413 additions and 12254 deletions

11
.github/CONTRIBUTING.md vendored Normal file
View File

@ -0,0 +1,11 @@
### Reporting Bugs and getting help
The issue tracker on Github is for bug reports only. It is not a general support forum.
**A bug is everything you can reproduce. ie *if I do this that happens but something else should happen instead*.**
Please search the issue tracker (including closed issues). Your bug might be a server bug that has already been addressed.
Please fill in the template when creating new issues and provide information about your device and your server. The [adb logcat](https://wiki.cyanogenmod.org/w/Doc:_debugging_with_logcat) can be omitted if you can reproduce the bug under every condition. (ie *click button X and the application crashes*) But the adb logcat is required if the bug happens only under certain conditions or involves network problem (Server not found, messages not arriving)
**If you are seeking help or are unable to reproduce the exact problem please join our MUC at conversations@conference.siacs.eu**

30
.github/ISSUE_TEMPLATE.md vendored Normal file
View File

@ -0,0 +1,30 @@
#### General information
* **Version:** eg 1.12.2
* **Device:** eg Google Nexus 5
* **Android Version:** eg Android 6.0 Stock or Android 5.1 Cyanogenmod
* **Server name:** eg conversations.im, jabber.at or self hosted
* **Server software:** ejabberd 16.04 or prosody 0.10 (if known)
* **Installed server modules:** eg Stream Managment, CSI, MAM
* **Conversations source:** eg PlayStore, PlayStore Beta Channel, F-Droid, self build (latest HEAD)
#### Steps to reproduce
1. …
2. …
#### Expected result
What is the expected output? What do you see instead?
#### Debug output
Please post the output of adb logcat. The log should begin with the start of Conversations and include all the
steps it takes to reproduce the problem.
````
adb logcat -s conversations
````

4
.gitignore vendored
View File

@ -2,9 +2,13 @@
*.swp
.settings
src/playstore/res/values/gcm.xml
# https://github.com/github/gitignore/blob/master/Gradle.gitignore
.gradle/
build/
captures/
gradle.properties
# Ignore Gradle GUI config
gradle-app.setting

View File

@ -1,10 +1,16 @@
language: android
jdk:
- oraclejdk8
android:
components:
- platform-tools
- tools
- build-tools-22.0.1
- build-tools-21.1.2
- build-tools-19.1.0
- android-22
- build-tools-26.0.1
- android-25
- extra-android-m2repository
- extra-google-m2repository
- extra-google-google_play_services
licenses:
- '.+'
script:
- ./gradlew assembleFreeRelease

View File

@ -1,42 +1,403 @@
###Changelog
# Changelog
####Version 1.6.3
### Version 1.20.0
* presence subscription no longer required for OMEMO on compatible servers
* display emoji-only messages slightly larger
### Version 1.19.5
* fixed connection loop on Android <4.4
### Version 1.19.4
* work around for OpensFires self signed certs
* use VPNs DNS servers first
### Version 1.19.3
* Do not create foreground service when all accounts are disabled
* bug fixes
####Version 1.6.2
### Version 1.19.2
* bug fixes
### Version 1.19.1
* Made DNSSEC hostname validation opt-in
### Version 1.19.0
* Added 'App Shortcuts' to quickly access frequent contacts
* Use DNSSEC to verify hostname instead of domain in certificate
* Setting to enable Heads-up notifications
* Added date separators in message view
### Version 1.18.5
* colorize send button only after history is caught up
* improved MAM catchup strategy
### Version 1.18.4
* fixed UI freezes during connection timeout
* fixed notification sound playing twice
* fixed conversations being marked as read
* removed 'copy text' in favor of 'select text' and 'share with'
### Version 1.18.3
* limited GPG encryption for MUC offline members
### Version 1.18.2
* added support for Android Auto
* fixed HTTP Download over Tor
* work around for nimbuzz.com MUCs
### Version 1.18.1
* bug fixes
### Version 1.18.0
* Conversations <1.16.0 will be unable to receive OMEMO encrypted messages
* OMEMO: put auth tag into key (verify auth tag as well)
* offer to block entire domain in message from stranger snackbar
* treat URL as file if URL is in oob or contains key
### Version 1.17.1
* Switch Aztec to QR for faster scans
* Fixed unread counter for image messages
### Version 1.17.0
* Do not notify for messages from strangers by default
* Blocking a JID closes the corresponding conversation
* Show message sender in conversation overview
* Show unread counter for every conversation
* Send typing notifications in private, non-anonymous MUCs
* Support for the latest MAM namespace
* Icons for attach menu
### Version 1.16.2
* change mam catchup strategie. support mam:1
* bug fixes
### Version 1.16.1
* UI performance fixes
* bug fixes
### Version 1.16.0
* configurable client side message retention period
* compress videos before sending them
### Version 1.15.5
* show nick as bold text when mentioned in conference
* bug fixes
### Version 1.15.4
* bug fixes
### Version 1.15.3
* show offline contacts in MUC as grayed-out
* don't transcode gifs. add overlay indication to gifs
* bug fixes
### Version 1.15.2
* bug fixes
### Version 1.15.1
* support for POSH (RFC7711)
* support for quoting messages (via select text)
* verified messages show shield icon. unverified messages show lock
### Version 1.15.0
* New [Blind Trust Before Verification](https://gultsch.de/trust.html) mode
* Easily share Barcode and XMPP uri from Account details
* Automatically deactivate own devices after 7 day of inactivity
* Improvements fo doze/push mode
* bug fixes
### Version 1.14.9
* warn in account details when data saver is enabled
* automatically enable foreground service after detecting frequent restarts
* bug fixes
### Version 1.14.8
* bug fixes
### Version 1.14.7
* error message accessible via context menu for failed messages
* don't include pgp signature in anonymous mucs
* bug fixes
### Version 1.14.6
* make error notification dismissable
* bug fixes
### Version 1.14.5
* expert setting to delete OMEMO identities
* bug fixes
### Version 1.14.4
* bug fixes
### Version 1.14.3
* XEP-0377: Spam Reporting
* fix rare start up crashes
### Version 1.14.2
* support ANONYMOUS SASL
* bug fixes
### Version 1.14.1
* Press lock icon to see why OMEMO is deactivated
* bug fixes
### Version 1.14.0
* Improvments for N
* Quick Reply to Notifications on N
* Don't download avatars and files when data saver is on
* bug fixes
### Version 1.13.9
* bug fixes
### Version 1.13.8
* show identities instead of resources in selection dialog
* allow TLS direct connect when port is set to 5223
* bug fixes
### Version 1.13.7
* bug fixes
### Version 1.13.6
* thumbnails for videos
* bug fixes
### Version 1.13.5
* bug fixes
### Version 1.13.4
* support jingle ft:4
* show contact as DND if one resource is
* bug fixes
### Version 1.13.3
* bug fixes
### Version 1.13.2
* new PGP decryption logic
* bug fixes
### Version 1.13.1
* changed some colors in dark theme
* fixed fall-back message for OMEMO
### Version 1.13.0
* configurable dark theme
* opt-in to share Last User Interaction
### Version 1.12.9
* make grace period configurable
### Version 1.12.8
* more bug fixes :-(
### Version 1.12.7
* bug fixes
### Version 1.12.6
* bug fixes
### Version 1.12.5
* new create conference dialog
* show first unread message on top
* show geo uri as links
* circumvent long message DOS
### Version 1.12.4
* show offline members in conference (needs server support)
* various bug fixes
### Version 1.12.3
* make omemo default when all resources support it
* show presence of other resources as template
* start typing in StartConversationsActivity to search
* various bug fixes and improvements
### Version 1.12.2
* fixed pgp presence signing
### Version 1.12.1
* small bug fixes
### Version 1.12.0
* new welcome screen that makes it easier to register account
* expert setting to modify presence
### Version 1.11.7
* Share xmpp uri from conference details
* add setting to allow quick sharing
* various bug fixes
### Version 1.11.6
* added preference to disable notification light
* various bug fixes
### Version 1.11.5
* check file ownership to not accidentally share private files
### Version 1.11.4
* fixed a bug where contacts are shown as offline
* improved broken PEP detection
### Version 1.11.3
* check maximum file size when using HTTP Upload
* properly calculate caps hash
### Version 1.11.2
* only add image files to media scanner
* allow to delete files
* various bug fixes
### Version 1.11.1
* fixed some bugs when sharing files with Conversations
### Version 1.11.0
* OMEMO encrypted conferences
### Version 1.10.1
* made message correction opt-in
* various bug fixes
### Version 1.10.0
* Support for XEP-0357: Push Notifications
* Support for XEP-0308: Last Message Correction
* introduced build flavors to make dependence on play-services optional
### Version 1.9.4
* prevent cleared Conversations from reloading history with MAM
* various MAM fixes
### Version 1.9.3
* expert setting that enables host and port configuration
* expert setting opt-out of bookmark autojoin handling
* offer to rejoin a conference after server sent unavailable
* internal rewrites
### Version 1.9.2
* prevent startup crash on Sailfish OS
* minor bug fixes
### Version 1.9.1
* minor bug fixes incl. a workaround for nimbuzz.com
### Version 1.9.0
* Per conference notification settings
* Let user decide whether to compress pictures
* Support for XEP-0368
* Ask user to exclude Conversations from battery optimizations
### Version 1.8.4
* prompt to trust own OMEMO devices
* fixed rotation issues in avatar publication
* invite non-contact JIDs to conferences
### Version 1.8.3
* brought text selection back
### Version 1.8.2
* fixed stuck at 'connecting...' bug
* make message box behave correctly with multiple links
### Version 1.8.1
* enabled direct share on Android 6.0
* ask for permissions on Android 6.0
* notify on MAM catchup messages
* bug fixes
### Version 1.8.0
* TOR/ORBOT support in advanced settings
* show vcard avatars of participants in a conference
### Version 1.7.3
* fixed PGP encrypted file transfer
* fixed repeating messages in slack conferences
### Version 1.7.2
* decode PGP messages in background
####Versrion 1.7.1
* performance improvements when opening a conversation
### Version 1.7.0
* CAPTCHA support
* SASL EXTERNAL (client certifiates)
* fetching MUC history via MAM
* redownload deleted files from HTTP hosts
* Expert setting to automatically set presence
* bug fixes
### Version 1.6.11
* tab completion for MUC nicks
* history export
* bug fixes
### Version 1.6.10
* fixed facebook login
* fixed bug with ejabberd mam
* use official HTTP File Upload namespace
### Version 1.6.9
* basic keyboard support
### Version 1.6.8
* reworked 'enter is send' setting
* reworked DNS server discovery on lolipop devices
* various bug fixes
### Version 1.6.7
* bug fixes
### Version 1.6.6
* best 1.6 release yet
### Version 1.6.5
* more OMEMO fixes
### Version 1.6.4
* setting to enable white chat bubbles
* limit OMEMO key publish attempts to work around broken PEP
* various bug fixes
### Version 1.6.3
* bug fixes
### Version 1.6.2
* fixed issues with connection time out when server does not support ping
####Version 1.6.1
### Version 1.6.1
* fixed crashes
####Version 1.6.0
### Version 1.6.0
* new multi-end-to-multi-end encryption method
* redesigned chat bubbles
* show unexpected encryption changes as red chat bubbles
* always notify in private/non-anonymous conferences
####Version 1.5.1
### Version 1.5.1
* fixed rare crashes
* improved otr support
####Version 1.5.0
### Version 1.5.0
* upload files to HTTP host and share them in MUCs. requires new [HttpUploadComponent](https://github.com/siacs/HttpUploadComponent) on server side
####Version 1.4.5
### Version 1.4.5
* fixes to message parser to not display some ejabberd muc status messages
####Version 1.4.4
### Version 1.4.4
* added unread count badges on supported devices
* rewrote message parser
####Version 1.4.0
### Version 1.4.0
* send button turns into quick action button to offer faster access to take photo, send location or record audio
* visually seperate merged messages
* visually separate merged messages
* faster reconnects of failed accounts after network switches
* r/o vcard avatars for contacts
* various bug fixes
####Version 1.3.0
### Version 1.3.0
* swipe conversations to end them
* quickly enable / disable account via slider
* share multiple images at once
@ -44,32 +405,32 @@
* mlink compatibility
* bug fixes
####Version 1.2.0
### Version 1.2.0
* Send current location. (requires [plugin](https://play.google.com/store/apps/details?id=eu.siacs.conversations.sharelocation))
* Invite multiple contacts at once
* performance improvements
* bug fixes
####Version 1.1.0
### Version 1.1.0
* Typing notifications (must be turned on in settings)
* Various UI performance improvements
* bug fixes
####Version 1.0.4
### Version 1.0.4
* load avatars asynchronously on start up
* support for XEP-0092: Software Version
####Version 1.0.3
### Version 1.0.3
* load messages asynchronously on start up
* bug fixes
####Version 1.0.2
### Version 1.0.2
* skipped
####Version 1.0.1
### Version 1.0.1
* accept more ciphers
####Version 1.0
### Version 1.0
* MUC controls (Affiliaton changes)
* Added download button to notification
* Added check box to hide offline contacts
@ -77,7 +438,7 @@
* Improved security
* bug fixes + code clean up
####Version 0.10
### Version 0.10
* Support for Message Archive Management
* Dynamically load message history
* Ability to block contacts
@ -87,16 +448,16 @@
* quiet hours
* fixed connection issues on ipv6 servers
####Version 0.9.3
### Version 0.9.3
* bug fixes
####Version 0.9.2
### Version 0.9.2
* more bug fixes
####Version 0.9.1
### Version 0.9.1
* bug fixes including some that caused Conversations to crash on start
####Version 0.9
### Version 0.9
* arbitrary file transfer
* more options to verify OTR (SMP, QR Codes, NFC)
* ability to create instant conferences
@ -105,44 +466,44 @@
* added SCRAM-SHA1 login method
* bug fixes
####Version 0.8.4
### Version 0.8.4
* bug fixes
####Version 0.8.3
### Version 0.8.3
* increased UI performance
* fixed rotation bugs
####Version 0.8.2
### Version 0.8.2
* Share contacts via QR codes or NFC
* Slightly improved UI
* minor bug fixes
####Version 0.8.1
### Version 0.8.1
* minor bug fixes
####Version 0.8
### Version 0.8
* Download HTTP images
* Show avatars in MUC tiles
* Disabled SSLv3
* Performance improvments
* Performance improvements
* bug fixes
####Version 0.7.3
### Version 0.7.3
* revised tablet ui
* internal rewrites
* bug fixes
####Version 0.7.2
### Version 0.7.2
* show full timestamp in messages
* brought back option to use JID to identify conferences
* optionally request delivery receipts (expert option)
* more languages
* bug fixes
####Version 0.7.1
### Version 0.7.1
* Optionally use send button as status indicator
####Version 0.7
### Version 0.7
* Ability to disable notifications for single conversations
* Merge messages in chat bubbles
* Fixes for OpenPGP and OTR (please republish your public key)
@ -151,35 +512,35 @@
* Configurable font size
* Expert options for encryption
####Version 0.6
### Version 0.6
* Support for server side avatars
* save images in gallery
* show contact name and picture in non-anonymous conferences
* reworked account creation
* various bug fixes
####Version 0.5.2
### Version 0.5.2
* minor bug fixes
####Version 0.5.1
### Version 0.5.1
* couple of small bug fixes that have been missed in 0.5
* complete translations for Swedish, Dutch, German, Spanish, French, Russian
####Version 0.5
### Version 0.5
* UI overhaul
* MUC / Conference bookmarks
* A lot of bug fixes
####Version 0.4
### Version 0.4
* OTR file encryption
* keep OTR messages and files on device until both parties or online at the same time
* XEP-0333. Mark wether the other party has read your messages
* XEP-0333. Mark whether the other party has read your messages
* Delayed messages are now tagged properly
* Share images from the Gallery
* Infinit history scrolling
* Mark the last used presence in presence selection dialog
####Version 0.3
### Version 0.3
* Mostly bug fixes and internal rewrites
* Touch contact picture in conference to highlight
* Long press on received image to share
@ -187,27 +548,27 @@
* improved issues with occasional message lost
* experimental conference encryption. (see FAQ)
####Version 0.2.3
### Version 0.2.3
* regression fix with receiving encrypted images
####Version 0.2.2
### Version 0.2.2
* Ability to take photos directly
* Improved openPGP offline handling
* Various bug fixes
* Updated Translations
####Version 0.2.1
### Version 0.2.1
* Various bug fixes
* Updated Translations
####Version 0.2
### Version 0.2
* Image file transfer
* Better integration with OpenKeychain (PGP encryption)
* Nicer conversation tiles for conferences
* Ability to clear conversation history
* A lot of bug fixes and code clean up
####Version 0.1.3
### Version 0.1.3
* Switched to minidns library to resolve SRV records
* Faster DNS in some cases
* Enabled stream compression
@ -215,12 +576,12 @@
* Various bug fixes involving message notifications
* Added support for DIGEST-MD5 auth
####Version 0.1.2
### Version 0.1.2
* Various bug fixes relating to conferences
* Further DNS lookup improvements
####Version 0.1.1
### Version 0.1.1
* Fixed the 'server not found' bug
####Version 0.1
### Version 0.1
* Initial release

181
README.md
View File

@ -1,8 +1,31 @@
# Conversations
<h1 align="center">Conversations</h1>
Conversations: the very last word in instant messaging
<p align="center">Conversations: the very last word in instant messaging</p>
[![Google Play](http://developer.android.com/images/brand/en_generic_rgb_wo_60.png)](https://play.google.com/store/apps/details?id=eu.siacs.conversations) [![Amazon App Store](https://images-na.ssl-images-amazon.com/images/G/01/AmazonMobileApps/amazon-apps-store-us-black.png)](http://www.amazon.com/dp/B00WD35AAC/)
<p align="center">
<a href="https://conversations.im/j/conversations@conference.siacs.eu">
<img src="https://camo.githubusercontent.com/a839cc0a3d4dac7ec82237381b165dd144365b6d/68747470733a2f2f74696e7975726c2e636f6d2f6a6f696e7468656d7563"
alt="chat on our conference room">
</a>
<a href="https://travis-ci.org/siacs/Conversations">
<img src="https://travis-ci.org/siacs/Conversations.svg?branch=development"
alt="build status">
</a>
<a href="https://bountysource.com/teams/siacs">
<img src="https://api.bountysource.com/badge/tracker?tracker_id=519483" alt="Bountysource">
</a>
</p>
<p align="center">
<a href="https://play.google.com/store/apps/details?id=eu.siacs.conversations&amp;referrer=utm_source%3Dgithub">
<img src="https://conversations.im/images/en-play-badge.png"
alt="Google Play">
</a>
<a href="http://www.amazon.com/dp/B00WD35AAC/">
<img src="https://images-na.ssl-images-amazon.com/images/G/01/AmazonMobileApps/amazon-apps-store-us-black.png"
alt="Amazon App Store">
</a>
</p>
![screenshots](https://raw.githubusercontent.com/siacs/Conversations/master/screenshots.png)
@ -16,9 +39,9 @@ Conversations: the very last word in instant messaging
## Features
* End-to-end encryption with either [OTR](https://otr.cypherpunks.ca/) or [OpenPGP](http://www.openpgp.org/about_openpgp/)
* End-to-end encryption with [OMEMO](http://conversations.im/omemo/), [OTR](https://otr.cypherpunks.ca/), or [OpenPGP](http://openpgp.org/about/)
* Send and receive images as well as other kind of files
* Share your location via an external [plug-in](https://play.google.com/store/apps/details?id=eu.siacs.conversations.sharelocation)
* Share your location via an external [plug-in](https://play.google.com/store/apps/details?id=eu.siacs.conversations.sharelocation&referrer=utm_source%3Dgithub)
* Indication when your contact has read your message
* Intuitive UI that follows Android Design guidelines
* Pictures / Avatars for your Contacts
@ -41,7 +64,7 @@ run your own XMPP server for you and your friends. These XEP's are:
* [XEP-0065: SOCKS5 Bytestreams](http://xmpp.org/extensions/xep-0065.html) (or mod_proxy65). Will be used to transfer
files if both parties are behind a firewall (NAT).
* [XEP-0163: Personal Eventing Protocol](http://xmpp.org/extensions/xep-0163.html) for avatars
* [XEP-0163: Personal Eventing Protocol](http://xmpp.org/extensions/xep-0163.html) for avatars and OMEMO.
* [XEP-0191: Blocking command](http://xmpp.org/extensions/xep-0191.html) lets you blacklist spammers or block contacts
without removing them from your roster.
* [XEP-0198: Stream Management](http://xmpp.org/extensions/xep-0198.html) allows XMPP to survive small network outages and
@ -56,9 +79,8 @@ run your own XMPP server for you and your friends. These XEP's are:
* [XEP-0352: Client State Indication](http://xmpp.org/extensions/xep-0352.html) lets the server know whether or not
Conversations is in the background. Allows the server to save bandwidth by
withholding unimportant packages.
* [XEP-xxxx: HTTP File Upload](http://xmpp.org/extensions/inbox/http-upload.html) allows you to share files in conferences and with offline
contacts. Requires an [additional component](https://github.com/siacs/HttpUploadComponent)
on your server.
* [XEP-0363: HTTP File Upload](http://xmpp.org/extensions/xep-0363.html) allows you to share files in conferences
and with offline contacts.
## Team
@ -93,12 +115,12 @@ Translations are managed on [Transifex](https://www.transifex.com/projects/p/con
#### How do I install Conversations?
Conversations is entirely open source and licensed under GPLv3. So if you are a
software developer you can check out the sources from GitHub and use ant to
software developer you can check out the sources from GitHub and use Gradle to
build your apk file.
The more convenient way — which not only gives you automatic updates but also
supports the further development of Conversations — is to buy the App in the
Google [Play Store](https://play.google.com/store/apps/details?id=eu.siacs.conversations).
Google [Play Store](https://play.google.com/store/apps/details?id=eu.siacs.conversations&referrer=utm_source%3Dgithub).
Buying the App from the Play Store will also give you access to our [beta test](#beta).
@ -119,20 +141,48 @@ My Bitcoin Address is: `1NxSU1YxYzJVDpX1rcESAA3NJki7kRgeeu`
[![Flattr this!](http://api.flattr.com/button/flattr-badge-large.png)](https://flattr.com/submit/auto?user_id=inputmice&url=http%3A%2F%2Fconversations.siacs.eu&title=Conversations&tags=github&category=software)
#### How do I create an account?
XMPP, like email, is a federated protocol, which means that there is not one company you can create an *official XMPP account* with. Instead there are hundreds, or even thousands, of providers out there. One of those providers is our very own [conversations.im](https://account.conversations.im). If you dont like to use *conversations.im* use a web search engine of your choice to find another provider. Or maybe your university has one. Or you can run your own. Or ask a friend to run one. Once you've found one, you can use Conversations to create an account. Just select *register new account* on server within the create account dialog.
XMPP, like email, is a federated protocol which means that there is not one
company you can create an 'official XMPP account' with. Instead there are
hundreds, or even thousands, of provider out there. To find one use a web search
engine of your choice. Or maybe your university has one. Or you can run your
own. Or ask a friend to run one. Once you've found one, you can use
Conversations to create an account. Just select 'register new account on server'
within the create account dialog.
##### Domain hosting
Using your own domain not only gives you a more recognizable Jabber ID, it also gives you the flexibility to migrate your account between different XMPP providers. This is a good compromise between the responsibilities of having to operate your own server and the downsides of being dependent on a single provider.
Learn more about [conversations.im Jabber/XMPP domain hosting](https://account.conversations.im/domain/).
##### Running your own
If you already have a server somewhere and are willing and able to put the necessary work in, one alternative-in the spirit of federation-is to run your own. We recommend either [Prosody](https://prosody.im/) or [ejabberd](https://www.ejabberd.im/). Both of which have their own strengths. Ejabberd is slightly more mature nowadays but Prosody is arguably easier to set up.
For Prosody you need a couple of so called [community modules](https://modules.prosody.im/) most of which are maintained by the same people that develop Prosody.
If you pick ejabberd make sure you use the latest version. Linux Distributions might bundle some very old versions of it.
#### Where can I set up a custom hostname / port
Conversations will automatically look up the SRV records for your domain name
which can point to any hostname port combination. If your server doesnt provide
those please contact your admin and have them read
[this](http://prosody.im/doc/dns#srv_records)
[this](http://prosody.im/doc/dns#srv_records). If your server operator is unwilling
to fix this you can enable advanced server settings in the expert settings of
Conversations.
#### I get 'Incompatible Server'
As regular user you should be picking a different server. The server you selected
is probably insecure and/or very old.
If you are a server administrator you should make sure that your server provides
STARTTLS. XMPP over TLS (on a different port) is not sufficient.
On rare occasions this error message might also be caused by a server not providing
a login (SASL) mechanism that Conversations is able to handle. Conversations supports
SCRAM-SHA1, PLAIN, EXTERNAL (client certs) and DIGEST-MD5.
#### How do XEP-0357: Push Notifications work?
You need to be running the Play Store version of Conversations and your server needs to support push notifications.¹ Because *Google Cloud Notifications (GCM)* are tied with an API key to a specific app your server can not initiate the push message directly. Instead your server will send the push notification to the Conversations App server (operated by us) which then acts as a proxy and initiates the push message for you. The push message sent from our App server through GCM doesnt contain any personal information. It is just an empty message which will wake up your device and tell Conversations to reconnect to your server. The information send from your server to our App server depends on the configuration of your server but can be limited to your account name. (In any case the Conversations App server won't redirect any information through GCM even if your server sends this information.)
In summary Google will never get hold of any personal information besides that *something* happened. (Which doesnt even have to be a message but can be some automated event as well.) We - as the operator of the App server - will just get hold of your account name (without being able to tie this to your specific device).
If you dont want this simply pick a server which does not offer Push Notifications or build Conversations yourself without support for push notifications. (This is available via a gradle build flavor.) Non-play store source of Conversations like the Amazon App store will also offer a version without push notifications. Conversations will just work as before and maintain its own TCP connection in the background.
¹ Your server only needs to support the server side of [XEP-0357: Push Notifications](http://xmpp.org/extensions/xep-0357.html). If you use the Play Store version you do **not** need to run your own app server. The server modules are called *mod_cloud_notify* on Prosody and *mod_push* on ejabberd.
#### Conversations doesn't work for me. Where can I get help?
@ -174,6 +224,12 @@ connection again. When the client fails to do so because the network
connectivity is out for longer than that all messages sent to that client will
be returned to the sender resulting in a delivery failed.
Instead of returning a message to the sender both ejabberd and prosody have the
ability to store messages in offline storage when the disconnecting client is
the only client. In prosody this is available via an extra module called
```mod_smacks_offline```. In ejabberd this is available via some configuration
settings.
Other less common reasons are that the message you sent didn't meet some
criteria enforced by the server (too large, too many). Another reason could be
that the recipient is offline and the server doesn't provide offline storage.
@ -214,6 +270,11 @@ Making these status and priority optional isn't a solution either because
Conversations is trying to get rid of old behaviours and set an example for
other clients.
#### How do I backup / move Conversations to a new device?
On the one hand Conversations supports Message Archive Management to keep a server side history of your messages so when migrating to a new device that device can display your entire history. However that does not work if you enable OMEMO due to its forward secrecy. (Read [The State of Mobile XMPP in 2016](https://gultsch.de/xmpp_2016.html) especially the section on encryption.)
If you migrate to a new device and would still like to keep your history please use a third party backup tool like [oandbackup](https://github.com/jensstein/oandbackup) or ```adb backup``` from your computer. It is important that your deactivate your account before backup and activate it only after a successful restore. Otherwise OMEMO might not work afterwards.
#### Conversations is missing a certain feature
I'm open for new feature suggestions. You can use the [issue tracker][issues] on
@ -236,11 +297,11 @@ I am available for hire. Contact me via XMPP: `inputmice@siacs.eu`
### Security
#### Why are there two end-to-end encryption methods and which one should I choose?
#### Why are there three end-to-end encryption methods and which one should I choose?
In most cases OTR should be the encryption method of choice. It works out of the
box with most contacts as long as they are online. However PGP can, in some
cases, (message carbons to multiple clients) be more flexible.
* OTR is a legacy encryption method. It works out of the box with most contacts as long as they are online.
* OMEMO works even when a contact is offline, and works with multiple devices. It also allows asynchronous file-transfer when the server has [HTTP File Upload](http://xmpp.org/extensions/xep-0363.html). However, OMEMO is not as widely supported as OTR and is currently implemented only by Conversations and Gajim. OMEMO should be preferred over OTR for contacts who use Conversations.
* OpenPGP (XEP-0027) is a very old encryption method that has some advantages over OTR but should only be used by experts who know what they are doing.
#### How do I use OpenPGP
@ -259,14 +320,36 @@ To use OpenPGP you have to install the open source app
[OpenKeychain](http://www.openkeychain.org) and then long press on the account in
manage accounts and choose renew PGP announcement from the contextual menu.
#### OMEMO is grayed out. What do I do?
OMEMO has two requirements: Your server and the server of your contact need to support PEP. Both of you can verify that individually by opening your account details and selecting ```Server info``` from the menu. The appearing table should list PEP as available. The second requirement is mutual presence subscription. You can verify that by opening the contact details and see if both check boxes *Send presence updates* and *Receive presence updates* are checked.
#### How does the encryption for conferences work?
For conferences the only supported encryption method is OpenPGP (OTR does not
work with multiple participants). Every participant has to announce their
OpenPGP key (see answer above). If you would like to send encrypted messages to
a conference you have to make sure that you have every participant's public key
in your OpenKeychain. Right now there is no check in Conversations to ensure
that. You have to take care of that yourself. Go to the conference details and
For conferences only OMEMO and OpenPGP are supported as encryption method. (OTR
does not work with multiple participants).
##### OMEMO
OMEMO encryption works only in private (members only) conferences that are non-anonymous.
You need to have presence subscription with every member of the conference.
You can verify that by going into the conference details, long press every member and start
a conversation with them. (Or select 'contact details' if they are already in your contact
list)
The owner of a conference can make a public conference private by going into the conference
details and hit the settings button (the one with the gears) and select both *private* and
*members only*.
If OMEMO is grayed out long pressing the lock icon will reveal some quick hints on why OMEMO
is disabled.
##### OpenPGP
Every participant has to announce their OpenPGP key (see answer above).
If you would like to send encrypted messages to a conference you have to make
sure that you have every participant's public key in your OpenKeychain.
Right now there is no check in Conversations to ensure that.
You have to take care of that yourself. Go to the conference details and
touch every key id (The hexadecimal number below a contact). This will send you
to OpenKeychain which will assist you on adding the key. This works best in
very small conferences with contacts you are already using OpenPGP with. This
@ -274,6 +357,23 @@ feature is regarded experimental. Conversations is the only client that uses
XEP-0027 with conferences. (The XEP neither specifically allows nor disallows
this.)
#### Why is Conversations not end-to-end encrypted by default
We briefly had OMEMO as the default E2EE but it turned out to be a usability nightmare and thus we reverted that. You can find more information in [the commit message](https://github.com/siacs/Conversations/commit/035d0c79572d5981c53d1bff7f30b484c6542f17) of that change.
Quick reminder that Conversations **always** uses TLS to connect to your server. It wont even connect to a server without TLS.
#### What is Blind Trust Before Verification / why are messages marked with a red lock?
Read more about the concept on https://gultsch.de/trust.html
### What clients do I use on other platforms
There are XMPP Clients available for all major platforms.
#### Windows / Linux
For your desktop computer we recommend that you use [Gajim](https://gajim.org). You need to install the plugins `OMEMO`, `HTTP Upload` and `URL image preview` to get the best compatibility with Conversations. Plugins can be installed from within the app.
#### iOS
Unfortunately we dont have a recommendation for iPhones right now. There are two clients available [ChatSecure](https://chatsecure.org/) and [Monal](https://monal.im/). Both with their own pros and cons.
### Development
<a name="beta"></a>
@ -286,16 +386,18 @@ to sign up for the beta test.
#### How do I build Conversations
Make sure to have ANDROID_HOME point to your Android SDK
Make sure to have ANDROID_HOME point to your Android SDK. Use the Android SDK Manager to install missing dependencies.
git clone https://github.com/siacs/Conversations.git
cd Conversations
./gradlew build
./gradlew assembleFreeDebug
There are two build flavors available. *free* and *playstore*. Unless you know what you are doing you only need *free*.
[![Build Status](https://travis-ci.org/siacs/Conversations.svg?branch=development)](https://travis-ci.org/siacs/Conversations)
### How do I update/add external libraries?
#### How do I update/add external libraries?
If the library you want to update is in Maven Central or JCenter (or has its own
Maven repo), add it or update its version in `build.gradle`. If the library is
@ -318,16 +420,27 @@ To add a new dependency to the `libs/` directory (replacing "name", "branch" and
If something goes wrong Conversations usually exposes very little information in
the UI (other than the fact that something didn't work). However with adb
(android debug bridge) you squeeze some more information out of Conversations.
(android debug bridge) you can squeeze some more information out of Conversations.
These information are especially useful if you are experiencing trouble with
your connection or with file transfer.
To use adb you have to connect your mobile phone to your computer with an USB cable
and install `adb`. Most Linux systems have prebuilt packages for that tool. On
Debian/Ubuntu for example it is called `android-tools-adb`.
Furthermore you might have to enable 'USB debugging' in the Developer options of your
phone. After that you can just execute the following on your computer:
adb -d logcat -v time -s conversations
If need be there are also some Apps on the PlayStore that can be used to show the logcat
directly on your rooted phone. (Search for logcat). However in regards to further processing
(for example to create an issue here on Github) it is more convenient to just use your PC.
#### I found a bug
Please report it to our [issue tracker][issues]. If your app crashes please
provide a stack trace. If you are experiencing misbehaviour please provide
provide a stack trace. If you are experiencing misbehavior please provide
detailed steps to reproduce. Always mention whether you are running the latest
Play Store version or the current HEAD. If you are having problems connecting to
your XMPP server your file transfer doesnt work as expected please always

View File

@ -1,390 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="512"
height="512"
id="svg2"
version="1.1"
inkscape:version="0.48.5 r10040"
sodipodi:docname="conversations_baloon.svg"
inkscape:export-filename="/home/diesys/diesys/grafica/conversation/conversation_bubble.png"
inkscape:export-xdpi="100"
inkscape:export-ydpi="100">
<defs
id="defs4">
<linearGradient
inkscape:collect="always"
id="linearGradient3874">
<stop
style="stop-color:#00a000;stop-opacity:1;"
offset="0"
id="stop3876" />
<stop
style="stop-color:#00a000;stop-opacity:0;"
offset="1"
id="stop3878" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient3913">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3915" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop3917" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient3818">
<stop
style="stop-color:#669900;stop-opacity:1"
offset="0"
id="stop3820" />
<stop
style="stop-color:#99cc00;stop-opacity:1"
offset="1"
id="stop3822" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3818"
id="radialGradient3824"
cx="212.07048"
cy="1045.9178"
fx="212.07048"
fy="1045.9178"
r="238.57143"
gradientTransform="matrix(1.9491621,-0.90817722,0.65829208,1.4128498,-879.63121,-248.98648)"
gradientUnits="userSpaceOnUse" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3913"
id="radialGradient3919"
cx="362.98563"
cy="379.77524"
fx="362.98563"
fy="379.77524"
r="139.95312"
gradientTransform="matrix(1.3800477,1.0445431,-1.3325077,1.7605059,339.09383,-577.83938)"
gradientUnits="userSpaceOnUse" />
<linearGradient
gradientUnits="userSpaceOnUse"
y2="-155.75885"
x2="114.59022"
y1="35.545681"
x1="114.55434"
id="linearGradient3794"
xlink:href="#linearGradient3788"
inkscape:collect="always" />
<linearGradient
id="linearGradient3788">
<stop
id="stop3790"
offset="0"
style="stop-color:#1eed00;stop-opacity:1;" />
<stop
id="stop3792"
offset="1"
style="stop-color:#abff28;stop-opacity:1;" />
</linearGradient>
<linearGradient
id="linearGradient3821">
<stop
style="stop-color:#ff283d;stop-opacity:1;"
offset="0"
id="stop3823" />
<stop
style="stop-color:#ff28ae;stop-opacity:1;"
offset="1"
id="stop3825" />
</linearGradient>
<linearGradient
id="linearGradient4543">
<stop
style="stop-color:#2e45bf;stop-opacity:1;"
offset="0"
id="stop4545" />
<stop
style="stop-color:#28a7ff;stop-opacity:1;"
offset="1"
id="stop4547" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient4098">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4100" />
<stop
style="stop-color:#e6e6e6;stop-opacity:1"
offset="1"
id="stop4102" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4098"
id="linearGradient3833"
x1="273.81851"
y1="764.74677"
x2="304.14023"
y2="936.47272"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4098"
id="linearGradient3853"
gradientUnits="userSpaceOnUse"
x1="273.81851"
y1="764.74677"
x2="304.14023"
y2="936.47272" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3818"
id="radialGradient3863"
cx="262.33273"
cy="945.23846"
fx="262.33273"
fy="945.23846"
r="185.49754"
gradientTransform="matrix(1.2253203,-0.54206726,0.43090148,0.97403458,-466.4135,170.11831)"
gradientUnits="userSpaceOnUse" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3818"
id="radialGradient3866"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.2253203,-0.54206726,0.43090148,0.97403458,-466.4135,170.11831)"
cx="262.33273"
cy="945.23846"
fx="262.33273"
fy="945.23846"
r="185.49754" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3913"
id="radialGradient3873"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.3800477,1.0445431,-1.3325077,1.7605059,339.09383,-577.83938)"
cx="321.75275"
cy="386.38751"
fx="321.75275"
fy="386.38751"
r="139.95312" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3818"
id="radialGradient3880"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.2253203,-0.54206726,0.43090148,0.97403458,-466.4135,-370.24387)"
cx="262.33273"
cy="945.23846"
fx="262.33273"
fy="945.23846"
r="185.49754" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3913"
id="radialGradient3883"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.4430075,-0.63865195,0.50745433,1.1475866,-594.40824,44.803037)"
cx="262.33273"
cy="945.23846"
fx="262.33273"
fy="945.23846"
r="185.49754" />
<filter
inkscape:collect="always"
id="filter3895">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="2.0013623"
id="feGaussianBlur3897" />
</filter>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3874"
id="radialGradient3881"
cx="150.35715"
cy="236.28571"
fx="150.35715"
fy="236.28571"
r="26.887305"
gradientTransform="matrix(1,0,0,0.98671703,0,3.1385771)"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.4142136"
inkscape:cx="385.13513"
inkscape:cy="237.84331"
inkscape:document-units="px"
inkscape:current-layer="layer4"
showgrid="false"
inkscape:window-width="2560"
inkscape:window-height="1020"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
showguides="true"
inkscape:guide-bbox="true"
inkscape:snap-to-guides="true"
inkscape:snap-grids="false"
inkscape:object-paths="true"
inkscape:object-nodes="false"
inkscape:snap-nodes="false">
<sodipodi:guide
orientation="1,0"
position="0,534.28571"
id="guide3004" />
<sodipodi:guide
orientation="0,1"
position="394.28571,511.42857"
id="guide3006" />
<sodipodi:guide
orientation="1,0"
position="511.42857,320"
id="guide3008" />
<sodipodi:guide
orientation="0,1"
position="401.42857,0"
id="guide3010" />
<sodipodi:guide
orientation="1,0"
position="17.142857,258.57143"
id="guide3012" />
<sodipodi:guide
orientation="0,1"
position="327.14286,494.28571"
id="guide3014" />
<sodipodi:guide
orientation="0,1"
position="324.28571,17.142857"
id="guide3016" />
<sodipodi:guide
orientation="1,0"
position="494.28571,237.14286"
id="guide3018" />
<sodipodi:guide
orientation="1,0"
position="255.71429,302.85714"
id="guide3022" />
<sodipodi:guide
orientation="1,0"
position="660,-315"
id="guide3904" />
<sodipodi:guide
orientation="0,1"
position="554.28571,475.71429"
id="guide3931" />
<sodipodi:guide
orientation="0,1"
position="581.42857,244.28571"
id="guide3933" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-540.36218)"
style="display:inline">
<path
d="m 253.34375,605.78125 c -107.90463,0 -195.9375,85.86121 -195.9375,191.84375 0,105.98253 88.02779,191.90625 195.9375,191.90625 33.55862,0 59.4324,-6.89467 88.96875,-17.625 l 93.8125,37.81255 A 12.359798,12.359798 0 0 0 452.75,995.28125 L 427.34375,892.59375 C 443.67389,863.93074 449.25,831.2919 449.25,797.625 449.25,691.64506 361.24842,605.78125 253.34375,605.78125 z"
id="path3885"
style="opacity:0.6;fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter3895)"
inkscape:original="M 253.34375 618.125 C 151.96941 618.125 69.75 698.4746 69.75 797.625 C 69.75 896.77539 151.96941 977.1875 253.34375 977.1875 C 287.00054 977.1875 311.5728 970.27778 342.65625 958.71875 L 440.75 998.25 L 414.1875 890.8125 C 431.0772 863.65332 436.90625 831.73711 436.90625 797.625 C 436.90625 698.4746 354.71813 618.125 253.34375 618.125 z "
inkscape:radius="12.358562"
sodipodi:type="inkscape:offset"
transform="matrix(1.1776575,0,0,1.1781783,-45.132882,-150.91395)" />
<path
sodipodi:type="inkscape:offset"
inkscape:radius="12.358562"
inkscape:original="M 253.34375 618.125 C 151.96941 618.125 69.75 698.4746 69.75 797.625 C 69.75 896.77539 151.96941 977.1875 253.34375 977.1875 C 287.00054 977.1875 311.5728 970.27778 342.65625 958.71875 L 440.75 998.25 L 414.1875 890.8125 C 431.0772 863.65332 436.90625 831.73711 436.90625 797.625 C 436.90625 698.4746 354.71813 618.125 253.34375 618.125 z "
style="fill:#00a000;fill-opacity:1;stroke:none"
id="path3868"
d="m 253.34375,605.78125 c -107.90463,0 -195.9375,85.86121 -195.9375,191.84375 0,105.98253 88.02779,191.90625 195.9375,191.90625 33.55862,0 59.4324,-6.89467 88.96875,-17.625 l 93.8125,37.81255 A 12.359798,12.359798 0 0 0 452.75,995.28125 L 427.34375,892.59375 C 443.67389,863.93074 449.25,831.2919 449.25,797.625 449.25,691.64506 361.24842,605.78125 253.34375,605.78125 z"
transform="matrix(1.1776575,0,0,1.1781783,-45.132882,-155.6267)" />
<path
style="opacity:0.19211821;fill:url(#radialGradient3883);fill-opacity:1;stroke:none"
d="m 442.08605,700.89397 c -129.66422,0 -234.75863,103.19621 -234.75863,230.48113 0,26.84957 4.6841,52.62718 13.28548,76.5811 10.65333,1.4828 21.54531,2.2461 32.60637,2.2461 39.52053,0 69.99101,-8.1231 104.7747,-20.7651 l 110.479,44.5494 a 14.555607,14.562048 0 0 0 19.57853,-17.0097 L 458.13167,895.99293 c 19.23127,-33.77016 25.79804,-72.22452 25.79804,-111.89014 0,-28.84573 -5.53074,-56.41202 -15.60395,-81.77294 -8.61503,-0.94041 -17.37147,-1.43588 -26.23971,-1.43588 z"
id="path3878"
inkscape:connector-curvature="0" />
<path
sodipodi:nodetypes="ccsssscc"
inkscape:connector-curvature="0"
id="path3845"
d="M 478.64112,1025.218 447.36049,898.60749 c 19.89028,-31.99834 26.74288,-69.57172 26.74288,-109.76189 0,-116.81686 -96.79943,-211.48385 -216.18374,-211.48385 -119.38425,0 -216.183656,94.66699 -216.183656,211.48385 0,116.81685 96.799406,211.5536 216.183656,211.5536 39.63617,0 68.58847,-8.14219 105.19417,-21.76075 z"
style="opacity:0;fill:none;stroke:#000000;stroke-width:23.55835724;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:94.23343197, 94.23343197;stroke-dashoffset:0" />
<path
inkscape:connector-curvature="0"
id="path3855"
d="m 253.18246,561.05889 c -5.38379,-0.002 -10.7413,0.0871 -12.77023,0.22089 -16.80965,1.10727 -29.68729,3.05317 -44.38296,6.77453 -5.64799,1.43026 -9.96811,2.69833 -15.19914,4.41816 -3.34052,1.09828 -8.41764,2.85364 -8.68521,3.01909 -0.082,0.0507 3.32705,9.32907 7.98597,21.79631 0.0466,0.12496 0.17057,0.13832 0.33123,0.0736 1.11322,-0.44815 6.45699,-2.29745 8.94283,-3.09273 21.39718,-6.84518 43.95735,-10.19531 66.31683,-9.86723 3.14874,0.0461 7.13319,0.15915 8.83245,0.25775 1.69921,0.0987 3.12161,0.15378 3.16493,0.11037 0.0685,-0.0684 1.53237,-23.21444 1.47209,-23.26905 -0.0122,-0.0117 -1.41064,-0.10943 -3.12817,-0.22089 -2.0869,-0.13546 -7.49683,-0.21852 -12.88062,-0.22088 z m 110.81021,28.16581 c -0.10125,0.10911 -11.15095,20.28455 -11.15095,20.36043 0,0.0184 0.50701,0.31641 1.14084,0.66267 8.38104,4.57856 17.56037,10.63803 25.90897,17.04889 3.23527,2.48434 6.34578,5.02146 9.23674,7.54561 4.2123,3.67784 8.41256,7.68117 12.42754,11.81905 6.38417,6.5796 12.29989,13.4994 17.05071,19.99177 0.65274,0.89212 0.79099,1.01157 1.03047,0.84681 1.13402,-0.7802 18.39736,-13.76959 18.40089,-13.84358 0.005,-0.1 -3.33561,-4.52525 -4.74744,-6.29593 -5.64395,-7.07831 -10.59769,-12.59166 -17.26005,-19.25582 -8.26499,-8.26722 -16.14264,-15.121 -25.02569,-21.71453 -2.5667,-1.90515 -5.21733,-3.78858 -7.9855,-5.6781 -6.60132,-4.50598 -18.71149,-11.82683 -19.02653,-11.48727 z m -274.762206,39.94759 -2.428914,2.57732 c -21.579098,22.69359 -38.068397,49.23025 -48.467963,78.05431 -0.50904,1.41091 -0.957247,2.67589 -0.993643,2.83498 -0.04781,0.20904 2.956962,1.31003 10.78292,3.93954 5.956638,2.00143 10.92488,3.63791 11.040538,3.64502 0.115645,0.007 0.916879,-1.94564 1.803285,-4.34458 9.098432,-24.62317 23.187184,-47.25662 41.659643,-66.93523 l 3.05453,-3.27681 -8.206806,-8.24726 z m 388.222146,115.167 -9.89972,1.91451 c -5.44839,1.06994 -10.56998,2.07187 -11.40857,2.20908 -1.04711,0.17137 -1.54564,0.35016 -1.54564,0.55228 0,0.16187 0.23325,1.63204 0.51522,3.2768 2.70275,15.76547 3.28356,34.63258 1.69287,55.26394 -0.7281,9.44363 -2.34823,21.04449 -3.90099,28.01857 -0.23345,1.0486 -0.37949,1.97667 -0.33118,2.02499 0.0483,0.0483 5.12585,1.1561 11.29809,2.46683 6.17232,1.31067 11.30751,2.37915 11.3718,2.39315 0.0641,0.014 0.45734,-1.73307 0.88322,-3.90272 3.35867,-17.11028 4.82653,-33.18977 4.85786,-53.27572 0.0219,-14.08945 -0.79161,-24.35571 -2.87056,-36.96537 z m -427.268845,64.06345 -0.772838,0.11039 c -0.421858,0.0612 -5.59823,0.67716 -11.482161,1.36226 -5.883927,0.68512 -10.759171,1.30169 -10.819725,1.36228 -0.141991,0.142 0.252313,2.91986 1.140854,8.32086 4.869392,29.59836 15.038358,56.25732 31.539139,82.61977 0.450701,0.72005 0.931445,1.27763 1.06725,1.25182 0.361709,-0.0685 19.423106,-12.2036 19.431349,-12.3709 0.0036,-0.0779 -0.796734,-1.40341 -1.766487,-2.94542 -4.266677,-6.78447 -9.935035,-17.45299 -13.064635,-24.5945 -7.52905,-17.18062 -12.488823,-34.71382 -15.051936,-53.27567 z M 462.40066,926.44149 c -0.46898,0.009 -22.08567,5.38002 -22.2283,5.52269 -0.098,0.0981 22.04129,90.06142 22.37549,91.01382 0.40286,1.1482 3.73284,10.5298 13.56323,8.9156 10.95786,-2.3434 9.8458,-14.6677 8.99628,-14.4751 -0.11284,0.025 -5.02627,-20.61508 -11.18774,-45.58033 -8.79763,-35.64656 -11.26829,-45.40142 -11.51896,-45.39668 z M 143.91794,953.1714 c -0.40943,0.0131 -1.21588,1.3276 -6.29312,9.64634 -3.31435,5.43031 -6.03549,9.92123 -6.03549,9.9777 0,0.13674 3.42858,2.19027 7.06593,4.27089 22.35182,12.78549 47.08561,21.82095 72.42596,26.43487 3.59043,0.654 5.67261,1.0064 11.04051,1.804 0.69401,0.1031 1.36954,0.2073 1.50889,0.2212 0.31484,0.031 0.24386,0.6279 1.87691,-11.45018 0.75094,-5.5542 1.40492,-10.43428 1.47207,-10.86126 0.11781,-0.74877 0.0863,-0.77677 -0.58887,-0.88362 -0.38487,-0.0607 -2.68651,-0.4127 -5.11543,-0.77322 -22.30454,-3.3101 -45.25895,-10.90321 -65.32317,-21.57538 -3.55401,-1.89038 -10.16752,-5.64292 -11.85018,-6.73769 -0.0531,-0.0345 -0.12551,-0.0755 -0.18401,-0.0737 z m 214.22322,9.09404 c -1.98095,0.13013 -4.60205,1.01767 -10.4517,3.12954 -11.29964,4.0795 -24.13159,8.26507 -29.91986,9.75681 -0.83741,0.21582 -1.5445,0.50692 -1.54566,0.62592 -0.002,0.21503 5.72469,22.22722 5.81468,22.34847 0.0552,0.075 6.34708,-1.70267 10.2677,-2.90858 5.09669,-1.5677 13.67295,-4.44246 19.79936,-6.62722 l 6.07232,-2.17225 22.30187,8.98356 c 18.14341,7.31671 22.30098,8.95081 22.41231,8.68881 0.9061,-2.1322 8.61707,-21.32757 8.57483,-21.35419 -0.38803,-0.24492 -49.13929,-19.77601 -49.90327,-19.99221 -1.25781,-0.35596 -2.23399,-0.55669 -3.42258,-0.47866 z"
style="opacity:0.5;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:5.88958931;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
sodipodi:nodetypes="ccssccssscccccccssssscccsssscccscsssccccccssssssssssccccscssccsscccsscsscsssssccsccsscsscsccscccccssc" />
</g>
<g
inkscape:groupmode="layer"
id="layer4"
inkscape:label="Dots">
<path
sodipodi:type="arc"
style="opacity:0.928;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path3047"
sodipodi:cx="173.57143"
sodipodi:cy="241.28571"
sodipodi:rx="26.428572"
sodipodi:ry="20"
d="m 200,241.28571 a 26.428572,20 0 1 1 -52.85715,0 26.428572,20 0 1 1 52.85715,0 z"
transform="matrix(0.94594594,0,0,1.25,-18.332045,-54.607132)" />
<path
sodipodi:type="arc"
style="opacity:0.928;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path3047-1"
sodipodi:cx="173.57143"
sodipodi:cy="241.28571"
sodipodi:rx="26.428572"
sodipodi:ry="20"
d="m 200,241.28571 a 26.428572,20 0 1 1 -52.85715,0 26.428572,20 0 1 1 52.85715,0 z"
transform="matrix(0.94594594,0,0,1.25,91.38502,-54.607132)" />
<path
sodipodi:type="arc"
style="opacity:0.928;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path3047-1-8"
sodipodi:cx="173.57143"
sodipodi:cy="241.28571"
sodipodi:rx="26.428572"
sodipodi:ry="20"
d="m 200,241.28571 a 26.428572,20 0 1 1 -52.85715,0 26.428572,20 0 1 1 52.85715,0 z"
transform="matrix(0.94594594,0,0,1.25,201.38502,-54.607132)" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 18 KiB

168
art/date_bubble_grey.svg Normal file
View File

@ -0,0 +1,168 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="26"
height="26"
id="svg2"
version="1.1"
inkscape:version="0.92.1 r"
sodipodi:docname="date_bubble_white.svg">
<defs
id="defs4">
<filter
x="-0.25"
y="-0.25"
width="1.5"
height="1.5"
inkscape:label="Drop Shadow"
id="filter3811"
style="color-interpolation-filters:sRGB">
<feFlood
flood-opacity="0.25"
flood-color="rgb(0,0,0)"
result="flood"
id="feFlood3813" />
<feComposite
in="flood"
in2="SourceGraphic"
operator="in"
result="composite1"
id="feComposite3815" />
<feGaussianBlur
stdDeviation="0.5"
result="blur"
id="feGaussianBlur3817" />
<feOffset
dx="0"
dy="1"
result="offset"
id="feOffset3819" />
<feComposite
in="SourceGraphic"
in2="offset"
operator="over"
result="composite2"
id="feComposite3821" />
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="16"
inkscape:cx="9.745257"
inkscape:cy="9.618802"
inkscape:document-units="px"
inkscape:current-layer="layer"
showgrid="true"
inkscape:window-width="1916"
inkscape:window-height="1156"
inkscape:window-x="0"
inkscape:window-y="20"
inkscape:window-maximized="0"
showguides="true"
inkscape:guide-bbox="true"
guidecolor="#000000"
guideopacity="0.49803922"
fit-margin-top="-2"
fit-margin-left="-2"
fit-margin-right="-2"
fit-margin-bottom="-2">
<inkscape:grid
type="xygrid"
id="grid2985"
empspacing="4"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true"
spacingx="1"
spacingy="1"
originx="-9"
originy="-1"
color="#0000ff"
opacity="0.03137255" />
<sodipodi:guide
orientation="1,0"
position="11,26"
id="guide3060"
inkscape:locked="false" />
<sodipodi:guide
orientation="1,0"
position="15,26"
id="guide3062"
inkscape:locked="false" />
<sodipodi:guide
orientation="0,1"
position="26,21"
id="guide3064"
inkscape:locked="false" />
<sodipodi:guide
orientation="0,1"
position="26,5"
id="guide3066"
inkscape:locked="false" />
<sodipodi:guide
orientation="1,0"
position="17,0"
id="guide3068"
inkscape:locked="false" />
<sodipodi:guide
orientation="1,0"
position="9,0"
id="guide3070"
inkscape:locked="false" />
<sodipodi:guide
orientation="0,1"
position="0,18"
id="guide3074"
inkscape:locked="false" />
<sodipodi:guide
orientation="0,1"
position="0,16"
id="guide3076"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer"
inkscape:groupmode="layer"
id="layer"
transform="translate(-9,-1)">
<path
sodipodi:nodetypes="cccc"
inkscape:connector-curvature="0"
id="path3805"
d="m 8,8 c 2,2 4,6 4,10 L 16,8 Z"
style="display:none;fill:#424242;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3811)" />
<rect
style="fill:#424242;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3811)"
id="rect2987"
width="20"
height="20"
x="12"
y="4"
ry="2" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.3 KiB

168
art/date_bubble_white.svg Normal file
View File

@ -0,0 +1,168 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="26"
height="26"
id="svg2"
version="1.1"
inkscape:version="0.92.1 r"
sodipodi:docname="date_bubble_white.svg">
<defs
id="defs4">
<filter
x="-0.25"
y="-0.25"
width="1.5"
height="1.5"
inkscape:label="Drop Shadow"
id="filter3811"
style="color-interpolation-filters:sRGB">
<feFlood
flood-opacity="0.25"
flood-color="rgb(0,0,0)"
result="flood"
id="feFlood3813" />
<feComposite
in="flood"
in2="SourceGraphic"
operator="in"
result="composite1"
id="feComposite3815" />
<feGaussianBlur
stdDeviation="0.5"
result="blur"
id="feGaussianBlur3817" />
<feOffset
dx="0"
dy="1"
result="offset"
id="feOffset3819" />
<feComposite
in="SourceGraphic"
in2="offset"
operator="over"
result="composite2"
id="feComposite3821" />
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="16"
inkscape:cx="9.745257"
inkscape:cy="9.618802"
inkscape:document-units="px"
inkscape:current-layer="layer"
showgrid="true"
inkscape:window-width="1916"
inkscape:window-height="1156"
inkscape:window-x="0"
inkscape:window-y="20"
inkscape:window-maximized="0"
showguides="true"
inkscape:guide-bbox="true"
guidecolor="#000000"
guideopacity="0.49803922"
fit-margin-top="-2"
fit-margin-left="-2"
fit-margin-right="-2"
fit-margin-bottom="-2">
<inkscape:grid
type="xygrid"
id="grid2985"
empspacing="4"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true"
spacingx="1"
spacingy="1"
originx="-9"
originy="-1"
color="#0000ff"
opacity="0.03137255" />
<sodipodi:guide
orientation="1,0"
position="11,26"
id="guide3060"
inkscape:locked="false" />
<sodipodi:guide
orientation="1,0"
position="15,26"
id="guide3062"
inkscape:locked="false" />
<sodipodi:guide
orientation="0,1"
position="26,21"
id="guide3064"
inkscape:locked="false" />
<sodipodi:guide
orientation="0,1"
position="26,5"
id="guide3066"
inkscape:locked="false" />
<sodipodi:guide
orientation="1,0"
position="17,0"
id="guide3068"
inkscape:locked="false" />
<sodipodi:guide
orientation="1,0"
position="9,0"
id="guide3070"
inkscape:locked="false" />
<sodipodi:guide
orientation="0,1"
position="0,18"
id="guide3074"
inkscape:locked="false" />
<sodipodi:guide
orientation="0,1"
position="0,16"
id="guide3076"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer"
inkscape:groupmode="layer"
id="layer"
transform="translate(-9,-1)">
<path
sodipodi:nodetypes="cccc"
inkscape:connector-curvature="0"
id="path3805"
d="m 8,8 c 2,2 4,6 4,10 L 16,8 Z"
style="display:none;fill:#fafafa;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3811)" />
<rect
style="fill:#fafafa;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3811)"
id="rect2987"
width="20"
height="20"
x="12"
y="4"
ry="2" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.3 KiB

427
art/ic_launcher.svg Normal file
View File

@ -0,0 +1,427 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="57mm"
height="57mm"
viewBox="0 0 201.96849 201.96849"
id="svg4211"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="conversations_baloon.svg">
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
showguides="false"
inkscape:zoom="2.2196812"
inkscape:cx="39.109276"
inkscape:cy="132.27753"
inkscape:window-width="1600"
inkscape:window-height="836"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="layer8" />
<defs
id="defs4213">
<linearGradient
osb:paint="solid"
id="linearGradient5393">
<stop
id="stop5395"
offset="0"
style="stop-color:#ffffff;stop-opacity:1;" />
</linearGradient>
<clipPath
id="clipPath4831"
clipPathUnits="userSpaceOnUse">
<circle
style="display:inline;opacity:1;fill:#a00e00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="circle4833"
cx="883.16943"
cy="677.19611"
r="229.80969" />
</clipPath>
<clipPath
id="clipPath4859"
clipPathUnits="userSpaceOnUse">
<circle
style="display:inline;opacity:1;fill:#a00e00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="circle4861"
cx="883.16943"
cy="677.19611"
r="229.80969" />
</clipPath>
<clipPath
id="clipPath5624"
clipPathUnits="userSpaceOnUse">
<g
style="display:inline"
id="g5626"
transform="matrix(0.3835576,0,0,0.3835576,-250.60108,-156.11014)">
<path
sodipodi:nodetypes="ccsssc"
inkscape:connector-curvature="0"
id="path5628"
d="m 1120.8042,772.36056 -118.0025,103.66316 118.5792,46.01918 c 8.4859,3.29325 19.6524,7.94481 27.2622,0.71376 7.3868,-7.01907 5.6502,-14.13839 3.0935,-24.54095 z"
style="display:inline;fill:#4caf50;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<circle
transform="matrix(1.0878566,0,0,1.0878566,-57.401992,-79.686482)"
clip-path="url(#clipPath4859)"
r="229.80969"
cy="677.19611"
cx="883.16943"
id="circle5630"
style="display:inline;opacity:1;fill:#4caf50;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
</g>
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath10653">
<g
style="display:inline"
id="g10655"
transform="matrix(0.3835576,0,0,0.3835576,-250.60108,-156.11015)"
inkscape:export-xdpi="100"
inkscape:export-ydpi="100">
<path
sodipodi:nodetypes="ccsssc"
inkscape:connector-curvature="0"
id="path10657"
d="m 1120.8042,772.36056 -118.0025,103.66316 118.5792,46.01918 c 8.4859,3.29325 19.6524,7.94481 27.2622,0.71376 7.3868,-7.01907 5.6502,-14.13839 3.0935,-24.54095 z"
style="display:inline;fill:#4caf50;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<circle
transform="matrix(1.0878566,0,0,1.0878566,-57.401992,-79.686482)"
clip-path="url(#clipPath4859)"
r="229.80969"
cy="677.19611"
cx="883.16943"
id="circle10659"
style="display:inline;opacity:1;fill:#4caf50;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
</g>
</clipPath>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3913"
id="radialGradient3883"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.68662089,-0.30388739,0.24146012,0.54605188,-300.74233,-264.46964)"
cx="262.33273"
cy="945.23846"
fx="262.33273"
fy="945.23846"
r="185.49754" />
<linearGradient
inkscape:collect="always"
id="linearGradient3913">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3915" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop3917" />
</linearGradient>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5315">
<g
inkscape:export-ydpi="100"
inkscape:export-xdpi="100"
transform="matrix(0.3835576,0,0,0.3835576,-246.60108,-156.11013)"
id="g5317"
style="display:inline;fill:#00a000;fill-opacity:1">
<path
style="display:inline;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 1120.8042,772.36056 -118.0025,103.66316 118.5792,46.01918 c 8.4859,3.29325 19.6524,7.94481 27.2622,0.71376 7.3868,-7.01907 5.6502,-14.13839 3.0935,-24.54095 z"
id="path5319"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccsssc" />
<circle
style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="circle5321"
cx="883.16943"
cy="677.19611"
r="229.80969"
clip-path="url(#clipPath4859)"
transform="matrix(1.0878566,0,0,1.0878566,-57.401992,-79.686482)" />
</g>
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath6882">
<path
inkscape:connector-curvature="0"
id="path6884"
d="M 99.88867,-2.3837657e-4 A 95.889392,95.889392 0 0 0 4,95.888436 95.889392,95.889392 0 0 0 99.88867,191.77906 95.889392,95.889392 0 0 0 142.59375,181.70093 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 l -11.34766,-46.16797 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 195.7793,95.888466 95.889392,95.889392 0 0 0 99.88867,-2.0837657e-4 Z"
style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath6886">
<path
inkscape:connector-curvature="0"
id="path6888"
d="M 99.88867,-2.3837657e-4 A 95.889392,95.889392 0 0 0 4,95.888436 95.889392,95.889392 0 0 0 99.88867,191.77906 95.889392,95.889392 0 0 0 142.59375,181.70093 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 l -11.34766,-46.16797 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 195.7793,95.888466 95.889392,95.889392 0 0 0 99.88867,-2.0837657e-4 Z"
style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath6890">
<path
inkscape:connector-curvature="0"
id="path6892"
d="M 99.88867,-2.3837657e-4 A 95.889392,95.889392 0 0 0 4,95.888436 95.889392,95.889392 0 0 0 99.88867,191.77906 95.889392,95.889392 0 0 0 142.59375,181.70093 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 l -11.34766,-46.16797 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 195.7793,95.888466 95.889392,95.889392 0 0 0 99.88867,-2.0837657e-4 Z"
style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath6894">
<path
inkscape:connector-curvature="0"
id="path6896"
d="M 99.88867,-2.3837657e-4 A 95.889392,95.889392 0 0 0 4,95.888436 95.889392,95.889392 0 0 0 99.88867,191.77906 95.889392,95.889392 0 0 0 142.59375,181.70093 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 l -11.34766,-46.16797 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 195.7793,95.888466 95.889392,95.889392 0 0 0 99.88867,-2.0837657e-4 Z"
style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath6898">
<path
inkscape:connector-curvature="0"
id="path6900"
d="M 99.88867,-2.3837657e-4 A 95.889392,95.889392 0 0 0 4,95.888436 95.889392,95.889392 0 0 0 99.88867,191.77906 95.889392,95.889392 0 0 0 142.59375,181.70093 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 l -11.34766,-46.16797 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 195.7793,95.888466 95.889392,95.889392 0 0 0 99.88867,-2.0837657e-4 Z"
style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath6902">
<path
inkscape:connector-curvature="0"
id="path6904"
d="M 99.88867,-2.3837657e-4 A 95.889392,95.889392 0 0 0 4,95.888436 95.889392,95.889392 0 0 0 99.88867,191.77906 95.889392,95.889392 0 0 0 142.59375,181.70093 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 l -11.34766,-46.16797 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 195.7793,95.888466 95.889392,95.889392 0 0 0 99.88867,-2.0837657e-4 Z"
style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath6906">
<path
inkscape:connector-curvature="0"
id="path6908"
d="M 99.88867,-2.3837657e-4 A 95.889392,95.889392 0 0 0 4,95.888436 95.889392,95.889392 0 0 0 99.88867,191.77906 95.889392,95.889392 0 0 0 142.59375,181.70093 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 l -11.34766,-46.16797 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 195.7793,95.888466 95.889392,95.889392 0 0 0 99.88867,-2.0837657e-4 Z"
style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath6910">
<path
inkscape:connector-curvature="0"
id="path6912"
d="M 99.88867,-2.3837657e-4 A 95.889392,95.889392 0 0 0 4,95.888436 95.889392,95.889392 0 0 0 99.88867,191.77906 95.889392,95.889392 0 0 0 142.59375,181.70093 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 l -11.34766,-46.16797 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 195.7793,95.888466 95.889392,95.889392 0 0 0 99.88867,-2.0837657e-4 Z"
style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
</clipPath>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter5640"
x="-0.012227737"
width="1.0244555"
y="-0.011780591"
height="1.0235612">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.9782166"
id="feGaussianBlur5642" />
</filter>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5745">
<path
inkscape:connector-curvature="0"
id="path5747"
d="M 99.908581,-2.3831968e-4 A 95.889392,95.889392 0 0 0 4.0199102,95.888436 95.889392,95.889392 0 0 0 99.908581,191.77906 95.889392,95.889392 0 0 0 142.61366,181.70093 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 L 183.8285,142.24002 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 195.79921,95.888466 95.889392,95.889392 0 0 0 99.908581,-2.0831968e-4 Z"
style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
</clipPath>
</defs>
<metadata
id="metadata4216">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
id="layer9"
inkscape:label="shaddow"
transform="translate(-4,2.6816164)"
style="display:inline">
<path
inkscape:connector-curvature="0"
id="path6914"
d="M 104.88867,0.06226191 A 95.889392,95.889392 0 0 0 8.9999996,95.950936 95.889392,95.889392 0 0 0 104.88867,191.84156 95.889392,95.889392 0 0 0 147.59375,181.76343 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 l -11.34766,-46.16797 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 200.7793,95.950966 95.889392,95.889392 0 0 0 104.88867,0.06229191 Z"
style="display:inline;opacity:0.4;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter5640)" />
</g>
<g
style="display:inline"
inkscape:label="bubble"
id="layer4"
inkscape:groupmode="layer"
transform="translate(-4,2.6816348)">
<path
style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="M 104.88867,-1.9377566 A 95.889392,95.889392 0 0 0 8.9999996,93.950918 95.889392,95.889392 0 0 0 104.88867,189.84154 95.889392,95.889392 0 0 0 147.59375,179.76341 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 L 188.80859,140.3025 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 200.7793,93.950948 95.889392,95.889392 0 0 0 104.88867,-1.9377266 Z"
id="circle6661"
inkscape:connector-curvature="0" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:125px;line-height:1000%;font-family:Sans;letter-spacing:-10.89000034px;word-spacing:5px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="85.862968"
y="-55.271603"
id="text6634"
sodipodi:linespacing="1000%"><tspan
sodipodi:role="line"
id="tspan6636"
x="85.862968"
y="-55.271603" /></text>
</g>
<g
inkscape:groupmode="layer"
id="layer8"
inkscape:label="dotted line"
style="display:inline"
transform="translate(-4,2.6816164)">
<path
style="opacity:1;fill:#80d080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
clip-path="url(#clipPath6910)"
d="m 145.16406,11.183594 -5.13232,9.649402 c -0.77924,1.465076 -0.65974,2.41396 0.66876,3.18097 9.66686,5.488467 18.12303,12.874168 24.86104,21.711122 1.05534,1.616079 2.08054,1.713076 3.67763,0.571565 L 178.04883,40 C 169.45271,27.990203 158.19857,18.128379 145.16406,11.183594 Z"
id="path7364"
inkscape:connector-curvature="0"
sodipodi:nodetypes="csccscc"
transform="translate(4.9999996,-1.9374999)" />
<path
style="opacity:1;fill:#80d080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
clip-path="url(#clipPath6906)"
d="m 193.80469,75.615234 -9.62713,2.062751 c -2.66266,0.570512 -3.40763,1.172953 -2.90593,3.917433 0.85823,4.714633 1.30424,9.497137 1.33189,14.293254 -0.028,5.578758 -0.62194,11.137108 -1.77093,16.589918 -0.86591,3.23162 0.13682,3.77092 3.16149,4.58138 l 8.98639,2.30136 c 1.98177,-7.66828 3.00584,-15.55255 3.04883,-23.472658 -0.0187,-6.817681 -0.76446,-13.613926 -2.22461,-20.273438 z"
id="path7366"
inkscape:connector-curvature="0"
sodipodi:nodetypes="csccccccc"
transform="translate(4.9999996,-1.9374999)" />
<path
style="opacity:1;fill:#80d080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
clip-path="url(#clipPath6902)"
d="m 14.264281,102.76512 -10.2076406,0.87943 c 1.2093798,14.83154 5.8540346,29.17808 13.5664056,41.90429 l 8.544301,-5.23239 c 2.394983,-1.46665 1.895406,-3.37834 0.986202,-5.04513 -5.118253,-9.40257 -8.359018,-19.71635 -9.536202,-30.36553 0,-2.09418 -1.881577,-2.26744 -3.353066,-2.14067 z"
id="path7372"
inkscape:connector-curvature="0"
sodipodi:nodetypes="sccsccs"
transform="translate(4.9999996,-1.9374999)" />
<path
style="opacity:1;fill:#80d080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
clip-path="url(#clipPath6898)"
d="m 51.504371,166.60235 -5.82273,8.50898 c 12.710503,8.71282 27.333669,14.23394 42.630859,16.0957 l 1.220329,-9.90843 c 0.355066,-2.88295 -1.085712,-3.52946 -3.332252,-3.90256 -10.402329,-1.73697 -20.373956,-5.45322 -29.373754,-10.94516 -1.647505,-1.06744 -3.639993,-2.30718 -5.322452,0.15147 z"
id="path7370"
inkscape:connector-curvature="0"
sodipodi:nodetypes="sccsccs"
transform="translate(4.9999996,-1.9374999)" />
<path
style="opacity:1;fill:#80d080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
clip-path="url(#clipPath6894)"
d="M 32.208984,27.683594 C 21.779177,38.079001 13.883707,50.736882 9.1347656,64.675781 L 19.33617,68.090365 c 1.658147,0.55501 2.832564,-0.120955 3.374272,-1.591979 3.777598,-10.021698 9.470788,-19.210103 16.759132,-27.052307 1.561136,-1.561136 1.567283,-2.960058 0.447507,-4.076606 z"
id="path7374"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccsccsc"
transform="translate(4.9999996,-1.9374999)" />
<path
style="opacity:1;fill:#80d080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
clip-path="url(#clipPath6890)"
d="M 99.888672,-0.25 C 87.701045,-0.2239408 75.630114,2.1252837 64.322266,6.671875 l 3.530435,8.74898 c 1.063314,2.635062 1.616754,3.526314 4.973913,2.352259 8.692057,-3.031338 17.839027,-4.588849 27.062058,-4.599286 5.555828,0 6.486278,0.350026 6.780788,-3.4460223 l 0.74851,-9.64772758 C 104.9135,-0.12857239 102.40179,-0.23868346 99.888672,-0.25 Z"
id="path7376"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccsccscc"
transform="translate(4.9999996,-1.9374999)" />
<path
style="display:inline;fill:#80d080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
clip-path="url(#clipPath6886)"
d="m 138.72416,168.48439 c -4.17634,2.25458 -8.55959,4.09055 -13.0504,5.63418 -1.00363,0.34498 -1.20742,1.18222 -0.8682,2.27372 l 3.44056,11.0706 c 4.92985,-1.53124 9.72799,-3.45808 14.34766,-5.76172 l 0.12695,0.0137 14.0293,5.44532 4.12174,-10.20577 c 0.7548,-1.86894 -0.0184,-2.7016 -1.59462,-3.31324 l -14.72114,-5.71251 c -1.86679,-0.7244 -3.68834,-0.60144 -5.83185,0.55572 z"
id="path5005"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cssccccsssc"
transform="translate(4.9999996,-1.9374999)" />
<path
style="display:inline;fill:#80d080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
clip-path="url(#clipPath6882)"
d="m 186.53125,152.80469 -10.6386,2.70888 c -0.78879,0.20085 -1.67397,1.02386 -1.35494,2.33801 l 9.75918,40.15428 c 8.56713,5.97538 15.30408,3.06731 11.01563,-9.47266 z"
id="path5071"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cssccc"
transform="translate(4.9999996,-1.9374999)" />
</g>
<g
style="display:inline"
inkscape:label="dots"
id="layer2"
inkscape:groupmode="layer"
transform="translate(-4,2.6816348)">
<g
inkscape:export-ydpi="100"
inkscape:export-xdpi="100"
style="fill:#f5f5f5;fill-opacity:1"
transform="matrix(0.3835576,0,0,0.3835576,-248.17635,-138.86977)"
id="g5126">
<circle
r="27.299093"
style="opacity:1;fill:#f5f5f5;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path3047-4"
cx="799.11273"
cy="609.86285" />
<circle
r="27.299093"
style="opacity:1;fill:#f5f5f5;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path3047-1-2"
cx="918.91962"
cy="609.86285" />
<circle
r="27.299093"
style="opacity:1;fill:#f5f5f5;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path3047-1-8-6"
cx="1039.0352"
cy="609.86285" />
</g>
</g>
<g
inkscape:groupmode="layer"
id="layer1"
inkscape:label="light"
style="display:inline"
transform="translate(-4,2.6816164)">
<path
style="display:inline;opacity:0.19211821;fill:url(#radialGradient3883);fill-opacity:1;stroke:none"
d="m 192.44891,47.715674 c -61.69765,0 -111.704333,49.103472 -111.704333,109.668976 0,12.77573 2.228815,25.0414 6.321575,36.4393 5.069139,0.70557 10.251828,1.06876 15.514978,1.06876 18.80489,0 30.91434,7.28449 47.46533,1.26909 l 54.00234,6.06606 c 5.24363,2.11897 11.63381,1.37954 10.27166,-4.11162 l -14.23663,-57.56735 c 9.15073,-16.06873 12.27539,-34.36633 12.27539,-53.240271 0,-13.72556 -2.63167,-26.842322 -7.42478,-38.909717 -4.09925,-0.447474 -8.2658,-0.683228 -12.48553,-0.683228 z"
id="path3878"
inkscape:connector-curvature="0"
clip-path="url(#clipPath5745)"
transform="translate(4.9800894,-1.9374999)"
sodipodi:nodetypes="sscsccccscs" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 25 KiB

View File

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="24"
height="24"
viewBox="0 0 24 24"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="ic_notifications_none_white80.svg">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1543"
inkscape:window-height="1093"
id="namedview6"
showgrid="false"
inkscape:zoom="9.8333333"
inkscape:cx="12"
inkscape:cy="12"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<path
d="M12 22c1.1 0 2-.9 2-2h-4c0 1.1.9 2 2 2zm6-6v-5c0-3.07-1.63-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68C7.64 5.36 6 7.92 6 11v5l-2 2v1h16v-1l-2-2zm-2 1H8v-6c0-2.48 1.51-4.5 4-4.5s4 2.02 4 4.5v6z"
id="path4"
style="fill:#ffffff;fill-opacity:1;opacity:0.8" />
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="24"
height="24"
viewBox="0 0 24 24"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="ic_notifications_off_white80.svg">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1244"
inkscape:window-height="936"
id="namedview6"
showgrid="false"
inkscape:zoom="9.8333333"
inkscape:cx="12"
inkscape:cy="12"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<path
d="M20 18.69L7.84 6.14 5.27 3.49 4 4.76l2.8 2.8v.01c-.52.99-.8 2.16-.8 3.42v5l-2 2v1h13.73l2 2L21 19.72l-1-1.03zM12 22c1.11 0 2-.89 2-2h-4c0 1.11.89 2 2 2zm6-7.32V11c0-3.08-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68c-.15.03-.29.08-.42.12-.1.03-.2.07-.3.11h-.01c-.01 0-.01 0-.02.01-.23.09-.46.2-.68.31 0 0-.01 0-.01.01L18 14.68z"
id="path4"
style="fill:#ffffff;fill-opacity:1;opacity:0.8" />
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="24"
height="24"
viewBox="0 0 24 24"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="ic_notifications_paused_white80.svg">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1375"
inkscape:window-height="999"
id="namedview6"
showgrid="false"
inkscape:zoom="9.8333333"
inkscape:cx="12"
inkscape:cy="12"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<path
d="M12 22c1.1 0 2-.9 2-2h-4c0 1.1.89 2 2 2zm6-6v-5c0-3.07-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68C7.63 5.36 6 7.93 6 11v5l-2 2v1h16v-1l-2-2zm-3.5-6.2l-2.8 3.4h2.8V15h-5v-1.8l2.8-3.4H9.5V8h5v1.8z"
id="path4"
style="fill:#ffffff;fill-opacity:1;opacity:0.8" />
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="24"
height="24"
viewBox="0 0 24 24"
id="svg32"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="ic_notifications_white80.svg">
<metadata
id="metadata40">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs38" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1471"
inkscape:window-height="985"
id="namedview36"
showgrid="false"
inkscape:zoom="9.8333333"
inkscape:cx="12"
inkscape:cy="12"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="svg32" />
<path
d="M12 22c1.1 0 2-.9 2-2h-4c0 1.1.89 2 2 2zm6-6v-5c0-3.07-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68C7.63 5.36 6 7.92 6 11v5l-2 2v1h16v-1l-2-2z"
id="path34"
style="fill:#ffffff;fill-opacity:1;opacity:0.8" />
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48"
height="48"
viewBox="0 0 48 48"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="ic_send_cancel_offline_white.svg">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1080"
id="namedview6"
showgrid="false"
inkscape:zoom="4.9166667"
inkscape:cx="-36.305085"
inkscape:cy="23.898305"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<path
d="M24 4C12.95 4 4 12.95 4 24s8.95 20 20 20 20-8.95 20-20S35.05 4 24 4zm10 27.17L31.17 34 24 26.83 16.83 34 14 31.17 21.17 24 14 16.83 16.83 14 24 21.17 31.17 14 34 16.83 26.83 24 34 31.17z"
id="path4"
style="fill:#ffffff;fill-opacity:0.627451" />
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48"
height="48"
viewBox="0 0 48 48"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="ic_send_location_offline_white.svg">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="956"
inkscape:window-height="1056"
id="namedview6"
showgrid="false"
inkscape:zoom="4.9166667"
inkscape:cx="-36.305085"
inkscape:cy="23.898305"
inkscape:window-x="2880"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<path
d="M24 4c-7.73 0-14 6.27-14 14 0 10.5 14 26 14 26s14-15.5 14-26c0-7.73-6.27-14-14-14zm0 19c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z"
id="path4"
style="fill:#ffffff;fill-opacity:0.627451" />
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48"
height="48"
viewBox="0 0 48 48"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="ic_send_photo_offline_white.svg">
<metadata
id="metadata12">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs10" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="956"
inkscape:window-height="567"
id="namedview8"
showgrid="false"
inkscape:zoom="4.9166667"
inkscape:cx="10.5688"
inkscape:cy="23.898305"
inkscape:window-x="960"
inkscape:window-y="609"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<circle
cx="24"
cy="24"
r="6.4"
id="circle4"
style="fill:#ffffff;fill-opacity:0.627451" />
<path
d="M18 4l-3.66 4H8c-2.21 0-4 1.79-4 4v24c0 2.21 1.79 4 4 4h32c2.21 0 4-1.79 4-4V12c0-2.21-1.79-4-4-4h-6.34L30 4H18zm6 30c-5.52 0-10-4.48-10-10s4.48-10 10-10 10 4.48 10 10-4.48 10-10 10z"
id="path6"
style="fill:#ffffff;fill-opacity:0.627451" />
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48"
height="48"
viewBox="0 0 48 48"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="ic_send_picture_offline_white.svg">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="2560"
inkscape:window-height="1392"
id="namedview6"
showgrid="false"
inkscape:zoom="4.9166667"
inkscape:cx="-21.864407"
inkscape:cy="23.898305"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg2" />
<path
d="M42 38V10c0-2.21-1.79-4-4-4H10c-2.21 0-4 1.79-4 4v28c0 2.21 1.79 4 4 4h28c2.21 0 4-1.79 4-4zM17 27l5 6.01L29 24l9 12H10l7-9z"
id="path4"
style="fill:#ffffff;fill-opacity:0.627451" />
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -0,0 +1,70 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg3621"
version="1.1"
inkscape:version="0.91 r13725"
width="96"
height="96"
sodipodi:docname="ic_send_text_offline_white.svg"
inkscape:export-filename="/home/daniel/workspace/Conversations/res/drawable-xxhdpi/ic_action_send_now_online.png"
inkscape:export-xdpi="154.28572"
inkscape:export-ydpi="154.28572">
<metadata
id="metadata3627">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs3625" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1344"
inkscape:window-height="1056"
id="namedview3623"
showgrid="true"
showguides="true"
inkscape:zoom="8"
inkscape:cx="31.783303"
inkscape:cy="56.698828"
inkscape:window-x="2880"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="svg3621"
inkscape:snap-others="false">
<inkscape:grid
type="xygrid"
id="grid3631" />
</sodipodi:namedview>
<path
style="fill:#ffffff;fill-opacity:0.627451;stroke:none"
d="M 3.887575,4.1549246 90.999747,47.676331 3.887575,91.286663 13.203552,52.344101 63.012683,47.720794 13.203552,43.008558 Z"
id="path3633"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccc"
inkscape:export-filename="/home/daniel/workspace/Conversations/res/drawable-mdpi/ic_action_send_now_dnd.png"
inkscape:export-xdpi="51.42857"
inkscape:export-ydpi="51.42857" />
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48"
height="48"
viewBox="0 0 48 48"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="ic_send_voice_offline_white.svg">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1516"
inkscape:window-height="1056"
id="namedview6"
showgrid="false"
inkscape:zoom="4.9166667"
inkscape:cx="-36.711864"
inkscape:cy="24"
inkscape:window-x="2880"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<path
d="M24 30c3.31 0 5.98-2.69 5.98-6L30 12c0-3.32-2.68-6-6-6-3.31 0-6 2.68-6 6v12c0 3.31 2.69 6 6 6zm10.6-6c0 6-5.07 10.2-10.6 10.2-5.52 0-10.6-4.2-10.6-10.2H10c0 6.83 5.44 12.47 12 13.44V44h4v-6.56c6.56-.97 12-6.61 12-13.44h-3.4z"
id="path4"
style="fill:#ffffff;fill-opacity:0.627451" />
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48"
height="48"
viewBox="0 0 48 48"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="ic_verified_fingerprint.svg">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1916"
inkscape:window-height="1156"
id="namedview6"
showgrid="false"
inkscape:zoom="4.9166667"
inkscape:cx="-3.3559322"
inkscape:cy="24"
inkscape:window-x="0"
inkscape:window-y="20"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<path
d="M24 2L6 10v12c0 11.11 7.67 21.47 18 24 10.33-2.53 18-12.89 18-24V10L24 2zm-4 32l-8-8 2.83-2.83L20 28.34l13.17-13.17L36 18 20 34z"
id="path4"
style="fill:#259b24;fill-opacity:0.87" />
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

1
art/main_logo.svg Symbolic link
View File

@ -0,0 +1 @@
ic_launcher.svg

View File

@ -0,0 +1,165 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="36"
height="26"
id="svg2"
version="1.1"
inkscape:version="0.48.5 r10040"
sodipodi:docname="message_bubble_received.svg">
<defs
id="defs4">
<filter
x="-0.25"
y="-0.25"
width="1.5"
height="1.5"
inkscape:label="Drop Shadow"
id="filter3811"
color-interpolation-filters="sRGB">
<feFlood
flood-opacity="0.25"
flood-color="rgb(0,0,0)"
result="flood"
id="feFlood3813" />
<feComposite
in="flood"
in2="SourceGraphic"
operator="in"
result="composite1"
id="feComposite3815" />
<feGaussianBlur
stdDeviation="0.5"
result="blur"
id="feGaussianBlur3817" />
<feOffset
dx="0"
dy="1"
result="offset"
id="feOffset3819" />
<feComposite
in="SourceGraphic"
in2="offset"
operator="over"
result="composite2"
id="feComposite3821" />
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="16"
inkscape:cx="25.745257"
inkscape:cy="9.618802"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:window-width="989"
inkscape:window-height="755"
inkscape:window-x="22"
inkscape:window-y="16"
inkscape:window-maximized="0"
showguides="true"
inkscape:guide-bbox="true"
guidecolor="#000000"
guideopacity="0.49803922">
<inkscape:grid
type="xygrid"
id="grid2985"
empspacing="4"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true"
spacingx="1px"
spacingy="1px"
originx="0px"
originy="0px"
color="#0000ff"
opacity="0.03137255" />
<sodipodi:guide
orientation="1,0"
position="20,26"
id="guide3060" />
<sodipodi:guide
orientation="1,0"
position="24,26"
id="guide3062" />
<sodipodi:guide
orientation="0,1"
position="36,22"
id="guide3064" />
<sodipodi:guide
orientation="0,1"
position="36,6"
id="guide3066" />
<sodipodi:guide
orientation="1,0"
position="26,0"
id="guide3068" />
<sodipodi:guide
orientation="1,0"
position="18,0"
id="guide3070" />
<sodipodi:guide
orientation="0,1"
position="0,10"
id="guide3074" />
<sodipodi:guide
orientation="0,1"
position="0,8"
id="guide3076" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer"
inkscape:groupmode="layer"
id="layer"
transform="translate(0,-2)">
<g
id="g3759"
style="fill:#326130;fill-opacity:1;stroke:none;fill-rule:nonzero;filter:url(#filter3811)">
<path
style="display:none"
d="m 8,6 c 2,2 4,6 4,10 L 16,6 z"
id="path3805"
inkscape:connector-curvature="0"
transform="translate(0,2)"
sodipodi:nodetypes="cccc" />
<path
inkscape:connector-curvature="0"
id="path2989"
d="M 4,4 16,16 16,4 z"
sodipodi:nodetypes="cccc" />
<rect
ry="2"
y="4"
x="12"
height="20"
width="20"
id="rect2987" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -0,0 +1,167 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="36"
height="26"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="message_bubble_received_grey.svg">
<defs
id="defs4">
<filter
x="-0.25"
y="-0.25"
width="1.5"
height="1.5"
inkscape:label="Drop Shadow"
id="filter3811"
color-interpolation-filters="sRGB">
<feFlood
flood-opacity="0.25"
flood-color="rgb(0,0,0)"
result="flood"
id="feFlood3813" />
<feComposite
in="flood"
in2="SourceGraphic"
operator="in"
result="composite1"
id="feComposite3815" />
<feGaussianBlur
stdDeviation="0.5"
result="blur"
id="feGaussianBlur3817" />
<feOffset
dx="0"
dy="1"
result="offset"
id="feOffset3819" />
<feComposite
in="SourceGraphic"
in2="offset"
operator="over"
result="composite2"
id="feComposite3821" />
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="16"
inkscape:cx="-9.879743"
inkscape:cy="9.618802"
inkscape:document-units="px"
inkscape:current-layer="layer"
showgrid="true"
inkscape:window-width="2135"
inkscape:window-height="911"
inkscape:window-x="22"
inkscape:window-y="16"
inkscape:window-maximized="0"
showguides="true"
inkscape:guide-bbox="true"
guidecolor="#000000"
guideopacity="0.49803922">
<inkscape:grid
type="xygrid"
id="grid2985"
empspacing="4"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true"
spacingx="1px"
spacingy="1px"
originx="0px"
originy="0px"
color="#0000ff"
opacity="0.03137255" />
<sodipodi:guide
orientation="1,0"
position="20,26"
id="guide3060" />
<sodipodi:guide
orientation="1,0"
position="24,26"
id="guide3062" />
<sodipodi:guide
orientation="0,1"
position="36,22"
id="guide3064" />
<sodipodi:guide
orientation="0,1"
position="36,6"
id="guide3066" />
<sodipodi:guide
orientation="1,0"
position="26,0"
id="guide3068" />
<sodipodi:guide
orientation="1,0"
position="18,0"
id="guide3070" />
<sodipodi:guide
orientation="0,1"
position="0,10"
id="guide3074" />
<sodipodi:guide
orientation="0,1"
position="0,8"
id="guide3076" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer"
inkscape:groupmode="layer"
id="layer"
transform="translate(0,-2)">
<g
id="g3759"
style="fill:#424242;fill-opacity:1;stroke:none;fill-rule:nonzero;filter:url(#filter3811)">
<path
style="display:none;fill:#424242;fill-opacity:1"
d="m 8,6 c 2,2 4,6 4,10 L 16,6 z"
id="path3805"
inkscape:connector-curvature="0"
transform="translate(0,2)"
sodipodi:nodetypes="cccc" />
<path
inkscape:connector-curvature="0"
id="path2989"
d="M 4,4 16,16 16,4 z"
sodipodi:nodetypes="cccc"
style="fill:#424242;fill-opacity:1" />
<rect
ry="2"
y="4"
x="12"
height="20"
width="20"
id="rect2987"
style="fill:#424242;fill-opacity:1" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@ -0,0 +1,165 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="36"
height="26"
id="svg2"
version="1.1"
inkscape:version="0.48.5 r10040"
sodipodi:docname="message_bubble_received.svg">
<defs
id="defs4">
<filter
x="-0.25"
y="-0.25"
width="1.5"
height="1.5"
inkscape:label="Drop Shadow"
id="filter3811"
color-interpolation-filters="sRGB">
<feFlood
flood-opacity="0.25"
flood-color="rgb(0,0,0)"
result="flood"
id="feFlood3813" />
<feComposite
in="flood"
in2="SourceGraphic"
operator="in"
result="composite1"
id="feComposite3815" />
<feGaussianBlur
stdDeviation="0.5"
result="blur"
id="feGaussianBlur3817" />
<feOffset
dx="0"
dy="1"
result="offset"
id="feOffset3819" />
<feComposite
in="SourceGraphic"
in2="offset"
operator="over"
result="composite2"
id="feComposite3821" />
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="16"
inkscape:cx="25.745257"
inkscape:cy="9.618802"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:window-width="989"
inkscape:window-height="755"
inkscape:window-x="22"
inkscape:window-y="16"
inkscape:window-maximized="0"
showguides="true"
inkscape:guide-bbox="true"
guidecolor="#000000"
guideopacity="0.49803922">
<inkscape:grid
type="xygrid"
id="grid2985"
empspacing="4"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true"
spacingx="1px"
spacingy="1px"
originx="0px"
originy="0px"
color="#0000ff"
opacity="0.03137255" />
<sodipodi:guide
orientation="1,0"
position="20,26"
id="guide3060" />
<sodipodi:guide
orientation="1,0"
position="24,26"
id="guide3062" />
<sodipodi:guide
orientation="0,1"
position="36,22"
id="guide3064" />
<sodipodi:guide
orientation="0,1"
position="36,6"
id="guide3066" />
<sodipodi:guide
orientation="1,0"
position="26,0"
id="guide3068" />
<sodipodi:guide
orientation="1,0"
position="18,0"
id="guide3070" />
<sodipodi:guide
orientation="0,1"
position="0,10"
id="guide3074" />
<sodipodi:guide
orientation="0,1"
position="0,8"
id="guide3076" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer"
inkscape:groupmode="layer"
id="layer"
transform="translate(0,-2)">
<g
id="g3759"
style="fill:#fafafa;fill-opacity:1;stroke:none;fill-rule:nonzero;filter:url(#filter3811)">
<path
style="display:none"
d="m 8,6 c 2,2 4,6 4,10 L 16,6 z"
id="path3805"
inkscape:connector-curvature="0"
transform="translate(0,2)"
sodipodi:nodetypes="cccc" />
<path
inkscape:connector-curvature="0"
id="path2989"
d="M 4,4 16,16 16,4 z"
sodipodi:nodetypes="cccc" />
<rect
ry="2"
y="4"
x="12"
height="20"
width="20"
id="rect2987" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -0,0 +1,167 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="36"
height="26"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="message_bubble_sent_grey.svg">
<defs
id="defs4">
<filter
x="-0.25"
y="-0.25"
width="1.5"
height="1.5"
inkscape:label="Drop Shadow"
id="filter3811"
color-interpolation-filters="sRGB">
<feFlood
flood-opacity="0.25"
flood-color="rgb(0,0,0)"
result="flood"
id="feFlood3813" />
<feComposite
in="flood"
in2="SourceGraphic"
operator="in"
result="composite1"
id="feComposite3815" />
<feGaussianBlur
stdDeviation="0.5"
result="blur"
id="feGaussianBlur3817" />
<feOffset
dx="0"
dy="1"
result="offset"
id="feOffset3819" />
<feComposite
in="SourceGraphic"
in2="offset"
operator="over"
result="composite2"
id="feComposite3821" />
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="16"
inkscape:cx="6.244862"
inkscape:cy="16.118802"
inkscape:document-units="px"
inkscape:current-layer="layer"
showgrid="true"
inkscape:window-width="1554"
inkscape:window-height="900"
inkscape:window-x="878"
inkscape:window-y="369"
inkscape:window-maximized="0"
showguides="true"
inkscape:guide-bbox="true"
guidecolor="#404040"
guideopacity="0.49803922">
<inkscape:grid
type="xygrid"
id="grid2985"
empspacing="4"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true"
spacingx="1px"
spacingy="1px"
originx="0px"
originy="0px"
color="#0000ff"
opacity="0.03137255" />
<sodipodi:guide
orientation="1,0"
position="12,26"
id="guide3146" />
<sodipodi:guide
orientation="1,0"
position="16,26"
id="guide3148" />
<sodipodi:guide
orientation="0,1"
position="36,22"
id="guide3150" />
<sodipodi:guide
orientation="0,1"
position="36,6"
id="guide3152" />
<sodipodi:guide
orientation="1,0"
position="18,0"
id="guide3154" />
<sodipodi:guide
orientation="1,0"
position="10,0"
id="guide3160" />
<sodipodi:guide
orientation="0,1"
position="0,20"
id="guide3162" />
<sodipodi:guide
orientation="0,1"
position="0,18"
id="guide3164" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer"
inkscape:groupmode="layer"
id="layer"
transform="translate(0,-2)">
<g
id="g3759"
style="fill:#424242;fill-opacity:1;stroke:none;fill-rule:nonzero;filter:url(#filter3811)">
<path
style="display:none;fill:#424242;fill-opacity:1"
d="M 28,18 C 26,16 24,12 24,8 l -4,10 z"
id="path3809"
inkscape:connector-curvature="0"
transform="translate(0,2)"
sodipodi:nodetypes="cccc" />
<path
inkscape:connector-curvature="0"
id="path2989"
d="m 20,12 0,12 12,0 z"
sodipodi:nodetypes="cccc"
style="fill:#424242;fill-opacity:1" />
<rect
ry="2"
y="4"
x="4"
height="20"
width="20"
id="rect2987"
style="fill:#424242;fill-opacity:1" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.3 KiB

68
art/play_gif.svg Normal file
View File

@ -0,0 +1,68 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="24"
height="24"
viewBox="0 0 24 24"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="play_gif.svg">
<metadata
id="metadata14">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1200"
id="namedview12"
showgrid="false"
inkscape:zoom="9.8333333"
inkscape:cx="1.5762712"
inkscape:cy="11.084746"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<defs
id="defs4">
<path
id="a"
d="M24 24H0V0h24v24z" />
</defs>
<clipPath
id="b">
<use
xlink:href="#a"
overflow="visible"
id="use8" />
</clipPath>
<path
d="M11.5 9H13v6h-1.5zM9 9H6c-.6 0-1 .5-1 1v4c0 .5.4 1 1 1h3c.6 0 1-.5 1-1v-2H8.5v1.5h-2v-3H10V10c0-.5-.4-1-1-1zm10 1.5V9h-4.5v6H16v-2h2v-1.5h-2v-1z"
clip-path="url(#b)"
id="path10"
style="fill:#ffffff;fill-opacity:0.7019608" />
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

59
art/play_video.svg Normal file
View File

@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48"
height="48"
viewBox="0 0 48 48"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="play_video.svg">
<metadata
id="metadata12">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs10" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1916"
inkscape:window-height="1156"
id="namedview8"
showgrid="false"
inkscape:zoom="4.9166667"
inkscape:cx="0.91525424"
inkscape:cy="24"
inkscape:window-x="0"
inkscape:window-y="20"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<path
d="M0 0h48v48H0z"
fill="none"
id="path4" />
<path
d="M20 33l12-9-12-9v18zm4-29C12.95 4 4 12.95 4 24s8.95 20 20 20 20-8.95 20-20S35.05 4 24 4zm0 36c-8.82 0-16-7.18-16-16S15.18 8 24 8s16 7.18 16 16-7.18 16-16 16z"
id="path6"
style="fill:#ffffff;fill-opacity:0.7019608;opacity:1;stroke:none;stroke-opacity:0.38039216" />
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -11,41 +11,61 @@ resolutions = {
}
images = {
'conversations_baloon.svg' => ['ic_launcher', 48],
'ic_launcher.svg' => ['ic_launcher', 48],
'main_logo.svg' => ['main_logo', 200],
'play_video.svg' => ['play_video', 128],
'play_gif.svg' => ['play_gif', 128],
'conversations_mono.svg' => ['ic_notification', 24],
'ic_received_indicator.svg' => ['ic_received_indicator', 12],
'ic_send_text_offline.svg' => ['ic_send_text_offline', 36],
'ic_send_text_offline_white.svg' => ['ic_send_text_offline_white', 36],
'ic_send_text_online.svg' => ['ic_send_text_online', 36],
'ic_send_text_away.svg' => ['ic_send_text_away', 36],
'ic_send_text_dnd.svg' => ['ic_send_text_dnd', 36],
'ic_send_photo_online.svg' => ['ic_send_photo_online', 36],
'ic_send_photo_offline.svg' => ['ic_send_photo_offline', 36],
'ic_send_photo_offline_white.svg' => ['ic_send_photo_offline_white', 36],
'ic_send_photo_away.svg' => ['ic_send_photo_away', 36],
'ic_send_photo_dnd.svg' => ['ic_send_photo_dnd', 36],
'ic_send_location_online.svg' => ['ic_send_location_online', 36],
'ic_send_location_offline.svg' => ['ic_send_location_offline', 36],
'ic_send_location_offline_white.svg' => ['ic_send_location_offline_white', 36],
'ic_send_location_away.svg' => ['ic_send_location_away', 36],
'ic_send_location_dnd.svg' => ['ic_send_location_dnd', 36],
'ic_send_voice_online.svg' => ['ic_send_voice_online', 36],
'ic_send_voice_offline.svg' => ['ic_send_voice_offline', 36],
'ic_send_voice_offline_white.svg' => ['ic_send_voice_offline_white', 36],
'ic_send_voice_away.svg' => ['ic_send_voice_away', 36],
'ic_send_voice_dnd.svg' => ['ic_send_voice_dnd', 36],
'ic_send_cancel_online.svg' => ['ic_send_cancel_online', 36],
'ic_send_cancel_offline.svg' => ['ic_send_cancel_offline', 36],
'ic_send_cancel_offline_white.svg' => ['ic_send_cancel_offline_white', 36],
'ic_send_cancel_away.svg' => ['ic_send_cancel_away', 36],
'ic_send_cancel_dnd.svg' => ['ic_send_cancel_dnd', 36],
'ic_send_picture_online.svg' => ['ic_send_picture_online', 36],
'ic_send_picture_offline.svg' => ['ic_send_picture_offline', 36],
'ic_send_picture_offline_white.svg' => ['ic_send_picture_offline_white', 36],
'ic_send_picture_away.svg' => ['ic_send_picture_away', 36],
'ic_send_picture_dnd.svg' => ['ic_send_picture_dnd', 36],
'ic_notifications_none_white80.svg' => ['ic_notifications_none_white80', 24],
'ic_notifications_off_white80.svg' => ['ic_notifications_off_white80', 24],
'ic_notifications_paused_white80.svg' => ['ic_notifications_paused_white80', 24],
'ic_notifications_white80.svg' => ['ic_notifications_white80', 24],
'ic_verified_fingerprint.svg' => ['ic_verified_fingerprint', 36],
'md_switch_thumb_disable.svg' => ['switch_thumb_disable', 48],
'md_switch_thumb_off_normal.svg' => ['switch_thumb_off_normal', 48],
'md_switch_thumb_off_pressed.svg' => ['switch_thumb_off_pressed', 48],
'md_switch_thumb_on_normal.svg' => ['switch_thumb_on_normal', 48],
'md_switch_thumb_on_pressed.svg' => ['switch_thumb_on_pressed', 48],
'message_bubble_received.svg' => ['message_bubble_received.9', 0],
'message_bubble_received_grey.svg' => ['message_bubble_received_grey.9', 0],
'message_bubble_received_dark.svg' => ['message_bubble_received_dark.9', 0],
'message_bubble_received_warning.svg' => ['message_bubble_received_warning.9', 0],
'message_bubble_received_white.svg' => ['message_bubble_received_white.9', 0],
'message_bubble_sent.svg' => ['message_bubble_sent.9', 0],
'message_bubble_sent_grey.svg' => ['message_bubble_sent_grey.9', 0],
'date_bubble_white.svg' => ['date_bubble_white.9', 0],
'date_bubble_grey.svg' => ['date_bubble_grey.9', 0],
}
# Executable paths for Mac OSX

View File

@ -1,115 +1,122 @@
// Top-level build file where you can add configuration options common to all
// sub-projects/modules.
buildscript {
repositories {
jcenter()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
}
}
allprojects {
repositories {
jcenter()
mavenCentral()
}
repositories {
jcenter()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.0'
}
}
apply plugin: 'com.android.application'
repositories {
jcenter()
mavenCentral()
jcenter()
mavenCentral()
}
configurations {
playstoreCompile
}
dependencies {
compile project(':libs:openpgp-api-lib')
compile project(':libs:MemorizingTrustManager')
compile 'com.android.support:support-v13:21.0.3'
compile 'org.bouncycastle:bcprov-jdk15on:1.51'
compile 'org.jitsi:org.otr4j:0.22'
compile 'org.gnu.inet:libidn:1.15'
compile 'com.google.zxing:core:3.1.0'
compile 'com.google.zxing:android-integration:3.1.0'
compile 'de.measite.minidns:minidns:0.1.3'
compile 'de.timroes.android:EnhancedListView:0.3.4'
compile 'me.leolin:ShortcutBadger:1.1.3@aar'
compile 'com.kyleduo.switchbutton:library:1.2.8'
compile 'org.whispersystems:axolotl-android:1.3.4'
compile 'com.makeramen:roundedimageview:2.1.1'
compile project(':libs:MemorizingTrustManager')
playstoreCompile 'com.google.android.gms:play-services-gcm:11.0.4'
compile 'org.sufficientlysecure:openpgp-api:10.0'
compile 'com.soundcloud.android:android-crop:1.0.1@aar'
compile 'com.android.support:support-v13:25.3.1'
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'org.bouncycastle:bcprov-jdk15on:1.52'
compile 'org.bouncycastle:bcmail-jdk15on:1.52'
compile 'org.jitsi:org.otr4j:0.22'
compile 'org.gnu.inet:libidn:1.15'
compile 'com.google.zxing:core:3.2.1'
compile 'com.google.zxing:android-integration:3.2.1'
compile 'de.measite.minidns:minidns-hla:0.2.2'
compile 'de.timroes.android:EnhancedListView:0.3.4'
compile 'me.leolin:ShortcutBadger:1.1.17@aar'
compile 'com.kyleduo.switchbutton:library:1.2.8'
compile 'org.whispersystems:signal-protocol-java:2.6.2'
compile 'com.makeramen:roundedimageview:2.3.0'
compile "com.wefika:flowlayout:0.4.1"
compile 'net.ypresto.androidtranscoder:android-transcoder:0.2.0'
compile ('com.vdurmont:emoji-java:3.3.0') {
exclude group: 'org.json', module: 'json'
}
}
ext {
travisBuild = System.getenv("TRAVIS") == "true"
preDexEnabled = System.getProperty("pre-dex", "true")
}
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
compileSdkVersion 25
buildToolsVersion "26.0.1"
defaultConfig {
minSdkVersion 14
targetSdkVersion 21
versionCode 87
versionName "1.6.3"
}
defaultConfig {
minSdkVersion 14
targetSdkVersion 25
versionCode 229
versionName "1.20.0-beta"
archivesBaseName += "-$versionName"
applicationId "eu.siacs.conversations"
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
dexOptions {
// Skip pre-dexing when running on Travis CI or when disabled via -Dpre-dex=false.
preDexLibraries = preDexEnabled && !travisBuild
jumboMode true
}
//
// To sign release builds, create the file `gradle.properties` in
// $HOME/.gradle or in your project directory with this content:
//
// mStoreFile=/path/to/key.store
// mStorePassword=xxx
// mKeyAlias=alias
// mKeyPassword=xxx
//
if (project.hasProperty('mStoreFile') &&
project.hasProperty('mStorePassword') &&
project.hasProperty('mKeyAlias') &&
project.hasProperty('mKeyPassword')) {
signingConfigs {
release {
storeFile file(mStoreFile)
storePassword mStorePassword
keyAlias mKeyAlias
keyPassword mKeyPassword
}
}
buildTypes.release.signingConfig = signingConfigs.release
} else {
buildTypes.release.signingConfig = null
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
applicationVariants.all { variant ->
if (variant.name.equals('release')) {
variant.outputs.each { output ->
if (output.zipAlign != null) {
output.zipAlign.outputFile = new File(output.outputFile.parent, rootProject.name + "-${variant.versionName}.apk")
}
output.packageApplication.outputFile = new File(output.outputFile.parent, output.packageApplication.outputFile.name
.replace(".apk", "-${variant.versionName}.apk"))
}
}
}
productFlavors {
playstore
free
}
if (project.hasProperty('mStoreFile') &&
project.hasProperty('mStorePassword') &&
project.hasProperty('mKeyAlias') &&
project.hasProperty('mKeyPassword')) {
signingConfigs {
release {
storeFile file(mStoreFile)
storePassword mStorePassword
keyAlias mKeyAlias
keyPassword mKeyPassword
}
}
buildTypes.release.signingConfig = signingConfigs.release
} else {
buildTypes.release.signingConfig = null
}
lintOptions {
disable 'ExtraTranslation', 'MissingTranslation', 'InvalidPackage', 'MissingQuantity', 'AppCompatResource'
}
lintOptions {
disable 'ExtraTranslation', 'MissingTranslation', 'InvalidPackage', 'MissingQuantity', 'AppCompatResource'
}
subprojects {
subprojects {
afterEvaluate {
if (getPlugins().hasPlugin('android') ||
getPlugins().hasPlugin('android-library')) {
afterEvaluate {
if (getPlugins().hasPlugin('android') ||
getPlugins().hasPlugin('android-library')) {
configure(android.lintOptions) {
disable 'AndroidGradlePluginVersion', 'MissingTranslation'
}
}
configure(android.lintOptions) {
disable 'AndroidGradlePluginVersion', 'MissingTranslation'
}
}
}
}
}
}
packagingOptions {
exclude 'META-INF/BCKEY.DSA'
exclude 'META-INF/BCKEY.SF'
}
}

View File

@ -2,13 +2,17 @@
* XEP-0030: Service Discovery
* XEP-0045: Multi-User Chat
* XEP-0048: Bookmarks
* XEP-0084: User Avatar
* XEP-0085: Chat State Notifications
* XEP-0092: Software Version
* XEP-0115: Entity Capabilities
* XEP-0163: Personal Eventing Protocol (avatars and nicks)
* XEP-0166: Jingle (only used for file transfer)
* XEP-0172: User Nickname
* XEP-0184: Message Delivery Receipts (reply only)
* XEP-0191: Blocking command
* XEP-0198: Stream Management
* XEP-0199: XMPP Ping
* XEP-0234: Jingle File Transfer
* XEP-0237: Roster Versioning
* XEP-0245: The /me Command
@ -16,7 +20,13 @@
* XEP-0260: Jingle SOCKS5 Bytestreams Transport Method
* XEP-0261: Jingle In-Band Bytestreams Transport Method
* XEP-0280: Message Carbons
* XEP-0308: Last Message Correction
* XEP-0313: Message Archive Management
* XEP-0319: Last User Interaction in Presence
* XEP-0333: Chat Markers
* XEP-0352: Client State Indication
* XEP-0191: Blocking command
* XEP-0357: Push Notifications
* XEP-0363: HTTP File Upload
* XEP-0368: SRV records for XMPP over TLS
* XEP-0377: Spam Reporting
* XEP-0384: OMEMO Encryption

View File

@ -1,6 +1,5 @@
#Sat Nov 22 17:47:57 CET 2014
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip

View File

@ -3,18 +3,18 @@ buildscript {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
classpath 'com.android.tools.build:gradle:2.3.0'
}
}
apply plugin: 'android-library'
apply plugin: 'com.android.library'
android {
compileSdkVersion 19
buildToolsVersion "19.1"
compileSdkVersion 25
buildToolsVersion "26.0.1"
defaultConfig {
minSdkVersion 7
targetSdkVersion 19
minSdkVersion 14
targetSdkVersion 25
}
sourceSets {

View File

@ -0,0 +1,10 @@
package de.duenndns.ssl;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLSession;
public interface DomainHostnameVerifier extends HostnameVerifier {
boolean verify(String domain, String hostname, SSLSession sslSession);
}

View File

@ -28,22 +28,36 @@ package de.duenndns.ssl;
import android.app.Activity;
import android.app.Application;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.Service;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.preference.PreferenceManager;
import android.util.Base64;
import android.util.Log;
import android.util.SparseArray;
import android.os.Handler;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.security.NoSuchAlgorithmException;
import java.security.cert.*;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.text.SimpleDateFormat;
@ -51,8 +65,10 @@ import java.util.Collection;
import java.util.Enumeration;
import java.util.List;
import java.util.Locale;
import java.util.regex.Pattern;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
@ -68,7 +84,15 @@ import javax.net.ssl.X509TrustManager;
* <b>WARNING:</b> This only works if a dedicated thread is used for
* opening sockets!
*/
public class MemorizingTrustManager implements X509TrustManager {
public class MemorizingTrustManager {
private static final Pattern PATTERN_IPV4 = Pattern.compile("\\A(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}\\z");
private static final Pattern PATTERN_IPV6_HEX4DECCOMPRESSED = Pattern.compile("\\A((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?) ::((?:[0-9A-Fa-f]{1,4}:)*)(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}\\z");
private static final Pattern PATTERN_IPV6_6HEX4DEC = Pattern.compile("\\A((?:[0-9A-Fa-f]{1,4}:){6,6})(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}\\z");
private static final Pattern PATTERN_IPV6_HEXCOMPRESSED = Pattern.compile("\\A((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)::((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)\\z");
private static final Pattern PATTERN_IPV6 = Pattern.compile("\\A(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\\z");
final static String DECISION_INTENT = "de.duenndns.ssl.DECISION";
final static String DECISION_INTENT_ID = DECISION_INTENT + ".decisionId";
final static String DECISION_INTENT_CERT = DECISION_INTENT + ".cert";
@ -94,6 +118,7 @@ public class MemorizingTrustManager implements X509TrustManager {
private KeyStore appKeyStore;
private X509TrustManager defaultTrustManager;
private X509TrustManager appTrustManager;
private String poshCacheDir;
/** Creates an instance of the MemorizingTrustManager class that falls back to a custom TrustManager.
*
@ -149,28 +174,11 @@ public class MemorizingTrustManager implements X509TrustManager {
File dir = app.getDir(KEYSTORE_DIR, Context.MODE_PRIVATE);
keyStoreFile = new File(dir + File.separator + KEYSTORE_FILE);
poshCacheDir = app.getFilesDir().getAbsolutePath()+"/posh_cache/";
appKeyStore = loadAppKeyStore();
}
/**
* Returns a X509TrustManager list containing a new instance of
* TrustManagerFactory.
*
* This function is meant for convenience only. You can use it
* as follows to integrate TrustManagerFactory for HTTPS sockets:
*
* <pre>
* SSLContext sc = SSLContext.getInstance("TLS");
* sc.init(null, MemorizingTrustManager.getInstanceList(this),
* new java.security.SecureRandom());
* HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
* </pre>
* @param c Activity or Service to show the Dialog / Notification
*/
public static X509TrustManager[] getInstanceList(Context c) {
return new X509TrustManager[] { new MemorizingTrustManager(c) };
}
/**
* Binds an Activity to the MTM for displaying the query dialog.
@ -284,18 +292,11 @@ public class MemorizingTrustManager implements X509TrustManager {
*
* @throws IllegalArgumentException if the defaultVerifier parameter is null
*/
public HostnameVerifier wrapHostnameVerifier(final HostnameVerifier defaultVerifier) {
public DomainHostnameVerifier wrapHostnameVerifier(final HostnameVerifier defaultVerifier, final boolean interactive) {
if (defaultVerifier == null)
throw new IllegalArgumentException("The default verifier may not be null");
return new MemorizingHostnameVerifier(defaultVerifier);
}
public HostnameVerifier wrapHostnameVerifierNonInteractive(final HostnameVerifier defaultVerifier) {
if (defaultVerifier == null)
throw new IllegalArgumentException("The default verifier may not be null");
return new NonInteractiveMemorizingHostnameVerifier(defaultVerifier);
return new MemorizingHostnameVerifier(defaultVerifier, interactive);
}
X509TrustManager getTrustManager(KeyStore ks) {
@ -389,7 +390,7 @@ public class MemorizingTrustManager implements X509TrustManager {
return false;
}
public void checkCertTrusted(X509Certificate[] chain, String authType, boolean isServer, boolean interactive)
public void checkCertTrusted(X509Certificate[] chain, String authType, String domain, boolean isServer, boolean interactive)
throws CertificateException
{
LOGGER.log(Level.FINE, "checkCertTrusted(" + chain + ", " + authType + ", " + isServer + ")");
@ -419,6 +420,15 @@ public class MemorizingTrustManager implements X509TrustManager {
else
defaultTrustManager.checkClientTrusted(chain, authType);
} catch (CertificateException e) {
boolean trustSystemCAs = !PreferenceManager.getDefaultSharedPreferences(master).getBoolean("dont_trust_system_cas", false);
if (domain != null && isServer && trustSystemCAs && !isIp(domain)) {
String hash = getBase64Hash(chain[0],"SHA-256");
List<String> fingerprints = getPoshFingerprints(domain);
if (hash != null && fingerprints.contains(hash)) {
Log.d("mtm","trusted cert fingerprint of "+domain+" via posh");
return;
}
}
e.printStackTrace();
if (interactive) {
interactCert(chain, authType, e);
@ -429,20 +439,147 @@ public class MemorizingTrustManager implements X509TrustManager {
}
}
public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException
{
checkCertTrusted(chain, authType, false,true);
private List<String> getPoshFingerprints(String domain) {
List<String> cached = getPoshFingerprintsFromCache(domain);
if (cached == null) {
return getPoshFingerprintsFromServer(domain);
} else {
return cached;
}
}
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException
{
checkCertTrusted(chain, authType, true,true);
private List<String> getPoshFingerprintsFromServer(String domain) {
return getPoshFingerprintsFromServer(domain, "https://"+domain+"/.well-known/posh/xmpp-client.json",-1,true);
}
public X509Certificate[] getAcceptedIssuers()
{
private List<String> getPoshFingerprintsFromServer(String domain, String url, int maxTtl, boolean followUrl) {
Log.d("mtm","downloading json for "+domain+" from "+url);
try {
List<String> results = new ArrayList<>();
HttpsURLConnection connection = (HttpsURLConnection) new URL(url).openConnection();
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String inputLine;
StringBuilder builder = new StringBuilder();
while ((inputLine = in.readLine()) != null) {
builder.append(inputLine);
}
JSONObject jsonObject = new JSONObject(builder.toString());
in.close();
int expires = jsonObject.getInt("expires");
if (expires <= 0) {
return new ArrayList<>();
}
if (maxTtl >= 0) {
expires = Math.min(maxTtl,expires);
}
String redirect;
try {
redirect = jsonObject.getString("url");
} catch (JSONException e) {
redirect = null;
}
if (followUrl && redirect != null && redirect.toLowerCase().startsWith("https")) {
return getPoshFingerprintsFromServer(domain, redirect, expires, false);
}
JSONArray fingerprints = jsonObject.getJSONArray("fingerprints");
for(int i = 0; i < fingerprints.length(); i++) {
JSONObject fingerprint = fingerprints.getJSONObject(i);
String sha256 = fingerprint.getString("sha-256");
if (sha256 != null) {
results.add(sha256);
}
}
writeFingerprintsToCache(domain, results,1000L * expires+System.currentTimeMillis());
return results;
} catch (Exception e) {
Log.d("mtm","error fetching posh "+e.getMessage());
return new ArrayList<>();
}
}
private File getPoshCacheFile(String domain) {
return new File(poshCacheDir+domain+".json");
}
private void writeFingerprintsToCache(String domain, List<String> results, long expires) {
File file = getPoshCacheFile(domain);
file.getParentFile().mkdirs();
try {
file.createNewFile();
JSONObject jsonObject = new JSONObject();
jsonObject.put("expires",expires);
jsonObject.put("fingerprints",new JSONArray(results));
FileOutputStream outputStream = new FileOutputStream(file);
outputStream.write(jsonObject.toString().getBytes());
outputStream.flush();
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
private List<String> getPoshFingerprintsFromCache(String domain) {
File file = getPoshCacheFile(domain);
try {
InputStream is = new FileInputStream(file);
BufferedReader buf = new BufferedReader(new InputStreamReader(is));
String line = buf.readLine();
StringBuilder sb = new StringBuilder();
while(line != null){
sb.append(line).append("\n");
line = buf.readLine();
}
JSONObject jsonObject = new JSONObject(sb.toString());
is.close();
long expires = jsonObject.getLong("expires");
long expiresIn = expires - System.currentTimeMillis();
if (expiresIn < 0) {
file.delete();
return null;
} else {
Log.d("mtm","posh fingerprints expire in "+(expiresIn/1000)+"s");
}
List<String> result = new ArrayList<>();
JSONArray jsonArray = jsonObject.getJSONArray("fingerprints");
for(int i = 0; i < jsonArray.length(); ++i) {
result.add(jsonArray.getString(i));
}
return result;
} catch (FileNotFoundException e) {
return null;
} catch (IOException e) {
return null;
} catch (JSONException e) {
file.delete();
return null;
}
}
private static boolean isIp(final String server) {
return server != null && (
PATTERN_IPV4.matcher(server).matches()
|| PATTERN_IPV6.matcher(server).matches()
|| PATTERN_IPV6_6HEX4DEC.matcher(server).matches()
|| PATTERN_IPV6_HEX4DECCOMPRESSED.matcher(server).matches()
|| PATTERN_IPV6_HEXCOMPRESSED.matcher(server).matches());
}
private static String getBase64Hash(X509Certificate certificate, String digest) throws CertificateEncodingException {
MessageDigest md;
try {
md = MessageDigest.getInstance(digest);
} catch (NoSuchAlgorithmException e) {
return null;
}
md.update(certificate.getEncoded());
return Base64.encodeToString(md.digest(),Base64.NO_WRAP);
}
private X509Certificate[] getAcceptedIssuers() {
LOGGER.log(Level.FINE, "getAcceptedIssuers()");
return defaultTrustManager.getAcceptedIssuers();
}
@ -553,22 +690,6 @@ public class MemorizingTrustManager implements X509TrustManager {
certDetails(si, cert);
return si.toString();
}
// We can use Notification.Builder once MTM's minSDK is >= 11
@SuppressWarnings("deprecation")
void startActivityNotification(Intent intent, int decisionId, String certName) {
Notification n = new Notification(android.R.drawable.ic_lock_lock,
master.getString(R.string.mtm_notification),
System.currentTimeMillis());
PendingIntent call = PendingIntent.getActivity(master, 0, intent, 0);
n.setLatestEventInfo(master.getApplicationContext(),
master.getString(R.string.mtm_notification),
certName, call);
n.flags |= Notification.FLAG_AUTO_CANCEL;
notificationManager.notify(NOTIFICATION_ID + decisionId, n);
}
/**
* Returns the top-most entry of the activity stack.
*
@ -598,7 +719,6 @@ public class MemorizingTrustManager implements X509TrustManager {
getUI().startActivity(ni);
} catch (Exception e) {
LOGGER.log(Level.FINE, "startActivity(MemorizingActivity)", e);
startActivityNotification(ni, myId, message);
}
}
});
@ -654,31 +774,41 @@ public class MemorizingTrustManager implements X509TrustManager {
}
}
class MemorizingHostnameVerifier implements HostnameVerifier {
private HostnameVerifier defaultVerifier;
class MemorizingHostnameVerifier implements DomainHostnameVerifier {
private final HostnameVerifier defaultVerifier;
private final boolean interactive;
public MemorizingHostnameVerifier(HostnameVerifier wrapped) {
defaultVerifier = wrapped;
public MemorizingHostnameVerifier(HostnameVerifier wrapped, boolean interactive) {
this.defaultVerifier = wrapped;
this.interactive = interactive;
}
protected boolean verify(String hostname, SSLSession session, boolean interactive) {
LOGGER.log(Level.FINE, "hostname verifier for " + hostname + ", trying default verifier first");
@Override
public boolean verify(String domain, String hostname, SSLSession session) {
LOGGER.log(Level.FINE, "hostname verifier for " + domain + ", trying default verifier first");
// if the default verifier accepts the hostname, we are done
if (defaultVerifier.verify(hostname, session)) {
LOGGER.log(Level.FINE, "default verifier accepted " + hostname);
return true;
if (defaultVerifier instanceof DomainHostnameVerifier) {
if (((DomainHostnameVerifier) defaultVerifier).verify(domain,hostname, session)) {
return true;
}
} else {
if (defaultVerifier.verify(domain, session)) {
return true;
}
}
// otherwise, we check if the hostname is an alias for this cert in our keystore
try {
X509Certificate cert = (X509Certificate)session.getPeerCertificates()[0];
//Log.d(TAG, "cert: " + cert);
if (cert.equals(appKeyStore.getCertificate(hostname.toLowerCase(Locale.US)))) {
LOGGER.log(Level.FINE, "certificate for " + hostname + " is in our keystore. accepting.");
if (cert.equals(appKeyStore.getCertificate(domain.toLowerCase(Locale.US)))) {
LOGGER.log(Level.FINE, "certificate for " + domain + " is in our keystore. accepting.");
return true;
} else {
LOGGER.log(Level.FINE, "server " + hostname + " provided wrong certificate, asking user.");
LOGGER.log(Level.FINE, "server " + domain + " provided wrong certificate, asking user.");
if (interactive) {
return interactHostname(cert, hostname);
return interactHostname(cert, domain);
} else {
return false;
}
@ -688,42 +818,47 @@ public class MemorizingTrustManager implements X509TrustManager {
return false;
}
}
@Override
public boolean verify(String hostname, SSLSession session) {
return verify(hostname, session, true);
}
}
class NonInteractiveMemorizingHostnameVerifier extends MemorizingHostnameVerifier {
public NonInteractiveMemorizingHostnameVerifier(HostnameVerifier wrapped) {
super(wrapped);
}
@Override
public boolean verify(String hostname, SSLSession session) {
return verify(hostname, session, true);
public boolean verify(String domain, SSLSession sslSession) {
return verify(domain,null,sslSession);
}
}
public X509TrustManager getNonInteractive(String domain) {
return new NonInteractiveMemorizingTrustManager(domain);
}
public X509TrustManager getInteractive(String domain) {
return new InteractiveMemorizingTrustManager(domain);
}
public X509TrustManager getNonInteractive() {
return new NonInteractiveMemorizingTrustManager();
return new NonInteractiveMemorizingTrustManager(null);
}
public X509TrustManager getInteractive() {
return new InteractiveMemorizingTrustManager(null);
}
private class NonInteractiveMemorizingTrustManager implements X509TrustManager {
private final String domain;
public NonInteractiveMemorizingTrustManager(String domain) {
this.domain = domain;
}
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
MemorizingTrustManager.this.checkCertTrusted(chain, authType, false, false);
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
MemorizingTrustManager.this.checkCertTrusted(chain, authType, domain, false, false);
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
MemorizingTrustManager.this.checkCertTrusted(chain, authType, true, false);
MemorizingTrustManager.this.checkCertTrusted(chain, authType, domain, true, false);
}
@Override
@ -732,4 +867,28 @@ public class MemorizingTrustManager implements X509TrustManager {
}
}
private class InteractiveMemorizingTrustManager implements X509TrustManager {
private final String domain;
public InteractiveMemorizingTrustManager(String domain) {
this.domain = domain;
}
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
MemorizingTrustManager.this.checkCertTrusted(chain, authType, domain, false, true);
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
MemorizingTrustManager.this.checkCertTrusted(chain, authType, domain, true, true);
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return MemorizingTrustManager.this.getAcceptedIssuers();
}
}
}

View File

@ -1,29 +0,0 @@
#Android specific
bin
gen
obj
lint.xml
local.properties
release.properties
ant.properties
*.class
*.apk
#Gradle
.gradle
build
gradle.properties
#Maven
target
pom.xml.*
#Eclipse
.project
.classpath
.settings
.metadata
#IntelliJ IDEA
.idea
*.iml

View File

@ -1,8 +0,0 @@
[main]
host = https://www.transifex.com
lang_map = af_ZA: af-rZA, am_ET: am-rET, ar_AE: ar-rAE, ar_BH: ar-rBH, ar_DZ: ar-rDZ, ar_EG: ar-rEG, ar_IQ: ar-rIQ, ar_JO: ar-rJO, ar_KW: ar-rKW, ar_LB: ar-rLB, ar_LY: ar-rLY, ar_MA: ar-rMA, ar_OM: ar-rOM, ar_QA: ar-rQA, ar_SA: ar-rSA, ar_SY: ar-rSY, ar_TN: ar-rTN, ar_YE: ar-rYE, arn_CL: arn-rCL, as_IN: as-rIN, az_AZ: az-rAZ, ba_RU: ba-rRU, be_BY: be-rBY, bg_BG: bg-rBG, bn_BD: bn-rBD, bn_IN: bn-rIN, bo_CN: bo-rCN, br_FR: br-rFR, bs_BA: bs-rBA, ca_ES: ca-rES, co_FR: co-rFR, cs_CZ: cs-rCZ, cy_GB: cy-rGB, da_DK: da-rDK, de_AT: de-rAT, de_CH: de-rCH, de_DE: de-rDE, de_LI: de-rLI, de_LU: de-rLU, dsb_DE: dsb-rDE, dv_MV: dv-rMV, el_GR: el-rGR, en_AU: en-rAU, en_BZ: en-rBZ, en_CA: en-rCA, en_GB: en-rGB, en_IE: en-rIE, en_IN: en-rIN, en_JM: en-rJM, en_MY: en-rMY, en_NZ: en-rNZ, en_PH: en-rPH, en_SG: en-rSG, en_TT: en-rTT, en_US: en-rUS, en_ZA: en-rZA, en_ZW: en-rZW, es_AR: es-rAR, es_BO: es-rBO, es_CL: es-rCL, es_CO: es-rCO, es_CR: es-rCR, es_DO: es-rDO, es_EC: es-rEC, es_ES: es-rES, es_GT: es-rGT, es_HN: es-rHN, es_MX: es-rMX, es_NI: es-rNI, es_PA: es-rPA, es_PE: es-rPE, es_PR: es-rPR, es_PY: es-rPY, es_SV: es-rSV, es_US: es-rUS, es_UY: es-rUY, es_VE: es-rVE, et_EE: et-rEE, eu_ES: eu-rES, fa_IR: fa-rIR, fi_FI: fi-rFI, fil_PH: fil-rPH, fo_FO: fo-rFO, fr_BE: fr-rBE, fr_CA: fr-rCA, fr_CH: fr-rCH, fr_FR: fr-rFR, fr_LU: fr-rLU, fr_MC: fr-rMC, fy_NL: fy-rNL, ga_IE: ga-rIE, gd_GB: gd-rGB, gl_ES: gl-rES, gsw_FR: gsw-rFR, gu_IN: gu-rIN, ha_NG: ha-rNG, hi_IN: hi-rIN, hr_BA: hr-rBA, hr_HR: hr-rHR, hsb_DE: hsb-rDE, hu_HU: hu-rHU, hy_AM: hy-rAM, id_ID: id-rID, ig_NG: ig-rNG, ii_CN: ii-rCN, is_IS: is-rIS, it_CH: it-rCH, it_IT: it-rIT, iu_CA: iu-rCA, ja_JP: ja-rJP, ka_GE: ka-rGE, kk_KZ: kk-rKZ, kl_GL: kl-rGL, km_KH: km-rKH, kn_IN: kn-rIN, ko_KR: ko-rKR, kok_IN: kok-rIN, ky_KG: ky-rKG, lb_LU: lb-rLU, lo_LA: lo-rLA, lt_LT: lt-rLT, lv_LV: lv-rLV, mi_NZ: mi-rNZ, mk_MK: mk-rMK, ml_IN: ml-rIN, mn_CN: mn-rCN, mn_MN: mn-rMN, moh_CA: moh-rCA, mr_IN: mr-rIN, ms_BN: ms-rBN, ms_MY: ms-rMY, mt_MT: mt-rMT, nb_NO: nb-rNO, ne_NP: ne-rNP, nl_BE: nl-rBE, nl_NL: nl-rNL, nn_NO: nn-rNO, nso_ZA: nso-rZA, oc_FR: oc-rFR, or_IN: or-rIN, pa_IN: pa-rIN, pl_PL: pl-rPL, prs_AF: prs-rAF, ps_AF: ps-rAF, pt_BR: pt-rBR, pt_PT: pt-rPT, qut_GT: qut-rGT, quz_BO: quz-rBO, quz_EC: quz-rEC, quz_PE: quz-rPE, rm_CH: rm-rCH, ro_RO: ro-rRO, ru_RU: ru-rRU, rw_RW: rw-rRW, sa_IN: sa-rIN, sah_RU: sah-rRU, se_FI: se-rFI, se_NO: se-rNO, se_SE: se-rSE, si_LK: si-rLK, sk_SK: sk-rSK, sl_SI: sl-rSI, sma_NO: sma-rNO, sma_SE: sma-rSE, smj_NO: smj-rNO, smj_SE: smj-rSE, smn_FI: smn-rFI, sms_FI: sms-rFI, sq_AL: sq-rAL, sr_BA: sr-rBA, sr_CS: sr-rCS, sr_ME: sr-rME, sr_RS: sr-rRS, sv_FI: sv-rFI, sv_SE: sv-rSE, sw_KE: sw-rKE, syr_SY: syr-rSY, ta_IN: ta-rIN, te_IN: te-rIN, tg_TJ: tg-rTJ, th_TH: th-rTH, tk_TM: tk-rTM, tn_ZA: tn-rZA, tr_TR: tr-rTR, tt_RU: tt-rRU, tzm_DZ: tzm-rDZ, ug_CN: ug-rCN, uk_UA: uk-rUA, ur_PK: ur-rPK, uz_UZ: uz-rUZ, vi_VN: vi-rVN, wo_SN: wo-rSN, xh_ZA: xh-rZA, yo_NG: yo-rNG, zh_CN: zh-rCN, zh_HK: zh-rHK, zh_MO: zh-rMO, zh_SG: zh-rSG, zh_TW: zh-rTW, zu_ZA: zu-rZA, no_NO: no-rNO, he_IL: iw-rIL, he: iw
[open-keychain.api-strings]
file_filter = res/values-<lang>/strings.xml
source_file = res/values/strings.xml
source_lang = en

View File

@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.openintents.openpgp"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="19" />
<application/>
</manifest>

View File

@ -1,202 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@ -1,21 +0,0 @@
# OpenPGP API library
The OpenPGP API provides methods to execute OpenPGP operations, such as sign, encrypt, decrypt, verify, and more without user interaction from background threads. This is done by connecting your client application to a remote service provided by [OpenKeychain](http://www.openkeychain.org) or other OpenPGP providers.
For usage instructions, please consult our Wiki page about the [OpenPGP API](https://github.com/open-keychain/open-keychain/wiki/OpenPGP-API).
License
=======
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@ -1,35 +0,0 @@
// please leave this here, so this library builds on its own
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
}
}
apply plugin: 'android-library'
android {
compileSdkVersion 19
buildToolsVersion '19.1'
// NOTE: We are using the old folder structure to also support Eclipse
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
}
// Do not abort build if lint finds errors
lintOptions {
abortOnError false
}
}

View File

@ -1,92 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project name="keychain-api-library" default="help">
<!-- The local.properties file is created and updated by the 'android' tool.
It contains the path to the SDK. It should *NOT* be checked into
Version Control Systems. -->
<property file="local.properties" />
<!-- The ant.properties file can be created by you. It is only edited by the
'android' tool to add properties to it.
This is the place to change some Ant specific build properties.
Here are some properties you may want to change/update:
source.dir
The name of the source directory. Default is 'src'.
out.dir
The name of the output directory. Default is 'bin'.
For other overridable properties, look at the beginning of the rules
files in the SDK, at tools/ant/build.xml
Properties related to the SDK location or the project target should
be updated using the 'android' tool with the 'update' action.
This file is an integral part of the build system for your
application and should be checked into Version Control Systems.
-->
<property file="ant.properties" />
<!-- if sdk.dir was not set from one of the property file, then
get it from the ANDROID_HOME env var.
This must be done before we load project.properties since
the proguard config can use sdk.dir -->
<property environment="env" />
<condition property="sdk.dir" value="${env.ANDROID_HOME}">
<isset property="env.ANDROID_HOME" />
</condition>
<!-- The project.properties file is created and updated by the 'android'
tool, as well as ADT.
This contains project specific properties such as project target, and library
dependencies. Lower level build properties are stored in ant.properties
(or in .classpath for Eclipse projects).
This file is an integral part of the build system for your
application and should be checked into Version Control Systems. -->
<loadproperties srcFile="project.properties" />
<!-- quick check on sdk.dir -->
<fail
message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
unless="sdk.dir"
/>
<!--
Import per project custom build rules if present at the root of the project.
This is the place to put custom intermediary targets such as:
-pre-build
-pre-compile
-post-compile (This is typically used for code obfuscation.
Compiled code location: ${out.classes.absolute.dir}
If this is not done in place, override ${out.dex.input.absolute.dir})
-post-package
-post-build
-pre-clean
-->
<import file="custom_rules.xml" optional="true" />
<!-- Import the actual build file.
To customize existing targets, there are two options:
- Customize only one target:
- copy/paste the target into this file, *before* the
<import> task.
- customize it to your needs.
- Customize the whole content of build.xml
- copy/paste the content of the rules files (minus the top node)
into this file, replacing the <import> task.
- customize to your needs.
***********************
****** IMPORTANT ******
***********************
In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
in order to avoid having your file be overridden by tools such as "android update project"
-->
<!-- version-tag: 1 -->
<import file="${sdk.dir}/tools/ant/build.xml" />
</project>

View File

@ -1,20 +0,0 @@
# To enable ProGuard in your project, edit project.properties
# to define the proguard.config property as described in that file.
#
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in ${sdk.dir}/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the ProGuard
# include property in project.properties.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}

View File

@ -1,15 +0,0 @@
# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system edit
# "ant.properties", and override values to adapt the script to your
# project structure.
#
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
# Project target.
target=android-19
android.library=true

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -1,5 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<string name="openpgp_list_preference_none">Žádný</string>
<string name="openpgp_install_openkeychain_via">Instalovat OpenKeychain pomocí %s</string>
</resources>

View File

@ -1,5 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<string name="openpgp_list_preference_none">Keine Auswahl</string>
<string name="openpgp_install_openkeychain_via">Installiere OpenKeychain mit %s</string>
</resources>

View File

@ -1,5 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<string name="openpgp_list_preference_none">Ninguno</string>
<string name="openpgp_install_openkeychain_via">Instalar OpenKeychain mediante %s</string>
</resources>

View File

@ -1,2 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources/>

View File

@ -1,2 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources/>

View File

@ -1,5 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<string name="openpgp_list_preference_none">Aucun</string>
<string name="openpgp_install_openkeychain_via">Installer OpenKeychain par %s</string>
</resources>

View File

@ -1,2 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources/>

View File

@ -1,5 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<string name="openpgp_list_preference_none">Nessuno</string>
<string name="openpgp_install_openkeychain_via">Installa OpenKeychain via %s</string>
</resources>

View File

@ -1,5 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<string name="openpgp_list_preference_none">無し</string>
<string name="openpgp_install_openkeychain_via">%s 経由でOpenKeychainをインストール</string>
</resources>

View File

@ -1,2 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources/>

View File

@ -1,2 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources/>

View File

@ -1,2 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources/>

View File

@ -1,5 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<string name="openpgp_list_preference_none">Нет</string>
<string name="openpgp_install_openkeychain_via">Установить OpenKeychain через %s</string>
</resources>

View File

@ -1,5 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<string name="openpgp_list_preference_none">Brez</string>
<string name="openpgp_install_openkeychain_via">Namesti OpenKeychain prek %s</string>
</resources>

View File

@ -1,2 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources/>

View File

@ -1,5 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<string name="openpgp_list_preference_none">Жоден</string>
<string name="openpgp_install_openkeychain_via">Встановити OpenKeychain через %s</string>
</resources>

View File

@ -1,2 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources/>

View File

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="openpgp_list_preference_none">None</string>
<string name="openpgp_install_openkeychain_via">Install OpenKeychain via %s</string>
</resources>

View File

@ -1,24 +0,0 @@
/*
* Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.openintents.openpgp;
interface IOpenPgpService {
// see OpenPgpApi for documentation
Intent execute(in Intent data, in ParcelFileDescriptor input, in ParcelFileDescriptor output);
}

View File

@ -1,118 +0,0 @@
/*
* Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.openintents.openpgp;
import android.os.Parcel;
import android.os.Parcelable;
/**
* Parcelable versioning has been copied from Dashclock Widget
* https://code.google.com/p/dashclock/source/browse/api/src/main/java/com/google/android/apps/dashclock/api/ExtensionData.java
*/
public class OpenPgpError implements Parcelable {
/**
* Since there might be a case where new versions of the client using the library getting
* old versions of the protocol (and thus old versions of this class), we need a versioning
* system for the parcels sent between the clients and the providers.
*/
public static final int PARCELABLE_VERSION = 1;
// possible values for errorId
public static final int CLIENT_SIDE_ERROR = -1;
public static final int GENERIC_ERROR = 0;
public static final int INCOMPATIBLE_API_VERSIONS = 1;
public static final int NO_OR_WRONG_PASSPHRASE = 2;
public static final int NO_USER_IDS = 3;
int errorId;
String message;
public OpenPgpError() {
}
public OpenPgpError(int errorId, String message) {
this.errorId = errorId;
this.message = message;
}
public OpenPgpError(OpenPgpError b) {
this.errorId = b.errorId;
this.message = b.message;
}
public int getErrorId() {
return errorId;
}
public void setErrorId(int errorId) {
this.errorId = errorId;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel dest, int flags) {
/**
* NOTE: When adding fields in the process of updating this API, make sure to bump
* {@link #PARCELABLE_VERSION}.
*/
dest.writeInt(PARCELABLE_VERSION);
// Inject a placeholder that will store the parcel size from this point on
// (not including the size itself).
int sizePosition = dest.dataPosition();
dest.writeInt(0);
int startPosition = dest.dataPosition();
// version 1
dest.writeInt(errorId);
dest.writeString(message);
// Go back and write the size
int parcelableSize = dest.dataPosition() - startPosition;
dest.setDataPosition(sizePosition);
dest.writeInt(parcelableSize);
dest.setDataPosition(startPosition + parcelableSize);
}
public static final Creator<OpenPgpError> CREATOR = new Creator<OpenPgpError>() {
public OpenPgpError createFromParcel(final Parcel source) {
int parcelableVersion = source.readInt();
int parcelableSize = source.readInt();
int startPosition = source.dataPosition();
OpenPgpError error = new OpenPgpError();
error.errorId = source.readInt();
error.message = source.readString();
// skip over all fields added in future versions of this parcel
source.setDataPosition(startPosition + parcelableSize);
return error;
}
public OpenPgpError[] newArray(final int size) {
return new OpenPgpError[size];
}
};
}

View File

@ -1,132 +0,0 @@
/*
* Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.openintents.openpgp;
import android.os.Parcel;
import android.os.Parcelable;
/**
* Parcelable versioning has been copied from Dashclock Widget
* https://code.google.com/p/dashclock/source/browse/api/src/main/java/com/google/android/apps/dashclock/api/ExtensionData.java
*/
public class OpenPgpMetadata implements Parcelable {
/**
* Since there might be a case where new versions of the client using the library getting
* old versions of the protocol (and thus old versions of this class), we need a versioning
* system for the parcels sent between the clients and the providers.
*/
public static final int PARCELABLE_VERSION = 1;
String filename;
String mimeType;
long modificationTime;
long originalSize;
public String getFilename() {
return filename;
}
public String getMimeType() {
return mimeType;
}
public long getModificationTime() {
return modificationTime;
}
public long getOriginalSize() {
return originalSize;
}
public OpenPgpMetadata() {
}
public OpenPgpMetadata(String filename, String mimeType, long modificationTime,
long originalSize) {
this.filename = filename;
this.mimeType = mimeType;
this.modificationTime = modificationTime;
this.originalSize = originalSize;
}
public OpenPgpMetadata(OpenPgpMetadata b) {
this.filename = b.filename;
this.mimeType = b.mimeType;
this.modificationTime = b.modificationTime;
this.originalSize = b.originalSize;
}
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel dest, int flags) {
/**
* NOTE: When adding fields in the process of updating this API, make sure to bump
* {@link #PARCELABLE_VERSION}.
*/
dest.writeInt(PARCELABLE_VERSION);
// Inject a placeholder that will store the parcel size from this point on
// (not including the size itself).
int sizePosition = dest.dataPosition();
dest.writeInt(0);
int startPosition = dest.dataPosition();
// version 1
dest.writeString(filename);
dest.writeString(mimeType);
dest.writeLong(modificationTime);
dest.writeLong(originalSize);
// Go back and write the size
int parcelableSize = dest.dataPosition() - startPosition;
dest.setDataPosition(sizePosition);
dest.writeInt(parcelableSize);
dest.setDataPosition(startPosition + parcelableSize);
}
public static final Creator<OpenPgpMetadata> CREATOR = new Creator<OpenPgpMetadata>() {
public OpenPgpMetadata createFromParcel(final Parcel source) {
int parcelableVersion = source.readInt();
int parcelableSize = source.readInt();
int startPosition = source.dataPosition();
OpenPgpMetadata vr = new OpenPgpMetadata();
vr.filename = source.readString();
vr.mimeType = source.readString();
vr.modificationTime = source.readLong();
vr.originalSize = source.readLong();
// skip over all fields added in future versions of this parcel
source.setDataPosition(startPosition + parcelableSize);
return vr;
}
public OpenPgpMetadata[] newArray(final int size) {
return new OpenPgpMetadata[size];
}
};
@Override
public String toString() {
String out = "\nfilename: " + filename;
out += "\nmimeType: " + mimeType;
out += "\nmodificationTime: " + modificationTime;
out += "\noriginalSize: " + originalSize;
return out;
}
}

View File

@ -1,183 +0,0 @@
/*
* Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.openintents.openpgp;
import android.os.Parcel;
import android.os.Parcelable;
import org.openintents.openpgp.util.OpenPgpUtils;
import java.util.ArrayList;
import java.util.Locale;
/**
* Parcelable versioning has been copied from Dashclock Widget
* https://code.google.com/p/dashclock/source/browse/api/src/main/java/com/google/android/apps/dashclock/api/ExtensionData.java
*/
public class OpenPgpSignatureResult implements Parcelable {
/**
* Since there might be a case where new versions of the client using the library getting
* old versions of the protocol (and thus old versions of this class), we need a versioning
* system for the parcels sent between the clients and the providers.
*/
public static final int PARCELABLE_VERSION = 2;
// generic error on signature verification
public static final int SIGNATURE_ERROR = 0;
// successfully verified signature, with certified key
public static final int SIGNATURE_SUCCESS_CERTIFIED = 1;
// no key was found for this signature verification
public static final int SIGNATURE_KEY_MISSING = 2;
// successfully verified signature, but with uncertified key
public static final int SIGNATURE_SUCCESS_UNCERTIFIED = 3;
// key has been revoked
public static final int SIGNATURE_KEY_REVOKED = 4;
// key is expired
public static final int SIGNATURE_KEY_EXPIRED = 5;
int status;
boolean signatureOnly;
String primaryUserId;
ArrayList<String> userIds;
long keyId;
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public boolean isSignatureOnly() {
return signatureOnly;
}
public void setSignatureOnly(boolean signatureOnly) {
this.signatureOnly = signatureOnly;
}
public String getPrimaryUserId() {
return primaryUserId;
}
public void setPrimaryUserId(String primaryUserId) {
this.primaryUserId = primaryUserId;
}
public ArrayList<String> getUserIds() {
return userIds;
}
public void setUserIds(ArrayList<String> userIds) {
this.userIds = userIds;
}
public long getKeyId() {
return keyId;
}
public void setKeyId(long keyId) {
this.keyId = keyId;
}
public OpenPgpSignatureResult() {
}
public OpenPgpSignatureResult(int signatureStatus, String signatureUserId,
boolean signatureOnly, long keyId, ArrayList<String> userIds) {
this.status = signatureStatus;
this.signatureOnly = signatureOnly;
this.primaryUserId = signatureUserId;
this.keyId = keyId;
this.userIds = userIds;
}
public OpenPgpSignatureResult(OpenPgpSignatureResult b) {
this.status = b.status;
this.primaryUserId = b.primaryUserId;
this.signatureOnly = b.signatureOnly;
this.keyId = b.keyId;
this.userIds = b.userIds;
}
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel dest, int flags) {
/**
* NOTE: When adding fields in the process of updating this API, make sure to bump
* {@link #PARCELABLE_VERSION}.
*/
dest.writeInt(PARCELABLE_VERSION);
// Inject a placeholder that will store the parcel size from this point on
// (not including the size itself).
int sizePosition = dest.dataPosition();
dest.writeInt(0);
int startPosition = dest.dataPosition();
// version 1
dest.writeInt(status);
dest.writeByte((byte) (signatureOnly ? 1 : 0));
dest.writeString(primaryUserId);
dest.writeLong(keyId);
// version 2
dest.writeStringList(userIds);
// Go back and write the size
int parcelableSize = dest.dataPosition() - startPosition;
dest.setDataPosition(sizePosition);
dest.writeInt(parcelableSize);
dest.setDataPosition(startPosition + parcelableSize);
}
public static final Creator<OpenPgpSignatureResult> CREATOR = new Creator<OpenPgpSignatureResult>() {
public OpenPgpSignatureResult createFromParcel(final Parcel source) {
int parcelableVersion = source.readInt();
int parcelableSize = source.readInt();
int startPosition = source.dataPosition();
OpenPgpSignatureResult vr = new OpenPgpSignatureResult();
vr.status = source.readInt();
vr.signatureOnly = source.readByte() == 1;
vr.primaryUserId = source.readString();
vr.keyId = source.readLong();
vr.userIds = new ArrayList<String>();
source.readStringList(vr.userIds);
// skip over all fields added in future versions of this parcel
source.setDataPosition(startPosition + parcelableSize);
return vr;
}
public OpenPgpSignatureResult[] newArray(final int size) {
return new OpenPgpSignatureResult[size];
}
};
@Override
public String toString() {
String out = "\nstatus: " + status;
out += "\nprimaryUserId: " + primaryUserId;
out += "\nuserIds: " + userIds;
out += "\nsignatureOnly: " + signatureOnly;
out += "\nkeyId: " + OpenPgpUtils.convertKeyIdToHex(keyId);
return out;
}
}

View File

@ -1,306 +0,0 @@
/*
* Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.openintents.openpgp.util;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Build;
import android.os.ParcelFileDescriptor;
import android.util.Log;
import org.openintents.openpgp.IOpenPgpService;
import org.openintents.openpgp.OpenPgpError;
import java.io.InputStream;
import java.io.OutputStream;
public class OpenPgpApi {
public static final String TAG = "OpenPgp API";
public static final String SERVICE_INTENT = "org.openintents.openpgp.IOpenPgpService";
/**
* Version history
* ---------------
* <p/>
* 3:
* - first public stable version
* <p/>
* 4:
* - No changes to existing methods -> backward compatible
* - Introduction of ACTION_DECRYPT_METADATA, RESULT_METADATA, EXTRA_ORIGINAL_FILENAME, and OpenPgpMetadata parcel
* - Introduction of internal NFC extras: EXTRA_NFC_SIGNED_HASH, EXTRA_NFC_SIG_CREATION_TIMESTAMP
* 5:
* - OpenPgpSignatureResult: new consts SIGNATURE_KEY_REVOKED and SIGNATURE_KEY_EXPIRED
* - OpenPgpSignatureResult: ArrayList<String> userIds
*/
public static final int API_VERSION = 5;
/**
* General extras
* --------------
*
* required extras:
* int EXTRA_API_VERSION (always required)
*
* returned extras:
* int RESULT_CODE (RESULT_CODE_ERROR, RESULT_CODE_SUCCESS or RESULT_CODE_USER_INTERACTION_REQUIRED)
* OpenPgpError RESULT_ERROR (if RESULT_CODE == RESULT_CODE_ERROR)
* PendingIntent RESULT_INTENT (if RESULT_CODE == RESULT_CODE_USER_INTERACTION_REQUIRED)
*/
/**
* Sign only
* <p/>
* optional extras:
* boolean EXTRA_REQUEST_ASCII_ARMOR (request ascii armor for output)
* String EXTRA_PASSPHRASE (key passphrase)
*/
public static final String ACTION_SIGN = "org.openintents.openpgp.action.SIGN";
/**
* Encrypt
* <p/>
* required extras:
* String[] EXTRA_USER_IDS (=emails of recipients, if more than one key has a user_id, a PendingIntent is returned via RESULT_INTENT)
* or
* long[] EXTRA_KEY_IDS
* <p/>
* optional extras:
* boolean EXTRA_REQUEST_ASCII_ARMOR (request ascii armor for output)
* String EXTRA_PASSPHRASE (key passphrase)
* String EXTRA_ORIGINAL_FILENAME (original filename to be encrypted as metadata)
*/
public static final String ACTION_ENCRYPT = "org.openintents.openpgp.action.ENCRYPT";
/**
* Sign and encrypt
* <p/>
* required extras:
* String[] EXTRA_USER_IDS (=emails of recipients, if more than one key has a user_id, a PendingIntent is returned via RESULT_INTENT)
* or
* long[] EXTRA_KEY_IDS
* <p/>
* optional extras:
* boolean EXTRA_REQUEST_ASCII_ARMOR (request ascii armor for output)
* String EXTRA_PASSPHRASE (key passphrase)
* String EXTRA_ORIGINAL_FILENAME (original filename to be encrypted as metadata)
*/
public static final String ACTION_SIGN_AND_ENCRYPT = "org.openintents.openpgp.action.SIGN_AND_ENCRYPT";
/**
* Decrypts and verifies given input stream. This methods handles encrypted-only, signed-and-encrypted,
* and also signed-only input.
* <p/>
* If OpenPgpSignatureResult.getStatus() == OpenPgpSignatureResult.SIGNATURE_KEY_MISSING
* in addition a PendingIntent is returned via RESULT_INTENT to download missing keys.
* <p/>
* optional extras:
* boolean EXTRA_REQUEST_ASCII_ARMOR (request ascii armor for output)
* <p/>
* returned extras:
* OpenPgpSignatureResult RESULT_SIGNATURE
* OpenPgpDecryptMetadata RESULT_METADATA
*/
public static final String ACTION_DECRYPT_VERIFY = "org.openintents.openpgp.action.DECRYPT_VERIFY";
/**
* Decrypts the header of an encrypted file to retrieve metadata such as original filename.
* <p/>
* This does not decrypt the actual content of the file.
* <p/>
* returned extras:
* OpenPgpDecryptMetadata RESULT_METADATA
*/
public static final String ACTION_DECRYPT_METADATA = "org.openintents.openpgp.action.DECRYPT_METADATA";
/**
* Get key ids based on given user ids (=emails)
* <p/>
* required extras:
* String[] EXTRA_USER_IDS
* <p/>
* returned extras:
* long[] RESULT_KEY_IDS
*/
public static final String ACTION_GET_KEY_IDS = "org.openintents.openpgp.action.GET_KEY_IDS";
/**
* This action returns RESULT_CODE_SUCCESS if the OpenPGP Provider already has the key
* corresponding to the given key id in its database.
* <p/>
* It returns RESULT_CODE_USER_INTERACTION_REQUIRED if the Provider does not have the key.
* The PendingIntent from RESULT_INTENT can be used to retrieve those from a keyserver.
* <p/>
* required extras:
* long EXTRA_KEY_ID
*/
public static final String ACTION_GET_KEY = "org.openintents.openpgp.action.GET_KEY";
/* Intent extras */
public static final String EXTRA_API_VERSION = "api_version";
public static final String EXTRA_ACCOUNT_NAME = "account_name";
// SIGN, ENCRYPT, SIGN_AND_ENCRYPT, DECRYPT_VERIFY
// request ASCII Armor for output
// OpenPGP Radix-64, 33 percent overhead compared to binary, see http://tools.ietf.org/html/rfc4880#page-53)
public static final String EXTRA_REQUEST_ASCII_ARMOR = "ascii_armor";
// ENCRYPT, SIGN_AND_ENCRYPT
public static final String EXTRA_USER_IDS = "user_ids";
public static final String EXTRA_KEY_IDS = "key_ids";
// optional extras:
public static final String EXTRA_PASSPHRASE = "passphrase";
public static final String EXTRA_ORIGINAL_FILENAME = "original_filename";
// internal NFC states
public static final String EXTRA_NFC_SIGNED_HASH = "nfc_signed_hash";
public static final String EXTRA_NFC_SIG_CREATION_TIMESTAMP = "nfc_sig_creation_timestamp";
public static final String EXTRA_NFC_DECRYPTED_SESSION_KEY = "nfc_decrypted_session_key";
// GET_KEY
public static final String EXTRA_KEY_ID = "key_id";
public static final String RESULT_KEY_IDS = "key_ids";
/* Service Intent returns */
public static final String RESULT_CODE = "result_code";
// get actual error object from RESULT_ERROR
public static final int RESULT_CODE_ERROR = 0;
// success!
public static final int RESULT_CODE_SUCCESS = 1;
// get PendingIntent from RESULT_INTENT, start PendingIntent with startIntentSenderForResult,
// and execute service method again in onActivityResult
public static final int RESULT_CODE_USER_INTERACTION_REQUIRED = 2;
public static final String RESULT_ERROR = "error";
public static final String RESULT_INTENT = "intent";
// DECRYPT_VERIFY
public static final String RESULT_SIGNATURE = "signature";
public static final String RESULT_METADATA = "metadata";
IOpenPgpService mService;
Context mContext;
public OpenPgpApi(Context context, IOpenPgpService service) {
this.mContext = context;
this.mService = service;
}
public interface IOpenPgpCallback {
void onReturn(final Intent result);
}
private class OpenPgpAsyncTask extends AsyncTask<Void, Integer, Intent> {
Intent data;
InputStream is;
OutputStream os;
IOpenPgpCallback callback;
private OpenPgpAsyncTask(Intent data, InputStream is, OutputStream os, IOpenPgpCallback callback) {
this.data = data;
this.is = is;
this.os = os;
this.callback = callback;
}
@Override
protected Intent doInBackground(Void... unused) {
return executeApi(data, is, os);
}
protected void onPostExecute(Intent result) {
callback.onReturn(result);
}
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void executeApiAsync(Intent data, InputStream is, OutputStream os, IOpenPgpCallback callback) {
OpenPgpAsyncTask task = new OpenPgpAsyncTask(data, is, os, callback);
// don't serialize async tasks!
// http://commonsware.com/blog/2012/04/20/asynctask-threading-regression-confirmed.html
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void[]) null);
} else {
task.execute((Void[]) null);
}
}
public Intent executeApi(Intent data, InputStream is, OutputStream os) {
try {
data.putExtra(EXTRA_API_VERSION, OpenPgpApi.API_VERSION);
Intent result;
// pipe the input and output
ParcelFileDescriptor input = null;
if (is != null) {
input = ParcelFileDescriptorUtil.pipeFrom(is,
new ParcelFileDescriptorUtil.IThreadListener() {
@Override
public void onThreadFinished(Thread thread) {
//Log.d(OpenPgpApi.TAG, "Copy to service finished");
}
}
);
}
ParcelFileDescriptor output = null;
if (os != null) {
output = ParcelFileDescriptorUtil.pipeTo(os,
new ParcelFileDescriptorUtil.IThreadListener() {
@Override
public void onThreadFinished(Thread thread) {
//Log.d(OpenPgpApi.TAG, "Service finished writing!");
}
}
);
}
// blocks until result is ready
result = mService.execute(data, input, output);
// close() is required to halt the TransferThread
if (output != null) {
output.close();
}
// TODO: close input?
// set class loader to current context to allow unparcelling
// of OpenPgpError and OpenPgpSignatureResult
// http://stackoverflow.com/a/3806769
result.setExtrasClassLoader(mContext.getClassLoader());
return result;
} catch (Exception e) {
Log.e(OpenPgpApi.TAG, "Exception in executeApi call", e);
Intent result = new Intent();
result.putExtra(RESULT_CODE, RESULT_CODE_ERROR);
result.putExtra(RESULT_ERROR,
new OpenPgpError(OpenPgpError.CLIENT_SIDE_ERROR, e.getMessage()));
return result;
}
}
}

View File

@ -1,257 +0,0 @@
/*
* Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.openintents.openpgp.util;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ResolveInfo;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.preference.DialogPreference;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.TextView;
import org.openintents.openpgp.R;
import java.util.ArrayList;
import java.util.List;
/**
* Does not extend ListPreference, but is very similar to it!
* http://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android/4.4_r1/android/preference/ListPreference.java/?v=source
*/
public class OpenPgpListPreference extends DialogPreference {
private static final String OPENKEYCHAIN_PACKAGE = "org.sufficientlysecure.keychain";
private static final String MARKET_INTENT_URI_BASE = "market://details?id=%s";
private static final Intent MARKET_INTENT = new Intent(Intent.ACTION_VIEW, Uri.parse(
String.format(MARKET_INTENT_URI_BASE, OPENKEYCHAIN_PACKAGE)));
private ArrayList<OpenPgpProviderEntry> mLegacyList = new ArrayList<OpenPgpProviderEntry>();
private ArrayList<OpenPgpProviderEntry> mList = new ArrayList<OpenPgpProviderEntry>();
private String mSelectedPackage;
public OpenPgpListPreference(Context context, AttributeSet attrs) {
super(context, attrs);
}
public OpenPgpListPreference(Context context) {
this(context, null);
}
/**
* Public method to add new entries for legacy applications
*
* @param packageName
* @param simpleName
* @param icon
*/
public void addLegacyProvider(int position, String packageName, String simpleName, Drawable icon) {
mLegacyList.add(position, new OpenPgpProviderEntry(packageName, simpleName, icon));
}
@Override
protected void onPrepareDialogBuilder(Builder builder) {
mList.clear();
// add "none"-entry
mList.add(0, new OpenPgpProviderEntry("",
getContext().getString(R.string.openpgp_list_preference_none),
getContext().getResources().getDrawable(R.drawable.ic_action_cancel_launchersize)));
// add all additional (legacy) providers
mList.addAll(mLegacyList);
// search for OpenPGP providers...
ArrayList<OpenPgpProviderEntry> providerList = new ArrayList<OpenPgpProviderEntry>();
Intent intent = new Intent(OpenPgpApi.SERVICE_INTENT);
List<ResolveInfo> resInfo = getContext().getPackageManager().queryIntentServices(intent, 0);
if (!resInfo.isEmpty()) {
for (ResolveInfo resolveInfo : resInfo) {
if (resolveInfo.serviceInfo == null)
continue;
String packageName = resolveInfo.serviceInfo.packageName;
String simpleName = String.valueOf(resolveInfo.serviceInfo.loadLabel(getContext()
.getPackageManager()));
Drawable icon = resolveInfo.serviceInfo.loadIcon(getContext().getPackageManager());
providerList.add(new OpenPgpProviderEntry(packageName, simpleName, icon));
}
}
if (providerList.isEmpty()) {
// add install links if provider list is empty
resInfo = getContext().getPackageManager().queryIntentActivities
(MARKET_INTENT, 0);
for (ResolveInfo resolveInfo : resInfo) {
Intent marketIntent = new Intent(MARKET_INTENT);
marketIntent.setPackage(resolveInfo.activityInfo.packageName);
Drawable icon = resolveInfo.activityInfo.loadIcon(getContext().getPackageManager());
String marketName = String.valueOf(resolveInfo.activityInfo.applicationInfo
.loadLabel(getContext().getPackageManager()));
String simpleName = String.format(getContext().getString(R.string
.openpgp_install_openkeychain_via), marketName);
mList.add(new OpenPgpProviderEntry(OPENKEYCHAIN_PACKAGE, simpleName,
icon, marketIntent));
}
} else {
// add provider
mList.addAll(providerList);
}
// Init ArrayAdapter with OpenPGP Providers
ListAdapter adapter = new ArrayAdapter<OpenPgpProviderEntry>(getContext(),
android.R.layout.select_dialog_singlechoice, android.R.id.text1, mList) {
public View getView(int position, View convertView, ViewGroup parent) {
// User super class to create the View
View v = super.getView(position, convertView, parent);
TextView tv = (TextView) v.findViewById(android.R.id.text1);
// Put the image on the TextView
tv.setCompoundDrawablesWithIntrinsicBounds(mList.get(position).icon, null,
null, null);
// Add margin between image and text (support various screen densities)
int dp10 = (int) (10 * getContext().getResources().getDisplayMetrics().density + 0.5f);
tv.setCompoundDrawablePadding(dp10);
return v;
}
};
builder.setSingleChoiceItems(adapter, getIndexOfProviderList(getValue()),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
OpenPgpProviderEntry entry = mList.get(which);
if (entry.intent != null) {
/*
* Intents are called as activity
*
* Current approach is to assume the user installed the app.
* If he does not, the selected package is not valid.
*
* However applications should always consider this could happen,
* as the user might remove the currently used OpenPGP app.
*/
getContext().startActivity(entry.intent);
}
mSelectedPackage = entry.packageName;
/*
* Clicking on an item simulates the positive button click, and dismisses
* the dialog.
*/
OpenPgpListPreference.this.onClick(dialog, DialogInterface.BUTTON_POSITIVE);
dialog.dismiss();
}
});
/*
* The typical interaction for list-based dialogs is to have click-on-an-item dismiss the
* dialog instead of the user having to press 'Ok'.
*/
builder.setPositiveButton(null, null);
}
@Override
protected void onDialogClosed(boolean positiveResult) {
super.onDialogClosed(positiveResult);
if (positiveResult && (mSelectedPackage != null)) {
if (callChangeListener(mSelectedPackage)) {
setValue(mSelectedPackage);
}
}
}
private int getIndexOfProviderList(String packageName) {
for (OpenPgpProviderEntry app : mList) {
if (app.packageName.equals(packageName)) {
return mList.indexOf(app);
}
}
return -1;
}
public void setValue(String packageName) {
mSelectedPackage = packageName;
persistString(packageName);
}
public String getValue() {
return mSelectedPackage;
}
public String getEntry() {
return getEntryByValue(mSelectedPackage);
}
@Override
protected Object onGetDefaultValue(TypedArray a, int index) {
return a.getString(index);
}
@Override
protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
setValue(restoreValue ? getPersistedString(mSelectedPackage) : (String) defaultValue);
}
public String getEntryByValue(String packageName) {
for (OpenPgpProviderEntry app : mList) {
if (app.packageName.equals(packageName)) {
return app.simpleName;
}
}
return null;
}
private static class OpenPgpProviderEntry {
private String packageName;
private String simpleName;
private Drawable icon;
private Intent intent;
public OpenPgpProviderEntry(String packageName, String simpleName, Drawable icon) {
this.packageName = packageName;
this.simpleName = simpleName;
this.icon = icon;
}
public OpenPgpProviderEntry(String packageName, String simpleName, Drawable icon, Intent intent) {
this(packageName, simpleName, icon);
this.intent = intent;
}
@Override
public String toString() {
return simpleName;
}
}
}

View File

@ -1,124 +0,0 @@
/*
* Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.openintents.openpgp.util;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import org.openintents.openpgp.IOpenPgpService;
public class OpenPgpServiceConnection {
// callback interface
public interface OnBound {
public void onBound(IOpenPgpService service);
public void onError(Exception e);
}
private Context mApplicationContext;
private IOpenPgpService mService;
private String mProviderPackageName;
private OnBound mOnBoundListener;
/**
* Create new connection
*
* @param context
* @param providerPackageName specify package name of OpenPGP provider,
* e.g., "org.sufficientlysecure.keychain"
*/
public OpenPgpServiceConnection(Context context, String providerPackageName) {
this.mApplicationContext = context.getApplicationContext();
this.mProviderPackageName = providerPackageName;
}
/**
* Create new connection with callback
*
* @param context
* @param providerPackageName specify package name of OpenPGP provider,
* e.g., "org.sufficientlysecure.keychain"
* @param onBoundListener callback, executed when connection to service has been established
*/
public OpenPgpServiceConnection(Context context, String providerPackageName,
OnBound onBoundListener) {
this(context, providerPackageName);
this.mOnBoundListener = onBoundListener;
}
public IOpenPgpService getService() {
return mService;
}
public boolean isBound() {
return (mService != null);
}
private ServiceConnection mServiceConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName name, IBinder service) {
mService = IOpenPgpService.Stub.asInterface(service);
if (mOnBoundListener != null) {
mOnBoundListener.onBound(mService);
}
}
public void onServiceDisconnected(ComponentName name) {
mService = null;
}
};
/**
* If not already bound, bind to service!
*
* @return
*/
public void bindToService() {
// if not already bound...
if (mService == null) {
try {
Intent serviceIntent = new Intent(OpenPgpApi.SERVICE_INTENT);
// NOTE: setPackage is very important to restrict the intent to this provider only!
serviceIntent.setPackage(mProviderPackageName);
boolean connect = mApplicationContext.bindService(serviceIntent, mServiceConnection,
Context.BIND_AUTO_CREATE);
if (!connect) {
throw new Exception("bindService() returned false!");
}
} catch (Exception e) {
if (mOnBoundListener != null) {
mOnBoundListener.onError(e);
}
}
} else {
// already bound, but also inform client about it with callback
if (mOnBoundListener != null) {
mOnBoundListener.onBound(mService);
}
}
}
public void unbindFromService() {
mApplicationContext.unbindService(mServiceConnection);
}
}

View File

@ -1,76 +0,0 @@
/*
* Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.openintents.openpgp.util;
import java.util.List;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ResolveInfo;
public class OpenPgpUtils {
public static final Pattern PGP_MESSAGE = Pattern.compile(
".*?(-----BEGIN PGP MESSAGE-----.*?-----END PGP MESSAGE-----).*",
Pattern.DOTALL);
public static final Pattern PGP_SIGNED_MESSAGE = Pattern.compile(
".*?(-----BEGIN PGP SIGNED MESSAGE-----.*?-----BEGIN PGP SIGNATURE-----.*?-----END PGP SIGNATURE-----).*",
Pattern.DOTALL);
public static final int PARSE_RESULT_NO_PGP = -1;
public static final int PARSE_RESULT_MESSAGE = 0;
public static final int PARSE_RESULT_SIGNED_MESSAGE = 1;
public static int parseMessage(String message) {
Matcher matcherSigned = PGP_SIGNED_MESSAGE.matcher(message);
Matcher matcherMessage = PGP_MESSAGE.matcher(message);
if (matcherMessage.matches()) {
return PARSE_RESULT_MESSAGE;
} else if (matcherSigned.matches()) {
return PARSE_RESULT_SIGNED_MESSAGE;
} else {
return PARSE_RESULT_NO_PGP;
}
}
public static boolean isAvailable(Context context) {
Intent intent = new Intent(OpenPgpApi.SERVICE_INTENT);
List<ResolveInfo> resInfo = context.getPackageManager().queryIntentServices(intent, 0);
if (!resInfo.isEmpty()) {
return true;
} else {
return false;
}
}
public static String convertKeyIdToHex(long keyId) {
return "0x" + convertKeyIdToHex32bit(keyId >> 32) + convertKeyIdToHex32bit(keyId);
}
private static String convertKeyIdToHex32bit(long keyId) {
String hexString = Long.toHexString(keyId & 0xffffffffL).toLowerCase(Locale.ENGLISH);
while (hexString.length() < 8) {
hexString = "0" + hexString;
}
return hexString;
}
}

View File

@ -1,106 +0,0 @@
/*
* Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
* 2013 Florian Schmaus <flo@geekplace.eu>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.openintents.openpgp.util;
import android.os.ParcelFileDescriptor;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* Partially based on <a href="http://stackoverflow.com/questions/18212152/">Stackoverflow: Transfer InputStream to another Service (across process boundaries)</a>
**/
public class ParcelFileDescriptorUtil {
public interface IThreadListener {
void onThreadFinished(final Thread thread);
}
public static ParcelFileDescriptor pipeFrom(InputStream inputStream, IThreadListener listener)
throws IOException {
ParcelFileDescriptor[] pipe = ParcelFileDescriptor.createPipe();
ParcelFileDescriptor readSide = pipe[0];
ParcelFileDescriptor writeSide = pipe[1];
// start the transfer thread
new TransferThread(inputStream, new ParcelFileDescriptor.AutoCloseOutputStream(writeSide),
listener)
.start();
return readSide;
}
public static ParcelFileDescriptor pipeTo(OutputStream outputStream, IThreadListener listener)
throws IOException {
ParcelFileDescriptor[] pipe = ParcelFileDescriptor.createPipe();
ParcelFileDescriptor readSide = pipe[0];
ParcelFileDescriptor writeSide = pipe[1];
// start the transfer thread
new TransferThread(new ParcelFileDescriptor.AutoCloseInputStream(readSide), outputStream,
listener)
.start();
return writeSide;
}
static class TransferThread extends Thread {
final InputStream mIn;
final OutputStream mOut;
final IThreadListener mListener;
TransferThread(InputStream in, OutputStream out, IThreadListener listener) {
super("ParcelFileDescriptor Transfer Thread");
mIn = in;
mOut = out;
mListener = listener;
setDaemon(true);
}
@Override
public void run() {
byte[] buf = new byte[1024];
int len;
try {
while ((len = mIn.read(buf)) > 0) {
mOut.write(buf, 0, len);
}
mOut.flush(); // just to be safe
} catch (IOException e) {
//Log.e(OpenPgpApi.TAG, "TransferThread" + getId() + ": writing failed", e);
} finally {
try {
mIn.close();
} catch (IOException e) {
//Log.e(OpenPgpApi.TAG, "TransferThread" + getId(), e);
}
try {
mOut.close();
} catch (IOException e) {
//Log.e(OpenPgpApi.TAG, "TransferThread" + getId(), e);
}
}
if (mListener != null) {
//Log.d(OpenPgpApi.TAG, "TransferThread " + getId() + " finished!");
mListener.onThreadFinished(this);
}
}
}
}

View File

@ -1,20 +0,0 @@
# To enable ProGuard in your project, edit project.properties
# to define the proguard.config property as described in that file.
#
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in ${sdk.dir}/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the ProGuard
# include property in project.properties.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}

View File

@ -1,27 +0,0 @@
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /home/sam/android-sdk-linux/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the ProGuard
# include property in project.properties.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
-dontwarn javax.naming.**
-keep class * extends java.util.ListResourceBundle {
protected Object[][] getContents();
}
-keepnames class * implements android.os.Parcelable {
public static final ** CREATOR;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1011 KiB

After

Width:  |  Height:  |  Size: 195 KiB

View File

@ -1,4 +1,3 @@
include ':libs:MemorizingTrustManager'
include ':libs:openpgp-api-lib'
rootProject.name = 'Conversations'

View File

@ -0,0 +1,28 @@
package eu.siacs.conversations.services;
import eu.siacs.conversations.entities.Account;
public class PushManagementService {
protected final XmppConnectionService mXmppConnectionService;
public PushManagementService(XmppConnectionService service) {
this.mXmppConnectionService = service;
}
public void registerPushTokenOnServer(Account account) {
//stub implementation. only affects playstore flavor
}
public boolean available(Account account) {
return false;
}
public boolean isStub() {
return true;
}
public boolean availableAndUseful(Account account) {
return false;
}
}

View File

@ -1,8 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest
package="eu.siacs.conversations"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="eu.siacs.conversations">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
@ -14,22 +13,34 @@
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.NFC" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission
android:name="android.permission.READ_PHONE_STATE"
tools:node="remove" />
<uses-sdk tools:overrideLibrary="net.ypresto.androidtranscoder" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" tools:node="remove" />
<application
android:networkSecurityConfig="@xml/network_security_configuration"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/ConversationsTheme"
tools:replace="android:label" >
tools:replace="android:label">
<meta-data android:name="com.google.android.gms.car.application"
android:resource="@xml/automotive_app_desc" />
<service android:name=".services.XmppConnectionService" />
<receiver android:name=".services.EventReceiver" >
<receiver android:name=".services.EventReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.intent.action.ACTION_SHUTDOWN" />
<action android:name="android.media.RINGER_MODE_CHANGED" />
</intent-filter>
</receiver>
@ -37,7 +48,9 @@
android:name=".ui.ConversationActivity"
android:label="@string/app_name"
android:launchMode="singleTask"
android:windowSoftInputMode="stateHidden" >
android:minWidth="300dp"
android:minHeight="300dp"
android:windowSoftInputMode="stateHidden">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@ -46,8 +59,8 @@
</activity>
<activity
android:name=".ui.StartConversationActivity"
android:configChanges="orientation|screenSize"
android:label="@string/title_activity_start_conversation" >
android:label="@string/title_activity_start_conversation"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.SENDTO" />
@ -71,7 +84,33 @@
<data android:scheme="xmpp" />
</intent-filter>
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https" />
<data android:host="conversations.im" />
<data android:pathPrefix="/i/" />
<data android:pathPrefix="/j/" />
</intent-filter>
</activity>
<activity
android:name=".ui.WelcomeActivity"
android:label="@string/app_name"
android:launchMode="singleTask"/>
<activity
android:name=".ui.MagicCreateActivity"
android:label="@string/create_account"
android:launchMode="singleTask"/>
<activity
android:name=".ui.SetPresenceActivity"
android:configChanges="orientation|screenSize"
android:label="@string/change_presence"
android:launchMode="singleTask"
android:windowSoftInputMode="stateHidden|adjustResize" />
<activity
android:name=".ui.SettingsActivity"
android:label="@string/title_activity_settings" />
@ -81,15 +120,16 @@
<activity
android:name=".ui.BlocklistActivity"
android:label="@string/title_activity_block_list" />
<activity
android:name=".ui.ChangePasswordActivity"
android:label="@string/change_password_on_server" />
<activity
android:name=".ui.ChangePasswordActivity"
android:label="@string/change_password_on_server" />
<activity
android:name=".ui.ManageAccountActivity"
android:configChanges="orientation|screenSize"
android:label="@string/title_activity_manage_accounts" />
android:label="@string/title_activity_manage_accounts"
android:launchMode="singleTask" />
<activity
android:name=".ui.EditAccountActivity"
android:launchMode="singleTask"
android:windowSoftInputMode="stateHidden|adjustResize" />
<activity
android:name=".ui.ConferenceDetailsActivity"
@ -109,7 +149,7 @@
android:windowSoftInputMode="stateHidden" />
<activity
android:name=".ui.ShareWithActivity"
android:label="@string/app_name" >
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.SEND" />
@ -131,23 +171,54 @@
<data android:mimeType="image/*" />
</intent-filter>
<meta-data
android:name="android.service.chooser.chooser_target_service"
android:value=".services.ContactChooserTargetService" />
</activity>
<activity
android:name=".ui.TrustKeysActivity"
android:label="@string/trust_omemo_fingerprints"
android:windowSoftInputMode="stateAlwaysHidden"/>
android:windowSoftInputMode="stateAlwaysHidden" />
<activity
android:name="de.duenndns.ssl.MemorizingActivity"
android:theme="@style/ConversationsTheme"
tools:replace="android:theme"/>
tools:replace="android:theme" />
<activity
android:name=".ui.AboutActivity"
android:label="@string/title_activity_about"
android:parentActivityName=".ui.SettingsActivity" >
android:parentActivityName=".ui.SettingsActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="eu.siacs.conversations.ui.SettingsActivity" />
</activity>
<activity android:name="com.soundcloud.android.crop.CropImageActivity" />
<service android:name=".services.ExportLogsService" />
<service
android:name=".services.ContactChooserTargetService"
android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE">
<intent-filter>
<action android:name="android.service.chooser.ChooserTargetService" />
</intent-filter>
</service>
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.files"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
<provider
android:authorities="${applicationId}.barcodes"
android:name=".services.BarcodeProvider"
android:exported="false"
android:grantUriPermissions="true"/>
</application>
</manifest>

View File

@ -6,19 +6,59 @@ import eu.siacs.conversations.xmpp.chatstate.ChatState;
public final class Config {
private static final int UNENCRYPTED = 1;
private static final int OPENPGP = 2;
private static final int OTR = 4;
private static final int OMEMO = 8;
private static final int ENCRYPTION_MASK = UNENCRYPTED | OPENPGP | OTR | OMEMO;
public static boolean supportUnencrypted() {
return (ENCRYPTION_MASK & UNENCRYPTED) != 0;
}
public static boolean supportOpenPgp() {
return (ENCRYPTION_MASK & OPENPGP) != 0;
}
public static boolean supportOtr() {
return (ENCRYPTION_MASK & OTR) != 0;
}
public static boolean supportOmemo() {
return (ENCRYPTION_MASK & OMEMO) != 0;
}
public static boolean multipleEncryptionChoices() {
return (ENCRYPTION_MASK & (ENCRYPTION_MASK - 1)) != 0;
}
public static final String LOGTAG = "conversations";
public static final String BUG_REPORTS = "bugs@conversations.im";
public static final String DOMAIN_LOCK = null; //only allow account creation for this domain
public static final String MAGIC_CREATE_DOMAIN = "conversations.im";
public static final boolean DISALLOW_REGISTRATION_IN_UI = false; //hide the register checkbox
public static final boolean HIDE_PGP_IN_UI = false; //some more consumer focused clients might want to disable OpenPGP
public static final boolean ALLOW_NON_TLS_CONNECTIONS = false; //very dangerous. you should have a good reason to set this to true
public static final boolean FORCE_ORBOT = false; // always use TOR
public static final boolean HIDE_MESSAGE_TEXT_IN_NOTIFICATION = false;
public static final boolean SHOW_CONNECTED_ACCOUNTS = false; //show number of connected accounts in foreground notification
public static final boolean SHOW_DISABLE_FOREGROUND = false; //if set to true the foreground notification has a button to disable it
public static final boolean ALWAYS_NOTIFY_BY_DEFAULT = false;
public static final int PING_MAX_INTERVAL = 300;
public static final int IDLE_PING_INTERVAL = 600; //540 is minimum according to docs;
public static final int PING_MIN_INTERVAL = 30;
public static final int PING_TIMEOUT = 10;
public static final int LOW_PING_TIMEOUT = 1; // used after push received
public static final int PING_TIMEOUT = 15;
public static final int SOCKET_TIMEOUT = 15;
public static final int CONNECT_TIMEOUT = 90;
public static final int CARBON_GRACE_PERIOD = 60;
public static final int CONNECT_DISCO_TIMEOUT = 20;
public static final int MINI_GRACE_PERIOD = 750;
public static final int AVATAR_SIZE = 192;
@ -27,6 +67,7 @@ public final class Config {
public static final int IMAGE_SIZE = 1920;
public static final Bitmap.CompressFormat IMAGE_FORMAT = Bitmap.CompressFormat.JPEG;
public static final int IMAGE_QUALITY = 75;
public static final int IMAGE_MAX_SIZE = 524288; //512KiB
public static final int MESSAGE_MERGE_WINDOW = 20;
@ -35,24 +76,45 @@ public final class Config {
public static final int REFRESH_UI_INTERVAL = 500;
public static final boolean NO_PROXY_LOOKUP = false; //useful to debug ibb
public static final int MAX_DISPLAY_MESSAGE_CHARS = 4096;
public static final int MAX_STORAGE_MESSAGE_CHARS = 1024 * 1024 * 1024;
public static final long MILLISECONDS_IN_DAY = 24 * 60 * 60 * 1000;
public static final long OMEMO_AUTO_EXPIRY = 7 * MILLISECONDS_IN_DAY;
public static final boolean REMOVE_BROKEN_DEVICES = false;
public static final boolean OMEMO_PADDING = false;
public static boolean PUT_AUTH_TAG_INTO_KEY = true;
public static final boolean DISABLE_PROXY_LOOKUP = false; //useful to debug ibb
public static final boolean DISABLE_HTTP_UPLOAD = false;
public static final boolean DISABLE_STRING_PREP = false; // setting to true might increase startup performance
public static final boolean EXTENDED_SM_LOGGING = true; // log stanza counts
public static final boolean EXTENDED_SM_LOGGING = false; // log stanza counts
public static final boolean BACKGROUND_STANZA_LOGGING = false; //log all stanzas that were received while the app is in background
public static final boolean RESET_ATTEMPT_COUNT_ON_NETWORK_CHANGE = true; //setting to true might increase power consumption
public static final boolean ENCRYPT_ON_HTTP_UPLOADED = false;
public static final boolean REPORT_WRONG_FILESIZE_IN_OTR_JINGLE = true;
public static final boolean X509_VERIFICATION = false; //use x509 certificates to verify OMEMO keys
public static final boolean SHOW_REGENERATE_AXOLOTL_KEYS_BUTTON = false;
public static final boolean ONLY_INTERNAL_STORAGE = false; //use internal storage instead of sdcard to save attachments
public static final long MILLISECONDS_IN_DAY = 24 * 60 * 60 * 1000;
public static final long MAM_MAX_CATCHUP = MILLISECONDS_IN_DAY / 2;
public static final int MAM_MAX_MESSAGES = 500;
public static final boolean IGNORE_ID_REWRITE_IN_MUC = true;
public static final boolean PARSE_REAL_JID_FROM_MUC_MAM = false; //dangerous if server doesnt filter
public static final long MAM_MAX_CATCHUP = MILLISECONDS_IN_DAY * 5;
public static final int MAM_MAX_MESSAGES = 750;
public static final long FREQUENT_RESTARTS_DETECTION_WINDOW = 12 * 60 * 60 * 1000; // 10 hours
public static final long FREQUENT_RESTARTS_THRESHOLD = 0; // previous value was 16;
public static final ChatState DEFAULT_CHATSTATE = ChatState.ACTIVE;
public static final int TYPING_TIMEOUT = 8;
public static final int EXPIRY_INTERVAL = 30 * 60 * 1000; // 30 minutes
public static final String ENABLED_CIPHERS[] = {
"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA384",
@ -91,6 +153,5 @@ public final class Config {
};
private Config() {
}
}

View File

@ -29,6 +29,7 @@ import java.security.spec.InvalidKeySpecException;
import eu.siacs.conversations.Config;
import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.entities.Conversation;
import eu.siacs.conversations.generator.MessageGenerator;
import eu.siacs.conversations.services.XmppConnectionService;
import eu.siacs.conversations.xmpp.chatstate.ChatState;
import eu.siacs.conversations.xmpp.jid.InvalidJidException;
@ -52,28 +53,30 @@ public class OtrService extends OtrCryptoEngineImpl implements OtrEngineHost {
this.mXmppConnectionService = service;
}
private KeyPair loadKey(JSONObject keys) {
private KeyPair loadKey(final JSONObject keys) {
if (keys == null) {
return null;
}
try {
BigInteger x = new BigInteger(keys.getString("otr_x"), 16);
BigInteger y = new BigInteger(keys.getString("otr_y"), 16);
BigInteger p = new BigInteger(keys.getString("otr_p"), 16);
BigInteger q = new BigInteger(keys.getString("otr_q"), 16);
BigInteger g = new BigInteger(keys.getString("otr_g"), 16);
KeyFactory keyFactory = KeyFactory.getInstance("DSA");
DSAPublicKeySpec pubKeySpec = new DSAPublicKeySpec(y, p, q, g);
DSAPrivateKeySpec privateKeySpec = new DSAPrivateKeySpec(x, p, q, g);
PublicKey publicKey = keyFactory.generatePublic(pubKeySpec);
PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);
return new KeyPair(publicKey, privateKey);
} catch (JSONException e) {
return null;
} catch (NoSuchAlgorithmException e) {
return null;
} catch (InvalidKeySpecException e) {
return null;
synchronized (keys) {
try {
BigInteger x = new BigInteger(keys.getString("otr_x"), 16);
BigInteger y = new BigInteger(keys.getString("otr_y"), 16);
BigInteger p = new BigInteger(keys.getString("otr_p"), 16);
BigInteger q = new BigInteger(keys.getString("otr_q"), 16);
BigInteger g = new BigInteger(keys.getString("otr_g"), 16);
KeyFactory keyFactory = KeyFactory.getInstance("DSA");
DSAPublicKeySpec pubKeySpec = new DSAPublicKeySpec(y, p, q, g);
DSAPrivateKeySpec privateKeySpec = new DSAPrivateKeySpec(x, p, q, g);
PublicKey publicKey = keyFactory.generatePublic(pubKeySpec);
PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);
return new KeyPair(publicKey, privateKey);
} catch (JSONException e) {
return null;
} catch (NoSuchAlgorithmException e) {
return null;
} catch (InvalidKeySpecException e) {
return null;
}
}
}
@ -121,7 +124,7 @@ public class OtrService extends OtrCryptoEngineImpl implements OtrEngineHost {
@Override
public String getFallbackMessage(SessionID arg0) {
return "I would like to start a private (OTR encrypted) conversation but your client doesnt seem to support that";
return MessageGenerator.OTR_FALLBACK_MESSAGE;
}
@Override
@ -179,10 +182,7 @@ public class OtrService extends OtrCryptoEngineImpl implements OtrEngineHost {
packet.setAttribute("to", session.getAccountID() + "/" + session.getUserID());
}
packet.setBody(body);
packet.addChild("private", "urn:xmpp:carbons:2");
packet.addChild("no-copy", "urn:xmpp:hints");
packet.addChild("no-permanent-store", "urn:xmpp:hints");
packet.addChild("no-permanent-storage", "urn:xmpp:hints");
MessageGenerator.addMessageHints(packet);
try {
Jid jid = Jid.fromSessionID(session);
Conversation conversation = mXmppConnectionService.find(account,jid);
@ -194,8 +194,9 @@ public class OtrService extends OtrCryptoEngineImpl implements OtrEngineHost {
} catch (final InvalidJidException ignored) {
}
packet.setType(MessagePacket.TYPE_CHAT);
packet.addChild("encryption","urn:xmpp:eme:0")
.setAttribute("namespace","urn:xmpp:otr:0");
account.getXmppConnection().sendMessagePacket(packet);
}

View File

@ -0,0 +1,240 @@
package eu.siacs.conversations.crypto;
import android.app.PendingIntent;
import android.content.Intent;
import org.openintents.openpgp.util.OpenPgpApi;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.util.ArrayDeque;
import java.util.HashSet;
import java.util.List;
import eu.siacs.conversations.entities.Conversation;
import eu.siacs.conversations.entities.DownloadableFile;
import eu.siacs.conversations.entities.Message;
import eu.siacs.conversations.http.HttpConnectionManager;
import eu.siacs.conversations.services.XmppConnectionService;
public class PgpDecryptionService {
private final XmppConnectionService mXmppConnectionService;
private OpenPgpApi openPgpApi = null;
protected final ArrayDeque<Message> messages = new ArrayDeque();
protected final HashSet<Message> pendingNotifications = new HashSet<>();
Message currentMessage;
private PendingIntent pendingIntent;
public PgpDecryptionService(XmppConnectionService service) {
this.mXmppConnectionService = service;
}
public synchronized boolean decrypt(final Message message, boolean notify) {
messages.add(message);
if (notify && pendingIntent == null) {
pendingNotifications.add(message);
continueDecryption();
return false;
} else {
continueDecryption();
return notify;
}
}
public synchronized void decrypt(final List<Message> list) {
for(Message message : list) {
if (message.getEncryption() == Message.ENCRYPTION_PGP) {
messages.add(message);
}
}
continueDecryption();
}
public synchronized void discard(List<Message> discards) {
this.messages.removeAll(discards);
this.pendingNotifications.removeAll(discards);
}
public synchronized void discard(Message message) {
this.messages.remove(message);
this.pendingNotifications.remove(message);
}
public void giveUpCurrentDecryption(){
Message message;
synchronized (this) {
if(currentMessage != null) {
return;
}
message = messages.peekFirst();
if (message == null) {
return;
}
discard(message);
}
synchronized (message){
if (message.getEncryption() == Message.ENCRYPTION_PGP) {
message.setEncryption(Message.ENCRYPTION_DECRYPTION_FAILED);
}
}
mXmppConnectionService.updateMessage(message);
continueDecryption(true);
}
protected synchronized void decryptNext() {
if (pendingIntent == null
&& getOpenPgpApi() != null
&& (currentMessage = messages.poll()) != null) {
new Thread(new Runnable() {
@Override
public void run() {
executeApi(currentMessage);
decryptNext();
}
}).start();
}
}
public synchronized void continueDecryption(boolean resetPending) {
if (resetPending) {
this.pendingIntent = null;
}
continueDecryption();
}
public synchronized void continueDecryption() {
if (currentMessage == null) {
decryptNext();
}
}
private synchronized OpenPgpApi getOpenPgpApi() {
if (openPgpApi == null) {
this.openPgpApi = mXmppConnectionService.getOpenPgpApi();
}
return this.openPgpApi;
}
private void executeApi(Message message) {
synchronized (message) {
Intent params = new Intent();
params.setAction(OpenPgpApi.ACTION_DECRYPT_VERIFY);
if (message.getType() == Message.TYPE_TEXT) {
InputStream is = new ByteArrayInputStream(message.getBody().getBytes());
final OutputStream os = new ByteArrayOutputStream();
Intent result = getOpenPgpApi().executeApi(params, is, os);
switch (result.getIntExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_ERROR)) {
case OpenPgpApi.RESULT_CODE_SUCCESS:
try {
os.flush();
final String body = os.toString();
if (body == null) {
throw new IOException("body was null");
}
message.setBody(body);
message.setEncryption(Message.ENCRYPTION_DECRYPTED);
final HttpConnectionManager manager = mXmppConnectionService.getHttpConnectionManager();
if (message.trusted()
&& message.treatAsDownloadable()
&& manager.getAutoAcceptFileSize() > 0) {
manager.createNewDownloadConnection(message);
}
} catch (IOException e) {
message.setEncryption(Message.ENCRYPTION_DECRYPTION_FAILED);
}
mXmppConnectionService.updateMessage(message);
break;
case OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED:
synchronized (PgpDecryptionService.this) {
PendingIntent pendingIntent = result.getParcelableExtra(OpenPgpApi.RESULT_INTENT);
messages.addFirst(message);
currentMessage = null;
storePendingIntent(pendingIntent);
}
break;
case OpenPgpApi.RESULT_CODE_ERROR:
message.setEncryption(Message.ENCRYPTION_DECRYPTION_FAILED);
mXmppConnectionService.updateMessage(message);
break;
}
} else if (message.getType() == Message.TYPE_IMAGE || message.getType() == Message.TYPE_FILE) {
try {
final DownloadableFile inputFile = mXmppConnectionService.getFileBackend().getFile(message, false);
final DownloadableFile outputFile = mXmppConnectionService.getFileBackend().getFile(message, true);
outputFile.getParentFile().mkdirs();
outputFile.createNewFile();
InputStream is = new FileInputStream(inputFile);
OutputStream os = new FileOutputStream(outputFile);
Intent result = getOpenPgpApi().executeApi(params, is, os);
switch (result.getIntExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_ERROR)) {
case OpenPgpApi.RESULT_CODE_SUCCESS:
URL url = message.getFileParams().url;
mXmppConnectionService.getFileBackend().updateFileParams(message, url);
message.setEncryption(Message.ENCRYPTION_DECRYPTED);
inputFile.delete();
mXmppConnectionService.getFileBackend().updateMediaScanner(outputFile);
mXmppConnectionService.updateMessage(message);
break;
case OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED:
synchronized (PgpDecryptionService.this) {
PendingIntent pendingIntent = result.getParcelableExtra(OpenPgpApi.RESULT_INTENT);
messages.addFirst(message);
currentMessage = null;
storePendingIntent(pendingIntent);
}
break;
case OpenPgpApi.RESULT_CODE_ERROR:
message.setEncryption(Message.ENCRYPTION_DECRYPTION_FAILED);
mXmppConnectionService.updateMessage(message);
break;
}
} catch (final IOException e) {
message.setEncryption(Message.ENCRYPTION_DECRYPTION_FAILED);
mXmppConnectionService.updateMessage(message);
}
}
}
notifyIfPending(message);
}
private synchronized void notifyIfPending(Message message) {
if (pendingNotifications.remove(message)) {
mXmppConnectionService.getNotificationService().push(message);
}
}
private void storePendingIntent(PendingIntent pendingIntent) {
this.pendingIntent = pendingIntent;
mXmppConnectionService.updateConversationUi();
}
public synchronized boolean hasPendingIntent(Conversation conversation) {
if (pendingIntent == null) {
return false;
} else {
for(Message message : messages) {
if (message.getConversation() == conversation) {
return true;
}
}
return false;
}
}
public PendingIntent getPendingIntent() {
return pendingIntent;
}
public boolean isConnected() {
return getOpenPgpApi() != null;
}
}

View File

@ -2,8 +2,9 @@ package eu.siacs.conversations.crypto;
import android.app.PendingIntent;
import android.content.Intent;
import android.net.Uri;
import android.util.Log;
import org.openintents.openpgp.OpenPgpError;
import org.openintents.openpgp.OpenPgpSignatureResult;
import org.openintents.openpgp.util.OpenPgpApi;
import org.openintents.openpgp.util.OpenPgpApi.IOpenPgpCallback;
@ -15,15 +16,15 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import eu.siacs.conversations.Config;
import eu.siacs.conversations.R;
import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.entities.Contact;
import eu.siacs.conversations.entities.Conversation;
import eu.siacs.conversations.entities.DownloadableFile;
import eu.siacs.conversations.entities.Message;
import eu.siacs.conversations.http.HttpConnectionManager;
import eu.siacs.conversations.persistance.FileBackend;
import eu.siacs.conversations.services.XmppConnectionService;
import eu.siacs.conversations.ui.UiCallback;
@ -36,113 +37,19 @@ public class PgpEngine {
this.mXmppConnectionService = service;
}
public void decrypt(final Message message,
final UiCallback<Message> callback) {
Intent params = new Intent();
params.setAction(OpenPgpApi.ACTION_DECRYPT_VERIFY);
params.putExtra(OpenPgpApi.EXTRA_ACCOUNT_NAME, message
.getConversation().getAccount().getJid().toBareJid().toString());
if (message.getType() == Message.TYPE_TEXT) {
InputStream is = new ByteArrayInputStream(message.getBody()
.getBytes());
final OutputStream os = new ByteArrayOutputStream();
api.executeApiAsync(params, is, os, new IOpenPgpCallback() {
@Override
public void onReturn(Intent result) {
switch (result.getIntExtra(OpenPgpApi.RESULT_CODE,
OpenPgpApi.RESULT_CODE_ERROR)) {
case OpenPgpApi.RESULT_CODE_SUCCESS:
try {
os.flush();
if (message.getEncryption() == Message.ENCRYPTION_PGP) {
message.setBody(os.toString());
message.setEncryption(Message.ENCRYPTION_DECRYPTED);
final HttpConnectionManager manager = mXmppConnectionService.getHttpConnectionManager();
if (message.trusted()
&& message.treatAsDownloadable() != Message.Decision.NEVER
&& manager.getAutoAcceptFileSize() > 0) {
manager.createNewDownloadConnection(message);
}
callback.success(message);
}
} catch (IOException e) {
callback.error(R.string.openpgp_error, message);
return;
}
return;
case OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED:
callback.userInputRequried((PendingIntent) result
.getParcelableExtra(OpenPgpApi.RESULT_INTENT),
message);
return;
case OpenPgpApi.RESULT_CODE_ERROR:
callback.error(R.string.openpgp_error, message);
}
}
});
} else if (message.getType() == Message.TYPE_IMAGE || message.getType() == Message.TYPE_FILE) {
try {
final DownloadableFile inputFile = this.mXmppConnectionService
.getFileBackend().getFile(message, false);
final DownloadableFile outputFile = this.mXmppConnectionService
.getFileBackend().getFile(message, true);
outputFile.getParentFile().mkdirs();
outputFile.createNewFile();
InputStream is = new FileInputStream(inputFile);
OutputStream os = new FileOutputStream(outputFile);
api.executeApiAsync(params, is, os, new IOpenPgpCallback() {
@Override
public void onReturn(Intent result) {
switch (result.getIntExtra(OpenPgpApi.RESULT_CODE,
OpenPgpApi.RESULT_CODE_ERROR)) {
case OpenPgpApi.RESULT_CODE_SUCCESS:
URL url = message.getFileParams().url;
mXmppConnectionService.getFileBackend().updateFileParams(message,url);
message.setEncryption(Message.ENCRYPTION_DECRYPTED);
PgpEngine.this.mXmppConnectionService
.updateMessage(message);
inputFile.delete();
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
intent.setData(Uri.fromFile(outputFile));
mXmppConnectionService.sendBroadcast(intent);
callback.success(message);
return;
case OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED:
callback.userInputRequried(
(PendingIntent) result
.getParcelableExtra(OpenPgpApi.RESULT_INTENT),
message);
return;
case OpenPgpApi.RESULT_CODE_ERROR:
callback.error(R.string.openpgp_error, message);
}
}
});
} catch (final IOException e) {
callback.error(R.string.error_decrypting_file, message);
}
}
}
public void encrypt(final Message message,
final UiCallback<Message> callback) {
public void encrypt(final Message message, final UiCallback<Message> callback) {
Intent params = new Intent();
params.setAction(OpenPgpApi.ACTION_ENCRYPT);
if (message.getConversation().getMode() == Conversation.MODE_SINGLE) {
long[] keys = { message.getConversation().getContact()
.getPgpKeyId() };
final Conversation conversation = message.getConversation();
if (conversation.getMode() == Conversation.MODE_SINGLE) {
long[] keys = {
conversation.getContact().getPgpKeyId(),
conversation.getAccount().getPgpId()
};
params.putExtra(OpenPgpApi.EXTRA_KEY_IDS, keys);
} else {
params.putExtra(OpenPgpApi.EXTRA_KEY_IDS, message.getConversation()
.getMucOptions().getPgpKeyIds());
params.putExtra(OpenPgpApi.EXTRA_KEY_IDS, conversation.getMucOptions().getPgpKeyIds());
}
params.putExtra(OpenPgpApi.EXTRA_ACCOUNT_NAME, message
.getConversation().getAccount().getJid().toBareJid().toString());
if (!message.needsUploading()) {
params.putExtra(OpenPgpApi.EXTRA_REQUEST_ASCII_ARMOR, true);
@ -184,6 +91,7 @@ public class PgpEngine {
message);
break;
case OpenPgpApi.RESULT_CODE_ERROR:
logError(conversation.getAccount(), (OpenPgpError) result.getParcelableExtra(OpenPgpApi.RESULT_ERROR));
callback.error(R.string.openpgp_error, message);
break;
}
@ -197,8 +105,8 @@ public class PgpEngine {
.getFileBackend().getFile(message, false);
outputFile.getParentFile().mkdirs();
outputFile.createNewFile();
InputStream is = new FileInputStream(inputFile);
OutputStream os = new FileOutputStream(outputFile);
final InputStream is = new FileInputStream(inputFile);
final OutputStream os = new FileOutputStream(outputFile);
api.executeApiAsync(params, is, os, new IOpenPgpCallback() {
@Override
@ -206,6 +114,12 @@ public class PgpEngine {
switch (result.getIntExtra(OpenPgpApi.RESULT_CODE,
OpenPgpApi.RESULT_CODE_ERROR)) {
case OpenPgpApi.RESULT_CODE_SUCCESS:
try {
os.flush();
} catch (IOException ignored) {
//ignored
}
FileBackend.close(os);
callback.success(message);
break;
case OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED:
@ -215,6 +129,7 @@ public class PgpEngine {
message);
break;
case OpenPgpApi.RESULT_CODE_ERROR:
logError(conversation.getAccount(), (OpenPgpError) result.getParcelableExtra(OpenPgpApi.RESULT_ERROR));
callback.error(R.string.openpgp_error, message);
break;
}
@ -248,7 +163,6 @@ public class PgpEngine {
Intent params = new Intent();
params.setAction(OpenPgpApi.ACTION_DECRYPT_VERIFY);
params.putExtra(OpenPgpApi.EXTRA_REQUEST_ASCII_ARMOR, true);
params.putExtra(OpenPgpApi.EXTRA_ACCOUNT_NAME, account.getJid().toBareJid().toString());
InputStream is = new ByteArrayInputStream(pgpSig.toString().getBytes());
ByteArrayOutputStream os = new ByteArrayOutputStream();
Intent result = api.executeApi(params, is, os);
@ -265,19 +179,48 @@ public class PgpEngine {
case OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED:
return 0;
case OpenPgpApi.RESULT_CODE_ERROR:
logError(account, (OpenPgpError) result.getParcelableExtra(OpenPgpApi.RESULT_ERROR));
return 0;
}
return 0;
}
public void chooseKey(final Account account, final UiCallback<Account> callback) {
Intent p = new Intent();
p.setAction(OpenPgpApi.ACTION_GET_SIGN_KEY_ID);
api.executeApiAsync(p, null, null, new IOpenPgpCallback() {
@Override
public void onReturn(Intent result) {
switch (result.getIntExtra(OpenPgpApi.RESULT_CODE, 0)) {
case OpenPgpApi.RESULT_CODE_SUCCESS:
callback.success(account);
return;
case OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED:
callback.userInputRequried((PendingIntent) result
.getParcelableExtra(OpenPgpApi.RESULT_INTENT),
account);
return;
case OpenPgpApi.RESULT_CODE_ERROR:
logError(account, (OpenPgpError) result.getParcelableExtra(OpenPgpApi.RESULT_ERROR));
callback.error(R.string.openpgp_error, account);
}
}
});
}
public void generateSignature(final Account account, String status,
final UiCallback<Account> callback) {
if (account.getPgpId() == 0) {
return;
}
Intent params = new Intent();
params.setAction(OpenPgpApi.ACTION_CLEARTEXT_SIGN);
params.putExtra(OpenPgpApi.EXTRA_REQUEST_ASCII_ARMOR, true);
params.setAction(OpenPgpApi.ACTION_SIGN);
params.putExtra(OpenPgpApi.EXTRA_ACCOUNT_NAME, account.getJid().toBareJid().toString());
params.putExtra(OpenPgpApi.EXTRA_SIGN_KEY_ID, account.getPgpId());
InputStream is = new ByteArrayInputStream(status.getBytes());
final OutputStream os = new ByteArrayOutputStream();
Log.d(Config.LOGTAG,account.getJid().toBareJid()+": signing status message \""+status+"\"");
api.executeApiAsync(params, is, os, new IOpenPgpCallback() {
@Override
@ -307,7 +250,7 @@ public class PgpEngine {
callback.error(R.string.openpgp_error, account);
return;
}
account.setKey("pgp_signature", signatureBuilder.toString());
account.setPgpSignature(signatureBuilder.toString());
callback.success(account);
return;
case OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED:
@ -316,7 +259,13 @@ public class PgpEngine {
account);
return;
case OpenPgpApi.RESULT_CODE_ERROR:
callback.error(R.string.openpgp_error, account);
OpenPgpError error = result.getParcelableExtra(OpenPgpApi.RESULT_ERROR);
if (error != null && "signing subkey not found!".equals(error.getMessage())) {
callback.error(0,account);
} else {
logError(account, error);
callback.error(R.string.unable_to_connect_to_keychain, null);
}
}
}
});
@ -326,8 +275,6 @@ public class PgpEngine {
Intent params = new Intent();
params.setAction(OpenPgpApi.ACTION_GET_KEY);
params.putExtra(OpenPgpApi.EXTRA_KEY_ID, contact.getPgpKeyId());
params.putExtra(OpenPgpApi.EXTRA_ACCOUNT_NAME, contact.getAccount()
.getJid().toBareJid().toString());
api.executeApiAsync(params, null, null, new IOpenPgpCallback() {
@Override
@ -342,30 +289,27 @@ public class PgpEngine {
contact);
return;
case OpenPgpApi.RESULT_CODE_ERROR:
logError(contact.getAccount(), (OpenPgpError) result.getParcelableExtra(OpenPgpApi.RESULT_ERROR));
callback.error(R.string.openpgp_error, contact);
}
}
});
}
public PendingIntent getIntentForKey(Contact contact) {
Intent params = new Intent();
params.setAction(OpenPgpApi.ACTION_GET_KEY);
params.putExtra(OpenPgpApi.EXTRA_KEY_ID, contact.getPgpKeyId());
params.putExtra(OpenPgpApi.EXTRA_ACCOUNT_NAME, contact.getAccount()
.getJid().toBareJid().toString());
Intent result = api.executeApi(params, null, null);
return (PendingIntent) result
.getParcelableExtra(OpenPgpApi.RESULT_INTENT);
private static void logError(Account account, OpenPgpError error) {
if (error != null) {
Log.d(Config.LOGTAG,account.getJid().toBareJid().toString()+": OpenKeychain error '"+error.getMessage()+"' code="+error.getErrorId());
} else {
Log.d(Config.LOGTAG,account.getJid().toBareJid().toString()+": OpenKeychain error with no message");
}
}
public PendingIntent getIntentForKey(Account account, long pgpKeyId) {
public PendingIntent getIntentForKey(long pgpKeyId) {
Intent params = new Intent();
params.setAction(OpenPgpApi.ACTION_GET_KEY);
params.putExtra(OpenPgpApi.EXTRA_KEY_ID, pgpKeyId);
params.putExtra(OpenPgpApi.EXTRA_ACCOUNT_NAME, account.getJid().toBareJid().toString());
Intent result = api.executeApi(params, null, null);
return (PendingIntent) result
.getParcelableExtra(OpenPgpApi.RESULT_INTENT);
return (PendingIntent) result.getParcelableExtra(OpenPgpApi.RESULT_INTENT);
}
}

View File

@ -0,0 +1,167 @@
package eu.siacs.conversations.crypto;
import android.os.Build;
import android.util.Log;
import android.util.Pair;
import org.bouncycastle.asn1.ASN1Primitive;
import org.bouncycastle.asn1.DERIA5String;
import org.bouncycastle.asn1.DERTaggedObject;
import org.bouncycastle.asn1.DERUTF8String;
import org.bouncycastle.asn1.DLSequence;
import org.bouncycastle.asn1.x500.RDN;
import org.bouncycastle.asn1.x500.X500Name;
import org.bouncycastle.asn1.x500.style.BCStyle;
import org.bouncycastle.asn1.x500.style.IETFUtils;
import org.bouncycastle.cert.jcajce.JcaX509CertificateHolder;
import java.io.IOException;
import java.security.cert.Certificate;
import java.security.cert.CertificateEncodingException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.net.ssl.SSLSession;
import de.duenndns.ssl.DomainHostnameVerifier;
public class XmppDomainVerifier implements DomainHostnameVerifier {
private static final String LOGTAG = "XmppDomainVerifier";
private static final String SRV_NAME = "1.3.6.1.5.5.7.8.7";
private static final String XMPP_ADDR = "1.3.6.1.5.5.7.8.5";
@Override
public boolean verify(String domain, String hostname, SSLSession sslSession) {
try {
Certificate[] chain = sslSession.getPeerCertificates();
if (chain.length == 0 || !(chain[0] instanceof X509Certificate)) {
return false;
}
X509Certificate certificate = (X509Certificate) chain[0];
final List<String> commonNames = getCommonNames(certificate);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && isSelfSigned(certificate)) {
if (commonNames.size() == 1 && matchDomain(domain,commonNames)) {
Log.d(LOGTAG,"accepted CN in self signed cert as work around for "+domain);
return true;
}
}
Collection<List<?>> alternativeNames = certificate.getSubjectAlternativeNames();
List<String> xmppAddrs = new ArrayList<>();
List<String> srvNames = new ArrayList<>();
List<String> domains = new ArrayList<>();
if (alternativeNames != null) {
for (List<?> san : alternativeNames) {
Integer type = (Integer) san.get(0);
if (type == 0) {
Pair<String, String> otherName = parseOtherName((byte[]) san.get(1));
if (otherName != null) {
switch (otherName.first) {
case SRV_NAME:
srvNames.add(otherName.second);
break;
case XMPP_ADDR:
xmppAddrs.add(otherName.second);
break;
default:
Log.d(LOGTAG, "oid: " + otherName.first + " value: " + otherName.second);
}
}
} else if (type == 2) {
Object value = san.get(1);
if (value instanceof String) {
domains.add((String) value);
}
}
}
}
if (srvNames.size() == 0 && xmppAddrs.size() == 0 && domains.size() == 0) {
domains.addAll(commonNames);
}
Log.d(LOGTAG, "searching for " + domain + " in srvNames: " + srvNames + " xmppAddrs: " + xmppAddrs + " domains:" + domains);
if (hostname != null) {
Log.d(LOGTAG,"also trying to verify hostname "+hostname);
}
return xmppAddrs.contains(domain)
|| srvNames.contains("_xmpp-client." + domain)
|| matchDomain(domain, domains)
|| (hostname != null && matchDomain(hostname,domains));
} catch (Exception e) {
return false;
}
}
private static List<String> getCommonNames(X509Certificate certificate) {
List<String> domains = new ArrayList<>();
try {
X500Name x500name = new JcaX509CertificateHolder(certificate).getSubject();
RDN[] rdns = x500name.getRDNs(BCStyle.CN);
for (int i = 0; i < rdns.length; ++i) {
domains.add(IETFUtils.valueToString(x500name.getRDNs(BCStyle.CN)[i].getFirst().getValue()));
}
return domains;
} catch (CertificateEncodingException e) {
return domains;
}
}
private static Pair<String, String> parseOtherName(byte[] otherName) {
try {
ASN1Primitive asn1Primitive = ASN1Primitive.fromByteArray(otherName);
if (asn1Primitive instanceof DERTaggedObject) {
ASN1Primitive inner = ((DERTaggedObject) asn1Primitive).getObject();
if (inner instanceof DLSequence) {
DLSequence sequence = (DLSequence) inner;
if (sequence.size() >= 2 && sequence.getObjectAt(1) instanceof DERTaggedObject) {
String oid = sequence.getObjectAt(0).toString();
ASN1Primitive value = ((DERTaggedObject) sequence.getObjectAt(1)).getObject();
if (value instanceof DERUTF8String) {
return new Pair<>(oid, ((DERUTF8String) value).getString());
} else if (value instanceof DERIA5String) {
return new Pair<>(oid, ((DERIA5String) value).getString());
}
}
}
}
return null;
} catch (IOException e) {
return null;
}
}
private static boolean matchDomain(String needle, List<String> haystack) {
for (String entry : haystack) {
if (entry.startsWith("*.")) {
int i = needle.indexOf('.');
Log.d(LOGTAG, "comparing " + needle.substring(i) + " and " + entry.substring(1));
if (i != -1 && needle.substring(i).equals(entry.substring(1))) {
Log.d(LOGTAG, "domain " + needle + " matched " + entry);
return true;
}
} else {
if (entry.equals(needle)) {
Log.d(LOGTAG, "domain " + needle + " matched " + entry);
return true;
}
}
}
return false;
}
private boolean isSelfSigned(X509Certificate certificate) {
try {
certificate.verify(certificate.getPublicKey());
return true;
} catch (Exception e) {
return false;
}
}
@Override
public boolean verify(String domain, SSLSession sslSession) {
return verify(domain,null,sslSession);
}
}

View File

@ -1,6 +1,11 @@
package eu.siacs.conversations.crypto.axolotl;
public class CryptoFailedException extends Exception {
public CryptoFailedException(String msg) {
super(msg);
}
public CryptoFailedException(Exception e){
super(e);
}

View File

@ -0,0 +1,180 @@
package eu.siacs.conversations.crypto.axolotl;
import android.content.ContentValues;
import android.database.Cursor;
public class FingerprintStatus implements Comparable<FingerprintStatus> {
private static final long DO_NOT_OVERWRITE = -1;
private Trust trust = Trust.UNTRUSTED;
private boolean active = false;
private long lastActivation = DO_NOT_OVERWRITE;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
FingerprintStatus that = (FingerprintStatus) o;
return active == that.active && trust == that.trust;
}
@Override
public int hashCode() {
int result = trust.hashCode();
result = 31 * result + (active ? 1 : 0);
return result;
}
private FingerprintStatus() {
}
public ContentValues toContentValues() {
final ContentValues contentValues = new ContentValues();
contentValues.put(SQLiteAxolotlStore.TRUST,trust.toString());
contentValues.put(SQLiteAxolotlStore.ACTIVE,active ? 1 : 0);
if (lastActivation != DO_NOT_OVERWRITE) {
contentValues.put(SQLiteAxolotlStore.LAST_ACTIVATION,lastActivation);
}
return contentValues;
}
public static FingerprintStatus fromCursor(Cursor cursor) {
final FingerprintStatus status = new FingerprintStatus();
try {
status.trust = Trust.valueOf(cursor.getString(cursor.getColumnIndex(SQLiteAxolotlStore.TRUST)));
} catch(IllegalArgumentException e) {
status.trust = Trust.UNTRUSTED;
}
status.active = cursor.getInt(cursor.getColumnIndex(SQLiteAxolotlStore.ACTIVE)) > 0;
status.lastActivation = cursor.getLong(cursor.getColumnIndex(SQLiteAxolotlStore.LAST_ACTIVATION));
return status;
}
public static FingerprintStatus createActiveUndecided() {
final FingerprintStatus status = new FingerprintStatus();
status.trust = Trust.UNDECIDED;
status.active = true;
status.lastActivation = System.currentTimeMillis();
return status;
}
public static FingerprintStatus createActiveTrusted() {
final FingerprintStatus status = new FingerprintStatus();
status.trust = Trust.TRUSTED;
status.active = true;
status.lastActivation = System.currentTimeMillis();
return status;
}
public static FingerprintStatus createActiveVerified(boolean x509) {
final FingerprintStatus status = new FingerprintStatus();
status.trust = x509 ? Trust.VERIFIED_X509 : Trust.VERIFIED;
status.active = true;
return status;
}
public static FingerprintStatus createActive(boolean trusted) {
final FingerprintStatus status = new FingerprintStatus();
status.trust = trusted ? Trust.TRUSTED : Trust.UNTRUSTED;
status.active = true;
return status;
}
public boolean isTrustedAndActive() {
return active && isTrusted();
}
public boolean isTrusted() {
return trust == Trust.TRUSTED || isVerified();
}
public boolean isVerified() {
return trust == Trust.VERIFIED || trust == Trust.VERIFIED_X509;
}
public boolean isCompromised() {
return trust == Trust.COMPROMISED;
}
public boolean isActive() {
return active;
}
public FingerprintStatus toActive() {
FingerprintStatus status = new FingerprintStatus();
status.trust = trust;
if (!status.active) {
status.lastActivation = System.currentTimeMillis();
}
status.active = true;
return status;
}
public FingerprintStatus toInactive() {
FingerprintStatus status = new FingerprintStatus();
status.trust = trust;
status.active = false;
return status;
}
public Trust getTrust() {
return trust;
}
public FingerprintStatus toVerified() {
FingerprintStatus status = new FingerprintStatus();
status.active = active;
status.trust = Trust.VERIFIED;
return status;
}
public FingerprintStatus toUntrusted() {
FingerprintStatus status = new FingerprintStatus();
status.active = active;
status.trust = Trust.UNTRUSTED;
return status;
}
public static FingerprintStatus createInactiveVerified() {
final FingerprintStatus status = new FingerprintStatus();
status.trust = Trust.VERIFIED;
status.active = false;
return status;
}
@Override
public int compareTo(FingerprintStatus o) {
if (active == o.active) {
if (lastActivation > o.lastActivation) {
return -1;
} else if (lastActivation < o.lastActivation) {
return 1;
} else {
return 0;
}
} else if (active){
return -1;
} else {
return 1;
}
}
public long getLastActivation() {
return lastActivation;
}
public enum Trust {
COMPROMISED,
UNDECIDED,
UNTRUSTED,
TRUSTED,
VERIFIED,
VERIFIED_X509
}
}

View File

@ -3,26 +3,28 @@ package eu.siacs.conversations.crypto.axolotl;
import android.util.Log;
import android.util.LruCache;
import org.whispersystems.libaxolotl.AxolotlAddress;
import org.whispersystems.libaxolotl.IdentityKey;
import org.whispersystems.libaxolotl.IdentityKeyPair;
import org.whispersystems.libaxolotl.InvalidKeyIdException;
import org.whispersystems.libaxolotl.ecc.Curve;
import org.whispersystems.libaxolotl.ecc.ECKeyPair;
import org.whispersystems.libaxolotl.state.AxolotlStore;
import org.whispersystems.libaxolotl.state.PreKeyRecord;
import org.whispersystems.libaxolotl.state.SessionRecord;
import org.whispersystems.libaxolotl.state.SignedPreKeyRecord;
import org.whispersystems.libaxolotl.util.KeyHelper;
import org.whispersystems.libsignal.SignalProtocolAddress;
import org.whispersystems.libsignal.IdentityKey;
import org.whispersystems.libsignal.IdentityKeyPair;
import org.whispersystems.libsignal.InvalidKeyIdException;
import org.whispersystems.libsignal.ecc.Curve;
import org.whispersystems.libsignal.ecc.ECKeyPair;
import org.whispersystems.libsignal.state.SignalProtocolStore;
import org.whispersystems.libsignal.state.PreKeyRecord;
import org.whispersystems.libsignal.state.SessionRecord;
import org.whispersystems.libsignal.state.SignedPreKeyRecord;
import org.whispersystems.libsignal.util.KeyHelper;
import java.security.cert.X509Certificate;
import java.util.List;
import java.util.Set;
import eu.siacs.conversations.Config;
import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.services.XmppConnectionService;
import eu.siacs.conversations.utils.CryptoHelper;
public class SQLiteAxolotlStore implements AxolotlStore {
public class SQLiteAxolotlStore implements SignalProtocolStore {
public static final String PREKEY_TABLENAME = "prekeys";
public static final String SIGNED_PREKEY_TABLENAME = "signed_prekeys";
@ -34,8 +36,12 @@ public class SQLiteAxolotlStore implements AxolotlStore {
public static final String KEY = "key";
public static final String FINGERPRINT = "fingerprint";
public static final String NAME = "name";
public static final String TRUSTED = "trusted";
public static final String TRUSTED = "trusted"; //no longer used
public static final String TRUST = "trust";
public static final String ACTIVE = "active";
public static final String LAST_ACTIVATION = "last_activation";
public static final String OWN = "ownkey";
public static final String CERTIFICATE = "certificate";
public static final String JSONKEY_REGISTRATION_ID = "axolotl_reg_id";
public static final String JSONKEY_CURRENT_PREKEY_ID = "axolotl_cur_prekey_id";
@ -49,11 +55,11 @@ public class SQLiteAxolotlStore implements AxolotlStore {
private int localRegistrationId;
private int currentPreKeyId = 0;
private final LruCache<String, XmppAxolotlSession.Trust> trustCache =
new LruCache<String, XmppAxolotlSession.Trust>(NUM_TRUSTS_TO_CACHE) {
private final LruCache<String, FingerprintStatus> trustCache =
new LruCache<String, FingerprintStatus>(NUM_TRUSTS_TO_CACHE) {
@Override
protected XmppAxolotlSession.Trust create(String fingerprint) {
return mXmppConnectionService.databaseBackend.isIdentityKeyTrusted(account, fingerprint);
protected FingerprintStatus create(String fingerprint) {
return mXmppConnectionService.databaseBackend.getFingerprintStatus(account, fingerprint);
}
};
@ -74,9 +80,6 @@ public class SQLiteAxolotlStore implements AxolotlStore {
this.mXmppConnectionService = service;
this.localRegistrationId = loadRegistrationId();
this.currentPreKeyId = loadCurrentPreKeyId();
for (SignedPreKeyRecord record : loadSignedPreKeys()) {
Log.d(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Got Axolotl signed prekey record:" + record.getId());
}
}
public int getCurrentPreKeyId() {
@ -88,18 +91,18 @@ public class SQLiteAxolotlStore implements AxolotlStore {
// --------------------------------------
private IdentityKeyPair loadIdentityKeyPair() {
String ownName = account.getJid().toBareJid().toString();
IdentityKeyPair ownKey = mXmppConnectionService.databaseBackend.loadOwnIdentityKeyPair(account,
ownName);
synchronized (mXmppConnectionService) {
IdentityKeyPair ownKey = mXmppConnectionService.databaseBackend.loadOwnIdentityKeyPair(account);
if (ownKey != null) {
if (ownKey != null) {
return ownKey;
} else {
Log.i(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Could not retrieve own IdentityKeyPair");
ownKey = generateIdentityKeyPair();
mXmppConnectionService.databaseBackend.storeOwnIdentityKeyPair(account, ownKey);
}
return ownKey;
} else {
Log.i(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Could not retrieve axolotl key for account " + ownName);
ownKey = generateIdentityKeyPair();
mXmppConnectionService.databaseBackend.storeOwnIdentityKeyPair(account, ownName, ownKey);
}
return ownKey;
}
private int loadRegistrationId() {
@ -125,15 +128,15 @@ public class SQLiteAxolotlStore implements AxolotlStore {
}
private int loadCurrentPreKeyId() {
String regIdString = this.account.getKey(JSONKEY_CURRENT_PREKEY_ID);
int reg_id;
if (regIdString != null) {
reg_id = Integer.valueOf(regIdString);
String prekeyIdString = this.account.getKey(JSONKEY_CURRENT_PREKEY_ID);
int prekey_id;
if (prekeyIdString != null) {
prekey_id = Integer.valueOf(prekeyIdString);
} else {
Log.w(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Could not retrieve current prekey id for account " + account.getJid());
reg_id = 0;
prekey_id = 0;
}
return reg_id;
return prekey_id;
}
public void regenerate() {
@ -177,14 +180,29 @@ public class SQLiteAxolotlStore implements AxolotlStore {
* <p/>
* Store a remote client's identity key as trusted.
*
* @param name The name of the remote client.
* @param address The address of the remote client.
* @param identityKey The remote client's identity key.
* @return true on success
*/
@Override
public void saveIdentity(String name, IdentityKey identityKey) {
if (!mXmppConnectionService.databaseBackend.loadIdentityKeys(account, name).contains(identityKey)) {
mXmppConnectionService.databaseBackend.storeIdentityKey(account, name, identityKey);
public boolean saveIdentity(SignalProtocolAddress address, IdentityKey identityKey) {
if (!mXmppConnectionService.databaseBackend.loadIdentityKeys(account, address.getName()).contains(identityKey)) {
String fingerprint = CryptoHelper.bytesToHex(identityKey.getPublicKey().serialize());
FingerprintStatus status = getFingerprintStatus(fingerprint);
if (status == null) {
if (mXmppConnectionService.blindTrustBeforeVerification() && !account.getAxolotlService().hasVerifiedKeys(address.getName())) {
Log.d(Config.LOGTAG,account.getJid().toBareJid()+": blindly trusted "+fingerprint+" of "+address.getName());
status = FingerprintStatus.createActiveTrusted();
} else {
status = FingerprintStatus.createActiveUndecided();
}
} else {
status = status.toActive();
}
mXmppConnectionService.databaseBackend.storeIdentityKey(account, address.getName(), identityKey, status);
trustCache.remove(fingerprint);
}
return true;
}
/**
@ -197,26 +215,33 @@ public class SQLiteAxolotlStore implements AxolotlStore {
* store. Only if it mismatches an entry in the local store is it considered
* 'untrusted.'
*
* @param name The name of the remote client.
* @param identityKey The identity key to verify.
* @return true if trusted, false if untrusted.
*/
@Override
public boolean isTrustedIdentity(String name, IdentityKey identityKey) {
public boolean isTrustedIdentity(SignalProtocolAddress address, IdentityKey identityKey, Direction direction) {
return true;
}
public XmppAxolotlSession.Trust getFingerprintTrust(String fingerprint) {
public FingerprintStatus getFingerprintStatus(String fingerprint) {
return (fingerprint == null)? null : trustCache.get(fingerprint);
}
public void setFingerprintTrust(String fingerprint, XmppAxolotlSession.Trust trust) {
mXmppConnectionService.databaseBackend.setIdentityKeyTrust(account, fingerprint, trust);
public void setFingerprintStatus(String fingerprint, FingerprintStatus status) {
mXmppConnectionService.databaseBackend.setIdentityKeyTrust(account, fingerprint, status);
trustCache.remove(fingerprint);
}
public Set<IdentityKey> getContactKeysWithTrust(String bareJid, XmppAxolotlSession.Trust trust) {
return mXmppConnectionService.databaseBackend.loadIdentityKeys(account, bareJid, trust);
public void setFingerprintCertificate(String fingerprint, X509Certificate x509Certificate) {
mXmppConnectionService.databaseBackend.setIdentityKeyCertificate(account, fingerprint, x509Certificate);
}
public X509Certificate getFingerprintCertificate(String fingerprint) {
return mXmppConnectionService.databaseBackend.getIdentityKeyCertifcate(account, fingerprint);
}
public Set<IdentityKey> getContactKeysWithTrust(String bareJid, FingerprintStatus status) {
return mXmppConnectionService.databaseBackend.loadIdentityKeys(account, bareJid, status);
}
public long getContactNumTrustedKeys(String bareJid) {
@ -241,7 +266,7 @@ public class SQLiteAxolotlStore implements AxolotlStore {
* a new SessionRecord if one does not currently exist.
*/
@Override
public SessionRecord loadSession(AxolotlAddress address) {
public SessionRecord loadSession(SignalProtocolAddress address) {
SessionRecord session = mXmppConnectionService.databaseBackend.loadSession(this.account, address);
return (session != null) ? session : new SessionRecord();
}
@ -255,9 +280,13 @@ public class SQLiteAxolotlStore implements AxolotlStore {
@Override
public List<Integer> getSubDeviceSessions(String name) {
return mXmppConnectionService.databaseBackend.getSubDeviceSessions(account,
new AxolotlAddress(name, 0));
new SignalProtocolAddress(name, 0));
}
public List<String> getKnownAddresses() {
return mXmppConnectionService.databaseBackend.getKnownSignalAddresses(account);
}
/**
* Commit to storage the {@link SessionRecord} for a given recipientId + deviceId tuple.
*
@ -265,7 +294,7 @@ public class SQLiteAxolotlStore implements AxolotlStore {
* @param record the current SessionRecord for the remote client.
*/
@Override
public void storeSession(AxolotlAddress address, SessionRecord record) {
public void storeSession(SignalProtocolAddress address, SessionRecord record) {
mXmppConnectionService.databaseBackend.storeSession(account, address, record);
}
@ -276,7 +305,7 @@ public class SQLiteAxolotlStore implements AxolotlStore {
* @return true if a {@link SessionRecord} exists, false otherwise.
*/
@Override
public boolean containsSession(AxolotlAddress address) {
public boolean containsSession(SignalProtocolAddress address) {
return mXmppConnectionService.databaseBackend.containsSession(account, address);
}
@ -286,7 +315,7 @@ public class SQLiteAxolotlStore implements AxolotlStore {
* @param address the address of the remote client.
*/
@Override
public void deleteSession(AxolotlAddress address) {
public void deleteSession(SignalProtocolAddress address) {
mXmppConnectionService.databaseBackend.deleteSession(account, address);
}
@ -297,7 +326,7 @@ public class SQLiteAxolotlStore implements AxolotlStore {
*/
@Override
public void deleteAllSessions(String name) {
AxolotlAddress address = new AxolotlAddress(name, 0);
SignalProtocolAddress address = new SignalProtocolAddress(name, 0);
mXmppConnectionService.databaseBackend.deleteAllSessions(account,
address);
}
@ -389,6 +418,10 @@ public class SQLiteAxolotlStore implements AxolotlStore {
return mXmppConnectionService.databaseBackend.loadSignedPreKeys(account);
}
public int getSignedPreKeysCount() {
return mXmppConnectionService.databaseBackend.getSignedPreKeysCount(account);
}
/**
* Store a local SignedPreKeyRecord.
*
@ -418,4 +451,8 @@ public class SQLiteAxolotlStore implements AxolotlStore {
public void removeSignedPreKey(int signedPreKeyId) {
mXmppConnectionService.databaseBackend.deleteSignedPreKey(account, signedPreKeyId);
}
public void preVerifyFingerprint(Account account, String name, String fingerprint) {
mXmppConnectionService.databaseBackend.storePreVerification(account,name,fingerprint,FingerprintStatus.createInactiveVerified());
}
}

View File

@ -3,6 +3,7 @@ package eu.siacs.conversations.crypto.axolotl;
import android.util.Base64;
import android.util.Log;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
@ -40,8 +41,9 @@ public class XmppAxolotlMessage {
private byte[] innerKey;
private byte[] ciphertext = null;
private byte[] authtagPlusInnerKey = null;
private byte[] iv = null;
private final Map<Integer, byte[]> keys;
private final Map<Integer, XmppAxolotlSession.AxolotlKey> keys;
private final Jid from;
private final int sourceDeviceId;
@ -91,7 +93,11 @@ public class XmppAxolotlMessage {
private XmppAxolotlMessage(final Element axolotlMessage, final Jid from) throws IllegalArgumentException {
this.from = from;
Element header = axolotlMessage.findChild(HEADER);
this.sourceDeviceId = Integer.parseInt(header.getAttribute(SOURCEID));
try {
this.sourceDeviceId = Integer.parseInt(header.getAttribute(SOURCEID));
} catch (NumberFormatException e) {
throw new IllegalArgumentException("invalid source id");
}
List<Element> keyElements = header.getChildren();
this.keys = new HashMap<>(keyElements.size());
for (Element keyElement : keyElements) {
@ -99,17 +105,18 @@ public class XmppAxolotlMessage {
case KEYTAG:
try {
Integer recipientId = Integer.parseInt(keyElement.getAttribute(REMOTEID));
byte[] key = Base64.decode(keyElement.getContent(), Base64.DEFAULT);
this.keys.put(recipientId, key);
byte[] key = Base64.decode(keyElement.getContent().trim(), Base64.DEFAULT);
boolean isPreKey =keyElement.getAttributeAsBoolean("prekey");
this.keys.put(recipientId, new XmppAxolotlSession.AxolotlKey(key,isPreKey));
} catch (NumberFormatException e) {
throw new IllegalArgumentException(e);
throw new IllegalArgumentException("invalid remote id");
}
break;
case IVTAG:
if (this.iv != null) {
throw new IllegalArgumentException("Duplicate iv entry");
}
iv = Base64.decode(keyElement.getContent(), Base64.DEFAULT);
iv = Base64.decode(keyElement.getContent().trim(), Base64.DEFAULT);
break;
default:
Log.w(Config.LOGTAG, "Unexpected element in header: " + keyElement.toString());
@ -118,7 +125,7 @@ public class XmppAxolotlMessage {
}
Element payloadElement = axolotlMessage.findChild(PAYLOAD);
if (payloadElement != null) {
ciphertext = Base64.decode(payloadElement.getContent(), Base64.DEFAULT);
ciphertext = Base64.decode(payloadElement.getContent().trim(), Base64.DEFAULT);
}
}
@ -158,8 +165,15 @@ public class XmppAxolotlMessage {
IvParameterSpec ivSpec = new IvParameterSpec(iv);
Cipher cipher = Cipher.getInstance(CIPHERMODE, PROVIDER);
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec);
this.innerKey = secretKey.getEncoded();
this.ciphertext = cipher.doFinal(plaintext.getBytes());
this.ciphertext = cipher.doFinal(Config.OMEMO_PADDING ? getPaddedBytes(plaintext) : plaintext.getBytes());
if (Config.PUT_AUTH_TAG_INTO_KEY && this.ciphertext != null) {
this.authtagPlusInnerKey = new byte[16+16];
byte[] ciphertext = new byte[this.ciphertext.length - 16];
System.arraycopy(this.ciphertext,0,ciphertext,0,ciphertext.length);
System.arraycopy(this.ciphertext,ciphertext.length,authtagPlusInnerKey,16,16);
System.arraycopy(this.innerKey,0,authtagPlusInnerKey,0,this.innerKey.length);
this.ciphertext = ciphertext;
}
} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException
| IllegalBlockSizeException | BadPaddingException | NoSuchProviderException
| InvalidAlgorithmParameterException e) {
@ -167,6 +181,22 @@ public class XmppAxolotlMessage {
}
}
private static byte[] getPaddedBytes(String plaintext) {
int plainLength = plaintext.getBytes().length;
int pad = Math.max(64,(plainLength / 32 + 1) * 32) - plainLength;
SecureRandom random = new SecureRandom();
int left = random.nextInt(pad);
int right = pad - left;
StringBuilder builder = new StringBuilder(plaintext);
for(int i = 0; i < left; ++i) {
builder.insert(0,random.nextBoolean() ? "\t" : " ");
}
for(int i = 0; i < right; ++i) {
builder.append(random.nextBoolean() ? "\t" : " ");
}
return builder.toString().getBytes();
}
public Jid getFrom() {
return this.from;
}
@ -180,7 +210,12 @@ public class XmppAxolotlMessage {
}
public void addDevice(XmppAxolotlSession session) {
byte[] key = session.processSending(innerKey);
XmppAxolotlSession.AxolotlKey key;
if (authtagPlusInnerKey != null) {
key = session.processSending(authtagPlusInnerKey);
} else {
key = session.processSending(innerKey);
}
if (key != null) {
keys.put(session.getRemoteAddress().getDeviceId(), key);
}
@ -198,30 +233,33 @@ public class XmppAxolotlMessage {
Element encryptionElement = new Element(CONTAINERTAG, AxolotlService.PEP_PREFIX);
Element headerElement = encryptionElement.addChild(HEADER);
headerElement.setAttribute(SOURCEID, sourceDeviceId);
for (Map.Entry<Integer, byte[]> keyEntry : keys.entrySet()) {
for (Map.Entry<Integer, XmppAxolotlSession.AxolotlKey> keyEntry : keys.entrySet()) {
Element keyElement = new Element(KEYTAG);
keyElement.setAttribute(REMOTEID, keyEntry.getKey());
keyElement.setContent(Base64.encodeToString(keyEntry.getValue(), Base64.DEFAULT));
if (keyEntry.getValue().prekey) {
keyElement.setAttribute("prekey","true");
}
keyElement.setContent(Base64.encodeToString(keyEntry.getValue().key, Base64.NO_WRAP));
headerElement.addChild(keyElement);
}
headerElement.addChild(IVTAG).setContent(Base64.encodeToString(iv, Base64.DEFAULT));
headerElement.addChild(IVTAG).setContent(Base64.encodeToString(iv, Base64.NO_WRAP));
if (ciphertext != null) {
Element payload = encryptionElement.addChild(PAYLOAD);
payload.setContent(Base64.encodeToString(ciphertext, Base64.DEFAULT));
payload.setContent(Base64.encodeToString(ciphertext, Base64.NO_WRAP));
}
return encryptionElement;
}
private byte[] unpackKey(XmppAxolotlSession session, Integer sourceDeviceId) {
byte[] encryptedKey = keys.get(sourceDeviceId);
return (encryptedKey != null) ? session.processReceiving(encryptedKey) : null;
private byte[] unpackKey(XmppAxolotlSession session, Integer sourceDeviceId) throws CryptoFailedException {
XmppAxolotlSession.AxolotlKey encryptedKey = keys.get(sourceDeviceId);
if (encryptedKey == null) {
throw new CryptoFailedException("Message was not encrypted for this device");
}
return session.processReceiving(encryptedKey);
}
public XmppAxolotlKeyTransportMessage getParameters(XmppAxolotlSession session, Integer sourceDeviceId) {
byte[] key = unpackKey(session, sourceDeviceId);
return (key != null)
? new XmppAxolotlKeyTransportMessage(session.getFingerprint(), key, getIV())
: null;
public XmppAxolotlKeyTransportMessage getParameters(XmppAxolotlSession session, Integer sourceDeviceId) throws CryptoFailedException {
return new XmppAxolotlKeyTransportMessage(session.getFingerprint(), unpackKey(session, sourceDeviceId), getIV());
}
public XmppAxolotlPlaintextMessage decrypt(XmppAxolotlSession session, Integer sourceDeviceId) throws CryptoFailedException {
@ -229,6 +267,19 @@ public class XmppAxolotlMessage {
byte[] key = unpackKey(session, sourceDeviceId);
if (key != null) {
try {
if (key.length >= 32) {
int authtaglength = key.length - 16;
Log.d(Config.LOGTAG,"found auth tag as part of omemo key");
byte[] newCipherText = new byte[key.length - 16 + ciphertext.length];
byte[] newKey = new byte[16];
System.arraycopy(ciphertext, 0, newCipherText, 0, ciphertext.length);
System.arraycopy(key, 16, newCipherText, ciphertext.length, authtaglength);
System.arraycopy(key,0,newKey,0,newKey.length);
ciphertext = newCipherText;
key = newKey;
}
Cipher cipher = Cipher.getInstance(CIPHERMODE, PROVIDER);
SecretKeySpec keySpec = new SecretKeySpec(key, KEYTYPE);
IvParameterSpec ivSpec = new IvParameterSpec(iv);
@ -236,7 +287,7 @@ public class XmppAxolotlMessage {
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
String plaintext = new String(cipher.doFinal(ciphertext));
plaintextMessage = new XmppAxolotlPlaintextMessage(plaintext, session.getFingerprint());
plaintextMessage = new XmppAxolotlPlaintextMessage(Config.OMEMO_PADDING ? plaintext.trim() : plaintext, session.getFingerprint());
} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException
| InvalidAlgorithmParameterException | IllegalBlockSizeException

View File

@ -2,99 +2,41 @@ package eu.siacs.conversations.crypto.axolotl;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
import org.whispersystems.libaxolotl.AxolotlAddress;
import org.whispersystems.libaxolotl.DuplicateMessageException;
import org.whispersystems.libaxolotl.InvalidKeyException;
import org.whispersystems.libaxolotl.InvalidKeyIdException;
import org.whispersystems.libaxolotl.InvalidMessageException;
import org.whispersystems.libaxolotl.InvalidVersionException;
import org.whispersystems.libaxolotl.LegacyMessageException;
import org.whispersystems.libaxolotl.NoSessionException;
import org.whispersystems.libaxolotl.SessionCipher;
import org.whispersystems.libaxolotl.UntrustedIdentityException;
import org.whispersystems.libaxolotl.protocol.CiphertextMessage;
import org.whispersystems.libaxolotl.protocol.PreKeyWhisperMessage;
import org.whispersystems.libaxolotl.protocol.WhisperMessage;
import org.whispersystems.libsignal.SignalProtocolAddress;
import org.whispersystems.libsignal.DuplicateMessageException;
import org.whispersystems.libsignal.IdentityKey;
import org.whispersystems.libsignal.InvalidKeyException;
import org.whispersystems.libsignal.InvalidKeyIdException;
import org.whispersystems.libsignal.InvalidMessageException;
import org.whispersystems.libsignal.InvalidVersionException;
import org.whispersystems.libsignal.LegacyMessageException;
import org.whispersystems.libsignal.NoSessionException;
import org.whispersystems.libsignal.SessionCipher;
import org.whispersystems.libsignal.UntrustedIdentityException;
import org.whispersystems.libsignal.protocol.CiphertextMessage;
import org.whispersystems.libsignal.protocol.PreKeySignalMessage;
import org.whispersystems.libsignal.protocol.SignalMessage;
import org.whispersystems.libsignal.util.guava.Optional;
import java.util.HashMap;
import java.util.Map;
import eu.siacs.conversations.Config;
import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.utils.CryptoHelper;
public class XmppAxolotlSession {
public class XmppAxolotlSession implements Comparable<XmppAxolotlSession> {
private final SessionCipher cipher;
private final SQLiteAxolotlStore sqLiteAxolotlStore;
private final AxolotlAddress remoteAddress;
private final SignalProtocolAddress remoteAddress;
private final Account account;
private String fingerprint = null;
private IdentityKey identityKey;
private Integer preKeyId = null;
private boolean fresh = true;
public enum Trust {
UNDECIDED(0),
TRUSTED(1),
UNTRUSTED(2),
COMPROMISED(3),
INACTIVE_TRUSTED(4),
INACTIVE_UNDECIDED(5),
INACTIVE_UNTRUSTED(6);
private static final Map<Integer, Trust> trustsByValue = new HashMap<>();
static {
for (Trust trust : Trust.values()) {
trustsByValue.put(trust.getCode(), trust);
}
}
private final int code;
Trust(int code) {
this.code = code;
}
public int getCode() {
return this.code;
}
public String toString() {
switch (this) {
case UNDECIDED:
return "Trust undecided " + getCode();
case TRUSTED:
return "Trusted " + getCode();
case COMPROMISED:
return "Compromised " + getCode();
case INACTIVE_TRUSTED:
return "Inactive (Trusted)" + getCode();
case INACTIVE_UNDECIDED:
return "Inactive (Undecided)" + getCode();
case INACTIVE_UNTRUSTED:
return "Inactive (Untrusted)" + getCode();
case UNTRUSTED:
default:
return "Untrusted " + getCode();
}
}
public static Trust fromBoolean(Boolean trusted) {
return trusted ? TRUSTED : UNTRUSTED;
}
public static Trust fromCode(int code) {
return trustsByValue.get(code);
}
}
public XmppAxolotlSession(Account account, SQLiteAxolotlStore store, AxolotlAddress remoteAddress, String fingerprint) {
public XmppAxolotlSession(Account account, SQLiteAxolotlStore store, SignalProtocolAddress remoteAddress, IdentityKey identityKey) {
this(account, store, remoteAddress);
this.fingerprint = fingerprint;
this.identityKey = identityKey;
}
public XmppAxolotlSession(Account account, SQLiteAxolotlStore store, AxolotlAddress remoteAddress) {
public XmppAxolotlSession(Account account, SQLiteAxolotlStore store, SignalProtocolAddress remoteAddress) {
this.cipher = new SessionCipher(store, remoteAddress);
this.remoteAddress = remoteAddress;
this.sqLiteAxolotlStore = store;
@ -111,10 +53,14 @@ public class XmppAxolotlSession {
}
public String getFingerprint() {
return fingerprint;
return identityKey == null ? null : CryptoHelper.bytesToHex(identityKey.getPublicKey().serialize());
}
public AxolotlAddress getRemoteAddress() {
public IdentityKey getIdentityKey() {
return identityKey;
}
public SignalProtocolAddress getRemoteAddress() {
return remoteAddress;
}
@ -126,71 +72,90 @@ public class XmppAxolotlSession {
this.fresh = false;
}
protected void setTrust(Trust trust) {
sqLiteAxolotlStore.setFingerprintTrust(fingerprint, trust);
protected void setTrust(FingerprintStatus status) {
sqLiteAxolotlStore.setFingerprintStatus(getFingerprint(), status);
}
protected Trust getTrust() {
Trust trust = sqLiteAxolotlStore.getFingerprintTrust(fingerprint);
return (trust == null) ? Trust.UNDECIDED : trust;
public FingerprintStatus getTrust() {
FingerprintStatus status = sqLiteAxolotlStore.getFingerprintStatus(getFingerprint());
return (status == null) ? FingerprintStatus.createActiveUndecided() : status;
}
@Nullable
public byte[] processReceiving(byte[] encryptedKey) {
byte[] plaintext = null;
Trust trust = getTrust();
switch (trust) {
case INACTIVE_TRUSTED:
case UNDECIDED:
case UNTRUSTED:
case TRUSTED:
public byte[] processReceiving(AxolotlKey encryptedKey) throws CryptoFailedException {
byte[] plaintext;
FingerprintStatus status = getTrust();
if (!status.isCompromised()) {
try {
CiphertextMessage ciphertextMessage;
try {
try {
PreKeyWhisperMessage message = new PreKeyWhisperMessage(encryptedKey);
Log.i(Config.LOGTAG, AxolotlService.getLogprefix(account) + "PreKeyWhisperMessage received, new session ID:" + message.getSignedPreKeyId() + "/" + message.getPreKeyId());
String fingerprint = message.getIdentityKey().getFingerprint().replaceAll("\\s", "");
if (this.fingerprint != null && !this.fingerprint.equals(fingerprint)) {
Log.e(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Had session with fingerprint " + this.fingerprint + ", received message with fingerprint " + fingerprint);
} else {
this.fingerprint = fingerprint;
plaintext = cipher.decrypt(message);
if (message.getPreKeyId().isPresent()) {
preKeyId = message.getPreKeyId().get();
}
}
} catch (InvalidMessageException | InvalidVersionException e) {
Log.i(Config.LOGTAG, AxolotlService.getLogprefix(account) + "WhisperMessage received");
WhisperMessage message = new WhisperMessage(encryptedKey);
plaintext = cipher.decrypt(message);
} catch (InvalidKeyException | InvalidKeyIdException | UntrustedIdentityException e) {
Log.w(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Error decrypting axolotl header, " + e.getClass().getName() + ": " + e.getMessage());
ciphertextMessage = new PreKeySignalMessage(encryptedKey.key);
Optional<Integer> optionalPreKeyId = ((PreKeySignalMessage) ciphertextMessage).getPreKeyId();
IdentityKey identityKey = ((PreKeySignalMessage) ciphertextMessage).getIdentityKey();
if (!optionalPreKeyId.isPresent()) {
throw new CryptoFailedException("PreKeyWhisperMessage did not contain a PreKeyId");
}
} catch (LegacyMessageException | InvalidMessageException | DuplicateMessageException | NoSessionException e) {
Log.w(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Error decrypting axolotl header, " + e.getClass().getName() + ": " + e.getMessage());
preKeyId = optionalPreKeyId.get();
if (this.identityKey != null && !this.identityKey.equals(identityKey)) {
throw new CryptoFailedException("Received PreKeyWhisperMessage but preexisting identity key changed.");
}
this.identityKey = identityKey;
} catch (InvalidVersionException | InvalidMessageException e) {
ciphertextMessage = new SignalMessage(encryptedKey.key);
}
if (plaintext != null && trust == Trust.INACTIVE_TRUSTED) {
setTrust(Trust.TRUSTED);
if (ciphertextMessage instanceof PreKeySignalMessage) {
plaintext = cipher.decrypt((PreKeySignalMessage) ciphertextMessage);
} else {
plaintext = cipher.decrypt((SignalMessage) ciphertextMessage);
}
break;
case COMPROMISED:
default:
// ignore
break;
} catch (InvalidKeyException | LegacyMessageException | InvalidMessageException | DuplicateMessageException | NoSessionException | InvalidKeyIdException | UntrustedIdentityException e) {
if (!(e instanceof DuplicateMessageException)) {
e.printStackTrace();
}
throw new CryptoFailedException("Error decrypting WhisperMessage " + e.getClass().getSimpleName() + ": " + e.getMessage());
}
if (!status.isActive()) {
setTrust(status.toActive());
}
} else {
throw new CryptoFailedException("not encrypting omemo message from fingerprint "+getFingerprint()+" because it was marked as compromised");
}
return plaintext;
}
@Nullable
public byte[] processSending(@NonNull byte[] outgoingMessage) {
Trust trust = getTrust();
if (trust == Trust.TRUSTED) {
CiphertextMessage ciphertextMessage = cipher.encrypt(outgoingMessage);
return ciphertextMessage.serialize();
public AxolotlKey processSending(@NonNull byte[] outgoingMessage) {
FingerprintStatus status = getTrust();
if (status.isTrustedAndActive()) {
try {
CiphertextMessage ciphertextMessage = cipher.encrypt(outgoingMessage);
return new AxolotlKey(ciphertextMessage.serialize(),ciphertextMessage.getType() == CiphertextMessage.PREKEY_TYPE);
} catch (UntrustedIdentityException e) {
return null;
}
} else {
return null;
}
}
public Account getAccount() {
return account;
}
@Override
public int compareTo(XmppAxolotlSession o) {
return getTrust().compareTo(o.getTrust());
}
public static class AxolotlKey {
public final byte[] key;
public final boolean prekey;
public AxolotlKey(byte[] key, boolean prekey) {
this.key = key;
this.prekey = prekey;
}
}
}

View File

@ -0,0 +1,28 @@
package eu.siacs.conversations.crypto.sasl;
import java.security.SecureRandom;
import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.xml.TagWriter;
public class Anonymous extends SaslMechanism {
public Anonymous(TagWriter tagWriter, Account account, SecureRandom rng) {
super(tagWriter, account, rng);
}
@Override
public int getPriority() {
return 0;
}
@Override
public String getMechanism() {
return "ANONYMOUS";
}
@Override
public String getClientFirstMessage() {
return "";
}
}

View File

@ -2,7 +2,6 @@ package eu.siacs.conversations.crypto.sasl;
import android.util.Base64;
import java.math.BigInteger;
import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
@ -52,7 +51,7 @@ public class DigestMd5 extends SaslMechanism {
+ account.getPassword();
final MessageDigest md = MessageDigest.getInstance("MD5");
final byte[] y = md.digest(x.getBytes(Charset.defaultCharset()));
final String cNonce = new BigInteger(100, rng).toString(32);
final String cNonce = CryptoHelper.random(100,rng);
final byte[] a1 = CryptoHelper.concatenateByteArrays(y,
(":" + nonce + ":" + cNonce).getBytes(Charset.defaultCharset()));
final String a2 = "AUTHENTICATE:" + digestUri;

View File

@ -0,0 +1,29 @@
package eu.siacs.conversations.crypto.sasl;
import android.util.Base64;
import java.security.SecureRandom;
import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.xml.TagWriter;
public class External extends SaslMechanism {
public External(TagWriter tagWriter, Account account, SecureRandom rng) {
super(tagWriter, account, rng);
}
@Override
public int getPriority() {
return 25;
}
@Override
public String getMechanism() {
return "EXTERNAL";
}
@Override
public String getClientFirstMessage() {
return Base64.encodeToString(account.getJid().toBareJid().toString().getBytes(),Base64.NO_WRAP);
}
}

View File

@ -11,7 +11,7 @@ public abstract class SaslMechanism {
final protected Account account;
final protected SecureRandom rng;
protected static enum State {
protected enum State {
INITIAL,
AUTH_TEXT_SENT,
RESPONSE_SENT,
@ -26,6 +26,10 @@ public abstract class SaslMechanism {
public AuthenticationException(final Exception inner) {
super(inner);
}
public AuthenticationException(final String message, final Exception exception) {
super(message,exception);
}
}
public static class InvalidStateException extends AuthenticationException {

Some files were not shown because too many files have changed in this diff Show More