from datetime import timedelta, datetime
from functools import wraps
import hmac
from hashlib import sha1
from flask import Blueprint, session, redirect, url_for, request, current_app


ADMIN = "valid_admin"
TIME_FORMAT = '%Y%m%d%H%M%S'
TIME_LIMIT = timedelta(hours=3)


def _create_hmac(payload):
    key = current_app.config["SECRET_KEY"]
    payload = payload.encode("utf8")
    mac = hmac.new(key, payload, sha1)
    return mac.hexdigest()


def set_token():
    expire = datetime.now() + TIME_LIMIT
    token = expire.strftime(TIME_FORMAT)
    session[ADMIN] = "%s|%s" % (token, _create_hmac(token))


def delete_token():
    del session[ADMIN]


def _valid_token(token):
    try:
        token, token_mac = token.split(u"|", 1)
    except:
        return False
    if not token_mac == _create_hmac(token):
        return False
    if datetime.now().strftime(TIME_FORMAT) < token:
        return True


def valid_admin(fn):
    @wraps(fn)
    def nufun(*args, **kwargs):
        if ADMIN in session:
            if _valid_token(session[ADMIN]):
                set_token()
                return fn(*args, **kwargs)
            delete_token()
        session["next"] = request.path
        return redirect(url_for(".login"))

    return nufun













from datetime import timedelta, datetime
from functools import wraps
import hmac
from hashlib import sha1
from flask import Blueprint, session, redirect, url_for, request, current_app


ADMIN = "valid_admin"
TIME_FORMAT = '%Y%m%d%H%M%S'
TIME_LIMIT = timedelta(hours=3)


def _create_hmac(payload):
    key = current_app.config["SECRET_KEY"]
    payload = payload.encode("utf8")
    mac = hmac.new(key, payload, sha1)
    return mac.hexdigest()


def set_token():
    expire = datetime.now() + TIME_LIMIT
    token = expire.strftime(TIME_FORMAT)
    session[ADMIN] = "%s|%s" % (token, _create_hmac(token))


def delete_token():
    del session[ADMIN]


def _valid_token(token):
    try:
        token, token_mac = token.split(u"|", 1)
    except:
        return False
    if not token_mac == _create_hmac(token):
        return False
    if datetime.now().strftime(TIME_FORMAT) < token:
        return True


def valid_admin(fn):
    @wraps(fn)
    def nufun(*args, **kwargs):
        if ADMIN in session:
            if _valid_token(session[ADMIN]):
                set_token()
                return fn(*args, **kwargs)
            delete_token()
        session["next"] = request.script_root + request.path
        return redirect(url_for(".login"))

    return nufun













Fix redirect generation for reverse proxied solutions
Fix redirect generation for reverse proxied solutions

  from datetime import timedelta, datetime
  from functools import wraps
  import hmac
  from hashlib import sha1
  from flask import Blueprint, session, redirect, url_for, request, current_app
  
  
  ADMIN = "valid_admin"
  TIME_FORMAT = '%Y%m%d%H%M%S'
  TIME_LIMIT = timedelta(hours=3)
  
  
  def _create_hmac(payload):
      key = current_app.config["SECRET_KEY"]
      payload = payload.encode("utf8")
      mac = hmac.new(key, payload, sha1)
      return mac.hexdigest()
  
  
  def set_token():
      expire = datetime.now() + TIME_LIMIT
      token = expire.strftime(TIME_FORMAT)
      session[ADMIN] = "%s|%s" % (token, _create_hmac(token))
  
  
  def delete_token():
      del session[ADMIN]
  
  
  def _valid_token(token):
      try:
          token, token_mac = token.split(u"|", 1)
      except:
          return False
      if not token_mac == _create_hmac(token):
          return False
      if datetime.now().strftime(TIME_FORMAT) < token:
          return True
  
  
  def valid_admin(fn):
      @wraps(fn)
      def nufun(*args, **kwargs):
          if ADMIN in session:
              if _valid_token(session[ADMIN]):
                  set_token()
                  return fn(*args, **kwargs)
              delete_token()
-         session["next"] = request.path
+         session["next"] = request.script_root + request.path
          return redirect(url_for(".login"))
  
      return nufun
  
  
  
  
  
  
  
  
  
  
  
  
  
Fix redirect generation for reverse proxied solutions
## Code Before:
from datetime import timedelta, datetime
from functools import wraps
import hmac
from hashlib import sha1
from flask import Blueprint, session, redirect, url_for, request, current_app


ADMIN = "valid_admin"
TIME_FORMAT = '%Y%m%d%H%M%S'
TIME_LIMIT = timedelta(hours=3)


def _create_hmac(payload):
    key = current_app.config["SECRET_KEY"]
    payload = payload.encode("utf8")
    mac = hmac.new(key, payload, sha1)
    return mac.hexdigest()


def set_token():
    expire = datetime.now() + TIME_LIMIT
    token = expire.strftime(TIME_FORMAT)
    session[ADMIN] = "%s|%s" % (token, _create_hmac(token))


def delete_token():
    del session[ADMIN]


def _valid_token(token):
    try:
        token, token_mac = token.split(u"|", 1)
    except:
        return False
    if not token_mac == _create_hmac(token):
        return False
    if datetime.now().strftime(TIME_FORMAT) < token:
        return True


def valid_admin(fn):
    @wraps(fn)
    def nufun(*args, **kwargs):
        if ADMIN in session:
            if _valid_token(session[ADMIN]):
                set_token()
                return fn(*args, **kwargs)
            delete_token()
        session["next"] = request.path
        return redirect(url_for(".login"))

    return nufun













## Instruction:
Fix redirect generation for reverse proxied solutions
## Code After:
from datetime import timedelta, datetime
from functools import wraps
import hmac
from hashlib import sha1
from flask import Blueprint, session, redirect, url_for, request, current_app


ADMIN = "valid_admin"
TIME_FORMAT = '%Y%m%d%H%M%S'
TIME_LIMIT = timedelta(hours=3)


def _create_hmac(payload):
    key = current_app.config["SECRET_KEY"]
    payload = payload.encode("utf8")
    mac = hmac.new(key, payload, sha1)
    return mac.hexdigest()


def set_token():
    expire = datetime.now() + TIME_LIMIT
    token = expire.strftime(TIME_FORMAT)
    session[ADMIN] = "%s|%s" % (token, _create_hmac(token))


def delete_token():
    del session[ADMIN]


def _valid_token(token):
    try:
        token, token_mac = token.split(u"|", 1)
    except:
        return False
    if not token_mac == _create_hmac(token):
        return False
    if datetime.now().strftime(TIME_FORMAT) < token:
        return True


def valid_admin(fn):
    @wraps(fn)
    def nufun(*args, **kwargs):
        if ADMIN in session:
            if _valid_token(session[ADMIN]):
                set_token()
                return fn(*args, **kwargs)
            delete_token()
        session["next"] = request.script_root + request.path
        return redirect(url_for(".login"))

    return nufun












