abhishek-ram / pyas2 Goto Github PK
View Code? Open in Web Editor NEWThis repo is no longer maintained and has been moved to https://github.com/abhishek-ram/django-pyas2
License: GNU General Public License v2.0
This repo is no longer maintained and has been moved to https://github.com/abhishek-ram/django-pyas2
License: GNU General Public License v2.0
Is it possible to keep the original filename when the server receives the message.
Thanks
Hi there,
When uploading the private key I get this error.
The joined path (/pyas2/certificates/as2_private.pem) is located outside of the base path component (/media)
It seems that's due to this line below but I'm left wondering how this hasn't come up before? It feels to me like it would be better to reference the path to these keys in the settings dict rather than using upload in admin?
https://github.com/abhishek-ram/pyas2/blob/master/pyas2/models.py#L19
Hello,
When requesting an MDN from partner I receive the following error with traceback:
20150628 19:09:37 INFO : Send message started with parameters: "['/usr/bin/python', '/home/testserver/django_pyas2/manage.py', 'sendas2message', u'test1', u'test2', u'/tmp/test.txtxjxflq']"
System check identified some issues:
WARNINGS:
?: (1_6.W001) Some project unittests may not execute as expected.
HINT: Django 1.6 introduced a new default test runner. It looks like this project was generated using Django 1.5 or earlier. You should ensure your tests are all running & behaving as expected. See https://docs.djangoproject.com/en/dev/releases/1.6/#new-test-runner for more information.
20150628 19:09:37 DEBUG : Sender Mic content
MIME-Version: 1.0
Content-Type: application/pkcs7-mime; name="smime.p7z"; smime-type="compressed-data"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="smime.p7z"
MIAGCyqGSIb3DQEJEAEJoIAwgAIBADCABgsqhkiG9w0BCRADCAAAMIAGCSqGSIb3DQEHAaCABGJ4
nC3KMQ6AIBAF0Z6EOxh7tddY4RG8AMElroEFwy/w9mJiO/NMEpBg2J9Mc2dzDuwsOMlEBw8uSWlX
K/OzjUtOhT/QNGDdGVtfOs+BxEZae1DBiIp6VR/uXiutvvQCFhgmTgAAAAAAAAAAAAA=
Traceback (most recent call last):
File "/home/testserver/django_pyas2/manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 385, in execute_from_command_line
utility.execute()
File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 377, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 288, in run_from_argv
self.execute(*args, **options.__dict__)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 338, in execute
output = self.handle(*args, **options)
File "/usr/local/lib/python2.7/dist-packages/pyas2/management/commands/sendas2message.py", line 54, in handle
message.save()
File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 589, in save
force_update=force_update, update_fields=update_fields)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 617, in save_base
updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 679, in _save_table
forced_update)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 723, in _do_update
return filtered._update(values) > 0
File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 600, in _update
return query.get_compiler(self.db).execute_sql(CURSOR)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py", line 1005, in execute_sql
cursor = super(SQLUpdateCompiler, self).execute_sql(result_type)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py", line 787, in execute_sql
cursor.execute(sql, params)
File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 81, in execute
return super(CursorDebugWrapper, self).execute(sql, params)
File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 65, in execute
return self.cursor.execute(sql, params)
File "/usr/local/lib/python2.7/dist-packages/django/db/utils.py", line 94, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 65, in execute
return self.cursor.execute(sql, params)
django.db.utils.DataError: value too long for type character varying(2)
Here is the log messages from pyas2 admin:
SOLUTION
The problem originates from table pyas2_message
, column mdn_mode
. Here the options from models.py
can only be "ASYNC" or "SYNC". varchar(2)
will not be enough to hold either of these values and needs to be updated to at least varchar(5)
. After changing to varchar(5)
. The issue is eliminated.
Thanks!
Hi there, is anyone working on or planning to work on sha-256 or sha-512 hashing? I am looking at integrating with a partner who does not accept sha-1.
I would be willing to help if someone is starting on this project or I could work on it if someone can give me advice :)
starting daemon mode python manage.py runas2daemon.
Now when I drop a file in the outbox (e.g. p1/django_pyas2/messages/p2as2/outbox/p1as2/), I see a stacktrace:
Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 810, in *bootstrap_inner
self.run()
File "/usr/lib/python2.7/threading.py", line 763, in run
self.__target(_self.__args, _self.__kwargs)
File "/home/latze/.virtualenvs/as2/local/lib/python2.7/site-packages/pyas2/management/commands/runas2daemon.py", line 122, in linux_event_handler
notifier.loop()
File "/home/latze/.virtualenvs/as2/local/lib/python2.7/site-packages/pyinotify.py", line 1390, in loop
self.process_events()
File "/home/latze/.virtualenvs/as2/local/lib/python2.7/site-packages/pyinotify.py", line 1287, in process_events
self._default_proc_fun(revent)
File "/home/latze/.virtualenvs/as2/local/lib/python2.7/site-packages/pyinotify.py", line 924, in __call
return _ProcessEvent.call(self, event)
File "/home/latze/.virtualenvs/as2/local/lib/python2.7/site-packages/pyinotify.py", line 650, in call
return self.process_default(event)
File "/home/latze/.virtualenvs/as2/local/lib/python2.7/site-packages/pyas2/management/commands/runas2daemon.py", line 106, in process_default
for dir_watch in self.dir_watch_data:
AttributeError: 'LinuxEventHandler' object has no attribute 'dir_watch_data'
Hi,
Is it possible to customize the message of the MDN.
Thanks
Currently receiving the following log message on all inbound messages. Why is this happening?
An error occurred during the AS2 message processing: Failed to decompress message,exception message is tuple index out of range
Has anyone ran this server on Heroku?
I am getting the following error which is similar to #30 but I think the solution will have to be different because the way Heroku installs packages.
2018-03-05T22:20:16.974472+00:00 heroku[web.1]: - Starting process with command `python manage.py runas2server`
2018-03-05T22:20:20.281704+00:00 heroku[web.1]: - State changed from starting to crashed
2018-03-05T22:20:20.195261+00:00 app[web.1]: - Traceback (most recent call last):
2018-03-05T22:20:20.195296+00:00 app[web.1]: - execute_from_command_line(sys.argv)
2018-03-05T22:20:20.195287+00:00 app[web.1]: - File "manage.py", line 22, in <module>
2018-03-05T22:20:20.195310+00:00 app[web.1]: - File "/app/.heroku/python/lib/python2.7/site-packages/django/core/management/__init__.py", line 367, in execute_from_command_line
2018-03-05T22:20:20.195348+00:00 app[web.1]: - utility.execute()
2018-03-05T22:20:20.195425+00:00 app[web.1]: - django.setup()
2018-03-05T22:20:20.195360+00:00 app[web.1]: - File "/app/.heroku/python/lib/python2.7/site-packages/django/core/management/__init__.py", line 341, in execute
2018-03-05T22:20:20.195436+00:00 app[web.1]: - File "/app/.heroku/python/lib/python2.7/site-packages/django/__init__.py", line 27, in setup
2018-03-05T22:20:20.195443+00:00 app[web.1]: - File "/app/.heroku/python/lib/python2.7/site-packages/django/apps/registry.py", line 108, in populate
2018-03-05T22:20:20.195494+00:00 app[web.1]: - File "/app/.heroku/python/lib/python2.7/site-packages/django/apps/config.py", line 199, in import_models
2018-03-05T22:20:20.195523+00:00 app[web.1]: - self.models_module = import_module(models_module_name)
2018-03-05T22:20:20.195441+00:00 app[web.1]: - apps.populate(settings.INSTALLED_APPS)
2018-03-05T22:20:20.195529+00:00 app[web.1]: - File "/app/.heroku/python/lib/python2.7/importlib/__init__.py", line 37, in import_module
2018-03-05T22:20:20.195491+00:00 app[web.1]: - app_config.import_models(all_models)
2018-03-05T22:20:20.195537+00:00 app[web.1]: - File "/app/.heroku/python/lib/python2.7/site-packages/pyas2/models.py", line 6, in <module>
2018-03-05T22:20:20.195603+00:00 app[web.1]: - from pyas2 import pyas2init
2018-03-05T22:20:20.195606+00:00 app[web.1]: - File "/app/.heroku/python/lib/python2.7/site-packages/pyas2/pyas2init.py", line 5, in <module>
2018-03-05T22:20:20.195533+00:00 app[web.1]: - __import__(name)
2018-03-05T22:20:20.195611+00:00 app[web.1]: - from pyas2 import as2utils
2018-03-05T22:20:20.195615+00:00 app[web.1]: - File "/app/.heroku/python/lib/python2.7/site-packages/pyas2/as2utils.py", line 12, in <module>
2018-03-05T22:20:20.195637+00:00 app[web.1]: - File "/app/.heroku/python/lib/python2.7/site-packages/M2Crypto/__init__.py", line 26, in <module>
2018-03-05T22:20:20.195635+00:00 app[web.1]: - from M2Crypto import BIO, SMIME, X509
2018-03-05T22:20:20.195690+00:00 app[web.1]: - from M2Crypto import (ASN1, AuthCookie, BIO, BN, DH, DSA, EVP, Engine, Err,
2018-03-05T22:20:20.195693+00:00 app[web.1]: - File "/app/.heroku/python/lib/python2.7/site-packages/M2Crypto/ASN1.py", line 15, in <module>
2018-03-05T22:20:20.195695+00:00 app[web.1]: - from M2Crypto import BIO, m2, util
2018-03-05T22:20:20.195696+00:00 app[web.1]: - File "/app/.heroku/python/lib/python2.7/site-packages/M2Crypto/BIO.py", line 9, in <module>
2018-03-05T22:20:20.195701+00:00 app[web.1]: - from M2Crypto import m2, six, util
2018-03-05T22:20:20.195703+00:00 app[web.1]: - File "/app/.heroku/python/lib/python2.7/site-packages/M2Crypto/m2.py", line 30, in <module>
2018-03-05T22:20:20.195706+00:00 app[web.1]: - File "/app/.heroku/python/lib/python2.7/site-packages/M2Crypto/m2crypto.py", line 26, in <module>
2018-03-05T22:20:20.195704+00:00 app[web.1]: - from M2Crypto.m2crypto import *
2018-03-05T22:20:20.195710+00:00 app[web.1]: - _m2crypto = swig_import_helper()
2018-03-05T22:20:20.195713+00:00 app[web.1]: - File "/app/.heroku/python/lib/python2.7/site-packages/M2Crypto/m2crypto.py", line 22, in swig_import_helper
2018-03-05T22:20:20.195738+00:00 app[web.1]: - _mod = imp.load_module('_m2crypto', fp, pathname, description)
2018-03-05T22:20:20.195746+00:00 app[web.1]: - ImportError: /app/.heroku/python/lib/python2.7/site-packages/M2Crypto/_m2crypto.so: undefined symbol: sslv3_method```
I'm trying to install pyAS2 on Windows 2012 server. This is how far I get
SWIG/_m2crypto_wrap.c(3541) : fatal error C1083: Cannot open include file: '
openssl/err.h': No such file or directory
error: command 'C:\Users\Administrator\AppData\Local\Programs\Common\
Microsoft\Visual C++ for Python\9.0\VC\Bin\cl.exe' failed with exit status
2
Need to create tests so we can do automated regression testing before each release.
Downloading/unpacking pyas2
Downloading pyAS2-0.2.tar.gz (247kB): 247kB downloaded
Running setup.py (path:/tmp/pip-build-KEI3C8/pyas2/setup.py) egg_info for package pyas2
Traceback (most recent call last):
File "", line 17, in
File "/tmp/pip-build-KEI3C8/pyas2/setup.py", line 4, in
with open(os.path.join(os.path.dirname(file), 'pyAS2/README.rst')) as readme:
IOError: [Errno 2] No such file or directory: '/tmp/pip-build-KEI3C8/pyas2/pyAS2/README.rst'
Complete output from command python setup.py egg_info:
Traceback (most recent call last):
File "", line 17, in
File "/tmp/pip-build-KEI3C8/pyas2/setup.py", line 4, in
with open(os.path.join(os.path.dirname(__file__), 'pyAS2/README.rst')) as readme:
IOError: [Errno 2] No such file or directory: '/tmp/pip-build-KEI3C8/pyas2/pyAS2/README.rst'
Cleaning up...
Command python setup.py egg_info failed with error code 1 in /tmp/pip-build-KEI3C8/pyas2
Storing debug log for failure in /home/latze/.pip/pip.log
Facing signature varification failures when testing with Mendelson AS2.
@klaasfeenstra, Can you please provide details of the error you are facing so that we can track and fix this bug.
The latest update of pyasn1 is able to parse the pkcs7 data, so in effect we should be ablt to extract the signatures and then verify them.
This will mean that we have full control over signing such as hashing algrithm used and other factors that are not exposed by M2Crypto
Can anyone help to explain why the server throws exception on a particular inbound receive? Someone is sending to us a X12 formatted payload. We are getting the following exception. Seems to be duplicate key? I'm not quite sure why this is happening.
20170921 12:52:35 ERROR : Fatal error while processing message AS2.11.BizLink.3.3.0.68.668c2956-4fa2-460e-8626-ca138278ccb4.4388672f-9eed-11e7-a4c6-c6b9043a942e@85aa9ee9f8d90158.5c761060.15ea55aeec1.8000, error:
Traceback (most recent call last):
File "/usr/lib/python2.7/site-packages/pyas2/views.py", line 544, in as2receive
status_message=status_message)
File "/usr/lib/python2.7/site-packages/pyas2/as2lib.py", line 311, in build_mdn
message.save()
File "/usr/lib64/python2.7/site-packages/django/db/models/base.py", line 796, in save
force_update=force_update, update_fields=update_fields)
File "/usr/lib64/python2.7/site-packages/django/db/models/base.py", line 824, in save_base
updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
File "/usr/lib64/python2.7/site-packages/django/db/models/base.py", line 908, in _save_table
result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
File "/usr/lib64/python2.7/site-packages/django/db/models/base.py", line 947, in _do_insert
using=using, raw=raw)
File "/usr/lib64/python2.7/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/lib64/python2.7/site-packages/django/db/models/query.py", line 1045, in _insert
return query.get_compiler(using=using).execute_sql(return_id)
File "/usr/lib64/python2.7/site-packages/django/db/models/sql/compiler.py", line 1054, in execute_sql
cursor.execute(sql, params)
File "/usr/lib64/python2.7/site-packages/django/db/backends/utils.py", line 79, in execute
return super(CursorDebugWrapper, self).execute(sql, params)
File "/usr/lib64/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
File "/usr/lib64/python2.7/site-packages/django/db/utils.py", line 94, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
File "/usr/lib64/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
File "/usr/lib64/python2.7/site-packages/django/db/backends/mysql/base.py", line 110, in execute
return self.cursor.execute(query, args)
File "/usr/lib64/python2.7/site-packages/MySQLdb/cursors.py", line 205, in execute
self.errorhandler(self, exc, value)
File "/usr/lib64/python2.7/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
raise errorclass, errorvalue
IntegrityError: (1062, "Duplicate entry '.... the message id that is scrubbed here ....' for key 'PRIMARY'")
I keep getting this error message when I run "python manage.py makemigrations pyas2"; how do I fix this?
Traceback (most recent call last):
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/home/max/Projects/as2test/env/lib/python2.7/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line
utility.execute()
File "/home/max/Projects/as2test/env/lib/python2.7/site-packages/django/core/management/__init__.py", line 354, in execute
django.setup()
File "/home/max/Projects/as2test/env/lib/python2.7/site-packages/django/__init__.py", line 21, in setup
apps.populate(settings.INSTALLED_APPS)
File "/home/max/Projects/as2test/env/lib/python2.7/site-packages/django/apps/registry.py", line 108, in populate
app_config.import_models(all_models)
File "/home/max/Projects/as2test/env/lib/python2.7/site-packages/django/apps/config.py", line 197, in import_models
self.models_module = import_module(models_module_name)
File "/usr/lib64/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
File "/home/max/Projects/as2test/env/lib/python2.7/site-packages/pyas2/models.py", line 6, in <module>
from pyas2 import pyas2init
File "/home/max/Projects/as2test/env/lib/python2.7/site-packages/pyas2/pyas2init.py", line 5, in <module>
from pyas2 import as2utils
File "/home/max/Projects/as2test/env/lib/python2.7/site-packages/pyas2/as2utils.py", line 12, in <module>
from M2Crypto import BIO, SMIME, X509
File "/home/max/Projects/as2test/env/lib/python2.7/site-packages/M2Crypto/__init__.py", line 26, in <module>
from M2Crypto import (ASN1, AuthCookie, BIO, BN, DH, DSA, EVP, Engine, Err,
File "/home/max/Projects/as2test/env/lib/python2.7/site-packages/M2Crypto/ASN1.py", line 15, in <module>
from M2Crypto import BIO, m2, util
File "/home/max/Projects/as2test/env/lib/python2.7/site-packages/M2Crypto/BIO.py", line 10, in <module>
from M2Crypto import m2, util
File "/home/max/Projects/as2test/env/lib/python2.7/site-packages/M2Crypto/m2.py", line 30, in <module>
from M2Crypto._m2crypto import *
File "/home/max/Projects/as2test/env/lib/python2.7/site-packages/M2Crypto/_m2crypto.py", line 26, in <module>
__m2crypto = swig_import_helper()
File "/home/max/Projects/as2test/env/lib/python2.7/site-packages/M2Crypto/_m2crypto.py", line 22, in swig_import_helper
_mod = imp.load_module('__m2crypto', fp, pathname, description)
ImportError: /home/max/Projects/as2test/env/lib/python2.7/site-packages/M2Crypto/__m2crypto.so: undefined symbol: SSLv3_method
When receiving messages from MS Biztalk, we occasionally see this error during decryption:
An error occurred during the AS2 message processing: Failed to decrypt message, exception message is header too long
the debug output doesn't show any particular AS2 protocol header that's too long, so maybe its' some other header. What is strange is that the debug log does not show the raw contents that were received.
e.g. failed log shows this:
20170525 13:11:08 DEBUG : Recevied an HTTP POST from 172.18.0.1 with payload :
caddy-rewrite-original-uri: /
ediint-features: multiple-attachments
message-id: <VMSERVER412_0F426FE6-58EB-4DD4-A67A-3B3BD61E724F>
x-real-ip: 217.6.54.146
content-length: 5376
user-agent: Microsoft (R) BizTalk (R) Server 2013 R2
connection: close
mime-version: 1.0
content-transfer-encoding: binary
as2-to: STRADERFERRISTEST
as2-version: 1.2
x-forwarded-proto: http
host: as2.strader-ferris.com:27202
expect: 100-continue
as2-from: Test-Schleich
disposition-notification-options: signed-receipt-protocol=required,pkcs7-signature; signed-receipt-micalg=required,sha1
disposition-notification-to: Test-Schleich
x-forwarded-for: 217.6.54.146
content-type: application/pkcs7-mime; smime-type=enveloped-data; name="smime.p7m"
accept-encoding: gzip
20170525 13:11:08 DEBUG : Check payload to see if its an AS2 Message or ASYNC MDN.
20170525 13:11:08 INFO : Received an AS2 message with id <VMSERVER412_0F426FE6-58EB-4DD4-A67A-3B3BD61E724F> for organization STRADERFERRISTEST from partner Test-Schleich
20170525 13:11:08 DEBUG : Decrypting the payload :
20170525 13:11:08 DEBUG : MDN for message VMSERVER412_0F426FE6-58EB-4DD4-A67A-3B3BD61E724F created:
Content-Type: multipart/report; report-type="disposition-notification";
boundary="===============5931524620576249009=="
--===============5931524620576249009==
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
The AS2 message could not be processed. The disposition-notification report has additional details.
--===============5931524620576249009==
Content-Type: message/disposition-notification; charset="us-ascii"
Content-Transfer-Encoding: 7bit
When we ask them to retransmit the same message again, it works and the message is decoded ok
In both cases the content-length is the same, 5376
How do we figure out what header is too long?
Why does the raw message contents not appear in the debug log in the failed case?
20170525 19:04:38 DEBUG : Recevied an HTTP POST from 172.18.0.1 with payload :
caddy-rewrite-original-uri: /
ediint-features: multiple-attachments
message-id: <VMSERVER412_8C56C46A-4359-466F-931C-3DB2500A619E>
x-real-ip: 217.6.54.146
content-length: 5376
user-agent: Microsoft (R) BizTalk (R) Server 2013 R2
connection: close
mime-version: 1.0
content-transfer-encoding: binary
as2-to: STRADERFERRISTEST
as2-version: 1.2
x-forwarded-proto: http
host: as2.strader-ferris.com:27202
expect: 100-continue
as2-from: Test-Schleich
disposition-notification-options: signed-receipt-protocol=required,pkcs7-signature; signed-receipt-micalg=required,sha1
disposition-notification-to: Test-Schleich
x-forwarded-for: 217.6.54.146
content-type: application/pkcs7-mime; smime-type=enveloped-data; name="smime.p7m"
accept-encoding: gzip
0<82>^T<FC>^F *<86>H<86><F7>^M^A^G^C<A0><82>^T<ED>0<82>^T<E9>^B^A^@1<82>^A<C1>0<82>^A<BD>^B^A^@0<81><A4>0<81><96>1^K0 ^F^CU^D^F^S^BUS1^K0 ^F^CU^D^H^L^BNY1^S0^Q^F^CU^D^G^L
Ogdensburg1*0(^F^CU^D
^L!Strader-Ferris International TEST1^Z0^X^F^CU^D^C^L^QSTRADERFERRISTEST1^]0
Hello,
This may be related to Issue #6.
I am again continuing to test with Mendelson's provided test server. The details for this free service can be found here:
When selecting SHA-1
in the partner configuration page under MDN Settings
in the pyas2 admin, it does not seem that is what the partner is recognizing as the used hash algorithm. For some reason they are recognizing it as SHA-256
. Please see the screenshot below and take notice of the last row that is highlighted.
If you look at some of the other rows above, you can see that others have submitted signatures that are recognized as SHA-1
.
I think the issue might be in the header. Mendelson interprets the pyas2 sent header as:
as2-version = 1.2
content-length = 3853
disposition-notification-to = [email protected]
accept = */*
recipient-address = http://testas2.mendelson-e-c.com:8080/as2/HttpReceiver
ediint-features = CEM
message-id = <20150629010101.1725.34375@Q6-EDI>
mime-version = 1.0
content-type = application/pkcs7-mime; smime-type="enveloped-data"; name="smime.p7m"
as2-from = mycompanyAS2
disposition-notification-options = signed-receipt-protocol=required, pkcs7-signature; signed-receipt-micalg=optional, sha1
content-transfer-encoding = base64
subject = EDI Message sent using pyas2
accept-encoding = gzip, deflate, compress
content-disposition = attachment; filename="smime.p7m"
as2-to = mendelsontestAS2
host = testas2.mendelson-e-c.com:8080
user-agent = PYAS2, A pythonic AS2 server
date = Sun, 28 Jun 2015 20:01:01 -0500
other senders where SHA-1
is identified are interpreted as:
content-type = application/pkcs7-mime; smime-type=enveloped-data; name=smime.p7m
message-id = <mendelson_opensource_AS2-1435430104561-2776@mycompanyAS2_mendelsontestAS2>
host = testas2.mendelson-e-c.com:8080
as2-to = mendelsontestAS2
recipient-address = http://testas2.mendelson-e-c.com:8080/as2/HttpReceiver
as2-version = 1.2
user-agent = mendelson opensource AS2 1.1 build 45 - www.mendelson-e-c.com
date = Sat, 27 Jun 2015 13:35:05 COT
ediint-features = multiple-attachments, CEM
via = 1.1 proxy:3128 (squid/2.5.STABLE1)
connection = keep-alive
x-forwarded-for = 10.0.0.22
mime-version = 1.0
cache-control = max-age=259200
from = [email protected]
content-disposition = attachment; filename="smime.p7m"
as2-from = mycompanyAS2
disposition-notification-to = http://www.company.com:8080/as2/HttpReceiver
disposition-notification-options = signed-receipt-protocol=optional, pkcs7-signature; signed-receipt-micalg=optional, sha1
content-length = 2838
expect = 100-continue
subject = AS2 message
and another:
disposition-notification-options = signed-receipt-protocol=optional,pkcs7-signature; signed-receipt-micalg=optional,sha1
as2-to = mendelsontestAS2
subject = test.txt transmission.
host = testas2.mendelson-e-c.com:8080
content-length = 2482
as2-version = 1.2
expect = 100-continue
ediint-features = multiple-attachments
user-agent = AS2 SENDING AGENT
message-id = <AS2_2015-06-25_17:08:26>
disposition-notification-to = mycompanyAS2
mime-version = 1.0
as2-from = mycompanyAS2
content-type = application/pkcs7-mime; smime-type=enveloped-data; name="smime.p7m"
I am still trying to go through the RFC specs for S/MIME, but if anything jumps out at you as to what would cause the sender to misinterpret the hash algorithm used, then please let me know.
Here is also a senders RAW decrypted message as interpreted by Mendelson:
MIME-Version: 1.0
Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg=sha1; boundary="boundaryoJtiAg=="
--boundaryoJtiAg==
Content-Type: application/edi-x12
Content-Transfer-Encoding: binary
Content-Disposition: Attachment; filename="rfc1767.edi"
test
EDI
data
--boundaryoJtiAg==
Content-Type: application/pkcs7-signature; name="smime.p7s"
Content-Disposition: attachment; filename="smime.p7s"
Content-Transfer-Encoding: base64
~~A bunch of garbage text~~
--boundaryoJtiAg==--
Here is the pyas2 RAW decrypted message:
Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg="sha1"; boundary="===============5446110528956887519=="
--===============5446110528956887519==
Content-Type: application/edi-consent
Content-Disposition: attachment; filename="test.txt1b46w4"
test
--===============5446110528956887519==
Content-Type: application/pkcs7-signature; name="smime.p7s"; smime-type="signed-data"
Content-Disposition: attachment; filename="smime.p7s"
Content-Transfer-Encoding: base64
~~A bunch of garbage text~~
--===============5446110528956887519==--
Again, any thoughts on this would be much appreciated.
Thanks!!
when i look here on github.com in the project repo i see no setup.py, but if i download the .tar.gz from pypi i do see it. any ideas why it doesn't exist here in the repo?
I'm trying to install the project in develop mode to make some changes
when receiving payloads signed by an invalid certificate chain (e.g. a self-signed one), the verification will fail. Please implement a UI option that would disable certificate chain verification while still verifying the payload.
I have setup two PYAS2 servers and trying to send a message between the two I followed the instructions here in this Quick Start Guide http://pyas2.readthedocs.io/en/latest/quick-start-guide.html#
I can't get it to work. When trying to send a file this is how far it gets
I checked the logs for both the application and server. Application log only shows the Send message started with parameters: {parameters} and the server log is empty
I see that logging is set to INFO. Where can I change the log level of the application?
any reference how do i export this files into readable.. or some document on how to start on inbound data.
Paging on the messages list is broken when using filters. The next page link is hard-coded to use ?page=2
. The link should also use all other URL queries to maintain filters.
Example: The URL for page 1 of inbound messages is /pyas2/message/?direction=IN
. The next page button takes you to /pyas2/message/?page=2
. It should instead take you to /pyas2/message/?direction=IN&page=2
.
I'm considering trying out pyAS2, but SHA-2 (or SHA256) is not mentioned in the supported list.
Django provides a builtin function for calling commands django.core.management.call_command
Is there something that Popen is providing in this case that call_command does not? Looking to see if I am missing something obvious.
python_executable_path = pyas2init.gsettings['python_path']
managepy_path = pyas2init.gsettings['managepy_path']
...
lijst = [
python_executable_path,
managepy_path,
'sendas2message',
'--delete',
form.cleaned_data['organization'],
form.cleaned_data['partner'],
temp.name
]
subprocess.Popen(lijst).pid
Can be simplified by using:
kwargs = {
'delete': delete,
'organization_as2name': form.cleaned_data['organization'],
'partner_as2name': form.cleaned_data['partner'],
'path_to_payload': temp.name
}
call_command('sendas2message', **kwargs)
with fresh install, cherrypy is installed with version above 10. However, wsgiserver was moved to cheroot as of version 9 forward -> http://docs.cherrypy.org/en/latest/history.html
Workaround: install cherrypy with version >=8, <=9.0a0
Hi,
I have followed the installation instructions from the doc. But when I access to the UI, I dont have the same as the one in the doc. I don't have the logo, name of the server, all the tabs (run, etc...). I have only the "pyAS2 Global Settings" and a tab Home which redirect to the Django admin page...
My server is on Linux Fedora 23 Server. Python version is 2.7.10 and the Django version is 1.9.3.
Could you help & advise.
Thanks
Fred
I am fairly new to the AS2 game, and your software has been the first I have been able to get up and running. However, I am having the below issues that I would very much appreciate your help with.
When testing with Mendelson's test server (Here is info regarding the test server: http://as2.mendelson-e-c.com/), I keep receiving the following openssl error:
Failed to send message, error is 140647279224640:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:703:Expecting: CERTIFICATE
I have extracted the sender key and certificate provided by mendelson (key1.pfx) using:
certificate:
openssl pkcs12 -in key1.pfx -nokeys -out cert.pem
key (used -des3 to maintain password on key):
openssl pkcs12 -in key1.pfx -nocerts -out key.pem -nodes -des3
If I don't sign the AS2 test message, then the message is sent. However, no data is sent with message and the server outputs:
20150627 11:06:14 DEBUG : Sender Mic content
None
20150627 11:06:49 INFO : Send message started with parameters: "['/usr/bin/python', '/home/django/django_pyas2/manage.py', 'sendas2message', u'mycompanyAS2', u'mendelsontestAS2', u'/tmp/test.txtqMpVir']"
System check identified some issues:
WARNINGS:
?: (1_6.W001) Some project unittests may not execute as expected.
HINT: Django 1.6 introduced a new default test runner. It looks like this project was generated using Django 1.5 or earlier. You should ensure your tests are all running & behaving as expected. See https://docs.djangoproject.com/en/dev/releases/1.6/#new-test-runner for more information.
This may be because the mendelson test server requires messages to be signed, but from the my server's output, it seems that the uploaded test file is not being retrieved when pyas2 is sending the message. Checking the tmp
folder, I am able to see all of the files I have uploaded.
So right now I am able to send an unsigned encrypted message to Mendelson's test server, but with no data. Again, I am not able to send a signed message because of the certificate issues above.
I am using:
Thank you for any input you may be able to provide and thank you for the software. :)
http://pyas2.readthedocs.io/en/latest/ - "Permission Denied"
This PDF download works, however: https://media.readthedocs.org/pdf/pyas2/latest/pyas2.pdf
Hello,
I installed 2 pyas2 server and configured them based on the documentation.
When I try to send Messages I get the same error on both systems shown in the logs:
20171108 08:00:19 ERROR : Failed to send message, error:
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/pyas2/management/commands/sendas2message.py", line 73, in handle
as2lib.send_message(message, payload)
File "/usr/local/lib/python2.7/dist-packages/pyas2/as2lib.py", line 459, in send_message
u'command "retryfailedas2comms".' % e))
TypeError: str returned non-string (type Error)
Any Idea to what would cause this?
Thank you.
Alex
Hey I'd like to add support for csv files; I'll open a PR in a second. Would appreciate feedback and advice for implementing it.
When pyas2 picks up one file at a time I have no problems. When multiple files are put in the outbound folder it sometimes doesn't process them until I "touch" all the files to update the timestamp. When it does process them as a batch I'm left with a "python " job for each file. After several defunct jobs build up I have to restart pyas2 for it to function automatically again.
Python 2.7 on Oracle Linux 6.10
When receiving a message from a partner I get an error: Signature Verification Failed, exception message is certificate verify error.
I can see the MDN I sent back, but the original incoming message isn't saved to a file, and isn't viewable in messages page.
it's too difficult to setup the pyas2 ,especially M2crpto in python2,so when to support the python 3?
Since I can't get it to work on Windows I figure I try on Ubuntu. I'm a newby to Linux to bear with me.
I have everything setup up until I need to run the following
python manage.py migrate
I get
python: can't open file 'manage.py': [Errno 2] No such file or directory
Does not help either when I change the path to /usr/local/lib/python2.7/dist-packages/django or /usr/local/lib/python2.7/dist-packages/pyas2
Cherrypy is also a dependency, should be added in the documentation.
Hi,
My issue, i moved the code the 2 docker files thus i having 2 Dockerfiles for servers P1 and P2.
Runs the servers in 8000:8000 and 8001:8001
Setup all the private and public keys.
Issue: After sending message from P1 to P2 it will become 302.
"POST /pyas2/as2send/?partner_id=p2as2 HTTP/1.1" 302 0
Failed to send message, error:
Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/urllib3/connection.py", line 160, in _new_conn
(self._dns_host, self.port), self.timeout, **extra_kw
File "/usr/local/lib/python3.7/site-packages/urllib3/util/connection.py", line 84, in create_connection
raise err
File "/usr/local/lib/python3.7/site-packages/urllib3/util/connection.py", line 74, in create_connection
sock.connect(sa)
ConnectionRefusedError: [Errno 111] Connection refused
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/urllib3/connectionpool.py", line 677, in urlopen
chunked=chunked,
File "/usr/local/lib/python3.7/site-packages/urllib3/connectionpool.py", line 392, in _make_request
conn.request(method, url, **httplib_request_kw)
File "/usr/local/lib/python3.7/http/client.py", line 1252, in request
self._send_request(method, url, body, headers, encode_chunked)
File "/usr/local/lib/python3.7/http/client.py", line 1298, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File "/usr/local/lib/python3.7/http/client.py", line 1247, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "/usr/local/lib/python3.7/http/client.py", line 1026, in _send_output
self.send(msg)
File "/usr/local/lib/python3.7/http/client.py", line 966, in send
self.connect()
File "/usr/local/lib/python3.7/site-packages/urllib3/connection.py", line 187, in connect
conn = self._new_conn()
File "/usr/local/lib/python3.7/site-packages/urllib3/connection.py", line 172, in _new_conn
self, "Failed to establish a new connection: %s" % e
urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0x7fc677d1bb10>: Failed to establish a new connection: [Errno 111] Connection refused
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/requests/adapters.py", line 449, in send
timeout=timeout
File "/usr/local/lib/python3.7/site-packages/urllib3/connectionpool.py", line 725, in urlopen
method, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2]
File "/usr/local/lib/python3.7/site-packages/urllib3/util/retry.py", line 439, in increment
raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='127.0.0.1', port=8001): Max retries exceeded with url: /pyas2/as2receive (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fc677d1bb10>: Failed to establish a new connection: [Errno 111] Connection refused'))
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/pyas2/models.py", line 455, in send_message
verify=self.partner.https_verify_ssl,
File "/usr/local/lib/python3.7/site-packages/requests/api.py", line 119, in post
return request('post', url, data=data, json=json, **kwargs)
File "/usr/local/lib/python3.7/site-packages/requests/api.py", line 61, in request
return session.request(method=method, url=url, **kwargs)
File "/usr/local/lib/python3.7/site-packages/requests/sessions.py", line 530, in request
resp = self.send(prep, **send_kwargs)
File "/usr/local/lib/python3.7/site-packages/requests/sessions.py", line 643, in send
r = adapter.send(request, **kwargs)
File "/usr/local/lib/python3.7/site-packages/requests/adapters.py", line 516, in send
raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='127.0.0.1', port=8001): Max retries exceeded with url: /pyas2/as2receive (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fc677d1bb10>: Failed to establish a new connection: [Errno 111] Connection refused'))
MIME-Version: 1.0
Content-Type: application/pkcs7-mime; name="smime.p7m"; smime-type="enveloped-data"
Content-Disposition: attachment; filename="smime.p7m"
Content-Transfer-Encoding: binary
AS2-Version: 1.2
ediint-features: CMS
Message-ID: <159041045534.11.5296431718618859051@685fa7993bd5>
AS2-From: p1as2
AS2-To: p2as2
Subject: EDI Message sent using pyas2
Date: Mon, 25 May 2020 12:40:55 +0000
disposition-notification-to: [email protected]
When sending a message to the partner, the field "From: " should be added with the e-mail address visible in the organization.
Please refer to this example (A.4) from the RFC:
AS2-Version: 1.1
Mime-Version: 1.0
Recipient-Address: http://10.240.1.2:8201/exchange/as2_company
AS2-To: as2_company
AS2-From: "AS2 Test"
Subject: Your Requested MDN Response
From: [email protected]
I'm following the directions here:
https://pyas2.readthedocs.io/en/latest/installation.html
I'm on an Amazon Linux EC2 system. I am trying to run the pip install command in my activated python 2.7 virtualenv:
virtualenv -p `which python2.7` venv
Running virtualenv with interpreter /usr/bin/python2.7
New python executable in /home/ec2-user/environment/pyas2_test/venv/bin/python2.7
Also creating executable in /home/ec2-user/environment/pyas2_test/venv/bin/python
Installing setuptools, pip, wheel...
done.
Then I activate the env and install with pip:
source venv/bin/activate
pip install pyas2
DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7.
Collecting pyas2
Collecting cherrypy<=8.9.1,>6 (from pyas2)
Using cached https://files.pythonhosted.org/packages/9d/c2/8a19081b3ded7b5f497ba132055ba665188432be02512d80cd7ac93c86d6/CherryPy-8.9.1-py2.py3-none-any.whl
Collecting pyasn1 (from pyas2)
Using cached https://files.pythonhosted.org/packages/7b/7c/c9386b82a25115cccf1903441bba3cbadcfae7b678a20167347fa8ded34c/pyasn1-0.4.5-py2.py3-none-any.whl
Collecting requests (from pyas2)
Using cached https://files.pythonhosted.org/packages/7d/e3/20f3d364d6c8e5d2353c72a67778eb189176f08e873c9900e10c0287b84b/requests-2.21.0-py2.py3-none-any.whl
Collecting m2crypto (from pyas2)
Collecting django<=1.10.6,>1.9 (from pyas2)
Using cached https://files.pythonhosted.org/packages/b9/bb/723f78e6f6aea78590331eba4e42b8a09c33ce154204a942525a91101d0b/Django-1.10.6-py2.py3-none-any.whl
Collecting six (from cherrypy<=8.9.1,>6->pyas2)
Using cached https://files.pythonhosted.org/packages/73/fb/00a976f728d0d1fecfe898238ce23f502a721c0ac0ecfedb80e0d88c64e9/six-1.12.0-py2.py3-none-any.whl
Collecting chardet<3.1.0,>=3.0.2 (from requests->pyas2)
Using cached https://files.pythonhosted.org/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl
Collecting idna<2.9,>=2.5 (from requests->pyas2)
Using cached https://files.pythonhosted.org/packages/14/2c/cd551d81dbe15200be1cf41cd03869a46fe7226e7450af7a6545bfc474c9/idna-2.8-py2.py3-none-any.whl
Collecting certifi>=2017.4.17 (from requests->pyas2)
Using cached https://files.pythonhosted.org/packages/9f/e0/accfc1b56b57e9750eba272e24c4dddeac86852c2bebd1236674d7887e8a/certifi-2018.11.29-py2.py3-none-any.whl
Collecting urllib3<1.25,>=1.21.1 (from requests->pyas2)
Using cached https://files.pythonhosted.org/packages/62/00/ee1d7de624db8ba7090d1226aebefab96a2c71cd5cfa7629d6ad3f61b79e/urllib3-1.24.1-py2.py3-none-any.whl
Collecting typing (from m2crypto->pyas2)
Using cached https://files.pythonhosted.org/packages/cc/3e/29f92b7aeda5b078c86d14f550bf85cff809042e3429ace7af6193c3bc9f/typing-3.6.6-py2-none-any.whl
Installing collected packages: six, cherrypy, pyasn1, chardet, idna, certifi, urllib3, requests, typing, m2crypto, django, pyas2
Successfully installed certifi-2018.11.29 chardet-3.0.4 cherrypy-8.9.1 django-1.10.6 idna-2.8 m2crypto-0.31.0 pyas2-0.4.3 pyasn1-0.4.5 requests-2.21.0 six-1.12.0 typing-3.6.6 urllib3-1.24.1
I can see it successfully install pyas2, django and m2crypto but when I open the python shell and try an import of pyas2 I get:
python
Python 2.7.15 (default, Nov 28 2018, 22:38:08)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pyas2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named pyas2
>>>
following the steps in the installation doc I can create the django project but when I try to run the manage.py migrate command I get the following error:
Traceback (most recent call last):
File "manage.py", line 22, in <module>
execute_from_command_line(sys.argv)
File "/usr/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 364, in execute_from_command_line
utility.execute()
File "/usr/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 338, in execute
django.setup()
File "/usr/local/lib/python2.7/site-packages/django/__init__.py", line 27, in setup
apps.populate(settings.INSTALLED_APPS)
File "/usr/local/lib/python2.7/site-packages/django/apps/registry.py", line 85, in populate
app_config = AppConfig.create(entry)
File "/usr/local/lib/python2.7/site-packages/django/apps/config.py", line 94, in create
module = import_module(entry)
File "/usr/lib64/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
ImportError: No module named pyas2
Unwilling to be beaten I tried downloading the package from pypi and running the setup.py in the download:
https://pypi.org/project/pyAS2/#files
if I run it with the setup.py install --user command it seems to install successfully and I'm able to import pyas2 in the python shell.
I'm also able to continue the setup process and the python manage.py migrate command runs as you'd expect.
python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, pyas2, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying pyas2.0001_initial... OK
Applying pyas2.0002_partner_compress... OK
Applying pyas2.0003_auto_20150311_1141... OK
Applying pyas2.0004_auto_20150311_1258... OK
Applying pyas2.0005_message_compressed... OK
Applying pyas2.0006_auto_20150313_0548... OK
Applying pyas2.0007_auto_20150313_0707... OK
Applying pyas2.0008_auto_20150317_0450... OK
Applying pyas2.0009_auto_20150317_1324... OK
Applying pyas2.0010_auto_20150416_0745... OK
Applying pyas2.0011_auto_20150427_1029... OK
Applying pyas2.0012_auto_20151006_0526... OK
Applying pyas2.0013_auto_20160307_0233... OK
Applying pyas2.0014_auto_20160420_0515... OK
Applying pyas2.0015_auto_20160615_0409... OK
Applying pyas2.0016_auto_20161004_0543... OK
Applying pyas2.0017_auto_20170404_0730... OK
Applying pyas2.0018_auto_20180109_0942... OK
Applying pyas2.0019_auto_20180127_0509... OK
Applying sessions.0001_initial... OK
I'm ok with this for the time being but I'm curious about why the pip install doesn't work. I'm not sure where the import issue is but I'll research more and see if I can find a fix. If someone else can think of another fix to allow me to install with pip so I can put this in my virtualenv I'd appreciate the help.
If it's something obvious I'm missing I'd be happy to update the documentation with details to get around it.
Thanks for this package by the way! I'm thrilled to start using it.
Hi,
At the moment, we can't use pyas2 with one of our client because signing failed with binary payload. Is Could you implement binary payload?
Thanks
Sorry this isn't really a bug but I do not know where else to ask the question
I have a trading partner using their Go Daddy web certificate to sign messages in thier MS Biztalk server
When I load just their certificate in pem format, decode fails with this error:
An error occurred during the AS2 message processing: Signature Verification Failed, exception message is certificate verify error
I see that their certificate uses a chain file. When I try loading the 'gd_intermediate' certificate into "Local CA Store", decoding still fails.
This is a huge company, an M$ only shop, I doubt I can get them to change their certificate. Do you have any idea how I can get PyAS2 to work with their existing Go Daddy certificate?
Thanks for any suggestions..
When I send to the mendelson AS2 server I get everytime different MIC in the MDN response.
What is strange, that they send sha-256.
You could test yourself. http://as2.mendelson-e-c.com/
I have attached the keys for the organisation mycompanyAS2 and the partner mendelsontestAS2.
I also have attached the MDN message I received.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.