Giter Site home page Giter Site logo

usermanagement's Introduction

Sandstorm.UserManagement Neos / Flow Package

0. Features

This package works in Neos CMS and Flow and provides the following functionality:

  • Registration of (frontend) users via a registration form
  • Sending out an e-mail for account confirmation
  • Login of registered (frontend) users via a login form
  • "Forgotten password" with password reset e-mail

1. Compatibility and Maintenance

Sandstorm.UserManagement is currently being maintained for the following versions:

Neos / Flow Version Sandstorm.UserManagement Version Branch Maintained
Neos 5.x-8.x, Flow 6.x-8.x 7.x master Yes
Neos 4.x, Flow 5.x 6.x 6.0 Yes
Neos 3.x, Flow 4.x 5.x 5.0 Bugfixes
Neos 2.3 LTS, Flow 3.3 LTS 3.x 3.0 No
Neos 2.2, Flow 3.2 1.x - No

Breaking changes in Version 5.x

Configuration Changes

Since I've removed the direct dependency to swiftmailer in favor of the Sandstorm/TemplateMailer package (which provides css inlining), the EmailService in this package was removed. This means that you will need to change some of your config options, because they are now set in the Sandstorm.TemplateMailer config path instead of inside the Sandstom.UserManagement path. Please refer to the Sandstorm/TemplateMailer Documentation for instructions on how to set the following configurations:

  • senderAddress
  • senderName
  • templatePackage

Hint: to override the sender address for this package, you will need the following setting:

Sandstorm:
  TemplateMailer:
    senderAddresses:
      sandstorm_usermanagement_sender_email: # You need to use this exact key to override the UserManagement defaults
        name: Your-App
        address: [email protected]

Changes to Email Templates

In the registration email templates, two variables are no longer available by default:

  • "applicationName" (filled with configured email senderAddress)
  • "email" (filled with the email address the mail is sent to) However, in the registration email, "registrationFlow" is now available, which gives access to the email as well to all other information the user has entered during the registration process (as long as it is stored in the RegistrationFlow object).

To overwrite the existing Activation- and PasswordReset templates, do the following:

2. Configuration

Setup

There are the basic config steps:

  1. Run ./flow doctrine:migrate after you add this package to install its model. The package automatically exposes its routes via auto-inclusion in the package settings. Attention: Any routes defined in the global Routes.yaml are loaded before this package's routes, so they may be overriden. This is especially true for the default Flow subroutes, so make sure you have removed those from your global Routes.yaml. If you can't remove them, just include the subroutes for this package manually before the Flow subroutes.

  2. Require this package in your own package's composer.json. This will inform Flow that it needs to load UserManagement before your packages, which allows you to override config and will make sure authorizations work correctly. Keep in mind that you have to add this into all packages that use features from user management - very important if your site is split into multiple packages or plugins. Here's an example:

{
    "description": "Your Site Package",
    "type": "neos-site", (or "neos-package" if you're using Flow only or building a Plugin)
    "require": {
        "neos/neos": "*",
        "sandstorm/usermanagement": "*"
    }
    ...more settings here...
}
  1. Run ./flow neos.flow:package:rescan to regenerate to order in which all your packages are loaded.

  2. Add and adapt the configuration settings below to your config (make sure to not miss the special Neos settings).

Basic configuration options

These are the basic configuration options for e-mails, timeouts etc. You will usually want to adapt these to your application.

Sandstorm:
  UserManagement:
    # Validity timespan for the activation token for newly registered users.
    activationTokenTimeout: '2 days'
    # Validity timespan for the token used to reset passwords.
    resetPasswordTokenTimeout: '4 hours'
    # The message that appears if a user could not be logged in.
    authFailedMessage:
      title: 'Login nicht möglich'
      body: 'Sie haben ungültige Zugangsdaten eingegeben. Bitte versuchen Sie es noch einmal.'
    # Email settings
    email:
      # Subject line for the account confirmation email
      subjectActivation: 'Please confirm your account'
      # Subject line for the password reset email
      subjectResetPassword: 'Password reset'
    # An array of roles which are assigned to users after they activate their account.
    rolesForNewUsers: []

I18N

It is possible to use i18n for the messages configured in the settings. Simply by setting the values to 'i18n'.

Sandstorm:
  UserManagement:
    authFailedMessage:
      title: 'i18n'
      body: 'i18n'
    email:
      subjectActivation: 'i18n'
      subjectResetPassword: 'i18n'

Additional Settings for usage in Neos

You should switch the implementation of the Redirect and User Creation Services to the Neos services. Add this to your Objects.yaml:

# Use the Neos services
Sandstorm\UserManagement\Domain\Service\RedirectTargetServiceInterface:
  className: 'Sandstorm\UserManagement\Domain\Service\Neos\NeosRedirectTargetService'
Sandstorm\UserManagement\Domain\Service\UserCreationServiceInterface:
  className: 'Sandstorm\UserManagement\Domain\Service\Neos\NeosUserCreationService'

Be aware that the NeosUserCreationService requires a non-empty firstName and lastName to be present in the RegistrationFlow attributes as it's in the templates of this package.

Neos 3.0 and higher

Add the following to your package's (or the global) Settings.yaml. This creates a separate authentication provider so Neos can distinguish between frontend and backend logins.

Neos:
  Flow:
    security:
      authentication:
        providers:
          'Neos.Neos:Backend':
            requestPatterns:
              Sandstorm.UserManagement:NeosBackend:
                pattern: Sandstorm\UserManagement\Security\NeosRequestPattern
                patternOptions:
                  'area': 'backend'
          'Sandstorm.UserManagement:Login':
            provider: PersistedUsernamePasswordProvider
            requestPatterns:
              Sandstorm.UserManagement:NeosFrontend:
                pattern: Sandstorm\UserManagement\Security\NeosRequestPattern
                patternOptions:
                  'area': 'frontend'

Neos 2.3 (Flow 3.3)

Before Neos 3.0, the Neos.Neos:Backend authentication provider was called Typo3BackendProvider. Replace Neos.Neos:Backend with Typo3BackendProvider in the config above.

3. Usage

CLI Commands

Creating users

The package exposes a command to create users. You can run

./flow sandstormuser:create [email protected] password --additionalAttributes="firstName:Max;lastName:Mustermann"

to create a user. This will create a Neos user if you're using the package in Neos. You can assign roles to the new user in the Neos backend afterwards.

Confirming user registration

It is possible to confirm a registrationflow and trigger user creation by running

./flow sandstormuser:activateregistration [email protected]

Resetting passwords

Since 1.1.2, it is possible to reset passwords for users created with this package.

./flow sandstormuser:setpassword [email protected] password

If the package detects that the NeosUserCreationService is used, it forwards the command to the Neos UserCommandController->setPasswordCommand(). Otherwise, our oackage's own logic is used.

The Authentication Provider can be passed in as an optional argument to reset passwords for users created with a different provider that the default UserManagement one (Sandstorm.UserManagement:Login):

./flow sandstormuser:setpassword [email protected] password --authenticationProvider=Typo3BackendProvider

Redirect after login/logout

Via configuration

To define where users should be redirected after they log in or out, you can set some config options:

Sandstorm:
  UserManagement:
    redirect:
    # To activate redirection, make these settings:
      afterLogin:
        action: 'action'
        controller: 'Controller'
        package: 'Your.Package'
      afterLogout:
        action: 'action'
        controller: 'Controller'
        package: 'Your.Package'

Via node properties

When using the package within Neos, you have another possibility: you can set properties on the LoginForm node type. The pages you link here will be shown after users log in or out. Please note that when a login/logout form is displayed on a restricted page: in that case you MUST set a redirect target, otherwise you will receive an error message on logout. If the redirection is configured via Settings.yaml, they will take precedence over the configuration at the node. You can, of course, set these properties from TypoScript also if you have a login/logout form directly in you template:

loginform = Sandstorm.UserManagement:LoginForm {
  // This should be set, or there will be problems when you have multiple plugins on a page
  argumentNamespace = 'login'
  // Redirect to the parent page automatically after logout
  redirectAfterLogout = ${q(documentNode).parent().get(0)}
}

Via custom RedirectTargetService

If redirecting to a specific controller method is still not enough for you, you can simply roll your own implementation of the RedirectTargetServiceInterface. Just add the implementation within your own package and add the following lines to your Objects.yaml. Mind the package loading order, you package should require sandstorm/usermanagement in its composer.json.

Sandstorm\UserManagement\Domain\Service\RedirectTargetServiceInterface:
  className: 'Your\Package\Domain\Service\YourCustomRedirectTargetService'

Checking for a logged-in user in your templates

There is a ViewHelper available that allows you to check if somebody is logged into the frontend. Here's an example:

{namespace um=Sandstorm\UserManagement\ViewHelpers}

<um:ifAuthenticated>
  <f:then>
    You are currently logged in.
  </f:then>
  <f:else>
    You are not logged in!
  </f:else>
</um:ifAuthenticated>

If you have configured a different Authentication Provider than the default one, the viewhelper has an authenticationProviderName argument to which you can pass the name of the Auth Provider you are using.

Extending the package

Changing / overriding templates

You can change any template via the default method using Views.yaml. Please see http://flowframework.readthedocs.io/en/stable/TheDefinitiveGuide/PartIII/ModelViewController.html#configuring-views-through-views-yaml. Here's an example how to plug your own login template:

-
  requestFilter: 'mainRequest.isPackage("Neos.Neos") && isPackage("Sandstorm.UserManagement") && isController("Login") && isAction("login")'
  options:
    templatePathAndFilename: 'resource://Your.Package/Private/Templates/Login/Login.html'
    partialRootPaths: ['resource://Your.Package/Private/Partials']
    layoutRootPaths: ['resource://Your.Package/Private/Layouts']

Overriding e-mail templates

As documented in the configuration options above, overriding e-mail templates is easy:

  • Copy the EmailTemplates folder from the UserManagement's Resources/Private folder into your own package and modify the templates to your heart's desire.
  • Add your own package to the templatePackages config, as described in Sandstorm/TemplateMailer Documentation.

Changing the User model

You might want to add additional information to the user model. This can be done by extending the User model delivered with this package and adding properties as you like. You will then need to switch out the implementation of UserCreationServiceInterface to get control over the creation process. This can be done via Objects.yaml:

Sandstorm\UserManagement\Domain\Service\UserCreationServiceInterface:
  className: 'Your\Package\Domain\Service\YourCustomUserCreationService'

Hooking into the login/logout process

The UserManagement package emits three signals during the login and logout process, into which you can hook using Flows Signals and Slots mechanism. You could for example use this to set additional cookies when a user logs in, e.g. to enable JWT authentication with another service. Here is an example of using all three, you could copy this into your own Package.php file:

public function boot(Bootstrap $bootstrap) {
    $dispatcher = $bootstrap->getSignalSlotDispatcher();
    $dispatcher->connect(
        \Sandstorm\UserManagement\Controller\LoginController::class, 'authenticationSuccess',
        \Your\Package\Domain\Service\ExampleService::class, 'onAuthenticationSuccess'
    );
    $dispatcher->connect(
        \Sandstorm\UserManagement\Controller\LoginController::class, 'authenticationFailure',
        \Your\Package\Domain\Service\ExampleService::class, 'onAuthenticationFailure'
    );
    $dispatcher->connect(
        \Sandstorm\UserManagement\Controller\LoginController::class, 'logout',
        \Your\Package\Domain\Service\ExampleService::class, 'onLogout'
    );
}

Your example service could then look like this:

namespace Your\Package\Domain\Service;

use Neos\Flow\Mvc\ActionRequest;
use Neos\Flow\Mvc\Controller\ControllerContext;
use Neos\Flow\Security\Exception\AuthenticationRequiredException;

class ExampleService
{
    public function onAuthenticationSuccess(ControllerContext $controllerContext, ActionRequest $originalRequest = null)
    {
        // Do custom stuff here
    }

    public function onAuthenticationFailure(ControllerContext $controllerContext, AuthenticationRequiredException $exception = null)
    {
        // Do custom stuff here
    }

    public function onLogout(ControllerContext $controllerContext)
    {
        // Do custom stuff here
    }
}

Changing the Registration Flow and validation logic

The RegistrationFlow class is the representation of a user signing up for your application. It has a few default properties and can be extended with arbitrary additional data via its attributes property.

Adding custom fields to the Registration Flow

Exchange the registration template as described above and add a field:

<f:form.checkbox id="terms" property="attributes.terms" value=""/>

This will add the field, but of course you might also want to validate it.

Extending the Registration Flow validation logic

The UserManagement package has a hook for you to implement your custom registration flow validation logic. It is called directly from the domain model validator of the package. All you need to to is create an implementation of Sandstorm\UserManagement\Domain\Service\RegistrationFlowValidationServiceInterface in your own package. It could look like this:

class RegistrationFlowValidationService implements RegistrationFlowValidationServiceInterface {
    /**
     * @param RegistrationFlow $registrationFlow
     * @param RegistrationFlowValidator $validator
     * @return void
     */
    public function validateRegistrationFlow(RegistrationFlow $registrationFlow, RegistrationFlowValidator $validator) {
        // This is an example of your own custom validation logic.
        if ($registrationFlow->getAttributes()['agb'] !== '1') {
            $validator->getResult()->forProperty('attributes.terms')->addError(new \Neos\Flow\Validation\Error('You need to accept the terms and conditions.'));
        }
    }
}

4. Running Tests

Run all tests with: ./bin/phpunit -c ./Build/BuildEssentials/PhpUnit/UnitTests.xml Packages/Application/Sandstorm.UserManagement/Tests/Unit

5. Known issues

Feel free to submit issues/PRs :)

6. TODOs

  • More Tests.

7. FAQ

  • What happens if the user did not receive the registration email? Just tell the user to register again. In this case, previous unfinished registrations are discarded.

8. License

MIT. https://opensource.org/licenses/MIT

usermanagement's People

Contributors

andrehoffmann30 avatar batabana avatar beheist avatar c4ll-m3-j4ck avatar cvette avatar daniellienert avatar fnkr avatar gerdemann avatar gerks avatar haase-fabian avatar htuscher avatar jamesalias avatar jonathantechniconcept avatar kdambekalns avatar marcopns avatar on3iro avatar pingu501 avatar pneum avatar robertlemke avatar skurfuerst avatar t-baier avatar tantegerda1 avatar ursulaklinger 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

Watchers

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

usermanagement's Issues

Remove standalone provider settings

In Configuration/Settings.yaml the below lines are production code even though only needed for standalone case.
I would be happy if those could be examplified (as comment).
In my (very specialized) case the authentication had failed every time until i completely removed this setting.
If needed, it can be added easily in the project's settings.

security:  
  authentication:  
    providers:   
      'Sandstorm.UserManagement:Login':  
        provider: 'PersistedUsernamePasswordProvider'  
        entryPoint: 'WebRedirect'  
        entryPointOptions:  
          routeValues:  
            '@package': 'Sandstorm.UserManagement'  
            '@controller': 'Login'  
            '@action': 'login'  

Creating a user fails cause of missing firstname

.```
/flow sandstormuser:create
Please specify the required argument "username": [email protected]
Please specify the required argument "password": test
Notice: Undefined index: firstName in /var/www/Data/Temporary/Development/Cache/Code/Flow_Object_Classes/Sandstorm_UserManagement_Domain_Service_Neos_NeosUserCreationService.php line 70

Type: Neos\Flow\Error\Exception
Code: 1
File: Packages/Framework/Neos.Flow/Classes/Error/ErrorHandler.php
Line: 81

Open Data/Logs/Exceptions/201710251726486b83a3.txt for a full stack trace.

own layoutRootPaths don't work, but templatePathAndFilename works fine

Hi, is that a bug? The option templatePathAndFilename works fine, but the layoutRootPaths don't take it.

- requestFilter: 'isPackage("Sandstorm.UserManagement") && isController("Login") && isAction("login")' options: templatePathAndFilename: 'resource://Ws.Fshsite/Private/Templates/SandstromUsermanagement/Login/Login.html' partialRootPaths: ['resource://Ws.Fshsite/Private/Partials'] layoutRootPaths: ['resource://Ws.Fshsite/Private/Layouts/Neos']

all confirmed mails to me for member check

Hi, where can I provide my address so I can get all confirm mails?

Better could be after regular confim a second mail to me for activate the account. But I can't develop it. Perhaps there is someone who can help me?

SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint

The MySql database throws an error when trying to run the migrations.

An exception occurred while executing 'ALTER TABLE sandstorm_usermanagement_domain_model_user ADD CONSTRAINT FK_5DEB8A977D3656A4 FOREIGN KEY (account) REFERENCES neos_flow_security_account (persistence_object_identifier)':

SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint

The exception details have been logged to the Flow system log.
Exception in line 184 of /[NEOSROOT]
/Packages/Libraries/doctrine/dbal/lib/Doctrine/DBAL/DBALException.php: An exception occurred while executing 'ALTER TABLE sandstorm_usermanagement_domain_model_user ADD CONSTRAINT FK_5DEB8A977D3656A4 FOREIGN KEY (account) REFERENCES neos_flow_security_account (persistence_object_identifier)':

SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint - See also: 2018112314574529eefa.txt

2018112314574529eefa.txt

Steps to reproduce:

  • Fresh installation of Neos
    composer create-project neos/neos-base-distribution Neos
  • Add database credentials to 'Configuration/Settings.yaml'
  • Run migrations
    ./flow doctrine:migrate
  • Add UserManagement package
    composer require sandstorm/usermanagement
  • Run migrations again (fails with error above)
    ./flow doctrine:migrate

Software

  • PHP 7.2.11
  • MySql 5.7.23
  • Neos 4.1.8
  • Flow 5.1.5

Doctrine migrations fail in Flow 6

Using a basic Flow distribution (6.x) with one custom package (which requires sandstorm/usermanagent), and an empty database doctrine:migrate will fail:

SQLSTATE[HY000]: General error: 1005 Can't create table `weclapp-importer`.`sandstorm_usermanagement_domain_model_user` (errno: 150 "Foreign key constraint is incorrectly formed")

caused by this query:

ALTER TABLE sandstorm_usermanagement_domain_model_user ADD CONSTRAINT FK_5DEB8A977D3656A4 FOREIGN KEY (account) REFERENCES typo3_flow_security_account (persistence_object_identifier)

At that time of migration, the database contains the typo3_flow_security_account table, but for some reason, the foreign key constraint is not accepted.

Tested with MariaDB 10.2.

Ditch default Reply-To configuration

Dear maintainers,

as an introductory note, please do accept my apologies for opening this issue - I'm neither a developer or user reporting, but a sysadmin with a spam problem at hand.

One of our customers is relying on your extension to curate their member area for their customers.

Due to yet unknown circumstances, they managed to send one (yes, a single) sign-up mail to a mailserver with probably a very eager postmaster and protected with the UCEPROTECT blacklist, because we spotted this log message:

status=bounced (host mailgate1.xxx[77.235.x.x] said: 550 Your IP will be reported for abuse - better watch out next time.

Obviously, being blacklisted caused troubles for other customers until outbound mail-traffic was re-routed.

After checking the logs, we found this entry in the PHP mail log:

[27-May-2021 08:55:15 Europe/Berlin] mail() on [/var/www/xxx/htdocs/www.xxxx.de/releases/20210520090655/Packages/Libraries/swiftmailer/swiftmailer/lib/classes/Swift/Transport/SimpleMailInvoker.php:34]: To:[email protected] -- Headers: Message-ID: <[email protected]> Date: Thu, 27 May 2021 08:55:15 +0200 From: xxx <[email protected]> Reply-To: Sandstorm Usermanagement Package Reply-To Email <[email protected]> MIME-Version: 1.0 Content-Type: multipart/alternative;  boundary="_=_swift_v4_1622098515_dc236545b62d12a3b3333f9125638318_=_" -- Subject: Please confirm your account

Obfuscated are only the recipient, the sender and the hostname in the message-ID. The Reply-To is unaltered - and matches your default settings:

The customer has already been notified about the incident and has been asked to change the defaults as well not to rely on sendmail any more.

For future releases, I'd like to urge you to completely remove the default reply-to setting:

  • if no reply-to is defined, MUA will anyways reply back to the From.
  • if a webmaster specifies a reply-to willigly, they do so on purpose.
  • leaving example.com will also result in wrong-routed responses, if users do not fully pay attention.

I will provide a PR as well, if this is desired.

Thank you very much for considering sane defaults for the webmaster - and please again accept my apologies for opening this issue at all.

Best,
Anton

Neos/Party is missing as dependency

When just installing neos/flow and this package the flow server does not boot up because it is missing the neos/party package (ProfileController Line:32).

I think this should be added as dependency.

Open setup/index throws Exception

URL: /setup/index
Neos: 5.1.1

Argument 1 passed to Neos\Neos\View\FusionExceptionView_Original::getFusionRuntime() must be an instance of Neos\ContentRepository\Domain\Model\NodeInterface, null given, called in .../Data/Temporary/Development/Cache/Code/Flow_Object_Classes/Neos_Neos_View_FusionExceptionView.php on line 130
Exception Code 0
Exception Type TypeError
Thrown in File Data/Temporary/Development/Cache/Code/Flow_Object_Classes/Neos_Neos_View_FusionExceptionView.php
Line 182
Original File Packages/Application/Neos.Neos/Classes/View/FusionExceptionView.php

While loading the /setup Route still works, it will crash on the first redirect.

Wrong page for login to backend

When session is killed in backend path is changed to /login ( not /neos/login ) which provide to fails on trying to login to backend

Extend Neos Fusion objects by node

Its possible to expose the context {node} to a plugin by using __internalArguments handed ver from fusion to the controller. If that controller passes that node to the view it's possible to do inline-editing inside the Neos templates, call node context, etc.

Refactor Email Management into own package

The sending of emails will be refactored out into another, standalone package that supports templated emails and will also include HTML mogrification (inlining of all CSS) so emails don't appear broken in email clients that do not parse external CSS (most notably, googlemail).

DOI Logging

Depending on what happens behind the Login one might need a proper logging of the double opt in process (who registered when, who confirmed when at least). Would be great if the plugin could deliver this out of the box, maybe with a featureToggle.
(thanks for the very useful tool though!)

Documentation for template override not accurate

Since Flow 4.0 only the requestFilter with the highest match wins.
Therefore you must specify the mainRequest.isPackage Filter in Neos or you won't have enough weight:

requestFilter: 'mainRequest.isPackage("Neos.Neos") && isPackage("Sandstorm.UserManagement") && isController("Registration")'

Validation throw error

In Flow 6 an error is thrown if submitting the registration form: Notice: Undefined property: Sandstorm\UserManagement\Domain\Validator\RegistrationFlowValidator::$result

This can be fixed by replacing $this->result with $this->getResult()

Doctrine Migrations in Neos 3 don't work

The first MySQL migration that tries to create the user_model table also tries to create a foreign key constraint to typo3_flow_security_account which can't be applied as the table is now named neos_flow_security_account.

Documentation – Change Template for E-Mail

How do I configure the E-Mail-Template for the Registration activation in /Configuration/Views.yaml

I tried

-
  requestFilter: 'mainRequest.isPackage("Neos.Neos") && isPackage("Sandstorm.UserManagement") && isController("Registration") && isAction("register")'
  options:
    templatePathAndFilename: 'resource://xxx.yyy/Private/EmailTemplates/ActivationToken.html'
    partialRootPaths: ['resource://xxx.yyy/Private/Partials']
    layoutRootPaths: ['resource://xxx.yyy/Private/Layouts']

But this changes the output on the website and not the activation mail.

Creating a user fails if the username is not a valid email address

./flow sandstormuser:listusers
+-------+------+---------+
| Email | Name | Role(s) |
+-------+------+---------+
  0 users total.
vagrant@punktde:/var/www % ./flow sandstormuser:create
Please specify the required argument "username": test
Please specify the required argument "password": test
An instance of "Sandstorm\UserManagement\Domain\Model\RegistrationFlow" failed to pass validation with 1 error(s):
email:
Please specify a valid email address.

  Type: Neos\Flow\Persistence\Exception\ObjectValidationFailedException
  Code: 1322585164
  File: Data/Temporary/Development/Cache/Code/Flow_Object_Classes/Neos_Flow_Persist
        ence_Doctrine_PersistenceManager.php
  Line: 137

Open Data/Logs/Exceptions/201710251724338f8d5f.txt for a full stack trace.

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.