def app_delete_resource( blockchain_id, app_domain, res_name, app_config=None, data_privkey=None, proxy=None, wallet_keys=None, config_path=CONFIG_PATH ): """ Remove data from a named application resource in mutable storage. data_privkey should be the publisher's private key name should be a blockchain ID that points to the public key if app_config is not None, then the driver hints will be honored. Return {'status': True, 'version': ...} on success Return {'error': ...} on error """ proxy = get_default_proxy() if proxy is None else proxy res_data_id = '{}/{}'.format(app_domain, res_name) driver_hints = None if app_config is not None: # use driver hints driver_hints = app_config['driver_hints'] res = data.delete_mutable(res_data_id, blockchain_id=blockchain_id, data_privkey=data_privkey, proxy=proxy, storage_drivers=driver_hints, wallet_keys=wallet_keys, config_path=config_path, fully_qualified_data_id=True) if 'error' in res: log.error("Failed to delete resource {}: {}".format(res_data_id, res['error'])) return {'error': 'Failed to delete resource'} return {'status': True}
def app_delete_resource(blockchain_id, app_domain, res_name, app_config=None, data_privkey=None, proxy=None, wallet_keys=None, config_path=CONFIG_PATH): """ Remove data from a named application resource in mutable storage. data_privkey should be the publisher's private key name should be a blockchain ID that points to the public key if app_config is not None, then the driver hints will be honored. Return {'status': True, 'version': ...} on success Return {'error': ...} on error """ if data_privkey is None: assert wallet_keys, "No data private key or wallet given" data_privkey = wallet_keys.get('data_privkey', None) assert data_privkey, "Wallet does not contain a data private key" data_pubkey = get_pubkey_hex(data_privkey) proxy = get_default_proxy() if proxy is None else proxy res_data_id = storage.make_fq_data_id(app_domain, res_name) driver_hints = None if app_config is not None: # use driver hints driver_hints = app_config['driver_hints'] tombstone = storage.make_data_tombstone(res_data_id) signed_tombstone = storage.sign_data_tombstone(res_data_id, data_privkey) res = data.delete_mutable(res_data_id, [signed_tombstone], proxy=proxy, storage_drivers=driver_hints, blockchain_id=blockchain_id, is_fq_data_id=True, config_path=config_path) if 'error' in res: log.error("Failed to delete resource {}: {}".format( res_data_id, res['error'])) return {'error': 'Failed to delete resource'} return {'status': True}
def app_delete_resource( blockchain_id, app_domain, res_name, app_config=None, data_privkey=None, proxy=None, wallet_keys=None, config_path=CONFIG_PATH ): """ Remove data from a named application resource in mutable storage. data_privkey should be the publisher's private key name should be a blockchain ID that points to the public key if app_config is not None, then the driver hints will be honored. Return {'status': True, 'version': ...} on success Return {'error': ...} on error """ if data_privkey is None: assert wallet_keys, "No data private key or wallet given" data_privkey = wallet_keys.get('data_privkey', None) assert data_privkey, "Wallet does not contain a data private key" data_pubkey = get_pubkey_hex(data_privkey) proxy = get_default_proxy() if proxy is None else proxy res_data_id = storage.make_fq_data_id(app_domain, res_name) driver_hints = None if app_config is not None: # use driver hints driver_hints = app_config['driver_hints'] tombstone = storage.make_data_tombstone(res_data_id) signed_tombstone = storage.sign_data_tombstone(res_data_id, data_privkey) res = data.delete_mutable(res_data_id, [signed_tombstone], proxy=proxy, storage_drivers=driver_hints, blockchain_id=blockchain_id, is_fq_data_id=True, config_path=config_path) if 'error' in res: log.error("Failed to delete resource {}: {}".format(res_data_id, res['error'])) return {'error': 'Failed to delete resource'} return {'status': True}
def app_unpublish( blockchain_id, app_domain, force=False, data_privkey=None, app_config=None, wallet_keys=None, proxy=None, config_path=CONFIG_PATH ): """ Unpublish an application Deletes its config and index. Does NOT delete its resources. Does NOT delete user data. if force is True, then we will try to delete the app state even if we can't load the app config WARNING: force can be dangerous, since it can delete data via drivers that were never meant for this app. Use with caution! Return {'status': True, 'app_config': ..., 'retry': ...} on success. If retry is True, then retry this method with the given app_config Return {'error': ...} on error """ proxy = get_default_proxy() if proxy is None else proxy # find out where to delete from data_pubkey = None if data_privkey is not None: data_pubkey = get_pubkey_hex(str(data_privkey)) if app_config is None: app_config = app_get_config(blockchain_id, app_domain, data_pubkey=data_pubkey, proxy=proxy, config_path=CONFIG_PATH ) if 'error' in app_config: if not force: log.error("Failed to load app config for {}'s {}".format(blockchain_id, app_domain)) return {'error': 'Failed to load app config'} else: # keep going app_config = None log.warning("Failed to load app config, but proceeding at caller request") config_data_id = storage.make_fq_data_id(app_domain, '.blockstack') index_data_id = storage.make_fq_data_id(app_domain, 'index.html') storage_drivers = None if app_config is not None: # only use the ones we have to urls = user_db.urls_from_uris(app_config['index_uris']) driver_names = [] for url in urls: drivers = storage.get_drivers_for_url(url) driver_names += [d.__name__ for d in drivers] storage_drivers = list(set(driver_names)) ret = {} # delete the index index_tombstone = storage.make_data_tombstone(index_data_id) signed_index_tombstone = storage.sign_data_tombstone(index_data_id, data_privkey) res = data.delete_mutable(index_data_id, [signed_index_tombstone], proxy=proxy, storage_drivers=storage_drivers, blockchain_id=blockchain_id, is_fq_data_id=True, config_path=config_path) if 'error' in res: log.warning("Failed to delete index file {}".format(index_data_id)) ret['app_config'] = app_config ret['retry'] = True # delete the config config_tombstone = storage.make_data_tombstone(config_data_id) signed_config_tombstone = storage.sign_data_tombstone(config_data_id, data_privkey) res = data.delete_mutable(config_data_id, [signed_config_tombstone], proxy=proxy, blockchain_id=blockchain_id, is_fq_data_id=True, config_path=config_path) if 'error' in res: log.warning("Failed to delete config file {}".format(config_data_id)) if not ret.has_key('app_config'): ret['app_config'] = app_config ret['retry'] = True ret['status'] = True return ret
def app_unpublish(blockchain_id, app_domain, force=False, data_privkey=None, app_config=None, wallet_keys=None, proxy=None, config_path=CONFIG_PATH): """ Unpublish an application Deletes its config and index. Does NOT delete its resources. Does NOT delete user data. if force is True, then we will try to delete the app state even if we can't load the app config WARNING: force can be dangerous, since it can delete data via drivers that were never meant for this app. Use with caution! Return {'status': True, 'app_config': ..., 'retry': ...} on success. If retry is True, then retry this method with the given app_config Return {'error': ...} on error """ proxy = get_default_proxy() if proxy is None else proxy # find out where to delete from data_pubkey = None if data_privkey is not None: data_pubkey = get_pubkey_hex(str(data_privkey)) if app_config is None: app_config = app_get_config(blockchain_id, app_domain, data_pubkey=data_pubkey, proxy=proxy, config_path=CONFIG_PATH) if 'error' in app_config: if not force: log.error("Failed to load app config for {}'s {}".format( blockchain_id, app_domain)) return {'error': 'Failed to load app config'} else: # keep going app_config = None log.warning( "Failed to load app config, but proceeding at caller request" ) config_data_id = storage.make_fq_data_id(app_domain, '.blockstack') index_data_id = storage.make_fq_data_id(app_domain, 'index.html') storage_drivers = None if app_config is not None: # only use the ones we have to urls = user_db.urls_from_uris(app_config['index_uris']) driver_names = [] for url in urls: drivers = storage.get_drivers_for_url(url) driver_names += [d.__name__ for d in drivers] storage_drivers = list(set(driver_names)) ret = {} # delete the index index_tombstone = storage.make_data_tombstone(index_data_id) signed_index_tombstone = storage.sign_data_tombstone( index_data_id, data_privkey) res = data.delete_mutable(index_data_id, [signed_index_tombstone], proxy=proxy, storage_drivers=storage_drivers, blockchain_id=blockchain_id, is_fq_data_id=True, config_path=config_path) if 'error' in res: log.warning("Failed to delete index file {}".format(index_data_id)) ret['app_config'] = app_config ret['retry'] = True # delete the config config_tombstone = storage.make_data_tombstone(config_data_id) signed_config_tombstone = storage.sign_data_tombstone( config_data_id, data_privkey) res = data.delete_mutable(config_data_id, [signed_config_tombstone], proxy=proxy, blockchain_id=blockchain_id, is_fq_data_id=True, config_path=config_path) if 'error' in res: log.warning("Failed to delete config file {}".format(config_data_id)) if not ret.has_key('app_config'): ret['app_config'] = app_config ret['retry'] = True ret['status'] = True return ret