141 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			141 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
# -*- coding: utf-8 -*-
 | 
						|
"""
 | 
						|
    flask_security.script
 | 
						|
    ~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
    Flask-Security script module
 | 
						|
 | 
						|
    :copyright: (c) 2012 by Matt Wright.
 | 
						|
    :license: MIT, see LICENSE for more details.
 | 
						|
"""
 | 
						|
from __future__ import print_function
 | 
						|
 | 
						|
import re
 | 
						|
import warnings
 | 
						|
 | 
						|
from flask import current_app
 | 
						|
from flask_script import Command, Option
 | 
						|
from werkzeug.local import LocalProxy
 | 
						|
 | 
						|
from .utils import hash_password
 | 
						|
 | 
						|
try:
 | 
						|
    import simplejson as json
 | 
						|
except ImportError:
 | 
						|
    import json
 | 
						|
 | 
						|
warnings.warn(
 | 
						|
    'Please use flask_security.cli instead of flask_security.script. '
 | 
						|
    'Support for Flask-Script will be removed in 2.1.',
 | 
						|
    DeprecationWarning
 | 
						|
)
 | 
						|
 | 
						|
_datastore = LocalProxy(lambda: current_app.extensions['security'].datastore)
 | 
						|
 | 
						|
 | 
						|
def pprint(obj):
 | 
						|
    print(json.dumps(obj, sort_keys=True, indent=4))
 | 
						|
 | 
						|
 | 
						|
def commit(fn):
 | 
						|
    def wrapper(*args, **kwargs):
 | 
						|
        fn(*args, **kwargs)
 | 
						|
        _datastore.commit()
 | 
						|
    return wrapper
 | 
						|
 | 
						|
 | 
						|
class CreateUserCommand(Command):
 | 
						|
    """Create a user"""
 | 
						|
 | 
						|
    option_list = (
 | 
						|
        Option('-e', '--email', dest='email', default=None),
 | 
						|
        Option('-p', '--password', dest='password', default=None),
 | 
						|
        Option('-a', '--active', dest='active', default=''),
 | 
						|
    )
 | 
						|
 | 
						|
    @commit
 | 
						|
    def run(self, **kwargs):
 | 
						|
        # sanitize active input
 | 
						|
        ai = re.sub(r'\s', '', str(kwargs['active']))
 | 
						|
        kwargs['active'] = ai.lower() in ['', 'y', 'yes', '1', 'active']
 | 
						|
 | 
						|
        from flask_security.forms import ConfirmRegisterForm
 | 
						|
        from werkzeug.datastructures import MultiDict
 | 
						|
 | 
						|
        form = ConfirmRegisterForm(MultiDict(kwargs), csrf_enabled=False)
 | 
						|
 | 
						|
        if form.validate():
 | 
						|
            kwargs['password'] = hash_password(kwargs['password'])
 | 
						|
            _datastore.create_user(**kwargs)
 | 
						|
            print('User created successfully.')
 | 
						|
            kwargs['password'] = '****'
 | 
						|
            pprint(kwargs)
 | 
						|
        else:
 | 
						|
            print('Error creating user')
 | 
						|
            pprint(form.errors)
 | 
						|
 | 
						|
 | 
						|
class CreateRoleCommand(Command):
 | 
						|
    """Create a role"""
 | 
						|
 | 
						|
    option_list = (
 | 
						|
        Option('-n', '--name', dest='name', default=None),
 | 
						|
        Option('-d', '--desc', dest='description', default=None),
 | 
						|
    )
 | 
						|
 | 
						|
    @commit
 | 
						|
    def run(self, **kwargs):
 | 
						|
        _datastore.create_role(**kwargs)
 | 
						|
        print('Role "%(name)s" created successfully.' % kwargs)
 | 
						|
 | 
						|
 | 
						|
class _RoleCommand(Command):
 | 
						|
    option_list = (
 | 
						|
        Option('-u', '--user', dest='user_identifier'),
 | 
						|
        Option('-r', '--role', dest='role_name'),
 | 
						|
    )
 | 
						|
 | 
						|
 | 
						|
class AddRoleCommand(_RoleCommand):
 | 
						|
    """Add a role to a user"""
 | 
						|
 | 
						|
    @commit
 | 
						|
    def run(self, user_identifier, role_name):
 | 
						|
        _datastore.add_role_to_user(user_identifier, role_name)
 | 
						|
        print("Role '%s' added to user '%s' successfully" % (
 | 
						|
            role_name, user_identifier))
 | 
						|
 | 
						|
 | 
						|
class RemoveRoleCommand(_RoleCommand):
 | 
						|
    """Remove a role from a user"""
 | 
						|
 | 
						|
    @commit
 | 
						|
    def run(self, user_identifier, role_name):
 | 
						|
        _datastore.remove_role_from_user(user_identifier, role_name)
 | 
						|
        print("Role '%s' removed from user '%s' successfully" % (
 | 
						|
            role_name, user_identifier))
 | 
						|
 | 
						|
 | 
						|
class _ToggleActiveCommand(Command):
 | 
						|
    option_list = (
 | 
						|
        Option('-u', '--user', dest='user_identifier'),
 | 
						|
    )
 | 
						|
 | 
						|
 | 
						|
class DeactivateUserCommand(_ToggleActiveCommand):
 | 
						|
    """Deactivate a user"""
 | 
						|
 | 
						|
    @commit
 | 
						|
    def run(self, user_identifier):
 | 
						|
        _datastore.deactivate_user(user_identifier)
 | 
						|
        print("User '%s' has been deactivated" % user_identifier)
 | 
						|
 | 
						|
 | 
						|
class ActivateUserCommand(_ToggleActiveCommand):
 | 
						|
    """Activate a user"""
 | 
						|
 | 
						|
    @commit
 | 
						|
    def run(self, user_identifier):
 | 
						|
        _datastore.activate_user(user_identifier)
 | 
						|
        print("User '%s' has been activated" % user_identifier)
 |