Add endpoint for serving i18n requests

For now JSON service is not available without authentication
to IPA. But some of Web UI pages expect translations before
or without Login process. This endpoint serves i18n requests
only.

Fixes: https://pagure.io/freeipa/issue/7559
Reviewed-By: Alexander Bokovoy <abokovoy@redhat.com>
Reviewed-By: Christian Heimes <cheimes@redhat.com>
Reviewed-By: Petr Vobornik <pvoborni@redhat.com>
This commit is contained in:
Stanislav Levin
2018-06-26 11:50:19 +03:00
committed by Rob Crittenden
parent 34fe4b1dd4
commit ab0835f91f
2 changed files with 48 additions and 3 deletions

View File

@@ -29,11 +29,12 @@ register = Registry()
if api.env.context in ('server', 'lite'):
from ipaserver.rpcserver import (
wsgi_dispatch, xmlserver, jsonserver_kerb, jsonserver_session,
login_kerberos, login_x509, login_password, change_password,
sync_token, xmlserver_session)
wsgi_dispatch, xmlserver, jsonserver_i18n_messages, jsonserver_kerb,
jsonserver_session, login_kerberos, login_x509, login_password,
change_password, sync_token, xmlserver_session)
register()(wsgi_dispatch)
register()(xmlserver)
register()(jsonserver_i18n_messages)
register()(jsonserver_kerb)
register()(jsonserver_session)
register()(login_kerberos)

View File

@@ -41,6 +41,7 @@ import six
from six.moves.urllib.parse import parse_qs
from six.moves.xmlrpc_client import Fault
# pylint: enable=import-error
from six import BytesIO
from ipalib import plugable, errors
from ipalib.capabilities import VERSION_WITHOUT_CAPABILITIES
@@ -784,6 +785,49 @@ class xmlserver(KerberosWSGIExecutioner):
return dump.encode('utf-8')
class jsonserver_i18n_messages(jsonserver):
"""
JSON RPC server for i18n messages only.
"""
key = '/i18n_messages'
def not_allowed(self, start_response):
status = '405 Method Not Allowed'
headers = [('Allow', 'POST')]
response = b''
logger.debug('jsonserver_i18n_messages: %s', status)
start_response(status, headers)
return [response]
def forbidden(self, start_response):
status = '403 Forbidden'
headers = []
response = b'Invalid RPC command'
logger.debug('jsonserver_i18n_messages: %s', status)
start_response(status, headers)
return [response]
def __call__(self, environ, start_response):
logger.debug('WSGI jsonserver_i18n_messages.__call__:')
if environ['REQUEST_METHOD'] != 'POST':
return self.not_allowed(start_response)
data = read_input(environ)
unmarshal_data = super(jsonserver_i18n_messages, self
).unmarshal(data)
name = unmarshal_data[0] if unmarshal_data else ''
if name != 'i18n_messages':
return self.forbidden(start_response)
environ['wsgi.input'] = BytesIO(data.encode('utf-8'))
response = super(jsonserver_i18n_messages, self
).__call__(environ, start_response)
return response
class jsonserver_session(jsonserver, KerberosSession):
"""
JSON RPC server protected with session auth.