in source/backend/chalicelib/framework.py [0:0]
def challenge_state(challenge_type, first=False, next_state=_FAIL_STATE, timeout=10):
def decorator(func):
@functools.wraps(func)
def wrapper(challenge, frame, context, end_times):
check_state_timeout(func, end_times, frame, timeout)
res = run_state_processing_function(func, challenge, context, frame)
blueprint.log.debug('res: %s', res)
# Check result
if res == STATE_CONTINUE:
return wrapper
if res == STATE_NEXT:
return _challenge_state_funcs[challenge_type][next_state]
if res == CHALLENGE_SUCCESS:
raise _Success
if res == CHALLENGE_FAIL:
raise _Fail
# Register challenge type (if not yet)
if challenge_type not in _challenge_types:
_challenge_types.append(challenge_type)
# Create challenge type's state list with default fail state (if not yet)
if challenge_type not in _challenge_state_funcs:
_challenge_state_funcs[challenge_type] = dict()
_challenge_state_funcs[challenge_type][_FAIL_STATE] = lambda: CHALLENGE_FAIL
# Register state for challenge type
_challenge_state_funcs[challenge_type][func.__name__] = wrapper
# Register as fist state (if first is true)
if first:
_challenge_state_funcs[challenge_type][_FIRST_STATE] = wrapper
return wrapper
return decorator