codekingpro/portable-devtools
114k
1##########################################################################2#3# pgAdmin 4 - PostgreSQL Tools4#5# Copyright (C) 2013 - 2024, The pgAdmin Development Team6# This software is released under the PostgreSQL Licence7#8##########################################################################9 10"""A blueprint module implementing the about box."""11 12from flask import Response, render_template, request13from flask_babel import gettext14from flask_security import current_user15from pgadmin.user_login_check import pga_login_required16from pgadmin.utils import PgAdminModule17from pgadmin.utils.menu import MenuItem18from pgadmin.utils.constants import MIMETYPE_APP_JS19from pgadmin.utils.ajax import make_json_response20import config21import httpagentparser22from pgadmin.model import User23from user_agents import parse24import platform25 26MODULE_NAME = 'about'27 28 29class AboutModule(PgAdminModule):30 def get_own_menuitems(self):31 appname = config.APP_NAME32 33 return {34 'help_items': [35 MenuItem(36 name='mnu_about',37 priority=999,38 module="pgAdmin.About",39 callback='about_show',40 icon='fa fa-info-circle',41 label=gettext('About %(appname)s', appname=appname)42 )43 ]44 }45 46 def get_exposed_url_endpoints(self):47 return ['about.index']48 49 50blueprint = AboutModule(MODULE_NAME, __name__, static_url_path='')51 52 53##########################################################################54# A test page55##########################################################################56@blueprint.route("/", endpoint='index')57@pga_login_required58def index():59 """Render the about box."""60 info = {}61 # Get OS , NW.js, Browser details62 browser, os_details, nwjs_version = detect_browser(request)63 admin = is_admin(current_user.email)64 65 if nwjs_version:66 info['nwjs'] = nwjs_version67 68 if config.SERVER_MODE:69 info['app_mode'] = gettext('Server')70 else:71 info['app_mode'] = gettext('Desktop')72 73 info['browser_details'] = browser74 info['version'] = config.APP_VERSION75 info['admin'] = admin76 info['current_user'] = current_user.email77 78 if admin:79 settings = ""80 info['os_details'] = os_details81 info['log_file'] = config.LOG_FILE82 83 # If external datbase is used do not display SQLITE_PATH84 if not config.CONFIG_DATABASE_URI:85 info['config_db'] = config.SQLITE_PATH86 87 for setting in dir(config):88 if not setting.startswith('_') and setting.isupper() and \89 setting not in ['CSRF_SESSION_KEY',90 'SECRET_KEY',91 'SECURITY_PASSWORD_SALT',92 'SECURITY_PASSWORD_HASH',93 'ALLOWED_HOSTS',94 'MAIL_PASSWORD',95 'LDAP_BIND_PASSWORD',96 'SECURITY_PASSWORD_HASH']:97 if isinstance(getattr(config, setting), str):98 settings = \99 settings + '{} = "{}"\n'.format(100 setting, getattr(config, setting))101 else:102 settings = \103 settings + '{} = {}\n'.format(104 setting, getattr(config, setting))105 106 info['settings'] = settings107 108 return make_json_response(109 data=info,110 status=200111 )112 113 114def is_admin(load_user):115 user = User.query.filter_by(email=load_user).first()116 return user.has_role("Administrator")117 118 119def detect_browser(request):120 """This function returns the browser and os details"""121 nwjs_version = None122 agent = request.environ.get('HTTP_USER_AGENT')123 os_details = parse(platform.platform()).ua_string124 125 if 'Nwjs' in agent:126 agent = agent.split('-')127 nwjs_version = agent[0].split(':')[1]128 browser = 'Chromium' + ' ' + agent[2]129 130 else:131 browser = httpagentparser.detect(agent)132 if not browser:133 browser = agent.split('/')[0]134 else:135 browser = browser['browser']['name'] + ' ' + browser['browser'][136 'version']137 138 return browser, os_details, nwjs_version139 140 141@blueprint.route("/about.js")142@pga_login_required143def script():144 """render the required javascript"""145 return Response(146 response=render_template("about/about.js", _=gettext),147 status=200,148 mimetype=MIMETYPE_APP_JS149 )150 