????

Your IP : 216.73.216.233


Current Path : C:/opt/pgsql/pgAdmin 4/web/pgadmin/about/
Upload File :
Current File : C:/opt/pgsql/pgAdmin 4/web/pgadmin/about/__init__.py

##########################################################################
#
# pgAdmin 4 - PostgreSQL Tools
#
# Copyright (C) 2013 - 2024, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################

"""A blueprint module implementing the about box."""

from flask import Response, render_template, request
from flask_babel import gettext
from flask_security import current_user
from pgadmin.user_login_check import pga_login_required
from pgadmin.utils import PgAdminModule
from pgadmin.utils.menu import MenuItem
from pgadmin.utils.constants import MIMETYPE_APP_JS
from pgadmin.utils.ajax import make_json_response
import config
import httpagentparser
from pgadmin.model import User
from user_agents import parse
import platform

MODULE_NAME = 'about'


class AboutModule(PgAdminModule):
    def get_own_menuitems(self):
        appname = config.APP_NAME

        return {
            'help_items': [
                MenuItem(
                    name='mnu_about',
                    priority=999,
                    module="pgAdmin.About",
                    callback='about_show',
                    icon='fa fa-info-circle',
                    label=gettext('About %(appname)s', appname=appname)
                )
            ]
        }

    def get_exposed_url_endpoints(self):
        return ['about.index']


blueprint = AboutModule(MODULE_NAME, __name__, static_url_path='')


##########################################################################
# A test page
##########################################################################
@blueprint.route("/", endpoint='index')
@pga_login_required
def index():
    """Render the about box."""
    info = {}
    # Get OS , NW.js, Browser details
    browser, os_details, nwjs_version = detect_browser(request)
    admin = is_admin(current_user.email)

    if nwjs_version:
        info['nwjs'] = nwjs_version

    if config.SERVER_MODE:
        info['app_mode'] = gettext('Server')
    else:
        info['app_mode'] = gettext('Desktop')

    info['browser_details'] = browser
    info['version'] = config.APP_VERSION
    info['admin'] = admin
    info['current_user'] = current_user.email

    if admin:
        settings = ""
        info['os_details'] = os_details
        info['log_file'] = config.LOG_FILE

        # If external datbase is used do not display SQLITE_PATH
        if not config.CONFIG_DATABASE_URI:
            info['config_db'] = config.SQLITE_PATH

        for setting in dir(config):
            if not setting.startswith('_') and setting.isupper() and \
                setting not in ['CSRF_SESSION_KEY',
                                'SECRET_KEY',
                                'SECURITY_PASSWORD_SALT',
                                'SECURITY_PASSWORD_HASH',
                                'ALLOWED_HOSTS',
                                'MAIL_PASSWORD',
                                'LDAP_BIND_PASSWORD',
                                'SECURITY_PASSWORD_HASH']:
                if isinstance(getattr(config, setting), str):
                    settings = \
                        settings + '{} = "{}"\n'.format(
                            setting, getattr(config, setting))
                else:
                    settings = \
                        settings + '{} = {}\n'.format(
                            setting, getattr(config, setting))

        info['settings'] = settings

    return make_json_response(
        data=info,
        status=200
    )


def is_admin(load_user):
    user = User.query.filter_by(email=load_user).first()
    return user.has_role("Administrator")


def detect_browser(request):
    """This function returns the browser and os details"""
    nwjs_version = None
    agent = request.environ.get('HTTP_USER_AGENT')
    os_details = parse(platform.platform()).ua_string

    if 'Nwjs' in agent:
        agent = agent.split('-')
        nwjs_version = agent[0].split(':')[1]
        browser = 'Chromium' + ' ' + agent[2]

    else:
        browser = httpagentparser.detect(agent)
        if not browser:
            browser = agent.split('/')[0]
        else:
            browser = browser['browser']['name'] + ' ' + browser['browser'][
                'version']

    return browser, os_details, nwjs_version


@blueprint.route("/about.js")
@pga_login_required
def script():
    """render the required javascript"""
    return Response(
        response=render_template("about/about.js", _=gettext),
        status=200,
        mimetype=MIMETYPE_APP_JS
    )