Giter Site home page Giter Site logo

an2linuxserver's Introduction

AN2Linux - server

Sync Android notifications encrypted using TLS to a Linux desktop over WiFi, Mobile data or Bluetooth.

This is the server part of AN2Linux which will run on your computer.

The Android app can be found here: https://github.com/rootkiwi/an2linuxclient/

Dependencies

I'm using archlinux but I've added here what I think to be the package names for debian/ubuntu as well.

  • python (3.4+)
Arch: python
Debian / Ubuntu: python3
  • libnotify
Arch: libnotify
Debian / Ubuntu: libnotify4 gir1.2-notify-0.7 gir1.2-gdkpixbuf-2.0
  • python-gobject
Arch: python-gobject
Debian / Ubuntu: python3-gi
  • openssl (1.0.1+)

Dependencies for bluetooth

  • BlueZ dev files
Arch: bluez-libs
Debian / Ubuntu: libbluetooth-dev
  • PyBluez with normal package manager
Arch: python-pybluez
Debian / Ubuntu: python3-bluez
  • PyBluez or with pip
Arch: python-pip
Debian / Ubuntu: python3-pip

pip3 install pybluez

How to use

First time just run an2linuxserver.py and follow the instructions.

AN2Linux uses TLS for encryption with both client and server authentication. That means that the client (android) and the server (your computer) need to exchange certificates first.

To initiate pairing you must have an2linuxserver.py running and then in the android app press initiate pairing when in the process of adding a new server.

For bluetooth

First you need to pair your phone and computer with each other (the normal bluetooth pairing), and then do the certificate exchange as explained above.

Why use TLS over bluetooth when bluetooth is already encrypted?

Well, firstly, because I wanted to try :)

And secondly, from the little I've read about bluetooth it seems that the encryption key size negotiated can be very small.

PyBluez not working?

I'm using archlinux so I'm going to tell you how it works for me, I have no idea how it works on other distros. It may work out of the box or it may not, just try it.

This is the error I get without the fixes below:
bluetooth.btcommon.BluetoothError: (13, 'Permission denied')

So, if you're not using archlinux but still are using systemd and get an error like that maybe you should try something similar.

Edit bluetooth.service in an override file

systemctl edit bluetooth.service

Add the following lines

[Service]
ExecStart=
ExecStart=/usr/lib/bluetooth/bluetoothd -C
ExecStartPost=/bin/chmod 662 /var/run/sdp

then apply changes

systemctl daemon-reload
systemctl restart bluetooth.service

More info about this problem: https://bbs.archlinux.org/viewtopic.php?id=201672.

Config directory

First time when running an2linuxserver.py it will create the directory: $XDG_CONFIG_HOME/an2linux/.

If $XDG_CONFIG_HOME is not set it defaults to: $HOME/.config/an2linux/.

In this config directory a few files will be created.

Config file

A default config file named config will be created with the settings:

  • tcp_server [on/off] default: on
  • tcp_port [0-65535] default: 46352
  • bluetooth_server [on/off] default: off
  • bluetooth_support_kitkat [on/off] default: off
  • notification_timeout [integer] default: 5
  • list_size_duplicates [0-50] default: 0
  • ignore_duplicates_list_for_titles [comma-separated list] default: AN2Linux, title
  • keywords_to_ignore [comma-separated list] default: ''

Open that config file for more detailed info about every setting.

Server RSA key and certificate

AN2Linux will generate a 4096 bit RSA key rsakey.pem and a self-signed certificate certificate.pem.

Just delete those and restart AN2Linux if you want to generate a new key and certificate.

Trusted certificates

After a successful certificate exchange AN2linux will create a file named authorized_certs.

Every line in that file will represent a trused certificate.

It will be in the format SHA256:<certificate_fingerprint> <trused_certificate>.

That first part SHA256... is not used by AN2linux at all, it's just added as a convenience to the user to help distinguish between multiple certificates.

Diffie–Hellman ephemeral

If the setting bluetooth_support_kitkat is turned on AN2linux will also generate a file named dhparam.pem.

That is because SSLEngine does not support any ECDHE cipher suites until from API 20+ (Android 5.0+).

Run AN2Linux as a service

Init/Service scripts

Security with a firewall

a popular easy-to-use firewall for Linux is Uncomplicated Firewall (ufw)

  1. install it:
    • on Arch: $ sudo pacman -S ufw
    • on Debian/Ubuntu: $ sudo apt-get install ufw
  2. start and enable ufw’s systemd unit:
    • $ sudo systemctl start ufw; sudo systemctl enable ufw
  3. set your mobile device's LAN ip to a static ip
    • in the WiFi settings, long press the network you're connected to and tap "modify network"
    • if authentication is required (it should) and you're authenticated already leave the password feild empty
    • (Google it for the rest of steps, which depend on your region/router for the Gateway address)
  4. allow traffic limited to one port, from your mobile device's LAN static ip
    • $ sudo ufw allow from <your-mobile-device's-LAN-static-ip> to any port <your-config-port>

License

GNU General Public License 3, with the additional special exception to link portions of this program with the OpenSSL library.

See LICENSE for more details.

an2linuxserver's People

Contributors

ammgws avatar goberghen avatar ljmc2000 avatar matthiasbeyer avatar mfossen avatar podestplatz avatar rootkiwi avatar rustzz avatar smac89 avatar vdemonchy avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

an2linuxserver's Issues

Dbus problem with an2linux running as a user service

Hello! Yesterday I pulled the most recent changes from your git and today I have a problem. It is possible though that something else is causing the problem.

The problem is as follows. I have an2linux installed as a user service under the dreaded systemd. I have a bash script that does

su -c systemctl --user is-enabled anlinux <my username>

And it used to work. Now, though, it generates: Failed to connect to bus: No such file or directory.

Also, I see, now, this:

$ su
# systemctl --user is-enabled an2linux
Failed to connect to bus: Operation not permitted

I do not have any other user services, and I do not know enough about systemd to easily set up another such service; so, the situation is hard for me to test. But I post this here just in case you've made a relevant change to the code within the last few weeks or months - a change that might have caused the problem.

An2linux still works, though. It is just that I cannot check its status when I am not my normal user (and, for involved and boring reasons, I do in fact need to be able to do that).

My system: Linux Mint 19.3 Cinnamon x64; kernels 5.7 and 5.3. (I have the problem on both kernels.)

no advertisable device

Hi,
when I launch the script for the second time, I get :

File "/usr/local/lib/python3.7/dist-packages/bluetooth/bluez.py", line 273, in advertise_service protocols) _bluetooth.error: no advertisable device

but I'm connected and paired via bluetooth to my phone.

Infos:
ubuntu 19.10
pybluez globally from pip3 - 0.23
I'm on master branch

PPA

Hi

I suggest to create PPA for packaging an2 into Ubuntu based distros. Installing the server manually really annoying.

Linter pylint is unhappy with an2linuxserver.py

Here is the output of applying the pylint linter to an2linuxserver.py. Some of the output might be important. (I don't know because I do not know python.)

an2linuxserver.py:
1:1 warning pylint:C0111 Missing module docstring (missing-docstring)
13:1 warning pylint:C0103 Variable name "e" doesn't conform to snake_case naming style (invalid-name)
20:1 warning pylint:C0103 Variable name "e" doesn't conform to snake_case naming style (invalid-name)
27:1 warning pylint:C0103 Variable name "e" doesn't conform to snake_case naming style (invalid-name)
49:1 warning pylint:C0111 Missing function docstring (missing-docstring)
52:1 warning pylint:C0111 Missing class docstring (missing-docstring)
63:101 warning pylint:C0301 Line too long (104/100) (line-too-long)
66:101 warning pylint:C0301 Line too long (104/100) (line-too-long)
66:101 warning pylint:C0301 Line too long (104/100) (line-too-long)
78:1 warning pylint:C0111 Missing method docstring (missing-docstring)
79:36 error pylint:E1135 Value 'Notification.latest_notifications' doesn't support membership test
(unsupported-membership-test)
80:28 error pylint:E1135 Value 'Notification.titles_that_ignore_latest' doesn't support membership test
(unsupported-membership-test)
81:50 error pylint:E1133 Non-iterable value Notification.keywords_to_ignore is used in an iterating
context (not-an-iterable)
84:18 warning pylint:W0201 Attribute 'notif' defined outside init (attribute-defined-outside-init)
91:13 warning pylint:C0103 Variable name "e" doesn't conform to snake_case naming style (invalid-name)
91:20 warning pylint:W0703 Catching too general exception Exception (broad-except)
93:41 warning pylint:W0301 Unnecessary semicolon (unnecessary-semicolon)
97:1 warning pylint:C0111 Missing method docstring (missing-docstring)
97:31 warning pylint:W0613 Unused argument 'notif_instance' (unused-argument)
102:1 warning pylint:C0111 Missing class docstring (missing-docstring)
115:17 warning pylint:C0103 Variable name "e" doesn't conform to snake_case naming style (invalid-name)
115:24 warning pylint:W0703 Catching too general exception Exception (broad-except)
121:17 warning pylint:C0103 Variable name "e" doesn't conform to snake_case naming style (invalid-name)
121:24 warning pylint:W0703 Catching too general exception Exception (broad-except)
123:9 warning pylint:C0103 Variable name "e" doesn't conform to snake_case naming style (invalid-name)
123:16 warning pylint:W0703 Catching too general exception Exception (broad-except)
126:1 warning pylint:C0111 Missing method docstring (missing-docstring)
126:5 warning pylint:R0915 Too many statements (52/50) (too-many-statements)
139:9 warning pylint:C0103 Variable name "ip" doesn't conform to snake_case naming style (invalid-name)
142:13 warning pylint:C0103 Variable name "ip" doesn't conform to snake_case naming style (invalid-name)
148:9 warning pylint:W0621 Redefining name 'sha256' from outer scope (line 804) (redefined-outer-name)
149:9 warning pylint:W0621 Redefining name 'sha256_format' from outer scope (line 805) (redefined-outer-
name)
151:101 warning pylint:C0301 Line too long (115/100) (line-too-long)
160:14 warning pylint:W0201 Attribute 'server_allow_pair' defined outside init (attribute-defined-
outside-init)
161:14 warning pylint:W0201 Attribute 'client_allow_pair' defined outside init (attribute-defined-
outside-init)
165:16 warning pylint:W0703 Catching too general exception Exception (broad-except)
167:14 warning pylint:W0201 Attribute 'user_input_prompt' defined outside init (attribute-defined-
outside-init)
177:26 warning pylint:W0201 Attribute 'server_allow_pair' defined outside init (attribute-defined-
outside-init)
194:1 warning pylint:C0111 Missing method docstring (missing-docstring)
195:9 warning pylint:R1702 Too many nested blocks (7/5) (too-many-nested-blocks)
200:26 warning pylint:W0201 Attribute 'client_allow_pair' defined outside init (attribute-defined-
outside-init)
205:101 warning pylint:C0301 Line too long (109/100) (line-too-long)
225:1 warning pylint:C0111 Missing method docstring (missing-docstring)
229:9 warning pylint:C0103 Variable name "e" doesn't conform to snake_case naming style (invalid-name)
229:16 warning pylint:W0703 Catching too general exception Exception (broad-except)
238:25 warning pylint:C0326 Exactly one space required before assignment
240:25 warning pylint:C0326 Exactly one space required before assignment
259:101 warning pylint:C0301 Line too long (111/100) (line-too-long)
261:20 warning pylint:W0703 Catching too general exception Exception (broad-except)
262:101 warning pylint:C0301 Line too long (111/100) (line-too-long)
264:101 warning pylint:C0301 Line too long (107/100) (line-too-long)
267:1 warning pylint:C0111 Missing class docstring (missing-docstring)
275:1 warning pylint:C0111 Missing class docstring (missing-docstring)
278:38 error pylint:E0602 Undefined variable 'BluetoothSocket' (undefined-variable)
278:54 error pylint:E0602 Undefined variable 'RFCOMM' (undefined-variable)
279:46 error pylint:E0602 Undefined variable 'PORT_ANY' (undefined-variable)
286:9 error pylint:E0602 Undefined variable 'advertise_service' (undefined-variable)
288:55 error pylint:E0602 Undefined variable 'SERIAL_PORT_CLASS' (undefined-variable)
289:37 error pylint:E0602 Undefined variable 'SERIAL_PORT_PROFILE' (undefined-variable)
293:1 warning pylint:C0111 Missing method docstring (missing-docstring)
298:101 warning pylint:C0301 Line too long (101/100) (line-too-long)
302:1 warning pylint:C0111 Missing method docstring (missing-docstring)
306:1 warning pylint:C0111 Missing class docstring (missing-docstring)
306:1 warning pylint:R0902 Too many instance attributes (8/7) (too-many-instance-attributes)
311:24 warning pylint:W0621 Redefining name 'socket' from outer scope (line 38) (redefined-outer-name)
319:1 warning pylint:C0111 Missing method docstring (missing-docstring)
327:17 warning pylint:C0103 Variable name "e" doesn't conform to snake_case naming style (invalid-name)
327:24 warning pylint:W0703 Catching too general exception Exception (broad-except)
333:17 warning pylint:C0103 Variable name "e" doesn't conform to snake_case naming style (invalid-name)
333:24 warning pylint:W0703 Catching too general exception Exception (broad-except)
335:9 warning pylint:C0103 Variable name "e" doesn't conform to snake_case naming style (invalid-name)
335:16 warning pylint:W0703 Catching too general exception Exception (broad-except)
340:1 warning pylint:C0111 Missing method docstring (missing-docstring)
367:1 warning pylint:C0111 Missing method docstring (missing-docstring)
375:1 warning pylint:C0111 Missing method docstring (missing-docstring)
379:1 warning pylint:C0111 Missing method docstring (missing-docstring)
383:1 warning pylint:C0111 Missing method docstring (missing-docstring)
383:1 warning pylint:R0912 Too many branches (13/12) (too-many-branches)
383:5 warning pylint:R0915 Too many statements (64/50) (too-many-statements)
397:101 warning pylint:C0301 Line too long (110/100) (line-too-long)
408:101 warning pylint:C0301 Line too long (104/100) (line-too-long)
414:9 warning pylint:W0621 Redefining name 'sha256' from outer scope (line 804) (redefined-outer-name)
415:9 warning pylint:W0621 Redefining name 'sha256_format' from outer scope (line 805) (redefined-outer-
name)
417:101 warning pylint:C0301 Line too long (115/100) (line-too-long)
426:14 warning pylint:W0201 Attribute 'server_allow_pair' defined outside init (attribute-defined-
outside-init)
427:14 warning pylint:W0201 Attribute 'client_allow_pair' defined outside init (attribute-defined-
outside-init)
431:16 warning pylint:W0703 Catching too general exception Exception (broad-except)
433:14 warning pylint:W0201 Attribute 'user_input_prompt' defined outside init (attribute-defined-
outside-init)
446:26 warning pylint:W0201 Attribute 'server_allow_pair' defined outside init (attribute-defined-
outside-init)
466:1 warning pylint:C0111 Missing method docstring (missing-docstring)
466:1 warning pylint:R0912 Too many branches (14/12) (too-many-branches)
467:9 warning pylint:R1702 Too many nested blocks (7/5) (too-many-nested-blocks)
474:24 warning pylint:W0703 Catching too general exception Exception (broad-except)
479:26 warning pylint:W0201 Attribute 'client_allow_pair' defined outside init (attribute-defined-
outside-init)
484:101 warning pylint:C0301 Line too long (109/100) (line-too-long)
491:40 error pylint:E0602 Undefined variable 'BluetoothError' (undefined-variable)
492:101 warning pylint:C0301 Line too long (106/100) (line-too-long)
507:1 warning pylint:C0111 Missing method docstring (missing-docstring)
507:1 warning pylint:R0914 Too many local variables (18/15) (too-many-locals)
513:101 warning pylint:C0301 Line too long (111/100) (line-too-long)
517:101 warning pylint:C0301 Line too long (119/100) (line-too-long)
519:9 warning pylint:C0103 Variable name "e" doesn't conform to snake_case naming style (invalid-name)
519:16 warning pylint:W0703 Catching too general exception Exception (broad-except)
530:25 warning pylint:C0326 Exactly one space required before assignment
532:25 warning pylint:C0326 Exactly one space required before assignment
553:101 warning pylint:C0301 Line too long (111/100) (line-too-long)
555:20 warning pylint:W0703 Catching too general exception Exception (broad-except)
556:101 warning pylint:C0301 Line too long (111/100) (line-too-long)
558:101 warning pylint:C0301 Line too long (107/100) (line-too-long)
561:1 warning pylint:C0111 Missing function docstring (missing-docstring)
571:1 warning pylint:C0111 Missing function docstring (missing-docstring)
576:1 warning pylint:C0111 Missing function docstring (missing-docstring)
577:101 warning pylint:C0301 Line too long (110/100) (line-too-long)
581:101 warning pylint:C0301 Line too long (111/100) (line-too-long)
592:1 warning pylint:C0111 Missing function docstring (missing-docstring)
592:1 warning pylint:C0103 Argument name "CERTIFICATE_PATH" doesn't conform to snake_case naming style
(invalid-name)
592:1 warning pylint:C0103 Argument name "RSA_PRIVATE_KEY_PATH" doesn't conform to snake_case naming style
(invalid-name)
592:49 warning pylint:W0621 Redefining name 'CERTIFICATE_PATH' from outer scope (line 794) (redefined-outer-
name)
592:67 warning pylint:W0621 Redefining name 'RSA_PRIVATE_KEY_PATH' from outer scope (line 794) (redefined-
outer-name)
593:101 warning pylint:C0301 Line too long (110/100) (line-too-long)
596:101 warning pylint:C0301 Line too long (111/100) (line-too-long)
608:1 warning pylint:C0111 Missing function docstring (missing-docstring)
610:50 warning pylint:C0103 Variable name "f" doesn't conform to snake_case naming style (invalid-name)
613:1 warning pylint:C0330 Wrong continued indentation (add 12 spaces).
615:101 warning pylint:C0301 Line too long (108/100) (line-too-long)
617:13 warning pylint:C0103 Variable name "e" doesn't conform to snake_case naming style (invalid-name)
617:20 warning pylint:W0703 Catching too general exception Exception (broad-except)
620:101 warning pylint:C0301 Line too long (109/100) (line-too-long)
628:1 warning pylint:C0111 Missing function docstring (missing-docstring)
629:5 warning pylint:W0621 Redefining name 'sha256' from outer scope (line 804) (redefined-outer-name)
630:5 warning pylint:W0621 Redefining name 'sha256_format' from outer scope (line 805) (redefined-outer-
name)
632:51 warning pylint:C0103 Variable name "f" doesn't conform to snake_case naming style (invalid-name)
644:101 warning pylint:C0301 Line too long (115/100) (line-too-long)
646:101 warning pylint:C0301 Line too long (127/100) (line-too-long)
649:1 warning pylint:C0111 Missing function docstring (missing-docstring)
655:101 warning pylint:C0301 Line too long (115/100) (line-too-long)
657:101 warning pylint:C0301 Line too long (105/100) (line-too-long)
658:101 warning pylint:C0301 Line too long (102/100) (line-too-long)
659:101 warning pylint:C0301 Line too long (105/100) (line-too-long)
660:101 warning pylint:C0301 Line too long (103/100) (line-too-long)
663:101 warning pylint:C0301 Line too long (107/100) (line-too-long)
665:101 warning pylint:C0301 Line too long (111/100) (line-too-long)
667:101 warning pylint:C0301 Line too long (105/100) (line-too-long)
668:101 warning pylint:C0301 Line too long (111/100) (line-too-long)
671:101 warning pylint:C0301 Line too long (127/100) (line-too-long)
674:101 warning pylint:C0301 Line too long (145/100) (line-too-long)
675:101 warning pylint:C0301 Line too long (125/100) (line-too-long)
685:1 warning pylint:C0111 Missing function docstring (missing-docstring)
685:1 warning pylint:R1710 Either all return statements in a function should return an expression, or none
of them should. (inconsistent-return-statements)
692:13 warning pylint:W0621 Redefining name 'tcp_server_enabled' from outer scope (line 796) (redefined-
outer-name)
693:13 warning pylint:W0621 Redefining name 'tcp_port_number' from outer scope (line 796) (redefined-outer-
name)
697:13 warning pylint:W0621 Redefining name 'bluetooth_server_enabled' from outer scope (line 796)
(redefined-outer-name)
698:13 warning pylint:W0621 Redefining name 'notification_timeout_milliseconds' from outer scope (line 797)
(redefined-outer-name)
698:101 warning pylint:C0301 Line too long (115/100) (line-too-long)
707:101 warning pylint:C0301 Line too long (118/100) (line-too-long)
708:101 warning pylint:C0301 Line too long (126/100) (line-too-long)
714:17 warning pylint:W0621 Redefining name 'bluetooth_support_kitkat' from outer scope (line 796)
(redefined-outer-name)
714:101 warning pylint:C0301 Line too long (108/100) (line-too-long)
717:101 warning pylint:C0301 Line too long (109/100) (line-too-long)
719:101 warning pylint:C0301 Line too long (104/100) (line-too-long)
720:101 warning pylint:C0301 Line too long (117/100) (line-too-long)
721:101 warning pylint:C0301 Line too long (108/100) (line-too-long)
723:101 warning pylint:C0301 Line too long (118/100) (line-too-long)
725:101 warning pylint:C0301 Line too long (104/100) (line-too-long)
726:9 warning pylint:C0103 Variable name "e" doesn't conform to snake_case naming style (invalid-name)
732:20 warning pylint:W0703 Catching too general exception Exception (broad-except)
737:1 warning pylint:C0111 Missing function docstring (missing-docstring)
737:13 warning pylint:W0613 Unused argument 'signum' (unused-argument)
737:21 warning pylint:W0613 Unused argument 'frame' (unused-argument)
754:1 warning pylint:C0111 Missing function docstring (missing-docstring)
756:9 warning pylint:C0103 Variable name "XDG_CONFIG_HOME" doesn't conform to snake_case naming style
(invalid-name)
758:9 warning pylint:C0103 Variable name "XDG_CONFIG_HOME" doesn't conform to snake_case naming style
(invalid-name)
760:5 warning pylint:C0103 Variable name "CONF_DIR_PATH" doesn't conform to snake_case naming style
(invalid-name)
761:5 warning pylint:W0621 Redefining name 'CONF_FILE_PATH' from outer scope (line 794) (redefined-outer-
name)
761:5 warning pylint:C0103 Variable name "CONF_FILE_PATH" doesn't conform to snake_case naming style
(invalid-name)
763:5 warning pylint:W0621 Redefining name 'CERTIFICATE_PATH' from outer scope (line 794) (redefined-outer-
name)
763:5 warning pylint:C0103 Variable name "CERTIFICATE_PATH" doesn't conform to snake_case naming style
(invalid-name)
764:5 warning pylint:W0621 Redefining name 'RSA_PRIVATE_KEY_PATH' from outer scope (line 794) (redefined-
outer-name)
764:5 warning pylint:C0103 Variable name "RSA_PRIVATE_KEY_PATH" doesn't conform to snake_case naming style
(invalid-name)
765:5 warning pylint:W0621 Redefining name 'AUTHORIZED_CERTS_PATH' from outer scope (line 794) (redefined-
outer-name)
765:5 warning pylint:C0103 Variable name "AUTHORIZED_CERTS_PATH" doesn't conform to snake_case naming style
(invalid-name)
766:5 warning pylint:W0621 Redefining name 'DHPARAM_PATH' from outer scope (line 794) (redefined-outer-
name)
766:5 warning pylint:C0103 Variable name "DHPARAM_PATH" doesn't conform to snake_case naming style
(invalid-name)
768:5 warning pylint:C0103 Variable name "TMP_DIR_BASE" doesn't conform to snake_case naming style
(invalid-name)
769:5 warning pylint:W0621 Redefining name 'TMP_DIR_PATH' from outer scope (line 794) (redefined-outer-
name)
769:5 warning pylint:C0103 Variable name "TMP_DIR_PATH" doesn't conform to snake_case naming style
(invalid-name)
785:9 warning pylint:C0103 Variable name "e" doesn't conform to snake_case naming style (invalid-name)
786:101 warning pylint:C0301 Line too long (118/100) (line-too-long)
790:101 warning pylint:C0301 Line too long (116/100) (line-too-long)
794:101 warning pylint:C0301 Line too long (118/100) (line-too-long)
796:5 warning pylint:C0103 Constant name "tcp_server_enabled" doesn't conform to UPPER_CASE naming style
(invalid-name)
796:25 warning pylint:C0103 Constant name "tcp_port_number" doesn't conform to UPPER_CASE naming style
(invalid-name)
796:42 warning pylint:C0103 Constant name "bluetooth_server_enabled" doesn't conform to UPPER_CASE naming
style (invalid-name)
796:68 warning pylint:C0103 Constant name "bluetooth_support_kitkat" doesn't conform to UPPER_CASE naming
style (invalid-name)
797:9 warning pylint:C0103 Constant name "notification_timeout_milliseconds" doesn't conform to UPPER_CASE
naming style (invalid-name)
800:101 warning pylint:C0301 Line too long (117/100) (line-too-long)
804:5 warning pylint:C0103 Constant name "sha256" doesn't conform to UPPER_CASE naming style (invalid-name)
805:5 warning pylint:C0103 Constant name "sha256_format" doesn't conform to UPPER_CASE naming style
(invalid-name)
816:5 warning pylint:C0103 Constant name "notif_tls_ctx" doesn't conform to UPPER_CASE naming style
(invalid-name)
826:13 warning pylint:C0103 Constant name "tcp_server" doesn't conform to UPPER_CASE naming style (invalid-
name)
827:16 warning pylint:W0703 Catching too general exception Exception (broad-except)
828:101 warning pylint:C0301 Line too long (103/100) (line-too-long)
829:13 warning pylint:C0103 Constant name "tcp_server" doesn't conform to UPPER_CASE naming style (invalid-
name)
835:28 warning pylint:W0401 Wildcard import bluetooth (wildcard-import)
843:21 warning pylint:C0103 Variable name "e" doesn't conform to snake_case naming style (invalid-name)
843:28 warning pylint:W0703 Catching too general exception Exception (broad-except)
844:101 warning pylint:C0301 Line too long (116/100) (line-too-long)
845:101 warning pylint:C0301 Line too long (103/100) (line-too-long)
847:17 warning pylint:C0103 Constant name "notif_tls_ctx_kitkat_bt" doesn't conform to UPPER_CASE naming
style (invalid-name)
854:13 warning pylint:C0103 Constant name "bluetooth_server" doesn't conform to UPPER_CASE naming style
(invalid-name)
858:9 warning pylint:C0103 Variable name "e" doesn't conform to snake_case naming style (invalid-name)
859:13 warning pylint:C0103 Constant name "bluetooth_server_enabled" doesn't conform to UPPER_CASE naming
style (invalid-name)
864:5 warning pylint:C0103 Constant name "main_loop" doesn't conform to UPPER_CASE naming style (invalid-
name)

bluetooth issue, 104 error

When attempting to pair with bluetooth, I have the following issue:

[2019-05-18 21:14:19] (Bluetooth) Waiting for connections on RFCOMM channel 1
[2019-05-18 21:14:41] (Bluetooth) Pair request from: MAC::ADDRESS::HERE

[2019-05-18 21:14:41] (Bluetooth) Error pair_request: (104, 'Connection reset by peer')

Can't pair with my device

[2017-01-03 19:01:06] (TCP) Waiting for connections on port 46352
[2017-01-03 19:02:21] (TCP) Failed TLS handshake pair_request: EOF occurred in violation of protocol (_ssl.c:645)
My phone just keeps saying "Connecting..."

I installed from this AUR (build seemed fine to me, and I manually started the python file first): https://aur.archlinux.org/packages/an2linuxserver-git/

Any ideas?

systemd service does not work

I followed the guide step by step, changed the path (in my case /usr/bin/an2linuxserver.py), created ~/.config/systemd/user folder.
When I execute sudo systemctl --user start an2linux.service I get
Failed to start an2linux.service: Unit an2linux.service not found.
If I add it to /usr/lib/systemd/system/an2linux.service I can get it enabled and started, but it doesn't work, I even changed from WantedBy=default.target to WantedBy=multi-user.target but it doesn't work. This happens on manjaro (Arch) Linux, I correctly installed an2linuxserver-git from AUR.
If I simply run an2linuxserver.py in a terminal it does work

Filter notifications based on priority

An option to only allow notifications that have a priority >= preference value to be mirrored to the desktop would be nice.
That would allow to disable certain Google Now notifications (e.g. weather notifications).

Error when trying to use Bluetooth

I get the following error when I try to start the program with Bluetooth enabled:

Traceback (most recent call last):
File "/home/tvas/.local/lib/python3.5/site-packages/bluetooth/bluez.py", line 240, in advertise_service
protocols)
_bluetooth.error: (2, 'No such file or directory')
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "an2linuxserver.py", line 779, in
bluetooth_server = ThreadingBluetoothServer()
File "an2linuxserver.py", line 279, in init
profiles=[SERIAL_PORT_PROFILE])
File "/home/tvas/.local/lib/python3.5/site-packages/bluetooth/bluez.py", line 242, in advertise_service
raise BluetoothError (str (e))
bluetooth.btcommon.BluetoothError: (2, 'No such file or directory')

I've tried various solutions regarding bluez from SO and others but couldn't get it to work.

Errors reported about 'binding'

~/.xsession-errors contains:

UdevQt: unhandled device action "unbind"
Traceback (most recent call last):
  File "/home/nicholas/an2linux/code/an2linuxserver.py", line 826, in <module>
    tcp_server = ThreadingDualStackServer(('', tcp_port_number), TCPHandler)
  File "/usr/lib/python3.6/socketserver.py", line 456, in __init__
    self.server_bind()
  File "/home/nicholas/an2linux/code/an2linuxserver.py", line 272, in server_bind
    super().server_bind()
  File "/usr/lib/python3.6/socketserver.py", line 470, in server_bind
    self.socket.bind(self.server_address)
OSError: [Errno 98] Address already in use

Still the last time I tested it the software does work.

I am running the software via systemd as a 'user' service.

OS: Linux Mint 19.1 Tessa x86_64
Host: 20KHCTO1WW ThinkPad X1 Carbon 6th
Kernel: 5.1.16-050116-generic
Uptime: 2 days, 16 hours, 40 mins
Packages: 3199 (dpkg), 3 (snap)
Shell: bash 4.4.20
Resolution: 2560x1440 @ 60.01Hz
DE: Cinnamon 4.2.0
WM: Mutter (Muffin)

I have the latest git version of an2linux.

Client Certificate Cryptography Issues

Instead of using TLS client certificates, the implementation uses the sha1 hash of a password called client_cert.

sha1 = hashlib.sha1(client_cert + SERVER_CERT_DER).hexdigest().upper()

That is not how client certificates work, You don't just have to prove that you have the public key of a certificate, you have to prove that you have the private key of the certificate. This is done through RSA, not SHA1. This authentication mechanism appears to be vulnerable to man-in-the-middle attacks. This is why cryptographers will tell you not to roll your own crypto.

Notification suddenly stopped working

Hi there,

I know the title is kinda stupid but that's really what happened.
Since today I get no more notification and until today it worked fine for month.
Not even the test notification.

I did not install any updates on my phone nor my PC since then so I am at a loss about the reasons this could happen.

I use an2linux on archlinux, latest git version.

Is there any chance I can debug this somehow?

Cheers

service logging?

hi, doesn't look like this logs to file. any thoughts on adding logging? (startup, errors, client connection issues, cert issues, notification received, notification ignored, etc)

i've installed it on my laptop, and on my phone, but haven't gotten any SMS notifications on my laptop yet.

i don't want this to be an issue opened about that, but, if i have an issue, first things i check are logs, connectivity, etc.

thoughts on logging?

Notification issue

Hi,
I have a issue with my GNU/Linux Debian :

[2017-04-17 20:28:33] (Notification) Error showing notification: g-io-error-quark: The connection is closed (18)
[2017-04-17 20:28:33] Please make sure you have a notification server installed on your system

Give me help !

README should perhaps include: pairing does not work if Wireguard is running on the phone

On my Lollipop phone I find that pairing does not work if Wireguard is running on that phone. If I disable Wireguard temporarily then the pairing works. I think that having Wireguard running on the Linux device does not obstruct pairing. You might want to say these things in your README. Thank you for your software.

Also: I found that after the latest update - of the Android app, I think (as against the Linux software), notifications broke until I re-established pairing. But the cause could have been user-error (I may have messed with my service file on Linux, or something).

Add dependency in README

Typelib file for namespace 'GdkPixbuf', version '2.0' not found
So, you need to install GDK Pixbuf library (gir1.2-gdkpixbuf-2.0 package on deb-based distros).

When an2Linux is run as a service on the server, pairing hangs - overheating the server - because no prompt is displayed

I run an2linux as a user service. When I attempted to pair a new laptop with the phone app, the pairing hung. The cause is that, when run as a service, the server does not display any pairing prompt.

Moreover: while the phone was trying to setup the pairing, it left me unclear what it was doing. For, it displayed a hash and the 'save' and 'cancel' buttons, but the former button did nothing.

Also, while the pairing is hung (waiting for an answer to a prompt that never appears), an2linuxserver.py uses some 12% of my laptop's (the server's) CPU and keeps the CPU pegged to maximum frequency; as a result, the CPU read over 90 degrees C.

A further complication: manually running an2linuxserver.py, in order to try to determine what is happening, produces the cryptic error documented at #47 - because the service version of an2linux is occupying the required port.

My phone

Android Lollipop on a Moto G 1st Gen
an2Linux 0.9.2(14)

My server/laptop

an2linux: latest
OS: Linux Mint 19.2 Tina x86_64
Host: 20KHCTO1WW ThinkPad X1 Carbon 6th
Kernel: 5.2.18-050218-generic
Packages: 3153 (dpkg), 6 (flatpak), 4 (snap)
Shell: bash 4.4.20
Resolution: 2560x1440 @ 60.01Hz
DE: Cinnamon 4.2.4
WM: Mutter (Muffin)
CPU: Intel i7-8550U (8) @ 4.000GHz
GPU: Intel UHD Graphics 620
Memory: 3457MiB / 15931MiB

EDIT: The problem with the pairing seems to be what is reported at #47 , but/so what I mean to report here is: (1) the UI doesn't make it clear what is going on; (2) the program should not overheat the server. Possible solutions (best used together?) to 2: reduce CPU usage; build in a timeout.

Bluetooth connection problem

Mobile Device: LineageOS 14.1 Nougat on OnePlus 2
Connection: Bluetooth
Environment: Gnome on ArchLinux
Problem:
python-pybluez installed.
Mobile has paired and connected to archlinux using bluetooth
An2Linux App cannot connect archlinux using bluetooth
Nougat problem or server-side problem not tested

"Dependency missing: python-bluez" but this package is already installed

Hi,
When I run I get this message:
Dependency missing: python-bluez No module named 'bluetooth'

But this package is already installed:
apt-cache policy python-bluez python-bluez: Installed: 0.22-1 Candidate: 0.22-1 Version table: *** 0.22-1 500 500 http://deb.debian.org/debian sid/main amd64 Packages 500 http://deb.debian.org/debian stretch/main amd64 Packages 100 /var/lib/dpkg/status

How to solve this issue on debian sid?

Thanks for your kind help :)

Some applications do not work (Viber, Google Reminders).

I haven't tested this thoroughly but in my experience, although Viber and Google Reminders (created through the Google Now app) create notifications on the phone, they are not getting pushed from A2Linux.

Any idea what might be the cause? I have all apps enabled in the AN2Linux settings/whitelist.

EDIT: Not sure if I should report this to the client repo instead.

Feature request: Have configurable paths for at least TMP_DIR_PATH

First off - thanks for sharing your code! After linconnect died, this is the only option.

Can you please change tthe hardcoded TMP_DIR_PATH to something user configrable? Either read from ENV or a setting in options file. Better yet, read XDG_RUNTIME_DIR or something?

Had an issue with this - lightdm starts the user systemd for an2linux and obviously perms on $TMP_DIR_PATH/an2linux are set accordingly, so the dir is not writable for a user that logs in.

Suggestion: Mute sound

Not really sure if this one should be put in the client instead but here goes:

I'd love to see the option to automatically mute the sound when an outgoing or incoming phone call is starting.

Pairing over USB

I'm not sure if that's possible without a custom kernel, but that would be great :

  • When your computer doesn't have Bluetooth
  • When you don't want notifications to be sent through WiFi/mobile

Can't pairing when "server-side" is on a VPN.

Hello,

My laptop is currently connected to a VPN.

I'm trying to pairing my phone with my laptop trough my eth0 interface (without trough VPN). I checked my router, opened the 46352port on my firewall, and checked my ISP IP address, but I had a timeout on my phone when I tried to pairing.

It's look like that the script listen on the VPN interface (default GW) instead of eth0 (or all) interfaces.

(Already try without any VPN connection on a VM, no problem).

error IPv4 /IPv6

when I run an2linuxserver.py, I've an error :
Failed to use IPv4/IPv6 dual stacking, fallbacks to IPv4 only (an2linuxserver.py:831)

Need pair every reboot

Hi,

I need to pair the device with the desktop in every reboot, i have the authorized_certs file in /home/.config/an2linux but nothing, in every reboot i need pair again...

Is any option for make that automatic in the way? Or is some kind of error in my config?

Regards!

Notifications no longer displayed.

For some reason notifications have stopped appearing. What can I do to debug this?
Are there ways to find out what's happening on the device and server side when a notification is created on the phone?

I'm using the latest version of server and client, my setup is through Bluetooth, I'm trying to display the test notification from the client.

I've ensured the Bluetooth connection works otherwise, and the server is running as usual, but notifications are not displayed. I'm on Ubuntu 16.04 LTS.

Commas in SSIDs

Is it possible to change the character that's used to separate the SSIDs in the settings? Right now comma is used, but there are some users (including me) that set their SSIDs to include them. Or perhaps to use some escape character or such, so that it would register the comma as part of a name, rather than as an indication that the following characters are part of another SSID.

Send desktop notifications to phone

It would be nice to receive my libnotify notifications on my Android phone.

Basically provide the reverse of what this setup already does

Notification type

KDE Plasma recently made a change to they notification system which makes it so, that an2linux notifications are only shown temporarily and are not added to the notification history anymore.
I was told this is the applications "fault" because the notification typ is not correctly set (to be shown permanently in the history).

I had a discussion about it on reddit: https://www.reddit.com/r/kde/comments/c7w6u5/no_plasma_notifications_history_after_update_to/

Would it be possible to change the notification type to something that makes it show up in the history again? Maybe even make it configurable so the user can decide how he wants to see the notifications?

Would be great!

KDE Plasma is probably adding something similar ( https://www.reddit.com/r/kde/comments/c7w6u5/no_plasma_notifications_history_after_update_to/esiqct6/ ) so the notifications are not "lost" anymore but it will take a while until that change hits.

Cheers

Won't execute

So I installed the dependencies

sudo apt-get install python3 libnotify4 gir1.2-notify-0.7 gir1.2-gdkpixbuf-2.0 python3-gi

And downloaded an2linuxserver.py

wget https://github.com/rootkiwi/an2linuxserver/raw/master/an2linuxserver.py

When I ran

python an2linuxserver.py

I got this error message

File "an2linuxserver.py", line 161
    print('\n{}'.format(self.user_input_prompt), end='')
                                                    ^
SyntaxError: invalid syntax

Do you know what I might be doing wrong?

no notifications displayed

I got this error
Error TCPHandler/handle g-io-error-quark: Timeout was reached (24)

I tried to debug it and cam to the conclusion it's in self.notif.show() that the timeout happens, but I couldn't dig further

Bluetooth: Failed to connect

I'm not able to connect to my laptop via Bluetooth. The Android app sees my laptop, but attempting to initiate pairing results in "Failed to connect."

an2linuxserver.service:

[Unit]
Description=AN2Linux
Wants=bluetooth.service
After=bluetooth.service

[Service]
Type=simple
User=yochanan
Group=yochanan
StandardOutput=null
Restart=on-failure
ExecStartPre=/usr/bin/sleep 3
ExecStart=/usr/bin/an2linuxserver
Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
PrivateDevices=true
ProtectHome=read-only
ProtectSystem=strict
ReadWritePaths=/tmp

[Install]
WantedBy=default.target
● an2linuxserver.service - AN2Linux
     Loaded: loaded (/usr/lib/systemd/system/an2linuxserver.service; enabled; vendor pre>
     Active: activating (start-pre) since Thu 2020-04-02 14:29:18 MDT; 2s ago
Cntrl PID: 436584 (sleep)
      Tasks: 1 (limit: 18764)
     Memory: 216.0K
     CGroup: /system.slice/an2linuxserver.service
             └─436584 /usr/bin/sleep 3

Apr 02 14:29:18 inspirognome systemd[1]: Starting AN2Linux...

Manjaro GNOME
an2linuxserver-git r32.58648ec

T-Mobile OnePlus 7 Pro
Oxygen OS 10.03
Android 10.0
An2Linux 0.12.0(17)

Cannot use on xUbuntu with bluetooth

Using Xubuntu 16.04 server fails to start:

./an2linuxserver.py
[2017-03-30 14:47:23] Server certificate fingerprint: 7F 38 1C D0 93 14 6F 75 AD A2 E0 4C 6C E0 A7 E3 9F 21 30 AA
Traceback (most recent call last):
File "/home/myusername/.local/lib/python3.5/site-packages/bluetooth/bluez.py", line 240, in advertise_service
protocols)
_bluetooth.error: (2, 'No such file or directory')

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "./an2linuxserver.py", line 836, in
bluetooth_server = ThreadingBluetoothServer()
File "./an2linuxserver.py", line 282, in init
profiles=[SERIAL_PORT_PROFILE])
File "/home/myusername/.local/lib/python3.5/site-packages/bluetooth/bluez.py", line 242, in advertise_service
raise BluetoothError (str (e))
bluetooth.btcommon.BluetoothError: (2, 'No such file or directory')

I think the problem is between python 2.7, 3.0 and 3.5
I installed using pip:
pip3 install pybluez --user

I tried running the script with python 2.7, 3 and 3.5

an2linuxserver.py cannot connect to notification daemon when run from systemd service unit

So here is the problem using proposed in README.md service unit
And no notification is displayed, I do not use tmux, so a wrote service unit that used screen:

Description=AN2Linux server screen

[Service]
Type=forking
Restart=on-failure
ExecStart=/usr/bin/screen -dmS an2linux '/opt/bin/an2linuxserver.py'
ExecStop=/usr/bin/screen -X -S an2linux quit

[Install]
WantedBy=default.target

After that I was able to connect to screen session and what I tried to send test notification that is what I got:

[2017-02-08 20:34:37] (TCP) Failed to use IPv4/IPv6 dual stacking, fallbacks to IPv4 only
[2017-02-08 20:34:37] (TCP) Waiting for connections on port 46352
[2017-02-08 20:34:56] (Notification) Error showing notification: g-dbus-error-quark: GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.Notifications was not provided by any .service files (2)
[2017-02-08 20:34:56] Please make sure you have a notification server installed on your system

Obviously if same thing executed in any X-term, all works fine.
I can see same error in unit without screen usage without StandardOutput=null

[2017-02-08 22:03:00] (TCP) Failed to use IPv4/IPv6 dual stacking, fallbacks to IPv4 only
[2017-02-08 22:03:00] (TCP) Waiting for connections on port 46352
[2017-02-08 22:03:10] (Notification) Error showing notification: g-dbus-error-quark: GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.Notifications was not provided by any .service files (2)
[2017-02-08 22:03:10] Please make sure you have a notification server installed on your system

Bluetooth + Systemd service run without issues, but doesn't receive notifications

I've added an2linux.service to systemd, and systemctl --user status an2linux.service shows that it's running without any issues, however, it isn't receiving any notifications.

Running the script manually with python3 an2linuxserver.py works correctly, though. I've also already tried sudo loginctl enable-linger <user> without success.

show no notifications after reboot

I've installed correctly and started the daemon at startup but (except for the first time I run the program) when system is booted it doesn't work.
I tap on Display notification, and it appears the message on the phone "Test Wifi" but nothing is notified.
daemon is active and pairing is done...
what is wrong?

Icon size

Is there a way to change the default icon size of the notifications ?

Not working notification

Arch linux with i3wm
My notification server is dunst

When notification pop up on phone, I got these error on server:

[2020-12-08 23:02:11.075] (Notification) Error showing notification: g-spawn-exit-error-quark: Error spawning command line “dbus-launch --autolaunch=a8db15c53a7545a58bea7b178474d790 --binary-syntax --close-stderr”
[2020-12-08 23:02:11.076] Please make sure you have a notification server installed on your system

Update stuff

Hello, congratulations for this script.

A little question about the server side of AN2Linux.

On the client part, the update process will be proceed by the Google Play Store or by F-Droid (in my case), but on the server side, it's look like there are no update script for future versions of the .py file.

Am I missing something or how update the server-side when updates ?

Thx & Regards

No notification on computer side

Hi,
I successfully installed the application on the android phone from F-Droid, configured it, lunched the python server script in a terminal, paired the both over WiFi. => OK

When I check the "Display test notification" the notification appear on the phone it show "Testing WiFi..." about 3 seconds later "Found no enabled bluetooth server" (i didn't configure any bluetooth stuff cause i don't want to use it over bluetooth) and 3 seconds more nothing.
On computer side nothing happens, no more in the terminal.

My computer as the required soft installed, I'm on linux Mint 17.

Did I miss something?
Thank You

Clear notifications from phone

Hey, It would be nice if when I closed a notification on the phone or on the desktop, it would close on the other.

I'm not sure this is possible on the android side (never done anything for android), but with libnotify if we keep track of our current notifications we can cancel them

Pybluez-0.23 breaks bluetooth support

I hadn't used an2linuxserver for some time, so I noticed just recently that it had stopped working with bluetooth connection on Arch Linux. After some investigation I found out that the culprit was the recent python-pybluez-0.23-1 update. I get this error when trying to start it with pybluez-0.23:

(an2linuxserver.py:826)
Traceback (most recent call last):
  File "/usr/lib/python3.9/site-packages/bluetooth/bluez.py", line 271, in advertise_service
    _bt.sdp_advertise_service (sock._sock, name, service_id, \
_bluetooth.error: no advertisable device

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/bin/an2linuxserver.py", line 874, in <module>
    bluetooth_server = ThreadingBluetoothServer()
  File "/usr/bin/an2linuxserver.py", line 284, in __init__
    advertise_service(self.bluetooth_server_sock, "AN2Linux_bluetooth_server",
  File "/usr/lib/python3.9/site-packages/bluetooth/bluez.py", line 275, in advertise_service
    raise BluetoothError (*e.args)
bluetooth.btcommon.BluetoothError: no advertisable device

Downgrading python-pybluez to version 0.22-6 allow an2linuxserver to work again.

Cannot pair

EDITED: Sorry; again I've got things working.

Network manager unstable

When I lunch the server my network start to be unstable. Network manager disconnects from the network frequently. I have tried it on two configurations (same computer):
Fedora 27 (XFCE spin)
Archlinux with XFCE
The softwares works, I can receive the notifications and everything seems to be working fine but the NetworkManager disconnects randomly often during the day.
I don't understand the connection between the two softwares so I don't know which log I can send to you to try to fix the problem.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.