def test_01_existing_file_custom_format(self): path = 'setup.py' v = Versioned(self.app, format='foo_%(version)s_%(path)s_bar') versioned_path = v(path) assert versioned_path.startswith('foo_') assert versioned_path.endswith('_bar') assert versioned_path.find('setup.py') != -1
from .models import db, GDrivePhoto, Post, User, AnonymousUser, ANONYMOUS_EMAIL from .utils import ( format_date, format_gphoto_time, rsvp_by, rsvp_name, send_approval_email, ) from .zulip_utils import zulip_event_url app = Flask(__name__) app.config.from_envvar("SETTINGS") if "DYNO" in os.environ and "DOKKU_APP_TYPE" not in os.environ: # only trigger SSLify if the app is running on Heroku, not Dokku or local env sslify = SSLify(app) versioned = Versioned(app) db.init_app(app) # Create anonymous user try: User.objects.get(email=ANONYMOUS_EMAIL) except User.DoesNotExist: User.objects.create(email=ANONYMOUS_EMAIL, name="Unknown User") # Google OAuth stuff blueprint = make_google_blueprint( client_id=os.environ["GOOGLE_CLIENT_ID"], client_secret=os.environ["GOOGLE_CLIENT_SECRET"], scope=[ "https://www.googleapis.com/auth/userinfo.email", "https://www.googleapis.com/auth/userinfo.profile",
def create_app(config_name="development", config_file='/etc/privacyidea/pi.cfg', silent=False): """ First the configuration from the config.py is loaded depending on the config type like "production" or "development" or "testing". Then the environment variable PRIVACYIDEA_CONFIGFILE is checked for a config file, that contains additional settings, that will overwrite the default settings from config.py :param config_name: The config name like "production" or "testing" :type config_name: basestring :param config_file: The name of a config file to read configuration from :type config_file: basestring :param silent: If set to True the additional information are not printed to stdout :type silent: bool :return: The flask application :rtype: App object """ if not silent: print("The configuration name is: {0!s}".format(config_name)) if os.environ.get(ENV_KEY): config_file = os.environ[ENV_KEY] if not silent: print("Additional configuration will be read " "from the file {0!s}".format(config_file)) app = Flask(__name__, static_folder="static", template_folder="static/templates") if config_name: app.config.from_object(config[config_name]) # Set up flask-versioned versioned = Versioned(app, format='%(path)s?v=%(version)s') try: # Try to load the given config_file. # If it does not exist, just ignore it. app.config.from_pyfile(config_file, silent=True) except IOError: sys.stderr.write("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n") sys.stderr.write(" WARNING: privacyidea create_app has no access\n") sys.stderr.write(" to {0!s}!\n".format(config_file)) sys.stderr.write("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n") # Try to load the file, that was specified in the environment variable # PRIVACYIDEA_CONFIG_FILE # If this file does not exist, we create an error! app.config.from_envvar(ENV_KEY, silent=True) # We allow to set different static folders app.static_folder = app.config.get("PI_STATIC_FOLDER", "static/") app.template_folder = app.config.get("PI_TEMPLATE_FOLDER", "static/templates/") app.register_blueprint(validate_blueprint, url_prefix='/validate') app.register_blueprint(token_blueprint, url_prefix='/token') app.register_blueprint(system_blueprint, url_prefix='/system') app.register_blueprint(resolver_blueprint, url_prefix='/resolver') app.register_blueprint(realm_blueprint, url_prefix='/realm') app.register_blueprint(defaultrealm_blueprint, url_prefix='/defaultrealm') app.register_blueprint(policy_blueprint, url_prefix='/policy') app.register_blueprint(login_blueprint, url_prefix='/') app.register_blueprint(jwtauth, url_prefix='/auth') app.register_blueprint(user_blueprint, url_prefix='/user') app.register_blueprint(audit_blueprint, url_prefix='/audit') app.register_blueprint(machineresolver_blueprint, url_prefix='/machineresolver') app.register_blueprint(machine_blueprint, url_prefix='/machine') app.register_blueprint(application_blueprint, url_prefix='/application') app.register_blueprint(caconnector_blueprint, url_prefix='/caconnector') app.register_blueprint(cert_blueprint, url_prefix='/certificate') app.register_blueprint(ttype_blueprint, url_prefix='/ttype') app.register_blueprint(register_blueprint, url_prefix='/register') app.register_blueprint(smtpserver_blueprint, url_prefix='/smtpserver') app.register_blueprint(recover_blueprint, url_prefix='/recover') app.register_blueprint(radiusserver_blueprint, url_prefix='/radiusserver') app.register_blueprint(periodictask_blueprint, url_prefix='/periodictask') app.register_blueprint(privacyideaserver_blueprint, url_prefix='/privacyideaserver') app.register_blueprint(eventhandling_blueprint, url_prefix='/event') app.register_blueprint(smsgateway_blueprint, url_prefix='/smsgateway') app.register_blueprint(client_blueprint, url_prefix='/client') app.register_blueprint(subscriptions_blueprint, url_prefix='/subscriptions') app.register_blueprint(monitoring_blueprint, url_prefix='/monitoring') db.init_app(app) migrate = Migrate(app, db) app.response_class = PiResponseClass # Setup logging log_read_func = { 'yaml': lambda x: logging.config.dictConfig(yaml.safe_load( open(x, 'r').read())), 'cfg': lambda x: logging.config.fileConfig(x) } have_config = False log_exx = None log_config_file = app.config.get("PI_LOGCONFIG", "/etc/privacyidea/logging.cfg") if os.path.isfile(log_config_file): for cnf_type in ['cfg', 'yaml']: try: log_read_func[cnf_type](log_config_file) if not silent: print('Read Logging settings from {0!s}'.format( log_config_file)) have_config = True break except Exception as exx: log_exx = exx pass if not have_config: if log_exx: sys.stderr.write("Could not use PI_LOGCONFIG: " + str(log_exx) + "\n") if not silent: sys.stderr.write("Using PI_LOGLEVEL and PI_LOGFILE.\n") level = app.config.get("PI_LOGLEVEL", logging.INFO) # If there is another logfile in pi.cfg we use this. logfile = app.config.get("PI_LOGFILE", '/var/log/privacyidea/privacyidea.log') if not silent: sys.stderr.write("Using PI_LOGLEVEL {0!s}.\n".format(level)) sys.stderr.write("Using PI_LOGFILE {0!s}.\n".format(logfile)) DEFAULT_LOGGING_CONFIG["handlers"]["file"]["filename"] = logfile DEFAULT_LOGGING_CONFIG["handlers"]["file"]["level"] = level DEFAULT_LOGGING_CONFIG["loggers"]["privacyidea"]["level"] = level logging.config.dictConfig(DEFAULT_LOGGING_CONFIG) babel = Babel(app) @babel.localeselector def get_locale(): # if we are not in the request context, return None to use the default # locale if not request: return None # otherwise try to guess the language from the user accept # header the browser transmits. We support de/fr/en in this # example. The best match wins. return request.accept_languages.best_match( ['de', 'nl', 'fr', 'cs', 'it', 'es', 'en']) queue.register_app(app) logging.debug(u"Reading application from the static folder {0!s} and " u"the template folder {1!s}".format(app.static_folder, app.template_folder)) return app
def create_app(config_name="development", config_file='/etc/privacyidea/pi.cfg', silent=False): """ First the configuration from the config.py is loaded depending on the config type like "production" or "development" or "testing". Then the environment variable PRIVACYIDEA_CONFIGFILE is checked for a config file, that contains additional settings, that will overwrite the default settings from config.py :param config_name: The config name like "production" or "testing" :type config_name: basestring :param config_file: The name of a config file to read configuration from :type config_file: basestring :param silent: If set to True the additional information are not printed to stdout :type silent: bool :return: The flask application :rtype: App object """ if not silent: print("The configuration name is: {0!s}".format(config_name)) if os.environ.get(ENV_KEY): config_file = os.environ[ENV_KEY] if not silent: print( "Additional configuration can be read from the file {0!s}".format( config_file)) app = Flask(__name__, static_folder="static", template_folder="static/templates") if config_name: app.config.from_object(config[config_name]) # Set up flask-versioned versioned = Versioned(app, format='%(path)s?v=%(version)s') try: # Try to load the given config_file. # If it does not exist, just ignore it. app.config.from_pyfile(config_file, silent=True) except IOError: sys.stderr.write("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n") sys.stderr.write(" WARNING: privacyidea create_app has no access\n") sys.stderr.write(" to {0!s}!\n".format(config_file)) sys.stderr.write("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n") # Try to load the file, that was specified in the environment variable # PRIVACYIDEA_CONFIG_FILE # If this file does not exist, we create an error! app.config.from_envvar(ENV_KEY, silent=True) app.register_blueprint(validate_blueprint, url_prefix='/validate') app.register_blueprint(token_blueprint, url_prefix='/token') app.register_blueprint(system_blueprint, url_prefix='/system') app.register_blueprint(resolver_blueprint, url_prefix='/resolver') app.register_blueprint(realm_blueprint, url_prefix='/realm') app.register_blueprint(defaultrealm_blueprint, url_prefix='/defaultrealm') app.register_blueprint(policy_blueprint, url_prefix='/policy') app.register_blueprint(login_blueprint, url_prefix='/') app.register_blueprint(jwtauth, url_prefix='/auth') app.register_blueprint(user_blueprint, url_prefix='/user') app.register_blueprint(audit_blueprint, url_prefix='/audit') app.register_blueprint(machineresolver_blueprint, url_prefix='/machineresolver') app.register_blueprint(machine_blueprint, url_prefix='/machine') app.register_blueprint(application_blueprint, url_prefix='/application') app.register_blueprint(caconnector_blueprint, url_prefix='/caconnector') app.register_blueprint(cert_blueprint, url_prefix='/certificate') app.register_blueprint(ttype_blueprint, url_prefix='/ttype') app.register_blueprint(register_blueprint, url_prefix='/register') app.register_blueprint(smtpserver_blueprint, url_prefix='/smtpserver') app.register_blueprint(recover_blueprint, url_prefix='/recover') app.register_blueprint(radiusserver_blueprint, url_prefix='/radiusserver') app.register_blueprint(periodictask_blueprint, url_prefix='/periodictask') app.register_blueprint(privacyideaserver_blueprint, url_prefix='/privacyideaserver') app.register_blueprint(eventhandling_blueprint, url_prefix='/event') app.register_blueprint(smsgateway_blueprint, url_prefix='/smsgateway') app.register_blueprint(client_blueprint, url_prefix='/client') app.register_blueprint(subscriptions_blueprint, url_prefix='/subscriptions') app.register_blueprint(monitoring_blueprint, url_prefix='/monitoring') db.init_app(app) migrate = Migrate(app, db) app.response_class = PiResponseClass try: # Try to read logging config from file log_config_file = app.config.get("PI_LOGCONFIG", "/etc/privacyidea/logging.cfg") if os.path.isfile(log_config_file): logging.config.fileConfig(log_config_file) if not silent: print("Reading Logging settings from {0!s}".format( log_config_file)) else: raise Exception("The config file specified in PI_LOGCONFIG does " "not exist.") except Exception as exx: if not silent: sys.stderr.write("{0!s}\n".format(exx)) sys.stderr.write("Could not use PI_LOGCONFIG. " "Using PI_LOGLEVEL and PI_LOGFILE.\n") level = app.config.get("PI_LOGLEVEL", logging.DEBUG) # If there is another logfile in pi.cfg we use this. logfile = app.config.get("PI_LOGFILE") if logfile: if not silent: sys.stderr.write("Using PI_LOGLEVEL {0!s}.\n".format(level)) sys.stderr.write("Using PI_LOGFILE {0!s}.\n".format(logfile)) PI_LOGGING_CONFIG["handlers"]["file"]["filename"] = logfile PI_LOGGING_CONFIG["handlers"]["file"]["level"] = level PI_LOGGING_CONFIG["loggers"]["privacyidea"]["level"] = level logging.config.dictConfig(PI_LOGGING_CONFIG) else: if not silent: sys.stderr.write("No PI_LOGFILE found. Using default " "config.\n") logging.config.dictConfig(DEFAULT_LOGGING_CONFIG) babel = Babel(app) @babel.localeselector def get_locale(): # if we are not in the request context, return None to use the default # locale if not request: return None # otherwise try to guess the language from the user accept # header the browser transmits. We support de/fr/en in this # example. The best match wins. return request.accept_languages.best_match( ['de', 'fr', 'it', 'es', 'en']) queue.register_app(app) return app
def setUp(self): app = Flask(__name__) app.debug = False self.versioned = Versioned(app) self.app = app