예제 #1
0
 def set_current_user(self, user):
     session_user = {}
     session_user.update(user)
     session_user["session_id"] = str(uuid.uuid4())
     json_user = MongoObjectJSONEncoder().encode(user)
     self.set_secure_cookie(USER_COOKIE_NAME, json_user)
     encoded_json = base64.b64encode(json_user.encode("utf-8"))
     self.set_cookie(USER_PLAINTEXT_COOKIE_NAME, encoded_json)
예제 #2
0
 def json_encode_result(self, result, is_list=False):
     if is_list:
         return {
             "_d": MongoObjectJSONEncoder().encode(result),
             "_cosmos_service_array_result_": True
         }
     else:
         return MongoObjectJSONEncoder().encode(result)
예제 #3
0
 def set_current_user(self, user):
     session_user = {}
     session_user.update(user)
     session_user["session_id"] = str(uuid.uuid4())
     json_user = MongoObjectJSONEncoder().encode(user)
     self.set_secure_cookie(USER_COOKIE_NAME, json_user)
     encoded_json = base64.b64encode(json_user.encode("utf-8"))
     self.set_cookie(USER_PLAINTEXT_COOKIE_NAME, encoded_json)
예제 #4
0
    def post(self):
        try:
            data = json.loads(self.request.body)
            assert isinstance(data, dict)
        except ValueError as ve:
            raise tornado.web.HTTPError(400, ve.message)

        object_service = self.settings['object_service']
        object_name = APPLICATION_OBJECT_NAME

        preprocessor_list = object_service.get_operation_preprocessor(
            object_name, AccessType.INSERT)
        for preprocessor in preprocessor_list:
            yield preprocessor(object_service, object_name, data,
                               AccessType.INSERT)

        obj_serv = ObjectService()
        promise = obj_serv.save(self.current_user, object_name, data)
        result = yield promise
        data = MongoObjectJSONEncoder().encode(result)

        post_processor_list = object_service.get_operation_postprocessor(
            object_name, AccessType.INSERT)
        for post_processor in post_processor_list:
            yield post_processor(object_service, object_name, result,
                                 AccessType.INSERT)

        self.write(data)
        self.finish()
예제 #5
0
    def get(self):
        data = {k: ''.join(v) for k, v in self.request.arguments.iteritems()}
        order_id = data['referenceId']
        obj_serv = self.settings['object_service']
        columns = [TOTAL_PRICE_FIELD]
        cursor = obj_serv.load(SYSTEM_USER, ORDER_OBJECT_NAME, order_id, columns)
        order  = yield cursor
        if not order:
            raise tornado.web.HTTPError(404, "Not found")

        encoded_data = urllib.urlencode(data)
        sp = payment.amazon.simplepay.SimplePay(ACCESS_KEY, SECRET_KEY, REQUEST_URL, FPS_URL)
        result = sp.verify_success_return(encoded_data, SIMPLE_PAY_SUCCESS_URL)

        if result == 'Success':
            save_data = {"orderBy":order.get("owner", None), "payment": {"type": "AWS_SIMPLE_PAY", "data": data, "status": result}}
            logging.debug(save_data)
            logging.info("Updating order {0}".format(order_id))
            promise = obj_serv.update(SYSTEM_USER, ORDER_OBJECT_NAME, order_id, save_data)
            result = yield promise
            data = MongoObjectJSONEncoder().encode({"error": result.get("err"),  "n":result.get("n"), "ok": result.get("ok"), "updatedExisting": result.get("updatedExisting")})
            logging.debug(data)
            self.redirect(ORDER_COMPLETE_URL)
        else:
            self.redirect(ORDER_FAILEDE_URL)
예제 #6
0
    def delete(self, object_path):
        params = object_path.split('/')
        params = list(filter(len, params))
        object_name = params[0]
        id = params[1]

        obj_serv = self.settings['object_service']

        preprocessor_list = obj_serv.get_operation_preprocessor(
            object_name, AccessType.DELETE)
        for preprocessor in preprocessor_list:
            yield preprocessor(obj_serv, object_name, None, AccessType.DELETE)

        processor = None
        processor_list = obj_serv.get_operation_processor(
            object_name, AccessType.DELETE)
        assert isinstance(processor_list, list)

        if processor_list and len(processor_list) == 1:
            processor = processor_list[0]
        else:
            if len(processor_list) > 1:
                logging.critical(
                    "More than one DELETE processor found for object {}.".
                    format(object_name))
                raise ValueError(
                    "More than one DELETE processor found for object {}.".
                    format(object_name))

        if processor:
            promise = processor(self.current_user,
                                obj_serv,
                                object_name,
                                None,
                                AccessType.DELETE,
                                id=id)
        else:
            promise = obj_serv.delete(self.current_user, object_name, id)
        result = yield promise

        data = MongoObjectJSONEncoder().encode({
            "error": result.get("err"),
            "n": result.get("n"),
            "ok": result.get("ok")
        })

        post_processor_list = obj_serv.get_operation_postprocessor(
            object_name, AccessType.DELETE)
        for post_processor in post_processor_list:
            yield post_processor(obj_serv, object_name, result,
                                 AccessType.DELETE)

        self.write(data)
        self.finish()
예제 #7
0
    def get(self, object_name):
        """
        Example:
        /search/cosmos.pages/?q=%22test%22&filter={%22type%22:%22page%22}&columns=title,createtime
        :param object_name:name of the object to search
        """

        #TODO: Unify with get service- just add the q parameter to the get

        q = self.get_argument("q", None, True)

        columns_str = self.get_argument("columns", None)
        filter_str = self.get_argument("filter", None)

        if filter_str:
            query = json.loads(filter_str)
        else:
            query = None

        if columns_str:
            columns = columns_str.split(',')
            columns = [column.strip() for column in columns]
        else:
            columns = []

        result_list = []

        if q:
            if query:
                query['$text'] = {'$search': q}
            else:
                query = {'$text': {'$search': q}}

            obj_serv = self.settings['object_service']

            cursor = obj_serv.text_search(self.current_user, object_name,
                                          query, columns)

            #TODO: use to_list to create list
            while (yield cursor.fetch_next):
                qry_result = cursor.next_object()
                result_list.append(qry_result)

        data = {
            "_d": MongoObjectJSONEncoder().encode(result_list),
            "_cosmos_service_array_result_": True
        }

        self.content_type = 'application/json'
        self.write(data)
        self.finish()
예제 #8
0
    def put(self, object_path):
        params = object_path.split('/')
        params = list(filter(len, params))
        object_name = params[0]

        if not object_name or len(object_name) < 1:
            raise tornado.web.HTTPError(404, "Not found")

        object_full_name = object_name

        file_id = None
        if len(params) == 2:
            file_id = params[1]
        else:
            raise tornado.web.HTTPError(400, "File id required")

        if not file_id or len(file_id) < 1:
            raise tornado.web.HTTPError(400, "File id required")

        obj_serv = self.settings['object_service']

        preprocessor_list = obj_serv.get_operation_preprocessor(
            object_full_name, AccessType.UPDATE)
        for preprocessor in preprocessor_list:
            yield preprocessor(object_full_name, None, AccessType.UPDATE)

        files = self.request.files["uploadedfile"]

        if (not files) or len(files) != 1:
            raise tornado.web.HTTPError(
                400, "Exactly one file should be uploaded to update a file.")

        uploaded_file = files[0]

        promise = obj_serv.save_file(self.current_user, object_full_name,
                                     uploaded_file, file_id)
        result = yield promise

        post_processor_list = obj_serv.get_operation_postprocessor(
            object_full_name, AccessType.UPDATE)
        for post_processor in post_processor_list:
            yield post_processor(obj_serv, object_full_name, None,
                                 AccessType.UPDATE)

        self.write(MongoObjectJSONEncoder().encode(result))
        self.finish()
예제 #9
0
    def post(self, object_path):
        params = object_path.split('/')
        params = list(filter(len, params))
        object_name = params[0]

        object_full_name = object_name
        files = self.request.files["uploadedfile"]

        obj_serv = self.settings['object_service']

        result_list = []
        for file in files:
            preprocessor_list = obj_serv.get_operation_preprocessor(
                object_full_name, AccessType.INSERT)
            for preprocessor in preprocessor_list:
                yield preprocessor(obj_serv, object_full_name, file,
                                   AccessType.INSERT)

            promise = obj_serv.save_file(self.current_user, object_full_name,
                                         file)
            result = yield promise

            result_list.append(result)

            post_processor_list = obj_serv.get_operation_postprocessor(
                object_full_name, AccessType.INSERT)
            for post_processor in post_processor_list:
                yield post_processor(obj_serv, object_full_name, result,
                                     AccessType.INSERT)

        data = {
            "_d": MongoObjectJSONEncoder().encode(result_list),
            "_cosmos_service_array_result_": True
        }

        self.write(data)
        self.finish()
예제 #10
0
 def set_current_user(self, user):
     json_user = MongoObjectJSONEncoder().encode(user)
     self.set_secure_cookie(USER_COOKIE_NAME, json_user)
     encoded_json = base64.b64encode(json_user.encode("utf-8"))
     self.set_cookie(USER_PLAINTEXT_COOKIE_NAME, encoded_json)
예제 #11
0
    def test_application_import_works(self):
        cookies = self.admin_login()

        app_def = self._create_application_def_object()
        mf = io.BytesIO()

        with zipfile.ZipFile(mf, mode='w',
                             compression=zipfile.ZIP_DEFLATED) as archive_file:
            archive_file.writestr(COSMOS_APPLICATION_FILE_NAME,
                                  MongoObjectJSONEncoder().encode(app_def))

            bootstrap_objects = []
            file_objects_data = []
            source_file_config = []

            obj_defs = self._create_objectmap_objects(app_def)

            for obj in obj_defs:
                object_name = obj["name"]
                dt = {"object": object_name, "data": [obj]}
                bootstrap_objects.append(dt)

            content_type = "cosmos/source"
            file_content = "coolvalue=128374972361487"
            collection_name = COSMOS_SOURCE_MODULES_OBJECT_NAME
            filename = "source.py"
            file_def = self._save_gridfs_file(cookies, collection_name,
                                              filename, file_content,
                                              content_type)
            file_id = file_def["file_id"]

            source_module_def = self._create_source_moduls_objects(
                app_def, file_id)

            bootstrap_objects.append({
                "object": COSMOS_SOURCE_MODULES_OBJECT_NAME,
                "data": [source_module_def["data"]]
            })

            pkg_config = {
                "exporttime":
                str(datetime.datetime.utcnow()),
                "archive_version":
                COSMOS_CURRENT_ARCHIVE_VERSION,
                "settings": [{
                    "name": "bootstrap_objects",
                    "value": bootstrap_objects
                }, {
                    "name": "file_objects",
                    "value": file_objects_data
                }, {
                    "name": "source_files",
                    "directory": COSMOS_SOURCE_FILE_ROOT_NAME,
                    "value": source_file_config
                }]
            }

            archive_file.writestr(COSMOS_OBJECT_DATA_FILE_NAME,
                                  MongoObjectJSONEncoder().encode(pkg_config))

            archive_file.close()

        package_data = mf.getvalue()
        self._import_package(cookies, package_data)

        for obj_def in bootstrap_objects:
            object_name = obj_def["object"]
            expected_data = obj_def["data"][0]
            _id = expected_data["_id"]
            found_obj = self._get_object(cookies, object_name, _id)
            self.failUnlessEqual(found_obj["name"], expected_data["name"])

            #cleanup
            self._delete_object(cookies, object_name, _id)

        # Check the source file was imported properly
        url = self.gridfs_url + COSMOS_SOURCE_MODULES_OBJECT_NAME + "/" + file_id + '/'
        download_response = requests.get(url, cookies=cookies)

        self.failUnlessEqual(download_response.status_code, 200)
        self.failUnlessEquals(
            download_response.text, file_content,
            "file content of downloaded file must match uploaded file content")
        self.failUnlessEquals(
            download_response.headers.get("Content-Type"), content_type,
            "content of uploaded and downloaded files must match")

        #delete source file
        requests.delete(url, cookies=cookies)
예제 #12
0
    def get(self, application_id):

        object_service = self.settings['object_service']

        query = {"id": application_id}

        app_cursor = object_service.find(self.current_user,
                                         COSMOS_APPLICATION_OBJECT_NAME, query,
                                         [])

        if (yield app_cursor.fetch_next):
            application = app_cursor.next_object()
        else:
            raise tornado.web.HTTPError(404, "Application not found")

        mf = io.BytesIO()

        with zipfile.ZipFile(mf, mode='w',
                             compression=zipfile.ZIP_DEFLATED) as zf:

            zf.writestr(COSMOS_APPLICATION_FILE_NAME,
                        MongoObjectJSONEncoder().encode(application))

            settings = application.get("settings")
            if settings:
                object_settings = settings.get("objects")
                object_map = settings.get("objectmap")
                object_settings = self.make_object_settings(
                    object_map, object_settings)

                # Package object data
                if object_settings:
                    bootstrap_objects = yield self.load_bootstrap_objects(
                        application_id, object_settings)
                else:
                    bootstrap_objects = []

                file_objects_data = []

                # Package grid files
                file_settings = settings.get("file_objects")
                if not file_settings:
                    file_settings = []

                source_modules = None
                for bootstrap_object in bootstrap_objects:
                    if bootstrap_object[
                            "object"] == COSMOS_SOURCE_MODULES_OBJECT_NAME:
                        source_modules = bootstrap_object["data"]

                if source_modules:
                    for source_module in source_modules:
                        if "gridfile" == source_module.get("type"):
                            file_id = source_module.get("file_id")
                            file_name = source_module.get("filename")
                            if file_id:
                                yield self.load_grid_file(
                                    zf, object_service, {
                                        "file_id":
                                        file_id,
                                        "filename":
                                        file_name,
                                        "collection_name":
                                        COSMOS_SOURCE_MODULES_OBJECT_NAME
                                    })

                if file_settings and len(file_settings) > 0:
                    file_objects_data = yield self.load_grid_file_objects(
                        zf, object_service, file_settings)

                # Package source files from disk
                source_setttings = settings.get("source_code")
                source_file_config = []

                source_root = self.settings.get('source_root')
                if source_setttings:
                    source_file_config = self.load_disk_source_files(
                        zf, source_root, source_setttings)

                application_cab = MongoObjectJSONEncoder().encode({
                    "exporttime":
                    str(datetime.datetime.utcnow()),
                    "archive_version":
                    COSMOS_CURRENT_ARCHIVE_VERSION,
                    "settings": [{
                        "name": "bootstrap_objects",
                        "value": bootstrap_objects
                    }, {
                        "name": "file_objects",
                        "value": file_objects_data
                    }, {
                        "name": "source_files",
                        "directory": zip_file_root,
                        "value": source_file_config
                    }]
                })

                zf.writestr(COSMOS_OBJECT_DATA_FILE_NAME, application_cab)

        self.set_header("Content-Type", "application/zip")
        self.set_header("content-disposition",
                        "attachment; filename='" + application_id + ".xapp'")
        self.write(mf.getvalue())
예제 #13
0
    def get(self, object_path):
        params = object_path.split('/')
        params = list(filter(len, params))
        if len(params) < 1 or len(params) > 2:
            raise tornado.web.HTTPError(404, "Not found")

        object_name = params[0]

        if not object_name:
            raise tornado.web.HTTPError(404, "Not found")

        object_full_name = object_name

        id = None
        if len(params) == 2:
            id = params[1]

        obj_serv = self.settings['object_service']

        preprocessor_list = obj_serv.get_operation_preprocessor(
            object_full_name, AccessType.READ)
        for preprocessor in preprocessor_list:
            yield preprocessor(obj_serv, object_full_name, id, AccessType.READ)

        result = None
        if id and len(id) > 0:
            promise = obj_serv.load_file(self.current_user, object_full_name,
                                         id)
            result = yield promise

            self.write(result.get("body"))
            content_type = result.get("content_type")
            if content_type:
                self.set_header("Content-Type", content_type)
        else:
            list_allowed = self.settings.get("directory_listing_allowed")
            if list_allowed:
                promise = obj_serv.list_file(self.current_user,
                                             object_full_name)
                result = yield promise
                data = {
                    "_d": MongoObjectJSONEncoder().encode(result),
                    "_cosmos_service_array_result_": True
                }

                self.write(json.dumps(data))
            else:
                raise tornado.web.HTTPError(403,
                                            "Directory listing forbidden.")
                """
                self.write('''
                <form enctype="multipart/form-data" method="POST">
                    File tu upload: <input name="uploadedfile" type="file" /><br />
                    <input type="submit" value="Upload File" />
                </form>''')
                """

        post_processor_list = obj_serv.get_operation_postprocessor(
            object_full_name, AccessType.READ)
        for post_processor in post_processor_list:
            yield post_processor(obj_serv, object_full_name, result,
                                 AccessType.READ)

        self.finish()
예제 #14
0
    def put(self, object_path):
        params = object_path.split('/')
        params = list(filter(len, params))
        object_name = params[0]
        id = params[1]
        try:
            data = json.loads(self.request.body.decode("utf-8"))
            assert isinstance(data, dict)
        except ValueError as ve:
            raise tornado.web.HTTPError(400, ve.message)

        self.clean_data(data)

        obj_serv = self.settings['object_service']

        data['modifytime'] = str(datetime.datetime.now())

        preprocessor_list = obj_serv.get_operation_preprocessor(
            object_name, AccessType.UPDATE)

        for preprocessor in preprocessor_list:
            yield preprocessor(obj_serv, object_name, data, AccessType.UPDATE)

        processor = None
        processor_list = obj_serv.get_operation_processor(
            object_name, AccessType.UPDATE)
        assert isinstance(processor_list, list)

        if processor_list and len(processor_list) == 1:
            processor = processor_list[0]
        else:
            if len(processor_list) > 1:
                logging.critical(
                    "More than one UPDATE processor found for object {}.".
                    format(object_name))
                raise ValueError(
                    "More than one UPDATE processor found for object {}.".
                    format(object_name))

        if processor:
            promise = processor(self.current_user,
                                obj_serv,
                                object_name,
                                data,
                                AccessType.UPDATE,
                                id=id)
        else:
            promise = obj_serv.update(self.current_user, object_name, id, data)

        result = yield promise
        data = MongoObjectJSONEncoder().encode({
            "error":
            result.get("err"),
            "n":
            result.get("n"),
            "ok":
            result.get("ok"),
            "updatedExisting":
            result.get("updatedExisting")
        })

        post_processor_list = obj_serv.get_operation_postprocessor(
            object_name, AccessType.UPDATE)
        for post_processor in post_processor_list:
            yield post_processor(obj_serv, object_name, result,
                                 AccessType.UPDATE)

        self.write(data)
        self.finish()