# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. """ Contains html text in variables to make and html response """ import yaml from http import HTTPStatus from html import escape as html_escape __author__ = "Alfonso Tierno " html_start = """ Welcome to OSM
( {} ) PDUs VNFDs NSDs NSs NSTDs NSIs USERs PROJECTs TOKENs VIMs WIMs SDNs K8s_clusters K8s_repos NS_Subs logout
""" html_body = """

{item}

""" html_end = """ """ html_body_error = "

Error
{}

" html_auth2 = """ OSM Login

{error}

Sign in to OSM

Username
Password
""" html_upload_body = """

Upload {} descriptor (tar.gz) file:

""" html_nslcmop_body = """ nslcm operations VNFRS

""" html_nsilcmop_body = """ nsilcm operations

""" html_vnfpackage_body = ( """Artifacts """ ) html_nspackage_body = ( """Artifacts """ ) def format(data, request, response, toke_info): """ Format a nice html response, depending on the data :param data: :param request: cherrypy request :param response: cherrypy response :return: string with teh html response """ response.headers["Content-Type"] = "text/html" if response.status == HTTPStatus.UNAUTHORIZED.value: if response.headers.get("WWW-Authenticate") and request.config.get( "auth.allow_basic_authentication" ): response.headers["WWW-Authenticate"] = ( "Basic" + response.headers["WWW-Authenticate"][6:] ) return else: return html_auth2.format(error=data) if request.path_info in ("/version", "/system"): return ( "
"
            + yaml.safe_dump(
                data, explicit_start=False, indent=4, default_flow_style=False
            )
            + "
" ) body = html_body.format(item=html_escape(request.path_info)) if response.status and response.status > 202: # input request.path_info (URL) can contain XSS that are translated into output error detail body += html_body_error.format( html_escape( yaml.safe_dump( data, explicit_start=True, indent=4, default_flow_style=False ) ) ) elif isinstance(data, (list, tuple)): if request.path_info == "/vnfpkgm/v1/vnf_packages": body += html_upload_body.format(request.path_info + "_content", "VNFD") elif request.path_info == "/nsd/v1/ns_descriptors": body += html_upload_body.format(request.path_info + "_content", "NSD") elif request.path_info == "/nst/v1/nst_templates": body += html_upload_body.format(request.path_info + "_content", "NSTD") for k in data: if isinstance(k, dict): data_id = k.pop("_id", None) elif isinstance(k, str): data_id = k body += '

{id}: {t}

'.format( url=request.path_info, id=data_id, t=html_escape(str(k)) ) elif isinstance(data, dict): if "Location" in response.headers: body += ' show '.format(response.headers["Location"]) else: _id = request.path_info[request.path_info.rfind("/") + 1 :] body += ( ' ' ' ' ).format(request.path_info) if request.path_info.startswith( "/nslcm/v1/ns_instances_content/" ) or request.path_info.startswith("/nslcm/v1/ns_instances/"): body += html_nslcmop_body.format(id=_id) elif request.path_info.startswith( "/nsilcm/v1/netslice_instances_content/" ) or request.path_info.startswith("/nsilcm/v1/netslice_instances/"): body += html_nsilcmop_body.format(id=_id) elif request.path_info.startswith( "/vnfpkgm/v1/vnf_packages/" ) or request.path_info.startswith("/vnfpkgm/v1/vnf_packages_content/"): body += html_vnfpackage_body.format(id=_id) elif request.path_info.startswith( "/nsd/v1/ns_descriptors/" ) or request.path_info.startswith("/nsd/v1/ns_descriptors_content/"): body += html_nspackage_body.format(id=_id) body += ( "
"
            + html_escape(
                yaml.safe_dump(
                    data, explicit_start=True, indent=4, default_flow_style=False
                )
            )
            + "
" ) elif data is None: if request.method == "DELETE" or "METHOD=DELETE" in request.query_string: body += "
 deleted 
" else: body = html_escape(str(data)) user_text = " " if toke_info: if toke_info.get("username"): user_text += "user: {}".format(toke_info.get("username")) if toke_info.get("project_id"): user_text += ", project: {}".format(toke_info.get("project_name")) return html_start.format(user_text) + body + html_end # yaml.safe_dump(data, explicit_start=True, indent=4, default_flow_style=False) # tags=False, # encoding='utf-8', allow_unicode=True)