Compare commits

...

621 Commits

Author SHA1 Message Date
Tankred Hase 43729833a5 Merge pull request #412 from tanx/master
Minor fixes to master
2015-12-17 16:13:36 +07:00
Tankred Hase b05aeea342 Remove gitter link 2015-12-17 16:02:55 +07:00
Tankred Hase 137c8c7c24 Update links in readme 2015-12-17 16:00:49 +07:00
Tankred Hase 853be194d9 Fix dompurify build and upgrade to new version 2015-12-17 12:12:38 +07:00
Tankred Hase 8b36a719c3 Use faster container based travis builds, remove whiteout build email notification from travis 2015-12-14 10:30:25 +07:00
Tankred Hase 8165416c5d Rename repo to mail 2015-12-14 10:25:58 +07:00
Tankred Hase b375d81635 Update git repo name in readme 2015-12-11 19:10:10 +07:00
Felix Hammerl e56f8c2c28 Merge pull request #394 from whiteout-io/dev/WO-1026
[WO-1026] Fix broken key upload after mail server error
2015-08-19 12:36:59 +02:00
Felix Hammerl ad3691fae9 [WO-1026] Fix broken key upload after mail server error 2015-08-19 12:10:16 +02:00
Tankred Hase e0663ab8d8 Remove winstore-jscompat (not necessary in Windows 10 anymore) 2015-08-05 14:12:13 +02:00
Tankred Hase 263b5c13b0 Upgrade to grunt-mocha-phantomjs 0.7.0 2015-08-05 14:11:25 +02:00
Tankred Hase 8636ba201b Properly mock publickey requests 2015-08-05 14:10:29 +02:00
Tankred Hase aa24881efc Fix JS build by fixating transitive browserify dep 2015-07-10 12:39:47 +02:00
Tankred Hase b7b5c1bdf5 Update README.md 2015-07-08 17:55:05 +02:00
Tankred Hase 59d38f9b14 Bump mobile version code 2015-06-26 11:28:25 +02:00
Tankred Hase c44984b2f3 Bump mobile version code 2015-06-18 11:58:57 +02:00
Felix Hammerl c31c320e83 Merge pull request #381 from whiteout-io/WO-1000
Remove invite code from app
2015-06-18 11:52:27 +02:00
Tankred Hase 7f49e691db Remove invite code from app 2015-06-18 10:45:18 +02:00
Tankred Hase a346f1612e bump mobile version 2015-06-15 13:43:28 +02:00
Tankred Hase 6b0b71d4ff Merge pull request #377 from whiteout-io/dev/WO-997
[WO-997] Select multiple messages at once
2015-06-15 13:07:06 +02:00
Felix Hammerl 4683583a0a [WO-997] Select multiple messages at once 2015-06-15 13:02:28 +02:00
Tankred Hase b038ac2c16 Merge pull request #376 from whiteout-io/dev/WO-996
Add error handling for invalid PGP key user id
2015-06-15 12:59:59 +02:00
Tankred Hase f32863dc54 Add error handling for invalid PGP key user id 2015-06-12 16:50:03 +02:00
Felix Hammerl 39d19df187 Order folders by path instead of name to keep subfolder order 2015-06-12 15:15:44 +02:00
Tankred Hase 9bf8c758ec Merge pull request #356 from whiteout-io/dev/WO-927
[WO-927] Clear file input after key import
2015-06-12 12:20:10 +02:00
Tankred Hase 76f770a12b Merge pull request #357 from whiteout-io/audit/WO-03-014
[WO-03-014] Avoid unsinged content spoofing attack
2015-05-21 17:25:35 +02:00
Felix Hammerl 3af376b419 [WO-03-014] Avoid unsinged content spoofing attack 2015-05-21 16:25:50 +02:00
Felix Hammerl e9a8702b39 [WO-927] Clear file input after key import 2015-05-20 17:21:33 +02:00
Tankred Hase 25b9141a5f Merge pull request #353 from whiteout-io/dev/WO-891
[WO-891] Add logout to passphrase dialog
2015-05-19 18:31:16 +02:00
Tankred Hase 1d0efc02a2 Review text 2015-05-19 18:30:31 +02:00
Felix Hammerl c3362c193d Add missing mocks 2015-05-19 17:39:30 +02:00
Felix Hammerl 7f0235c9b2 [WO-981] Set style.display instead of style 2015-05-19 16:39:59 +02:00
Felix Hammerl 8e0dfacd51 [WO-891] Add logout to passphrase dialog 2015-05-19 16:21:52 +02:00
Tankred Hase 467d001483 Bump mobile version code 2015-05-18 17:05:30 +02:00
Tankred Hase e7fb3bcf6d Merge pull request #345 from whiteout-io/dev/WO-986
[WO-986] Use proper path for key download
2015-05-18 16:59:43 +02:00
Tankred Hase ce740b2109 Remove empty lines 2015-05-18 16:57:28 +02:00
Felix Hammerl 0bfaba3bd9 Merge pull request #352 from whiteout-io/dev/WO-944
[WO-03-011] Fix no Reliable Sender Indication is implemented (Medium)
2015-05-18 16:49:08 +02:00
Tankred Hase e7cbf9ed86 Fix browserify build 2015-05-18 16:14:12 +02:00
Tankred Hase c76a392abf [WO-03-011] Fix no Reliable Sender Indication is implemented (Medium)
Display sender email address next to full name
2015-05-18 15:56:31 +02:00
Felix Hammerl ca8c2d9a4f [WO-986] Use proper path for key download 2015-05-13 15:55:55 +02:00
Tankred Hase f287c4cddf Merge pull request #344 from whiteout-io/dev/WO-982
[WO-982] Add placeholder to writer
2015-05-13 11:46:26 +02:00
Felix Hammerl 59006a98d7 Remove anonymized from bug report body 2015-05-12 12:04:48 +02:00
Felix Hammerl 73fcfba2a9 [WO-982] Add placeholder to writer 2015-05-12 11:06:27 +02:00
Tankred Hase b473d2b7fe Bump mobile version code 2015-05-11 15:54:07 +02:00
Tankred Hase 4519ab65c6 Remove empty line 2015-05-11 15:53:28 +02:00
Tankred Hase 19bdf0aa49 Fix iframe resize issue on iOS 2015-05-11 15:23:10 +02:00
Tankred Hase b8f21ac7eb Merge pull request #341 from whiteout-io/dev/WO-726
[WO-726] Nuke user DB on logout
2015-05-11 14:22:13 +02:00
Tankred Hase ff2a7c3e4a Update navigation.js 2015-05-11 14:20:34 +02:00
Tankred Hase 7834f79045 Update app-config.js 2015-05-11 14:20:09 +02:00
Felix Hammerl b35d993ff1 [WO-726] Nuke user DB on logout 2015-05-09 18:58:31 +02:00
Felix Hammerl 4e0388b349 Merge pull request #338 from whiteout-io/audit/WO-03-025
[WO-03-025] Unescape dashes in signed cleartext
2015-05-09 18:15:49 +02:00
Tankred Hase add1cd3919 bump mobile manifest 2015-05-09 16:23:31 +02:00
Tankred Hase d87449c57f Revert "Reset width before decription"
This reverts commit 4cf1ef3107.
2015-05-09 13:18:53 +02:00
Tankred Hase 4cf1ef3107 Reset width before decription 2015-05-09 11:53:33 +02:00
Tankred Hase e5e1c118be Merge pull request #337 from whiteout-io/dev/WO-964
[WO-964] Do not wait for next watch timer for ui update and general clea...
2015-05-09 11:14:25 +02:00
Tankred Hase 8e03b6a2ff Merge pull request #334 from whiteout-io/dev/WO-976
[WO-976] Fix UI when trying to display a message with empty body
2015-05-09 10:52:28 +02:00
Andris Reinman 6963ea33e9 [WO-03-025] Unescape dashes in signed cleartext 2015-05-07 12:28:11 +03:00
Felix Hammerl 0074e0ca90 [WO-964] Do not wait for next watch timer for ui update and general cleanup 2015-05-06 15:42:55 +02:00
Felix Hammerl 9f5daa12b1 Merge pull request #336 from whiteout-io/dev/WO-978
[WO-978] Fix PGP key folder prefix ignored at down and upload
2015-05-05 15:49:07 +02:00
Felix Hammerl 44591cc099 Bump imap-client version 2015-05-05 15:18:56 +02:00
Felix Hammerl ecf16b028b [WO-978] Fix PGP key folder prefix ignored at down and upload 2015-05-04 18:47:12 +02:00
Tankred Hase bcaef5c330 Revert "[WO-03-008] Fix no Origin Checks for postMessage Communication (High)"
This reverts commit 2aa166ac19.
2015-05-04 14:56:31 +02:00
Tankred Hase 9454739818 Revert "Hide wmail account creation in iOS app"
This reverts commit 168eaf0086.

Conflicts:
	src/js/controller/login/add-account.js
2015-04-29 08:48:59 +02:00
Felix Hammerl 991f61d271 [WO-976] Fix UI when trying to display a message with empty body 2015-04-28 19:25:32 +02:00
Tankred Hase f62257a595 Bump mobile version code 2015-04-28 14:37:18 +02:00
Tankred Hase 4f1ead0394 Merge pull request #333 from whiteout-io/dev/WO-975
Dev/wo 975
2015-04-28 14:32:47 +02:00
Tankred Hase bd910df187 Remove redundant case for SW state 2015-04-28 14:31:18 +02:00
Tankred Hase 504e8ffd50 Add simple prefetch service-worker 2015-04-28 13:35:17 +02:00
Felix Hammerl 7c1d68ec6e Merge pull request #332 from whiteout-io/dev/WO-971
Catch notification error on Chrome for Android
2015-04-28 11:22:43 +02:00
Tankred Hase 4293031f1f Catch notification error on Chrome for Android 2015-04-28 10:13:13 +02:00
Tankred Hase 44dac729aa Merge pull request #330 from whiteout-io/dev/WO-939
[WO-939] Fix TLS cert rejection bug
2015-04-28 10:01:34 +02:00
Felix Hammerl 55add6a6d3 [WO-939] Fix TLS cert rejection bug 2015-04-27 18:15:36 +02:00
Tankred Hase d36ddcef7f Fix platform checking in Chrome Web App 2015-04-27 16:52:15 +02:00
Tankred Hase 94188be7b3 Merge pull request #327 from whiteout-io/dev/WO-950
[WO-03-018] Fix weak Passwords & Misleading Passphrase Strength Check (L...
2015-04-27 13:37:38 +02:00
Tankred Hase 215a53e2a9 Merge pull request #329 from whiteout-io/dev/WO-973
Hide wmail account creation in iOS app
2015-04-27 13:23:20 +02:00
Tankred Hase 168eaf0086 Hide wmail account creation in iOS app 2015-04-27 13:19:49 +02:00
Felix Hammerl 9f39b67812 Merge pull request #326 from whiteout-io/dev/WO-961
[WO-03-008] Fix no Origin Checks for postMessage Communication (High)
2015-04-27 11:25:44 +02:00
Felix Hammerl 7540ffcab5 Merge pull request #328 from whiteout-io/dev/WO-952
[WO-03-020] Fix insecure Default in Implementation of BCC Feature (Low)
2015-04-27 11:20:37 +02:00
Tankred Hase 15ff8c85db [WO-03-020] Fix insecure Default in Implementation of BCC Feature (Low)
Display warning to user when using BCC feature
2015-04-24 17:14:13 +02:00
Tankred Hase 4efab0daf0 Upgrade to angular.js v1.3.15 2015-04-24 15:56:51 +02:00
Tankred Hase 701eb36b19 [WO-03-018] Fix weak Passwords & Misleading Passphrase Strength Check (Low)
Remove unsafe password strength indicator
2015-04-24 15:37:06 +02:00
Tankred Hase b687986980 [WO-03-005] Fix off-by-one Error in Prime Worker Code of Forge library (Low)
Upgrade to forge v0.6.26
2015-04-23 19:17:48 +02:00
Tankred Hase 281e53a887 [WO-03-013] Set stricter X-Frame-Options HTTP headers 2015-04-23 17:44:30 +02:00
Tankred Hase 6216fe2f1a [WO-03-024] Fix links can be opened in the message frame in MSIE11 (High)
Add X-Content-Security-Policy HTTP header for IE10+
2015-04-23 17:34:41 +02:00
Tankred Hase 2aa166ac19 [WO-03-008] Fix no Origin Checks for postMessage Communication (High) 2015-04-23 17:09:10 +02:00
Tankred Hase 4a681a73d2 Merge pull request #325 from whiteout-io/dev/WO-947
[WO-03-014] Fix Spoofing of Signed Messages and general UI Concerns (High)
2015-04-22 18:59:11 +02:00
Tankred Hase 56bd5222d2 Merge pull request #322 from whiteout-io/dev/WO-955
[WO-955] WO-03-023 STARTTLS Setting leads to opportunistic STARTSSL
2015-04-22 18:57:13 +02:00
Tankred Hase 1032a1eb06 Update package.json 2015-04-22 18:56:12 +02:00
Tankred Hase e6d109d42d [WO-03-013] Fix lack of X-Frame-Options Header on Whiteout Server (Medium) 2015-04-22 18:35:59 +02:00
Tankred Hase 0dc04e659f Add <math> html tag to DOMpurity backlist to prevent HTTP leaks 2015-04-22 18:01:53 +02:00
Tankred Hase c8779caef2 [WO-03-014] Fix Spoofing of Signed Messages and general UI Concerns (High)
Added signature 'verified' and 'invalid' icons from ModernPGP spec
See https://github.com/ModernPGP/icons#signatures
2015-04-22 17:48:38 +02:00
Felix Hammerl 898e19e3ea Merge pull request #321 from whiteout-io/audit/WO-03-002
[WO-03-002] Fix Insecure Regex Usage on DOMPurify Sanitizer Output (Medi...
2015-04-22 17:38:32 +02:00
Tankred Hase 246d19b76e [WO-03-002] Fix Insecure Regex Usage on DOMPurify Sanitizer Output (Medium) 2015-04-22 14:45:52 +02:00
Tankred Hase 55406cf7e8 Merge pull request #323 from eldios/eldios-patch-1
Change Git cloning command to use HTTP
2015-04-22 11:11:19 +02:00
Felix Hammerl b5c917f95a [WO-955] WO-03-023 STARTTLS Setting leads to opportunistic STARTSSL 2015-04-21 18:16:21 +02:00
Lele a0378cc0b9 Change Git cloning command to use HTTP
..or it will give a permission denied error to everyone but the developers :)
2015-04-21 02:14:34 +02:00
Tankred Hase 8b42f83b35 Merge pull request #319 from whiteout-io/dev/WO-905
[WO-905] Add IMAP compression
2015-04-17 13:18:36 +02:00
Tankred Hase 9f94467ad1 Upgrade to imap-client v0.14.0 2015-04-17 13:16:20 +02:00
Tankred Hase 321b6a9710 Bump mobile version code 2015-04-17 12:17:56 +02:00
Tankred Hase cf85fbd2ee Merge pull request #269 from whiteout-io/dev/wo-630
[WO-630] Added winstore-jscompat.js for Windows Apps compatibility
2015-04-16 16:56:28 +02:00
Andris Reinman 9518cb69fa [WO-630] Added winstore-jscompat.js for Windows Apps compatibility 2015-04-15 12:45:05 +02:00
Tankred Hase ec7e8cbd68 Add rubber band scrolling in dropdown on iOS 2015-04-15 12:03:46 +02:00
Tankred Hase d0f002bfd1 Hide error msg if public key verification does nto work 2015-04-14 18:46:08 +02:00
Tankred Hase 9841a59a9e Improve error message in public key verifier 2015-04-14 17:59:26 +02:00
Tankred Hase 1ffcaf5487 Added node.js 0.12 to travis.yml 2015-04-13 14:38:34 +02:00
Felix Hammerl 150a3c7888 [WO-905] Add IMAP compression 2015-04-12 23:43:13 +02:00
Tankred Hase 1af3eac566 Merge pull request #318 from whiteout-io/dev/WO-914
[WO-914] Limit dropdown folder list in width and size
2015-04-09 16:41:20 +02:00
Felix Hammerl e437a95baa [WO-914] Limit dropdown folder list in width and size 2015-04-09 16:33:59 +02:00
Tankred Hase 2828771c2b Merge pull request #256 from whiteout-io/dev/styleguide
Dev/styleguide
2015-04-09 15:12:06 +02:00
Felix Hammerl 2148d06d49 Copy all iOS icons in post-build step 2015-04-09 14:58:12 +02:00
Mario Volke dca2f4ead9 Add styleguide for basic components 2015-04-09 14:58:08 +02:00
Mario Volke 8807830122 Add basic layout and styling to styleguide 2015-04-09 14:58:08 +02:00
Mario Volke 69ed386765 Add styleguide to grunt dist and watch 2015-04-09 14:58:08 +02:00
Mario Volke e6147e1fdc Add basic styleguide workflow with assemble 2015-04-09 14:58:08 +02:00
Tankred Hase 1d64c2dfb0 Fix visible outbox on startup 2015-04-09 14:46:33 +02:00
Tankred Hase e5f281c124 Merge branch 'master' of github.com:whiteout-io/mail-html5 2015-04-09 14:34:36 +02:00
Tankred Hase 06d772159b [WO-919] Fix chrome rendering error in writer subject box 2015-04-09 14:34:10 +02:00
Tankred Hase ff72822e36 Update README.md 2015-04-08 16:05:23 +02:00
Tankred Hase 09ff51f329 Update README.md 2015-04-08 16:04:38 +02:00
Tankred Hase a2442554ad Bump mobile manifest version code 2015-04-07 18:07:48 +02:00
Tankred Hase 153d0626d2 Remove meta tag CSP directive from index.html since cca inject it by default now 2015-04-07 18:05:55 +02:00
Tankred Hase 222b7d35e3 Merge pull request #316 from whiteout-io/dev/WO-895
Dev/wo 895
2015-04-07 17:16:31 +02:00
Tankred Hase 07e0f39b55 Add update script for DB version 6 2015-04-07 17:15:38 +02:00
Tankred Hase 73febe287e Simplify spinner code 2015-04-07 16:45:51 +02:00
Tankred Hase abbd893438 Merge branch 'dev/WO-895' of github.com:whiteout-io/mail-html5 into dev/WO-895 2015-04-07 16:14:48 +02:00
Tankred Hase d67e0531d5 Prevent selection of unloaded message 2015-04-07 16:14:40 +02:00
Tankred Hase 210ab61ba1 Upgrade to imap-client v0.13.0 2015-04-07 16:13:51 +02:00
Tankred Hase b752269c68 Show spinner for loading messages 2015-04-07 15:59:41 +02:00
Felix Hammerl d8fb06cb08 [WO-895] Add paging and prefetching 2015-04-07 15:18:20 +02:00
Tankred Hase 88e83b6511 Improve error message upon private key import 2015-04-07 12:51:36 +02:00
Tankred Hase 1b8c6b6b8d [WO-906] Show confirm dialog for mobile phone number in account creation 2015-04-01 18:29:23 +02:00
Tankred Hase 8295806b1f Simplify public key verification screen 2015-04-01 17:42:45 +02:00
Tankred Hase c30fbe8b6b Hide 'openpgp_keys' imap folder 2015-04-01 17:36:06 +02:00
Tankred Hase 5a8d7d8324 Remove word 'beta' in signup screens 2015-04-01 17:10:13 +02:00
Tankred Hase c9981239c8 Merge pull request #317 from whiteout-io/dev/WO-885
Implement encrypted private key imap sync
2015-04-01 14:39:50 +02:00
Tankred Hase c8f13511c1 Review imap key-sync 2015-04-01 14:24:46 +02:00
Tankred Hase f41e6e12b9 Upgrade to imap-client v0.12.0 2015-04-01 12:43:54 +02:00
Tankred Hase 809de91354 [WO-895] Implement encrypted private key imap sync
* Add copy and paste private key import during setup
* Simplify key setup screen (login-initial) import option
* Make checkbox background color white
2015-04-01 00:48:16 +02:00
Tankred Hase 220b8af509 Link architecture image to in README 2015-03-18 14:23:13 +01:00
Tankred Hase 1d57b004d1 Move openpgp dependency to devDependencies in package.json 2015-03-18 14:11:24 +01:00
Tankred Hase 518ceec0ef Merge pull request #313 from whiteout-io/dev/WO-860
[WO-860] Introduce publickey-verifier
2015-03-18 13:23:35 +01:00
Felix Hammerl 1d4a9414bb [WO-860] Introduce publickey-verifier 2015-03-18 13:15:22 +01:00
Tankred Hase 0304bbf8fe Upgrade to OpenPGP.js v1.0.0 2015-03-15 11:46:56 +01:00
Tankred Hase 6ceb877472 Dont try to connect to imap when navigator is offline 2015-03-04 14:16:44 +01:00
Tankred Hase 1806f78ef3 Fix tabindexes for input fields 2015-03-01 19:11:16 +01:00
Tankred Hase 881b05df91 Switch name and password fields 2015-03-01 19:06:43 +01:00
Tankred Hase 369ad58134 Fix read-control position 2015-02-27 16:03:00 +01:00
Felix Hammerl 5f19bbeff0 Bump Android version 2015-02-27 12:23:37 +01:00
Tankred Hase 1c361e9c85 Clean up text in login html templates 2015-02-24 14:10:21 +01:00
Felix Hammerl 888204e1b9 Put read controls before reader content 2015-02-20 19:10:57 +01:00
Tankred Hase 427dee8214 Fix aws release script 2015-02-20 16:41:38 +01:00
Tankred Hase e089139474 bump adroid version code 2015-02-20 16:13:07 +01:00
Tankred Hase 6873fd7f3d Merge pull request #299 from whiteout-io/dev/WO-854
Show invite dialog in writer when recipient has no public key
2015-02-20 16:01:38 +01:00
Tankred Hase 9bc2bc7912 Show invite dialog in writer when recipient has no public key 2015-02-20 16:00:04 +01:00
Felix Hammerl 9aebecd45f Merge pull request #298 from whiteout-io/dev/wo-897
Use iframe-resizer
2015-02-19 12:45:40 +01:00
Tankred Hase 9d68b6475c Use iframe-resizer
* dynamically resize iframe based on content
* scroll on complete read-view instead of just iframe-content
* open writer when email address is clicked in iframe
* convert tabs to spaces in read-directive file
* Scale html mails to viewport only from the outside
* Delete release branch before each release in aws_release.sh script
* Make read-controls in read view always visible
2015-02-18 23:01:02 +01:00
Felix Hammerl 2c1e1f669e Merge pull request #296 from whiteout-io/dev/WO-865
Dev/wo 865
2015-02-18 17:00:08 +01:00
Tankred Hase 91693c62ad Refactor config.cloudUrl to config.keyServerUrl 2015-02-16 23:17:29 +01:00
Tankred Hase 93dc53f7b7 Add login to wmail on singup screen
Remove red border on required text input on Firefox
2015-02-16 23:17:01 +01:00
Tankred Hase 59dc2008a4 Fix regex for creating anchors from urls in reader 2015-02-16 21:53:41 +01:00
Tankred Hase 10cd2795f3 Upgrade to angular.js 1.3.13 2015-02-16 15:22:41 +01:00
Tankred Hase 9c6d618ddc Merge pull request #295 from whiteout-io/dev/WO-795
Dev/wo 795
2015-02-16 15:07:48 +01:00
Tankred Hase 163ad5db79 Bump email.js libs to promisified versions 2015-02-16 13:35:15 +01:00
Felix Hammerl 54d495d8d9 [WO-804] Fix bug where message cannot be parsed when deleted from IMAP 2015-02-16 13:33:02 +01:00
Felix Hammerl 0faa5b3743 Track emails by uid instead hashKey attribute 2015-02-16 13:33:02 +01:00
Felix Hammerl 2e3e07aa1d [WO-855] Fix trying to set a flag when email is deleted 2015-02-16 13:33:02 +01:00
Felix Hammerl 3da5a55251 [WO-795] Port to promises 2015-02-16 13:33:01 +01:00
Tankred Hase f28c7854c3 [WO-880] Use WebCrypto for native RSA keygen on iOS 2015-02-16 12:26:26 +01:00
Tankred Hase 57918bbd67 Use npm build of openpgp.js 2015-02-13 10:29:40 +01:00
Tankred Hase c26a51f83d Bump android versioncode 2015-02-11 15:25:23 +01:00
Tankred Hase 6938750803 Upgrade to OpenPGP.js v0.10.0 2015-02-11 14:37:14 +01:00
Felix Hammerl c94c419b38 Merge pull request #267 from whiteout-io/dev/WO-893
Dev/wo 893
2015-02-11 10:45:57 +01:00
Tankred Hase 5e246ee921 Fix invalid user id in PGP keys when realname is left empty 2015-02-10 18:37:41 +01:00
Tankred Hase 443cc3b59b Use keyserver.ubuntu.com for manual lookups in the app 2015-02-10 18:37:12 +01:00
Tankred Hase da639b5a69 bump mobile manifest version 2015-02-10 16:04:42 +01:00
Felix Hammerl 0d17701ebd Merge pull request #266 from whiteout-io/dev/WO-889
Dev/wo 889
2015-02-10 15:36:19 +01:00
Tankred Hase 5bf0890c02 Ignore keys from HKP server in keychain.getUserKeyPair
Remove unused getPublicKeys function
2015-02-10 15:21:04 +01:00
Tankred Hase f8e5ea6d89 Revert "[WO-878] Do not force import of private key for HKP keys"
This reverts commit 4fe3ceaea2.
2015-02-10 14:36:30 +01:00
Tankred Hase 7ffb7ca148 Remove spellcheck in keychain code input fields 2015-02-09 17:28:54 +01:00
Tankred Hase 5121347640 Update icons in Firefox App manifest 2015-02-08 12:31:29 +01:00
Tankred Hase 2c092b0240 Add native scrolling to contacts on iOS 2015-02-05 09:50:40 +01:00
Tankred Hase 2875228359 Bump android version code 2015-02-05 09:19:00 +01:00
Tankred Hase 274c23ea4c Merge pull request #261 from whiteout-io/dev/WO-878
[WO-878] Do not force import of private key for HKP keys
2015-02-04 11:27:11 +01:00
Felix Hammerl 4fe3ceaea2 [WO-878] Do not force import of private key for HKP keys 2015-02-03 22:48:11 +01:00
Tankred Hase ff587672d9 Bump android version code 2015-02-03 13:49:10 +01:00
Tankred Hase fef264248d Merge pull request #259 from whiteout-io/dev/WO-862
Dev/wo 862
2015-02-03 13:38:39 +01:00
Tankred Hase 9a9b0d4cea Change search to filter in contacts lightbox 2015-02-03 13:38:13 +01:00
Tankred Hase c93eaf17f3 Implement HKP server support
* Add public key import lightbox for copy and paste
* Fix refresh of pgp key change in keychain
* Display additional contacts info
* Filter by name and email addres in autocomplete
* Accept all file endings for key import

Accept all types of files for key import
2015-02-02 20:15:10 +01:00
Tankred Hase 038437595e Merge pull request #255 from whiteout-io/dev/WO-851
[WO-851] Request OAuth token on each connection request
2015-02-02 16:50:12 +01:00
Felix Hammerl 0446f8219b [WO-851] Request OAuth token on each connection request 2015-02-02 16:08:27 +01:00
Tankred Hase 86653e8700 Merge pull request #257 from whiteout-io/dev/WO-857
[WO-857] improved error reporting after XHR
2015-02-02 15:43:56 +01:00
Felix Hammerl 900294a13d [WO-857] improved error reporting after XHR 2015-01-27 12:26:07 +01:00
Felix Hammerl 990950bc48 Merge pull request #254 from whiteout-io/dev/WO-852
Use realname in PGP keygen
2015-01-22 12:14:17 +01:00
Tankred Hase 978822ae55 Merge pull request #250 from whiteout-io/dev/WO-765
[WO-765] do not multiplex sockets through single websocket
2015-01-21 12:18:52 +01:00
Tankred Hase 75a382190a Update package.json 2015-01-21 12:18:08 +01:00
Tankred Hase 6ad3b7402e Use realname in PGP keygen 2015-01-20 13:15:03 +01:00
Tankred Hase 6a525ae643 Add comment in setup for SMS validation 2015-01-20 12:44:45 +01:00
Felix Hammerl 55ab661582 bump dependencies 2015-01-19 12:04:30 +01:00
Felix Hammerl 7c9e8e6a4e Merge pull request #253 from whiteout-io/dev/WO-788
Improve readability of text in desktop mail-list
2015-01-19 11:39:25 +01:00
Tankred Hase 295c781b62 Improve readability of text in desktop mail-list 2015-01-19 10:56:16 +01:00
Felix Hammerl b7072648b7 Merge pull request #252 from whiteout-io/dev/WO-790
Hide unread count for sent folder
2015-01-19 10:44:24 +01:00
Felix Hammerl 753cd1a4d7 Merge pull request #251 from whiteout-io/dev/WO-773
Dev/wo 773
2015-01-19 10:34:47 +01:00
Tankred Hase 281f4a94cd Hide unread count for sent folder 2015-01-19 10:12:01 +01:00
Tankred Hase c271dc91dc Remove redundant directives in write view 2015-01-19 10:05:05 +01:00
Tankred Hase fc6b21e63a Fix spinner in key sync 2015-01-19 10:03:57 +01:00
Felix Hammerl 2be7beb3a1 [WO-765] do not multiplex sockets through single websocket 2015-01-15 17:42:53 +01:00
Tankred Hase d3b54187cb Seperate PGP fingerprint w/ spaces to make it more readable 2015-01-15 16:19:22 +01:00
Felix Hammerl c165ced523 Merge pull request #249 from whiteout-io/dev/WO-690
Fetch message contents when leaving read mode
2015-01-15 11:36:56 +01:00
Tankred Hase d7a4058644 Fetch message contents when leaving read mode 2015-01-15 10:23:15 +01:00
Tankred Hase 7d266e6a79 Delete unrequired underscore-min.js 2015-01-14 18:36:01 +01:00
Tankred Hase a07ee38fdb bump android version code 2015-01-13 18:52:02 +01:00
Tankred Hase c660883a24 Merge pull request #247 from whiteout-io/dev/WO-757
Add phone number validation in wmail signup
2015-01-13 12:11:48 +01:00
Mario Volke 8ce33f9573 Fix flex-grow in multi col form 2015-01-13 12:08:06 +01:00
Tankred Hase 9d420f3cdc Add phone number validation in wmail signup 2015-01-13 11:32:44 +01:00
Tankred Hase 802f9619cf Update README.md 2015-01-13 10:20:10 +01:00
Felix Hammerl 242d067141 Merge pull request #246 from gitter-badger/gitter-badge
Add a Gitter chat badge to README.md
2015-01-13 10:09:19 +01:00
The Gitter Badger b3942d9dce Added Gitter badge 2015-01-13 09:08:04 +00:00
Felix Hammerl b68bebaf12 [WO-806] fix date filter on iOS 2015-01-12 16:16:32 +01:00
Tankred Hase fb0454142c Fix typos 2015-01-12 14:50:58 +01:00
Tankred Hase d41ed34837 Merge pull request #245 from whiteout-io/dev/WO-808
Dev/wo 808
2015-01-12 13:17:03 +01:00
Felix Hammerl 66cf02bcb3 Adapt resolution of Whiteout icon to platforms 2015-01-12 11:30:23 +01:00
Felix Hammerl f1ba11abc3 Remove status bar tweak from background.js 2015-01-12 11:15:50 +01:00
Felix Hammerl b3afa745c3 Copy missing icons @3x icons to iOS project 2015-01-10 13:16:03 +01:00
Felix Hammerl c7195db4ca Copy splash screens in build script 2015-01-10 12:51:43 +01:00
Felix Hammerl 873f4ea1c9 Ignore splash screens in appcache manifest 2015-01-10 12:51:16 +01:00
Felix Hammerl e3643717fe [WO-810] Add splash screens 2015-01-10 12:38:09 +01:00
Felix Hammerl ab18cdd5f8 Tweak cordova config status bar settings 2015-01-10 01:39:04 +01:00
Tankred Hase 087d4e66d5 Add W3C app manifest and theme color to index.html 2015-01-09 18:01:22 +01:00
Tankred Hase e01b1ac965 Upgrade to forge 0.6.20 2015-01-09 12:35:04 +01:00
Tankred Hase 00914cb3be Merge pull request #243 from whiteout-io/dev/WO-591
Dev/wo 591
2015-01-08 15:09:05 +01:00
Felix Hammerl 8412973c38 Exclude app icons from appcache manifest 2015-01-08 15:07:32 +01:00
Tankred Hase b62c551b8b Merge pull request #244 from whiteout-io/dev/WO-805
[WO-805] Do not attempt to write to undefined when folders are not yet loaded
2015-01-08 14:47:50 +01:00
Felix Hammerl b0476989fb [WO-805] Do not attempt to write to undefined when folders are not yet loaded 2015-01-08 13:54:30 +01:00
Felix Hammerl dc02cb1da4 Add img/ path prefix to android icons 2015-01-08 13:44:26 +01:00
Felix Hammerl bb206bc700 Set Bundle Version to 1 2015-01-08 13:44:26 +01:00
Felix Hammerl 1378c7b069 [WO-591] create a boatload of icons in all sizes for all platforms 2015-01-08 13:43:35 +01:00
Felix Hammerl 137c6fe971 Merge pull request #242 from whiteout-io/dev/hotfix-grunt-icons
Exclude all.svg from grunt svgstore
2015-01-08 13:39:26 +01:00
Mario Volke 6dc6442b9d Exclude all.svg from grunt svgstore 2015-01-08 13:32:12 +01:00
Tankred Hase 8dbdb030db Merge pull request #199 from seriousmumbo/patch-1
added path & updated filename for Chrome App
2015-01-08 13:00:21 +01:00
Tankred Hase 95ce49279d Merge pull request #165 from mpmks11/patch-3
Update README.md
2015-01-08 12:56:36 +01:00
Tankred Hase 36b0096973 Add id to chrome.window api to remember position and size 2015-01-02 12:53:27 +01:00
Tankred Hase bd327db4e8 Updated cca release scripts for cca 0.5.1 2014-12-19 17:05:56 +01:00
Tankred Hase 6dffba9ff3 bump android versionCode 2014-12-19 15:32:09 +01:00
Tankred Hase 37fb3f5f8d Merge pull request #235 from whiteout-io/dev/WO-766
Dev/wo 766
2014-12-19 15:29:40 +01:00
Tankred Hase b44d0a222a Fix bug where notiifcation api is not supported 2014-12-19 14:22:46 +01:00
Tankred Hase 3cc0a372e1 Update to angular 1.3.7 2014-12-19 12:00:32 +01:00
Tankred Hase 6a9603cb69 Reset showBugReporter in dialog before each display 2014-12-19 12:00:06 +01:00
Tankred Hase cddc0988b7 Fix bug for password decrypt in auth service 2014-12-19 11:21:57 +01:00
Tankred Hase b01aa6716c Review 2014-12-18 16:50:11 +01:00
Tankred Hase 6a8c24d813 Fix conrtoller unit tests 2014-12-18 15:25:20 +01:00
Tankred Hase 383761e6cb Fix redirect bug in login ctrl 2014-12-18 15:25:20 +01:00
Tankred Hase 6beddf4760 Begin conrtoller unit tests 2014-12-18 15:25:20 +01:00
Tankred Hase eab07041f0 Refactor app controllers 2014-12-18 15:25:20 +01:00
Tankred Hase 085b104521 Refactor all login controllers to promises 2014-12-18 15:25:20 +01:00
Tankred Hase ea74f3443c WIP: start refactoring login controllers 2014-12-18 15:25:20 +01:00
Tankred Hase bfe827e084 Refactor integration tests for promises 2014-12-18 15:25:19 +01:00
Tankred Hase c5a8e1c119 Test email dao 2014-12-18 15:25:19 +01:00
Tankred Hase e5c602cee0 WIP: refactor email service 2014-12-18 15:25:19 +01:00
Tankred Hase 2af599c0ad Refactor account service 2014-12-18 15:25:19 +01:00
Tankred Hase 993ca8eac7 Refactor outbox 2014-12-18 15:25:19 +01:00
Tankred Hase bc41486693 Use native promises in crypto services 2014-12-18 15:25:19 +01:00
Tankred Hase e32456c3db Refactor keychain dao 2014-12-18 15:25:19 +01:00
Tankred Hase a80169ebe2 WIP: started refactoring keychain 2014-12-18 15:25:19 +01:00
Tankred Hase 26553e49d7 Refactor auth 2014-12-18 15:25:19 +01:00
Tankred Hase 15b902acf6 Refactor admin and privatekey dao 2014-12-18 15:25:18 +01:00
Tankred Hase cc886ad402 Use native promise api in services 2014-12-18 15:25:18 +01:00
Tankred Hase 7bb69c76b6 Refactor oauth 2014-12-18 15:25:18 +01:00
Tankred Hase 88a48ec540 Refactor crypto module 2014-12-18 15:25:18 +01:00
Tankred Hase f4fe1a36a6 Refactor update scripts 2014-12-18 15:25:18 +01:00
Tankred Hase dab09f1068 Refactor connection doctor 2014-12-18 15:25:18 +01:00
Tankred Hase cb1c4fd0ed WIP: start refactoring auth service to promises 2014-12-18 15:25:18 +01:00
Tankred Hase a58448483a Test public key dao 2014-12-18 15:25:18 +01:00
Tankred Hase 3944b1741e Test device storage dao 2014-12-18 15:25:18 +01:00
Tankred Hase fb89ffd35a Fix rest dao and invitation dao 2014-12-18 15:25:17 +01:00
Tankred Hase 67adf4a1b8 Fix error handling in lawnchair dao 2014-12-18 15:25:17 +01:00
Tankred Hase 7aa0d2cf4a Test lawnchair dao
Test pgp promise api
2014-12-18 15:25:17 +01:00
Tankred Hase 502c6b7467 Refactor lawnchair dao to promises 2014-12-18 15:25:17 +01:00
Tankred Hase 01e0529854 Refactor pgp service to use promises 2014-12-18 15:25:17 +01:00
Tankred Hase f9f086d622 Refactor public key service to use promises 2014-12-18 15:25:17 +01:00
Tankred Hase 99c2f24d7d Refactor rest dao to use promises 2014-12-18 15:25:17 +01:00
Felix Hammerl ce07f30252 use imap-client v0.9.0 2014-12-18 15:22:10 +01:00
Andris Reinman 7b698e52b0 Merge pull request #234 from whiteout-io/dev/WO-785
use imap-client v0.9.0
2014-12-18 14:59:22 +02:00
Felix Hammerl 3ec4ad46e5 use imap-client v0.9.0 2014-12-18 12:44:34 +01:00
Tankred Hase b5380bbef3 Merge pull request #233 from whiteout-io/dev/WO-673
[WO-673] Remove cruft from lawnchair
2014-12-18 12:37:46 +01:00
Felix Hammerl 10c3748249 [WO-673] Remove cruft from lawnchair 2014-12-18 12:37:00 +01:00
Tankred Hase 1979903943 Merge pull request #231 from whiteout-io/dev/WO-793
Sticky footer in desktop nav
2014-12-18 12:31:25 +01:00
Mario Volke a5c6400601 Sticky footer in desktop nav 2014-12-18 12:17:34 +01:00
Tankred Hase 67384695f1 Update license links 2014-12-17 10:37:35 +01:00
Tankred Hase ad9990a0ce Update README.md 2014-12-12 18:41:18 +01:00
Tankred Hase 67a9c07f7a Merge pull request #228 from whiteout-io/dev/WO-786
[WO-786] Select inbox after onConnect
2014-12-12 10:49:59 +01:00
Tankred Hase 276a82e5ef Review navigation 2014-12-12 10:49:16 +01:00
Felix Hammerl c3efeb1132 [WO-786] Select inbox after onConnect 2014-12-12 10:19:38 +01:00
Tankred Hase 8c88f25875 Add comments to app.js 2014-12-11 10:28:23 +01:00
Felix Hammerl 738d2671f7 Merge pull request #227 from whiteout-io/dev/cleanup
Move directives to seperate files, cleanup app.js
2014-12-11 10:05:02 +01:00
Tankred Hase 3cd0bcc513 Move directives to seperate files, cleanup app.js 2014-12-10 21:41:16 +01:00
Tankred Hase 6eeba1ad2f Update app.js 2014-12-10 20:58:32 +01:00
Tankred Hase fdb94e4e20 bump firefox app version 2014-12-09 18:16:30 +01:00
Felix Hammerl 0b53886889 Merge pull request #225 from whiteout-io/dev/openpgpjs_0.9
Upgrade to openpgp.js v0.9.0
2014-12-09 17:25:51 +01:00
Tankred Hase 8340584de9 Upgrade to openpgp.js v0.9.0 2014-12-09 16:43:41 +01:00
Tankred Hase 30c2c19652 Update download link 2014-12-08 18:54:38 +01:00
Tankred Hase 420bcbcaa8 Add screenshot 2014-12-08 18:53:04 +01:00
Tankred Hase 17c082e21b Increment android version code 2014-12-05 17:49:42 +01:00
Tankred Hase e00f2ecb3d Close read mode after replying to a message 2014-12-05 17:02:19 +01:00
Tankred Hase 6f794ff26d Fix changing folder in chrome app 2014-12-05 16:57:53 +01:00
Tankred Hase 2272f3d58f Merge pull request #221 from whiteout-io/dev/WO-707
Dev/wo 707
2014-12-05 13:04:32 +01:00
Tankred Hase dcfcd74373 Review url/history 2014-12-05 13:04:10 +01:00
Tankred Hase f735430c68 Delete obsolete qunit deps from test 2014-12-04 18:56:44 +01:00
Tankred Hase 68d464483e Merge pull request #219 from whiteout-io/dev/WO-784
Allow line break in page footer
2014-12-04 16:54:55 +01:00
Tankred Hase 43eb385a14 Update readme 2014-12-04 16:47:14 +01:00
Tankred Hase df9ba7fd66 Use status service to close read mode from action bar 2014-12-04 16:36:29 +01:00
Tankred Hase 33b30221f7 Add comments for code regions in controllers 2014-12-04 16:05:26 +01:00
Tankred Hase eb4bc13e3f Add wo-touch-active class to mail-list item 2014-12-04 13:03:36 +01:00
Tankred Hase 175b97f7a2 Prevent CSP warnings for click handlers 2014-12-04 12:47:57 +01:00
Tankred Hase 4622ebd8d9 Use url query params to trak state in the app 2014-12-04 12:46:55 +01:00
Tankred Hase 95cbe0ea11 Display mail-list scrollbar in desktop mode 2014-12-03 19:06:35 +01:00
Tankred Hase 987ddbd796 Move dummy folders to dummy service 2014-12-03 19:05:54 +01:00
Mario Volke 7752675ec3 Allow line break in page footer 2014-12-03 17:33:19 +01:00
Tankred Hase 170b01d5f1 Merge pull request #218 from whiteout-io/dev/WO-708-fix
Handle paste event in woInputCode
2014-12-03 17:24:40 +01:00
Mario Volke ee313d3765 Handle paste event in woInputCode 2014-12-03 16:24:58 +01:00
Tankred Hase c012f54c89 WIP: start new routing 2014-12-03 16:16:49 +01:00
Tankred Hase e06fff4385 Merge pull request #217 from whiteout-io/dev/WO-751
[WO-751] Change naming from favorite to flag
2014-12-03 15:58:39 +01:00
Tankred Hase fee1151952 Merge pull request #151 from whiteout-io/dev/WO-633
[WO-633] angular template minification
2014-12-03 15:49:10 +01:00
Felix Hammerl 5e29c707e0 [WO-751] Change naming from flag to star 2014-12-03 15:31:05 +01:00
Mario Volke 5ac7955721 Fix missing icons in nav due to chrome bug with <use> and angular directives 2014-12-03 12:52:10 +01:00
Mario Volke b5e305534e trigger ngtemplates on template change in watch task 2014-12-03 12:42:06 +01:00
Mario Volke f0f215ad5b angular template minification
Conflicts:
	Gruntfile.js
2014-12-03 12:42:06 +01:00
Felix Hammerl 7d3e6b0f2f [WO-751] Change naming from favorite to flag 2014-12-03 10:46:42 +01:00
Tankred Hase 9d8fc023ca Merge pull request #216 from whiteout-io/dev/WO-751
[WO-751] Add flagging messages
2014-12-03 09:46:18 +01:00
Tankred Hase 6a17c5a77f Increase clickable area around star, rename action bar buttons 2014-12-03 09:45:00 +01:00
Felix Hammerl 46acefd3bc [WO-751] Add flagging messages 2014-12-02 18:36:52 +01:00
Felix Hammerl dafe584d48 Override proxy port restrictions in development mode 2014-12-02 14:39:46 +01:00
Tankred Hase 2a6d4e0d9b Merge pull request #215 from whiteout-io/dev/WO-768
Implement move to junk
2014-12-02 10:57:02 +01:00
Tankred Hase 97f1132023 Implement move to junk 2014-12-02 10:55:22 +01:00
Felix Hammerl c3b3efa696 Merge pull request #213 from whiteout-io/dev/WO-770
Broadcast search event from action bar to filter mail-list
2014-12-01 18:10:00 +01:00
Tankred Hase e8e69ad32d Broadcast search event from action bar to filter mail-list 2014-12-01 17:33:09 +01:00
Felix Hammerl 32cc2806e9 [WO-746] Mark credentials dirty before storing updated certificate 2014-12-01 17:18:54 +01:00
Felix Hammerl 4edf79d8c4 [WO-778] Fix crypto initialization 2014-12-01 16:42:30 +01:00
Felix Hammerl 51715822f8 Merge pull request #212 from whiteout-io/dev/WO-767
[WO-767] Initialize lawnchair asynchronously during startup
2014-12-01 15:11:17 +01:00
Felix Hammerl 251264835f [WO-767] Initialize lawnchair asynchronously during startup 2014-12-01 14:55:06 +01:00
Tankred Hase 47270b659c Merge pull request #211 from whiteout-io/dev/WO-708
Dev/wo 708
2014-12-01 13:26:13 +01:00
Tankred Hase 189c82159f Fix unit tests 2014-12-01 13:25:25 +01:00
Tankred Hase 13c6061589 Merge pull request #210 from whiteout-io/dev/WO-745
[WO-745] Adapt changes in imap-client v0.8.0
2014-12-01 12:02:26 +01:00
Tankred Hase 876a0b0302 Integrate wo-input-code directive 2014-12-01 11:53:45 +01:00
Mario Volke d15d45a16c added woInputCode directive 2014-12-01 10:49:37 +01:00
Tankred Hase a999d26c29 Merge pull request #206 from whiteout-io/dev/WO-772
fix wrong respond-to breakpoints
2014-12-01 10:47:26 +01:00
Felix Hammerl a177503bdd [WO-745] Adapt changes in imap-client v0.8.0 2014-12-01 10:45:41 +01:00
Mario Volke 4ca25fc86f fix back button in read view on desktop 2014-12-01 10:36:00 +01:00
Mario Volke 15a222a6ae fix wrong respond-to breakpoints 2014-12-01 10:36:00 +01:00
Tankred Hase 9bee0f3def Merge pull request #209 from whiteout-io/dev/WO-776
Show time of day instead of date for today in mail-list
2014-12-01 10:09:49 +01:00
Mario Volke da3a128cf1 Show time of day instead of date for today in mail-list 2014-12-01 10:04:20 +01:00
Tankred Hase 81a2d64835 Use in dialog service instead of controller 2014-11-29 14:46:16 +01:00
Tankred Hase 5b4d7bcd4a Merge pull request #193 from whiteout-io/dev/WO-721
refactor keyfilBtn for broader usage
2014-11-29 13:03:59 +01:00
Tankred Hase 6668174852 Use wo-click-file-input directive for attachment input as well 2014-11-29 13:03:09 +01:00
Mario Volke ac7af7168b refactor keyfilBtn for broader usage 2014-11-29 12:53:56 +01:00
Tankred Hase c7463cd185 Merge pull request #207 from whiteout-io/dev/WO-771
make text-input height more constistent with buttons
2014-11-29 12:47:01 +01:00
Mario Volke d985054fcd Add search--light modifier to align with btn--light in action bar 2014-11-29 12:43:51 +01:00
Tankred Hase 92a8348ea7 Merge pull request #208 from whiteout-io/dev/WO-774
fix touch events in woDropdown
2014-11-29 11:58:42 +01:00
Mario Volke 7443dcad99 fix touch events in woDropdown 2014-11-29 10:33:48 +01:00
Tankred Hase b4884e4956 Merge pull request #205 from whiteout-io/dev/WO-727
Dev/wo 727
2014-11-27 19:46:42 +01:00
Tankred Hase 26bc7c91fc Reviewed reworked SVG icons and use old icons for some cases 2014-11-27 19:45:47 +01:00
Mario Volke 9f981f8168 make search icon smaller to fit previous style 2014-11-27 19:10:29 +01:00
Mario Volke e66d450b81 refactor icons to same viewbox 2014-11-27 19:10:29 +01:00
Mario Volke 2a6cce858c remove duplicate trash icon 2014-11-27 19:10:29 +01:00
Mario Volke 3b1df177b9 fix svgs 2014-11-27 19:10:28 +01:00
Tankred Hase 45c4bbc525 Import reworked SVG icons 2014-11-27 19:10:28 +01:00
Tankred Hase e2e15f9a3d Add logout and outbox icons in nav template 2014-11-27 19:10:28 +01:00
Tankred Hase 620fd51aa3 Merge pull request #192 from whiteout-io/dev/WO-760
add horizontal padding to mail-list footer in mobile/tablet mode
2014-11-27 19:02:09 +01:00
Tankred Hase d0460bf4f3 Optimize account and set-passphrase dialogs 2014-11-27 19:00:30 +01:00
Tankred Hase e70b874dc3 Merge pull request #189 from whiteout-io/dev/WO-749
Force line break in account view
2014-11-27 18:42:00 +01:00
Tankred Hase 520268e357 Merge pull request #191 from whiteout-io/dev/WO-750
increase clickable area around checkbox in desktop mail-list
2014-11-27 18:40:52 +01:00
Tankred Hase ad794454ab adjust padding around checkbox 2014-11-27 18:39:56 +01:00
Mario Volke 941283bfb6 increase clickable area around checkbox in desktop mail-list 2014-11-27 18:32:29 +01:00
Tankred Hase 04da07813a Remove unlocked icon for decrypted message 2014-11-27 18:28:03 +01:00
Tankred Hase 324d252628 Merge pull request #190 from whiteout-io/dev/WO-740
fix whitelisting of lightbox for ngAnimate
2014-11-27 18:23:45 +01:00
Tankred Hase 28b0558129 Merge pull request #204 from whiteout-io/dev/WO-679
[WO-679] Include navigator.userAgent and app version in bug report
2014-11-27 16:37:28 +01:00
Felix Hammerl cb4d27e58f [WO-679] Include navigator.userAgent and app version in bug report 2014-11-27 16:32:07 +01:00
Felix Hammerl c0ee4a7db7 Merge pull request #203 from whiteout-io/dev/WO-722
Dev/wo 722
2014-11-27 16:26:31 +01:00
Felix Hammerl aff71d506b Add focus-me directive 2014-11-27 16:23:42 +01:00
Felix Hammerl b57be79b00 Add whitespace before FAQ link 2014-11-27 16:22:27 +01:00
Felix Hammerl fb21de8035 remove todo in validate-phone.js 2014-11-27 15:59:32 +01:00
Felix Hammerl bd13a993a2 remove timeout from imap and smtp 2014-11-27 15:24:15 +01:00
Tankred Hase 0d90af5ec1 Fix bug where read mode is closed after marking email as read 2014-11-27 15:15:44 +01:00
Felix Hammerl 12e65e0011 Fix email dao integration test 2014-11-27 14:52:57 +01:00
Tankred Hase f8f7588c93 Fix integration test setup and teardown... some tests stil fails 2014-11-27 13:55:40 +01:00
Tankred Hase f740b27659 Fix read-sandbox build 2014-11-26 21:29:02 +01:00
Tankred Hase 2f25557747 Use angular events to broadcast status updates 2014-11-26 21:12:40 +01:00
Tankred Hase 32d3ea1801 Fix unit tests 2014-11-26 19:51:15 +01:00
Tankred Hase b3b947f6e5 Fix several minor runtime bugs in the app 2014-11-26 17:57:14 +01:00
Tankred Hase 2b6da522c6 Fix last unit tests 2014-11-26 13:43:10 +01:00
Tankred Hase 03b2e10bc3 Fix mail-list-ctrl unit test and move functions to services 2014-11-26 12:59:44 +01:00
Tankred Hase 1c1a5a4d54 Remove unnecessary bind in dialog service 2014-11-26 12:50:16 +01:00
Tankred Hase 156cff1854 Merge pull request #200 from whiteout-io/dev/WO-722-minor-fixes
Multiple minor fixes
2014-11-26 09:16:55 +01:00
Tankred Hase eb099d9bfe Update lawnchair.js 2014-11-26 09:14:03 +01:00
Tankred Hase c8665bc786 Begin fixing controller unit tests 2014-11-25 18:19:40 +01:00
Felix Hammerl 2764c6e230 Multiple minor fixes
* Fix dialog service instance binding
* Fix service/factory handling
* Inject userStorage lawnchair adapter to keychain service
2014-11-25 17:46:33 +01:00
Tankred Hase 2a2058c167 Finish testing account service 2014-11-25 12:07:26 +01:00
seriousmumbo 34e3a3fe46 added path & updated filename for Chrome App 2014-11-24 16:02:06 -07:00
Tankred Hase 7f6410e1f8 Write account.init unit test 2014-11-24 18:07:09 +01:00
Tankred Hase c8980f6f51 Start writing account test 2014-11-21 17:25:55 +01:00
Tankred Hase f2fee61d3b Fix unit tests for existing angular services 2014-11-21 15:06:29 +01:00
Tankred Hase 881afbff40 Fis all util service tests 2014-11-21 13:33:22 +01:00
Tankred Hase 3342b91d3f Move unit tests to subdirectories 2014-11-21 12:14:28 +01:00
Tankred Hase cb5431dc16 Write dialog unit test 2014-11-21 12:13:06 +01:00
Tankred Hase 198118571f Fix angular bootstrap errors 2014-11-20 22:53:30 +01:00
Tankred Hase 7eeff8ec75 Fix build errors... still runtime errors though 2014-11-20 15:51:55 +01:00
Mario Volke 5109ccd899 add horizontal padding to mail-list footer in mobile/tablet mode 2014-11-20 15:15:57 +01:00
Tankred Hase da5a9e2c17 Refactor app controller to use new services 2014-11-20 15:14:39 +01:00
Mario Volke 1e752885d4 fix whitelisting of lightbox for ngAnimate 2014-11-20 14:12:08 +01:00
Mario Volke 9b10346cb9 force line break in account view 2014-11-20 13:52:39 +01:00
Tankred Hase 4c04ba4e74 Refactor login controllers and delete AppController 2014-11-19 20:54:59 +01:00
Tankred Hase e6b22bd0a0 Expose angular/common.js modules for util, app-config 2014-11-19 17:19:55 +01:00
Tankred Hase 1f5fa4ca41 Move controllers into subfolders 2014-11-19 15:53:05 +01:00
Tankred Hase da416f4329 Add TODO comments to controllers 2014-11-19 15:46:20 +01:00
Tankred Hase c221372ed4 Restructure architecture into angular modules and services 2014-11-19 15:23:10 +01:00
Tankred Hase 95ad15b0dd Export account service as common.js module 2014-11-19 15:15:57 +01:00
Tankred Hase 41879bf5b3 Refactor outbox to be an angular service 2014-11-18 20:28:10 +01:00
Tankred Hase a5da52c8a6 Move outbox to services 2014-11-18 20:22:51 +01:00
Tankred Hase 38d908995a Refactor BOs and utils to services 2014-11-18 20:19:29 +01:00
Tankred Hase ac09c7d91f Move auth, oauth, connection-doctor to service dir 2014-11-18 19:18:57 +01:00
Tankred Hase c8d56b4bd1 Expose previous DAOs as angular services and as common.js modules 2014-11-18 18:44:00 +01:00
Tankred Hase f7b7e174b0 Rename DAOs to services 2014-11-18 18:13:34 +01:00
Tankred Hase 628beb02e8 WIP: start new service architecture 2014-11-18 16:56:55 +01:00
Felix Hammerl f11d4e8df3 disarm socket timeout in integration tests 2014-11-18 16:33:59 +01:00
Felix Hammerl eabdeaf888 Fix corner case where email does not have modseq attribute 2014-11-18 16:33:59 +01:00
Tankred Hase 906909fd7d Merge pull request #188 from whiteout-io/dev/WO-724
Fix source maps in concat build
2014-11-18 14:58:55 +01:00
Tankred Hase 585ccf84a2 Fix source maps in concat build 2014-11-18 14:06:06 +01:00
Felix Hammerl b12c99fbfe Merge pull request #187 from whiteout-io/dev/WO-724
[WO-724] Optimise grunt build and watch tasks
2014-11-18 09:30:31 +01:00
Tankred Hase aed9d174a5 [WO-724] Optimise grunt build and watch tasks
* add grunt concat step before uglify
* split watch tasks for app and tests
2014-11-17 18:35:35 +01:00
Tankred Hase c85b6344fc Add beta ta to version 2014-11-14 13:19:06 +01:00
Felix Hammerl 3156fd9601 use imap-client v0.7.0 2014-11-14 12:40:40 +01:00
Felix Hammerl 21356ae9ac Merge pull request #185 from whiteout-io/dev/wo-731
[WO-731] Treat modseq values as numbers
2014-11-14 12:14:43 +01:00
Felix Hammerl 57f11f1108 Add settings.whiteout.io to URLs 2014-11-13 12:39:48 +01:00
Andris Reinman eb775525f5 [WO-731] Treat modseq values as numbers 2014-11-13 12:55:12 +02:00
Tankred Hase 3e54f66cb9 Fix contacts unit test 2014-11-12 20:56:28 +01:00
Tankred Hase c2df2abbb0 Merge pull request #175 from whiteout-io/dev/WO-718
add padding around encrypted icon in mobile mail list
2014-11-12 20:51:20 +01:00
Mario Volke 99fbd475f4 add padding around encrypted icon in mobile mail list 2014-11-12 20:50:16 +01:00
Tankred Hase 2440817cfa Remove unnecessary jpg images 2014-11-12 20:49:51 +01:00
Tankred Hase 97ec23c973 Merge pull request #174 from whiteout-io/dev/WO-717
Desktop mode: align folder icons text in nav
2014-11-12 20:43:16 +01:00
Tankred Hase 5e82b2382c Remove test string for folder names 2014-11-12 20:42:57 +01:00
Mario Volke 18dc3dbf37 Desktop mode: align folder icons text in nav 2014-11-12 20:37:39 +01:00
Tankred Hase 5d982fdcac Merge pull request #173 from whiteout-io/dev/WO-716
align back icon in mobile toolbar with text in reader
2014-11-12 20:36:05 +01:00
Mario Volke ea1e5c6380 align back icon in mobile toolbar with text in reader 2014-11-12 20:31:26 +01:00
Tankred Hase d4984aafa7 Merge pull request #172 from whiteout-io/dev/WO-714
bigger spinner and vcenter fix in read view
2014-11-12 20:30:08 +01:00
Tankred Hase 9c5bb31d66 Remove unneeded fingerprint scope var in contacts 2014-11-12 20:29:27 +01:00
Tankred Hase e1c594ce0f Use small spinner in read mode 2014-11-12 20:28:54 +01:00
Mario Volke a2cce31a1f bigger spinner and vcenter fix in read view 2014-11-12 20:07:43 +01:00
Tankred Hase 996730f160 Merge pull request #177 from whiteout-io/dev/WO-728
Display text body preview in desktop mode
2014-11-12 19:52:33 +01:00
Tankred Hase dfff273bf3 Increase width of sender in desktop mail list 2014-11-12 18:51:06 +01:00
Mario Volke 88370adbf3 added dash to desktop mail list as separator between body and subject 2014-11-12 18:38:10 +01:00
Mario Volke aaf3743665 Display text body preview in desktop mode 2014-11-12 18:38:10 +01:00
Mario Volke 82f02312ea change grey background to fit better into common app styling 2014-11-12 18:38:10 +01:00
Mario Volke 5eafb448c8 Desktop mode: mail-list read backgroung grau shade a bit lighter 2014-11-12 18:38:10 +01:00
Tankred Hase 77fc111ee8 Merge pull request #181 from whiteout-io/dev/WO-715
Tablet mode: overlay action-bar over read-view
2014-11-12 18:32:59 +01:00
Tankred Hase 42c259dea6 Fix margin between read-controls in tablet mode 2014-11-12 18:25:15 +01:00
Mario Volke 5113583707 Tablet mode: overlay action-bar over read-view (like before) and position top-right, remove border 2014-11-12 18:16:23 +01:00
Tankred Hase f8038ea735 Merge pull request #171 from whiteout-io/dev/WO-704
Refactor .write__submit to use .lightbox__controls
2014-11-12 18:09:24 +01:00
Tankred Hase 4d2cabc8c1 Remove resize triangle in writer body 2014-11-12 18:08:59 +01:00
Mario Volke f82c7c7480 use lightbox controls for write view 2014-11-12 17:57:49 +01:00
Tankred Hase fb3ca46017 Merge pull request #170 from whiteout-io/dev/WO-729
second lighter error color for buttons and labels
2014-11-12 17:52:49 +01:00
Mario Volke 68bcf9ebc7 second lighter error color for buttons and labels 2014-11-12 17:50:11 +01:00
Tankred Hase 7229923d70 Merge pull request #169 from whiteout-io/dev/WO-699
refactored focusMe directive into common directives as woFocusMe
2014-11-12 17:48:26 +01:00
Mario Volke 6e284dfd7e refactored focusMe directive into common directives as woFocusMe 2014-11-12 17:46:33 +01:00
Tankred Hase 70402d77a8 Merge pull request #184 from whiteout-io/dev/WO-711
Dev/wo 711
2014-11-12 17:41:04 +01:00
Mario Volke 38fce60e6c remove obsolete ng-animate css rules 2014-11-12 17:36:14 +01:00
Mario Volke f0b1d7934d make nav css transition more stable on iOS 2014-11-12 17:36:14 +01:00
Mario Volke aff3854cb9 activate ngAnimate for whitelisted classes only 2014-11-12 17:36:14 +01:00
Tankred Hase 64abd6ad63 Merge pull request #183 from whiteout-io/dev/WO-706
Dev/wo 706
2014-11-12 17:32:57 +01:00
Mario Volke 2bc96a5fb1 prepared new contact structure 2014-11-12 17:25:44 +01:00
Mario Volke 42c1bbc638 bugfix in utility gap classes 2014-11-12 17:25:44 +01:00
Mario Volke 8c84369e92 add more helpful utility classes 2014-11-12 17:25:44 +01:00
Tankred Hase 31a6091b25 Merge pull request #182 from whiteout-io/dev/form-cleanup
[WO-649] clean up login pages
2014-11-12 17:17:26 +01:00
Tankred Hase 4f12f2d0a7 Merge pull request #179 from whiteout-io/dev/WO-649
Dev/wo 649
2014-11-12 17:00:08 +01:00
Felix Hammerl 16308232ce Move ignoreUploadOnSent check to emailDao 2014-11-12 16:41:40 +01:00
Tankred Hase cf1f60fbf9 [WO-649] clean up login pages
* add spinners to all login pages
* use inline error messages in all form instead of scope.onError
* create newsletter service
2014-11-12 16:12:26 +01:00
Tankred Hase 082cbf192b Refactore services code style 2014-11-11 21:50:01 +01:00
Tankred Hase 1d22231e8a Move directives to directive folder 2014-11-11 21:48:46 +01:00
Tankred Hase 510f147b97 Use only mail-config service for imap/smtp config
* remove 'pinned' attribute from imap/smtp config
* remove 'provider' attribute from auth module
* add 'oauthDomains' to app-config
* remove all static server config from the app-config
2014-11-11 19:30:58 +01:00
Tankred Hase 11d7a26c31 Fix tests 2014-11-10 18:36:26 +01:00
Tankred Hase 1bfdafd6b1 Change angular-csp.css for version 1.3.2 2014-11-10 14:40:53 +01:00
Tankred Hase 4bfeb99b7b Fix formvalidation, integrate wmail account creation UI 2014-11-10 14:40:53 +01:00
Tankred Hase 4468c91242 Upgrade to angular 1.3.2 2014-11-10 14:40:52 +01:00
Tankred Hase 93bd548b46 Use promise api for 2014-11-10 14:40:52 +01:00
Tankred Hase 074914044d Add faq links and rework google/password login workflow 2014-11-10 14:40:52 +01:00
Tankred Hase 069628c62b WIP: start implementing add-account controller 2014-11-10 14:40:52 +01:00
Mario Volke 5884b1231f rewritten account lightbox without tables 2014-11-10 14:40:52 +01:00
Tankred Hase 4b73492aa5 Review changes 2014-11-10 14:40:52 +01:00
Mario Volke e06f602890 removed obsolete sass config variables 2014-11-10 14:40:52 +01:00
Mario Volke 915db579c4 Refactoring login screens and lightboxes,
added general form styling
2014-11-10 14:40:51 +01:00
Mario Volke e34da3bdbf refactored waiting cursor class to utility class 2014-11-10 14:40:51 +01:00
Mario Volke 900dbc8cb9 make error color more present 2014-11-10 14:40:51 +01:00
Tankred Hase eb3a266725 Merge pull request #160 from whiteout-io/dev/WO-710
Close dropdown after selection has been made
2014-11-10 13:58:52 +01:00
Mario Volke da872daa7d fix dropdown toggle with touchstart 2014-11-10 13:51:20 +01:00
Tankred Hase a6bd06f853 Merge pull request #161 from whiteout-io/dev/WO-712
Fix: Sender email address in mail-list item on mobile cut off on bottom
2014-11-10 13:46:07 +01:00
Tankred Hase b3f1f4b3fe Merge pull request #166 from whiteout-io/dev/WO-629
Dev/wo 629
2014-11-10 13:38:31 +01:00
Tankred Hase e8964cde39 [WO-629] implement move, delete, mark unread for desktop and mobile ui 2014-11-10 13:37:57 +01:00
mpmks11 acea305a5a Update README.md 2014-11-06 12:31:56 -08:00
Mario Volke 26e819c8e3 Fix: Sender email address in mail-list item on mobile cut off on bottom 2014-11-06 17:45:10 +01:00
Mario Volke fc66df8894 Close dropdown after selection has been made 2014-11-06 17:34:59 +01:00
Tankred Hase 2b15eabcd0 [WO-629] Replace href javascript:; by # to prevent CSP warning when clicking on an anchor 2014-11-06 16:28:46 +01:00
Tankred Hase 24a181cf8d [WO-629] Remove orderBy filter for folders in UI since it is done in js already 2014-11-06 16:28:46 +01:00
Tankred Hase 8cc84ef8c6 Merge pull request #157 from whiteout-io/dev/WO-660
[WO-660] Add \Flagged to message flags
2014-11-06 16:13:54 +01:00
Tankred Hase f62ad4b868 Update package.json 2014-11-06 16:01:40 +01:00
Tankred Hase 402bd80b34 Merge pull request #158 from whiteout-io/dev/WO-643
[WO-643] Refactor initialization workflow
2014-11-06 15:38:29 +01:00
Felix Hammerl 7959be55a7 [WO-643] Refactor initialization workflow
* Move initialization pre-flight checks to app-controller
* Refresh cached public keys for user during incomplete setups
* Reorder redirect checks in login ctrl from most specific (pubkey + privkey) to most generic (no keys)
* Add overridePermission flag to KeychainDAO.refreshKeyForUserId to refresh w/o asking for user permission
2014-11-06 15:36:59 +01:00
Felix Hammerl 40a4b33748 Use chai 1.9.x 2014-11-05 14:27:34 +01:00
Felix Hammerl fe62759613 Disable logging during tests 2014-11-05 14:27:21 +01:00
Felix Hammerl d67f2a5d53 [WO-660] Add \Flagged to message flags 2014-11-05 14:25:23 +01:00
Tankred Hase 4722af1457 [WO-629] Sort other folders alphabetically in navigation 2014-11-05 11:40:37 +01:00
Tankred Hase 69a3c9555d Merge pull request #156 from whiteout-io/dev/WO-696
[WO-696] Order wellknown folders first, others alphabetically
2014-11-05 11:38:08 +01:00
Felix Hammerl 14dc80ec3c [WO-696] List trash before flagged in wellknown folders 2014-11-05 11:36:42 +01:00
Felix Hammerl 8f1fd2de5f [WO-696] Order wellknown folders first, others alphabetically 2014-11-05 10:55:26 +01:00
Tankred Hase 7d223dc851 [WO-629] Hide outbox in folder list when empty 2014-11-04 21:32:44 +01:00
Tankred Hase 0c33f9070b [WO-629] Show correct folder name in mobile mail-list header and reader back button 2014-11-04 21:17:03 +01:00
Tankred Hase 5253680f86 Merge pull request #154 from whiteout-io/dev/WO-661
[WO-661] Introduce API to move message
2014-11-04 20:59:38 +01:00
Tankred Hase b10c0896e9 [WO-629] Fix online status in desktop nav 2014-11-04 20:49:21 +01:00
Felix Hammerl 541b35818b [WO-661] Introduce API to move message 2014-11-04 20:31:09 +01:00
Tankred Hase 571d9dbf34 [WO-629] Fix mail-list header margin for mobile 2014-11-04 20:19:51 +01:00
Tankred Hase 325e36b2e0 [WO-629] Fix nav margins for mobile 2014-11-04 19:49:31 +01:00
Tankred Hase 8b081c759a [WO-629] Fix nav margins 2014-11-04 19:31:04 +01:00
Tankred Hase 650aa83958 [WO-629] Configure responsive breakpoints and start chrome app in desktop mode 2014-11-04 19:30:59 +01:00
Tankred Hase a65435a771 [WO-629] List folders in navigation, switch back and forth 2014-11-04 17:20:05 +01:00
Tankred Hase 0bf68a0385 Fix grunt watch 2014-11-04 16:37:07 +01:00
Tankred Hase 8e737474f5 Merge pull request #148 from whiteout-io/dev/WO-651
[WO-651] Do not error if imap upload fails after send
2014-11-04 11:33:24 +01:00
Tankred Hase 8910376134 Fix readme indentation 2014-11-03 18:00:22 +01:00
Tankred Hase 4861ee23c3 Update README.md 2014-11-03 17:58:44 +01:00
Tankred Hase 4a43765f70 Merge branch 'release/v0.19.x' 2014-10-31 17:09:39 +01:00
Tankred Hase 568ccebcc1 Migrate to EB v3.x CLI and Frankfurt region 2014-10-31 16:03:16 +01:00
Tankred Hase 4760ddf314 Merge branch 'release/v0.19.x' 2014-10-29 18:51:41 +01:00
Tankred Hase 168a794708 Fix RSA keygen on Android 2014-10-29 18:36:32 +01:00
Tankred Hase 31fba2fed2 Merge branch 'dev/sockets' 2014-10-29 14:11:31 +01:00
Tankred Hase 10e6bd32e8 Use new chrome.sockets api, change manifest permissions
Prevent autocorrect on hostname text inputs
2014-10-29 14:00:39 +01:00
Tankred Hase 5efa410d7d Adjust dummy mail body during development 2014-10-27 17:30:42 +01:00
Tankred Hase edcaf7e3c0 Fix padding in mail-list header 2014-10-27 17:30:21 +01:00
Tankred Hase dc8ee2c498 Merge pull request #150 from whiteout-io/dev/desktop
Dev/desktop
2014-10-27 16:04:51 +01:00
Tankred Hase 29f82754d4 Manually fix Gruntfile merge 2014-10-27 16:03:54 +01:00
Tankred Hase bd19135472 Convert common.js directive to common.js module 2014-10-27 15:19:24 +01:00
Mario Volke 2594ff515b added dropdowns for mobile toolbar
Conflicts:
	src/js/directives/common.js
2014-10-27 15:19:24 +01:00
Mario Volke 06498017df align SVG icons to their viewbox to achieve more consistent icon sizes and positioning 2014-10-27 15:19:24 +01:00
Mario Volke 8c2aebf3fd line with padding in read view and no attachments 2014-10-27 15:19:24 +01:00
Mario Volke c3021a7244 Optimized mobile read view 2014-10-27 15:19:24 +01:00
Mario Volke c9c05302d2 remove manifest job in grunt watch 2014-10-27 15:19:24 +01:00
Mario Volke b53fdd3162 replace non semantic color variable in mail list 2014-10-27 15:19:23 +01:00
Mario Volke 4ef2b834b6 Implement desktop UI 2014-10-27 15:19:23 +01:00
Felix Hammerl b96ae1dd89 [WO-627] Expose all IMAP folders to account.folders 2014-10-27 15:14:32 +01:00
Tankred Hase 52a2f4f43a bumper versionCode for Android 2014-10-23 13:34:51 +02:00
Tankred Hase f938b3b83c [WO-659] fix scrolling to the top of the writer textarea 2014-10-23 13:11:37 +02:00
Tankred Hase cce81337c3 Add grunt parameter to aws release 2014-10-22 20:26:47 +02:00
Tankred Hase a728e34e32 Merge pull request #149 from whiteout-io/dev/WO-653
Use manifest config for webmail
2014-10-22 19:56:18 +02:00
Tankred Hase eb81028123 Use regex to parse key server urls from manifest 2014-10-22 19:42:56 +02:00
Tankred Hase c6b50d04f6 Use manifest config for webmail 2014-10-22 19:12:18 +02:00
Tankred Hase f380db4e1d [WO-656] fix logout in chrome app 2014-10-22 17:22:18 +02:00
Tankred Hase f9b1c66932 Fix bug when trying to open undefined folder before initial sync 2014-10-22 17:21:28 +02:00
Tankred Hase dada15c2b4 Merge pull request #147 from whiteout-io/dev/WO-654
[WO-654] Update T-Systems Trust Center intermediate certficate
2014-10-22 16:47:01 +02:00
Felix Hammerl 5f9132ab5f [WO-651] Do not error if imap upload fails after send 2014-10-22 12:25:27 +02:00
Felix Hammerl d6b842b0f4 [WO-654] Update T-Systems Trust Center intermediate certficate 2014-10-22 12:14:00 +02:00
Tankred Hase 0f800f7875 Clean browserified files and source maps from release builds 2014-10-22 11:04:27 +02:00
Tankred Hase 20ad94fc6b Update aws release script 2014-10-22 09:42:42 +02:00
Tankred Hase a610440b5a Merge pull request #142 from whiteout-io/dev/WO-639
[WO-639] Use 5s timeout for incoming mail
2014-10-21 15:13:43 +02:00
Tankred Hase d7c1718a1c Merge pull request #145 from whiteout-io/dev/WO-645
[WO-645] Fix: Credentials are not stored after logout
2014-10-21 15:01:48 +02:00
Tankred Hase ce78e71cd7 Merge pull request #146 from whiteout-io/dev/WO-520
Dev/wo 520
2014-10-21 14:59:00 +02:00
Tankred Hase 486a48679f Upgrade to new pgpmailer and pgpbuilder 2014-10-21 14:55:04 +02:00
Tankred Hase b556334407 Integrate OpenPGP.js 0.8.1 with promises support 2014-10-20 18:44:39 +02:00
Felix Hammerl 7a986fc60a [WO-645] Fix: Credentials are not stored after logout 2014-10-20 17:43:26 +02:00
Tankred Hase a93d817962 Add minified build of openpgp.js v0.8.0 2014-10-20 16:47:47 +02:00
Tankred Hase 84ba1e5c44 Update aws release script to change git branches automatically 2014-10-20 16:41:19 +02:00
Tankred Hase 1fbb6b0c91 Create shell script for aws release 2014-10-20 16:24:04 +02:00
Tankred Hase 65036a5087 Seperate production dependencies in package.json for aws deployment 2014-10-20 16:24:04 +02:00
Tankred Hase dd9680f626 Change license to MIT. 2014-10-17 12:11:19 +02:00
Felix Hammerl 1995836736 [WO-639] Use 5s timeout for incoming mail 2014-10-17 11:17:40 +02:00
Tankred Hase 35b2da32ff Remove src maps and browserified files from grunt manifest 2014-10-16 13:32:18 +02:00
Tankred Hase 5b8ad29e0a Merge pull request #139 from whiteout-io/dev/WO-628
[WO-628] Restrict connections for socket.io proxy
2014-10-16 13:15:17 +02:00
Tankred Hase 59853ecbca Update server.js 2014-10-16 13:14:49 +02:00
Felix Hammerl eaff850d27 [WO-628] Restrict connections for socket.io proxy 2014-10-16 12:32:19 +02:00
Tankred Hase 5d09e32320 Merge pull request #141 from whiteout-io/dev/WO-567
Dev/wo 567
2014-10-16 12:12:07 +02:00
Tankred Hase d971969b5f Stub GET requests to key server in integration test 2014-10-16 12:02:22 +02:00
Felix Hammerl 9723d6f0cd [WO-567] use mailreader v0.4.0 2014-10-16 09:48:22 +02:00
Felix Hammerl 3a6e0463fb [WO-567] fix TLS worker handling 2014-10-15 19:58:26 +02:00
Felix Hammerl 7be6c63060 Use worker thread in connection doctor 2014-10-15 19:16:20 +02:00
Tankred Hase c6c058c2dc Use same browserify options for each build 2014-10-15 19:16:20 +02:00
Felix Hammerl 5ea660e5d4 [WO-567] ignore buffer in tests 2014-10-15 19:16:20 +02:00
Tankred Hase 046241e20d Upgrade forge to v0.6.14 2014-10-15 19:16:20 +02:00
Tankred Hase 2cb008c8c3 Stub node buffer using browserify ignore, src maps in tests 2014-10-15 19:16:20 +02:00
Felix Hammerl c120818792 [WO-567] use multithreaded tls 2014-10-15 19:16:20 +02:00
Felix Hammerl 6e1ad91f6a [WO-567] use browserify-friendly tls-client 2014-10-15 19:16:20 +02:00
Felix Hammerl 033df2dea8 [WO-567] browserify mailreader worker 2014-10-15 19:16:20 +02:00
Tankred Hase 0519b73cdc Pipe source maps through browserify 2014-10-15 19:16:19 +02:00
Tankred Hase c6fb31fd49 Fix phantom mocha tests 2014-10-15 19:16:19 +02:00
Tankred Hase 84d5bd8124 Integration test works again 2014-10-15 19:16:19 +02:00
Tankred Hase 85afb0be01 Fix angulat mocks for unit tests 2014-10-15 19:16:19 +02:00
Tankred Hase 7e09add0f4 Dao and crypto unit tests work 2014-10-15 19:16:19 +02:00
Tankred Hase b5b95d1c5c Browserify build for unit tests works 2014-10-15 19:16:19 +02:00
Tankred Hase b0a186884a Fix jshint self errors 2014-10-15 19:16:19 +02:00
Tankred Hase 98dfcfcb22 Start unit tests 2014-10-15 19:16:19 +02:00
Tankred Hase b2b39abd66 Remove DOMpurify from main window 2014-10-15 19:16:19 +02:00
Tankred Hase 5d608cad67 Starting app works. Added source maps to build 2014-10-15 19:16:18 +02:00
Tankred Hase fc613ce501 Correct worker paths 2014-10-15 19:16:18 +02:00
Tankred Hase 0bfef4a710 Browserify runtime dependencies work 2014-10-15 19:16:18 +02:00
Tankred Hase 7a20049bbc Use module.exports instead of exports 2014-10-15 19:16:18 +02:00
Tankred Hase d9a2c77aa4 save package.json to use 4 spaces 2014-10-15 19:16:18 +02:00
Felix Hammerl 9bfda73969 WIP add unit tests 2014-10-15 19:16:18 +02:00
Tankred Hase c36cd069e0 WIP: begin browserify build 2014-10-15 19:16:18 +02:00
Felix Hammerl 73ed053c66 Merge pull request #140 from whiteout-io/dev/wo-594
[WO-594] Return own hostname for 'hostname' call from socket.io
2014-10-14 18:40:21 +02:00
Andris Reinman 66ddac2c71 [WO-594] Return own hostname for 'hostname' call from socket.io 2014-10-14 13:51:52 +03:00
Tankred Hase 315a471f10 Update README.md 2014-10-14 09:05:36 +02:00
Tankred Hase 7b84f9dcb2 Add socket.io threat model explanation to README 2014-10-13 17:38:14 +02:00
Felix Hammerl 5e17d68740 use config defaults 2014-10-09 12:13:24 +02:00
Tankred Hase cf20672735 Merge pull request #134 from whiteout-io/dev/WO-588
[WO-588] add options to get update notifications in batches
2014-10-02 18:17:01 +02:00
Felix Hammerl b02989e766 [WO-588] move maxUpdateSize assignment 2014-10-02 18:15:52 +02:00
Tankred Hase 771b03e13a Update package.json 2014-10-02 18:11:17 +02:00
Felix Hammerl 9521d6b990 [WO-588] use 25 messages update batches 2014-10-02 17:58:35 +02:00
Felix Hammerl 38d760364d [WO-588] add options to get update notifications in batches 2014-09-30 17:54:35 +02:00
Tankred Hase 658daf21b1 Merge pull request #133 from whiteout-io/dev/WO-625
[WO-625] Catch exception on socket.oncert
2014-09-30 15:55:46 +02:00
Felix Hammerl 297f7c493f [WO-625] Catch exception on socket.oncert
Mozilla's socket is not extensible via Object.preventExtensions(obj)
and throws exceptions when non-prototype function .oncert is added.
The callback function is needed for the other shims.
2014-09-30 12:30:18 +02:00
Felix Hammerl 5c9f8dac23 Merge pull request #132 from whiteout-io/dev/WO-587
[WO-587] implement user logout
2014-09-29 18:21:46 +02:00
Tankred Hase bedb69973c [WO-587] implement user logout 2014-09-26 19:14:53 +02:00
Tankred Hase f66fbf592c Fix error msg in focus-me for non-textarea inputs 2014-09-26 17:50:18 +02:00
Tankred Hase a92a5c5a3f Decrease space between signature warning and mail body 2014-09-26 16:59:21 +02:00
Tankred Hase fe73f3db52 [WO-614] loosen CSP to allow displaying html mail images 2014-09-26 16:34:31 +02:00
Tankred Hase 0266f330c0 [WO-621] Put primary button on top when choosing 2014-09-26 15:17:27 +02:00
Tankred Hase f42f9f640f Add documentation for selfhosting 2014-09-26 14:51:37 +02:00
Tankred Hase b11a9220fe Fix text overflow for long attachment names 2014-09-26 14:51:16 +02:00
457 changed files with 62545 additions and 45137 deletions

View File

@ -0,0 +1,12 @@
branch-defaults:
release/prod:
environment: mail-prod
release/test:
environment: mail-test
global:
application_name: mail
default_ec2_keyname: null
default_platform: Node.js
default_region: eu-central-1
profile: eb-cli
sc: git

9
.gitignore vendored
View File

@ -5,9 +5,10 @@ test/lib/
.sass-cache
src/css/
dist/
compile/
release/
test/integration/src/
src/lib/*.js
src/js/crypto/aes-gcm.js
src/js/crypto/util.js
.elasticbeanstalk/
src/img/icons/all.svg
test/*/index.js
**/*.browserified.js
**/*.js.map

View File

@ -1,50 +1,54 @@
{
"indent": 4,
"strict": true,
"globalstrict": true,
"node": true,
"browser": true,
"nonew": true,
"curly": true,
"eqeqeq": true,
"immed": true,
"newcap": true,
"regexp": true,
"evil": true,
"eqnull": true,
"expr": true,
"trailing": true,
"undef": true,
"unused": true,
"indent": 4,
"strict": true,
"globalstrict": true,
"node": true,
"browser": true,
"nonew": true,
"curly": true,
"eqeqeq": true,
"immed": true,
"newcap": true,
"regexp": true,
"evil": true,
"eqnull": true,
"expr": true,
"trailing": true,
"undef": true,
"unused": true,
"predef": [
"console",
"Notification",
"importScripts",
"process",
"Event",
"QUnit",
"test",
"asyncTest",
"ok",
"equal",
"deepEqual",
"start",
"chrome",
"requirejs",
"define",
"self",
"describe",
"it",
"chai",
"sinon",
"mocha",
"before",
"beforeEach",
"after",
"afterEach"
],
"predef": [
"$",
"inject",
"Promise",
"resolves",
"rejects",
"self",
"importScripts",
"console",
"process",
"chrome",
"Notification",
"Event",
"sinon",
"mocha",
"chai",
"expect",
"describe",
"it",
"before",
"beforeEach",
"after",
"afterEach",
"FastClick",
"angular",
"forge",
"Lawnchair",
"_",
"openpgp",
"PhoneNumber",
"DOMPurify"
],
"globals": {
}
"globals": {}
}

View File

@ -1,9 +1,7 @@
sudo: false
language: node_js
node_js:
- "0.10"
- "0.12"
before_install:
- gem install sass
- npm install -g grunt-cli
notifications:
email:
- build@whiteout.io

View File

@ -1,155 +1,66 @@
module.exports = function(grunt) {
'use strict';
require('time-grunt')(grunt);
var version = grunt.option('release'),
zipName = (version) ? version : 'DEV';
var browserifyOpt = {
exclude: ['openpgp', 'node-forge', 'net', 'tls', 'crypto'], // node apis not required at build time
ignore: ['buffer'], // node apis to be stubbed for runtime
browserifyOptions: {
debug: true
}
};
// Project configuration.
grunt.initConfig({
connect: {
dev: {
options: {
port: 8580,
base: '.',
keepalive: true
}
},
test: {
options: {
port: 8581,
base: '.'
}
}
},
jshint: {
all: ['Gruntfile.js', 'src/*.js', 'src/js/**/*.js', 'test/unit/*.js', 'test/integration/*.js'],
// General
shell: {
options: {
jshintrc: '.jshintrc'
}
},
mocha: {
all: {
options: {
urls: [
'http://localhost:<%= connect.test.options.port %>/test/unit/index.html',
'http://localhost:<%= connect.test.options.port %>/test/integration/index.html'
],
run: false,
reporter: 'Spec',
log: false,
// phanotmjs is soooo slow
timeout: 100000
}
stderr: false
},
target: {
command: 'dir=$(pwd) && cd node_modules/mailreader/ && npm install --production && cd $dir'
}
},
clean: {
dist: ['dist', 'src/lib/*.js', 'test/lib', 'test/integration/src']
},
sass: {
dist: {
files: {
'src/css/read-sandbox.css': 'src/sass/read-sandbox.scss',
'src/css/all.css': 'src/sass/all.scss'
}
}
},
autoprefixer: {
options: {
browsers: ['last 2 versions']
},
dist: {
files: {
'src/css/read-sandbox.css': 'src/css/read-sandbox.css',
'src/css/all.css': 'src/css/all.css'
}
}
},
csso: {
options: {
banner: '/*! Copyright © 2013, Whiteout Networks GmbH. All rights reserved.*/\n'
},
dist: {
files: {
'dist/css/read-sandbox.min.css': 'src/css/read-sandbox.css',
'dist/css/all.min.css': 'src/css/all.css'
}
}
},
watch: {
css: {
files: ['src/sass/**/*.scss'],
tasks: ['dist-css', 'manifest']
},
js: {
files: ['src/js/**/*.js'],
tasks: ['copy:js', 'copy:integration', 'manifest']
},
lib: {
files: ['src/lib/**/*.js'],
tasks: ['copy:lib', 'manifest']
},
app: {
files: ['src/*.js', 'src/**/*.html', 'src/**/*.json', 'src/manifest.*', 'src/img/**/*', 'src/font/**/*'],
tasks: ['copy:app', 'copy:ca', 'copy:tpl', 'copy:img', 'copy:font', 'manifest-dev', 'manifest']
}
dist: ['dist', 'compile', 'test/lib', 'test/integration/src'],
release: ['dist/**/*.browserified.js', 'dist/**/*.js.map', 'dist/js/app.templates.js']
},
copy: {
npm: {
libTest: {
expand: true,
flatten: true,
cwd: 'node_modules/',
cwd: './',
src: [
'requirejs/require.js',
'imap-client/src/*.js',
'imap-client/node_modules/browserbox/src/*.js',
'imap-client/node_modules/browserbox/node_modules/wo-imap-handler/src/*.js',
'imap-client/node_modules/browserbox/node_modules/mimefuncs/src/*.js',
'imap-client/node_modules/browserbox/node_modules/tcp-socket/src/*.js',
'imap-client/node_modules/browserbox/node_modules/wo-utf7/src/*.js',
'mailreader/src/*.js',
'mailreader/node_modules/mimeparser/src/*.js',
'mailreader/node_modules/mimeparser/node_modules/wo-addressparser/src/*.js',
'pgpbuilder/src/*.js',
'pgpbuilder/node_modules/mailbuild/src/*.js',
'pgpbuilder/node_modules/mailbuild/node_modules/mimetypes/src/*.js',
'pgpbuilder/node_modules/mailbuild/node_modules/punycode/punycode.min.js',
'pgpmailer/src/*.js',
'pgpmailer/node_modules/wo-smtpclient/src/*.js',
'pgpmailer/node_modules/wo-smtpclient/node_modules/wo-stringencoding/dist/stringencoding.js',
'axe-logger/axe.js',
'dompurify/purify.js',
'jquery/dist/jquery.min.js',
'ng-infinite-scroll/build/ng-infinite-scroll.min.js'
'node_modules/mocha/mocha.css',
'node_modules/mocha/mocha.js',
'node_modules/chai/chai.js',
'node_modules/sinon/pkg/sinon.js',
'node_modules/browsercrow/src/*.js',
'node_modules/browsersmtp/src/*.js',
'node_modules/openpgp/dist/openpgp.min.js',
'node_modules/openpgp/dist/openpgp.worker.min.js',
'src/lib/forge/forge.min.js',
'dist/js/pbkdf2-worker.min.js'
],
dest: 'src/lib/'
},
npmDev: {
expand: true,
flatten: true,
cwd: 'node_modules/',
src: ['requirejs/require.js', 'mocha/mocha.css', 'mocha/mocha.js', 'chai/chai.js', 'sinon/pkg/sinon.js', 'angularjs/src/ngMock/angular-mocks.js', 'browsercrow/src/*.js', 'browsersmtp/src/*.js'],
dest: 'test/lib/'
},
cryptoLib: {
expand: true,
cwd: 'node_modules/crypto-lib/src/',
src: ['*.js'],
dest: 'src/js/crypto/'
},
lib: {
expand: true,
cwd: 'src/lib/',
src: ['**'],
dest: 'dist/lib/'
},
js: {
expand: true,
cwd: 'src/js/',
src: ['**'],
flatten: true,
cwd: './',
src: [
'node_modules/openpgp/dist/openpgp.min.js',
'node_modules/openpgp/dist/openpgp.worker.min.js',
'src/lib/forge/forge.min.js'
],
dest: 'dist/js/'
},
font: {
@ -167,29 +78,496 @@ module.exports = function(grunt) {
tpl: {
expand: true,
cwd: 'src/tpl/',
src: ['*'],
src: ['read-sandbox.html'],
dest: 'dist/tpl/'
},
ca: {
expand: true,
cwd: 'src/ca/',
src: ['*'],
dest: 'dist/ca/'
},
app: {
expand: true,
cwd: 'src/',
src: ['*.html', '*.js', '*.json', 'manifest.*'],
src: ['*.js', '*.json', 'manifest.*'],
dest: 'dist/'
},
integration: {
expand: true,
cwd: 'src/',
src: ['**'],
dest: 'test/integration/src/'
}
},
// Stylesheets
sass: {
dist: {
files: {
'src/css/read-sandbox.css': 'src/sass/read-sandbox.scss',
'src/css/all.css': 'src/sass/all.scss'
}
},
styleguide: {
files: {
'src/css/styleguide.css': 'src/sass/styleguide.scss'
}
}
},
autoprefixer: {
options: {
browsers: ['last 2 versions']
},
dist: {
files: {
'src/css/read-sandbox.css': 'src/css/read-sandbox.css',
'src/css/all.css': 'src/css/all.css'
}
},
styleguide: {
files: {
'src/css/styleguide.css': 'src/css/styleguide.css'
}
}
},
csso: {
options: {
banner: '/*! Copyright © 2013, Whiteout Networks GmbH. All rights reserved.*/\n'
},
dist: {
files: {
'dist/css/read-sandbox.min.css': 'src/css/read-sandbox.css',
'dist/css/all.min.css': 'src/css/all.css'
}
},
styleguide: {
files: {
'dist/styleguide/css/styleguide.min.css': 'src/css/styleguide.css'
}
}
},
// JavaScript
jshint: {
all: ['Gruntfile.js', 'src/*.js', 'src/js/**/*.js', 'test/unit/*-test.js', 'test/integration/*-test.js'],
options: {
jshintrc: '.jshintrc'
}
},
browserify: {
app: {
files: {
'dist/js/app.browserified.js': ['src/js/app.js']
},
options: browserifyOpt
},
pbkdf2Worker: {
files: {
'dist/js/pbkdf2-worker.browserified.js': ['src/js/crypto/pbkdf2-worker.js']
},
options: browserifyOpt
},
mailreaderWorker: {
files: {
'dist/js/mailreader-parser-worker.browserified.js': ['node_modules/mailreader/src/mailreader-parser-worker-browserify.js']
},
options: browserifyOpt
},
tlsWorker: {
files: {
'dist/js/tcp-socket-tls-worker.browserified.js': ['node_modules/tcp-socket/src/tcp-socket-tls-worker.js']
},
options: browserifyOpt
},
compressionWorker: {
files: {
'dist/js/browserbox-compression-worker.browserified.js': ['node_modules/imap-client/node_modules/browserbox/src/browserbox-compression-worker.js']
},
options: browserifyOpt
},
unitTest: {
files: {
'test/unit/index.browserified.js': [
'test/main.js',
'test/unit/util/dialog-test.js',
'test/unit/util/connection-doctor-test.js',
'test/unit/util/update-handler-test.js',
'test/unit/util/status-display-test.js',
'test/unit/crypto/pgp-test.js',
'test/unit/crypto/crypto-test.js',
'test/unit/service/rest-dao-test.js',
'test/unit/service/admin-dao-test.js',
'test/unit/service/auth-test.js',
'test/unit/service/oauth-test.js',
'test/unit/service/publickey-dao-test.js',
'test/unit/service/privatekey-dao-test.js',
'test/unit/service/lawnchair-dao-test.js',
'test/unit/service/keychain-dao-test.js',
'test/unit/service/devicestorage-dao-test.js',
'test/unit/service/newsletter-service-test.js',
'test/unit/service/mail-config-service-test.js',
'test/unit/service/invitation-dao-test.js',
'test/unit/service/publickey-verifier-test.js',
'test/unit/email/outbox-bo-test.js',
'test/unit/email/email-dao-test.js',
'test/unit/email/account-test.js',
'test/unit/email/search-test.js',
'test/unit/controller/login/add-account-ctrl-test.js',
'test/unit/controller/login/create-account-ctrl-test.js',
'test/unit/controller/login/validate-phone-ctrl-test.js',
'test/unit/controller/login/login-existing-ctrl-test.js',
'test/unit/controller/login/login-initial-ctrl-test.js',
'test/unit/controller/login/login-new-device-ctrl-test.js',
'test/unit/controller/login/login-privatekey-download-ctrl-test.js',
'test/unit/controller/login/login-privatekey-upload-ctrl-test.js',
'test/unit/controller/login/login-verify-public-key-ctrl-test.js',
'test/unit/controller/login/login-set-credentials-ctrl-test.js',
'test/unit/controller/login/login-ctrl-test.js',
'test/unit/controller/app/dialog-ctrl-test.js',
'test/unit/controller/app/publickey-import-ctrl-test.js',
'test/unit/controller/app/account-ctrl-test.js',
'test/unit/controller/app/set-passphrase-ctrl-test.js',
'test/unit/controller/app/contacts-ctrl-test.js',
'test/unit/controller/app/read-ctrl-test.js',
'test/unit/controller/app/navigation-ctrl-test.js',
'test/unit/controller/app/mail-list-ctrl-test.js',
'test/unit/controller/app/write-ctrl-test.js',
'test/unit/controller/app/action-bar-ctrl-test.js',
]
},
options: browserifyOpt
},
integrationTest: {
files: {
'test/integration/index.browserified.js': [
'test/main.js',
'test/integration/email-dao-test.js',
'test/integration/publickey-verifier-test.js'
]
},
options: browserifyOpt
}
},
exorcise: {
app: {
files: {
'dist/js/app.browserified.js.map': ['dist/js/app.browserified.js'],
}
},
unitTest: {
files: {
'test/unit/index.browserified.js.map': ['test/unit/index.browserified.js'],
}
},
integrationTest: {
files: {
'test/integration/index.browserified.js.map': ['test/integration/index.browserified.js'],
}
}
},
ngtemplates: {
mail: {
src: [
'tpl/**/*.html'
],
dest: 'dist/js/app.templates.js',
cwd: 'src/',
options: {
htmlmin: {
collapseWhitespace: true,
removeComments: true // we do not use comment directives
}
}
}
},
concat: {
options: {
separator: ';\n',
sourceMap: true
},
app: {
src: [
'src/lib/underscore/underscore.js',
'node_modules/jquery/dist/jquery.min.js',
'src/lib/angular/angular.js',
'src/lib/angular/angular-route.js',
'src/lib/angular/angular-animate.js',
'src/lib/ngtagsinput/ng-tags-input.min.js',
'node_modules/ng-infinite-scroll/build/ng-infinite-scroll.min.js',
'node_modules/iframe-resizer/js/iframeResizer.min.js',
'src/lib/fastclick/fastclick.js',
'src/lib/lawnchair/lawnchair-git.js',
'src/lib/lawnchair/lawnchair-adapter-webkit-sqlite-git.js',
'src/lib/lawnchair/lawnchair-adapter-indexed-db-git.js',
'src/lib/phonenumber/PhoneNumberMetadata.js',
'src/lib/phonenumber/PhoneNumberNormalizer.js',
'src/lib/phonenumber/PhoneNumber.js',
'dist/js/app.browserified.js',
'<%= ngtemplates.mail.dest %>'
],
dest: 'dist/js/app.min.js',
options: {
sourceMapName: 'dist/js/app.js.map'
}
},
readSandbox: {
src: [
'node_modules/dompurify/src/purify.js',
'node_modules/iframe-resizer/js/iframeResizer.contentWindow.min.js',
'src/js/controller/app/read-sandbox.js'
],
dest: 'dist/js/read-sandbox.min.js'
},
pbkdf2Worker: {
src: ['dist/js/pbkdf2-worker.browserified.js'],
dest: 'dist/js/pbkdf2-worker.min.js'
},
mailreaderWorker: {
src: ['dist/js/mailreader-parser-worker.browserified.js'],
dest: 'dist/js/mailreader-parser-worker.min.js'
},
tlsWorker: {
src: ['dist/js/tcp-socket-tls-worker.browserified.js'],
dest: 'dist/js/tcp-socket-tls-worker.min.js'
},
compressionWorker: {
src: ['dist/js/browserbox-compression-worker.browserified.js'],
dest: 'dist/js/browserbox-compression-worker.min.js'
},
unitTest: {
src: [
'src/lib/underscore/underscore.js',
'node_modules/jquery/dist/jquery.min.js',
'src/lib/angular/angular.js',
'src/lib/angular/angular-route.js',
'src/lib/angular/angular-mocks.js',
'src/lib/lawnchair/lawnchair-git.js',
'src/lib/lawnchair/lawnchair-adapter-webkit-sqlite-git.js',
'src/lib/lawnchair/lawnchair-adapter-indexed-db-git.js',
'src/lib/phonenumber/PhoneNumberMetadata.js',
'src/lib/phonenumber/PhoneNumberNormalizer.js',
'src/lib/phonenumber/PhoneNumber.js',
'test/unit/index.browserified.js'
],
dest: 'test/unit/index.js',
options: {
sourceMapName: 'test/unit/index.js.map'
}
},
integrationTest: {
src: [
'src/lib/underscore/underscore.js',
'node_modules/jquery/dist/jquery.min.js',
'src/lib/angular/angular.js',
'src/lib/angular/angular-mocks.js',
'src/lib/lawnchair/lawnchair-git.js',
'src/lib/lawnchair/lawnchair-adapter-webkit-sqlite-git.js',
'src/lib/lawnchair/lawnchair-adapter-indexed-db-git.js',
'test/integration/index.browserified.js'
],
dest: 'test/integration/index.js',
options: {
sourceMapName: 'test/integration/index.js.map'
}
}
},
uglify: {
app: {
files: {
'dist/js/app.min.js': ['dist/js/app.min.js']
},
options: {
mangle: false,
sourceMap: true,
sourceMapIn: 'dist/js/app.js.map',
sourceMapIncludeSources: true,
sourceMapName: 'dist/js/app.min.js.map'
}
},
readSandbox: {
files: {
'dist/js/read-sandbox.min.js': ['dist/js/read-sandbox.min.js']
},
options: {
sourceMap: true,
sourceMapName: 'dist/js/read-sandbox.min.js.map'
}
},
pbkdf2Worker: {
files: {
'dist/js/pbkdf2-worker.min.js': ['dist/js/pbkdf2-worker.min.js']
}
},
mailreaderWorker: {
files: {
'dist/js/mailreader-parser-worker.min.js': ['dist/js/mailreader-parser-worker.min.js']
},
options: {
sourceMap: true,
sourceMapName: 'dist/js/mailreader-parser-worker.min.js.map'
}
},
tlsWorker: {
files: {
'dist/js/tcp-socket-tls-worker.min.js': ['dist/js/tcp-socket-tls-worker.min.js']
},
options: {
sourceMap: true,
sourceMapName: 'dist/js/tcp-socket-tls-worker.min.js.map'
}
},
compressionWorker: {
files: {
'dist/js/browserbox-compression-worker.min.js': ['dist/js/browserbox-compression-worker.min.js']
},
options: {
sourceMap: true,
sourceMapName: 'dist/js/browserbox-compression-worker.min.js.map'
}
},
options: {
banner: '/*! Copyright © <%= grunt.template.today("yyyy") %>, Whiteout Networks GmbH.*/\n'
}
},
mocha_phantomjs: {
all: {
options: {
urls: [
'http://localhost:<%= connect.test.options.port %>/test/unit/index.html',
'http://localhost:<%= connect.test.options.port %>/test/integration/index.html'
]
}
}
},
// Assets
svgmin: {
options: {
plugins: [{
removeViewBox: false
}, {
removeUselessStrokeAndFill: false
}]
},
icons: {
files: [{
expand: true,
src: ['img/icons/*.svg', '!img/icons/all.svg'],
cwd: 'src/',
dest: 'compile/'
}]
}
},
svgstore: {
options: {
prefix: 'icon-',
svg: {
viewBox: '0 0 100 100',
xmlns: 'http://www.w3.org/2000/svg'
},
cleanup: ['fill', 'stroke']
},
icons: {
files: {
'src/img/icons/all.svg': ['compile/img/icons/*.svg'],
}
}
},
'string-replace': {
index: {
files: {
'dist/index.html': 'src/index.html'
},
options: {
replacements: [{
pattern: /<!-- @import (.*?) -->/ig,
replacement: function(match, p1) {
return grunt.file.read('src/' + p1);
}
}]
}
}
},
// Styleguide
assemble: {
options: {
assets: 'dist',
layoutdir: 'src/styleguide/layouts',
layout: 'default.hbs',
partials: ['src/styleguide/blocks/**/*.hbs'],
helpers: [
'handlebars-helper-compose',
'src/styleguide/helpers/**/*.js'
],
data: [
'dist/manifest.json'
],
flatten: true
},
styleguide: {
files: [{
'dist/styleguide/': ['src/styleguide/*.hbs']
}]
}
},
// Development
connect: {
dev: {
options: {
port: 8580,
base: '.',
keepalive: true
}
},
test: {
options: {
port: 8581,
base: '.'
}
}
},
// Utilities
watch: {
css: {
files: ['src/sass/**/*.scss'],
tasks: ['dist-css', 'offline-cache', 'dist-styleguide']
},
styleguide: {
files: ['src/styleguide/**/*.hbs', 'src/styleguide/**/*.js'],
tasks: ['dist-styleguide']
},
jsApp: {
files: ['src/js/**/*.js', 'src/*.html', 'src/tpl/**/*.html'],
tasks: ['dist-js-app']
},
jsUnitTest: {
files: ['test/unit/**/*-test.js', 'test/*.js'],
tasks: ['dist-js-unitTest']
},
jsIntegrationTest: {
files: ['test/integration/*-test.js', 'test/*.js'],
tasks: ['dist-js-integrationTest']
},
icons: {
files: ['src/index.html', 'src/img/icons/*.svg', '!src/img/icons/all.svg'],
tasks: ['svgmin', 'svgstore', 'string-replace', 'dist-styleguide', 'offline-cache']
},
lib: {
files: ['src/lib/**/*.js'],
tasks: ['copy:lib', 'offline-cache']
},
app: {
files: ['src/*.js', 'src/*.html', 'src/tpl/**/*.html', 'src/**/*.json', 'src/manifest.*', 'src/img/**/*', 'src/font/**/*'],
tasks: ['copy:app', 'copy:tpl', 'copy:img', 'copy:font', 'manifest-dev', 'offline-cache']
}
},
// Deployment
compress: {
main: {
options: {
@ -200,16 +578,15 @@ module.exports = function(grunt) {
cwd: 'dist/',
src: ['**/*'],
dest: 'release/'
},
nodeWebkit: {
options: {
mode: 'zip',
archive: 'release/whiteout-mail_' + zipName + '.nw'
},
expand: true,
cwd: 'dist/',
src: ['**/*'],
dest: '/'
}
},
// Offline caching
swPrecache: {
prod: {
handleFetch: true,
rootDir: 'dist'
}
},
@ -220,31 +597,133 @@ module.exports = function(grunt) {
timestamp: true,
hash: true,
cache: ['socket.io/socket.io.js'],
exclude: ['appcache.manifest', 'manifest.webapp'],
exclude: [
'appcache.manifest',
'manifest.webapp',
'manifest.mobile.json',
'background.js',
'service-worker.js',
'styleguide/css/styleguide.min.css',
'styleguide/index.html',
'js/app.templates.js',
'js/app.js.map',
'js/app.min.js.map',
'js/app.browserified.js',
'js/app.browserified.js.map',
'js/crypto/pbkdf2-worker.browserified.js',
'js/pbkdf2-worker.browserified.js',
'js/pbkdf2-worker.min.js.map',
'js/read-sandbox.min.js.map',
'js/mailreader-parser-worker.browserified.js',
'js/mailreader-parser-worker.min.js.map',
'js/tcp-socket-tls-worker.browserified.js',
'js/tcp-socket-tls-worker.min.js.map',
'js/browserbox-compression-worker.browserified.js',
'js/browserbox-compression-worker.min.js.map',
'img/icon-100-ios.png',
'img/icon-114-ios.png',
'img/icon-120-ios.png',
'img/icon-128-chrome.png',
'img/icon-144-android.png',
'img/icon-144-ios.png',
'img/icon-152-ios.png',
'img/icon-180-ios.png',
'img/icon-192-android.png',
'img/icon-29-ios.png',
'img/icon-36-android.png',
'img/icon-40-ios.png',
'img/icon-48-android.png',
'img/icon-50-ios.png',
'img/icon-57-ios.png',
'img/icon-58-ios.png',
'img/icon-60-android.png',
'img/icon-60-ios.png',
'img/icon-72-android.png',
'img/icon-72-ios.png',
'img/icon-76-ios.png',
'img/icon-78-android.png',
'img/icon-80-ios.png',
'img/icon-87-ios.png',
'img/icon-96-android.png',
'img/Default-568h@2x~iphone.png',
'img/Default-667h.png',
'img/Default-736h.png',
'img/Default-Landscape-736h.png',
'img/Default-Landscape@2x~ipad.png',
'img/Default-Landscape~ipad.png',
'img/Default-Portrait@2x~ipad.png',
'img/Default-Portrait~ipad.png',
'img/Default@2x~iphone.png',
'img/Default~iphone.png'
],
master: ['index.html']
},
src: ['**/*.*'],
dest: 'dist/appcache.manifest'
}
},
}
nodewebkit: {
options: {
version: '0.9.2', // node-webkit version
build_dir: './release/node-webkit/', // Where the build version of my node-webkit app is saved
mac: true, // We want to build it for mac
win: false, // We want to build it for win
linux32: false, // We don't need linux32
linux64: false, // We don't need linux64
},
src: ['./dist/**/*'] // Your node-webkit app
},
});
// generate service-worker stasks
grunt.registerMultiTask('swPrecache', function() {
var fs = require('fs');
var path = require('path');
var swPrecache = require('sw-precache');
var packageJson = require('./package.json');
var done = this.async();
var rootDir = this.data.rootDir;
var handleFetch = this.data.handleFetch;
generateServiceWorkerFileContents(rootDir, handleFetch, function(error, serviceWorkerFileContents) {
if (error) {
grunt.fail.warn(error);
}
fs.writeFile(path.join(rootDir, 'service-worker.js'), serviceWorkerFileContents, function(error) {
if (error) {
grunt.fail.warn(error);
}
done();
});
});
function generateServiceWorkerFileContents(rootDir, handleFetch, callback) {
var config = {
cacheId: packageJson.name,
// If handleFetch is false (i.e. because this is called from swPrecache:dev), then
// the service worker will precache resources but won't actually serve them.
// This allows you to test precaching behavior without worry about the cache preventing your
// local changes from being picked up during the development cycle.
handleFetch: handleFetch,
logger: grunt.log.writeln,
dynamicUrlToDependencies: {
'socket.io/socket.io.js': ['node_modules/socket.io/node_modules/socket.io-client/socket.io.js'],
},
staticFileGlobs: [
rootDir + '/*.html',
rootDir + '/tpl/*.html',
rootDir + '/js/**/*.min.js',
rootDir + '/css/**/*.css',
rootDir + '/img/**/*.svg',
rootDir + '/img/*-universal.png',
rootDir + '/font/**.*',
rootDir + '/*.json'
],
maximumFileSizeToCacheInBytes: 100 * 1024 * 1024,
stripPrefix: path.join(rootDir, path.sep)
};
swPrecache(config, callback);
}
});
// Load the plugin(s)
grunt.loadNpmTasks('grunt-browserify');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-connect');
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-mocha');
grunt.loadNpmTasks('grunt-contrib-clean');
grunt.loadNpmTasks('grunt-csso');
grunt.loadNpmTasks('grunt-contrib-sass');
@ -252,18 +731,50 @@ module.exports = function(grunt) {
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.loadNpmTasks('grunt-contrib-compress');
grunt.loadNpmTasks('grunt-node-webkit-builder');
grunt.loadNpmTasks('grunt-manifest');
grunt.loadNpmTasks('grunt-mocha-phantomjs');
grunt.loadNpmTasks('grunt-exorcise');
grunt.loadNpmTasks('grunt-string-replace');
grunt.loadNpmTasks('grunt-svgmin');
grunt.loadNpmTasks('grunt-svgstore');
grunt.loadNpmTasks('grunt-shell');
grunt.loadNpmTasks('grunt-angular-templates');
grunt.loadNpmTasks('assemble');
// Build tasks
grunt.registerTask('dist-npm', ['copy:npm', 'copy:npmDev', 'copy:cryptoLib']);
grunt.registerTask('dist-css', ['sass', 'autoprefixer', 'csso']);
grunt.registerTask('dist-css', ['sass:dist', 'autoprefixer:dist', 'csso:dist']);
grunt.registerTask('dist-js', ['browserify', 'exorcise', 'ngtemplates', 'concat', 'uglify']);
grunt.registerTask('dist-js-app', [
'browserify:app',
'browserify:pbkdf2Worker',
'exorcise:app',
'ngtemplates',
'concat:app',
'concat:readSandbox',
'concat:pbkdf2Worker',
'offline-cache'
]);
grunt.registerTask('dist-js-unitTest', [
'browserify:unitTest',
'exorcise:unitTest',
'concat:unitTest'
]);
grunt.registerTask('dist-js-integrationTest', [
'browserify:integrationTest',
'exorcise:integrationTest',
'concat:integrationTest'
]);
grunt.registerTask('dist-copy', ['copy']);
grunt.registerTask('dist', ['clean', 'dist-npm', 'dist-css', 'dist-copy', 'manifest']);
grunt.registerTask('dist-assets', ['svgmin', 'svgstore', 'string-replace']);
grunt.registerTask('dist-styleguide', ['sass:styleguide', 'autoprefixer:styleguide', 'csso:styleguide', 'assemble:styleguide']);
// generate styleguide after manifest to forward version number to styleguide
grunt.registerTask('dist', ['clean:dist', 'shell', 'dist-css', 'dist-js', 'dist-assets', 'dist-copy', 'manifest', 'dist-styleguide']);
grunt.registerTask('offline-cache', ['manifest', 'swPrecache:prod']);
// Test/Dev tasks
grunt.registerTask('dev', ['connect:dev']);
grunt.registerTask('test', ['jshint', 'connect:test', 'mocha']);
grunt.registerTask('test', ['jshint', 'connect:test', 'mocha_phantomjs']);
grunt.registerTask('prod', ['connect:prod']);
//
@ -273,12 +784,12 @@ module.exports = function(grunt) {
grunt.registerTask('manifest-dev', function() {
patchManifest({
suffix: ' (DEV)',
version: '9999.9999.9999.9999'
version: '9999.9999.9999'
});
});
grunt.registerTask('manifest-test', function() {
if (!version) {
throw new Error('You must specify the version: "--release=1.0"');
throw new Error('You must specify the version: "--release=1.0.0"');
}
patchManifest({
@ -288,16 +799,15 @@ module.exports = function(grunt) {
deleteKey: true
});
});
grunt.registerTask('manifest-stable', function() {
grunt.registerTask('manifest-prod', function() {
if (!version) {
throw new Error('You must specify the version: "--release=1.0"');
throw new Error('You must specify the version: "--release=1.0.0"');
}
patchManifest({
version: version,
deleteKey: true,
keyServer: 'https://keys.whiteout.io/',
keychainServer: 'https://keychain.whiteout.io/'
keyServer: 'https://keys.whiteout.io/'
});
});
@ -319,10 +829,6 @@ module.exports = function(grunt) {
var ksIndex = manifest.permissions.indexOf('https://keys-test.whiteout.io/');
manifest.permissions[ksIndex] = options.keyServer;
}
if (options.keychainServer) {
var kcsIndex = manifest.permissions.indexOf('https://keychain-test.whiteout.io/');
manifest.permissions[kcsIndex] = options.keychainServer;
}
if (options.deleteKey) {
delete manifest.key;
}
@ -330,9 +836,9 @@ module.exports = function(grunt) {
fs.writeFileSync(path, JSON.stringify(manifest, null, 2));
}
grunt.registerTask('release-dev', ['dist', 'manifest-dev', 'compress']);
grunt.registerTask('release-test', ['dist', 'manifest-test', 'compress']);
grunt.registerTask('release-stable', ['dist', 'manifest-stable', 'compress']);
grunt.registerTask('release-dev', ['dist', 'manifest-dev', 'swPrecache:prod', 'compress']);
grunt.registerTask('release-test', ['dist', 'manifest-test', 'clean:release', 'swPrecache:prod', 'compress']);
grunt.registerTask('release-prod', ['dist', 'manifest-prod', 'clean:release', 'swPrecache:prod', 'compress']);
grunt.registerTask('default', ['release-dev']);
};

View File

@ -1,6 +1,21 @@
Copyright © 2014, Whiteout Networks GmbH. All rights reserved.
The MIT License (MIT)
The code is open for inspection and peer review by the security community.
The code is currently not licensed under an open source license. If you're
interested in contributing or getting a license, please get in touch with
us (info@whiteout.io).
Copyright (c) 2014 Whiteout Networks GmbH.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

107
README.md
View File

@ -1,25 +1,23 @@
![App Icon](https://raw.githubusercontent.com/whiteout-io/mail-html5/master/src/img/icon-128.png)
Whiteout Mail [![Build Status](https://travis-ci.org/whiteout-io/mail-html5.svg?branch=master)](https://travis-ci.org/whiteout-io/mail-html5)
Whiteout Mail [![Build Status](https://travis-ci.org/whiteout-io/mail.svg?branch=master)](https://travis-ci.org/whiteout-io/mail)
==========
Whiteout Mail is an easy to use email client with integrated OpenPGP encryption written in pure JavaScript. Download the official version under [whiteout.io](http://whiteout.io).
Whiteout Mail is an easy to use email client with integrated OpenPGP encryption written in pure JavaScript. Download the official version under [whiteout.io](https://whiteout.io/#product).
![Screenshot](https://whiteout.io/img/screens.png)
### Features
You can read about product features and our future roadmap in our [FAQ](https://github.com/whiteout-io/mail-html5/wiki/FAQ).
You can read about product features and our future roadmap in our [FAQ](https://github.com/whiteout-io/mail/wiki/FAQ).
### Privacy and Security
We take the privacy of your data very seriously. Here are some of the technical details:
* Messages are [encrypted end-to-end ](http://en.wikipedia.org/wiki/End-to-end_encryption) using the [OpenPGP](http://en.wikipedia.org/wiki/Pretty_Good_Privacy) standard. This means that only you and the recipient can read your mail. Your messages and private PGP key are stored encrypted on your computer.
* The code has undergone a [full security audit](https://blog.whiteout.io/2015/06/11/whiteout-mail-1-0-and-security-audit-by-cure53/) by [Cure53](https://cure53.de).
* Users have the option to use [encrypted private key sync](https://blog.whiteout.io/2014/07/07/secure-pgp-key-sync-a-proposal/) if they want to use Whiteout on multiple devices.
* Messages are [encrypted end-to-end ](http://en.wikipedia.org/wiki/End-to-end_encryption) using the [OpenPGP](http://en.wikipedia.org/wiki/Pretty_Good_Privacy) standard. This means that only you and the recipient can read your mail. Your messages and private PGP key are stored only on your computer (in IndexedDB).
* Like most native email clients whiteout mail uses raw [TCP sockets](http://developer.chrome.com/apps/socket.html) to communicate directly with your mail server via IMAP/SMTP.
* The app is deployed as a [Chrome Packaged App](https://developer.chrome.com/apps/about_apps.html) with [auditable static versions](https://github.com/whiteout-io/mail-html5/releases) in order to prevent [problems with host-based security](http://tonyarcieri.com/whats-wrong-with-webcrypto).
* Users have the option to use [encrypted private key sync](https://github.com/whiteout-io/mail/wiki/Secure-OpenPGP-Key-Pair-Synchronization-via-IMAP) if they want to use Whiteout on multiple devices.
* [Content Security Policy (CSP)](http://www.html5rocks.com/en/tutorials/security/content-security-policy/) is enforced to prevent injection attacks.
@ -27,26 +25,36 @@ We take the privacy of your data very seriously. Here are some of the technical
* Displaying mail images is optional and opt-in by default.
* Like most native email clients, whiteout mail uses raw [TCP sockets](http://developer.chrome.com/apps/socket.html) to communicate directly with your mail server via IMAP/SMTP. TLS is used to protect your password and message data in transit.
* The app is deployed as a signed [Chrome Packaged App](https://developer.chrome.com/apps/about_apps.html) with [auditable static versions](https://github.com/whiteout-io/mail/releases) in order to prevent [problems with host-based security](https://blog.whiteout.io/2014/04/13/heartbleed-and-javascript-crypto/).
* The app can also be used from any modern web browser in environments where installing an app is not possible (e.g. a locked down corporate desktop). The IMAP/SMTP TLS sessions are still terminated in the user's browser using JS crypto ([Forge](https://github.com/digitalbazaar/forge)), but the encrypted TLS payload is proxied via [socket.io](http://socket.io/), due to the lack of raw sockets in the browser. **Please keep in mind that this mode of operation is not as secure as using the signed packaged app, since users must trust the webserver to deliver the correct code. This mode will still protect user against passive attacks like wiretapping (since PGP and TLS are still applied in the user's browser), but not against active attacks from the webserver. So it's best to decide which threat model applies to you.**
### Architecture
![client architecture](https://whiteout.io/img/app_layers.png)
### Reporting bugs and feature requests
* We will launch a bug bounty program later on for independant security researchers. If you find any security vulnerabilities, don't hesitate to contact us [security@whiteout.io](mailto:security@whiteout.io).
* We will launch a bug bounty program later on for independent security researchers. If you find any security vulnerabilities, don't hesitate to contact us [security@whiteout.io](mailto:security@whiteout.io).
* You can also just create an [issue](https://github.com/whiteout-io/mail-html5/issues) on GitHub if you're missing a feature or just want to give us feedback. It would be much appreciated!
* You can also just create an [issue](https://github.com/whiteout-io/mail/issues) on GitHub if you're missing a feature or just want to give us feedback. It would be much appreciated!
### Testing
You can download a prebuilt bundle under [releases](https://github.com/whiteout-io/mail-html5/releases) or build your own from source (requires [node.js](http://nodejs.org/download/), [grunt](http://gruntjs.com/getting-started#installing-the-cli) and [sass](http://sass-lang.com/install)):
You can download a prebuilt bundle under [releases](https://github.com/whiteout-io/mail/releases) or build your own from source (requires [node.js](http://nodejs.org/download/), [grunt](http://gruntjs.com/getting-started#installing-the-cli) and [sass](http://sass-lang.com/install)):
npm install && npm test
This will download all dependencies, run the tests and build the Chrome Packaged App bundle **DEV.zip** which can be installed under [chrome://extensions](chrome://extensions) in developer mode.
This will download all dependencies, run the tests and build the Chrome Packaged App bundle **release/whiteout-mail_DEV.zip** which can be installed under [chrome://extensions](chrome://extensions) in developer mode.
### Development
For development you can start a connect dev server:
grunt dev
Then visit [http://localhost:8580/dist/#/desktop?dev=true](http://localhost:8580/dist/#/desktop?dev=true) for front-end code or [http://localhost:8580/test/unit/](http://localhost:8580/test/unit/) to test JavaScript changes. You can also start a watch task so you don't have rebuild everytime you make a change:
Then visit [http://localhost:8580/dist/#/account?dev=true](http://localhost:8580/dist/#/account?dev=true) for front-end code or [http://localhost:8580/test/unit/](http://localhost:8580/test/unit/) to test JavaScript changes. You can also start a watch task so you don't have rebuild everytime you make a change:
grunt watch
@ -55,24 +63,75 @@ Then visit [http://localhost:8580/dist/#/desktop?dev=true](http://localhost:8580
grunt release-test --release=0.0.0.x
grunt release-stable --release=0.x.0
## Deploying Web App
## Deploying Web App & Selfhosting
First build and generate the `dist/` directory:
The App can be used either as a Chrome Packaged App or just by hosting it on your own trusted web server. You can build the app from source.
grunt
### Build from source
Then deploy that directoy by adding it to a local git branch. Push that branch to your node.js server and then start the server:
Clone the git repository
git clone https://github.com/whiteout-io/mail.git
Build and generate the `dist/` directory:
npm install && grunt
### Running the server
To test the server, start it in development mode (without SSL):
node server.js --dev
Navigate to [http://localhost:8889](http://localhost:8889) (or whatever port is set using the `PORT` environment variable).
To start the server for production use (this automatically redirects to `https`)
npm start
**A note on security: The app should not be used without SSL so it's best to set up a reverse proxy or Loadbalancer with your SSL certificates. If you are not sure how to do this it might be easier to use our managed web hosting or packaged apps under [https://whiteout.io/#product](https://whiteout.io/#product).**
You can limit incoming and outgoing connections to the socket.io proxy by setting the following environment variables:
# the web socket proxy listens to this port
# if unset, defaults to 8889
PORT=12345
# the socket.io proxy accepts connections from these origins to tunnel them to tcp,
# separate with commas
# if unset, defaults to 'localhost:' + port
INBOUND_ORIGINS='foo:1234,bar:569'
# the socket.io proxy opens tcp connections with these ports to tunnel them to socket.io
# separate with commas
# if unset, defaults to '143,465,587,993' (25 is forbidden by default)
OUTBOUND_PORTS='123,456,789'
To start the server in development mode (no forced HTTPS, iframe loads http content), run `node server.js --dev`
## License
Copyright © 2014, Whiteout Networks GmbH. All rights reserved.
The MIT License (MIT)
The code is open for inspection and peer review by the security community.
The code is currently not licensed under an open source license. If you're
interested in contributing or getting a license, please get in touch with
us (info@whiteout.io).
Copyright (c) 2014 Whiteout Networks GmbH.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
### Third party libraries

View File

@ -1,9 +1,16 @@
'use strict';
var port = process.env.PORT || 8889;
module.exports = {
server: {
port: process.env.PORT || 8889,
host: "0.0.0.0"
port: port,
inboundOrigins: (process.env.INBOUND_ORIGINS || ('localhost:' + port)).split(',').map(function(host) {
return host.trim();
}),
outboundPorts: (process.env.OUTBOUND_PORTS || '143,465,587,993').split(',').map(function(i) {
return parseInt(i, 10);
})
},
log: {
level: "silly",

View File

@ -1,68 +1,68 @@
{
"name": "whiteout-mail",
"version": "0.0.1",
"description": "Mail App with integrated OpenPGP encryption.",
"author": "Whiteout Networks",
"homepage": "https://whiteout.io",
"repository": {
"type": "git",
"url": "https://github.com/whiteout-io/mail-html5.git"
},
"keywords": [
"email",
"mail",
"client",
"app",
"openpgp",
"pgp",
"gpg",
"imap",
"smtp"
],
"engines": {
"node": ">=0.10"
},
"scripts": {
"test": "grunt && grunt test",
"start": "node server.js"
},
"dependencies": {
"axe-logger": "~0.0.2",
"compression": "^1.0.11",
"crypto-lib": "~0.2.1",
"dompurify": "~0.4.2",
"express": "^4.8.3",
"imap-client": "~0.4.0",
"jquery": "~2.1.1",
"mailreader": "~0.3.5",
"ng-infinite-scroll": "~1.1.2",
"pgpbuilder": "~0.4.0",
"pgpmailer": "~0.4.0",
"requirejs": "~2.1.14",
"config": "^1.0.2",
"morgan": "^1.2.3",
"npmlog": "^0.1.1",
"socket.io": "^1.0.6"
},
"devDependencies": {
"angularjs": "https://github.com/whiteout-io/angular.js/tarball/npm-version",
"browsercrow": "https://github.com/whiteout-io/browsercrow/tarball/master",
"browsersmtp": "https://github.com/whiteout-io/browsersmtp/tarball/master",
"chai": "~1.7.2",
"grunt": "~0.4.1",
"grunt-contrib-clean": "~0.5.0",
"grunt-contrib-copy": "~0.4.1",
"grunt-manifest": "^0.4.0",
"grunt-autoprefixer": "~0.7.2",
"grunt-contrib-compress": "~0.5.2",
"grunt-contrib-connect": "~0.5.0",
"grunt-contrib-jshint": "~0.6.4",
"grunt-contrib-sass": "~0.7.3",
"grunt-contrib-watch": "~0.5.3",
"grunt-csso": "~0.6.1",
"grunt-mocha": "~0.4.1",
"grunt-node-webkit-builder": "~0.1.17",
"mocha": "~1.13.0",
"sinon": "~1.7.3"
}
}
"name": "whiteout-mail",
"description": "Mail App with integrated OpenPGP encryption.",
"author": "Whiteout Networks",
"homepage": "https://whiteout.io",
"engines": {
"node": ">=0.10"
},
"scripts": {
"test": "grunt && grunt test",
"start": "node server.js"
},
"dependencies": {
"compression": "^1.0.11",
"config": "^1.0.2",
"express": "^4.8.3",
"morgan": "^1.2.3",
"npmlog": "^0.1.1",
"socket.io": "^1.0.6"
},
"devDependencies": {
"assemble": "~0.4.42",
"axe-logger": "~0.0.2",
"browsercrow": "https://github.com/whiteout-io/browsercrow/tarball/master",
"browsersmtp": "https://github.com/whiteout-io/browsersmtp/tarball/master",
"chai": "~1.9.2",
"crypto-lib": "~0.2.1",
"dompurify": "~0.7.3",
"grunt": "~0.4.1",
"grunt-angular-templates": "~0.5.7",
"grunt-autoprefixer": "~0.7.2",
"grunt-browserify": "3.7.0",
"insert-module-globals": "6.5.0",
"grunt-contrib-clean": "~0.5.0",
"grunt-contrib-compress": "~0.5.2",
"grunt-contrib-concat": "^0.5.0",
"grunt-contrib-connect": "~0.5.0",
"grunt-contrib-copy": "~0.4.1",
"grunt-contrib-jshint": "~0.6.4",
"grunt-contrib-sass": "~0.7.3",
"grunt-contrib-uglify": "^0.6.0",
"grunt-contrib-watch": "~0.5.3",
"grunt-csso": "~0.6.1",
"grunt-exorcise": "^0.2.0",
"grunt-manifest": "^0.4.0",
"grunt-mocha-phantomjs": "^0.7.0",
"grunt-shell": "~1.1.1",
"grunt-string-replace": "~1.0.0",
"grunt-svgmin": "~1.0.0",
"grunt-svgstore": "~0.3.4",
"handlebars-helper-compose": "~0.2.12",
"iframe-resizer": "^2.8.3",
"imap-client": "~0.14.2",
"jquery": "~2.1.1",
"mailbuild": "^0.3.7",
"mailreader": "~0.4.0",
"mocha": "^1.21.4",
"ng-infinite-scroll": "~1.1.2",
"openpgp": "^1.0.0",
"pgpbuilder": "~0.6.0",
"pgpmailer": "~0.9.1",
"sinon": "~1.7.3",
"sw-precache": "^1.3.0",
"tcp-socket": "~0.5.0",
"time-grunt": "^1.0.0",
"wo-smtpclient": "~0.6.0"
}
}

View File

@ -0,0 +1,2 @@
storeFile=/Users/tanx/.keystore
keyAlias=mykey

View File

@ -1,2 +0,0 @@
key.store=${user.home}/.keystore
key.alias=mykey

45
res/aws_release.sh Executable file
View File

@ -0,0 +1,45 @@
#!/bin/sh
# go to root
cd `dirname $0`
cd ..
if [ "$#" -ne 3 ] || [ "$1" != "prod" ] && [ "$1" != "test" ] ; then
echo 'Usage: ./res/aws_release prod|test from-branch 1.0.0'
exit 0
fi
# switch branch
git checkout $2
git branch -D release/$1
git checkout -b release/$1
git merge $2 --no-edit
# abort if tests fail
set -e
# build and test
rm -rf node_modules/
npm cache clear
npm install
npm test
grunt release-$1 --release=$3
# install only production dependencies
rm -rf node_modules/
npm install --production
# delete .gitignore files before adding to git for aws deployment
find node_modules/ -name ".gitignore" -exec rm -rf {} \;
# Add runtime dependencies to git
sed -i "" '/dist/d' .gitignore
sed -i "" '/node_modules/d' .gitignore
git add .gitignore node_modules/ dist/
git commit -m "Update release"
# push to aws
eb deploy
# switch back to $2 branch
git checkout $2

View File

@ -1,10 +1,18 @@
#!/bin/sh
# reads values from JSON
jsonValue() {
KEY=$1
num=$2
awk -F"[,:}]" '{for(i=1;i<=NF;i++){if($i~/'$KEY'\042/){print $(i+1)}}}' | tr -d '"' | sed -n ${num}p
}
# go to root
cd `dirname $0`
cd ..
DIR=release/cca
PROJNAME=`less dist/manifest.json | jsonValue name 1 | sed -e 's/^ *//' -e 's/ *$//'`
# create
rm -rf $DIR
@ -15,5 +23,51 @@ cca create $DIR/Whiteout --link-to=dist/manifest.json
cd $DIR/Whiteout
cca prepare
#
# post-build tweaks
#
echo ""
echo "## Running post-build tweaks"
# cp signing config
cp ../../../res/ant.properties ./platforms/android/
echo "Copy Android signing config"
cp ../../../res/android-release-keys.properties .
# status bar should not overlay the web view
echo "Tweaking iOS status bar to not overlay the web view"
sed -i "" 's/StatusBarOverlaysWebView" value="true"/StatusBarOverlaysWebView" value="false"/' "platforms/ios/$PROJNAME/config.xml"
# status bar should use dark font on light background
echo "Tweaking iOS status bar to use dark font on light background"
sed -i "" 's/StatusBarStyle" value="lightcontent"/StatusBarStyle" value="darkcontent"/' "platforms/ios/$PROJNAME/config.xml"
# copy splash screens
echo "Copying splash screens"
cp ../../../src/img/Default* "platforms/ios/$PROJNAME/Resources/splash"
# fixing missing/wrong icons
echo "Fixing wrong/missing iOS icons"
cp ../../../src/img/icon-40-ios.png "platforms/ios/$PROJNAME/Resources/icons/icon-40.png"
cp ../../../src/img/icon-80-ios.png "platforms/ios/$PROJNAME/Resources/icons/icon-40@2x.png"
cp ../../../src/img/icon-120-ios.png "platforms/ios/$PROJNAME/Resources/icons/icon-40@3x.png"
cp ../../../src/img/icon-50-ios.png "platforms/ios/$PROJNAME/Resources/icons/icon-50.png"
cp ../../../src/img/icon-100-ios.png "platforms/ios/$PROJNAME/Resources/icons/icon-50@2x.png"
cp ../../../src/img/icon-60-ios.png "platforms/ios/$PROJNAME/Resources/icons/icon-60.png"
cp ../../../src/img/icon-120-ios.png "platforms/ios/$PROJNAME/Resources/icons/icon-60@2x.png"
cp ../../../src/img/icon-180-ios.png "platforms/ios/$PROJNAME/Resources/icons/icon-60@3x.png"
cp ../../../src/img/icon-72-ios.png "platforms/ios/$PROJNAME/Resources/icons/icon-72.png"
cp ../../../src/img/icon-144-ios.png "platforms/ios/$PROJNAME/Resources/icons/icon-72@2x.png"
cp ../../../src/img/icon-76-ios.png "platforms/ios/$PROJNAME/Resources/icons/icon-76.png"
cp ../../../src/img/icon-152-ios.png "platforms/ios/$PROJNAME/Resources/icons/icon-76@2x.png"
cp ../../../src/img/icon-29-ios.png "platforms/ios/$PROJNAME/Resources/icons/icon-small.png"
cp ../../../src/img/icon-58-ios.png "platforms/ios/$PROJNAME/Resources/icons/icon-small@2x.png"
cp ../../../src/img/icon-87-ios.png "platforms/ios/$PROJNAME/Resources/icons/icon-small@3x.png"
cp ../../../src/img/icon-57-ios.png "platforms/ios/$PROJNAME/Resources/icons/icon.png"
cp ../../../src/img/icon-114-ios.png "platforms/ios/$PROJNAME/Resources/icons/icon@2x.png"
# print reminder for manual work in xcode
echo ""
echo "### Reminder for manual steps required for iOS release"
echo "### Change deployment target to iOS 8.1"
echo "### Add retina icons to build, migrate to icon set, fix splash screens config"

View File

@ -4,6 +4,8 @@
cd `dirname $0`
cd ..
cd release/cca/Whiteout
DIR=release/cca
./platforms/android/cordova/build --release
#prepare
cd $DIR/Whiteout
cca build android --release

View File

@ -5,6 +5,7 @@ process.chdir(__dirname);
var cluster = require('cluster');
var config = require('config');
var log = require('npmlog');
var os = require('os');
log.level = config.log.level;
@ -70,24 +71,33 @@ app.disable('x-powered-by');
// web server config
//
var port = process.env.PORT || 8585,
development = process.argv[2] === '--dev';
var development = (process.argv[2] === '--dev');
// set HTTP headers
app.use(function(req, res, next) {
// prevent rendering website in foreign iframe (Clickjacking)
res.set('X-Frame-Options', 'DENY');
// HSTS
res.set('Strict-Transport-Security', 'max-age=16070400; includeSubDomains');
// CSP
var iframe = development ? "http://" + req.hostname + ":" + port : "https://" + req.hostname; // allow iframe to load assets
res.set('Content-Security-Policy', "default-src 'self' " + iframe + "; object-src 'none'; connect-src *; style-src 'self' 'unsafe-inline' " + iframe + "; img-src 'self' data:");
var iframe = development ? "http://" + req.hostname + ":" + config.server.port : "https://" + req.hostname; // allow iframe to load assets
var csp = "default-src 'self' " + iframe + "; object-src 'none'; connect-src *; style-src 'self' 'unsafe-inline' " + iframe + "; img-src *";
res.set('Content-Security-Policy', csp);
res.set('X-Content-Security-Policy', csp);
// set Cache-control Header (for AppCache)
res.set('Cache-control', 'public, max-age=0');
next();
});
app.use('/service-worker.js', noCache);
app.use('/appcache.manifest', noCache);
app.use('/appcache.manifest', function(req, res, next) {
function noCache(req, res, next) {
res.set('Cache-control', 'no-cache');
next();
}
app.use('/tpl/read-sandbox.html', function(req, res, next) {
res.set('X-Frame-Options', 'SAMEORIGIN');
next();
});
// redirect all http traffic to https
@ -110,50 +120,49 @@ app.use(express.static(__dirname + '/dist'));
//
io.on('connection', function(socket) {
log.info('io', 'New connection [%s]', socket.conn.id);
var idCounter = 0;
log.info('io', 'New connection [%s] from %s', socket.conn.id, socket.conn.remoteAddress);
socket.on('open', function(data, fn) {
var socketId = ++idCounter;
var tcp;
if (!development && config.server.outboundPorts.indexOf(data.port) < 0) {
log.info('io', 'Open request to %s:%s was rejected, closing [%s]', data.host, data.port, socket.conn.id);
socket.disconnect();
return;
}
log.verbose('io', 'Open request to %s:%s [%s:%s]', data.host, data.port, socket.conn.id, socketId);
tcp = net.connect(data.port, data.host, function() {
log.verbose('io', 'Opened tcp connection to %s:%s [%s:%s]', data.host, data.port, socket.conn.id, socketId);
log.verbose('io', 'Open request to %s:%s [%s]', data.host, data.port, socket.conn.id);
var tcp = net.connect(data.port, data.host, function() {
log.verbose('io', 'Opened tcp connection to %s:%s [%s]', data.host, data.port, socket.conn.id);
tcp.on('data', function(chunk) {
log.silly('io', 'Received %s bytes from %s:%s [%s:%s]', chunk.length, data.host, data.port, socket.conn.id, socketId);
socket.emit('data-' + socketId, chunk);
log.silly('io', 'Received %s bytes from %s:%s [%s]', chunk.length, data.host, data.port, socket.conn.id);
socket.emit('data', chunk);
});
tcp.on('error', function(err) {
log.verbose('io', 'Error for %s:%s [%s:%s]: %s', data.host, data.port, socket.conn.id, socketId, err.message);
socket.emit('error-' + socketId, err.message);
log.verbose('io', 'Error for %s:%s [%s]: %s', data.host, data.port, socket.conn.id, err.message);
socket.emit('error', err.message);
});
tcp.on('end', function() {
socket.emit('end-' + socketId);
socket.emit('end');
});
tcp.on('close', function() {
log.verbose('io', 'Closed tcp connection to %s:%s [%s:%s]', data.host, data.port, socket.conn.id, socketId);
socket.emit('close-' + socketId);
log.verbose('io', 'Closed tcp connection to %s:%s [%s]', data.host, data.port, socket.conn.id);
socket.emit('close');
socket.removeAllListeners('data-' + socketId);
socket.removeAllListeners('end-' + socketId);
socket.removeAllListeners('data');
socket.removeAllListeners('end');
});
socket.on('data-' + socketId, function(chunk, fn) {
socket.on('data', function(chunk, fn) {
if (!chunk || !chunk.length) {
if (typeof fn === 'function') {
fn();
}
return;
}
log.silly('io', 'Sending %s bytes to %s:%s [%s:%s]', chunk.length, data.host, data.port, socket.conn.id, socketId);
log.silly('io', 'Sending %s bytes to %s:%s [%s]', chunk.length, data.host, data.port, socket.conn.id);
tcp.write(chunk, function() {
if (typeof fn === 'function') {
fn();
@ -161,20 +170,21 @@ io.on('connection', function(socket) {
});
});
socket.on('end-' + socketId, function() {
log.verbose('io', 'Received request to close connection to %s:%s [%s:%s]', data.host, data.port, socket.conn.id, socketId);
socket.on('end', function() {
log.verbose('io', 'Received request to close connection to %s:%s [%s]', data.host, data.port, socket.conn.id);
tcp.end();
});
if (typeof fn === 'function') {
fn(socketId);
fn(os.hostname());
}
});
});
socket.on('disconnect', function() {
log.info('io', 'Closed connection [%s]', socket.conn.id);
socket.removeAllListeners();
socket.on('disconnect', function() {
log.verbose('io', 'Closed connection [%s], closing connection to %s:%s ', socket.conn.id, data.host, data.port);
tcp.end();
socket.removeAllListeners();
});
});
});
});
@ -182,8 +192,8 @@ io.on('connection', function(socket) {
// start server
//
server.listen(port);
server.listen(config.server.port);
if (development) {
console.log(' > starting in development mode');
}
console.log(' > listening on http://localhost:' + port + '\n');
console.log(' > listening on http://localhost:' + config.server.port + '\n');

View File

@ -2,19 +2,13 @@
chrome.app.runtime.onLaunched.addListener(function() {
chrome.runtime.getPlatformInfo(function(info) {
// don't render statusbar over app UI on iOS
if (info.os === 'cordova-ios' && window.StatusBar) {
window.StatusBar.overlaysWebView(false);
// open chrome app in new window
chrome.app.window.create('index.html', {
id: '0',
innerBounds: {
width: 1280,
height: 800
}
// open chrome app in new window
chrome.app.window.create('index.html', {
'bounds': {
'width': 1024,
'height': 768
}
});
});
});

Binary file not shown.

View File

@ -1,28 +0,0 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>Generated by IcoMoon</metadata>
<defs>
<font id="icons" horiz-adv-x="1024">
<font-face units-per-em="1024" ascent="960" descent="-64" />
<missing-glyph horiz-adv-x="1024" />
<glyph unicode="&#x20;" d="" horiz-adv-x="0" />
<glyph unicode="&#xe000;" d="M512 960c-282.046 0-512-229.954-512-512s229.954-512 512-512c282.046 0 512 229.954 512 512s-229.954 512-512 512zM620.454 448l216.954-216.954-108.454-108.454-216.954 216.954-216.954-216.954-108.454 108.454 216.954 216.954-216.954 216.954 108.454 108.454 216.954-216.954 216.954 216.954 108.454-108.454-216.954-216.954z" />
<glyph unicode="&#xe001;" d="M923.090 828.37h426.728v-125.254h-426.728zM1076.13 976.802h125.254v-426.728h-125.254zM848.85-39.052c-4.654-32.488 0-32.488-46.406-37.096-27.834-4.654-194.84-4.654-366.452-4.654-194.84 0-398.894 0-412.812 4.654-55.668 13.918-23.18 120.6 51.014 171.614 60.322 37.096 180.922 97.42 213.364 102.028 46.406 9.262 51.014 37.096 0 125.254-9.262 18.572-23.18 78.848-23.18 143.778 0 102.028 18.572 171.614 106.682 208.756 18.572 4.654 37.096 9.262 55.668 9.262 60.322 0 115.944-32.488 139.17-83.502 32.488-64.93 18.572-236.544-18.572-296.866-41.752-69.586-37.096-92.766 9.262-102.028 27.834-9.262 120.6-51.014 208.756-97.42 60.326-32.442 92.768-88.112 83.506-143.78zM1136.454 81.548c0-23.18 0-27.834-32.488-32.488-18.572-4.654-102.028-4.654-208.756-4.654-18.572 41.752-51.014 83.502-102.028 106.682-55.668 32.488-115.944 60.322-167.006 83.502 32.488 13.918 60.322 27.834 74.24 32.488 32.488 9.262 37.096 27.834 0 97.42-9.262 18.572-18.572 64.93-23.18 115.944 0 78.848 18.572 134.516 88.11 162.35 13.918 4.654 27.834 4.654 41.752 4.654 46.406 0 88.11-23.18 106.682-64.93 23.18-51.014 13.918-185.53-13.918-236.544-32.488-55.668-27.834-74.24 9.262-78.848 23.18-4.654 92.766-41.752 162.35-78.848 41.8-23.226 69.588-64.978 64.98-106.728z" horiz-adv-x="1348" />
<glyph unicode="&#xe002;" d="M0 551.488l458.048 420.416v-213.312c884.736 0 821.952-840.768 821.952-840.768-175.68 583.552-821.952 414.144-821.952 414.144v-213.312l-458.048 432.832z" horiz-adv-x="1280" />
<glyph unicode="&#xe003;" d="M677.79 796.648c4.876 4.876 39.010 39.010 97.524 58.514 78.020 24.38 160.914 4.876 224.304-58.514s87.772-141.41 58.514-224.304c-19.504-58.514-53.638-97.524-58.514-102.4l-448.61-448.61c-78.020-78.020-273.066-180.42-453.486 0s-78.020 375.466 0 448.61l482.742 482.742c19.504 19.504 48.762 19.504 63.39 0 19.504-19.504 19.504-48.762 0-63.39l-482.742-482.742c-9.752-4.876-160.914-160.914 0-321.828 156.038-156.038 307.2-14.628 321.828 0l448.61 453.486c0 0 24.38 24.38 39.010 63.39 14.628 48.762 4.876 87.772-39.010 131.658-87.772 87.772-175.542 14.628-195.048 0l-419.352-419.352c-14.628-14.628-24.38-39.010 0-68.266 24.38-24.38 48.762-14.628 63.39 0l292.572 292.572c19.504 14.628 48.762 14.628 63.39 0 19.504-19.504 19.504-48.762 0-68.266l-292.572-287.696c-39.010-39.010-121.904-68.266-195.048 0-73.142 68.266-39.010 156.038 0 195.048l429.108 419.348z" horiz-adv-x="1072" />
<glyph unicode="&#xe004;" d="M0 951.326h1445.648v-193.114h-1445.648zM0 137.788h1445.648v-193.174h-1445.648zM0 547.508h1445.648v-193.174h-1445.648z" horiz-adv-x="1444" />
<glyph unicode="&#xe005;" d="M764.712 818.958c26.138 0 46.996-20.912 46.996-46.996v-31.366c0-20.912-15.684-41.822-36.594-46.996v-679.182c0-41.822-36.594-78.362-83.59-78.362l-574.626-0.056c-46.996 0-83.59 36.594-83.59 78.362v679.182c-20.912 5.228-36.596 26.14-36.596 47.050v31.314c0 26.138 20.912 46.996 46.996 46.996h141.042l0.056 57.506c0 46.996 36.54 83.59 78.362 83.59h276.912c46.996 0 83.59-36.594 83.59-83.59v-57.452h141.042zM670.666 30.046c5.228 0 10.456 5.228 10.456 10.456v653.042h-553.822v-653.042c0-5.228 5.228-10.456 10.456-10.456h532.91zM237.030 82.27c-26.138 0-46.996 20.912-46.996 46.996l-0.002 465.004c0 26.138 20.912 41.822 46.996 41.822h10.456c26.138 0 46.996-20.912 46.996-41.822v-465.004c0-26.138-20.912-46.996-46.996-46.996h-10.454zM263.168 886.864c-5.228 0-10.456 0-10.456-10.454v-57.452h302.996v57.452c0 5.228-5.228 10.456-10.456 10.456l-282.084-0.002zM398.982 82.27c-26.138 0-46.996 20.912-46.996 46.996v465.004c0 26.138 20.912 41.822 46.996 41.822h5.228c26.138 0 46.996-20.912 46.996-41.822v-465.004c0-26.138-20.912-46.996-46.996-46.996h-5.228zM560.936 82.27c-26.138 0-46.996 20.912-46.996 46.996v465.004c0 26.138 20.912 41.822 46.996 41.822h10.456c26.138 0 46.996-20.912 46.996-41.822v-465.004c0-26.138-20.912-46.996-46.996-46.996h-10.456z" horiz-adv-x="808" />
<glyph unicode="&#xe006;" d="M876.828 327.396l126.066 126.066v-372.622c0-76.744-60.302-136.988-131.528-136.988l-739.838-0.058c-76.744 0-131.528 60.302-131.528 136.988v734.378c0 76.688 60.302 136.99 131.528 136.99h750.762l-126.066-126.066h-580.836c-27.42 0-49.322-21.902-49.322-49.322v-652.118c0-27.42 21.902-49.322 49.322-49.322h652.118c27.42 0 49.322 21.902 49.322 49.322v202.752zM613.774 239.73l-131.528 131.528-49.322-180.85 180.85 49.322zM657.636 283.592l427.464 427.464-131.586 131.468-427.406-421.944 131.528-136.988zM1134.364 754.858l60.302 60.302-136.988 136.99-60.302-60.302 136.988-136.99z" horiz-adv-x="1194" />
<glyph unicode="&#xe007;" d="M117.76 954.88l906.176-906.112-121.408-121.408-906.176 906.112zM-3.648 57.536l906.112 906.112 121.408-121.344-906.112-906.176z" />
<glyph unicode="&#xe008;" d="M0 960l1024-1024h-1024z" />
<glyph unicode="&#xe009;" d="M681.984 655.104v-119.744h-153.6v119.744c0 81.472-64.768 147.712-144.384 147.712s-144.384-66.24-144.384-147.712v-119.744h-153.6v119.744c-0.064 168.064 133.696 304.896 297.984 304.896 164.352 0 297.984-136.832 297.984-304.896zM0 476.096v-540.096h768v540.096h-768zM308.224-0.896l24.192 195.968 5.12 41.792c-21.632 15.232-35.712 40.64-35.712 69.44 0 11.136 2.112 21.696 5.888 31.296 12.096 30.848 41.664 52.736 76.288 52.736s64.192-21.888 76.288-52.736c3.776-9.664 5.888-20.224 5.888-31.296 0-28.8-14.208-54.272-35.84-69.312l5.184-41.856 24.064-195.968h-151.36z" horiz-adv-x="768" />
<glyph unicode="&#xe010;" d="M512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512 512 229.23 512 512-229.23 512-512 512zM512 32c-229.75 0-416 186.25-416 416s186.25 416 416 416 416-186.25 416-416-186.25-416-416-416zM448 704h128v-128h-128zM640 192h-256v64h64v192h-64v64h192v-256h64z" />
<glyph unicode="&#xe011;" d="M768 320.032l-182.82 182.822 438.82 329.15-128.010 127.996-548.52-219.442-172.7 172.706c-49.78 49.778-119.302 61.706-154.502 26.508-35.198-35.198-23.268-104.726 26.51-154.5l172.686-172.684-219.464-548.582 127.99-128.006 329.19 438.868 182.826-182.828v-255.98h127.994l63.992 191.988 191.988 63.996v127.992l-255.98-0.004z" />
<glyph unicode="&#xe012;" d="M1120.549 655.726v-119.954h-155.063v119.954c0 81.92-64.366 146.286-143.36 146.286s-143.36-67.291-143.36-146.286v-119.954h-155.063v119.954c0 166.766 134.583 304.274 298.423 304.274s298.423-137.509 298.423-304.274zM0 477.257v-541.257h766.537v541.257h-766.537zM307.2 0.366l23.406 196.023 5.851 40.96c-20.48 14.629-35.109 40.96-35.109 70.217 0 11.703 2.926 20.48 5.851 32.183 11.703 32.183 40.96 52.663 76.069 52.663s64.366-20.48 76.069-52.663c2.926-8.777 5.851-20.48 5.851-32.183 0-29.257-14.629-55.589-35.109-70.217l5.851-40.96 23.406-196.023h-152.137z" horiz-adv-x="1121" />
<glyph unicode="&#xe013;" d="M1352.048-64l-49.054 141.030c-91.976 257.533-300.455 309.653-459.88 309.653-76.647 0-144.096-12.263-174.754-21.461l9.198-214.611-459.88 389.365 423.090 420.024 9.198-202.347c85.844 3.066 162.491-6.132 233.006-24.527h6.132l3.066-3.066c469.078-122.635 459.88-640.766 459.88-643.832v-150.228zM843.114 441.868c144.096 0 324.982-39.856 441.485-208.479-30.659 150.228-125.701 374.036-407.76 444.551l-6.132 3.066c-70.515 18.395-153.293 24.527-245.269 21.461h-27.593l-6.132 134.898-291.257-288.192 318.85-269.796-6.132 128.766 21.461 6.132c0 0 91.976 27.593 208.479 27.593zM462.946 153.677l-462.946 389.365 423.090 416.958 12.263-171.689-55.186-6.132-6.132 52.12-291.257-288.192 315.784-266.731-3.066 49.054 55.186 6.132z" horiz-adv-x="1355" />
<glyph unicode="&#xe014;" d="M1073.595-64l-40.843 134.199c-81.687 268.399-297.573 323.829-466.781 323.829-61.265 0-110.86-8.752-137.117-11.67v-207.134l-428.855 399.681 428.855 385.094v-198.382c212.969-5.835 376.342-70.017 490.12-192.547 186.712-201.299 166.291-481.368 166.291-493.037l-11.67-140.034zM568.889 449.459c125.447 0 335.499-32.091 455.111-224.638-14.587 93.356-52.513 212.969-142.952 312.16-107.943 116.695-268.399 175.043-475.533 175.043h-26.256v131.282l-300.49-268.399 300.49-277.151v128.365l20.422 5.835c0 0 70.017 17.504 169.208 17.504z" horiz-adv-x="1085" />
<glyph unicode="&#xe015;" d="M458.105-64v272.842h-458.105v495.158l458.105 3.368v252.632l461.474-424.421 101.053-97.684-562.526-501.895zM60.632 269.474h458.105v-198.737l410.947 367.158-53.895 53.895-357.053 330.105v-175.158l-458.105-3.368v-373.895z" horiz-adv-x="1017" />
<glyph unicode="&#xe016;" d="M-0.001 447.998l511.995 511.995 47.513-47.513-511.995-511.995-47.513 47.513zM47.517 495.519l511.995-511.995-47.513-47.513-511.995 511.995 47.513 47.513z" horiz-adv-x="560" />
<glyph unicode="&#xe017;" d="M890 186.6l-169.6 171.8c27.6 48.2 42 101.8 42 155.8 0 175.2-142.4 317.8-317.2 317.8s-317.2-142.6-317.2-317.8c0-175.2 142.4-317.8 317.2-317.8 55.8 0 111 15.4 160.2 44.8l168.8-171.2c3.8-3.8 9.2-6.2 14.6-6.2s10.8 2.2 14.6 6.2l86.6 87.6c8 8.2 8 21 0 29zM445.2 708.2c106.8 0 193.6-87 193.6-194s-86.8-194-193.6-194c-106.8 0-193.6 87-193.6 194s86.8 194 193.6 194z" />
</font></defs></svg>

Before

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
src/img/Default-667h.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
src/img/Default-736h.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
src/img/Default~iphone.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

BIN
src/img/icon-100-ios.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

BIN
src/img/icon-114-ios.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
src/img/icon-144-ios.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

BIN
src/img/icon-180-ios.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View File

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

BIN
src/img/icon-29-ios.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
src/img/icon-36-android.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
src/img/icon-40-ios.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
src/img/icon-48-android.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
src/img/icon-50-ios.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
src/img/icon-57-ios.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
src/img/icon-58-ios.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
src/img/icon-60-android.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

BIN
src/img/icon-60-ios.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
src/img/icon-72-android.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

BIN
src/img/icon-72-ios.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
src/img/icon-76-ios.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

BIN
src/img/icon-78-android.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
src/img/icon-80-ios.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

BIN
src/img/icon-87-ios.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

BIN
src/img/icon-96-android.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

20
src/img/icon.svg Normal file
View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="212.72px" height="212.72px" viewBox="0 0 212.72 212.72" enable-background="new 0 0 212.72 212.72" xml:space="preserve">
<polygon opacity="0.55" fill="#00C6FF" points="124.65,160.54 49.73,160.54 49.73,82.94 "/>
<path opacity="0.3" fill="#00C6FF" d="M162.98,82.62h-44.36c-1.82-5.01-6.63-8.6-12.27-8.6c-5.63,0-10.44,3.59-12.26,8.6H49.73
l56.63-58.65L162.98,82.62z"/>
<polygon opacity="0.4" fill="#00C6FF" points="162.98,82.94 162.98,160.54 124.65,160.54 106.36,141.59 "/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#00C6FF" d="M128.46,87.06v10.45h-9.06V87.06c0-1.56-0.27-3.05-0.78-4.44
c-1.82-5.01-6.63-8.6-12.27-8.6c-5.63,0-10.44,3.59-12.26,8.6c-0.51,1.39-0.78,2.88-0.78,4.44v10.45h-9.06V87.06
c0-1.52,0.15-3,0.45-4.44c2.06-10.07,10.99-17.66,21.65-17.66c10.67,0,19.6,7.59,21.66,17.66
C128.31,84.06,128.46,85.54,128.46,87.06z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#00C6FF" d="M77.88,100.03l0.66,12.75l22.53,23.33l1.46-11.59l0.38-3.03
c-1.61-1.1-2.65-2.95-2.65-5.03c0-0.81,0.16-1.58,0.44-2.27c0.89-2.24,3.09-3.83,5.65-3.83c2.57,0,4.77,1.59,5.66,3.83
c0.28,0.69,0.44,1.46,0.44,2.27c0,2.08-1.05,3.93-2.66,5.02l0.39,3.04l1.45,11.61l22.53-23.34l0.67-12.76H77.88z"/>
<path fill="#00C6FF" d="M212.72,106.36c0,58.741-47.619,106.36-106.36,106.36S0,165.101,0,106.36S47.619,0,106.36,0
S212.72,47.619,212.72,106.36z M201.72,106.36c0-52.582-42.778-95.36-95.36-95.36C53.778,11,11,53.778,11,106.36
c0,52.582,42.778,95.36,95.36,95.36C158.942,201.72,201.72,158.942,201.72,106.36z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

25
src/img/icons/about.svg Normal file
View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="_x2014_ŽÓť_x5F_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
x="0px" y="0px" viewBox="155.9 279.2 283.5 283.5" enable-background="new 155.9 279.2 283.5 283.5" xml:space="preserve">
<g>
<path d="M297.2,557.2C296.7,557.2,296.7,557.2,297.2,557.2l-6.8-4.5c-1.8-0.9-3.2-2.3-4.5-3.2c-1.4-0.9-2.7-2.3-4.1-3.2l-3.2-2.3
l-2.3-0.9l0,0l-2.3-2.3c-60-45-96.3-86.8-111.3-127.2l0,0l-0.9-4.1c-2.3-4.1-3.2-8.6-4.1-14.1l0,0c0-0.9-0.5-1.8-0.5-3.2
c-0.5-0.9-0.5-2.3-0.5-3.2v-0.9c-0.9-2.3-0.9-4.5-0.9-6.4v-15.4l0,0c1.8-23.6,10.4-44.1,24.5-59.1c12.3-12.7,28.2-20.9,44.1-21.8
c4.5-0.9,8.6-0.9,12.7-0.9c4.1,0,9.5,0,14.1,0.9c17.3,2.7,31.3,10.9,45,25.4c13.6-14.5,27.7-22.7,45-25.4c5.5-0.9,9.5-0.9,15-0.9
c4.1,0,8.6,0,14.1,0.9c16.4,1.8,31.8,9.5,44.1,22.3c14.1,14.5,22.7,35,25,58.6l0,0v15c0,0.9-0.5,2.3-0.5,3.2
c-0.5,1.4-0.5,2.7-0.5,4.5v0.9c0,1.8-0.5,3.2-0.5,4.5c-0.5,0.9-0.5,1.8-0.5,2.7v0.9l0,0c-0.5,2.3-1.4,4.5-2.3,6.8
c-0.9,2.3-1.8,5-2.3,7.3c0,0.5-0.5,0.5-0.5,0.5c-0.5,0-0.5,0-0.5,0.5c0,0,0,0,0,0.5l-2.3,5.5c-7.7,20-20,39.5-38.6,60
c-18.2,20-40.9,40.4-70.4,62.2l0,0l-2.3,0.9c-0.9,0.5-1.8,1.4-2.7,2.3c-0.9,0.9-1.8,1.8-2.7,2.3c-1.4,0.9-2.7,2.3-4.1,3.2
c-1.4,0.9-2.7,2.3-4.5,3.2L297.2,557.2L297.2,557.2z M287.6,534.1c2.3,0.9,4.1,2.3,5.9,3.6c0.5,0.5,1.4,0.9,2.3,1.4
c2.7-0.9,5.9-2.7,7.7-5c0.5-0.5,0.5-0.5,0.9-0.9c1.8-1.8,2.7-2.7,4.5-3.6c0,0,0,0,0.5,0s0.5,0,0.5-0.5c0.5-0.5,0.5-0.5,1.4-0.5
c29.5-21.8,53.6-43.2,71.3-64.1c15.9-18.6,27.3-36.8,33.6-54.5l0,0c1.8-3.6,2.7-8.2,3.6-12.3c0-0.5,0-0.9,0.5-1.4v-0.9
c0-0.9,0.5-2.3,0.5-3.2c0.5-0.9,0.5-1.8,0.5-3.2v-0.9c0,0,0,0,0-0.5c0.9-1.8,0.9-4.1,0.9-5.9v-13.6c-4.1-44.1-32.3-66.3-56.8-68.1
l0,0c-4.1-0.9-8.2-0.9-11.4-0.9c-4.1,0-8.2,0-10.9,0.9l0,0c-20.4,3.2-31.8,14.5-45.4,30l-0.5,0.5c0,0-0.5,0-0.5-0.5
c-13.6-15.4-25-26.8-45.4-30l0,0c-4.1-0.9-8.2-0.9-12.3-0.9h-12.3c-13.2,0.9-26.3,7.7-36.3,18.6c-11.8,12.7-19.1,30-20.4,49.5v21.8
c0,0.9,0.5,1.8,0.5,3.2c0.5,0.9,0.5,2.3,0.5,3.2v0.9v0.5c0.9,4.1,1.8,7.7,4.1,12.7c6.8,17.7,18.2,36.3,33.6,54.5
c17.7,20.9,41.8,42.2,71.3,64.1c0.5,0,0.9,0.5,1.4,0.9c0.5,0,0.5,0.5,0.5,0.5h0.5c0.5,0.5,0.5,0.5,0.9,0.9
C285.4,532.2,286.3,533.1,287.6,534.1z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

18
src/img/icons/account.svg Normal file
View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Isolationsmodus" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
y="0px" viewBox="155.9 279.2 283.5 283.5" enable-background="new 155.9 279.2 283.5 283.5" xml:space="preserve">
<g>
<path d="M298.1,562.7c-77.9,0-116.5-25.5-122-30.6l-2.3-0.9l-1.4-2.3v-2.3c0-1.4,0.5-4.2,0.9-7.9c1.9-21.3,6.5-71.5,20.4-86.3
l1.4-1.4c0.9-0.5,15.3-10.2,29.2-13.9c0.5,0,21.3-5.1,30.6-15.3l0.9-0.9l0.9-9.3c0-0.5-0.5-0.9-0.9-1.4c-1.9-3.2-5.6-9.3-7.4-16.2
c-5.1-5.1-7.4-13.5-6.5-23.2v-6l0.5-1.9l0.5-0.5c0-0.5,0.5-0.9,0.9-1.4c0-13.9,0.5-40.4,17.6-51.5c2.3-1.9,12.1-10.2,34.3-10.2
c22.7,0,33.4,7.9,37.1,11.6c18.1,12.5,17.2,42.2,16.7,50.6l2.3,1.4l1.4,1.9v8.4c0,11.1-3.2,18.1-7,21.8c-1.9,6.5-5.1,12.1-8.4,17.6
l0.9,9.3l0.5,0.5c7.9,8.8,23.2,13.9,30.6,15.3c13.9,3.7,28.3,13.5,28.8,13.9l1.4,1.4c16.2,18.1,21.8,84.9,21.8,93.7l0.9,0.5v3.7
l-1.9,2.3l-2.8,1.4C412.7,538.6,374.7,562.7,298.1,562.7z M189.5,523.7c8.8,5.1,44.1,23.2,108.1,23.2c65.4,0,100.7-18.6,108.1-23.2
c-1.4-21.8-7.4-66.8-16.2-78.4c-0.5-0.5-1.4-0.5-1.9-0.9c-4.2-2.3-13-7.4-21.3-9.3c-3.7-0.5-26.9-6-39-20.4l-3.7-5.1l-0.5-1.4
l-1.4-19.5l0.5-1.9l1.4-1.4c0,0,4.6-7,7.9-15.8l2.3-21.8c1.9-16.7,0.5-38.5-9.7-45.5l-0.5-0.5l-1.4-1.4c0,0-7-6.5-25.1-7.9
c-18.1,1.4-25.1,7.9-25.1,7.9l-1.4,1.4l-0.5,0.5c-11.1,7-11.6,31.1-9.7,44.1l2.3,22.7c3.2,9.3,7,16.2,7,16.2l-0.5,1.4v1.4v19.5v1.4
l-3.2,5.1c-12.1,14.4-35.3,20-39,20.4c-7.4,1.9-15.3,6.5-19.5,9.3c-0.9,0.5-1.9,0.9-2.3,1.4C195.6,456.9,190.5,501,189.5,523.7z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="-396.7 279.2 283.5 283.5" enable-background="new -396.7 279.2 283.5 283.5" xml:space="preserve">
<g id="icomoon-ignore">
<line fill="none" stroke="#449FDB" x1="-255" y1="420.9" x2="-255" y2="420.9"/>
</g>
<path d="M-193,332.3h79.7v23.4H-193V332.3z M-164.4,304.6h23.4v79.7h-23.4V304.6z M-206.8,494.4c-0.9,6.1,0,6.1-8.7,6.9
c-5.2,0.9-36.4,0.9-68.4,0.9c-36.4,0-74.5,0-77.1-0.9c-10.4-2.6-4.3-22.5,9.5-32.1c11.3-6.9,33.8-18.2,39.9-19.1
c8.7-1.7,9.5-6.9,0-23.4c-1.7-3.5-4.3-14.7-4.3-26.9c0-19.1,3.5-32.1,19.9-39c3.5-0.9,6.9-1.7,10.4-1.7c11.3,0,21.7,6.1,26,15.6
c6.1,12.1,3.5,44.2-3.5,55.4c-7.8,13-6.9,17.3,1.7,19.1c5.2,1.7,22.5,9.5,39,18.2C-211.2,473.6-205.1,484-206.8,494.4L-206.8,494.4z
M-153.1,471.8c0,4.3,0,5.2-6.1,6.1c-3.5,0.9-19.1,0.9-39,0.9c-3.5-7.8-9.5-15.6-19.1-19.9c-10.4-6.1-21.7-11.3-31.2-15.6
c6.1-2.6,11.3-5.2,13.9-6.1c6.1-1.7,6.9-5.2,0-18.2c-1.7-3.5-3.5-12.1-4.3-21.7c0-14.7,3.5-25.1,16.5-30.3c2.6-0.9,5.2-0.9,7.8-0.9
c8.7,0,16.5,4.3,19.9,12.1c4.3,9.5,2.6,34.7-2.6,44.2c-6.1,10.4-5.2,13.9,1.7,14.7c4.3,0.9,17.3,7.8,30.3,14.7
C-157.5,456.3-152.3,464.1-153.1,471.8L-153.1,471.8z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="-404.7 279.2 283.5 283.5" enable-background="new -404.7 279.2 283.5 283.5" xml:space="preserve">
<g id="icomoon-ignore">
<line fill="none" stroke="#449FDB" x1="-263" y1="420.9" x2="-263" y2="420.9"/>
</g>
<path d="M-225,327.8c1.3-1.3,10.3-10.3,25.8-15.5c20.6-6.4,42.5-1.3,59.2,15.5c16.7,16.7,23.2,37.3,15.5,59.2
c-5.1,15.5-14.2,25.8-15.5,27l-118.5,118.5c-20.6,20.6-72.1,47.6-119.8,0s-20.6-99.2,0-118.5l127.5-127.5c5.2-5.2,12.9-5.2,16.7,0
c5.2,5.2,5.2,12.9,0,16.7l-127.5,127.5c-2.6,1.3-42.5,42.5,0,85c41.2,41.2,81.1,3.9,85,0L-158,396c0,0,6.4-6.4,10.3-16.7
c3.9-12.9,1.3-23.2-10.3-34.8c-23.2-23.2-46.4-3.9-51.5,0l-110.8,110.8c-3.9,3.9-6.4,10.3,0,18c6.4,6.4,12.9,3.9,16.7,0l77.3-77.3
c5.2-3.9,12.9-3.9,16.7,0c5.2,5.2,5.2,12.9,0,18l-77.3,76c-10.3,10.3-32.2,18-51.5,0c-19.3-18-10.3-41.2,0-51.5L-225,327.8
L-225,327.8z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

7
src/img/icons/back.svg Normal file
View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="684.8 369 470.1 841.9" enable-background="new 684.8 369 470.1 841.9" xml:space="preserve">
<polygon points="783,789.9 1154.9,1161.8 1105.8,1210.9 684.8,789.9 724.1,750.7 1105.8,369 1154.9,418.1 "/>
</svg>

After

Width:  |  Height:  |  Size: 582 B

28
src/img/icons/bug.svg Normal file
View File

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="155.9 279.2 283.5 283.5" enable-background="new 155.9 279.2 283.5 283.5" xml:space="preserve">
<g>
<path fill="#1A171B" d="M434.1,411l-40.1-1.9c16-23.1,13.2-55.1-8-76.4c-20.7-20.7-52.8-24-75.4-9l-1.4-38.7c0-3.3-2.8-6.1-6.1-5.7
c-3.3,0-6.1,2.8-5.7,6.1l1.9,48.5v0.5l0,0h-0.5c-5.2-0.5-10.8-0.5-16,0l0,0c0-0.9,0-1.4-0.5-1.9L264,296c-1.4-2.8-5.2-4.2-8-2.4
c-2.8,1.4-4.2,5.2-2.4,8L271,337l0,0c-6.6,1.9-13.2,4.2-19.3,7.5c-1.4,0.9-3.3,1.9-4.7,2.8c0.5,0,0.5-0.5,0.9-0.9
c1.4-0.9,2.4-1.4,3.8-2.4l-32.1-30.2c-2.4-2.4-6.1-2.4-8.5,0c-2.4,2.4-1.9,6.1,0,8.5l30.2,28.3c-2.8,1.9-5.2,4.2-8,7.1l-63.2,62.7
c-33,33,1.4,117.8,2.8,121.6c0.5,0.9,0.9,1.4,1.4,1.9c0.5,0.5,1.4,0.9,1.9,1.4c3.8,1.4,88.6,35.8,121.6,2.8l62.2-62.2
c2.4-2.4,4.7-5.2,7.1-8l29.7,31.1c2.4,2.4,6.1,2.4,8.5,0.5c2.4-2.4,2.4-6.1,0-8.5l-32.1-33.5l0,0c3.3-6.1,5.7-12.3,7.5-18.9l0,0
l0,0l36.8,18.4c2.8,1.4,6.6,0.5,8-2.4c1.4-2.8,0.5-6.6-2.4-8L386,438.4c-0.9-0.5-2.4-0.9-3.3-0.9l0,0c0.5-5.7,0.9-10.8,0-16.5l0,0
l0,0l0,0c0,0,0,0,0,0.5l50.4,1.9c3.3,0,6.1-2.4,6.1-5.7C439.8,413.8,437.4,411,434.1,411z M309.2,348.8c-1.4-0.5-3.3-0.9-4.7-0.9
l0,0l0,0c-0.5,0-0.9,0-1.4,0c0,0,0,0-0.5,0c0,0,0,0,0.5,0l0,0c0.5,0,0.9,0,1.4,0.5l0,0l0,0l0,0
C305.9,348.3,307.8,348.3,309.2,348.8z M299.8,346.9c0,0-0.5,0-0.9,0C298.8,346.9,299.3,346.9,299.8,346.9z M253.1,356.8
c-0.5,0.5-0.9,0.9-1.4,0.9C252.2,357.3,253.1,356.8,253.1,356.8z M178.7,428.5l62.2-62.2c1.9-1.9,3.3-3.3,5.2-4.7
c7.1,23.1,20.3,44.8,38.2,63.6L181,528.4C171.1,501.5,158.4,449.2,178.7,428.5z M351.6,477.5l-62.2,62.2
c-20.3,20.3-73.1,7.1-100.4-2.4l103.2-103.2c18.9,17.9,41,31.1,64.1,38.2C354.9,473.7,353.5,475.6,351.6,477.5z M363,461.4
c-24-7.1-46.7-20.7-66-39.6l-0.5-0.5c0,0-0.5-0.5-0.9-0.9C276.7,401.1,263,379,256,354.9c28.3-15.1,66-9,90.5,16
C371.9,395.5,378.5,433.2,363,461.4z M310.6,349.3c1.4,0.5,2.4,0.9,3.3,0.9c0.9,0.5,1.9,0.5,2.8,0.9c-0.9-0.5-1.9-0.5-2.8-0.9
C312.5,349.7,311.6,349.7,310.6,349.3z M326.7,355.9c7.5,3.8,14.1,9,20.7,15.1c3.3,3.3,6.1,7.1,9,10.8c-2.8-3.8-5.7-7.5-9-10.8
C341.3,364.8,334.2,359.6,326.7,355.9z M381.3,408.7c-2.4-9.9-6.1-19.8-11.8-29.2C375.2,388.9,379.5,398.8,381.3,408.7L381.3,408.7
z M380.9,405.8c-4.2-16-12.7-31.6-25-43.8c-1.4-1.4-2.8-2.8-4.7-4.2c1.4,1.4,2.8,2.8,4.2,4.2c5.2,5.2,9.9,10.8,13.2,17
c-3.8-6.1-8-11.3-13.2-16.5c-13.2-13.2-28.8-21.7-45.3-25.5l0,0c4.2,0.9,8,1.9,11.8,3.8c-3.3-1.4-6.6-2.4-9.9-3.3
c18.4-15.6,46.7-14.1,64.6,4.2C395,359.2,396.4,387.4,380.9,405.8z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

7
src/img/icons/check.svg Normal file
View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Isolationsmodus" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
y="0px" viewBox="155.9 279.2 283.5 283.5" enable-background="new 155.9 279.2 283.5 283.5" xml:space="preserve">
<polygon fill="#231F20" points="262.4,524.6 155.9,417.4 185.5,387.8 262.4,464.7 409.8,317.3 439.4,346.9 "/>
</svg>

After

Width:  |  Height:  |  Size: 595 B

10
src/img/icons/close.svg Normal file
View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="-406.7 279.2 283.5 283.5" enable-background="new -406.7 279.2 283.5 283.5" xml:space="preserve">
<g id="icomoon-ignore">
<line fill="none" stroke="#449FDB" x1="-265" y1="420.9" x2="-265" y2="420.9"/>
</g>
<path d="M-373.2,280.4l250,250l-33.5,33.5l-250-250L-373.2,280.4z M-406.7,527.9l250-250l33.5,33.5l-250,250L-406.7,527.9z"/>
</svg>

After

Width:  |  Height:  |  Size: 716 B

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="-406.7 279.2 283.5 283.5" enable-background="new -406.7 279.2 283.5 283.5" xml:space="preserve">
<g id="icomoon-ignore">
<line fill="none" stroke="#449FDB" x1="-265" y1="420.9" x2="-265" y2="420.9"/>
</g>
<path d="M-265,279.2c-78.1,0-141.7,63.7-141.7,141.7s63.7,141.7,141.7,141.7s141.7-63.7,141.7-141.7S-186.9,279.2-265,279.2z
M-235,420.9l60.1,60.1l-30,30l-60.1-60.1l-60.1,60.1l-30-30l60.1-60.1l-60.1-60.1l30-30l60.1,60.1l60.1-60.1l30,30L-235,420.9z"/>
</svg>

After

Width:  |  Height:  |  Size: 844 B

53
src/img/icons/contact.svg Normal file
View File

@ -0,0 +1,53 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Isolationsmodus" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
y="0px" viewBox="155.9 279.2 283.5 283.5" enable-background="new 155.9 279.2 283.5 283.5" xml:space="preserve">
<path d="M258.2,535.7c-60,0-91.7-18.5-97.4-22.3l-3-1.5c-0.8-0.4-1.9-1.1-1.9-1.9v-2.3l0.8-0.8c1.1-18.5,5.7-62.7,17.4-75.5l1.1-0.8
l1.1-0.4c0,0,0.8-0.4,1.1-0.8c3.8-2.3,12.5-7.5,21.5-9.8c0.4,0,0.8-0.4,1.9-0.8c4.2-1.1,16.6-4.9,22.6-11.7l0.4-0.8l0.8-7.9
c-0.4-0.4-0.4-0.8-0.8-1.5c-1.9-3-4.2-7.5-6-12.8c-4.5-4.5-6.4-10.6-5.7-18.5v-5.7c0-0.8,0.4-1.1,0.8-1.5l0.4-0.4
c0.4-0.4,0.8-1.1,1.1-1.5c-0.4-9.8,0.8-31.3,14.3-40.8c1.1-1.1,8.7-8.7,28.7-9.8c6.4,0.4,21.5,1.9,29.4,9.8
c12.5,8.3,14.3,26.8,14,40.8c0.4,0.4,0.8,0.8,1.1,1.1l0.8,0.4c0.4,0.4,0.8,1.1,0.8,1.5v5.3c0,7.5-1.1,13.6-5.7,18.5
c-2.3,6.4-4.9,11.7-6.8,14.3l0.4,8.3l0.8,0.8c1.5,1.5,3,2.6,4.2,3.4c0.8-0.4,1.9-0.8,2.6-0.8c2.3-0.4,15.1-3.8,21.1-10.2l0.4-0.8
l0.4-6.8c-1.5-2.6-3.4-7.2-5.3-12.5c-2.3-1.9-4.5-6.8-4.5-16.6v-4.2c0-0.8-0.4-1.1,0-1.5l1.1-1.5c-0.4-4.5-0.4-10.9,1.1-17.7
c1.9-8.7,5.7-14.7,10.9-18.9c1.1-1.1,8.7-7.9,25.7-8.3c16.2,0.4,23.8,6,26.4,8.7c11.3,7.5,12.8,25.3,12.5,35.9
c0.4,0.4,0.8,0.8,1.1,1.5v0.4c0.4,0.4,0.4,1.1,0.4,1.5v4.9c0,9.8-3,14.3-4.9,16.2c-1.9,5.7-4.2,10.2-5.7,12.5l0.8,6.8l0.8,0.8
c4.5,5.3,15.1,9.1,21.1,10.2c10.9,3,20.8,10.2,20.8,10.2l0.8,0.4l0.4,0.4c7.2,8.3,12.1,29.4,14.7,64.5c0,0.4,0,1.1,0,1.1
c0.4,0.4,0.4,0.8,0.4,1.1v2.3c0,0.8-0.4,1.1-0.8,1.9c-1.1,0.8-1.5,1.1-1.9,1.5l0,0c-1.1,0.8-8.3,5.3-21.5,10.2
c-17.7,6-38.5,9.4-60.8,9.8C347.7,518,316.3,535.7,258.2,535.7z M171.4,504.4c8.7,4.9,37.4,18.5,86.4,18.5c28.3,0,53.2-4.5,77-13.6
l0,0c4.9-2.3,9.8-4.2,9.8-4.9V504c0-7.2-1.5-21.1-4.2-34.7c-3-17.7-6-24.9-8.3-27.9c-0.4,0-0.8-0.4-1.1-0.8
c-3.4-1.9-10.6-6.4-17.4-8.3c-1.5,0-11.3-2.6-20-7.2l-0.8-0.4c-2.3-1.1-4.9-2.6-7.5-4.9c-0.4-0.4-0.8-0.4-0.8-0.8l-0.4-0.4
c-0.8-0.8-1.9-1.5-2.6-2.6l-3-3.4c-0.4-0.4-0.4-0.8-0.4-1.5l-1.5-15.5c0-0.8,0-1.1,0.4-1.5l1.5-1.9c0,0,3.8-4.9,6.4-12.5l2.3-17.4
c0.4-2.3,0.8-10.6-0.4-18.9c-1.1-8.7-3.8-14.3-7.9-17l0,0h-0.4l-0.8-0.8c-1.5-1.5-7.9-5.7-20.4-6c-11.7,0.4-18.1,4.5-19.6,6
l-0.8,0.8l-0.4,0.4c-9.4,6-9.8,27.2-8.3,35.9l2.3,18.1c2.3,7.2,6,12.1,6,12.1l1.1,1.5c0.4,0.4,0.4,0.8,0.4,1.1l-0.8,15.5
c0,0.4-0.4,1.1-0.8,1.5l-3,3.4c-10.6,11.3-29.4,15.9-32.1,16.2c-6.4,1.9-14.3,6.4-17.4,8.3l-0.4,0.4
C176.7,450.8,172.5,487.8,171.4,504.4z M316.3,419.8c11.3,2.6,23,10.6,23.8,11.3l0.8,0.8c11.3,13.2,15.5,54.7,16.6,69.8
c17.4-0.8,33.2-3,47.6-7.5c10.9-3.4,18.1-6.8,21.5-8.7c-1.1-18.5-4.9-47.9-11.3-55.5c-2.3-1.9-9.1-5.7-15.9-7.2
c-2.3-0.4-18.9-4.9-27.9-14.3l-2.6-3c-0.4-0.4-0.4-0.8-0.4-1.1l-0.8-13.6c0-0.4,0-0.8,0.4-1.5l0.8-1.5l0.4,0.4l0.4-0.4l-0.4-0.4l0,0
c0,0,3.4-4.5,5.3-11.3l2.3-15.1c0.8-6.4,1.1-25.7-7.2-31l0,0h-0.4l-0.8-0.8c-1.1-1.5-6.8-4.9-17.4-5.3c-10.6,0.4-15.9,3.8-17,4.9
l-1.1,1.1l-0.4,0.4c-8.3,4.9-7.5,24.5-6.8,31l1.9,15.5c1.9,4.9,4.5,9.4,5.3,10.6l0,0l0,0l0.8,1.5c0.4,0.4,0.4,0.8,0.4,1.1l-0.8,13.2
c0,0.4,0,0.8-0.4,1.1l-2.6,3.4c-4.9,5.3-11.3,8.3-17.4,10.9C313.3,418.7,316.3,419.8,316.3,419.8z"/>
<path d="M257.8,534c-59.6,0-91-18.5-96.6-22.3l0,0l-2.3-1.5c-0.4,0-0.4-0.4-0.4-0.8v-1.9l0,0v-0.4c1.1-18.1,4.9-62.3,16.6-74.4
l0.8-0.8h0.4c0,0,0.8-0.4,1.5-0.8c3.8-2.3,12.5-7.5,21.1-9.8c0.4,0,0.8-0.4,1.9-0.8c4.5-1.5,17-4.9,23-12.1l0.8-1.1l0.8-9.1
c-0.4-0.4-0.8-1.1-1.1-1.9c-1.5-3-4.2-7.5-6-12.8c-4.2-4.5-6-10.2-5.3-17.7v-5.7c0,0,0-0.4,0.4-0.4l0.8-0.8c0-0.8,0.8-1.1,1.1-1.5
c-0.4-9.4,0.4-31.3,13.6-40.4c1.1-1.1,8.3-8.3,27.9-9.4l0,0c6,0.4,20.8,1.9,28.3,9.4c12.1,8.3,14,26.4,13.6,40.4c0,0,0.4,0,0.4,0.4
c0.4,0.4,0.8,0.8,1.1,1.1l0.8,0.8l0.4,0.4v5.3c0.8,7.5-1.1,13.2-5.3,17.7c-1.9,6.4-4.9,12.1-7.2,14.7l0.4,9.1l1.1,1.1
c1.9,1.5,3.4,3,5.3,4.2l0,0h0.4c0.8-0.4,1.5-0.8,2.3-0.8c1.1-0.4,15.5-3.4,22.3-10.9l0.8-1.1l0.4-7.5c-1.5-2.6-4.2-7.2-6-13.2
c-1.9-1.5-5.7-5.7-4.9-15.5v-4.5c0,0,0-0.4,0.4-0.4l1.9-1.9c-0.4-4.5,0-11.3,1.1-17.7c1.9-8.3,5.3-14.3,10.6-17.7
c1.5-1.5,8.7-7.5,24.9-8.3l0,0c16.2,0.4,23.4,6.4,25.3,8.3c11.3,7.5,12.5,25.3,11.7,35.5c0.8,0.4,1.1,0.8,1.1,1.5l0.8,0.8l0.4,0.4
v4.9c0.4,9.8-3,14-4.9,15.5c-1.9,6-4.9,10.6-6,13.2l0.8,7.5l0.8,1.1c5.3,6,17,9.8,22.3,10.9l0,0c9.8,2.6,18.9,9.1,20,9.8l0.8,0.4
l0,0c6.8,7.9,11.7,29.4,14,63.8c0,0.8,0,1.1,0,1.5c0.4,0,0.4,0.4,0.4,0.8v2.3c0,0.4,0,0.4-0.4,0.4l-1.9,1.5
c-0.8,0.4-7.5,5.3-21.1,9.8c-17.7,6-38.1,9.4-60.4,9.8h-0.4C349.2,514.7,317.8,534,257.8,534z M169.5,504.9
c8.3,4.9,37.4,19.3,87.9,19.3c28.3,0,53.6-4.5,77.4-13.6l0,0c5.7-2.3,9.4-4.5,10.9-5.3v-1.5l0,0c-0.4-5.7-1.5-20.8-4.2-35.1
c-2.6-14.7-5.7-24.5-9.1-28.7c-0.4,0-0.8-0.4-1.1-0.8c-3.4-1.9-10.9-6.4-18.1-8.3c-1.5,0-10.9-2.6-19.6-7.2l-0.8-0.4
c-2.3-1.1-4.9-2.6-7.2-4.5c-0.4-0.4-0.8-0.8-1.1-1.1c-0.8-0.8-1.5-1.5-2.3-2.3l-3-3.4v-0.4l-1.5-15.5v-0.4l1.5-1.9
c0,0,3.8-5.3,6.4-12.8l2.3-17.7c0.4-2.3,0.8-10.6-0.4-19.2c-1.1-9.1-4.2-15.1-8.7-18.1l0,0l-0.8-0.8c-1.9-1.9-9.1-6-21.1-6.4
c-12.1,0.4-18.9,4.2-20.8,6.4l-0.8,0.8l0,0c-10.2,6.8-10.6,27.9-9.1,37.4l2.3,18.1c2.6,7.5,6.4,12.8,6.4,12.8l0,0l0.8,1.5v0.4
l-0.8,15.5v0.4l-3,3.4c-10.2,10.9-29.1,15.5-31,15.9c-7.2,1.9-15.1,6.8-18.1,8.7c-0.4,0-0.4,0.4-0.8,0.4
C174.8,450.2,170.3,488.3,169.5,504.9z M306.9,418.5c3.8,1.1,6.4,1.9,8.7,2.6c11.3,2.6,22.6,10.2,23,10.9l0.8,0.8l0,0
c11.7,13.6,15.5,59.3,16.2,70.2c17.7-0.4,34.3-3,49.1-7.5c12.1-3.8,19.6-7.5,22.6-9.4c-1.1-16.2-4.5-48.7-11.7-57
c-2.3-1.5-9.4-6-16.6-7.9c-1.9-0.4-18.5-4.5-27.2-14l-2.6-3v-0.4l-0.8-13.2v-0.4l0.8-1.5l0,0c0,0,3.4-4.9,5.7-11.7l2.3-15.5
c0.8-7.2,1.1-26.8-7.5-32.5l0,0l-0.8-0.8c-1.5-1.9-7.5-5.3-18.5-5.7c-10.6,0.4-16.6,3.8-18.1,5.7l-0.8,0.8l0,0
c-9.1,5.7-8.7,25.3-7.5,32.5l1.9,15.5c2.3,6.4,5.7,11.3,5.7,11.3l0,0l0.8,1.5v0.4l-0.8,13.2v0.4l-2.6,3
C322.4,412.5,314.1,415.8,306.9,418.5z"/>
</svg>

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="155.9 279.2 283.5 283.5" enable-background="new 155.9 279.2 283.5 283.5" xml:space="preserve">
<g>
<g id="icomoon-ignore_1_">
<line fill="none" stroke="#449FDB" x1="155.9" y1="291.3" x2="155.9" y2="291.3"/>
</g>
<path d="M439.4,368.2v30.2h-39.3v-30.2c0-20.7-16.4-37.2-36.3-37.2c-19.9,0-36.3,16.9-36.3,37.2v30.2h-39.3v-30.2
c0-42.3,34.1-76.9,75.6-76.9S439.4,326.3,439.4,368.2z M155.9,413.6v137h194v-137H155.9z M233.7,534.2l6-49.7l1.3-10.4
c-5.2-3.9-9.1-10.4-9.1-17.7c0-3,0.9-5.2,1.3-8.2c3-8.2,10.4-13.4,19-13.4c9.1,0,16.4,5.2,19,13.4c0.9,2.2,1.3,5.2,1.3,8.2
c0,7.3-3.9,14.3-9.1,17.7l1.3,10.4l6,49.7C272.1,534.2,233.7,534.2,233.7,534.2z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

18
src/img/icons/delete.svg Normal file
View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="155.9 279.2 283.5 283.5" enable-background="new 155.9 279.2 283.5 283.5" xml:space="preserve">
<path fill="#0A0A0A" d="M214.6,562.9c-12.3,0-22.2-9.9-22.2-21.8V344.5c0-0.5-0.5-0.9-0.9-0.9c-3.8,0-8-2.8-8-10.9
c0-6.6,7.1-7.6,12.3-7.6H234c0.5,0,0.9-0.5,0.9-0.9v-23.6c0-5.7,2.4-11.3,6.6-15.1c4.3-4.3,9.9-6.1,16.1-6.1h79.9
c6.1,0,11.8,2.4,15.6,6.1c4.3,4.3,6.6,9.5,6.6,15.1v23.6c0,0.5,0.5,0.9,0.9,0.9h38.8c5.7,0,12.3,1.9,12.3,7.6c0,5.2-2.8,9.9-8,9.9
c-0.5,0-0.9,0.5-0.9,0.9v197.2c0,11.8-9.9,21.8-22.7,21.8L214.6,562.9L214.6,562.9z M212.3,337.9c-3.8,0-7.1,3.3-7.1,7.1v197.7
c0,2.4,3.8,7.6,6.6,7.6l172.6,1.4c2.4,0,6.1-4.3,6.1-6.6l-0.9-199.1c0-3.8-3.3-7.1-7.1-7.1L212.3,337.9z M253,291
c-2.4,0-4.3,1.4-4.3,3.8v29.3c0,0.5,0.5,0.9,0.9,0.9h95.5c0.5,0,0.9-0.5,0.9-0.9v-29.3c0-2.4-1.9-3.8-4.3-3.8H253z M346.1,514.2
c-1.4,0-2.4-0.5-3.3-1.4c-3.3-3.3-2.8-10.9-2.8-10.9V383.2l0,0c0,0-0.5-7.1,2.4-9.9c0.9-0.9,1.9-1.4,3.3-1.4c1.4,0,2.4,0.5,3.3,1.4
c2.8,3.3,2.8,9.9,2.8,9.9v118.2l0,0c0,0,0.5,7.6-2.8,10.9C348.5,513.8,347.5,514.2,346.1,514.2z M298.3,514.2
c-1.4,0-2.4-0.5-3.3-1.4c-3.3-3.3-2.8-10.9-2.8-10.9V383.2l0,0c0,0-0.5-7.1,2.4-9.9c0.9-0.9,1.9-1.4,3.3-1.4c1.4,0,2.4,0.5,3.3,1.4
c2.8,3.3,2.8,9.9,2.8,9.9v118.2l0,0c0,0,0.5,7.6-2.8,10.9C300.7,513.8,299.8,514.2,298.3,514.2z M251.1,514.2
c-1.4,0-2.4-0.5-3.3-1.4c-3.3-3.3-2.8-10.9-2.8-10.9V383.2l0,0c0,0-0.5-7.1,2.4-9.9c0.9-0.9,1.9-1.4,3.3-1.4s2.4,0.5,3.3,1.4
c2.8,3.3,2.8,9.9,2.8,9.9v118.2l0,0c0,0,0.5,7.6-2.8,10.9C253.4,513.8,252,514.2,251.1,514.2z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

12
src/img/icons/draft.svg Normal file
View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Isolationsmodus" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
y="0px" viewBox="155.9 279.2 283.5 283.5" enable-background="new 155.9 279.2 283.5 283.5" xml:space="preserve">
<g id="_x31__1_">
<path fill="#231F20" d="M383.9,562.7H211.4c-13.6,0-24.6-11.1-24.6-24.6V303.9c0-13.6,11.1-24.6,24.6-24.6h113.4l83.8,83.8v175
C408.6,551.6,397.5,562.7,383.9,562.7z M211.4,291.5c-6.8,0-12.3,5.5-12.3,12.3V538c0,6.8,5.5,12.3,12.3,12.3h172.5
c6.8,0,12.3-5.5,12.3-12.3V367.9l-76.4-76.4H211.4z"/>
<path fill="#231F20" d="M402.4,371.6h-73.9c-6.8,0-12.3-5.5-12.3-12.3v-73.9h12.3v73.9h73.9V371.6z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 910 B

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="155.9 279.2 283.5 283.5" enable-background="new 155.9 279.2 283.5 283.5" xml:space="preserve">
<path d="M434.5,382.9c6.5-4.3,6.5-13,0-17.4L415,348.1c-6.5-4.3-15.2-4.3-19.5,0l-97.8,82.6L202,348.1c-6.5-4.3-15.2-4.3-19.5,0
l-21.7,17.4c-6.5,4.3-6.5,13,0,17.4l128.1,110.9c6.5,4.3,15.2,4.3,19.5,0L434.5,382.9z"/>
</svg>

After

Width:  |  Height:  |  Size: 693 B

8
src/img/icons/dropup.svg Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="141.7 281.5 283.5 283.5" enable-background="new 141.7 281.5 283.5 283.5" xml:space="preserve">
<path d="M146.6,461.2c-6.5,4.4-6.5,13,0,17.4l19.5,17.4c6.5,4.4,15.2,4.4,19.5,0l97.8-82.5l95.6,82.5c6.5,4.4,15.2,4.4,19.5,0
l21.7-17.4c6.5-4.4,6.5-13,0-17.4L292.1,350.4c-6.5-4.4-15.2-4.4-19.5,0L146.6,461.2z"/>
</svg>

After

Width:  |  Height:  |  Size: 690 B

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="155.9 279.2 283.5 283.5" enable-background="new 155.9 279.2 283.5 283.5" xml:space="preserve">
<g>
<path fill="#1A171B" d="M380.8,364.3v33.5h-42.5v-33.5c0-23.1-18-40.6-40.6-40.6c-21.3,0-40.6,18-40.6,40.6v33.5h-42.5v-33.5
c0-47.7,37.3-85,83.1-85S380.8,316.5,380.8,364.3z"/>
<path fill="#1A171B" d="M191.3,413.9v148.8h212.6V413.9H191.3z M276.4,544.7l7.1-52.9l1.9-12.3c-5.2-3.3-10.4-10.4-10.4-19.4
c0-3.3,0-5.2,1.9-9c3.3-9,12.3-14.2,21.3-14.2c9,0,18,5.2,21.3,14.2c1.9,3.3,1.9,5.2,1.9,9c0,9-3.3,14.2-10.4,19.4l1.9,12.3
l7.1,52.9H276.4L276.4,544.7z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 950 B

14
src/img/icons/folder.svg Normal file
View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Isolationsmodus" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
y="0px" viewBox="155.9 279.2 283.5 283.5" enable-background="new 155.9 279.2 283.5 283.5" xml:space="preserve">
<g id="_x32__6_">
<path fill="#231F20" d="M415.2,541.6H180c-13.3,0-24.1-10.9-24.1-24.1V378.7c0-13.3,10.9-24.1,24.1-24.1h235.2
c13.3,0,24.1,10.9,24.1,24.1v138.7C439.4,530.7,428.5,541.6,415.2,541.6z M180,366.7c-6.6,0-12.1,5.4-12.1,12.1v138.7
c0,6.6,5.4,12.1,12.1,12.1h235.2c6.6,0,12.1-5.4,12.1-12.1V378.7c0-6.6-5.4-12.1-12.1-12.1H180z"/>
<path fill="#231F20" d="M439.4,378.7h-12.1v-24.1c0-6.6-5.4-12.1-12.1-12.1H289.8c-5.4,0-13.3-3-16.9-7.2L253.6,316
c-1.8-1.8-6-3.6-8.4-3.6H180c-6.6,0-12.1,5.4-12.1,12.1v54.3h-12.1v-54.3c0-13.3,10.9-24.1,24.1-24.1h65.1c5.4,0,13.3,3,16.9,7.2
l19.3,19.3c1.8,1.8,6,3.6,8.4,3.6h125.4c13.3,0,24.1,10.9,24.1,24.1V378.7z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="155.9 279.2 283.5 283.5" enable-background="new 155.9 279.2 283.5 283.5" xml:space="preserve">
<path d="M277.7,563.1v-62H162.7V351.5l115.1,0.4v-72.7l154.9,143.4L277.7,563.1z M179.1,484.7h115.1v41.5L408,422.6L294.1,317v51.4
L179.1,368V484.7z"/>
</svg>

After

Width:  |  Height:  |  Size: 630 B

18
src/img/icons/inbox.svg Normal file
View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Isolationsmodus" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
y="0px" viewBox="155.9 279.2 283.5 283.5" enable-background="new 155.9 279.2 283.5 283.5" xml:space="preserve">
<g>
<path fill="#231F20" d="M425.5,455.9l-37.1-146.5v-0.1c-1.2-5.4-7-10-12.6-10h-157c-4.7,0-11.3,4.5-12.6,10l0,0.1l-36.4,146.5
l-13.9-3.4L192.3,306c2.7-11.6,14.6-21,26.5-21h157c12.1,0,23.7,9.2,26.5,21l37,146.4L425.5,455.9z"/>
<g>
<g>
<path fill="#231F20" d="M425.8,462.4v74.2c0,4-2.7,6.8-6.8,6.8H176.1c-4,0-6.8-2.7-6.8-6.8v-74.2h68.9
c6.1,27,30.4,47.2,59.4,47.2c28.3,0,53.3-20.2,59.4-47.2H425.8 M439.4,448.8h-88.4c-3.4,0-6.1,2.7-6.8,6.1
c-2.7,23-22.3,41.2-46.6,41.2c-24.3,0-43.9-18.2-46.6-41.2c-0.7-3.4-3.4-6.1-6.8-6.1h-88.4v87.8c0,11.5,8.8,20.2,20.2,20.2h242.9
c11.5,0,20.2-8.8,20.2-20.2L439.4,448.8L439.4,448.8z"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

12
src/img/icons/info.svg Normal file
View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="-406.7 279.2 283.5 283.5" enable-background="new -406.7 279.2 283.5 283.5" xml:space="preserve">
<g id="icomoon-ignore">
<line fill="none" stroke="#449FDB" x1="-265" y1="420.9" x2="-265" y2="420.9"/>
</g>
<path d="M-265,279.2c-78.3,0-141.7,63.5-141.7,141.7s63.5,141.7,141.7,141.7s141.7-63.5,141.7-141.7S-186.7,279.2-265,279.2z
M-265,536c-63.6,0-115.2-51.6-115.2-115.2s51.6-115.2,115.2-115.2s115.2,51.6,115.2,115.2S-201.4,536-265,536z M-282.7,350h35.4
v35.4h-35.4V350z M-229.6,491.8h-70.9V474h17.7v-53.1h-17.7v-17.7h53.1V474h17.7V491.8z"/>
</svg>

After

Width:  |  Height:  |  Size: 932 B

19
src/img/icons/key.svg Normal file
View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Isolationsmodus" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
y="0px" viewBox="155.9 279.2 283.5 283.5" enable-background="new 155.9 279.2 283.5 283.5" xml:space="preserve">
<path fill="#1A171B" d="M212.5,561.6l-40.3-0.9c-2.3,0-4.7-1.9-5.2-4.7l-6.6-55.7c0-1.4,0.5-2.8,1.4-4.2c0.9-0.9,2.3-1.4,3.7-1.4
h23.4v-22.5c0-1.4,0.5-2.8,1.4-3.7c0.9-0.9,2.3-1.4,3.7-1.4h22v-22c0-1.4,0.5-2.8,1.4-3.7c0.9-0.9,2.3-1.4,3.7-1.4h22l-0.5-30.4
c0-1.4,0.5-2.8,1.4-3.7L265,385c-7-28.6,1.4-59,22.5-80.1c15.5-15.5,37-24.8,59.9-24.8s44,8.9,60.4,24.8
c33.2,33.2,33.2,87.1,0,120.3c-15.5,15.5-37,24.8-59.9,24.8c-6.6,0-13.1-0.9-19.2-1.9L217.2,559.7
C215.3,561.1,213.9,561.6,212.5,561.6L212.5,561.6z M184.4,550.3l26.2,0.9L323,438.9c1.4-1.4,3.3-1.9,5.2-1.4
c6.1,1.4,13.1,2.3,19.7,2.3c20.1,0,38.4-7.5,52.4-21.5c29-29,29-76.8,0-105.8c-14-14-32.8-22-52.9-22s-38.4,7.5-52.9,22
c-18.7,18.7-26.2,46.8-18.7,72.6c0.5,1.9,0,3.7-1.4,5.2l-21.1,21.1l0.5,33.2c0,1.4-0.5,2.8-1.4,3.7c-0.9,0.9-2.3,1.4-3.7,1.4H227v22
c0,1.4-0.5,2.8-1.4,3.7c-0.9,0.9-2.3,1.4-3.7,1.4h-22v22.5c0,1.4-0.5,2.8-1.4,3.7c-0.9,0.9-2.3,1.4-3.7,1.4h-22.5l4.7,38.9
L279,439.8c1.9-1.9,5.2-1.9,7.5,0c1.9,1.9,1.9,5.2,0,7.5L184.4,550.3L184.4,550.3z M368.5,371.4c-7,0-14-2.8-19.7-8
c-10.8-10.8-10.8-28.1,0-38.9c5.2-5.2,11.7-8,19.7-8c7,0,14,2.8,19.7,8c5.2,5.2,8,11.7,8,19.7s-2.8,14-8,19.7
C383,368.2,376,371.4,368.5,371.4L368.5,371.4z M368.5,326.5c-4.7,0-8.9,1.9-11.7,4.7c-6.6,6.6-6.6,17.3,0,24.4
c3.3,3.3,7.5,4.7,11.7,4.7c4.7,0,8.9-1.9,11.7-4.7c3.3-3.3,4.7-7.5,4.7-11.7c0-4.7-1.9-8.9-4.7-11.7
C377.4,328.3,373.1,326.5,368.5,326.5L368.5,326.5z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

20
src/img/icons/logout.svg Normal file
View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="155.9 279.2 283.5 283.5" enable-background="new 155.9 279.2 283.5 283.5" xml:space="preserve">
<g>
<g>
<g>
<g>
<path fill="#010202" d="M314.4,475.6c0,0,0,32.4,0,48.7c-13.7,0-27,0-40.7,0c0,4.9,0,9.6,0,14.3c0.9,0.1,1.7,0,2.4,0
c16.4,0,32.9-0.1,49.3,0c2.4,0-2.2,0,3,0c-0.1-19,0-62.9,0-62.9H314.4z"/>
<path fill="#010202" d="M314.4,366.8c0,0,0-32.4,0-48.7c-13.7,0-27,0-40.7,0c0-4.9,0-9.6,0-14.3c0.9-0.1,1.7,0,2.4,0
c16.4,0,32.9,0.1,49.3,0c2.4,0-2.2,0,3,0c-0.1,19,0,62.9,0,62.9H314.4z"/>
</g>
<polygon fill="#010202" points="345.1,491.6 345.1,458.8 274.7,458.8 274.7,383.2 345.1,383.4 345.1,346.2 424.3,419.7 "/>
</g>
</g>
<path fill="#010202" d="M248.7,298.4V542L185,518V315.5L248.7,298.4 M262.8,280L171,304.7v223.1l91.8,34.5V280L262.8,280z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

9
src/img/icons/navicon.svg Executable file
View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generated by IcoMoon.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="45" height="32" viewBox="0 0 45 32">
<g id="icomoon-ignore">
<line stroke-width="1" x1="" y1="" x2="" y2="" stroke="#449FDB" opacity=""></line>
</g>
<path d="M0 0.271h45.176v6.035h-45.176zM0 25.694h45.176v6.037h-45.176zM0 12.89h45.176v6.037h-45.176z" fill="#000000"></path>
</svg>

After

Width:  |  Height:  |  Size: 558 B

12
src/img/icons/offline.svg Normal file
View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="-406.7 279.2 283.5 283.5" enable-background="new -406.7 279.2 283.5 283.5" xml:space="preserve">
<g id="icomoon-ignore">
<line fill="none" stroke="#449FDB" x1="-265" y1="420.9" x2="-265" y2="420.9"/>
</g>
<path d="M-194.1,456.3l-50.6-50.6l121.5-91.1l-35.4-35.4l-151.8,60.8l-47.8-47.8c-13.8-13.8-33-17.1-42.8-7.3
c-9.7,9.7-6.4,29,7.3,42.8l47.8,47.8l-60.8,151.9l35.4,35.4l91.1-121.5l50.6,50.6v70.9h35.4l17.7-53.1l53.1-17.7v-35.4L-194.1,456.3
L-194.1,456.3z"/>
</svg>

After

Width:  |  Height:  |  Size: 850 B

18
src/img/icons/outbox.svg Normal file
View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="155.9 279.2 283.5 283.5" enable-background="new 155.9 279.2 283.5 283.5" xml:space="preserve">
<g>
<path fill="#010202" d="M420.8,471.1l-21.2-83.7l-10.6,8.5l19,73.6h-62.6c-2.8,0-5.3,2.9-6.1,6.2c-2.4,20.2-19.6,35.8-40,35.8
c-20.5,0-37.6-15-40-35.2c-0.6-3.1-3-5.2-5.9-5.2l-62.4,0.2L221,350.4c1.2-4.7,6.7-9.1,10.7-9.1h42c4-4,7.7-8.1,12.9-12.1h-55
c-10.3,0-20.6,8.3-22.9,18.3L178,470.6l-1.7,75.3c0,9.8,7.8,16.4,19.4,16.4h208.1c10,0,17.6-6.8,17.6-16.7L420.8,471.1z
M409.5,546.7c0,3.4-2.2,4.5-5.6,4.5h-209c-3.4,0-6.3-1.8-6.3-5.2v-63l59.2-0.1c2.5,11.4,9.5,21.7,18.7,29.1
c9.3,7.6,21,11.6,33,11.6c11.7,0,23.3-4.1,32.7-11.6c9.3-7.5,15.9-17.8,18.4-29l59-0.2V546.7L409.5,546.7z"/>
<g>
<path fill="#010202" d="M438.4,348.6l-40.2,33.9l-10.6,8.9l-25.5,21.5l1.5-35.6c-5-1.5-16.2-3.5-29-3.5
c-26.3,0-60.9,8.6-76.2,51.3l-8.1,23.5c0,0,0-24.9,0.1-25c0-0.4-0.7-47.8,31.2-80.3c4-4.2,8.7-8.1,13.9-11.6
c8.7-5.9,19-10.7,31.2-13.9c0,0,25.6-5,39.9-4.5l1.5-33.9L438.4,348.6z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

13
src/img/icons/reply.svg Normal file
View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="155.9 279.2 283.5 283.5" enable-background="new 155.9 279.2 283.5 283.5" xml:space="preserve">
<g id="icomoon-ignore_3_">
<line fill="none" stroke="#449FDB" x1="297.6" y1="420.9" x2="297.6" y2="420.9"/>
</g>
<g>
<path d="M439.4,548.4L427,513c-23-64.4-75-77.2-114.7-77.2c-19.2,0-35.8,3-43.5,5.5l2.1,53.7l-115.1-97.2l105.7-104.4l2.1,51.2
c21.3-0.9,60.1,6.8,60.1,6.8C441.1,382.2,438.9,510,438.9,510.9C439.4,510.5,439.4,548.4,439.4,548.4z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 837 B

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="155.9 279.2 283.5 283.5" enable-background="new 155.9 279.2 283.5 283.5" xml:space="preserve">
<g>
<path d="M243.9,444.2l-10.6-8.4v17.6l-60.5-51l60.2-59.5v21.5l10.9-10.2v-38l-88,86.5l88,73.9L243.9,444.2L243.9,444.2z"/>
<g>
<path d="M439.1,495.2c0-0.7,1.8-106.2-95-131.6c0,0-32-6.3-49.6-5.6l-1.8-42.2l-87.2,86.2l94.6,80.2l-1.8-44.3
c6.3-1.8,20.1-4.6,35.9-4.6c32.7,0,75.6,10.6,94.6,63.7l10.2,29.2C439.5,526.5,439.5,495.2,439.1,495.2z M334.6,422
c-23.9,0-42.9,5.6-42.9,5.6l-4.6,1.4l1.4,26.4l-65.8-55.6l60.2-58l1.4,29.2h5.6c19,0,33.1,0.4,48.5,3.5l0,0
c58,14.4,81.3,60.2,87.2,91.1C401.5,430.8,364.2,422,334.6,422z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="155.9 279.2 283.5 283.5" enable-background="new 155.9 279.2 283.5 283.5" xml:space="preserve">
<g>
<path d="M439.4,511c0-0.9,2.1-128.9-115.3-159.7c0,0-38.8-7.7-60.2-6.8l-2.1-51.2L155.9,397.9l114.8,97.3l-2.1-53.8
c7.7-2.1,24.3-5.5,43.5-5.5c39.7,0,91.8,12.8,114.8,77.3l12.4,35.4C439.4,549,439.4,511,439.4,511z M312.2,422.2
c-29,0-52.1,6.8-52.1,6.8l-5.5,1.7l1.7,32l-79.8-67.5l73-70.4l1.7,35.4h6.8c23.1,0,40.1,0.4,58.9,4.3l0,0
c70.4,17.5,98.6,73,105.9,110.6C393.3,432.9,348,422.2,312.2,422.2z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 893 B

18
src/img/icons/search.svg Normal file
View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="155.9 279.2 283.5 283.5" enable-background="new 155.9 279.2 283.5 283.5" xml:space="preserve">
<g>
<g>
<path d="M264.3,493.4c-45.4,0-86.1-28.7-101.9-71.3c-15.8-42.1-2.4-91.8,32.5-121c19.6-16.3,44-25.3,69.3-25.3
c45.4,0,86.1,28.7,101.9,71.3c15.8,42.1,2.4,91.8-32.5,121C314.1,484.8,289.2,493.4,264.3,493.4z M264.3,295.4
c-37.3,0-71.7,24.4-84.2,59.3c-12.4,35.4-1.4,75.1,27.7,99.5c15.8,12.9,35.9,20.1,56.9,20.1c16.3,0,32-4.3,45.9-12.9
c32-19.6,48.8-57.4,41.6-93.7C343.7,326.5,305.9,295.4,264.3,295.4z"/>
</g>
<g>
<path d="M427.4,566.1c-1,0-2.4-0.5-2.9-1.4l-85.6-85.6c-1.4-1.9-1.4-4.3,0-5.7l7.7-7.7c1-1,1.9-1.4,2.9-1.4c1,0,1.9,0.5,2.9,1
l85.6,85.6c1,1,1.4,1.9,1.4,2.9s-0.5,2.4-1.4,2.9l-7.2,7.2C429.8,566.1,428.9,566.1,427.4,566.1z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

12
src/img/icons/sent.svg Normal file
View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="_x2014_ŽÓť_x5F_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
x="0px" y="0px" viewBox="155.9 279.2 283.5 283.5" enable-background="new 155.9 279.2 283.5 283.5" xml:space="preserve">
<g>
<g>
<path fill="#1A171B" d="M155.9,388.8L272.6,446l57.2,116.7l109.6-283.5L155.9,388.8z M186.6,390.7l217.8-84.6l-129,129
L186.6,390.7z M329.3,532.9l-44.9-89.3l129.4-129.4L329.3,532.9z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 703 B

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="100px" height="100px" viewBox="0 0 100 100" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
<!-- Generator: Sketch 3.0.4 (8053) - http://www.bohemiancoding.com/sketch -->
<title>signature-invalid-cutout</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage">
<g id="signature-invalid-cutout" sketch:type="MSArtboardGroup" transform="translate(0.110156, 0.000000)" fill="#000000">
<path d="M77.3119658,92 L50,64.6787909 L22.6865385,92 L8.00299145,77.3054987 L35.3149573,49.9977557 L8,22.6870202 L22.6850427,8.00149623 L50,35.3137279 L77.3149573,8 L92,22.6825315 L64.6850427,49.9977557 L91.9970085,77.3054987 L77.3119658,92 Z" sketch:type="MSShapeGroup"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 995 B

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="100px" height="100px" viewBox="0 0 100 100" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
<!-- Generator: Sketch 3.0.4 (8053) - http://www.bohemiancoding.com/sketch -->
<title>signature-verified-cutout</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage">
<g id="signature-verified-cutout" sketch:type="MSArtboardGroup" transform="translate(0.110156, 0.000000)" fill="#000000">
<path d="M50,97 C75.9573832,97 97,75.9573832 97,50 C97,24.0426168 75.9573832,3 50,3 C24.0426168,3 3,24.0426168 3,50 C3,75.9573832 24.0426168,97 50,97 Z M46.2732912,77.5085 L20,57.830916 L27.9184401,47.6349702 L43.3096859,59.5152262 L70.31112,23 L80.867825,30.7782191 L46.2732912,77.5085 Z" sketch:type="MSShapeGroup"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

9
src/img/icons/star.svg Normal file
View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="155.9 279.2 283.5 283.5" enable-background="new 155.9 279.2 283.5 283.5" xml:space="preserve">
<path fill="#1A171B" d="M383.5,555.1l-87.6-45.2l-87.2,45.2l16.5-96.6l-69.3-69.3l97.9-13.4l43.8-89l43.8,89l97.9,13.4l-72.4,69.3
L383.5,555.1z M181.4,398.6l57.2,55.9l-13.4,80l70.6-37.6l70.6,37.6l-13.4-80l58.6-55.9l-80-12.1l-34.9-72.4l-36.2,72.4L181.4,398.6
z"/>
</svg>

After

Width:  |  Height:  |  Size: 743 B

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="155.9 279.2 283.5 283.5" enable-background="new 155.9 279.2 283.5 283.5" xml:space="preserve">
<path fill="#1A171B" d="M383,555.1l-87.2-45.2l-87.2,45.2l16.5-96.6l-69.3-69.3l97.9-13.4l43.8-89l43.8,89l97.9,13.4l-72.9,69.3
L383,555.1z"/>
</svg>

After

Width:  |  Height:  |  Size: 621 B

14
src/img/icons/write.svg Normal file
View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="155.9 279.2 283.5 283.5" enable-background="new 155.9 279.2 283.5 283.5" xml:space="preserve">
<g>
<polygon points="316.6,462.8 288.9,435.1 278.6,473.1 "/>
<polygon points="325.8,453.6 416.3,363.1 388.6,335.4 298.1,424.5 "/>
<rect x="409.5" y="312.8" transform="matrix(-0.7071 0.7071 -0.7071 -0.7071 950.0844 272.8144)" width="18.1" height="40.8"/>
<path d="M386.1,430.2l12.8-12.4v78.8c0,16.3-12.8,28.8-27.7,28.8H214.7c-16.3,0-27.7-12.8-27.7-28.8V341.4
c0-16.3,12.8-28.8,27.7-28.8h158.7l-12.8,12.8H213.3c-5.7,0-13.5,7.8-13.5,13.5v159c0,5.7,7.8,13.5,13.5,13.5h159
c5.7,0,13.5-7.8,13.5-13.5v-67.8H386.1z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1011 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 178 KiB

View File

@ -1,12 +1,9 @@
<!DOCTYPE html>
<html ng-app="mail" ng-csp manifest="appcache.manifest">
<html ng-csp manifest="appcache.manifest">
<head>
<meta charset="utf-8">
<title>Whiteout Mail</title>
<!-- Theses CSP rules are used as a fallback in runtimes such as Cordova -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self' chrome-extension: file: gap:; object-src 'none'; script-src 'self' 'unsafe-eval' chrome-extension: file: gap:; connect-src *; style-src 'self' 'unsafe-inline' chrome-extension: file: gap:; img-src 'self' chrome-extension: file: gap: data:">
<!-- iOS homescreen link -->
<meta name="apple-mobile-web-app-capable" content="yes">
<!-- iOS iPad icon (retina) -->
@ -15,10 +12,22 @@
<link rel="apple-touch-icon" sizes="120x120" href="img/icon-120-ios.png">
<!-- iOS status bar black with white text -->
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<!-- standard homescreen link -->
<meta name="mobile-web-app-capable" content="yes">
<!-- standard icon (retina) -->
<link rel="icon" sizes="196x196" href="img/icon-196.png">
<!-- standard icons -->
<link rel="icon" sizes="36x36" href="img/icon-36-android.png">
<link rel="icon" sizes="48x48" href="img/icon-48-android.png">
<link rel="icon" sizes="72x72" href="img/icon-72-android.png">
<link rel="icon" sizes="96x96" href="img/icon-96-android.png">
<link rel="icon" sizes="144x144" href="img/icon-144-android.png">
<link rel="icon" sizes="192x192" href="img/icon-192-android.png">
<link rel="icon" sizes="196x196" href="img/icon-196-universal.png">
<!-- theme color -->
<meta name="theme-color" content="#00c6ff">
<!-- standard web app manifest -->
<link rel="manifest" href="webapp.json">
<!-- Viewport and styles -->
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
@ -26,19 +35,23 @@
<!-- The Scripts -->
<script src="socket.io/socket.io.js"></script>
<script src="lib/require.js"></script>
<script src="require-config.js"></script>
<script src="js/app.js"></script>
<script src="js/openpgp.min.js"></script>
<script src="js/forge.min.js"></script>
<script src="js/app.min.js"></script>
</head>
<body key-shortcuts>
<body wo-key-shortcuts>
<!-- inline icons have to come first, hide immediately with inline styles -->
<div style="width: 0; height: 0; visibility: hidden;">
<!-- @import img/icons/all.svg -->
</div>
<div ng-view class="main-app-view"></div>
<!-- error dialog lightbox -->
<div class="lightbox-overlay" ng-class="{'show': state.dialog.open}">
<div class="lightbox dialog view-dialog" ng-include="'tpl/dialog.html'"></div>
</div><!--/.lightbox-overlay-->
<div class="lightbox lightbox--dialog" ng-class="{'lightbox--show': state.dialog.open}"
ng-include="'tpl/dialog.html'"></div>
</body>
</html>

View File

@ -1,222 +1,115 @@
define(function(require) {
'use strict';
'use strict';
var _ = require('underscore'),
app = {},
appVersion, cloudUrl, keychainUrl, clientId;
var appCfg = {};
// parse manifest to get configurations for current runtime
try {
var manifest = chrome.runtime.getManifest();
// get key server base url
cloudUrl = _.find(manifest.permissions, function(permission) {
return typeof permission === 'string' && permission.indexOf('https://keys') === 0;
});
// remove last '/' from url due to required syntax in manifest
cloudUrl = cloudUrl.substring(0, cloudUrl.length - 1);
// get keychain server base url
keychainUrl = _.find(manifest.permissions, function(permission) {
return typeof permission === 'string' && permission.indexOf('https://keychain') === 0;
});
// remove last '/' from url due to required syntax in manifest
keychainUrl = keychainUrl.substring(0, keychainUrl.length - 1);
// get client ID for OAuth requests
clientId = manifest.oauth2.client_id;
// get the app version
appVersion = manifest.version;
} catch (e) {}
var ngModule = angular.module('woAppConfig', []);
ngModule.factory('appConfig', function() {
return appCfg;
});
module.exports = appCfg;
/**
* Global app configurations
*/
app.config = {
cloudUrl: cloudUrl || 'https://keys.whiteout.io',
privkeyServerUrl: keychainUrl || 'https://keychain.whiteout.io',
adminUrl: 'https://admin-node.whiteout.io',
wmailDomain: 'wmail.io',
serverPrivateKeyId: 'EE342F0DDBB0F3BE',
symKeySize: 256,
symIvSize: 96,
asymKeySize: 2048,
workerPath: 'js',
reconnectInterval: 10000,
wmail: {
imap: {
host: 'imap.wmail.io',
port: 993,
secure: true,
ca: '-----BEGIN CERTIFICATE-----\r\nMIIGiTCCBXGgAwIBAgIDAn03MA0GCSqGSIb3DQEBBQUAMIGMMQswCQYDVQQGEwJJ\r\nTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0\r\nYWwgQ2VydGlmaWNhdGUgU2lnbmluZzE4MDYGA1UEAxMvU3RhcnRDb20gQ2xhc3Mg\r\nMiBQcmltYXJ5IEludGVybWVkaWF0ZSBTZXJ2ZXIgQ0EwHhcNMTQwOTIxMTQ0ODQ0\r\nWhcNMTYwOTIxMTE0MzIxWjCBmTEZMBcGA1UEDRMQQ1NIeEdsdlg4Z3lRQ2c3TzEL\r\nMAkGA1UEBhMCREUxDzANBgNVBAgTBkJheWVybjEPMA0GA1UEBxMGTXVuaWNoMRUw\r\nEwYDVQQKEwxUYW5rcmVkIEhhc2UxEzARBgNVBAMUCioud21haWwuaW8xITAfBgkq\r\nhkiG9w0BCQEWEndlYm1hc3RlckB3bWFpbC5pbzCCASIwDQYJKoZIhvcNAQEBBQAD\r\nggEPADCCAQoCggEBAMkbMzFfZLYqfWG8yw2HvuNiFs5ajBFMrjG3fobePE674mPd\r\niFtXqbl3ydQ+umTtbJ6bztgxB3KgrL3lhp6IkD4VxB8YQJoYGhU6YH7FhP4QMm8l\r\ncnFLUZXEbcpcCg1tjL6+vvoTMUWEbV/zNtF/oiJ4AIOKwf0zUMZkTu1FCNrOrvpj\r\n6SAkOdBGzLTOAP5vxP43PfpZPZ4dLL2Be7ENYKXqPs0jSlUWpdT9l4AZG8rHKa2d\r\nccWvRoAsCfvpzGDoMYEx9+a1F1XjNZfzo7yJQcHdaE3Mj1eNqbjZe0+Vmact1S/3\r\nsubdcDVkFSfUMsAB5rH0D5mEhy7sMpt1WWCvOF8CAwEAAaOCAuMwggLfMAkGA1Ud\r\nEwQCMAAwCwYDVR0PBAQDAgOoMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcD\r\nATAdBgNVHQ4EFgQUv+9x4PISm5Roq4pdNoaFJeIZFfUwHwYDVR0jBBgwFoAUEdsj\r\nRf1UzGpxb4SKA9e+9wEvJoYwHwYDVR0RBBgwFoIKKi53bWFpbC5pb4IId21haWwu\r\naW8wggFWBgNVHSAEggFNMIIBSTAIBgZngQwBAgIwggE7BgsrBgEEAYG1NwECAzCC\r\nASowLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w\r\nZGYwgfcGCCsGAQUFBwICMIHqMCcWIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0\r\naG9yaXR5MAMCAQEagb5UaGlzIGNlcnRpZmljYXRlIHdhcyBpc3N1ZWQgYWNjb3Jk\r\naW5nIHRvIHRoZSBDbGFzcyAyIFZhbGlkYXRpb24gcmVxdWlyZW1lbnRzIG9mIHRo\r\nZSBTdGFydENvbSBDQSBwb2xpY3ksIHJlbGlhbmNlIG9ubHkgZm9yIHRoZSBpbnRl\r\nbmRlZCBwdXJwb3NlIGluIGNvbXBsaWFuY2Ugb2YgdGhlIHJlbHlpbmcgcGFydHkg\r\nb2JsaWdhdGlvbnMuMDUGA1UdHwQuMCwwKqAooCaGJGh0dHA6Ly9jcmwuc3RhcnRz\r\nc2wuY29tL2NydDItY3JsLmNybDCBjgYIKwYBBQUHAQEEgYEwfzA5BggrBgEFBQcw\r\nAYYtaHR0cDovL29jc3Auc3RhcnRzc2wuY29tL3N1Yi9jbGFzczIvc2VydmVyL2Nh\r\nMEIGCCsGAQUFBzAChjZodHRwOi8vYWlhLnN0YXJ0c3NsLmNvbS9jZXJ0cy9zdWIu\r\nY2xhc3MyLnNlcnZlci5jYS5jcnQwIwYDVR0SBBwwGoYYaHR0cDovL3d3dy5zdGFy\r\ndHNzbC5jb20vMA0GCSqGSIb3DQEBBQUAA4IBAQDEDbCBvdfs/lEsEJk0xGB6OghO\r\ngUAHplmWJEXoHb0h7p2QAIcs/QKorMDi35bu/J2vbVRIP7i5wBTZLIHBaf03mqAR\r\nZxYFy/ymyROVmmKl1x1/ry1aumomfU86UN8hCkvJc+40V2KC1lCZcjqPWufECjpo\r\n37QXFA+te/rVyVgvoMhIq+zOBZEK0/2mYGCwlpEQo3HElCQIwV9upChOHnQ2jZyF\r\nCmoUyv0JNr8dkh6H7+KTV6FzWaC+b6Liier9bpfEq/zDAp41GR+L/pdbaliSDtRg\r\nfPhAyCZqwsXid6HgIyTBqxUpGDGRiuygqghmqlFfppZuAqz02wrNceDHH7Up\r\n-----END CERTIFICATE-----\r\n',
pinned: true,
ignoreTLS: false
/**
* Global app configurations
*/
appCfg.config = {
pgpComment: 'Whiteout Mail - https://whiteout.io',
keyServerUrl: 'https://keys.whiteout.io',
hkpUrl: 'http://keyserver.ubuntu.com',
adminUrl: 'https://admin-node.whiteout.io',
settingsUrl: 'https://settings.whiteout.io/autodiscovery/',
mailServer: {
domain: 'wmail.io',
imap: {
hostname: 'imap.wmail.io',
port: 993,
secure: true
},
smtp: {
hostname: 'smtp.wmail.io',
port: 465,
secure: true
}
},
oauthDomains: [/\.gmail\.com$/, /\.googlemail\.com$/],
ignoreUploadOnSentDomains: [/\.gmail\.com$/, /\.googlemail\.com$/],
serverPrivateKeyId: 'EE342F0DDBB0F3BE',
symKeySize: 256,
symIvSize: 96,
asymKeySize: 2048,
workerPath: 'js',
reconnectInterval: 10000,
checkOutboxInterval: 5000,
iconPath: '/img/icon-128-chrome.png',
verificationUrl: '/verify/',
verificationUuidLength: 36,
dbVersion: 6,
appVersion: undefined,
outboxMailboxPath: 'OUTBOX',
outboxMailboxName: 'Outbox',
outboxMailboxType: 'Outbox',
connDocTimeout: 5000,
imapUpdateBatchSize: 25
};
},
smtp: {
host: 'smtp.wmail.io',
port: 465,
secure: true,
ca: '-----BEGIN CERTIFICATE-----\r\nMIIGiTCCBXGgAwIBAgIDAn03MA0GCSqGSIb3DQEBBQUAMIGMMQswCQYDVQQGEwJJ\r\nTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0\r\nYWwgQ2VydGlmaWNhdGUgU2lnbmluZzE4MDYGA1UEAxMvU3RhcnRDb20gQ2xhc3Mg\r\nMiBQcmltYXJ5IEludGVybWVkaWF0ZSBTZXJ2ZXIgQ0EwHhcNMTQwOTIxMTQ0ODQ0\r\nWhcNMTYwOTIxMTE0MzIxWjCBmTEZMBcGA1UEDRMQQ1NIeEdsdlg4Z3lRQ2c3TzEL\r\nMAkGA1UEBhMCREUxDzANBgNVBAgTBkJheWVybjEPMA0GA1UEBxMGTXVuaWNoMRUw\r\nEwYDVQQKEwxUYW5rcmVkIEhhc2UxEzARBgNVBAMUCioud21haWwuaW8xITAfBgkq\r\nhkiG9w0BCQEWEndlYm1hc3RlckB3bWFpbC5pbzCCASIwDQYJKoZIhvcNAQEBBQAD\r\nggEPADCCAQoCggEBAMkbMzFfZLYqfWG8yw2HvuNiFs5ajBFMrjG3fobePE674mPd\r\niFtXqbl3ydQ+umTtbJ6bztgxB3KgrL3lhp6IkD4VxB8YQJoYGhU6YH7FhP4QMm8l\r\ncnFLUZXEbcpcCg1tjL6+vvoTMUWEbV/zNtF/oiJ4AIOKwf0zUMZkTu1FCNrOrvpj\r\n6SAkOdBGzLTOAP5vxP43PfpZPZ4dLL2Be7ENYKXqPs0jSlUWpdT9l4AZG8rHKa2d\r\nccWvRoAsCfvpzGDoMYEx9+a1F1XjNZfzo7yJQcHdaE3Mj1eNqbjZe0+Vmact1S/3\r\nsubdcDVkFSfUMsAB5rH0D5mEhy7sMpt1WWCvOF8CAwEAAaOCAuMwggLfMAkGA1Ud\r\nEwQCMAAwCwYDVR0PBAQDAgOoMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcD\r\nATAdBgNVHQ4EFgQUv+9x4PISm5Roq4pdNoaFJeIZFfUwHwYDVR0jBBgwFoAUEdsj\r\nRf1UzGpxb4SKA9e+9wEvJoYwHwYDVR0RBBgwFoIKKi53bWFpbC5pb4IId21haWwu\r\naW8wggFWBgNVHSAEggFNMIIBSTAIBgZngQwBAgIwggE7BgsrBgEEAYG1NwECAzCC\r\nASowLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w\r\nZGYwgfcGCCsGAQUFBwICMIHqMCcWIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0\r\naG9yaXR5MAMCAQEagb5UaGlzIGNlcnRpZmljYXRlIHdhcyBpc3N1ZWQgYWNjb3Jk\r\naW5nIHRvIHRoZSBDbGFzcyAyIFZhbGlkYXRpb24gcmVxdWlyZW1lbnRzIG9mIHRo\r\nZSBTdGFydENvbSBDQSBwb2xpY3ksIHJlbGlhbmNlIG9ubHkgZm9yIHRoZSBpbnRl\r\nbmRlZCBwdXJwb3NlIGluIGNvbXBsaWFuY2Ugb2YgdGhlIHJlbHlpbmcgcGFydHkg\r\nb2JsaWdhdGlvbnMuMDUGA1UdHwQuMCwwKqAooCaGJGh0dHA6Ly9jcmwuc3RhcnRz\r\nc2wuY29tL2NydDItY3JsLmNybDCBjgYIKwYBBQUHAQEEgYEwfzA5BggrBgEFBQcw\r\nAYYtaHR0cDovL29jc3Auc3RhcnRzc2wuY29tL3N1Yi9jbGFzczIvc2VydmVyL2Nh\r\nMEIGCCsGAQUFBzAChjZodHRwOi8vYWlhLnN0YXJ0c3NsLmNvbS9jZXJ0cy9zdWIu\r\nY2xhc3MyLnNlcnZlci5jYS5jcnQwIwYDVR0SBBwwGoYYaHR0cDovL3d3dy5zdGFy\r\ndHNzbC5jb20vMA0GCSqGSIb3DQEBBQUAA4IBAQDEDbCBvdfs/lEsEJk0xGB6OghO\r\ngUAHplmWJEXoHb0h7p2QAIcs/QKorMDi35bu/J2vbVRIP7i5wBTZLIHBaf03mqAR\r\nZxYFy/ymyROVmmKl1x1/ry1aumomfU86UN8hCkvJc+40V2KC1lCZcjqPWufECjpo\r\n37QXFA+te/rVyVgvoMhIq+zOBZEK0/2mYGCwlpEQo3HElCQIwV9upChOHnQ2jZyF\r\nCmoUyv0JNr8dkh6H7+KTV6FzWaC+b6Liier9bpfEq/zDAp41GR+L/pdbaliSDtRg\r\nfPhAyCZqwsXid6HgIyTBqxUpGDGRiuygqghmqlFfppZuAqz02wrNceDHH7Up\r\n-----END CERTIFICATE-----\r\n',
pinned: true,
ignoreTLS: false
}
},
gmail: {
clientId: clientId || '440907777130.apps.googleusercontent.com',
imap: {
host: 'imap.gmail.com',
port: 993,
secure: true,
ca: '-----BEGIN CERTIFICATE-----\r\nMIIEBDCCAuygAwIBAgIDAjppMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT\r\nMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i\r\nYWwgQ0EwHhcNMTMwNDA1MTUxNTU1WhcNMTUwNDA0MTUxNTU1WjBJMQswCQYDVQQG\r\nEwJVUzETMBEGA1UEChMKR29vZ2xlIEluYzElMCMGA1UEAxMcR29vZ2xlIEludGVy\r\nbmV0IEF1dGhvcml0eSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\r\nAJwqBHdc2FCROgajguDYUEi8iT/xGXAaiEZ+4I/F8YnOIe5a/mENtzJEiaB0C1NP\r\nVaTOgmKV7utZX8bhBYASxF6UP7xbSDj0U/ck5vuR6RXEz/RTDfRK/J9U3n2+oGtv\r\nh8DQUB8oMANA2ghzUWx//zo8pzcGjr1LEQTrfSTe5vn8MXH7lNVg8y5Kr0LSy+rE\r\nahqyzFPdFUuLH8gZYR/Nnag+YyuENWllhMgZxUYi+FOVvuOAShDGKuy6lyARxzmZ\r\nEASg8GF6lSWMTlJ14rbtCMoU/M4iarNOz0YDl5cDfsCx3nuvRTPPuj5xt970JSXC\r\nDTWJnZ37DhF5iR43xa+OcmkCAwEAAaOB+zCB+DAfBgNVHSMEGDAWgBTAephojYn7\r\nqwVkDBF9qn1luMrMTjAdBgNVHQ4EFgQUSt0GFhu89mi1dvWBtrtiGrpagS8wEgYD\r\nVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAQYwOgYDVR0fBDMwMTAvoC2g\r\nK4YpaHR0cDovL2NybC5nZW90cnVzdC5jb20vY3Jscy9ndGdsb2JhbC5jcmwwPQYI\r\nKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwOi8vZ3RnbG9iYWwtb2NzcC5n\r\nZW90cnVzdC5jb20wFwYDVR0gBBAwDjAMBgorBgEEAdZ5AgUBMA0GCSqGSIb3DQEB\r\nBQUAA4IBAQA21waAESetKhSbOHezI6B1WLuxfoNCunLaHtiONgaX4PCVOzf9G0JY\r\n/iLIa704XtE7JW4S615ndkZAkNoUyHgN7ZVm2o6Gb4ChulYylYbc3GrKBIxbf/a/\r\nzG+FA1jDaFETzf3I93k9mTXwVqO94FntT0QJo544evZG0R0SnU++0ED8Vf4GXjza\r\nHFa9llF7b1cq26KqltyMdMKVvvBulRP/F/A8rLIQjcxz++iPAsbw+zOzlTvjwsto\r\nWHPbqCRiOwY1nQ2pM714A5AuTHhdUDqB1O6gyHA43LL5Z/qHQF1hwFGPa4NrzQU6\r\nyuGnBXj8ytqU0CwIPX4WecigUCAkVDNx\r\n-----END CERTIFICATE-----',
pinned: true,
ignoreTLS: false
},
smtp: {
host: 'smtp.gmail.com',
port: 465,
secure: true,
ca: '-----BEGIN CERTIFICATE-----\r\nMIIEBDCCAuygAwIBAgIDAjppMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT\r\nMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i\r\nYWwgQ0EwHhcNMTMwNDA1MTUxNTU1WhcNMTUwNDA0MTUxNTU1WjBJMQswCQYDVQQG\r\nEwJVUzETMBEGA1UEChMKR29vZ2xlIEluYzElMCMGA1UEAxMcR29vZ2xlIEludGVy\r\nbmV0IEF1dGhvcml0eSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\r\nAJwqBHdc2FCROgajguDYUEi8iT/xGXAaiEZ+4I/F8YnOIe5a/mENtzJEiaB0C1NP\r\nVaTOgmKV7utZX8bhBYASxF6UP7xbSDj0U/ck5vuR6RXEz/RTDfRK/J9U3n2+oGtv\r\nh8DQUB8oMANA2ghzUWx//zo8pzcGjr1LEQTrfSTe5vn8MXH7lNVg8y5Kr0LSy+rE\r\nahqyzFPdFUuLH8gZYR/Nnag+YyuENWllhMgZxUYi+FOVvuOAShDGKuy6lyARxzmZ\r\nEASg8GF6lSWMTlJ14rbtCMoU/M4iarNOz0YDl5cDfsCx3nuvRTPPuj5xt970JSXC\r\nDTWJnZ37DhF5iR43xa+OcmkCAwEAAaOB+zCB+DAfBgNVHSMEGDAWgBTAephojYn7\r\nqwVkDBF9qn1luMrMTjAdBgNVHQ4EFgQUSt0GFhu89mi1dvWBtrtiGrpagS8wEgYD\r\nVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAQYwOgYDVR0fBDMwMTAvoC2g\r\nK4YpaHR0cDovL2NybC5nZW90cnVzdC5jb20vY3Jscy9ndGdsb2JhbC5jcmwwPQYI\r\nKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwOi8vZ3RnbG9iYWwtb2NzcC5n\r\nZW90cnVzdC5jb20wFwYDVR0gBBAwDjAMBgorBgEEAdZ5AgUBMA0GCSqGSIb3DQEB\r\nBQUAA4IBAQA21waAESetKhSbOHezI6B1WLuxfoNCunLaHtiONgaX4PCVOzf9G0JY\r\n/iLIa704XtE7JW4S615ndkZAkNoUyHgN7ZVm2o6Gb4ChulYylYbc3GrKBIxbf/a/\r\nzG+FA1jDaFETzf3I93k9mTXwVqO94FntT0QJo544evZG0R0SnU++0ED8Vf4GXjza\r\nHFa9llF7b1cq26KqltyMdMKVvvBulRP/F/A8rLIQjcxz++iPAsbw+zOzlTvjwsto\r\nWHPbqCRiOwY1nQ2pM714A5AuTHhdUDqB1O6gyHA43LL5Z/qHQF1hwFGPa4NrzQU6\r\nyuGnBXj8ytqU0CwIPX4WecigUCAkVDNx\r\n-----END CERTIFICATE-----',
pinned: true,
ignoreTLS: false
},
ignoreUploadOnSent: true
},
yahoo: {
imap: {
host: 'imap.mail.yahoo.com',
port: 993,
secure: true,
ca: '-----BEGIN CERTIFICATE-----\r\nMIIFUjCCBDqgAwIBAgIQdThnkckQvgouzHOsQA7ctTANBgkqhkiG9w0BAQUFADCB\r\ntTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL\r\nExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTswOQYDVQQLEzJUZXJtcyBvZiB1c2Ug\r\nYXQgaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL3JwYSAoYykxMDEvMC0GA1UEAxMm\r\nVmVyaVNpZ24gQ2xhc3MgMyBTZWN1cmUgU2VydmVyIENBIC0gRzMwHhcNMTQwNDIy\r\nMDAwMDAwWhcNMTUwNDIzMjM1OTU5WjCBjDELMAkGA1UEBhMCVVMxEzARBgNVBAgT\r\nCkNhbGlmb3JuaWExEjAQBgNVBAcUCVN1bm55dmFsZTETMBEGA1UEChQKWWFob28g\r\nSW5jLjEfMB0GA1UECxQWSW5mb3JtYXRpb24gVGVjaG5vbG9neTEeMBwGA1UEAxQV\r\nKi5pbWFwLm1haWwueWFob28uY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\r\nCgKCAQEAw36HN2sgtMNQ0TZlqGgfqInK/UT6y3ZgqDdmFRU9D5D5675hfxcwJoS+\r\nb0hIn/UixbZDpSLhNkjAkOTAbFEFWar7628D2dU5WtCUlFMiwg2TA0Un8B9EbUi5\r\nwDrqzXDyABVnBVR5I2eKwr5cuB9ldjxAabcCyqQhVKdH0+IskRpUrvxAb84uQtJg\r\nJyNieOZAWdxg9fkubk1YKw/MgJHnaY8P4lUlYY8fIY39d6gW6My8oT0IersrH1X1\r\n/oCmqUIGM1PawXBvvpPKYdI4fCH75/UaEQ41BFSUn1NsinFYZUPlVcBCOvLFEOQi\r\nuU+4Tjybq3x7NNhd3uBxfm4jo4h5zQIDAQABo4IBgzCCAX8wNQYDVR0RBC4wLIIV\r\nKi5pbWFwLm1haWwueWFob28uY29tghNpbWFwLm1haWwueWFob28uY29tMAkGA1Ud\r\nEwQCMAAwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEF\r\nBQcDAjBlBgNVHSAEXjBcMFoGCmCGSAGG+EUBBzYwTDAjBggrBgEFBQcCARYXaHR0\r\ncHM6Ly9kLnN5bWNiLmNvbS9jcHMwJQYIKwYBBQUHAgIwGRoXaHR0cHM6Ly9kLnN5\r\nbWNiLmNvbS9ycGEwHwYDVR0jBBgwFoAUDURcFlNEwYJ+HSCrJfQBY9i+eaUwKwYD\r\nVR0fBCQwIjAgoB6gHIYaaHR0cDovL3NkLnN5bWNiLmNvbS9zZC5jcmwwVwYIKwYB\r\nBQUHAQEESzBJMB8GCCsGAQUFBzABhhNodHRwOi8vc2Quc3ltY2QuY29tMCYGCCsG\r\nAQUFBzAChhpodHRwOi8vc2Quc3ltY2IuY29tL3NkLmNydDANBgkqhkiG9w0BAQUF\r\nAAOCAQEAVxsglXJTtBTCoTwOd6j0iJQ+P9cxFVqHcmbshEfEQBlPwr4Sp9tLJ4kj\r\nfVi0XorWU6e6e57dtYtxpcPz+6WNSNKT0B0IBOTUTIBwSLJMHxEZI6gSS/fo1agt\r\n81B06rB8Rhn4yHwyDO/9uRvXbNYiEgpa5e6gIpXY6h6p1HscQMcuROaUA9ETvGd8\r\nDKG4XSZE7QAF9iB9WSLa/IQUD4sGMDaMp2q4XkoWZTnyL1bEDKwUvw9Z17PxVmrF\r\n8c7S5HTNU+1kyZw2LJRu3SgtsYXSWA88WFiKUPuqU+EBXmbrwLAwLAJ6mVc2bGFC\r\ng5fLGbtTscaARBlb1u3Iee2Fd419jg==\r\n-----END CERTIFICATE-----',
pinned: true,
ignoreTLS: false
},
smtp: {
host: 'smtp.mail.yahoo.com',
port: 465,
secure: true,
ca: '-----BEGIN CERTIFICATE-----\r\nMIIHITCCBgmgAwIBAgIQBlVSvxlwsqw8Kc8eVV5EKTANBgkqhkiG9w0BAQUFADBm\r\nMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\r\nd3cuZGlnaWNlcnQuY29tMSUwIwYDVQQDExxEaWdpQ2VydCBIaWdoIEFzc3VyYW5j\r\nZSBDQS0zMB4XDTE0MDYwNTAwMDAwMFoXDTE1MDYyMzEyMDAwMFowYjELMAkGA1UE\r\nBhMCVVMxCzAJBgNVBAgTAkNBMRIwEAYDVQQHEwlTdW5ueXZhbGUxFDASBgNVBAoM\r\nC1lhaG9vISBJbmMuMRwwGgYDVQQDExNzbXRwLm1haWwueWFob28uY29tMIIBIjAN\r\nBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA339OSxTIuW6NVqKwYHFBbg4/tmEx\r\nMYpzohtObPaWgvLTsYdce+WlQFBU5rxaCMUtVsVAGJWs5uQRDVHXRLPnOWe+foqZ\r\n5ItgjYIQc1XeMv6BZEeaF3Bum5ehUyLB3y48cjbWxma1QlkZ8XAK0f9AS7ySWAen\r\no5OXJlMFAqXGtKMAhY46dzSY0wjgdrvgiomFRy0iQKV1DxGsXoXSMEszlUTQoNQ3\r\nWTsiA3O//cdWE06wWeA3/90cb7QkU3KflSoyfi878BQGpPR1L+rLNsqnc8QuucbD\r\nz4Q++rxGqgg4QYrOtmZfAn96TXhPWCwKld6FN+f3uV5ITOBFx44M5v1ILQIDAQAB\r\no4IDzTCCA8kwHwYDVR0jBBgwFoAUUOpzidsp+xCPnuUBINTeeZlIg/cwHQYDVR0O\r\nBBYEFEhOpSFQjO/QrSNfVwyInZUhyzhsMIICJAYDVR0RBIICGzCCAheCE3NtdHAu\r\nbWFpbC55YWhvby5jb22CFnNtdHAubWFpbC55YWhvby5jb20uYXKCFnNtdHAubWFp\r\nbC55YWhvby5jb20uYXWCFnNtdHAubWFpbC55YWhvby5jb20uYnKCFnNtdHAubWFp\r\nbC55YWhvby5jb20uY26CFnNtdHAubWFpbC55YWhvby5jb20uaGuCFnNtdHAubWFp\r\nbC55YWhvby5jb20ubXmCFnNtdHAubWFpbC55YWhvby5jb20ucGiCFnNtdHAubWFp\r\nbC55YWhvby5jb20uc2eCFnNtdHAubWFpbC55YWhvby5jb20udHeCFnNtdHAubWFp\r\nbC55YWhvby5jb20udm6CFXNtdHAubWFpbC55YWhvby5jby5pZIIVc210cC5tYWls\r\nLnlhaG9vLmNvLmlughVzbXRwLm1haWwueWFob28uY28ua3KCFXNtdHAubWFpbC55\r\nYWhvby5jby50aIIVc210cC5tYWlsLnlhaG9vLmNvLnVrghJzbXRwLm1haWwueWFo\r\nb28uY2GCEnNtdHAubWFpbC55YWhvby5jboISc210cC5tYWlsLnlhaG9vLmRlghJz\r\nbXRwLm1haWwueWFob28uZXOCEnNtdHAubWFpbC55YWhvby5mcoISc210cC5tYWls\r\nLnlhaG9vLml0gg9zbXRwLnk3bWFpbC5jb22CFHNtdHAuY29ycmVvLnlhaG9vLmVz\r\nMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw\r\nYQYDVR0fBFowWDAqoCigJoYkaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL2NhMy1n\r\nMjguY3JsMCqgKKAmhiRodHRwOi8vY3JsNC5kaWdpY2VydC5jb20vY2EzLWcyOC5j\r\ncmwwQgYDVR0gBDswOTA3BglghkgBhv1sAQEwKjAoBggrBgEFBQcCARYcaHR0cHM6\r\nLy93d3cuZGlnaWNlcnQuY29tL0NQUzB7BggrBgEFBQcBAQRvMG0wJAYIKwYBBQUH\r\nMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBFBggrBgEFBQcwAoY5aHR0cDov\r\nL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0SGlnaEFzc3VyYW5jZUNBLTMu\r\nY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQEFBQADggEBABshjUND4hADHGfe\r\ncV9XGXcr9h3u7mT5kgdcgGFhcrFAlwkzt0NUCbuN0X8DWHE72Tpb3zRE25CmUUJe\r\nktBbq9PQb4b5/Wt1htAEw0qUs3BsUbqejK9OHJ/11Jn2ek4+SLJuYlijzc7KM3F/\r\nyz7ZTZtKR0PglkXfqbpvWYGabYpfL2FRLoJ7alTLsMJcFxbSLYcAIMxufj7RyTBJ\r\nbKgRJl4wmP4+Zc2Q1p59mENY0u5HqVAAOmWc0jNb0/31+tRr5f6EgXxK++7TQOpF\r\n0TOaFsXlzRlpKfmIbzVr2nfwghV5/bRZj96TK3g1OoOz4C8ksK4INHnUdTAqZ18M\r\nvHpnJw4=\r\n-----END CERTIFICATE-----',
pinned: true,
ignoreTLS: false
}
},
tonline: {
imap: {
host: 'secureimap.t-online.de',
port: 993,
secure: true,
ca: '-----BEGIN CERTIFICATE-----\r\nMIIGmzCCBYOgAwIBAgIIIbZ3foy9DqgwDQYJKoZIhvcNAQEFBQAwcTELMAkGA1UE\r\nBhMCREUxHDAaBgNVBAoTE0RldXRzY2hlIFRlbGVrb20gQUcxHzAdBgNVBAsTFlQt\r\nVGVsZVNlYyBUcnVzdCBDZW50ZXIxIzAhBgNVBAMTGkRldXRzY2hlIFRlbGVrb20g\r\nUm9vdCBDQSAyMB4XDTEzMDMwMTEzNTgyOVoXDTE5MDcwOTIzNTkwMFowgckxCzAJ\r\nBgNVBAYTAkRFMSUwIwYDVQQKExxULVN5c3RlbXMgSW50ZXJuYXRpb25hbCBHbWJI\r\nMR8wHQYDVQQLExZULVN5c3RlbXMgVHJ1c3QgQ2VudGVyMQwwCgYDVQQIEwNOUlcx\r\nDjAMBgNVBBETBTU3MjUwMRAwDgYDVQQHEwdOZXRwaGVuMSAwHgYDVQQJExdVbnRl\r\ncmUgSW5kdXN0cmllc3RyLiAyMDEgMB4GA1UEAxMXVGVsZVNlYyBTZXJ2ZXJQYXNz\r\nIERFLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCwg+9QiuYAxX9/\r\n4F9XRZrS1o0q+aa9L/5/K3vc+RqPpliiZ24vTkJc1JDpXrbWXS25uT3yzHukQrhI\r\nq0AbcRqNEAeFi5EhUiEM/vtb4BYGHdqfXQ3etgYYcCtJ43NAHaSgsyQ9kyGV2lmM\r\nwkeAX3qZ2CGE9/cR6w+bOogHArBdk2JaHG09myNZDytr6oUbWLjLd/qhC9YzyZSX\r\nbZgE/kh5L5Y6P9paw2pDdn7+Ni4pXzlmoj1k43uiz+h2ibe3DO9dKMZAaEKeyG1O\r\ng0f0r53M8O+8Bm2sXtWelrAgrfFlISgWzO1hkNs12rWpr4c5Ygde/behx9OQmPwp\r\nmS+e3WvTAgMBAAGjggLcMIIC2DAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFGJP\r\nE842Z4TNGfygTxmL7xVUATIcMB8GA1UdIwQYMBaAFDHDeRu69VPXF+CJei0XbAqz\r\nK50zMBIGA1UdEwEB/wQIMAYBAf8CAQAwWQYDVR0gBFIwUDBEBgkrBgEEAb1HDQIw\r\nNzA1BggrBgEFBQcCARYpaHR0cDovL3d3dy50ZWxlc2VjLmRlL3NlcnZlcnBhc3Mv\r\nY3BzLmh0bWwwCAYGZ4EMAQICMIHvBgNVHR8EgecwgeQwOqA4oDaGNGh0dHA6Ly9j\r\ncmwuc2VydmVycGFzcy50ZWxlc2VjLmRlL3JsL0RUX1JPT1RfQ0FfMi5jcmwwgaWg\r\ngaKggZ+GgZxsZGFwOi8vbGRhcC5zZXJ2ZXJwYXNzLnRlbGVzZWMuZGUvQ049RGV1\r\ndHNjaGUlMjBUZWxla29tJTIwUm9vdCUyMENBJTIwMixPVT1ULVRlbGVTZWMlMjBU\r\ncnVzdCUyMENlbnRlcixPPURldXRzY2hlJTIwVGVsZWtvbSUyMEFHLEM9REU/QXV0\r\naG9yaXR5UmV2b2NhdGlvbkxpc3QwggEjBggrBgEFBQcBAQSCARUwggERMCoGCCsG\r\nAQUFBzABhh5odHRwOi8vb2NzcDAyLnRlbGVzZWMuZGUvb2NzcHIwQQYIKwYBBQUH\r\nMAKGNWh0dHA6Ly9jcmwuc2VydmVycGFzcy50ZWxlc2VjLmRlL2NydC9EVF9ST09U\r\nX0NBXzIuY2VyMIGfBggrBgEFBQcwAoaBkmxkYXA6Ly9sZGFwLnNlcnZlcnBhc3Mu\r\ndGVsZXNlYy5kZS9DTj1EZXV0c2NoZSUyMFRlbGVrb20lMjBSb290JTIwQ0ElMjAy\r\nLE9VPVQtVGVsZVNlYyUyMFRydXN0JTIwQ2VudGVyLE89RGV1dHNjaGUlMjBUZWxl\r\na29tJTIwQUcsQz1ERT9jQUNlcnRpZmljYXRlMA0GCSqGSIb3DQEBBQUAA4IBAQBO\r\nE04qoEkEc9ad+WwSurVYfcDdjGvpqrtbI89woXDsWLQTMhA7D7jVuls90SJns0vc\r\nK9qoYkEGt0/ZlawLe2lyNWtueHfUf+dgleUunwHYLxuj3jQ2ERzQLVLrswjecRpX\r\nvGAGej89WpGQ9PMq27WGNC5WCmzVC9rk5naFgacsbwKwyjU0LoBArtAQnAAlpHDw\r\nPenv1Pe7MhUkCK0LqdTvkI/AHFzPYg/l5E3j8lQQ8hiKx8U6wf9xVKECLA2RlRqY\r\nUX2rpjQNxnvEq/mEQv3x3mLOEFJ3TAKI+soDgOOi0OG8+ywhm6S+7Z9lTlJ+BcD6\r\noy1MNKd4CQbltHLMTFUH\r\n-----END CERTIFICATE-----',
pinned: true,
ignoreTLS: false
},
smtp: {
host: 'securesmtp.t-online.de',
port: 465,
secure: true,
ca: '-----BEGIN CERTIFICATE-----\r\nMIIGmzCCBYOgAwIBAgIIIbZ3foy9DqgwDQYJKoZIhvcNAQEFBQAwcTELMAkGA1UE\r\nBhMCREUxHDAaBgNVBAoTE0RldXRzY2hlIFRlbGVrb20gQUcxHzAdBgNVBAsTFlQt\r\nVGVsZVNlYyBUcnVzdCBDZW50ZXIxIzAhBgNVBAMTGkRldXRzY2hlIFRlbGVrb20g\r\nUm9vdCBDQSAyMB4XDTEzMDMwMTEzNTgyOVoXDTE5MDcwOTIzNTkwMFowgckxCzAJ\r\nBgNVBAYTAkRFMSUwIwYDVQQKExxULVN5c3RlbXMgSW50ZXJuYXRpb25hbCBHbWJI\r\nMR8wHQYDVQQLExZULVN5c3RlbXMgVHJ1c3QgQ2VudGVyMQwwCgYDVQQIEwNOUlcx\r\nDjAMBgNVBBETBTU3MjUwMRAwDgYDVQQHEwdOZXRwaGVuMSAwHgYDVQQJExdVbnRl\r\ncmUgSW5kdXN0cmllc3RyLiAyMDEgMB4GA1UEAxMXVGVsZVNlYyBTZXJ2ZXJQYXNz\r\nIERFLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCwg+9QiuYAxX9/\r\n4F9XRZrS1o0q+aa9L/5/K3vc+RqPpliiZ24vTkJc1JDpXrbWXS25uT3yzHukQrhI\r\nq0AbcRqNEAeFi5EhUiEM/vtb4BYGHdqfXQ3etgYYcCtJ43NAHaSgsyQ9kyGV2lmM\r\nwkeAX3qZ2CGE9/cR6w+bOogHArBdk2JaHG09myNZDytr6oUbWLjLd/qhC9YzyZSX\r\nbZgE/kh5L5Y6P9paw2pDdn7+Ni4pXzlmoj1k43uiz+h2ibe3DO9dKMZAaEKeyG1O\r\ng0f0r53M8O+8Bm2sXtWelrAgrfFlISgWzO1hkNs12rWpr4c5Ygde/behx9OQmPwp\r\nmS+e3WvTAgMBAAGjggLcMIIC2DAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFGJP\r\nE842Z4TNGfygTxmL7xVUATIcMB8GA1UdIwQYMBaAFDHDeRu69VPXF+CJei0XbAqz\r\nK50zMBIGA1UdEwEB/wQIMAYBAf8CAQAwWQYDVR0gBFIwUDBEBgkrBgEEAb1HDQIw\r\nNzA1BggrBgEFBQcCARYpaHR0cDovL3d3dy50ZWxlc2VjLmRlL3NlcnZlcnBhc3Mv\r\nY3BzLmh0bWwwCAYGZ4EMAQICMIHvBgNVHR8EgecwgeQwOqA4oDaGNGh0dHA6Ly9j\r\ncmwuc2VydmVycGFzcy50ZWxlc2VjLmRlL3JsL0RUX1JPT1RfQ0FfMi5jcmwwgaWg\r\ngaKggZ+GgZxsZGFwOi8vbGRhcC5zZXJ2ZXJwYXNzLnRlbGVzZWMuZGUvQ049RGV1\r\ndHNjaGUlMjBUZWxla29tJTIwUm9vdCUyMENBJTIwMixPVT1ULVRlbGVTZWMlMjBU\r\ncnVzdCUyMENlbnRlcixPPURldXRzY2hlJTIwVGVsZWtvbSUyMEFHLEM9REU/QXV0\r\naG9yaXR5UmV2b2NhdGlvbkxpc3QwggEjBggrBgEFBQcBAQSCARUwggERMCoGCCsG\r\nAQUFBzABhh5odHRwOi8vb2NzcDAyLnRlbGVzZWMuZGUvb2NzcHIwQQYIKwYBBQUH\r\nMAKGNWh0dHA6Ly9jcmwuc2VydmVycGFzcy50ZWxlc2VjLmRlL2NydC9EVF9ST09U\r\nX0NBXzIuY2VyMIGfBggrBgEFBQcwAoaBkmxkYXA6Ly9sZGFwLnNlcnZlcnBhc3Mu\r\ndGVsZXNlYy5kZS9DTj1EZXV0c2NoZSUyMFRlbGVrb20lMjBSb290JTIwQ0ElMjAy\r\nLE9VPVQtVGVsZVNlYyUyMFRydXN0JTIwQ2VudGVyLE89RGV1dHNjaGUlMjBUZWxl\r\na29tJTIwQUcsQz1ERT9jQUNlcnRpZmljYXRlMA0GCSqGSIb3DQEBBQUAA4IBAQBO\r\nE04qoEkEc9ad+WwSurVYfcDdjGvpqrtbI89woXDsWLQTMhA7D7jVuls90SJns0vc\r\nK9qoYkEGt0/ZlawLe2lyNWtueHfUf+dgleUunwHYLxuj3jQ2ERzQLVLrswjecRpX\r\nvGAGej89WpGQ9PMq27WGNC5WCmzVC9rk5naFgacsbwKwyjU0LoBArtAQnAAlpHDw\r\nPenv1Pe7MhUkCK0LqdTvkI/AHFzPYg/l5E3j8lQQ8hiKx8U6wf9xVKECLA2RlRqY\r\nUX2rpjQNxnvEq/mEQv3x3mLOEFJ3TAKI+soDgOOi0OG8+ywhm6S+7Z9lTlJ+BcD6\r\noy1MNKd4CQbltHLMTFUH\r\n-----END CERTIFICATE-----',
pinned: true,
ignoreTLS: false
}
},
outlook: {
imap: {
host: 'imap-mail.outlook.com',
port: 993,
secure: true,
ca: '-----BEGIN CERTIFICATE-----\r\nMIIFQjCCBCqgAwIBAgISESHl0vjrML7zKmGlv42YL75vMA0GCSqGSIb3DQEBBQUA\r\nMF0xCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMTMwMQYD\r\nVQQDEypHbG9iYWxTaWduIE9yZ2FuaXphdGlvbiBWYWxpZGF0aW9uIENBIC0gRzIw\r\nHhcNMTMwNDI0MjAzNTA5WhcNMTYwNDI0MjAzNTA5WjBsMQswCQYDVQQGEwJVUzET\r\nMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMV\r\nTWljcm9zb2Z0IENvcnBvcmF0aW9uMRYwFAYDVQQDDA0qLmhvdG1haWwuY29tMIIB\r\nIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAumSiBWrzHZf6WFP5a/j4+K7D\r\n1izLoYKj5Omll0pdxKvKcBRDf+iaIkCbSOPNpx2uWGZdwNwkabYCQavaBf2ebwmS\r\nS8i1CJpHflO+k0qYd5WUi7sSsZ3+6RaCMdLoDIPGyYMQuy7TFtVO7LSt5+qscyyi\r\nET8c3lE2aj/XW13UZvRrV65ZJvMjUtwaDnIcAxGeasYoebLsKdqHQ2uTr4PmNwCc\r\nviGVFSOzkGAoC0PfyqKB2xUWy3Kc5zRI2xvUW8Jb2b/9Ze3g55pIUzKsjpglkQTm\r\nedVPSYYPGNz6Kl/ZshBXdBAk398q1JkSmUaTMa2hJgBbcC+73ax40AJDGJlz+QID\r\nAQABo4IB6zCCAecwDgYDVR0PAQH/BAQDAgWgMEkGA1UdIARCMEAwPgYGZ4EMAQIC\r\nMDQwMgYIKwYBBQUHAgEWJmh0dHBzOi8vd3d3Lmdsb2JhbHNpZ24uY29tL3JlcG9z\r\naXRvcnkvMEAGA1UdEQQ5MDeCDSouaG90bWFpbC5jb22CCioubGl2ZS5jb22CDSou\r\nb3V0bG9vay5jb22CC2hvdG1haWwuY29tMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYI\r\nKwYBBQUHAwEGCCsGAQUFBwMCMEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly9jcmwu\r\nZ2xvYmFsc2lnbi5jb20vZ3MvZ3Nvcmdhbml6YXRpb252YWxnMi5jcmwwgZYGCCsG\r\nAQUFBwEBBIGJMIGGMEcGCCsGAQUFBzAChjtodHRwOi8vc2VjdXJlLmdsb2JhbHNp\r\nZ24uY29tL2NhY2VydC9nc29yZ2FuaXphdGlvbnZhbGcyLmNydDA7BggrBgEFBQcw\r\nAYYvaHR0cDovL29jc3AyLmdsb2JhbHNpZ24uY29tL2dzb3JnYW5pemF0aW9udmFs\r\nZzIwHQYDVR0OBBYEFHbgHqTLsXDt7uMRyE62rnDEfLn9MB8GA1UdIwQYMBaAFF1G\r\nso3ES3Qcu+31c7Y6tziPdZ5+MA0GCSqGSIb3DQEBBQUAA4IBAQByy1+3N6ZRVooI\r\nxqw8Ng+UFz0g7UHkbPEnvTu1uxJ2AojFuP/P1PAk+/6uMRvpPlWg/5uqmOIWxKxJ\r\nLo6xSbkDf4LN+KYwes3XSuPyziZ4QbPnehHhZ0377iiA8fpRJADg9NWKCRHh5aAd\r\ne9QvJUW/GgYkBN+F4yYc2jIjR3Rehv4JYOKS3iXO9OoHsDS2CcCFaS2imgQVfYLg\r\nslBwT/A08PCOhW5huiluSmih7x5Qf7sFDv8jineu6ehKzi8pKnOq4k8G4QiWn38Y\r\nCeiBkkwFOwj7T3M/ITiiSS9DHDGeokj16eBi83Zx3YYiJ9YZvnQ+4GvqJ5eJJ6pR\r\nKKvemr+m\r\n-----END CERTIFICATE-----',
pinned: true,
ignoreTLS: false
},
smtp: {
host: 'smtp-mail.outlook.com',
port: 587,
secure: false,
ca: '-----BEGIN CERTIFICATE-----\r\nMIIFQjCCBCqgAwIBAgISESHl0vjrML7zKmGlv42YL75vMA0GCSqGSIb3DQEBBQUA\r\nMF0xCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMTMwMQYD\r\nVQQDEypHbG9iYWxTaWduIE9yZ2FuaXphdGlvbiBWYWxpZGF0aW9uIENBIC0gRzIw\r\nHhcNMTMwNDI0MjAzNTA5WhcNMTYwNDI0MjAzNTA5WjBsMQswCQYDVQQGEwJVUzET\r\nMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMV\r\nTWljcm9zb2Z0IENvcnBvcmF0aW9uMRYwFAYDVQQDDA0qLmhvdG1haWwuY29tMIIB\r\nIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAumSiBWrzHZf6WFP5a/j4+K7D\r\n1izLoYKj5Omll0pdxKvKcBRDf+iaIkCbSOPNpx2uWGZdwNwkabYCQavaBf2ebwmS\r\nS8i1CJpHflO+k0qYd5WUi7sSsZ3+6RaCMdLoDIPGyYMQuy7TFtVO7LSt5+qscyyi\r\nET8c3lE2aj/XW13UZvRrV65ZJvMjUtwaDnIcAxGeasYoebLsKdqHQ2uTr4PmNwCc\r\nviGVFSOzkGAoC0PfyqKB2xUWy3Kc5zRI2xvUW8Jb2b/9Ze3g55pIUzKsjpglkQTm\r\nedVPSYYPGNz6Kl/ZshBXdBAk398q1JkSmUaTMa2hJgBbcC+73ax40AJDGJlz+QID\r\nAQABo4IB6zCCAecwDgYDVR0PAQH/BAQDAgWgMEkGA1UdIARCMEAwPgYGZ4EMAQIC\r\nMDQwMgYIKwYBBQUHAgEWJmh0dHBzOi8vd3d3Lmdsb2JhbHNpZ24uY29tL3JlcG9z\r\naXRvcnkvMEAGA1UdEQQ5MDeCDSouaG90bWFpbC5jb22CCioubGl2ZS5jb22CDSou\r\nb3V0bG9vay5jb22CC2hvdG1haWwuY29tMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYI\r\nKwYBBQUHAwEGCCsGAQUFBwMCMEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly9jcmwu\r\nZ2xvYmFsc2lnbi5jb20vZ3MvZ3Nvcmdhbml6YXRpb252YWxnMi5jcmwwgZYGCCsG\r\nAQUFBwEBBIGJMIGGMEcGCCsGAQUFBzAChjtodHRwOi8vc2VjdXJlLmdsb2JhbHNp\r\nZ24uY29tL2NhY2VydC9nc29yZ2FuaXphdGlvbnZhbGcyLmNydDA7BggrBgEFBQcw\r\nAYYvaHR0cDovL29jc3AyLmdsb2JhbHNpZ24uY29tL2dzb3JnYW5pemF0aW9udmFs\r\nZzIwHQYDVR0OBBYEFHbgHqTLsXDt7uMRyE62rnDEfLn9MB8GA1UdIwQYMBaAFF1G\r\nso3ES3Qcu+31c7Y6tziPdZ5+MA0GCSqGSIb3DQEBBQUAA4IBAQByy1+3N6ZRVooI\r\nxqw8Ng+UFz0g7UHkbPEnvTu1uxJ2AojFuP/P1PAk+/6uMRvpPlWg/5uqmOIWxKxJ\r\nLo6xSbkDf4LN+KYwes3XSuPyziZ4QbPnehHhZ0377iiA8fpRJADg9NWKCRHh5aAd\r\ne9QvJUW/GgYkBN+F4yYc2jIjR3Rehv4JYOKS3iXO9OoHsDS2CcCFaS2imgQVfYLg\r\nslBwT/A08PCOhW5huiluSmih7x5Qf7sFDv8jineu6ehKzi8pKnOq4k8G4QiWn38Y\r\nCeiBkkwFOwj7T3M/ITiiSS9DHDGeokj16eBi83Zx3YYiJ9YZvnQ+4GvqJ5eJJ6pR\r\nKKvemr+m\r\n-----END CERTIFICATE-----',
pinned: true,
ignoreTLS: false
}
},
gmx: {
imap: {
host: 'imap.gmx.net',
port: 993,
secure: true,
ca: '-----BEGIN CERTIFICATE-----\r\nMIIHUDCCBjigAwIBAgIIM52e2Oc5J8kwDQYJKoZIhvcNAQEFBQAwgckxCzAJBgNV\r\nBAYTAkRFMSUwIwYDVQQKExxULVN5c3RlbXMgSW50ZXJuYXRpb25hbCBHbWJIMR8w\r\nHQYDVQQLExZULVN5c3RlbXMgVHJ1c3QgQ2VudGVyMQwwCgYDVQQIEwNOUlcxDjAM\r\nBgNVBBETBTU3MjUwMRAwDgYDVQQHEwdOZXRwaGVuMSAwHgYDVQQJExdVbnRlcmUg\r\nSW5kdXN0cmllc3RyLiAyMDEgMB4GA1UEAxMXVGVsZVNlYyBTZXJ2ZXJQYXNzIERF\r\nLTEwHhcNMTMxMTEyMTAxNzMxWhcNMTYxMTE3MjM1OTU5WjCBnTELMAkGA1UEBhMC\r\nREUxHjAcBgNVBAoMFTEmMSBNYWlsICYgTWVkaWEgR21iSDEdMBsGA1UECBMUUmhp\r\nbmVsYW5kLVBhbGF0aW5hdGUxEjAQBgNVBAcTCU1vbnRhYmF1cjEkMCIGCSqGSIb3\r\nDQEJARYVc2VydmVyLWNlcnRzQDF1bmQxLmRlMRUwEwYDVQQDEwxpbWFwLmdteC5u\r\nZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDHP3QN1ztX5m8LaC9m\r\nt2nrcLBEfxb61FQCieXW4OV/D5HEy7vgQIAeS+pg2/9ClawprQFbLUa46owUcJuq\r\no2SaefsYqjRhIP/tPeyGRJQmfnyCRRoHIYno57/bz2qmHjzvkqEUMvNGVVej7BJv\r\nGukNKPXYicodkRodF3EicTPnGitGeXOsAxyPuCPIsBPAMuuuBzKenS7nj+yseSGe\r\nkM7/kjtNgbjDyBXi2BvoUS/U+Gm9p1lq0ymT9fhGj/k9/Qz312GHYxfZB1bhL0pk\r\nadF25P8fTIy5tKMWqJfgCF+eaOwgkYecxeCcrt2E3D8ThLvmkBRrXsTT51ZzD7sp\r\n7hPpAgMBAAGjggNkMIIDYDAfBgNVHSMEGDAWgBRiTxPONmeEzRn8oE8Zi+8VVAEy\r\nHDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMB\r\nMB0GA1UdDgQWBBRfb2gYyD6V+oBN2Ii5WQj0AddemjBZBgNVHSAEUjBQMEQGCSsG\r\nAQQBvUcNAjA3MDUGCCsGAQUFBwIBFilodHRwOi8vd3d3LnRlbGVzZWMuZGUvc2Vy\r\ndmVycGFzcy9jcHMuaHRtbDAIBgZngQwBAgIwggEhBgNVHR8EggEYMIIBFDBFoEOg\r\nQYY/aHR0cDovL2NybC5zZXJ2ZXJwYXNzLnRlbGVzZWMuZGUvcmwvVGVsZVNlY19T\r\nZXJ2ZXJQYXNzX0RFLTEuY3JsMIHKoIHHoIHEhoHBbGRhcDovL2xkYXAuc2VydmVy\r\ncGFzcy50ZWxlc2VjLmRlL2NuPVRlbGVTZWMlMjBTZXJ2ZXJQYXNzJTIwREUtMSxv\r\ndT1ULVN5c3RlbXMlMjBUcnVzdCUyMENlbnRlcixvPVQtU3lzdGVtcyUyMEludGVy\r\nbmF0aW9uYWwlMjBHbWJILGM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9ubGlzdD9i\r\nYXNlP2NlcnRpZmljYXRlUmV2b2NhdGlvbmxpc3Q9KjCCATkGCCsGAQUFBwEBBIIB\r\nKzCCAScwMwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3NwLnNlcnZlcnBhc3MudGVsZXNl\r\nYy5kZS9vY3NwcjBMBggrBgEFBQcwAoZAaHR0cDovL2NybC5zZXJ2ZXJwYXNzLnRl\r\nbGVzZWMuZGUvY3J0L1RlbGVTZWNfU2VydmVyUGFzc19ERS0xLmNlcjCBoQYIKwYB\r\nBQUHMAKGgZRsZGFwOi8vbGRhcC5zZXJ2ZXJwYXNzLnRlbGVzZWMuZGUvY249VGVs\r\nZVNlYyUyMFNlcnZlclBhc3MlMjBERS0xLG91PVQtU3lzdGVtcyUyMFRydXN0JTIw\r\nQ2VudGVyLG89VC1TeXN0ZW1zJTIwSW50ZXJuYXRpb25hbCUyMEdtYkgsYz1kZT9j\r\nQUNlcnRpZmljYXRlMAwGA1UdEwEB/wQCMAAwJAYDVR0RBB0wG4IMaW1hcC5nbXgu\r\nbmV0ggtpbWFwLmdteC5kZTANBgkqhkiG9w0BAQUFAAOCAQEADl442s2ouynDNEzl\r\nBPzhCxjp47TmKzgzrCGh1AH3+UOkw54mYU65UaY9cJ51jgOu+pjNB4KxVfcqyG5O\r\nJcowS09ZtZ+khb1OkzXAAbEqNj0oyH/1K550d5Ir5VbXF0ZdVKVTzEFRyjvUt5NJ\r\n/b6Q2bbY/sPm8QiK9SPaYkO5/3J1KB0u7PkqqfOhZ9UJE6mIN66T2bpFmAwle3zL\r\n6+L/VwYSgUNs/w2l6xWlYP3pFFaT12TO43Q057I3vP7yCt3QE/VLDpdQOQ3H0oy2\r\nJQGPJLFby9MPYNkmEmwjh4e95TAY4ZkZMe08ix0J1Smy8DwjTz6SXqYC+EC/PQlh\r\nE0UHxA==\r\n-----END CERTIFICATE-----',
pinned: true,
ignoreTLS: false
},
smtp: {
host: 'mail.gmx.net',
port: 587,
secure: false,
ca: '-----BEGIN CERTIFICATE-----\r\nMIIHbDCCBlSgAwIBAgIJAJ74Ek9UaA0TMA0GCSqGSIb3DQEBBQUAMIHJMQswCQYD\r\nVQQGEwJERTElMCMGA1UEChMcVC1TeXN0ZW1zIEludGVybmF0aW9uYWwgR21iSDEf\r\nMB0GA1UECxMWVC1TeXN0ZW1zIFRydXN0IENlbnRlcjEMMAoGA1UECBMDTlJXMQ4w\r\nDAYDVQQREwU1NzI1MDEQMA4GA1UEBxMHTmV0cGhlbjEgMB4GA1UECRMXVW50ZXJl\r\nIEluZHVzdHJpZXN0ci4gMjAxIDAeBgNVBAMTF1RlbGVTZWMgU2VydmVyUGFzcyBE\r\nRS0xMB4XDTEzMTExMjEwMTY0N1oXDTE2MTExNzIzNTk1OVowgZ0xCzAJBgNVBAYT\r\nAkRFMR4wHAYDVQQKDBUxJjEgTWFpbCAmIE1lZGlhIEdtYkgxHTAbBgNVBAgTFFJo\r\naW5lbGFuZC1QYWxhdGluYXRlMRIwEAYDVQQHEwlNb250YWJhdXIxJDAiBgkqhkiG\r\n9w0BCQEWFXNlcnZlci1jZXJ0c0AxdW5kMS5kZTEVMBMGA1UEAxMMbWFpbC5nbXgu\r\nbmV0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsEUYppbJXUpQELIL\r\nETAFUwreDfSmbyi9gJPUqquogROHEoRV+bBFZ2YCiHgLU8AggcLmM74HAQMFt8F5\r\neS2OyuEar3E3tNW5XFiI1QblTtY3B7o1coKyq/i+tV3b1jGq4+1aJeeD3UpcraBm\r\nk2XuQgQ6WAeY+XCYyI/OzZ56ZjQ17LHMMI0ayu7SSV+VBpG9loC9E5A82iVtZsqo\r\nSaUZpZf/xICpUgNJ+RlalSsoE6FdCywE/gEEmkpAUh+Mv0WvHITk6aqtMFWex8tE\r\n8cwJGQbmJGt9x8BExbhMY6uQ+HsnsDCPCMVh5JGKx7/e+qyxtHYGChOeI16m2+MT\r\nz47jSQIDAQABo4IDfzCCA3swHwYDVR0jBBgwFoAUYk8TzjZnhM0Z/KBPGYvvFVQB\r\nMhwwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcD\r\nATAdBgNVHQ4EFgQUH8mLfxsd5FEh9M+3t3rP6qLiFTEwWQYDVR0gBFIwUDBEBgkr\r\nBgEEAb1HDQIwNzA1BggrBgEFBQcCARYpaHR0cDovL3d3dy50ZWxlc2VjLmRlL3Nl\r\ncnZlcnBhc3MvY3BzLmh0bWwwCAYGZ4EMAQICMIIBIQYDVR0fBIIBGDCCARQwRaBD\r\noEGGP2h0dHA6Ly9jcmwuc2VydmVycGFzcy50ZWxlc2VjLmRlL3JsL1RlbGVTZWNf\r\nU2VydmVyUGFzc19ERS0xLmNybDCByqCBx6CBxIaBwWxkYXA6Ly9sZGFwLnNlcnZl\r\ncnBhc3MudGVsZXNlYy5kZS9jbj1UZWxlU2VjJTIwU2VydmVyUGFzcyUyMERFLTEs\r\nb3U9VC1TeXN0ZW1zJTIwVHJ1c3QlMjBDZW50ZXIsbz1ULVN5c3RlbXMlMjBJbnRl\r\ncm5hdGlvbmFsJTIwR21iSCxjPWRlP2NlcnRpZmljYXRlUmV2b2NhdGlvbmxpc3Q/\r\nYmFzZT9jZXJ0aWZpY2F0ZVJldm9jYXRpb25saXN0PSowggE5BggrBgEFBQcBAQSC\r\nASswggEnMDMGCCsGAQUFBzABhidodHRwOi8vb2NzcC5zZXJ2ZXJwYXNzLnRlbGVz\r\nZWMuZGUvb2NzcHIwTAYIKwYBBQUHMAKGQGh0dHA6Ly9jcmwuc2VydmVycGFzcy50\r\nZWxlc2VjLmRlL2NydC9UZWxlU2VjX1NlcnZlclBhc3NfREUtMS5jZXIwgaEGCCsG\r\nAQUFBzAChoGUbGRhcDovL2xkYXAuc2VydmVycGFzcy50ZWxlc2VjLmRlL2NuPVRl\r\nbGVTZWMlMjBTZXJ2ZXJQYXNzJTIwREUtMSxvdT1ULVN5c3RlbXMlMjBUcnVzdCUy\r\nMENlbnRlcixvPVQtU3lzdGVtcyUyMEludGVybmF0aW9uYWwlMjBHbWJILGM9ZGU/\r\nY0FDZXJ0aWZpY2F0ZTAMBgNVHRMBAf8EAjAAMD8GA1UdEQQ4MDaCDG1haWwuZ214\r\nLm5ldIILbWFpbC5nbXguZGWCDHNtdHAuZ214Lm5ldIILc210cC5nbXguZGUwDQYJ\r\nKoZIhvcNAQEFBQADggEBAJ5SKsBXoOTO0ztsFh8RVd/iu6sijEMpKVF+/cs74TZN\r\nK1QWIz8Ay1f3SUPWXTvkmvayUXWGtxZfYoRIrx3feWBdUozJxe0wz1O3tDQOQgRX\r\nnkcwk7nibTUmW2rk5AIwV0jzOHtIbAGjSdc6my0543e7dVkhcuoCOC+g2NmD+pHF\r\ni1KpmqTLecDlFvprIZUJ23AT1uTnuXYg/tFHeDn3ga00Gce82xZQJelRirJs01SR\r\nDGEBaPXBjJVJNoAP/qEy3jQNRWo5TbSgwn3DTR81FJvltmf0c+zlt4fmcpjpr5ni\r\nFvK7L0rZQL5MOGHPpgRIukEBZCowYr3OYpZYBEaB94I=\r\n-----END CERTIFICATE-----',
pinned: true,
ignoreTLS: false
}
},
webde: {
imap: {
host: 'imap.web.de',
port: 993,
secure: true,
ca: '-----BEGIN CERTIFICATE-----\r\nMIIHUjCCBjqgAwIBAgIIHvqUOScyxYUwDQYJKoZIhvcNAQEFBQAwgckxCzAJBgNV\r\nBAYTAkRFMSUwIwYDVQQKExxULVN5c3RlbXMgSW50ZXJuYXRpb25hbCBHbWJIMR8w\r\nHQYDVQQLExZULVN5c3RlbXMgVHJ1c3QgQ2VudGVyMQwwCgYDVQQIEwNOUlcxDjAM\r\nBgNVBBETBTU3MjUwMRAwDgYDVQQHEwdOZXRwaGVuMSAwHgYDVQQJExdVbnRlcmUg\r\nSW5kdXN0cmllc3RyLiAyMDEgMB4GA1UEAxMXVGVsZVNlYyBTZXJ2ZXJQYXNzIERF\r\nLTEwHhcNMTMwODIxMDgzMTE2WhcNMTYwODI2MjM1OTU5WjCBrTELMAkGA1UEBhMC\r\nREUxHjAcBgNVBAoMFTEmMSBNYWlsICYgTWVkaWEgR21iSDEPMA0GA1UECxMGV0VC\r\nLkRFMR0wGwYDVQQIExRSaGluZWxhbmQtUGFsYXRpbmF0ZTESMBAGA1UEBxMJTW9u\r\ndGFiYXVyMSQwIgYJKoZIhvcNAQkBFhVzZXJ2ZXItY2VydHNAMXVuZDEuZGUxFDAS\r\nBgNVBAMTC2ltYXAud2ViLmRlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC\r\nAQEA5dvpcnYczFs9GANTYN5N3mP6ATFVm7P4nYhRIQMj/YssSjmbrOPIEbe12JNC\r\nRO9CI7Z4Dnk42BM5TiH+QKGpcfnitofOv4gKPjwCMcPDHfY152/+YDaiyU/md2Hg\r\n/WrZ/50KwC8Sw1tZkYDXWB0zeJkfPdS2r4ATNrpMR0fYcG08+elz5T2SWNg+c1xL\r\nKFdCh33wZLkijOfW0HA164QjXaLPBjxa+GyZFY19ywOQ85KdFVVLmGUrLz8n4ZLc\r\n7K6KUuzYttnUuVxctFauQ4DRHE/CfUvvNHHgn5d+A2XS7jNUgmUb0gjzy3OtlTP3\r\ngM4ostVufmnlS7qqFDR7A3v4lQIDAQABo4IDVjCCA1IwHwYDVR0jBBgwFoAUYk8T\r\nzjZnhM0Z/KBPGYvvFVQBMhwwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsG\r\nAQUFBwMCBggrBgEFBQcDATAdBgNVHQ4EFgQUDH66P/Y4NlKGphPniIzmutEI9ocw\r\nWQYDVR0gBFIwUDBEBgkrBgEEAb1HDQIwNzA1BggrBgEFBQcCARYpaHR0cDovL3d3\r\ndy50ZWxlc2VjLmRlL3NlcnZlcnBhc3MvY3BzLmh0bWwwCAYGZ4EMAQICMIIBIQYD\r\nVR0fBIIBGDCCARQwRaBDoEGGP2h0dHA6Ly9jcmwuc2VydmVycGFzcy50ZWxlc2Vj\r\nLmRlL3JsL1RlbGVTZWNfU2VydmVyUGFzc19ERS0xLmNybDCByqCBx6CBxIaBwWxk\r\nYXA6Ly9sZGFwLnNlcnZlcnBhc3MudGVsZXNlYy5kZS9jbj1UZWxlU2VjJTIwU2Vy\r\ndmVyUGFzcyUyMERFLTEsb3U9VC1TeXN0ZW1zJTIwVHJ1c3QlMjBDZW50ZXIsbz1U\r\nLVN5c3RlbXMlMjBJbnRlcm5hdGlvbmFsJTIwR21iSCxjPWRlP2NlcnRpZmljYXRl\r\nUmV2b2NhdGlvbmxpc3Q/YmFzZT9jZXJ0aWZpY2F0ZVJldm9jYXRpb25saXN0PSow\r\nggE5BggrBgEFBQcBAQSCASswggEnMDMGCCsGAQUFBzABhidodHRwOi8vb2NzcC5z\r\nZXJ2ZXJwYXNzLnRlbGVzZWMuZGUvb2NzcHIwTAYIKwYBBQUHMAKGQGh0dHA6Ly9j\r\ncmwuc2VydmVycGFzcy50ZWxlc2VjLmRlL2NydC9UZWxlU2VjX1NlcnZlclBhc3Nf\r\nREUtMS5jZXIwgaEGCCsGAQUFBzAChoGUbGRhcDovL2xkYXAuc2VydmVycGFzcy50\r\nZWxlc2VjLmRlL2NuPVRlbGVTZWMlMjBTZXJ2ZXJQYXNzJTIwREUtMSxvdT1ULVN5\r\nc3RlbXMlMjBUcnVzdCUyMENlbnRlcixvPVQtU3lzdGVtcyUyMEludGVybmF0aW9u\r\nYWwlMjBHbWJILGM9ZGU/Y0FDZXJ0aWZpY2F0ZTAMBgNVHRMBAf8EAjAAMBYGA1Ud\r\nEQQPMA2CC2ltYXAud2ViLmRlMA0GCSqGSIb3DQEBBQUAA4IBAQAp7MQjjOWQ0M7N\r\n21GrPDfWSMR3eJnuMs37I9G2t9i99w7xKtmoVBPyYMORL1zRHn/DEguo4j5ua7CH\r\nrKLh9Sd1wDKqVWGFxvmP4f/mvEx5YVI68mg+M2VQf/h58IXTTZRbUcsv3HVeruI6\r\npgQNUsEQqRVJmrgT/iPd98RhhzBqef6Wfrt3Ns6N835egphxUVcVj/v/PqBCZKQb\r\nNl5QsoaHDqh3XC+Og2awOGvWHUzxUKEqkP5nsMs2YjfOtcQRtxdislQAfRktuUBA\r\nWMZAlvoVF/CIyFvcUH11KNur7HfK5PptvtdvLQaF2c+lN+LGP6D+nbTLqAo1v09o\r\nnZpHbQOt\r\n-----END CERTIFICATE-----',
pinned: true,
ignoreTLS: false
},
smtp: {
host: 'smtp.web.de',
port: 587,
secure: false,
ca: '-----BEGIN CERTIFICATE-----\r\nMIIHUzCCBjugAwIBAgIJAKaEwtMgQ2s5MA0GCSqGSIb3DQEBBQUAMIHJMQswCQYD\r\nVQQGEwJERTElMCMGA1UEChMcVC1TeXN0ZW1zIEludGVybmF0aW9uYWwgR21iSDEf\r\nMB0GA1UECxMWVC1TeXN0ZW1zIFRydXN0IENlbnRlcjEMMAoGA1UECBMDTlJXMQ4w\r\nDAYDVQQREwU1NzI1MDEQMA4GA1UEBxMHTmV0cGhlbjEgMB4GA1UECRMXVW50ZXJl\r\nIEluZHVzdHJpZXN0ci4gMjAxIDAeBgNVBAMTF1RlbGVTZWMgU2VydmVyUGFzcyBE\r\nRS0xMB4XDTEzMDgyMTA4MzU1MVoXDTE2MDgyNjIzNTk1OVowga0xCzAJBgNVBAYT\r\nAkRFMR4wHAYDVQQKDBUxJjEgTWFpbCAmIE1lZGlhIEdtYkgxDzANBgNVBAsTBldF\r\nQi5ERTEdMBsGA1UECBMUUmhpbmVsYW5kLVBhbGF0aW5hdGUxEjAQBgNVBAcTCU1v\r\nbnRhYmF1cjEkMCIGCSqGSIb3DQEJARYVc2VydmVyLWNlcnRzQDF1bmQxLmRlMRQw\r\nEgYDVQQDEwtzbXRwLndlYi5kZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\r\nggEBAL1WfyFqmifaEr6h9yntJKs33fnEVu0pQqS5RV9rnQU0E/cJYJ9RJOoTjhpE\r\nkT1LW8DyTM5vUzpgtFHQM0BOO6jOeZXUYNUaopK3yO4l/cpiitigtk9ZnWfKzbU3\r\n9hlhf+YwUUvoqjUA8I6fSu+VNPNlOBvamo18oHljXAPltL9oiwAxvTLNktBMy4T9\r\njxU1DeGoPbJKGwV7zIBQ2qUHuLkMvy5/H39t79Tih+zfzgfY/xIUfdmPNY9dK8ZY\r\nAtyF/RiUS199pd9dV4Vwh6JLvtNlWchBnKVhragLCGbkjnvUXmS1BPrclLR23s1v\r\nMehgOD2WhXl8PoqrOPb6y+lgMlECAwEAAaOCA1YwggNSMB8GA1UdIwQYMBaAFGJP\r\nE842Z4TNGfygTxmL7xVUATIcMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggr\r\nBgEFBQcDAgYIKwYBBQUHAwEwHQYDVR0OBBYEFAUuppozNCv2UzMV5p6CTpkEhsRS\r\nMFkGA1UdIARSMFAwRAYJKwYBBAG9Rw0CMDcwNQYIKwYBBQUHAgEWKWh0dHA6Ly93\r\nd3cudGVsZXNlYy5kZS9zZXJ2ZXJwYXNzL2Nwcy5odG1sMAgGBmeBDAECAjCCASEG\r\nA1UdHwSCARgwggEUMEWgQ6BBhj9odHRwOi8vY3JsLnNlcnZlcnBhc3MudGVsZXNl\r\nYy5kZS9ybC9UZWxlU2VjX1NlcnZlclBhc3NfREUtMS5jcmwwgcqggceggcSGgcFs\r\nZGFwOi8vbGRhcC5zZXJ2ZXJwYXNzLnRlbGVzZWMuZGUvY249VGVsZVNlYyUyMFNl\r\ncnZlclBhc3MlMjBERS0xLG91PVQtU3lzdGVtcyUyMFRydXN0JTIwQ2VudGVyLG89\r\nVC1TeXN0ZW1zJTIwSW50ZXJuYXRpb25hbCUyMEdtYkgsYz1kZT9jZXJ0aWZpY2F0\r\nZVJldm9jYXRpb25saXN0P2Jhc2U/Y2VydGlmaWNhdGVSZXZvY2F0aW9ubGlzdD0q\r\nMIIBOQYIKwYBBQUHAQEEggErMIIBJzAzBggrBgEFBQcwAYYnaHR0cDovL29jc3Au\r\nc2VydmVycGFzcy50ZWxlc2VjLmRlL29jc3ByMEwGCCsGAQUFBzAChkBodHRwOi8v\r\nY3JsLnNlcnZlcnBhc3MudGVsZXNlYy5kZS9jcnQvVGVsZVNlY19TZXJ2ZXJQYXNz\r\nX0RFLTEuY2VyMIGhBggrBgEFBQcwAoaBlGxkYXA6Ly9sZGFwLnNlcnZlcnBhc3Mu\r\ndGVsZXNlYy5kZS9jbj1UZWxlU2VjJTIwU2VydmVyUGFzcyUyMERFLTEsb3U9VC1T\r\neXN0ZW1zJTIwVHJ1c3QlMjBDZW50ZXIsbz1ULVN5c3RlbXMlMjBJbnRlcm5hdGlv\r\nbmFsJTIwR21iSCxjPWRlP2NBQ2VydGlmaWNhdGUwDAYDVR0TAQH/BAIwADAWBgNV\r\nHREEDzANggtzbXRwLndlYi5kZTANBgkqhkiG9w0BAQUFAAOCAQEAGFtJxVxWrURy\r\nFfR4UfmW+N1cZZx9sfC5jolV8LGje87DgbWdqu5TRL9FoQ1pwOTbM9mc3yWSoIbU\r\nx6E+rziJK+SFGMIy+Lt13P9M9Oc8JzVHoVEAgqlEeO6OYxrGE6SaSjZODJxPaEtU\r\nzEAKf0HVJQoGaU6fD+/8l3yhksAlsF/L85nP+KcZtoancOkJWE0GQMZp7pdLU0Ou\r\nFUQoAcqMIyHQfDqJ5iwvx/9C7jmy3Nvw9tXdPrdn2O7ywrnFeJuT2xiorZzg6ezn\r\nUlc/sMvd/LPX0f60pSQr9tkZgU4f8Jvx9EvPUCFTRXlXqkBIhgJhgCadZC+wKB1P\r\neQMS8rksXw==\r\n-----END CERTIFICATE-----',
pinned: true,
ignoreTLS: false
}
},
checkOutboxInterval: 5000,
iconPath: '/img/icon-128-chrome.png',
verificationUrl: '/verify/',
verificationUuidLength: 36,
dbVersion: 5,
appVersion: appVersion,
outboxMailboxPath: 'OUTBOX',
outboxMailboxName: 'Outbox',
outboxMailboxType: 'Outbox',
connDocTimeout: 5000,
};
// parse manifest to get configurations for current runtime
if (typeof chrome !== 'undefined' && chrome.runtime && chrome.runtime.getManifest) {
setConfigParams(chrome.runtime.getManifest());
} else if (typeof $ !== 'undefined' && $.get) {
$.get('/manifest.json', setConfigParams, 'json');
}
/**
* Strings are maintained here
*/
app.string = {
fallbackSubject: '(no subject)',
invitationSubject: 'Invitation to a private conversation',
invitationMessage: 'Hi,\n\nI use Whiteout Mail to send and receive encrypted email. I would like to exchange encrypted messages with you as well.\n\nPlease install the Whiteout Mail application. This application makes it easy to read and write messages securely with PGP encryption applied.\n\nGo to the Whiteout Networks homepage to learn more and to download the application: https://whiteout.io\n\n',
signature: '\n\n\n--\nSent from Whiteout Mail - https://whiteout.io\n\nMy PGP key: ',
webSite: 'http://whiteout.io',
verificationSubject: '[whiteout] New public key uploaded',
sendBtnClear: 'Send',
sendBtnSecure: 'Send securely',
updatePublicKeyTitle: 'Public Key Updated',
updatePublicKeyMsgNewKey: '{0} updated his key and may not be able to read encrypted messages sent with his old key. Update the key?',
updatePublicKeyMsgRemovedKey: '{0} revoked his key and may no longer be able to read encrypted messages. Remove the key?',
updatePublicKeyPosBtn: 'Yes',
updatePublicKeyNegBtn: 'No',
outdatedCertificateTitle: 'Warning',
outdatedCertificateMessage: 'The SSL certificate for the mail server {0} changed, the connection was refused.',
updateCertificateTitle: 'Warning',
updateCertificateMessage: 'The SSL certificate for the mail server {0} changed. Do you want to proceed?',
updateCertificatePosBtn: 'Yes',
updateCertificateNegBtn: 'No',
certificateFaqLink: 'https://github.com/whiteout-io/mail-html5/wiki/FAQ#what-does-the-ssl-certificate-for-the-mail-server--changed-mean',
bugReportTitle: 'Report a bug',
bugReportSubject: '[Bug] I want to report a bug',
bugReportBody: 'Steps to reproduce\n1. \n2. \n3. \n\nWhat happens?\n\n\nWhat do you expect to happen instead?\n\n\n\n== PLEASE DONT PUT ANY KEYS HERE! ==\n\n\n## Log\n\nBelow is the log. It includes your interactions with your email provider in an anonymized way from the point where you started the app for the last time. Any information provided by you will be used for the porpose of locating and fixing the bug you reported. It will be deleted subsequently. However, you can edit this log and/or remove log data in the event that something would show up.\n\n',
supportAddress: 'mail.support@whiteout.io',
connDocOffline: 'It appears that you are offline. Please retry when you are online.',
connDocTlsWrongCert: 'A connection to {0} was rejected because the TLS certificate is invalid. Please have a look at the FAQ for information on how to fix this error.',
connDocHostUnreachable: 'We could not establish a connection to {0}. Please check the server settings!',
connDocHostTimeout: 'We could not establish a connection to {0} within {1} ms. Please check the server settings and encryption mode!',
connDocAuthRejected: 'Your credentials for {0} were rejected. Please check your username and password!',
connDocNoInbox: 'We could not detect an IMAP inbox folder on {0}. Please have a look at the FAQ for information on how to fix this error.',
connDocGenericError: 'There was an error connecting to {0}: {1}'
};
function setConfigParams(manifest) {
var cfg = appCfg.config;
return app;
});
function getUrl(beginsWith) {
return _.find(manifest.permissions, function(permission) {
return typeof permission === 'string' && permission.indexOf(beginsWith) === 0;
}).replace(/\/$/, ''); // remove last '/' from url due to required syntax in manifest
}
// get key server base url
cfg.keyServerUrl = getUrl('https://keys');
// get the app version
cfg.appVersion = manifest.version;
}
/**
* Strings are maintained here
*/
appCfg.string = {
fallbackSubject: '(no subject)',
invitationSubject: 'Invitation to a private conversation',
invitationMessage: 'Hi,\n\nI use Whiteout Mail to send and receive encrypted email. I would like to exchange encrypted messages with you as well.\n\nPlease install the Whiteout Mail application. This application makes it easy to read and write messages securely with PGP encryption applied.\n\nGo to the Whiteout Networks homepage to learn more and to download the application: https://whiteout.io\n\n',
signature: '\n\n\n--\nSent from Whiteout Mail - https://whiteout.io\n\nMy PGP key: ',
webSite: 'http://whiteout.io',
verificationSubject: '[whiteout] New public key uploaded',
sendBtnClear: 'Send',
sendBtnSecure: 'Send securely',
updatePublicKeyTitle: 'Public Key Updated',
updatePublicKeyMsgNewKey: '{0} updated his key and may not be able to read encrypted messages sent with his old key. Update the key?',
updatePublicKeyMsgRemovedKey: '{0} revoked his key and may no longer be able to read encrypted messages. Remove the key?',
updatePublicKeyPosBtn: 'Yes',
updatePublicKeyNegBtn: 'No',
outdatedCertificateTitle: 'Warning',
outdatedCertificateMessage: 'The SSL certificate for the mail server {0} changed, the connection was refused.',
updateCertificateTitle: 'Warning',
updateCertificateMessage: 'The SSL certificate for the mail server {0} changed. Do you want to proceed?',
updateCertificatePosBtn: 'Yes',
updateCertificateNegBtn: 'No',
certificateFaqLink: 'https://github.com/whiteout-io/mail-html5/wiki/FAQ#what-does-the-ssl-certificate-for-the-mail-server--changed-mean',
bugReportTitle: 'Report a bug',
bugReportSubject: '[Bug] I want to report a bug',
bugReportBody: 'Steps to reproduce\n1. \n2. \n3. \n\nWhat happens?\n\n\nWhat do you expect to happen instead?\n\n\n\n== PLEASE DONT PUT ANY KEYS HERE! ==\n\n\n## Log\n\nBelow is the log. It includes your interactions with your email provider from the point where you started the app for the last time. Login data and email content has been stripped. Any information provided by you will be used for the purpose of locating and fixing the bug you reported. It will be deleted subsequently. However, you can edit this log and/or remove log data in the event that something would show up.\n\nUser-Agent: {0}\nVersion: {1}\n\n',
supportAddress: 'mail.support@whiteout.io',
connDocOffline: 'It appears that you are offline. Please retry when you are online.',
connDocTlsWrongCert: 'A connection to {0} was rejected because the TLS certificate is invalid. Please have a look at the FAQ for information on how to fix this error.',
connDocHostUnreachable: 'We could not establish a connection to {0}. Please check the server settings!',
connDocHostTimeout: 'We could not establish a connection to {0} within {1} ms. Please check the server settings and encryption mode!',
connDocAuthRejected: 'Your credentials for {0} were rejected. Please check your username and password!',
connDocNoInbox: 'We could not detect an IMAP inbox folder on {0}. Please have a look at the FAQ for information on how to fix this error.',
connDocGenericError: 'There was an error connecting to {0}: {1}',
logoutTitle: 'Logout',
logoutMessage: 'Are you sure you want to log out? Please back up your encryption key before proceeding!',
removePreAuthAccountTitle: 'Remove account',
removePreAuthAccountMessage: 'Are you sure you want to remove your account from this device?'
};

View File

@ -1,227 +0,0 @@
/**
* The main application controller
*/
define(function(require) {
'use strict';
var axe = require('axe'),
Auth = require('js/bo/auth'),
PGP = require('js/crypto/pgp'),
PgpMailer = require('pgpmailer'),
OAuth = require('js/util/oauth'),
PgpBuilder = require('pgpbuilder'),
OutboxBO = require('js/bo/outbox'),
mailreader = require('mailreader'),
ImapClient = require('imap-client'),
Crypto = require('js/crypto/crypto'),
RestDAO = require('js/dao/rest-dao'),
appConfig = require('js/app-config'),
EmailDAO = require('js/dao/email-dao'),
AdminDao = require('js/dao/admin-dao'),
KeychainDAO = require('js/dao/keychain-dao'),
PublicKeyDAO = require('js/dao/publickey-dao'),
LawnchairDAO = require('js/dao/lawnchair-dao'),
PrivateKeyDAO = require('js/dao/privatekey-dao'),
InvitationDAO = require('js/dao/invitation-dao'),
DeviceStorageDAO = require('js/dao/devicestorage-dao'),
ConnectionDoctor = require('js/util/connection-doctor'),
UpdateHandler = require('js/util/update/update-handler'),
config = appConfig.config,
str = appConfig.string;
var self = {};
/**
* Start the application
*/
self.start = function(options, callback) {
if (self.started) {
return callback();
}
self.started = true;
self.onError = options.onError;
// are we running in a cordova app or in a browser environment?
if (window.cordova) {
// wait for 'deviceready' event to make sure plugins are loaded
axe.debug('Assuming Cordova environment...');
document.addEventListener("deviceready", onDeviceReady, false);
} else {
// No need to wait on events... just start the app
axe.debug('Assuming Browser environment...');
onDeviceReady();
}
function onDeviceReady() {
axe.debug('Starting app.');
self.buildModules();
// Handle offline and online gracefully
window.addEventListener('online', self.onConnect.bind(self, self.onError));
window.addEventListener('offline', self.onDisconnect.bind(self));
self._appConfigStore.init('app-config', callback);
}
};
self.buildModules = function() {
var lawnchairDao, restDao, pubkeyDao, privkeyDao, crypto, emailDao, keychain, pgp, userStorage, pgpbuilder, oauth, appConfigStore, auth;
// start the mailreader's worker thread
mailreader.startWorker(config.workerPath + '/../lib/mailreader-parser-worker.js');
// init objects and inject dependencies
restDao = new RestDAO();
lawnchairDao = new LawnchairDAO();
pubkeyDao = new PublicKeyDAO(restDao);
privkeyDao = new PrivateKeyDAO(new RestDAO(config.privkeyServerUrl));
oauth = new OAuth(new RestDAO('https://www.googleapis.com'));
crypto = new Crypto();
self._pgp = pgp = new PGP();
self._keychain = keychain = new KeychainDAO(lawnchairDao, pubkeyDao, privkeyDao, crypto, pgp);
keychain.requestPermissionForKeyUpdate = function(params, callback) {
var message = params.newKey ? str.updatePublicKeyMsgNewKey : str.updatePublicKeyMsgRemovedKey;
message = message.replace('{0}', params.userId);
self.onError({
title: str.updatePublicKeyTitle,
message: message,
positiveBtnStr: str.updatePublicKeyPosBtn,
negativeBtnStr: str.updatePublicKeyNegBtn,
showNegativeBtn: true,
callback: callback
});
};
self._appConfigStore = appConfigStore = new DeviceStorageDAO(new LawnchairDAO());
self._auth = auth = new Auth(appConfigStore, oauth, pgp);
self._userStorage = userStorage = new DeviceStorageDAO(lawnchairDao);
self._invitationDao = new InvitationDAO(restDao);
self._pgpbuilder = pgpbuilder = new PgpBuilder();
self._emailDao = emailDao = new EmailDAO(keychain, pgp, userStorage, pgpbuilder, mailreader);
self._outboxBo = new OutboxBO(emailDao, keychain, userStorage);
self._updateHandler = new UpdateHandler(appConfigStore, userStorage, auth);
self._adminDao = new AdminDao(new RestDAO(config.adminUrl));
self._doctor = new ConnectionDoctor();
emailDao.onError = self.onError;
};
self.isOnline = function() {
return navigator.onLine;
};
self.onDisconnect = function() {
self._emailDao.onDisconnect();
};
self.onConnect = function(callback) {
if (!self.isOnline() || !self._emailDao || !self._emailDao._account) {
// prevent connection infinite loop
callback();
return;
}
self._auth.getCredentials(function(err, credentials) {
if (err) {
callback(err);
return;
}
initClients(credentials);
});
function initClients(credentials) {
var pgpMailer = new PgpMailer(credentials.smtp, self._pgpbuilder);
var imapClient = new ImapClient(credentials.imap);
imapClient.onError = onConnectionError;
pgpMailer.onError = onConnectionError;
// certificate update handling
imapClient.onCert = self._auth.handleCertificateUpdate.bind(self._auth, 'imap', self.onConnect, self.onError);
pgpMailer.onCert = self._auth.handleCertificateUpdate.bind(self._auth, 'smtp', self.onConnect, self.onError);
// after-setup configuration depending on the provider:
// gmail does not require you to upload to the sent items folder
// after successful sending, whereas most other providers do
self._emailDao.ignoreUploadOnSent = !!(config[self._auth.provider] && config[self._auth.provider].ignoreUploadOnSent);
// connect to clients
self._emailDao.onConnect({
imapClient: imapClient,
pgpMailer: pgpMailer
}, callback);
}
function onConnectionError(error) {
axe.debug('Connection error. Attempting reconnect in ' + config.reconnectInterval + ' ms. Error: ' + (error.errMsg || error.message) + (error.stack ? ('\n' + error.stack) : ''));
setTimeout(function() {
axe.debug('Reconnecting...');
// re-init client modules on error
self.onConnect(function(err) {
if (err) {
axe.error('Reconnect attempt failed! ' + (err.errMsg || err.message) + (err.stack ? ('\n' + err.stack) : ''));
return;
}
axe.debug('Reconnect attempt complete.');
});
}, config.reconnectInterval);
}
};
self.checkForUpdate = function() {
self._updateHandler.checkForUpdate(self.onError);
};
/**
* Instanciate the mail email data access object and its dependencies. Login to imap on init.
*/
self.init = function(options, callback) {
// init user's local database
self._userStorage.init(options.emailAddress, function(err) {
if (err) {
callback(err);
return;
}
// Migrate the databases if necessary
self._updateHandler.update(onUpdate);
});
function onUpdate(err) {
if (err) {
callback({
errMsg: 'Update failed, please reinstall the app.',
err: err
});
return;
}
// account information for the email dao
var account = {
realname: options.realname,
emailAddress: options.emailAddress,
asymKeySize: config.asymKeySize
};
// init email dao
self._emailDao.init({
account: account
}, function(err, keypair) {
if (err) {
callback(err);
return;
}
callback(null, keypair);
});
}
};
return self;
});

View File

@ -1,161 +1,132 @@
'use strict';
// Check if a new ApaCache is available on page load.
if (typeof window.applicationCache !== 'undefined') {
window.onload = function() {
window.applicationCache.onupdateready = function() {
if (window.applicationCache.status === window.applicationCache.UPDATEREADY) {
// Browser downloaded a new app cache
if (window.confirm('A new version of Whiteout Mail is available. Restart the app to update?')) {
window.location.reload();
}
}
};
};
// use service-worker or app-cache for offline caching
require('./offline-cache');
//
// Angular app config
//
var axe = require('axe-logger');
// include angular modules
require('./app-config');
require('./directive');
require('./util');
require('./crypto');
require('./service');
require('./email');
// init main angular module including dependencies
var app = angular.module('mail', [
'ngRoute',
'ngAnimate',
'ngTagsInput',
'woAppConfig',
'woDirectives',
'woUtil',
'woCrypto',
'woServices',
'woEmail',
'infinite-scroll'
]);
// set router paths
app.config(function($routeProvider, $animateProvider) {
$routeProvider.when('/login', {
templateUrl: 'tpl/login.html',
controller: require('./controller/login/login')
});
$routeProvider.when('/add-account', {
templateUrl: 'tpl/add-account.html',
controller: require('./controller/login/add-account')
});
$routeProvider.when('/create-account', {
templateUrl: 'tpl/create-account.html',
controller: require('./controller/login/create-account')
});
$routeProvider.when('/validate-phone', {
templateUrl: 'tpl/validate-phone.html',
controller: require('./controller/login/validate-phone')
});
$routeProvider.when('/login-set-credentials', {
templateUrl: 'tpl/login-set-credentials.html',
controller: require('./controller/login/login-set-credentials')
});
$routeProvider.when('/login-privatekey-upload', {
templateUrl: 'tpl/login-privatekey-upload.html',
controller: require('./controller/login/login-privatekey-upload')
});
$routeProvider.when('/login-verify-public-key', {
templateUrl: 'tpl/login-verify-public-key.html',
controller: require('./controller/login/login-verify-public-key')
});
$routeProvider.when('/login-existing', {
templateUrl: 'tpl/login-existing.html',
controller: require('./controller/login/login-existing')
});
$routeProvider.when('/login-initial', {
templateUrl: 'tpl/login-initial.html',
controller: require('./controller/login/login-initial')
});
$routeProvider.when('/login-new-device', {
templateUrl: 'tpl/login-new-device.html',
controller: require('./controller/login/login-new-device')
});
$routeProvider.when('/login-privatekey-download', {
templateUrl: 'tpl/login-privatekey-download.html',
controller: require('./controller/login/login-privatekey-download')
});
$routeProvider.when('/account', {
templateUrl: 'tpl/desktop.html',
controller: require('./controller/app/navigation'),
reloadOnSearch: false // don't reload controllers in main app when query params change
});
$routeProvider.otherwise({
redirectTo: '/login'
});
// activate ngAnimate for whitelisted classes only
$animateProvider.classNameFilter(/lightbox/);
});
app.run(function($rootScope) {
// global state... inherited to all child scopes
$rootScope.state = {};
// attach fastclick
FastClick.attach(document.body);
});
// inject controllers from ng-included view templates
app.controller('ReadCtrl', require('./controller/app/read'));
app.controller('WriteCtrl', require('./controller/app/write'));
app.controller('MailListCtrl', require('./controller/app/mail-list'));
app.controller('AccountCtrl', require('./controller/app/account'));
app.controller('SetPassphraseCtrl', require('./controller/app/set-passphrase'));
app.controller('PublicKeyImportCtrl', require('./controller/app/publickey-import'));
app.controller('ContactsCtrl', require('./controller/app/contacts'));
app.controller('AboutCtrl', require('./controller/app/about'));
app.controller('DialogCtrl', require('./controller/app/dialog'));
app.controller('ActionBarCtrl', require('./controller/app/action-bar'));
app.controller('StatusDisplayCtrl', require('./controller/app/status-display'));
//
// Manual angular bootstraping
//
// are we running in a cordova app or in a browser environment?
if (window.cordova) {
// wait for 'deviceready' event to make sure plugins are loaded
axe.debug('Assuming Cordova environment...');
document.addEventListener('deviceready', bootstrap, false);
} else {
// No need to wait on events... just start the app
axe.debug('Assuming Browser environment...');
bootstrap();
}
// hey Angular, we're bootstrapping manually!
window.name = 'NG_DEFER_BOOTSTRAP!';
requirejs([
'angular',
'js/controller/dialog',
'js/controller/popover',
'js/controller/add-account',
'js/controller/account',
'js/controller/set-passphrase',
'js/controller/privatekey-upload',
'js/controller/contacts',
'js/controller/about',
'js/controller/login',
'js/controller/login-initial',
'js/controller/login-new-device',
'js/controller/login-existing',
'js/controller/login-privatekey-download',
'js/controller/login-set-credentials',
'js/controller/mail-list',
'js/controller/read',
'js/controller/write',
'js/controller/navigation',
'js/crypto/util',
'js/util/error',
'js/util/backbutton-handler',
'fastclick',
'angularRoute',
'angularAnimate',
'ngInfiniteScroll',
'ngTagsInput'
], function(
angular,
DialogCtrl,
PopoverCtrl,
AddAccountCtrl,
AccountCtrl,
SetPassphraseCtrl,
PrivateKeyUploadCtrl,
ContactsCtrl,
AboutCtrl,
LoginCtrl,
LoginInitialCtrl,
LoginNewDeviceCtrl,
LoginExistingCtrl,
LoginPrivateKeyDownloadCtrl,
LoginSetCredentialsCtrl,
MailListCtrl,
ReadCtrl,
WriteCtrl,
NavigationCtrl,
util,
errorUtil,
backButtonUtil,
FastClick
) {
// reset window.name
window.name = util.UUID();
// init main angular module including dependencies
var app = angular.module('mail', [
'ngRoute',
'ngAnimate',
'navigation',
'mail-list',
'write',
'read',
'contacts',
'login-new-device',
'privatekey-upload',
'popover',
'infinite-scroll',
'ngTagsInput'
]);
// set router paths
app.config(function($routeProvider) {
$routeProvider.when('/add-account', {
templateUrl: 'tpl/add-account.html',
controller: AddAccountCtrl
});
$routeProvider.when('/login', {
templateUrl: 'tpl/login.html',
controller: LoginCtrl
});
$routeProvider.when('/login-set-credentials', {
templateUrl: 'tpl/login-set-credentials.html',
controller: LoginSetCredentialsCtrl
});
$routeProvider.when('/login-existing', {
templateUrl: 'tpl/login-existing.html',
controller: LoginExistingCtrl
});
$routeProvider.when('/login-initial', {
templateUrl: 'tpl/login-initial.html',
controller: LoginInitialCtrl
});
$routeProvider.when('/login-new-device', {
templateUrl: 'tpl/login-new-device.html',
controller: LoginNewDeviceCtrl
});
$routeProvider.when('/login-privatekey-download', {
templateUrl: 'tpl/login-privatekey-download.html',
controller: LoginPrivateKeyDownloadCtrl
});
$routeProvider.when('/desktop', {
templateUrl: 'tpl/desktop.html',
controller: NavigationCtrl
});
$routeProvider.otherwise({
redirectTo: '/login'
});
});
app.run(function($rootScope) {
// global state... inherited to all child scopes
$rootScope.state = {};
// attach global error handler
errorUtil.attachHandler($rootScope);
// attach the back button handler to the root scope
backButtonUtil.attachHandler($rootScope);
// attach fastclick
FastClick.attach(document.body);
});
// inject controllers from ng-included view templates
app.controller('ReadCtrl', ReadCtrl);
app.controller('WriteCtrl', WriteCtrl);
app.controller('MailListCtrl', MailListCtrl);
app.controller('AccountCtrl', AccountCtrl);
app.controller('SetPassphraseCtrl', SetPassphraseCtrl);
app.controller('PrivateKeyUploadCtrl', PrivateKeyUploadCtrl);
app.controller('ContactsCtrl', ContactsCtrl);
app.controller('AboutCtrl', AboutCtrl);
app.controller('DialogCtrl', DialogCtrl);
app.controller('PopoverCtrl', PopoverCtrl);
// manually bootstrap angular due to require.js
angular.element().ready(function() {
function bootstrap() {
angular.element(document).ready(function() {
angular.bootstrap(document, ['mail']);
});
});
}

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