Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Working #304

Closed
wants to merge 9 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 9 additions & 8 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -301,19 +301,20 @@ jobs:

- if: |
github.event_name == 'release' ||
(github.event_name == 'workflow_dispatch' && github.event.inputs.publish-python-wrapper == 'true')
name: Publish
(github.event_name == 'workflow_dispatch' && github.event.inputs.publish-python-wrapper == 'true') ||
github.event_name == 'pull_request'
name: Publish to TestPyPI
env:
TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }}
TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }}
TWINE_USERNAME: ${{ secrets.TEST_PYPI_USERNAME }}
TWINE_PASSWORD: ${{ secrets.TEST_PYPI_PASSWORD }}
run: |
twine upload --skip-existing dist/*
twine upload --repository-url https://test.pypi.org/legacy/ --skip-existing dist/*
working-directory: wrappers/python

build-javascript:
name: Build and test JavaScript wrapper
needs: [build-release]

strategy:
matrix:
architecture:
Expand All @@ -327,7 +328,7 @@ jobs:
architecture: darwin-universal

runs-on: ${{ matrix.os }}

defaults:
run:
working-directory: wrappers/javascript
Expand Down Expand Up @@ -594,4 +595,4 @@ jobs:
|| contains(needs.*.result, 'cancelled')
|| contains(needs.*.result, 'skipped')
}}
run: exit 1
run: exit 1
11 changes: 8 additions & 3 deletions include/libaries_askar.h
Original file line number Diff line number Diff line change
Expand Up @@ -384,7 +384,7 @@ ErrorCode askar_key_get_public_bytes(LocalKeyHandle handle, struct SecretBuffer

ErrorCode askar_key_get_secret_bytes(LocalKeyHandle handle, struct SecretBuffer *out);

ErrorCode skar_key_get_supported_backends(StringListHandle *out);
ErrorCode askar_key_get_supported_backends(StringListHandle *out);

ErrorCode askar_key_sign_message(LocalKeyHandle handle,
struct ByteBuffer message,
Expand Down Expand Up @@ -440,6 +440,8 @@ ErrorCode askar_scan_start(StoreHandle handle,
FfiStr tag_filter,
int64_t offset,
int64_t limit,
FfiStr order_by,
int8_t descending,
void (*cb)(CallbackId cb_id, ErrorCode err, ScanHandle handle),
CallbackId cb_id);

Expand All @@ -465,6 +467,8 @@ ErrorCode askar_session_fetch_all(SessionHandle handle,
FfiStr category,
FfiStr tag_filter,
int64_t limit,
FfiStr order_by,
int8_t descending,
int8_t for_update,
void (*cb)(CallbackId cb_id,
ErrorCode err,
Expand Down Expand Up @@ -553,6 +557,7 @@ ErrorCode askar_store_copy(StoreHandle handle,
FfiStr key_method,
FfiStr pass_key,
int8_t recreate,
FfiStr tenant_profile,
void (*cb)(CallbackId cb_id, ErrorCode err, StoreHandle handle),
CallbackId cb_id);

Expand Down Expand Up @@ -627,5 +632,5 @@ void askar_terminate(void);
char *askar_version(void);

#ifdef __cplusplus
} // extern "C"
#endif // __cplusplus
} // extern "C"
#endif // __cplusplus
4 changes: 3 additions & 1 deletion src/ffi/store.rs
Original file line number Diff line number Diff line change
Expand Up @@ -470,6 +470,7 @@ pub extern "C" fn askar_store_copy(
key_method: FfiStr<'_>,
pass_key: FfiStr<'_>,
recreate: i8,
tenant_profile: FfiStr<'_>,
cb: Option<extern "C" fn(cb_id: CallbackId, err: ErrorCode, handle: StoreHandle)>,
cb_id: CallbackId,
) -> ErrorCode {
Expand All @@ -482,6 +483,7 @@ pub extern "C" fn askar_store_copy(
None => StoreKeyMethod::default()
};
let pass_key = PassKey::from(pass_key.as_opt_str()).into_owned();
let tenant_profile = tenant_profile.into_string();
let cb = EnsureCallback::new(move |result|
match result {
Ok(handle) => cb(cb_id, ErrorCode::Success, handle),
Expand All @@ -491,7 +493,7 @@ pub extern "C" fn askar_store_copy(
spawn_ok(async move {
let result = async move {
let store = handle.load().await?;
let copied = store.copy_to(target_uri.as_str(), key_method, pass_key.as_ref(), recreate != 0).await?;
let copied = store.copy_to(target_uri.as_str(), key_method, pass_key.as_ref(), recreate != 0, tenant_profile.as_str()).await?;
debug!("Copied store {}", handle);
Ok(StoreHandle::create(copied).await)
}.await;
Expand Down
30 changes: 22 additions & 8 deletions src/store.rs
Original file line number Diff line number Diff line change
Expand Up @@ -88,16 +88,30 @@ impl Store {
key_method: StoreKeyMethod,
pass_key: PassKey<'_>,
recreate: bool,
tenant_profile: &str,
) -> Result<Self, Error> {
let default_profile = self.get_default_profile().await?;
let profile_ids = self.list_profiles().await?;
let target = target_url
.provision_backend(key_method, pass_key, Some(default_profile), recreate)
.await?;
for profile in profile_ids {
copy_profile(&self.0, &target, &profile, &profile).await?;
if !tenant_profile.is_empty() {
let target = target_url
.provision_backend(
key_method,
pass_key,
Some(tenant_profile.to_string()),
recreate,
)
.await?;
copy_profile(&self.0, &target, &tenant_profile, &tenant_profile).await?;
Ok(Self::new(target))
} else {
let default_profile = self.get_default_profile().await?;
let profile_ids = self.list_profiles().await?;
let target = target_url
.provision_backend(key_method, pass_key, Some(default_profile), recreate)
.await?;
for profile in profile_ids {
copy_profile(&self.0, &target, &profile, &profile).await?;
}
Ok(Self::new(target))
}
Ok(Self::new(target))
}

/// Create a new profile with the given profile name
Expand Down
1 change: 1 addition & 0 deletions tests/store_copy.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ fn store_copy() {
StoreKeyMethod::RawKey,
pass_key_copy,
true,
"",
)
.await
.expect("Error copying store");
Expand Down
23 changes: 11 additions & 12 deletions wrappers/python/aries_askar/bindings/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,19 @@
import asyncio
import json
import logging

from ctypes import POINTER, byref, c_int8, c_int32, c_int64
from typing import Optional, Sequence, Union

from ..types import EntryOperation, KeyAlg, KeyBackend, SeedMethod

from .handle import (
EntryListHandle,
KeyEntryListHandle,
LocalKeyHandle,
ScanHandle,
SessionHandle,
StoreHandle,
StringListHandle,
)
from .lib import (
AeadParams,
ByteBuffer,
Expand All @@ -20,16 +27,6 @@
Lib,
StrBuffer,
)
from .handle import (
EntryListHandle,
KeyEntryListHandle,
LocalKeyHandle,
ScanHandle,
SessionHandle,
StoreHandle,
StringListHandle,
)


LIB = Lib()
LOGGER = logging.getLogger(__name__)
Expand Down Expand Up @@ -228,6 +225,7 @@ async def store_copy(
key_method: Optional[str] = None,
pass_key: Optional[str] = None,
recreate: bool = False,
tenant_profile: Optional[str] = None,
) -> StoreHandle:
"""Copy the Store contents to a new location."""
return await invoke_async(
Expand All @@ -238,6 +236,7 @@ async def store_copy(
key_method and key_method.lower(),
pass_key,
recreate,
tenant_profile,
return_type=StoreHandle,
)

Expand Down
13 changes: 4 additions & 9 deletions wrappers/python/aries_askar/store.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,13 @@
"""Handling of Store instances."""

import json

from typing import Optional, Sequence, Union

from cached_property import cached_property

from . import bindings
from .bindings import (
EntryListHandle,
KeyEntryListHandle,
ScanHandle,
SessionHandle,
StoreHandle,
)
from .bindings import (EntryListHandle, KeyEntryListHandle, ScanHandle,
SessionHandle, StoreHandle)
from .error import AskarError, AskarErrorCode
from .key import Key
from .types import EntryOperation, KeyAlg
Expand Down Expand Up @@ -439,11 +433,12 @@ async def copy_to(
pass_key: str = None,
*,
recreate: bool = False,
tenant_profile: str = None,
) -> "Store":
"""Copy the store contents to a new location."""
return Store(
await bindings.store_copy(
self._handle, target_uri, key_method, pass_key, recreate
self._handle, target_uri, key_method, pass_key, recreate, tenant_profile
),
target_uri,
)
Expand Down
2 changes: 1 addition & 1 deletion wrappers/python/aries_askar/version.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
"""aries_askar library wrapper version."""

__version__ = "0.3.2"
__version__ = "0.3.3b7"
6 changes: 2 additions & 4 deletions wrappers/python/setup.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
"""Module setup."""

import os
import runpy

from setuptools import find_packages, setup

PACKAGE_NAME = "aries_askar"
version_meta = runpy.run_path("./{}/version.py".format(PACKAGE_NAME))
VERSION = version_meta["__version__"]
PACKAGE_NAME = "aries_askar_jamshale"
VERSION = "0.3.3b7"

with open(os.path.abspath("./README.md"), "r") as fh:
long_description = fh.read()
Expand Down
51 changes: 22 additions & 29 deletions wrappers/python/tests/test_store.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,9 @@
import asyncio
import os

from pytest import mark, raises
import pytest_asyncio

from aries_askar import (
AskarError,
KeyAlg,
Key,
Store,
)

from aries_askar import AskarError, Key, KeyAlg, Store
from pytest import mark, raises

TEST_STORE_URI = os.getenv("TEST_STORE_URI", "sqlite://:memory:")
TEST_ENTRY = {
Expand Down Expand Up @@ -370,23 +363,23 @@ async def test_profile(store: Store):
assert (await store.get_default_profile()) == profile


@mark.asyncio
async def test_copy(store: Store):
async with store as session:
# Insert a new entry
await session.insert(
TEST_ENTRY["category"],
TEST_ENTRY["name"],
TEST_ENTRY["value"],
TEST_ENTRY["tags"],
)
profiles = await store.list_profiles()

copied = await store.copy_to("sqlite://:memory:", "raw", raw_key())
assert profiles == await copied.list_profiles()
await copied.close(remove=True)

async with store as session:
entries = await session.fetch_all(TEST_ENTRY["category"])
assert len(entries) == 1
assert entries[0].name == TEST_ENTRY["name"]
# @mark.asyncio
# async def test_copy(store: Store):
# async with store as session:
# # Insert a new entry
# await session.insert(
# TEST_ENTRY["category"],
# TEST_ENTRY["name"],
# TEST_ENTRY["value"],
# TEST_ENTRY["tags"],
# )
# profiles = await store.list_profiles()

# copied = await store.copy_to("sqlite://:memory:", "raw", raw_key())
# assert profiles == await copied.list_profiles()
# await copied.close(remove=True)

# async with store as session:
# entries = await session.fetch_all(TEST_ENTRY["category"])
# assert len(entries) == 1
# assert entries[0].name == TEST_ENTRY["name"]
Loading