summaryrefslogtreecommitdiff
path: root/addons
diff options
context:
space:
mode:
authorXavier Morel <xmo@odoo.com>2018-09-28 16:32:46 +0200
committerOlivier Dony <odo@odoo.com>2018-09-28 17:25:36 +0200
commit10228fe3ef6093e7c18375067aa161ddb45a2c19 (patch)
tree2d3c5288fe43ecf729b0c10d0eed6bdd677d93a8 /addons
parentf4bfc9075507e29296d25232461d8b85f9dbcd41 (diff)
[ADD] web: ability to become superuser (uid=1)
* requires that current user has group_system * only visible in debug mode (?debug) * available at login or via debug menu * special systray color in superuser sessions Closes #27254
Diffstat (limited to 'addons')
-rw-r--r--addons/web/controllers/main.py17
-rw-r--r--addons/web/static/src/js/chrome/abstract_web_client.js3
-rw-r--r--addons/web/static/src/scss/navbar.scss19
-rw-r--r--addons/web/static/src/xml/base.xml1
-rw-r--r--addons/web/views/webclient_templates.xml6
5 files changed, 44 insertions, 2 deletions
diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py
index 9519dd99476..49ace1f32ed 100644
--- a/addons/web/controllers/main.py
+++ b/addons/web/controllers/main.py
@@ -22,6 +22,7 @@ import time
import zlib
import werkzeug
+import werkzeug.exceptions
import werkzeug.utils
import werkzeug.wrappers
import werkzeug.wsgi
@@ -44,7 +45,7 @@ from odoo.http import content_disposition, dispatch_rpc, request, \
serialize_exception as _serialize_exception, Response
from odoo.exceptions import AccessError, UserError, AccessDenied
from odoo.models import check_method_name
-from odoo.service import db
+from odoo.service import db, security
_logger = logging.getLogger(__name__)
@@ -505,11 +506,25 @@ class Home(http.Controller):
if not odoo.tools.config['list_db']:
values['disable_database_manager'] = True
+ # otherwise no real way to test debug mode in template as ?debug =>
+ # values['debug'] = '' but that's also the fallback value when
+ # missing variables in qweb
+ if 'debug' in values:
+ values['debug'] = True
+
response = request.render('web.login', values)
response.headers['X-Frame-Options'] = 'DENY'
return response
+ @http.route('/web/become', type='http', auth='user', sitemap=False)
+ def switch_to_admin(self):
+ uid = request.env.user.id
+ if request.env.user._is_system():
+ uid = request.session.uid = odoo.SUPERUSER_ID
+ request.env['res.users']._invalidate_session_cache()
+ request.session.session_token = security.compute_session_token(request.session, request.env)
+ return http.redirect_with_hash(self._login_redirect(uid))
class WebClient(http.Controller):
diff --git a/addons/web/static/src/js/chrome/abstract_web_client.js b/addons/web/static/src/js/chrome/abstract_web_client.js
index d23bbeb237f..80711fd24ed 100644
--- a/addons/web/static/src/js/chrome/abstract_web_client.js
+++ b/addons/web/static/src/js/chrome/abstract_web_client.js
@@ -132,6 +132,9 @@ var AbstractWebClient = Widget.extend(ServiceProviderMixin, KeyboardNavigationMi
self.action_manager.$el.on('scroll', core.bus.trigger.bind(core.bus, 'scroll'));
core.bus.trigger('web_client_ready');
odoo.isReady = true;
+ if (session.uid === 1) {
+ self.$el.addClass('o_is_superuser');
+ }
});
},
diff --git a/addons/web/static/src/scss/navbar.scss b/addons/web/static/src/scss/navbar.scss
index 160a1b87558..367a374812d 100644
--- a/addons/web/static/src/scss/navbar.scss
+++ b/addons/web/static/src/scss/navbar.scss
@@ -1,4 +1,23 @@
+body.o_is_superuser .o_menu_systray {
+ background: repeating-linear-gradient(
+ 135deg,
+ #d9b904, #d9b904 10px,
+ #373435 10px, #373435 20px
+ );
+ border-bottom-left-radius: 20px;
+
+ > li {
+ > a, > label {
+ &:hover {
+ background-color: fade_out($o-navbar-inverse-link-hover-bg, 0.5);
+ }
+ }
+ }
+ .show .dropdown-toggle {
+ background-color: fade_out($o-navbar-inverse-link-hover-bg, 0.5);
+ }
+}
.o_main_navbar {
position: relative;
height: $o-navbar-height;
diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml
index a37645ba85e..907a02c0237 100644
--- a/addons/web/static/src/xml/base.xml
+++ b/addons/web/static/src/xml/base.xml
@@ -247,6 +247,7 @@
<div class="dropdown-divider o_debug_leave_section" role="separator"/>
<a role="menuitem" href="#" data-action="split_assets" class="dropdown-item">Activate Assets Debugging</a>
<a role="menuitem" href="#" data-action="regenerateAssets" class="dropdown-item">Regenerate Assets Bundles</a>
+ <a t-if="manager._is_admin" role="menuitem" href="/web/become" class="dropdown-item">Become Superuser</a>
<a role="menuitem" href="#" data-action="leave_debug_mode" class="dropdown-item">Leave the Developer Tools</a>
</t>
<t t-name="WebClient.DebugManager.Action">
diff --git a/addons/web/views/webclient_templates.xml b/addons/web/views/webclient_templates.xml
index 339f52e9de7..fb5a70290a0 100644
--- a/addons/web/views/webclient_templates.xml
+++ b/addons/web/views/webclient_templates.xml
@@ -409,11 +409,15 @@
<t t-esc="message"/>
</p>
- <input type="hidden" name="redirect" t-att-value="redirect"/>
<div t-attf-class="clearfix oe_login_buttons text-center mb-1 {{'pt-2' if form_small else 'pt-3'}}">
<button type="submit" class="btn btn-primary btn-block">Log in</button>
+ <t t-if="debug">
+ <button type="submit" name="redirect" value="/web/become" class="btn btn-link btn-sm btn-block">Log in as superuser</button>
+ </t>
<div class="o_login_auth"/>
</div>
+
+ <input type="hidden" name="redirect" t-att-value="redirect"/>
</form>
</t>
</template>