Exemple #1
0
def oauth_discovery(request):

    endpoints = {
        'flows': ["Authorization Code Grant"],
        'auth_endpoint': get_absolute_reverse_url('oauth2provider.auth', request),
        'token_endpoint': get_absolute_reverse_url('oauth2provider.token', request),
        'default_redirect_uri': get_absolute_reverse_url('oauth.default_redirect_uri', request),
        'version': '2.0',
    }

    return HttpResponse(json.dumps(endpoints, sort_keys=True), content_type='application/json; charset=UTF-8')
Exemple #2
0
    def read(self, request, vendor, name, version):

        operator = get_object_or_404(CatalogueResource, type=2, vendor=vendor, short_name=name, version=version)
        # For now, all operators are freely accessible/distributable
        # if not operator.is_available_for(request.user):
        #    return HttpResponseForbidden()

        mode = request.GET.get('mode', 'classic')

        key = get_operator_cache_key(operator, get_current_domain(request), mode)
        cached_response = cache.get(key)
        if cached_response is None:
            options = operator.json_description
            js_files = options['js_files']

            base_url = get_absolute_reverse_url('wirecloud.showcase_media', kwargs={
                'vendor': operator.vendor,
                'name': operator.short_name,
                'version': operator.version,
                'file_path': operator.template_uri
            }, request=request)

            xhtml = generate_xhtml_operator_code(js_files, base_url, request, process_requirements(options['requirements']), mode)
            cache_timeout = 31536000  # 1 year
            cached_response = CacheableData(xhtml, timeout=cache_timeout, content_type='application/xhtml+xml; charset=UTF-8')

            cache.set(key, cached_response, cache_timeout)

        return cached_response.get_response()
Exemple #3
0
    def read(self, request, vendor, name, version):

        operator = get_object_or_404(CatalogueResource, type=2, vendor=vendor, short_name=name, version=version)
        if not operator.is_available_for(request.user):
            return HttpResponseForbidden()

        key = '_operator/' + operator.local_uri_part
        cached_response = cache.get(key)
        if cached_response is None:
            options = json.loads(operator.json_description)
            js_files = options['js_files']

            base_url = operator.template_uri
            if not base_url.startswith(('http://', 'https://')):
                base_url = get_absolute_reverse_url('wirecloud_catalogue.media', kwargs={
                    'vendor': operator.vendor,
                    'name': operator.short_name,
                    'version': operator.version,
                    'file_path': operator.template_uri
                }, request=request)

            xhtml = generate_xhtml_operator_code(js_files, base_url, request)
            cache_timeout = 31536000  # 1 year
            cached_response = CacheableData(xhtml, timeout=cache_timeout, mimetype='application/xhtml+xml; charset=UTF-8')

            cache.set(key, cached_response, cache_timeout)

        return cached_response.get_response()
def get_resource_data(untranslated_resource, user, request=None):
    """Gets all the information related to the given widget."""
    resource = untranslated_resource.get_translated_model()
    resource_info = untranslated_resource.get_processed_info(request)

    if urlparse(resource.template_uri).scheme == '':
        template_uri = get_absolute_reverse_url('wirecloud_catalogue.media', kwargs={
            'vendor': resource.vendor,
            'name': resource.short_name,
            'version': resource.version,
            'file_path': resource.template_uri
        }, request=request)
    else:
        template_uri = resource.template_uri

    if resource.display_name and resource.display_name != "":
        displayName = resource.display_name
    else:
        displayName = resource.short_name

    data_events = get_event_data(widget_id=resource.pk)
    data_slots = get_slot_data(widget_id=resource.pk)

    uploader = None
    if resource.creator is not None:
        uploader = resource.creator.get_full_name()
        if uploader.strip() == '':
            uploader = resource.creator.username

    cdate = resource.creation_date
    creation_timestamp = time.mktime(cdate.timetuple()) * 1e3 + cdate.microsecond / 1e3

    return {
        'id': resource.pk,
        'vendor': resource.vendor,
        'name': resource.short_name,
        'version': resource.version,
        'type': resource.resource_type(),
        'packaged': resource.fromWGT,
        'date': creation_timestamp,
        'uploader': uploader,
        'permissions' : {
            'uninstall': resource.public is False and resource.users.filter(pk=user.pk).exists(),
        },
        'authors': resource.author,
        'displayName': displayName,
        'description': resource.description,
        'mail': resource.mail,
        'uriImage': urljoin(template_uri, resource.image_uri),
        'uriWiki': urljoin(template_uri, resource.wiki_page_uri),
        'uriTemplate': template_uri,
        'license': resource_info['license'],
        'licenseurl': resource_info['licenseurl'],
        'outputs': [d for d in data_events],
        'inputs': [d for d in data_slots],
    }
Exemple #5
0
 def setUpClass(cls):
     super(BasicViewsAPI, cls).setUpClass()
     factory = RequestFactory()
     request = factory.get(reverse('login'))
     if django.VERSION[1] >= 9:
         # Django 1.9 doesn't force the use of absolute urls for the location header
         # https://docs.djangoproject.com/en/1.9/releases/1.9/#http-redirects-no-longer-forced-to-absolute-uris
         cls.login_url = reverse('login')
     else:
         cls.login_url = get_absolute_reverse_url('login', request=request)
Exemple #6
0
    def render(self, context):
        base_url = get_absolute_reverse_url('wirecloud.root', context['request'])
        if base_url.endswith('/'):
            base_url = base_url[:-1]

        value = self.condition.resolve(context)
        if value.startswith(base_url + '/') or value == base_url:
            return self.nodelist.render(context)
        else:
            return ''
Exemple #7
0
 def setUpClass(cls):
     super(BasicViewsAPI, cls).setUpClass()
     factory = RequestFactory()
     request = factory.get(reverse('login'))
     if django.VERSION[1] >= 9:
         # Django 1.9 doesn't force the use of absolute urls for the location header
         # https://docs.djangoproject.com/en/1.9/releases/1.9/#http-redirects-no-longer-forced-to-absolute-uris
         cls.login_url = reverse('login')
     else:
         cls.login_url = get_absolute_reverse_url('login', request=request)
def get_resource_data(untranslated_resource, user, request=None):
    """Gets all the information related to the given widget."""
    resource = untranslated_resource.get_translated_model()

    if urlparse(resource.template_uri).scheme == '':
        template_uri = get_absolute_reverse_url('wirecloud_catalogue.media', kwargs={
            'vendor': resource.vendor,
            'name': resource.short_name,
            'version': resource.version,
            'file_path': resource.template_uri
        }, request=request)
    else:
        template_uri = resource.template_uri

    if resource.display_name and resource.display_name != "":
        displayName = resource.display_name
    else:
        displayName = resource.short_name

    data_tags = get_tag_data(widget_id=resource.pk, user_id=user.id)
    data_events = get_event_data(widget_id=resource.pk)
    data_slots = get_slot_data(widget_id=resource.pk)

    uploader = None
    if resource.creator is not None:
        uploader = resource.creator.get_full_name()
        if uploader.strip() == '':
            uploader = resource.creator.username

    cdate = resource.creation_date
    creation_timestamp = time.mktime(cdate.timetuple()) * 1e3 + cdate.microsecond / 1e3

    return {
        'id': resource.pk,
        'vendor': resource.vendor,
        'name': resource.short_name,
        'version': resource.version,
        'type': resource.resource_type(),
        'packaged': resource.fromWGT,
        'date': creation_timestamp,
        'uploader': uploader,
        'added_by_user': user.is_superuser or resource.creator == user,
        'author': resource.author,
        'displayName': displayName,
        'description': resource.description,
        'mail': resource.mail,
        'uriImage': urljoin(template_uri, resource.image_uri),
        'uriWiki': urljoin(template_uri, resource.wiki_page_uri),
        'uriTemplate': template_uri,
        'ieCompatible': resource.ie_compatible,
        'tags': [d for d in data_tags],
        'outputs': [d for d in data_events],
        'inputs': [d for d in data_slots],
        'votes': get_vote_data(widget=resource, user=user),
    }
def oauth_discovery(request):
    keycloak_auth_backend = build_simple_backend()

    endpoints = {
        'flows': ["Authorization Code Grant", "Resource Owner Password Credentials Grant"],
        'auth_endpoint': keycloak_auth_backend.AUTHORIZATION_URL,
        'token_endpoint': keycloak_auth_backend.ACCESS_TOKEN_URL,
        'default_redirect_uri': get_absolute_reverse_url('oauth.default_redirect_uri', request),
        'version': '2.0',
    }

    return HttpResponse(json.dumps(endpoints, sort_keys=True), content_type='application/json; charset=UTF-8')
Exemple #10
0
def get_template_url(vendor, name, version, url, request=None):

    if urlparse(url).scheme == '':
        template_url = get_absolute_reverse_url('wirecloud_catalogue.media', kwargs={
            'vendor': vendor,
            'name': name,
            'version': version,
            'file_path': url
        }, request=request)
    else:
        template_url = url

    return template_url
Exemple #11
0
def get_template_url(vendor, name, version, url, request=None, url_pattern_name='wirecloud_catalogue.media'):

    if urlparse(url).scheme == '':
        template_url = get_absolute_reverse_url(url_pattern_name, kwargs={
            'vendor': vendor,
            'name': name,
            'version': version,
            'file_path': url
        }, request=request)
    else:
        template_url = url

    return template_url
Exemple #12
0
def oauth_discovery(request):

    from social_auth.backends import get_backends

    fiware_auth_backend = get_backends()['fiware']
    endpoints = {
        'auth_endpoint': fiware_auth_backend.AUTHORIZATION_URL,
        'token_endpoint': fiware_auth_backend.ACCESS_TOKEN_URL,
        'default_redirect_uri': get_absolute_reverse_url('oauth.default_redirect_uri', request),
        'version': '2.0',
    }

    return HttpResponse(json.dumps(endpoints), content_type='application/json; charset=UTF-8')
Exemple #13
0
    def get_processed_info(self, request=None):

        if urlparse(self.template_uri).scheme == '':
            template_uri = get_absolute_reverse_url('wirecloud_catalogue.media', kwargs={
                'vendor': self.vendor,
                'name': self.short_name,
                'version': self.version,
                'file_path': self.template_uri
            }, request=request)
        else:
            template_uri = self.template_uri

        parser = TemplateParser(self.json_description, base=template_uri)
        return parser.get_resource_processed_info()
Exemple #14
0
def start_purchase(request, market_user, market_name, store):

    adaptor = get_market_adaptor(market_user, market_name)
    user_data = get_market_user_data(request.user, market_user, market_name)

    data = simplejson.loads(request.raw_post_data)

    redirect_uri = get_absolute_reverse_url('wirecloud.fiware.store_redirect_uri', request)
    try:
        result = adaptor.start_purchase(store, data['offering_url'], redirect_uri, **user_data)
    except:
        return HttpResponse(status=502)

    return HttpResponse(simplejson.dumps(result), mimetype='application/json; chaset=UTF-8')
Exemple #15
0
def oauth_discovery(request):

    from social.apps.django_app.utils import BACKENDS
    from social.backends.utils import get_backend
    fiware_auth_backend = get_backend(BACKENDS, 'fiware')

    endpoints = {
        'flows': ["Authorization Code Grant", "Resource Owner Password Credentials Grant"],
        'auth_endpoint': fiware_auth_backend.AUTHORIZATION_URL,
        'token_endpoint': fiware_auth_backend.ACCESS_TOKEN_URL,
        'default_redirect_uri': get_absolute_reverse_url('oauth.default_redirect_uri', request),
        'version': '2.0',
    }

    return HttpResponse(json.dumps(endpoints), content_type='application/json; charset=UTF-8')
Exemple #16
0
def oauth_discovery(request):

    from social.apps.django_app.utils import BACKENDS
    from social.backends.utils import get_backend
    fiware_auth_backend = get_backend(BACKENDS, 'fiware')

    endpoints = {
        'flows': ["Authorization Code Grant", "Resource Owner Password Credentials Grant"],
        'auth_endpoint': fiware_auth_backend.AUTHORIZATION_URL,
        'token_endpoint': fiware_auth_backend.ACCESS_TOKEN_URL,
        'default_redirect_uri': get_absolute_reverse_url('oauth.default_redirect_uri', request),
        'version': '2.0',
    }

    return HttpResponse(json.dumps(endpoints, sort_keys=True), content_type='application/json; charset=UTF-8')
Exemple #17
0
    def read(self, request, vendor, name, version):

        widget = get_object_or_404(
            Widget, resource__vendor=vendor, resource__short_name=name, resource__version=version
        )
        if not widget.is_available_for(request.user):
            raise Http403()

        # check if the xhtml code has been cached
        if widget.xhtml.cacheable:

            cache_key = widget.xhtml.get_cache_key(get_current_domain(request))
            cache_entry = cache.get(cache_key)
            if cache_entry is not None:
                response = HttpResponse(cache_entry["code"], mimetype="%s; charset=UTF-8" % cache_entry["content_type"])
                patch_cache_headers(response, cache_entry["timestamp"], cache_entry["timeout"])
                return response

        # process xhtml
        xhtml = widget.xhtml

        content_type = xhtml.content_type
        if not content_type:
            content_type = "text/html"

        force_base = False
        base_url = xhtml.url
        if not base_url.startswith(("http://", "https://")):
            base_url = get_absolute_reverse_url(
                "wirecloud_showcase.media", args=(base_url.split("/", 4)), request=request
            )
            force_base = True

        code = xhtml.code
        if not xhtml.cacheable or code == "":
            try:
                if xhtml.url.startswith(("http://", "https://")):
                    code = downloader.download_http_content(urljoin(base_url, xhtml.url), user=request.user)
                else:
                    code = downloader.download_http_content(
                        "file://" + os.path.join(showcase_utils.wgt_deployer.root_dir, xhtml.url), user=request.user
                    )

            except Exception, e:
                # FIXME: Send the error or use the cached original code?
                msg = _("XHTML code is not accessible: %(errorMsg)s") % {"errorMsg": e.message}
                return HttpResponse(get_xml_error_response(msg), mimetype="application/xml; charset=UTF-8")
Exemple #18
0
    def read(self, request, vendor, name, version):

        operator = get_object_or_404(CatalogueResource,
                                     type=2,
                                     vendor=vendor,
                                     short_name=name,
                                     version=version)
        # For now, all operators are freely accessible/distributable
        #if not operator.is_available_for(request.user):
        #    return HttpResponseForbidden()

        mode = request.GET.get('mode', 'classic')

        key = get_operator_cache_key(operator, get_current_domain(request),
                                     mode)
        cached_response = cache.get(key)
        if cached_response is None:
            options = json.loads(operator.json_description)
            js_files = options['js_files']

            base_url = operator.template_uri
            if not base_url.startswith(('http://', 'https://')):
                base_url = get_absolute_reverse_url('wirecloud.showcase_media',
                                                    kwargs={
                                                        'vendor':
                                                        operator.vendor,
                                                        'name':
                                                        operator.short_name,
                                                        'version':
                                                        operator.version,
                                                        'file_path':
                                                        operator.template_uri
                                                    },
                                                    request=request)

            xhtml = generate_xhtml_operator_code(
                js_files, base_url, request,
                process_requirements(options['requirements']), mode)
            cache_timeout = 31536000  # 1 year
            cached_response = CacheableData(
                xhtml,
                timeout=cache_timeout,
                content_type='application/xhtml+xml; charset=UTF-8')

            cache.set(key, cached_response, cache_timeout)

        return cached_response.get_response()
Exemple #19
0
    def process(self, request, market_user, market_name, store):

        adaptor = get_market_adaptor(market_user, market_name)
        user_data = get_market_user_data(request.user, market_user, market_name)

        data = parse_json_request(request)

        redirect_uri = get_absolute_reverse_url('wirecloud.fiware.store_redirect_uri', request)
        try:
            result = adaptor.start_purchase(store, data['offering_url'], redirect_uri, **user_data)
        except HTTPError as e:
            details = "%s" % e
            return build_error_response(request, 502, "Unexpected response", details=details)
        except (ConnectionError, ConnectTimeout):
            return build_error_response(request, 504, "Connection Error")

        return HttpResponse(json.dumps(result), content_type='application/json; chaset=UTF-8')
Exemple #20
0
    def read(self, request, vendor, name, version):

        operator = get_object_or_404(CatalogueResource, type=2, vendor=vendor, short_name=name, version=version)
        options = json.loads(operator.json_description)
        js_files = options['js_files']

        base_url = operator.template_uri
        if not base_url.startswith(('http://', 'https://')):
            base_url = get_absolute_reverse_url('wirecloud_catalogue.media', kwargs={
                'vendor': operator.vendor,
                'name': operator.short_name,
                'version': operator.version,
                'file_path': operator.template_uri
            }, request=request)

        xhtml = generate_xhtml_operator_code(js_files, base_url, request)

        return HttpResponse(xhtml, mimetype='application/xhtml+xml; charset=UTF-8')
Exemple #21
0
    def read(self, request, vendor, name, version):

        resource = get_object_or_404(CatalogueResource.objects.select_related('widget__xhtml'), vendor=vendor, short_name=name, version=version)
        if not resource.is_available_for(request.user):
            raise Http403()

        if resource.resource_type() != 'widget':
            raise Http404()

        widget_info = json.loads(resource.json_description)

        # check if the xhtml code has been cached
        if widget_info['code_cacheable'] is True:

            cache_key = resource.widget.xhtml.get_cache_key(get_current_domain(request))
            cache_entry = cache.get(cache_key)
            if cache_entry is not None:
                response = HttpResponse(cache_entry['code'], mimetype=cache_entry['mimetype'])
                patch_cache_headers(response, cache_entry['timestamp'], cache_entry['timeout'])
                return response

        # process xhtml
        xhtml = resource.widget.xhtml
        content_type = widget_info.get('code_content_type', 'text/html')
        charset = widget_info.get('code_charset', 'utf-8')

        force_base = False
        base_url = xhtml.url
        if not base_url.startswith(('http://', 'https://')):
            base_url = get_absolute_reverse_url('wirecloud_showcase.media', args=(base_url.split('/', 4)), request=request)
            force_base = True

        code = xhtml.code
        if not xhtml.cacheable or code == '':
            try:
                if xhtml.url.startswith(('http://', 'https://')):
                    code = downloader.download_http_content(urljoin(base_url, xhtml.url), user=request.user)
                else:
                    code = downloader.download_http_content('file://' + os.path.join(showcase_utils.wgt_deployer.root_dir, url2pathname(xhtml.url)), user=request.user)

            except Exception, e:
                msg = _("XHTML code is not accessible: %(errorMsg)s") % {'errorMsg': e.message}
                return build_error_response(request, 502, msg)
Exemple #22
0
def logout(request):

    external_domain = 'HTTP_ORIGIN' in request.META

    # Check if the logout request is originated in a different domain
    if external_domain:
        origin = request.META['HTTP_ORIGIN']

        if origin not in ALLOWED_ORIGINS:
            return build_error_response(request, 403, '')

        # Force not redirect by using next_page=None
        response = wirecloud_logout(request, next_page=None)
        response['Access-Control-Allow-Origin'] = origin
        response['Access-Control-Allow-Credentials'] = 'true'
        return response
    elif callable(
            request.user.is_authenticated) and request.user.is_authenticated(
            ) or request.user.is_authenticated is True:
        backend = build_backend()

        next_page = str(
            getattr(settings, 'LOGOUT_REDIRECT_URL',
                    get_absolute_reverse_url('wirecloud.root', request)))
        if REDIRECT_FIELD_NAME in request.GET:
            url_next_page = request.GET.get(REDIRECT_FIELD_NAME)
            url_is_safe = is_safe_url(
                url=url_next_page,
                allowed_hosts={request.get_host()},
                require_https=request.is_secure(),
            )
            if url_is_safe:
                next_page = url_next_page

        keycloak_logout_url = backend.end_session_url(
        ) + '?redirect_uri=' + quote(request.build_absolute_uri(next_page))
        request.GET = {}
        return wirecloud_logout(request, next_page=keycloak_logout_url)
    else:
        return wirecloud_logout(request)
Exemple #23
0
    def process(self, request, market_user, market_name, store):

        adaptor = get_market_adaptor(market_user, market_name)
        user_data = get_market_user_data(request.user, market_user,
                                         market_name)

        data = parse_json_request(request)

        redirect_uri = get_absolute_reverse_url(
            'wirecloud.fiware.store_redirect_uri', request)
        try:
            result = adaptor.start_purchase(store, data['offering_url'],
                                            redirect_uri, **user_data)
        except HTTPError as e:
            details = "%s" % e
            return build_error_response(request,
                                        502,
                                        "Unexpected response",
                                        details=details)
        except (ConnectionError, ConnectTimeout):
            return build_error_response(request, 504, "Connection Error")

        return HttpResponse(json.dumps(result),
                            content_type='application/json; chaset=UTF-8')
Exemple #24
0
def get_resource_data(resource, user, request=None):
    """Gets all the information related to the given resource."""
    resource_info = resource.get_processed_info(request)

    template_uri = get_absolute_reverse_url(
        "wirecloud_catalogue.media",
        kwargs={
            "vendor": resource.vendor,
            "name": resource.short_name,
            "version": resource.version,
            "file_path": resource.template_uri,
        },
        request=request,
    )

    wgt_path = os.path.join(
        wgt_deployer.get_base_dir(resource.vendor, resource.short_name, resource.version), resource.template_uri
    )
    size = os.path.getsize(wgt_path)

    cdate = resource.creation_date
    creation_timestamp = time.mktime(cdate.timetuple()) * 1e3 + cdate.microsecond / 1e3

    longdescription = resource_info["longdescription"]
    if longdescription != "":
        longdescription_relative_path = url2pathname(longdescription)
        longdescription_base_url = force_trailing_slash(
            urljoin(
                resource.get_template_url(request=request, for_base=True),
                pathname2url(os.path.dirname(longdescription_relative_path)),
            )
        )
        longdescription_path = os.path.join(
            wgt_deployer.get_base_dir(resource.vendor, resource.short_name, resource.version),
            longdescription_relative_path,
        )

        (filename_root, filename_ext) = os.path.splitext(longdescription_path)
        localized_longdescription_path = filename_root + "." + get_language() + filename_ext

        try:
            description_code = download_local_file(localized_longdescription_path)
            longdescription = clean_html(
                markdown.markdown(description_code, output_format="xhtml5"), base_url=longdescription_base_url
            )
        except:
            try:
                description_code = download_local_file(longdescription_path)
                longdescription = clean_html(
                    markdown.markdown(description_code, output_format="xhtml5"), base_url=longdescription_base_url
                )
            except:
                longdescription = resource_info["description"]

    else:
        longdescription = resource_info["description"]

    return {
        "id": resource.pk,
        "vendor": resource.vendor,
        "name": resource.short_name,
        "version": resource.version,
        "type": resource_info["type"],
        "date": creation_timestamp,
        "permissions": {
            "delete": user.is_superuser,
            "uninstall": resource.public is False and resource.users.filter(pk=user.pk).exists(),
        },
        "authors": resource_info["authors"],
        "contributors": resource_info["contributors"],
        "title": resource_info["title"],
        "description": resource_info["description"],
        "longdescription": longdescription,
        "email": resource_info["email"],
        "image": resource_info["image"],
        "homepage": resource_info["homepage"],
        "doc": resource_info["doc"],
        "changelog": resource_info["changelog"],
        "size": size,
        "uriTemplate": template_uri,
        "license": resource_info["license"],
        "licenseurl": resource_info["licenseurl"],
        "issuetracker": resource_info["issuetracker"],
    }
Exemple #25
0
def get_resource_data(resource, user, request=None):
    """Gets all the information related to the given resource."""
    resource_info = resource.get_processed_info(request)

    template_uri = get_absolute_reverse_url('wirecloud_catalogue.media',
                                            kwargs={
                                                'vendor': resource.vendor,
                                                'name': resource.short_name,
                                                'version': resource.version,
                                                'file_path':
                                                resource.template_uri
                                            },
                                            request=request)

    wgt_path = os.path.join(
        wgt_deployer.get_base_dir(resource.vendor, resource.short_name,
                                  resource.version), resource.template_uri)
    size = os.path.getsize(wgt_path)

    cdate = resource.creation_date
    creation_timestamp = time.mktime(
        cdate.timetuple()) * 1e3 + cdate.microsecond / 1e3

    longdescription = resource_info['longdescription']
    if longdescription != '':
        longdescription_relative_path = url2pathname(longdescription)
        longdescription_base_url = force_trailing_slash(
            urljoin(
                resource.get_template_url(request=request, for_base=True),
                pathname2url(os.path.dirname(longdescription_relative_path))))
        longdescription_path = os.path.join(
            wgt_deployer.get_base_dir(resource.vendor, resource.short_name,
                                      resource.version),
            longdescription_relative_path)

        (filename_root, filename_ext) = os.path.splitext(longdescription_path)
        localized_longdescription_path = filename_root + '.' + get_language(
        ) + filename_ext

        try:
            description_code = download_local_file(
                localized_longdescription_path).decode('utf-8')
            longdescription = clean_html(markdown.markdown(
                description_code, output_format='xhtml5'),
                                         base_url=longdescription_base_url)
        except Exception:
            try:
                description_code = download_local_file(
                    longdescription_path).decode('utf-8')
                longdescription = clean_html(markdown.markdown(
                    description_code, output_format='xhtml5'),
                                             base_url=longdescription_base_url)
            except Exception:
                longdescription = resource_info['description']

    else:
        longdescription = resource_info['description']

    return {
        'vendor': resource.vendor,
        'name': resource.short_name,
        'version': resource.version,
        'type': resource_info['type'],
        'date': creation_timestamp,
        'permissions': {
            'delete':
            user.is_superuser,
            'uninstall':
            resource.public is False
            and resource.users.filter(pk=user.pk).exists(),
        },
        'authors': resource_info['authors'],
        'contributors': resource_info['contributors'],
        'title': resource_info['title'],
        'description': resource_info['description'],
        'longdescription': longdescription,
        'email': resource_info['email'],
        'image': resource_info['image'],
        'homepage': resource_info['homepage'],
        'doc': resource_info['doc'],
        'changelog': resource_info['changelog'],
        'size': size,
        'uriTemplate': template_uri,
        'license': resource_info['license'],
        'licenseurl': resource_info['licenseurl'],
        'issuetracker': resource_info['issuetracker'],
    }
Exemple #26
0
 def setUpClass(cls):
     super(BasicViewsAPI, cls).setUpClass()
     factory = RequestFactory()
     request = factory.get(reverse('login'))
     cls.login_url = get_absolute_reverse_url('login', request=request)
Exemple #27
0
    def read(self, request, vendor, name, version):

        resource = get_object_or_404(CatalogueResource.objects.select_related('widget__xhtml'), vendor=vendor, short_name=name, version=version)
        # For now, all widgets are freely accessible/distributable
        #if not resource.is_available_for(request.user):
        #    return build_error_response(request, 403, "Forbidden")

        if resource.resource_type() != 'widget':
            raise Http404()

        mode = request.GET.get('mode', 'classic')
        widget_info = json.loads(resource.json_description)

        # check if the xhtml code has been cached
        if widget_info['contents']['cacheable'] is True:

            cache_key = resource.widget.xhtml.get_cache_key(get_current_domain(request), mode)
            cache_entry = cache.get(cache_key)
            if cache_entry is not None:
                response = HttpResponse(cache_entry['code'], content_type=cache_entry['content_type'])
                patch_cache_headers(response, cache_entry['timestamp'], cache_entry['timeout'])
                return response

        # process xhtml
        xhtml = resource.widget.xhtml
        content_type = widget_info['contents'].get('contenttype', 'text/html')
        charset = widget_info['contents'].get('charset', 'utf-8')

        force_base = False
        base_url = xhtml.url
        if not base_url.startswith(('http://', 'https://')):
            # Newer versions of Django urlencode urls created using reverse
            # Fix double encoding
            base_url = urlunquote(base_url)
            base_url = get_absolute_reverse_url('wirecloud.showcase_media', args=(base_url.split('/', 3)), request=request)
            force_base = True

        code = xhtml.code
        if not xhtml.cacheable or code == '':
            try:
                if xhtml.url.startswith(('http://', 'https://')):
                    code = download_http_content(urljoin(base_url, xhtml.url), user=request.user)
                else:
                    code = download_local_file(os.path.join(showcase_utils.wgt_deployer.root_dir, url2pathname(xhtml.url)))

            except Exception as e:
                return build_response(request, 502, {'error_msg': _("(X)HTML code is not accessible"), 'details': "%s" % e}, WIDGET_ERROR_FORMATTERS)
        else:
            # Code contents comes as unicode from persistence, we need bytes
            code = code.encode(charset)

        if xhtml.cacheable and (xhtml.code == '' or xhtml.code_timestamp is None):
            try:
                xhtml.code = code.decode(charset)
            except UnicodeDecodeError:
                msg = _('Widget code was not encoded using the specified charset (%(charset)s as stated in the widget description file).') % {'charset': charset}
                return build_response(request, 502, {'error_msg': msg}, WIDGET_ERROR_FORMATTERS)

            xhtml.code_timestamp = time.time() * 1000
            xhtml.save()
        elif not xhtml.cacheable and xhtml.code != '':
            xhtml.code = ''
            xhtml.code_timestamp = None
            xhtml.save()

        try:
            code = fix_widget_code(code, base_url, content_type, request, charset, xhtml.use_platform_style, process_requirements(widget_info['requirements']), force_base, mode)
        except UnicodeDecodeError:
            msg = _('Widget code was not encoded using the specified charset (%(charset)s as stated in the widget description file).') % {'charset': charset}
            return build_response(request, 502, {'error_msg': msg}, WIDGET_ERROR_FORMATTERS)
        except Exception as e:
            msg = _('Error processing widget code')
            return build_response(request, 502, {'error_msg': msg, 'details':"%s" % e}, WIDGET_ERROR_FORMATTERS)

        if xhtml.cacheable:
            cache_timeout = 31536000  # 1 year
            cache_entry = {
                'code': code,
                'content_type': '%s; charset=%s' % (content_type, charset),
                'timestamp': xhtml.code_timestamp,
                'timeout': cache_timeout,
            }
            cache.set(cache_key, cache_entry, cache_timeout)
        else:
            cache_timeout = 0

        response = HttpResponse(code, content_type='%s; charset=%s' % (content_type, charset))
        patch_cache_headers(response, xhtml.code_timestamp, cache_timeout)
        return response
Exemple #28
0
 def setUpClass(cls):
     super(BasicViewsAPI, cls).setUpClass()
     factory = RequestFactory()
     request = factory.get(reverse('login'))
     cls.login_url = get_absolute_reverse_url('login', request=request)
Exemple #29
0
def get_widget_data(widget, request=None):

    base_url = widget.xhtml.url
    if not base_url.startswith(('http://', 'https://')):
        base_url = get_absolute_reverse_url('wirecloud_showcase.media', args=(base_url.split('/', 4)), request=request)

    twidget = widget.resource.get_translated_model()
    data_ret = {}
    data_variabledef = VariableDef.objects.filter(widget=widget)
    data_vars = {}
    for var in data_variabledef:
        tvar = var.get_translated_model()
        data_var = {}
        data_var['aspect'] = var.aspect
        data_var['name'] = var.name
        data_var['type'] = var.type
        data_var['label'] = tvar.label
        data_var['description'] = tvar.description

        if var.aspect == 'PREF':
            data_var['default_value'] = tvar.default_value

            if var.type == 'L':
                options = UserPrefOption.objects.filter(variableDef=var)
                value_options = []
                for option in options:
                    toption = option.get_translated_model()
                    value_options.append([toption.value, toption.name])
                data_var['value_options'] = value_options

        elif var.aspect == 'SLOT':
            data_var['action_label'] = tvar.action_label

        if var.aspect in ('PREF', 'PROP', 'EVEN', 'SLOT'):

            data_var['order'] = var.order

        if var.aspect == 'PREF' or var.aspect == 'PROP':

            data_var['secure'] = var.secure

        elif var.aspect == 'GCTX' or var.aspect == 'ECTX':

            data_var['concept'] = var.contextoption_set.all().values('concept')[0]['concept']

        elif var.aspect == 'EVEN' or var.aspect == 'SLOT':

            data_var['friend_code'] = var.friend_code

        data_vars[var.name] = data_var

    data_ret['vendor'] = widget.resource.vendor
    data_ret['name'] = widget.resource.short_name
    data_ret['version'] = widget.resource.version
    data_ret['uri'] = widget.uri

    if twidget.display_name and twidget.display_name != "":
        data_ret['displayName'] = twidget.display_name
    else:
        data_ret['displayName'] = widget.resource.short_name
    data_ret['description'] = twidget.description
    data_ret['wikiURI'] = urljoin(base_url, twidget.wiki_page_uri)
    data_ret['imageURI'] = urljoin(base_url, twidget.image_uri)
    data_ret['iPhoneImageURI'] = urljoin(base_url, twidget.iphone_image_uri)
    data_ret['mail'] = widget.resource.mail
    data_ret['size'] = {}
    data_ret['size']['width'] = widget.width
    data_ret['size']['height'] = widget.height
    data_ret['variables'] = data_vars
    data_ret['code_content_type'] = widget.xhtml.content_type

    return data_ret
Exemple #30
0
    def read(self, request, vendor, name, version):

        resource = get_object_or_404(CatalogueResource.objects.select_related('widget__xhtml'), vendor=vendor, short_name=name, version=version)
        # For now, all widgets are freely accessible/distributable
        #if not resource.is_available_for(request.user):
        #    return build_error_response(request, 403, "Forbidden")

        if resource.resource_type() != 'widget':
            raise Http404()

        mode = request.GET.get('mode', 'classic')
        widget_info = json.loads(resource.json_description)

        # check if the xhtml code has been cached
        if widget_info['contents']['cacheable'] is True:

            cache_key = resource.widget.xhtml.get_cache_key(get_current_domain(request), mode)
            cache_entry = cache.get(cache_key)
            if cache_entry is not None:
                response = HttpResponse(cache_entry['code'], content_type=cache_entry['content_type'])
                patch_cache_headers(response, cache_entry['timestamp'], cache_entry['timeout'])
                return response

        # process xhtml
        xhtml = resource.widget.xhtml
        content_type = widget_info['contents'].get('contenttype', 'text/html')
        charset = widget_info['contents'].get('charset', 'utf-8')

        force_base = False
        base_url = xhtml.url
        if not base_url.startswith(('http://', 'https://')):
            # Newer versions of Django urlencode urls created using reverse
            # Fix double encoding
            base_url = urlunquote(base_url)
            base_url = get_absolute_reverse_url('wirecloud.showcase_media', args=(base_url.split('/', 4)), request=request)
            force_base = True

        code = xhtml.code
        if not xhtml.cacheable or code == '':
            try:
                if xhtml.url.startswith(('http://', 'https://')):
                    code = download_http_content(urljoin(base_url, xhtml.url), user=request.user)
                else:
                    code = download_local_file(os.path.join(showcase_utils.wgt_deployer.root_dir, url2pathname(xhtml.url)))

            except Exception as e:
                return build_response(request, 502, {'error_msg': _("(X)HTML code is not accessible"), 'details': "%s" % e}, WIDGET_ERROR_FORMATTERS)
        else:
            # Code contents comes as unicode from persistence, we need bytes
            code = code.encode(charset)

        if xhtml.cacheable and (xhtml.code == '' or xhtml.code_timestamp is None):
            try:
                xhtml.code = code.decode(charset)
            except UnicodeDecodeError:
                msg = _('Widget code was not encoded using the specified charset (%(charset)s as stated in the widget description file).') % {'charset': charset}
                return build_response(request, 502, {'error_msg': msg}, WIDGET_ERROR_FORMATTERS)

            xhtml.code_timestamp = time.time() * 1000
            xhtml.save()
        elif not xhtml.cacheable and xhtml.code != '':
            xhtml.code = ''
            xhtml.code_timestamp = None
            xhtml.save()

        try:
            code = fix_widget_code(code, base_url, content_type, request, charset, xhtml.use_platform_style, process_requirements(widget_info['requirements']), force_base, mode)
        except UnicodeDecodeError:
            msg = _('Widget code was not encoded using the specified charset (%(charset)s as stated in the widget description file).') % {'charset': charset}
            return build_response(request, 502, {'error_msg': msg}, WIDGET_ERROR_FORMATTERS)
        except Exception as e:
            msg = _('Error processing widget code')
            return build_response(request, 502, {'error_msg': msg, 'details':"%s" % e}, WIDGET_ERROR_FORMATTERS)

        if xhtml.cacheable:
            cache_timeout = 31536000  # 1 year
            cache_entry = {
                'code': code,
                'content_type': '%s; charset=%s' % (content_type, charset),
                'timestamp': xhtml.code_timestamp,
                'timeout': cache_timeout,
            }
            cache.set(cache_key, cache_entry, cache_timeout)
        else:
            cache_timeout = 0

        response = HttpResponse(code, content_type='%s; charset=%s' % (content_type, charset))
        patch_cache_headers(response, xhtml.code_timestamp, cache_timeout)
        return response
Exemple #31
0
def get_resource_data(resource, user, request=None):
    """Gets all the information related to the given resource."""
    resource_info = resource.get_processed_info(request)

    template_uri = get_absolute_reverse_url('wirecloud_catalogue.media', kwargs={
        'vendor': resource.vendor,
        'name': resource.short_name,
        'version': resource.version,
        'file_path': resource.template_uri
    }, request=request)

    wgt_path = os.path.join(wgt_deployer.get_base_dir(resource.vendor, resource.short_name, resource.version), resource.template_uri)
    size = os.path.getsize(wgt_path)

    cdate = resource.creation_date
    creation_timestamp = time.mktime(cdate.timetuple()) * 1e3 + cdate.microsecond / 1e3

    longdescription = resource_info['longdescription']
    if longdescription != '':
        longdescription_relative_path = url2pathname(longdescription)
        longdescription_base_url = force_trailing_slash(urljoin(resource.get_template_url(request=request, for_base=True), pathname2url(os.path.dirname(longdescription_relative_path))))
        longdescription_path = os.path.join(wgt_deployer.get_base_dir(resource.vendor, resource.short_name, resource.version), longdescription_relative_path)

        (filename_root, filename_ext) = os.path.splitext(longdescription_path)
        localized_longdescription_path = filename_root + '.' + get_language() + filename_ext

        try:
            description_code = download_local_file(localized_longdescription_path).decode('utf-8')
            longdescription = clean_html(markdown.markdown(description_code, output_format='xhtml5'), base_url=longdescription_base_url)
        except:
            try:
                description_code = download_local_file(longdescription_path).decode('utf-8')
                longdescription = clean_html(markdown.markdown(description_code, output_format='xhtml5'), base_url=longdescription_base_url)
            except:
                longdescription = resource_info['description']

    else:
        longdescription = resource_info['description']

    return {
        'id': resource.pk,
        'vendor': resource.vendor,
        'name': resource.short_name,
        'version': resource.version,
        'type': resource_info['type'],
        'date': creation_timestamp,
        'permissions': {
            'delete': user.is_superuser,
            'uninstall': resource.public is False and resource.users.filter(pk=user.pk).exists(),
        },
        'authors': resource_info['authors'],
        'contributors': resource_info['contributors'],
        'title': resource_info['title'],
        'description': resource_info['description'],
        'longdescription': longdescription,
        'email': resource_info['email'],
        'image': resource_info['image'],
        'homepage': resource_info['homepage'],
        'doc': resource_info['doc'],
        'changelog': resource_info['changelog'],
        'size': size,
        'uriTemplate': template_uri,
        'license': resource_info['license'],
        'licenseurl': resource_info['licenseurl'],
        'issuetracker': resource_info['issuetracker'],
    }
Exemple #32
0
 def get_template_url(self, request=None):
     return get_absolute_reverse_url('wirecloud_showcase.mashup_template', request, args=(self.id,))