From b3bb6b8f8a473007339364cfa35c781b066f13cc Mon Sep 17 00:00:00 2001 From: IonesioJunior Date: Tue, 16 Jul 2024 10:42:56 -0300 Subject: [PATCH 01/46] Add forgot_password/reset_password api's to User service --- .../src/syft/service/user/user_service.py | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) diff --git a/packages/syft/src/syft/service/user/user_service.py b/packages/syft/src/syft/service/user/user_service.py index fd468703190..a4e42805aa6 100644 --- a/packages/syft/src/syft/service/user/user_service.py +++ b/packages/syft/src/syft/service/user/user_service.py @@ -1,4 +1,6 @@ # stdlib +import random +import string # relative from ...abstract_server import ServerType @@ -84,6 +86,100 @@ def create( user = result.ok() return user.to(UserView) + @service_method( + path="user.forgot_password", name="forgot_password", roles=GUEST_ROLE_LEVEL + ) + def forgot_password( + self, context: AuthedServiceContext, email: str + ) -> SyftSuccess | SyftError: + result = self.stash.get_by_email(credentials=context.credentials, email=email) + + if result.is_err(): + return SyftSuccess( + message="If the email is valid, we sent a password request to the admin." + ) + + user = result.ok() + root_key = self.admin_verify_key() + root_context = AuthedServiceContext(server=context.server, credentials=root_key) + + link = LinkedObject.with_context(user, context=root_context) + + message = CreateNotification( + subject="You requested password reset.", + from_user_verify_key=root_key, + to_user_verify_key=user.verify_key, + linked_obj=link, + ) + + method = context.server.get_service_method(NotificationService.send) + result = method(context=root_context, notification=message) + + message = CreateNotification( + subject=" User requested password reset.", + from_user_verify_key=user.verify_key, + to_user_verify_key=root_key, + linked_obj=link, + ) + + result = method(context=root_context, notification=message) + return SyftSuccess( + message="If the email is valid, we sent a password request to the admin." + ) + + @service_method( + path="user.reset_password", name="reset_password", roles=ADMIN_ROLE_LEVEL + ) + def reset(self, context: AuthedServiceContext, uid: UID) -> SyftSuccess | SyftError: + """Get user for given uid""" + result = self.stash.get_by_uid(credentials=context.credentials, uid=uid) + if result.is_ok(): + user = result.ok() + if user is None: + return SyftError(message=f"No user exists for given: {uid}") + + password_length = 12 + valid_characters = string.ascii_letters + string.digits + new_password = "".join( + random.choice(valid_characters) for i in range(password_length) + ) + salt, hashed = salt_and_hash_password(new_password, password_length) + user.hashed_password = hashed + user.salt = salt + result = self.stash.update( + credentials=context.credentials, user=user, has_permission=True + ) + if result.is_err(): + return SyftError( + message=( + f"Failed to update user with UID: {uid}. Error: {str(result.err())}" + ) + ) + + # # Notification Setup + # root_key = self.admin_verify_key() + # root_context = AuthedServiceContext(server=context.server, credentials=root_key) + # link = None + # if new_user.created_by: + # link = LinkedObject.with_context(user, context=root_context) + # + # message = CreateNotification( + # subject=success_message, + # from_user_verify_key=root_key, + # to_user_verify_key=user.verify_key, + # linked_obj=link, + # notifier_types=[NOTIFIERS.EMAIL], + # email_template=OnBoardEmailTemplate, + # ) + + # method = context.server.get_service_method(NotificationService.send) + # result = method(context=root_context, notification=message) + + return SyftSuccess( + message=f"User password has been reset successfully!\n New User Password: {new_password}" + ) + return SyftError(message=str(result.err())) + @service_method(path="user.view", name="view", roles=DATA_SCIENTIST_ROLE_LEVEL) def view( self, context: AuthedServiceContext, uid: UID From 95341523d8b9a9dba0141391bde0b59119c31208 Mon Sep 17 00:00:00 2001 From: IonesioJunior Date: Tue, 16 Jul 2024 15:55:50 -0300 Subject: [PATCH 02/46] Fix Reset Password Email Template --- .../service/notification/email_templates.py | 88 +++++++++++++++++++ .../src/syft/service/user/user_service.py | 64 +++++++++++--- 2 files changed, 139 insertions(+), 13 deletions(-) diff --git a/packages/syft/src/syft/service/notification/email_templates.py b/packages/syft/src/syft/service/notification/email_templates.py index 1a6965365dc..1a2edadc4f0 100644 --- a/packages/syft/src/syft/service/notification/email_templates.py +++ b/packages/syft/src/syft/service/notification/email_templates.py @@ -1,10 +1,13 @@ # stdlib +import random +import string from typing import TYPE_CHECKING from typing import cast # relative from ...store.linked_obj import LinkedObject from ..context import AuthedServiceContext +from ..user.user import salt_and_hash_password if TYPE_CHECKING: # relative @@ -21,6 +24,91 @@ def email_body(notification: "Notification", context: AuthedServiceContext) -> s return "" +class PasswordResetTemplate(EmailTemplate): + @staticmethod + def email_title(notification: "Notification", context: AuthedServiceContext) -> str: + return "Password Reset Requested" + + @staticmethod + def email_body(notification: "Notification", context: AuthedServiceContext) -> str: + user_service = context.server.get_service("userservice") + + user = user_service.get_by_verify_key(notification.to_user_verify_key) + if not user: + raise Exception("User not found!") + + password_length = 12 + valid_characters = string.ascii_letters + string.digits + new_password = "".join( + random.choice(valid_characters) for i in range(password_length) + ) + salt, hashed = salt_and_hash_password(new_password, password_length) + user.hashed_password = hashed + user.salt = salt + + result = user_service.stash.update( + credentials=context.credentials, user=user, has_permission=True + ) + if result.is_err(): + raise Exception("Couldn't update the user password") + + head = """ + + """ + body = f""" +
+

Password Reset

+

Hello,

+

We received a request to reset your password. Your new temporary password is:

+

{new_password}

+

If you didn't request a password reset, please ignore this email.

+
+ """ + return f"""{head} {body}""" + + class OnBoardEmailTemplate(EmailTemplate): @staticmethod def email_title(notification: "Notification", context: AuthedServiceContext) -> str: diff --git a/packages/syft/src/syft/service/user/user_service.py b/packages/syft/src/syft/service/user/user_service.py index a4e42805aa6..674022062b3 100644 --- a/packages/syft/src/syft/service/user/user_service.py +++ b/packages/syft/src/syft/service/user/user_service.py @@ -19,6 +19,7 @@ from ..context import ServerServiceContext from ..context import UnauthedServiceContext from ..notification.email_templates import OnBoardEmailTemplate +from ..notification.email_templates import PasswordResetTemplate from ..notification.notification_service import CreateNotification from ..notification.notification_service import NotificationService from ..notifier.notifier_enums import NOTIFIERS @@ -93,35 +94,72 @@ def forgot_password( self, context: AuthedServiceContext, email: str ) -> SyftSuccess | SyftError: result = self.stash.get_by_email(credentials=context.credentials, email=email) - + # Isn't a valid email if result.is_err(): return SyftSuccess( message="If the email is valid, we sent a password request to the admin." ) - user = result.ok() + # Email is valid + # Notifications disabled + # We should just sent a notification to the admin/user about password reset + # Notifications Enabled + # Instead of changing the password here, we would change it in email template generation. root_key = self.admin_verify_key() root_context = AuthedServiceContext(server=context.server, credentials=root_key) - + user = result.ok() link = LinkedObject.with_context(user, context=root_context) + notifier_service = context.server.get_service("notifierservice") + # Notifier is active + notification_is_enabled = notifier_service.settings(context=root_context).active + # Email is enabled + email_is_enabled = notifier_service.settings(context=root_context).email_enabled + # User Preferences allow email notification + user_allow_email_notifications = user.notifications_enabled[NOTIFIERS.EMAIL] + + # This checks if the user will safely receive the email reset. + not_receive_emails = ( + not notification_is_enabled + or not email_is_enabled + or not user_allow_email_notifications + ) + # If notifier service is not enabled. + if not_receive_emails: + message = CreateNotification( + subject="You requested password reset.", + from_user_verify_key=root_key, + to_user_verify_key=user.verify_key, + linked_obj=link, + ) + + method = context.server.get_service_method(NotificationService.send) + result = method(context=root_context, notification=message) + + message = CreateNotification( + subject="User requested password reset.", + from_user_verify_key=user.verify_key, + to_user_verify_key=root_key, + linked_obj=link, + ) + + result = method(context=root_context, notification=message) + return SyftSuccess( + message="If the email is valid, we sent a password request to the admin." + ) + + # Email notification is Enabled + # Therefore, we can directly send a message to the user with its new password. message = CreateNotification( - subject="You requested password reset.", + subject="You requested a password reset.", from_user_verify_key=root_key, to_user_verify_key=user.verify_key, linked_obj=link, + notifier_types=[NOTIFIERS.EMAIL], + email_template=PasswordResetTemplate, ) method = context.server.get_service_method(NotificationService.send) - result = method(context=root_context, notification=message) - - message = CreateNotification( - subject=" User requested password reset.", - from_user_verify_key=user.verify_key, - to_user_verify_key=root_key, - linked_obj=link, - ) - result = method(context=root_context, notification=message) return SyftSuccess( message="If the email is valid, we sent a password request to the admin." From 654930b06451d3aa043c7287596ff32e513e05bd Mon Sep 17 00:00:00 2001 From: IonesioJunior Date: Tue, 16 Jul 2024 16:40:54 -0300 Subject: [PATCH 03/46] Replace random by secrets --- .../syft/src/syft/service/notification/email_templates.py | 4 ++-- packages/syft/src/syft/service/user/user_service.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/syft/src/syft/service/notification/email_templates.py b/packages/syft/src/syft/service/notification/email_templates.py index 1a2edadc4f0..9e32decf44a 100644 --- a/packages/syft/src/syft/service/notification/email_templates.py +++ b/packages/syft/src/syft/service/notification/email_templates.py @@ -1,5 +1,5 @@ # stdlib -import random +import secrets import string from typing import TYPE_CHECKING from typing import cast @@ -40,7 +40,7 @@ def email_body(notification: "Notification", context: AuthedServiceContext) -> s password_length = 12 valid_characters = string.ascii_letters + string.digits new_password = "".join( - random.choice(valid_characters) for i in range(password_length) + secrets.choice(valid_characters) for i in range(password_length) ) salt, hashed = salt_and_hash_password(new_password, password_length) user.hashed_password = hashed diff --git a/packages/syft/src/syft/service/user/user_service.py b/packages/syft/src/syft/service/user/user_service.py index 674022062b3..fb93b74bee8 100644 --- a/packages/syft/src/syft/service/user/user_service.py +++ b/packages/syft/src/syft/service/user/user_service.py @@ -1,6 +1,6 @@ # stdlib -import random import string +import secrets # relative from ...abstract_server import ServerType @@ -179,7 +179,7 @@ def reset(self, context: AuthedServiceContext, uid: UID) -> SyftSuccess | SyftEr password_length = 12 valid_characters = string.ascii_letters + string.digits new_password = "".join( - random.choice(valid_characters) for i in range(password_length) + secrets.choice(valid_characters) for i in range(password_length) ) salt, hashed = salt_and_hash_password(new_password, password_length) user.hashed_password = hashed From b003dcd6b05e5354c9a0618c0cc3085efaf89a46 Mon Sep 17 00:00:00 2001 From: IonesioJunior Date: Tue, 16 Jul 2024 16:51:22 -0300 Subject: [PATCH 04/46] Fix lint --- packages/syft/src/syft/service/user/user_service.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/syft/src/syft/service/user/user_service.py b/packages/syft/src/syft/service/user/user_service.py index fb93b74bee8..51822c92770 100644 --- a/packages/syft/src/syft/service/user/user_service.py +++ b/packages/syft/src/syft/service/user/user_service.py @@ -1,6 +1,6 @@ # stdlib -import string import secrets +import string # relative from ...abstract_server import ServerType From 1e134363d80bec8096a5a6f90e6399be00a8cfa3 Mon Sep 17 00:00:00 2001 From: IonesioJunior Date: Sun, 21 Jul 2024 15:46:22 -0300 Subject: [PATCH 05/46] Change password reset workflow to use temporary tokens --- .../src/syft/protocol/protocol_version.json | 16 ++ .../service/notification/email_templates.py | 19 +-- packages/syft/src/syft/service/user/user.py | 17 +- .../src/syft/service/user/user_service.py | 147 ++++++++++++------ .../syft/src/syft/service/user/user_stash.py | 7 + 5 files changed, 144 insertions(+), 62 deletions(-) diff --git a/packages/syft/src/syft/protocol/protocol_version.json b/packages/syft/src/syft/protocol/protocol_version.json index a7bb8d85399..b375a4847ae 100644 --- a/packages/syft/src/syft/protocol/protocol_version.json +++ b/packages/syft/src/syft/protocol/protocol_version.json @@ -1,5 +1,21 @@ { "1": { "release_name": "0.8.7.json" + }, + "dev": { + "object_versions": { + "User": { + "1": { + "version": 1, + "hash": "2df4b68182c558dba5485a8a6867acf2a5c341b249ad67373a504098aa8c4343", + "action": "remove" + }, + "2": { + "version": 2, + "hash": "af6fb5b2e1606e97838f4a60f0536ad95db606d455e94acbd1977df866608a2c", + "action": "add" + } + } + } } } diff --git a/packages/syft/src/syft/service/notification/email_templates.py b/packages/syft/src/syft/service/notification/email_templates.py index a4636d19476..bd65592d498 100644 --- a/packages/syft/src/syft/service/notification/email_templates.py +++ b/packages/syft/src/syft/service/notification/email_templates.py @@ -1,6 +1,5 @@ # stdlib -import secrets -import string +from datetime import datetime from typing import TYPE_CHECKING from typing import cast @@ -8,7 +7,6 @@ from ...serde.serializable import serializable from ...store.linked_obj import LinkedObject from ..context import AuthedServiceContext -from ..user.user import salt_and_hash_password if TYPE_CHECKING: # relative @@ -24,6 +22,7 @@ def email_title(notification: "Notification", context: AuthedServiceContext) -> def email_body(notification: "Notification", context: AuthedServiceContext) -> str: return "" + @serializable(canonical_name="PasswordResetTemplate", version=1) class PasswordResetTemplate(EmailTemplate): @staticmethod @@ -38,14 +37,8 @@ def email_body(notification: "Notification", context: AuthedServiceContext) -> s if not user: raise Exception("User not found!") - password_length = 12 - valid_characters = string.ascii_letters + string.digits - new_password = "".join( - secrets.choice(valid_characters) for i in range(password_length) - ) - salt, hashed = salt_and_hash_password(new_password, password_length) - user.hashed_password = hashed - user.salt = salt + user.reset_token = user_service.generate_new_password_reset_token() + user.reset_token_date = datetime.now() result = user_service.stash.update( credentials=context.credentials, user=user, has_permission=True @@ -102,8 +95,8 @@ def email_body(notification: "Notification", context: AuthedServiceContext) -> s

Password Reset

Hello,

-

We received a request to reset your password. Your new temporary password is:

-

{new_password}

+

We received a request to reset your password. Your new temporary token is:

+

{user.reset_token}

If you didn't request a password reset, please ignore this email.

""" diff --git a/packages/syft/src/syft/service/user/user.py b/packages/syft/src/syft/service/user/user.py index 383ed3c5f6a..231b4a8f00a 100644 --- a/packages/syft/src/syft/service/user/user.py +++ b/packages/syft/src/syft/service/user/user.py @@ -1,6 +1,8 @@ # stdlib from collections.abc import Callable +from datetime import datetime from getpass import getpass +import re from typing import Any # third party @@ -19,6 +21,7 @@ from ...types.syft_metaclass import Empty from ...types.syft_object import PartialSyftObject from ...types.syft_object import SYFT_OBJECT_VERSION_1 +from ...types.syft_object import SYFT_OBJECT_VERSION_2 from ...types.syft_object import SyftObject from ...types.transforms import TransformContext from ...types.transforms import drop @@ -38,7 +41,7 @@ class User(SyftObject): # version __canonical_name__ = "User" - __version__ = SYFT_OBJECT_VERSION_1 + __version__ = SYFT_OBJECT_VERSION_2 id: UID | None = None # type: ignore[assignment] @@ -61,9 +64,10 @@ class User(SyftObject): created_at: str | None = None # TODO where do we put this flag? mock_execution_permission: bool = False - + reset_token: str | None = None + reset_token_date: datetime | None = None # serde / storage rules - __attr_searchable__ = ["name", "email", "verify_key", "role"] + __attr_searchable__ = ["name", "email", "verify_key", "role", "reset_token"] __attr_unique__ = ["email", "signing_key", "verify_key"] __repr_attrs__ = ["name", "email"] @@ -72,6 +76,13 @@ def default_role(role: ServiceRole) -> Callable: return make_set_default(key="role", value=role) +def validate_password(password: str) -> bool: + # Define the regex pattern for the password + pattern = re.compile(r"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$") + + return bool(pattern.match(password)) + + def hash_password(context: TransformContext) -> TransformContext: if context.output is None: return context diff --git a/packages/syft/src/syft/service/user/user_service.py b/packages/syft/src/syft/service/user/user_service.py index 9a0b283f18b..b4395497222 100644 --- a/packages/syft/src/syft/service/user/user_service.py +++ b/packages/syft/src/syft/service/user/user_service.py @@ -1,4 +1,6 @@ # stdlib +from datetime import datetime +from datetime import timedelta import secrets import string @@ -39,6 +41,7 @@ from .user import UserViewPage from .user import check_pwd from .user import salt_and_hash_password +from .user import validate_password from .user_roles import ADMIN_ROLE_LEVEL from .user_roles import DATA_OWNER_ROLE_LEVEL from .user_roles import DATA_SCIENTIST_ROLE_LEVEL @@ -97,7 +100,15 @@ def forgot_password( # Isn't a valid email if result.is_err(): return SyftSuccess( - message="If the email is valid, we sent a password request to the admin." + message="If the email is valid, we sent a password \ + reset token to your email or a password request to the admin." + ) + user = result.ok() + + user_role = self.get_role_for_credentials(user.verify_key) + if user_role == ServiceRole.ADMIN: + return SyftError( + message="You can't request password reset for an Admin user." ) # Email is valid @@ -107,7 +118,6 @@ def forgot_password( # Instead of changing the password here, we would change it in email template generation. root_key = self.admin_verify_key() root_context = AuthedServiceContext(server=context.server, credentials=root_key) - user = result.ok() link = LinkedObject.with_context(user, context=root_context) notifier_service = context.server.get_service("notifierservice") # Notifier is active @@ -145,7 +155,8 @@ def forgot_password( result = method(context=root_context, notification=message) return SyftSuccess( - message="If the email is valid, we sent a password request to the admin." + message="If the email is valid, we sent a password reset \ + token to your email or a password request to the admin." ) # Email notification is Enabled @@ -166,57 +177,101 @@ def forgot_password( ) @service_method( - path="user.reset_password", name="reset_password", roles=ADMIN_ROLE_LEVEL + path="user.request_password_reset", + name="request_password_reset", + roles=ADMIN_ROLE_LEVEL, ) - def reset(self, context: AuthedServiceContext, uid: UID) -> SyftSuccess | SyftError: - """Get user for given uid""" + def request_password_reset( + self, context: AuthedServiceContext, uid: UID + ) -> str | SyftError: result = self.stash.get_by_uid(credentials=context.credentials, uid=uid) - if result.is_ok(): - user = result.ok() - if user is None: - return SyftError(message=f"No user exists for given: {uid}") + if result.is_err(): + return SyftError( + message=( + f"Failed to retrieve user with UID: {uid}. Error: {str(result.err())}" + ) + ) + user = result.ok() + if user is None: + return SyftError(message=f"No user exists for given: {uid}") + + user.reset_token = self.generate_new_password_reset_token() + user.reset_token_date = datetime.now() - password_length = 12 - valid_characters = string.ascii_letters + string.digits - new_password = "".join( - secrets.choice(valid_characters) for i in range(password_length) + result = self.stash.update( + credentials=context.credentials, user=user, has_permission=True + ) + if result.is_err(): + return SyftError( + message=( + f"Failed to update user with UID: {uid}. Error: {str(result.err())}" + ) ) - salt, hashed = salt_and_hash_password(new_password, password_length) - user.hashed_password = hashed - user.salt = salt - result = self.stash.update( - credentials=context.credentials, user=user, has_permission=True + + return user.reset_token + + @service_method( + path="user.reset_password", name="reset_password", roles=GUEST_ROLE_LEVEL + ) + def reset_password( + self, context: AuthedServiceContext, token: str, new_password: str + ) -> SyftSuccess | SyftError: + """Resets a certain user password using a temporary token.""" + result = self.stash.get_by_reset_token( + credentials=context.credentials, token=token + ) + invalid_token_error = SyftError( + message=("Failed to reset user password. Token is invalid or expired!") + ) + + if result.is_err(): + return SyftError(message="Failed to reset user password.") + + user = result.ok() + + # If token isn't found + if user is None: + return invalid_token_error + + now = datetime.now() + time_difference = now - user.reset_token_date + + # If token expired + if time_difference > timedelta(minutes=30): + return invalid_token_error + + if not validate_password(new_password): + return SyftError( + message="Your new password must have at least 8 \ + characters, Upper case and lower case characters\ + and at least one number." ) - if result.is_err(): - return SyftError( - message=( - f"Failed to update user with UID: {uid}. Error: {str(result.err())}" - ) - ) - # # Notification Setup - # root_key = self.admin_verify_key() - # root_context = AuthedServiceContext(server=context.server, credentials=root_key) - # link = None - # if new_user.created_by: - # link = LinkedObject.with_context(user, context=root_context) - # - # message = CreateNotification( - # subject=success_message, - # from_user_verify_key=root_key, - # to_user_verify_key=user.verify_key, - # linked_obj=link, - # notifier_types=[NOTIFIERS.EMAIL], - # email_template=OnBoardEmailTemplate, - # ) - - # method = context.server.get_service_method(NotificationService.send) - # result = method(context=root_context, notification=message) + salt, hashed = salt_and_hash_password(new_password, len(new_password)) + user.hashed_password = hashed + user.salt = salt - return SyftSuccess( - message=f"User password has been reset successfully!\n New User Password: {new_password}" + user.reset_token = None + user.reset_token_date = None + + result = self.stash.update( + credentials=context.credentials, user=user, has_permission=True + ) + if result.is_err(): + return SyftError( + message=(f"Failed to update user password. Error: {str(result.err())}") ) - return SyftError(message=str(result.err())) + return SyftSuccess(message="User Password updated successfully!") + + def generate_new_password_reset_token(self) -> str: + token_len = 12 + valid_characters = string.ascii_letters + string.digits + + generated_token = "".join( + secrets.choice(valid_characters) for _ in range(token_len) + ) + + return generated_token @service_method(path="user.view", name="view", roles=DATA_SCIENTIST_ROLE_LEVEL) def view( diff --git a/packages/syft/src/syft/service/user/user_stash.py b/packages/syft/src/syft/service/user/user_stash.py index 2b2b42db9e8..894d9a65115 100644 --- a/packages/syft/src/syft/service/user/user_stash.py +++ b/packages/syft/src/syft/service/user/user_stash.py @@ -23,6 +23,7 @@ # 🟡 TODO 27: it would be nice if these could be defined closer to the User EmailPartitionKey = PartitionKey(key="email", type_=str) +PasswordResetTokenPartitionKey = PartitionKey(key="reset_token", type_=str) RolePartitionKey = PartitionKey(key="role", type_=ServiceRole) SigningKeyPartitionKey = PartitionKey(key="signing_key", type_=SyftSigningKey) VerifyKeyPartitionKey = PartitionKey(key="verify_key", type_=SyftVerifyKey) @@ -74,6 +75,12 @@ def get_by_uid( qks = QueryKeys(qks=[UIDPartitionKey.with_obj(uid)]) return self.query_one(credentials=credentials, qks=qks) + def get_by_reset_token( + self, credentials: SyftVerifyKey, token: str + ) -> Result[User | None, str]: + qks = QueryKeys(qks=[PasswordResetTokenPartitionKey.with_obj(token)]) + return self.query_one(credentials=credentials, qks=qks) + def get_by_email( self, credentials: SyftVerifyKey, email: str ) -> Result[User | None, str]: From eaad67c9ee83d596b07eb31c325670747dcd22cb Mon Sep 17 00:00:00 2001 From: IonesioJunior Date: Mon, 22 Jul 2024 10:02:43 -0300 Subject: [PATCH 06/46] Add email rate limit --- .../src/syft/protocol/protocol_version.json | 12 ++++++ .../src/syft/service/notifier/notifier.py | 7 ++-- .../syft/service/notifier/notifier_service.py | 39 ++++++++++++++++++- .../src/syft/service/user/user_service.py | 7 ++++ 4 files changed, 61 insertions(+), 4 deletions(-) diff --git a/packages/syft/src/syft/protocol/protocol_version.json b/packages/syft/src/syft/protocol/protocol_version.json index b375a4847ae..2dbf7c3fe09 100644 --- a/packages/syft/src/syft/protocol/protocol_version.json +++ b/packages/syft/src/syft/protocol/protocol_version.json @@ -15,6 +15,18 @@ "hash": "af6fb5b2e1606e97838f4a60f0536ad95db606d455e94acbd1977df866608a2c", "action": "add" } + }, + "NotifierSettings": { + "1": { + "version": 1, + "hash": "65c8ab814d35fac32f68d3000756692592cc59940f30e3af3dcdfa2328755b9d", + "action": "remove" + }, + "2": { + "version": 2, + "hash": "2c934f54389e431347561a5340cba1709c92c4cc27de197347a01e4662a48ae5", + "action": "add" + } } } } diff --git a/packages/syft/src/syft/service/notifier/notifier.py b/packages/syft/src/syft/service/notifier/notifier.py index 26dafe34e44..ec059e26dd8 100644 --- a/packages/syft/src/syft/service/notifier/notifier.py +++ b/packages/syft/src/syft/service/notifier/notifier.py @@ -1,5 +1,3 @@ -# stdlib - # stdlib from typing import TypeVar @@ -12,6 +10,7 @@ from ...serde.serializable import serializable from ...server.credentials import SyftVerifyKey from ...types.syft_object import SYFT_OBJECT_VERSION_1 +from ...types.syft_object import SYFT_OBJECT_VERSION_2 from ...types.syft_object import SyftObject from ..context import AuthedServiceContext from ..notification.notifications import Notification @@ -126,7 +125,7 @@ class NotificationPreferences(SyftObject): @serializable() class NotifierSettings(SyftObject): __canonical_name__ = "NotifierSettings" - __version__ = SYFT_OBJECT_VERSION_1 + __version__ = SYFT_OBJECT_VERSION_2 __repr_attrs__ = [ "active", "email_enabled", @@ -154,6 +153,8 @@ class NotifierSettings(SyftObject): email_username: str | None = "" email_password: str | None = "" + email_rate_limit: dict[str, dict[SyftVerifyKey, list]] = {} + @property def email_enabled(self) -> bool: return self.notifiers_status[NOTIFIERS.EMAIL] diff --git a/packages/syft/src/syft/service/notifier/notifier_service.py b/packages/syft/src/syft/service/notifier/notifier_service.py index a201c850c22..f384ea25e41 100644 --- a/packages/syft/src/syft/service/notifier/notifier_service.py +++ b/packages/syft/src/syft/service/notifier/notifier_service.py @@ -1,4 +1,5 @@ # stdlib +from datetime import datetime import logging import traceback @@ -295,7 +296,43 @@ def dispatch_notification( notifier = notifier.ok() # If notifier is active - if notifier.active: + if notifier.active and notification.email_template is not None: + if notifier.email_rate_limit.get( + notification.email_template.__name__, None + ): + user_activity = notifier.email_rate_limit[ + notification.email_template.__name__ + ].get(notification.to_user_verify_key, None) + if user_activity is None: + notifier.email_rate_limit[notification.email_template.__name__][ + notification.to_user_verify_key, None + ] = [datetime.now(), 1] + else: + current_state = notifier.email_rate_limit[ + notification.email_template.__name__ + ][notification.to_user_verify_key] + date_refresh = abs(datetime.now() - current_state[0]).days > 1 + still_in_limit = current_state[1] < 3 + if date_refresh: + current_state[1] = 1 # Email count + current_state[0] = datetime.now() # Last time email was sent + if not date_refresh and still_in_limit: + current_state[1] += 1 # Email count + current_state[0] = datetime.now() # Last time email was sent + else: + return SyftError( + message="Couldn't send the email. You have surpassed the" + + " email threshold limit. Please try again later." + ) + else: + notifier.email_rate_limit[notification.email_template.__name__] = { + notification.to_user_verify_key: [datetime.now(), 1] + } + + result = self.stash.update(credentials=admin_key, settings=notifier) + if result.is_err(): + return SyftError(message="Couldn't update the notifier.") + resp = notifier.send_notifications( context=context, notification=notification ) diff --git a/packages/syft/src/syft/service/user/user_service.py b/packages/syft/src/syft/service/user/user_service.py index b4395497222..475dcd2ae9c 100644 --- a/packages/syft/src/syft/service/user/user_service.py +++ b/packages/syft/src/syft/service/user/user_service.py @@ -120,6 +120,7 @@ def forgot_password( root_context = AuthedServiceContext(server=context.server, credentials=root_key) link = LinkedObject.with_context(user, context=root_context) notifier_service = context.server.get_service("notifierservice") + # Notifier is active notification_is_enabled = notifier_service.settings(context=root_context).active # Email is enabled @@ -154,6 +155,9 @@ def forgot_password( ) result = method(context=root_context, notification=message) + if isinstance(result, SyftError): + return result + return SyftSuccess( message="If the email is valid, we sent a password reset \ token to your email or a password request to the admin." @@ -172,6 +176,9 @@ def forgot_password( method = context.server.get_service_method(NotificationService.send) result = method(context=root_context, notification=message) + if isinstance(result, SyftError): + return result + return SyftSuccess( message="If the email is valid, we sent a password request to the admin." ) From c19f72a72c2a52bb8250401a98c878990b8a2e05 Mon Sep 17 00:00:00 2001 From: IonesioJunior Date: Mon, 22 Jul 2024 10:22:50 -0300 Subject: [PATCH 07/46] Fix linting --- packages/syft/src/syft/service/notifier/notifier_service.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/syft/src/syft/service/notifier/notifier_service.py b/packages/syft/src/syft/service/notifier/notifier_service.py index f384ea25e41..55a3c50f08f 100644 --- a/packages/syft/src/syft/service/notifier/notifier_service.py +++ b/packages/syft/src/syft/service/notifier/notifier_service.py @@ -321,7 +321,7 @@ def dispatch_notification( current_state[0] = datetime.now() # Last time email was sent else: return SyftError( - message="Couldn't send the email. You have surpassed the" + message="Couldn't send the email. You have surpassed the" + " email threshold limit. Please try again later." ) else: From 1ecd67245f636a7426d487391c9fbd1c36c41807 Mon Sep 17 00:00:00 2001 From: IonesioJunior Date: Tue, 23 Jul 2024 14:38:28 -0300 Subject: [PATCH 08/46] Add UserActivity Struct to track user email activity --- .../src/syft/protocol/protocol_version.json | 9 ++- .../src/syft/service/notifier/notifier.py | 12 +++- .../syft/service/notifier/notifier_enums.py | 8 +++ .../syft/service/notifier/notifier_service.py | 67 ++++++++++++++----- .../syft/service/settings/settings_service.py | 8 +++ .../src/syft/service/user/user_service.py | 6 ++ 6 files changed, 91 insertions(+), 19 deletions(-) diff --git a/packages/syft/src/syft/protocol/protocol_version.json b/packages/syft/src/syft/protocol/protocol_version.json index 2dbf7c3fe09..43920df4894 100644 --- a/packages/syft/src/syft/protocol/protocol_version.json +++ b/packages/syft/src/syft/protocol/protocol_version.json @@ -24,7 +24,14 @@ }, "2": { "version": 2, - "hash": "2c934f54389e431347561a5340cba1709c92c4cc27de197347a01e4662a48ae5", + "hash": "be8b52597fc628d1b7cd22b776ee81416e1adbb04a45188778eb0e32ed1416b4", + "action": "add" + } + }, + "UserNotificationActivity": { + "1": { + "version": 1, + "hash": "437e9fed52cab4fec48a22450898f82eba05206f66b66d2b53f22192b7f33274", "action": "add" } } diff --git a/packages/syft/src/syft/service/notifier/notifier.py b/packages/syft/src/syft/service/notifier/notifier.py index ec059e26dd8..26f12d56608 100644 --- a/packages/syft/src/syft/service/notifier/notifier.py +++ b/packages/syft/src/syft/service/notifier/notifier.py @@ -1,4 +1,5 @@ # stdlib +from datetime import datetime from typing import TypeVar # third party @@ -30,6 +31,14 @@ def send( TBaseNotifier = TypeVar("TBaseNotifier", bound=BaseNotifier) +@serializable() +class UserNotificationActivity(SyftObject): + __canonical_name__ = "UserNotificationActivity" + __version__ = SYFT_OBJECT_VERSION_1 + count: int = 1 + date: datetime | None = None + + @serializable(canonical_name="EmailNotifier", version=1) class EmailNotifier(BaseNotifier): smtp_client: SMTPClient @@ -153,7 +162,8 @@ class NotifierSettings(SyftObject): email_username: str | None = "" email_password: str | None = "" - email_rate_limit: dict[str, dict[SyftVerifyKey, list]] = {} + email_activity: dict[str, dict[SyftVerifyKey, UserNotificationActivity]] = {} + email_rate_limit: dict[str, int] = {} @property def email_enabled(self) -> bool: diff --git a/packages/syft/src/syft/service/notifier/notifier_enums.py b/packages/syft/src/syft/service/notifier/notifier_enums.py index 023843f7d6c..cc391d3eaf0 100644 --- a/packages/syft/src/syft/service/notifier/notifier_enums.py +++ b/packages/syft/src/syft/service/notifier/notifier_enums.py @@ -6,6 +6,14 @@ from ...serde.serializable import serializable +@serializable(canonical_name="EMAIL_TYPES", version=1) +class EMAIL_TYPES(Enum): + PASSWORD_RESET_EMAIL = "PasswordResetTemplate" + ONBOARD_EMAIL = "OnBoardEmailTemplate" + REQUEST_EMAIL = "RequestEmailTemplate" + REQUEST_UPDATE_EMAIL = "RequestUpdateEmailTemplate" + + @serializable(canonical_name="NOTIFIERS", version=1) class NOTIFIERS(Enum): EMAIL = auto() diff --git a/packages/syft/src/syft/service/notifier/notifier_service.py b/packages/syft/src/syft/service/notifier/notifier_service.py index 55a3c50f08f..09e2581c222 100644 --- a/packages/syft/src/syft/service/notifier/notifier_service.py +++ b/packages/syft/src/syft/service/notifier/notifier_service.py @@ -14,12 +14,15 @@ from ...serde.serializable import serializable from ...store.document_store import DocumentStore from ..context import AuthedServiceContext +from ..notification.email_templates import PasswordResetTemplate from ..notification.notifications import Notification from ..response import SyftError from ..response import SyftSuccess from ..service import AbstractService from .notifier import NotificationPreferences from .notifier import NotifierSettings +from .notifier import UserNotificationActivity +from .notifier_enums import EMAIL_TYPES from .notifier_enums import NOTIFIERS from .notifier_stash import NotifierStash @@ -153,6 +156,10 @@ def turn_on( message="You must provide a sender email address to enable notifications." ) + # If email_rate_limit isn't defined yet. + if not notifier.email_rate_limit: + notifier.email_rate_limit = {PasswordResetTemplate.__name__: 3} + if email_sender: try: EmailStr._validate(email_sender) @@ -273,6 +280,8 @@ def init_notifier( notifier.email_sender = email_sender notifier.email_server = smtp_host notifier.email_port = smtp_port + # Default daily email rate limit per user + notifier.email_rate_limit = {PasswordResetTemplate.__name__: 3} notifier.active = True notifier_stash.set(server.signing_key.verify_key, notifier) @@ -281,6 +290,22 @@ def init_notifier( except Exception: raise Exception(f"Error initializing notifier. \n {traceback.format_exc()}") + def set_email_rate_limit( + self, context: AuthedServiceContext, email_type: EMAIL_TYPES, daily_limit: int + ) -> SyftSuccess | SyftError: + notifier = self.stash.get(context.credentials) + if notifier.is_err(): + return SyftError(message="Couldn't set the email rate limit.") + + notifier = notifier.ok() + + notifier.email_rate_limit[email_type.value] = daily_limit + result = self.stash.update(credentials=context.credentials, settings=notifier) + if result.is_err(): + return SyftError(message="Couldn't update the notifier.") + + return SyftSuccess(message="Email rate limit updated!") + # This is not a public API. # This method is used by other services to dispatch notifications internally def dispatch_notification( @@ -297,36 +322,44 @@ def dispatch_notification( notifier = notifier.ok() # If notifier is active if notifier.active and notification.email_template is not None: - if notifier.email_rate_limit.get( - notification.email_template.__name__, None - ): - user_activity = notifier.email_rate_limit[ + logging.debug("Checking user email activity") + if notifier.email_activity.get(notification.email_template.__name__, None): + user_activity = notifier.email_activity[ notification.email_template.__name__ ].get(notification.to_user_verify_key, None) + # If there's no user activity if user_activity is None: - notifier.email_rate_limit[notification.email_template.__name__][ + notifier.email_activity[notification.email_template.__name__][ notification.to_user_verify_key, None - ] = [datetime.now(), 1] - else: - current_state = notifier.email_rate_limit[ + ] = UserNotificationActivity(count=1, date=datetime.now()) + else: # If there's a previous user activity + current_state: UserNotificationActivity = notifier.email_activity[ notification.email_template.__name__ ][notification.to_user_verify_key] - date_refresh = abs(datetime.now() - current_state[0]).days > 1 - still_in_limit = current_state[1] < 3 + date_refresh = abs(datetime.now() - current_state.date).days > 1 + + limit = notifier.email_rate_limit.get( + notification.email_template.__name__, 0 + ) + still_in_limit = current_state.count < limit + # Time interval reseted. if date_refresh: - current_state[1] = 1 # Email count - current_state[0] = datetime.now() # Last time email was sent - if not date_refresh and still_in_limit: - current_state[1] += 1 # Email count - current_state[0] = datetime.now() # Last time email was sent + current_state.count = 1 + current_state.date = datetime.now() + # Time interval didn't reset yet. + elif still_in_limit or not limit: + current_state.count += 1 + current_state.date = datetime.now() else: return SyftError( message="Couldn't send the email. You have surpassed the" + " email threshold limit. Please try again later." ) else: - notifier.email_rate_limit[notification.email_template.__name__] = { - notification.to_user_verify_key: [datetime.now(), 1] + notifier.email_activity[notification.email_template.__name__] = { + notification.to_user_verify_key: UserNotificationActivity( + count=1, date=datetime.now() + ) } result = self.stash.update(credentials=admin_key, settings=notifier) diff --git a/packages/syft/src/syft/service/settings/settings_service.py b/packages/syft/src/syft/service/settings/settings_service.py index a1f92ccbdd1..d21fe17d8c6 100644 --- a/packages/syft/src/syft/service/settings/settings_service.py +++ b/packages/syft/src/syft/service/settings/settings_service.py @@ -20,6 +20,7 @@ from ...util.schema import GUEST_COMMANDS from ..context import AuthedServiceContext from ..context import UnauthedServiceContext +from ..notifier.notifier_enums import EMAIL_TYPES from ..response import SyftError from ..response import SyftSuccess from ..service import AbstractService @@ -237,6 +238,13 @@ def enable_eager_execution( message = "enabled" if enable else "disabled" return SyftSuccess(message=f"Eager execution {message}") + @service_method(path="settings.set_email_rate_limit", name="set_email_rate_limit") + def set_email_rate_limit( + self, context: AuthedServiceContext, email_type: EMAIL_TYPES, daily_limit: int + ) -> SyftSuccess | SyftError: + notifier_service = context.server.get_service("notifierservice") + return notifier_service.set_email_rate_limit(context, email_type, daily_limit) + @service_method( path="settings.allow_association_request_auto_approval", name="allow_association_request_auto_approval", diff --git a/packages/syft/src/syft/service/user/user_service.py b/packages/syft/src/syft/service/user/user_service.py index 475dcd2ae9c..103cf18675c 100644 --- a/packages/syft/src/syft/service/user/user_service.py +++ b/packages/syft/src/syft/service/user/user_service.py @@ -202,6 +202,12 @@ def request_password_reset( if user is None: return SyftError(message=f"No user exists for given: {uid}") + user_role = self.get_role_for_credentials(user.verify_key) + if user_role == ServiceRole.ADMIN: + return SyftError( + message="You can't request password reset for an Admin user." + ) + user.reset_token = self.generate_new_password_reset_token() user.reset_token_date = datetime.now() From 99026e30de817e647347d7e68d6b0e7d39cc75d0 Mon Sep 17 00:00:00 2001 From: IonesioJunior Date: Tue, 23 Jul 2024 14:38:28 -0300 Subject: [PATCH 09/46] Add UserActivity Struct to track user email activity --- packages/syft/src/syft/service/notifier/notifier.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/syft/src/syft/service/notifier/notifier.py b/packages/syft/src/syft/service/notifier/notifier.py index 26f12d56608..27219a271cb 100644 --- a/packages/syft/src/syft/service/notifier/notifier.py +++ b/packages/syft/src/syft/service/notifier/notifier.py @@ -36,7 +36,7 @@ class UserNotificationActivity(SyftObject): __canonical_name__ = "UserNotificationActivity" __version__ = SYFT_OBJECT_VERSION_1 count: int = 1 - date: datetime | None = None + date: datetime = datetime.now() @serializable(canonical_name="EmailNotifier", version=1) From b9913eb113d39c90702bc32dbe7ee441b921bc80 Mon Sep 17 00:00:00 2001 From: IonesioJunior Date: Wed, 24 Jul 2024 16:05:04 -0300 Subject: [PATCH 10/46] Add nosec to remove false positive error --- packages/syft/src/syft/service/notifier/notifier_enums.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/syft/src/syft/service/notifier/notifier_enums.py b/packages/syft/src/syft/service/notifier/notifier_enums.py index cc391d3eaf0..c746b16a9aa 100644 --- a/packages/syft/src/syft/service/notifier/notifier_enums.py +++ b/packages/syft/src/syft/service/notifier/notifier_enums.py @@ -8,7 +8,7 @@ @serializable(canonical_name="EMAIL_TYPES", version=1) class EMAIL_TYPES(Enum): - PASSWORD_RESET_EMAIL = "PasswordResetTemplate" + PASSWORD_RESET_EMAIL = "PasswordResetTemplate" # nosec ONBOARD_EMAIL = "OnBoardEmailTemplate" REQUEST_EMAIL = "RequestEmailTemplate" REQUEST_UPDATE_EMAIL = "RequestUpdateEmailTemplate" From f8903290e93e4044878f45fa567fb9207905ac72 Mon Sep 17 00:00:00 2001 From: IonesioJunior Date: Wed, 24 Jul 2024 16:09:38 -0300 Subject: [PATCH 11/46] Fix lint --- packages/syft/src/syft/service/notifier/notifier_enums.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/syft/src/syft/service/notifier/notifier_enums.py b/packages/syft/src/syft/service/notifier/notifier_enums.py index c746b16a9aa..f8c2d887ff4 100644 --- a/packages/syft/src/syft/service/notifier/notifier_enums.py +++ b/packages/syft/src/syft/service/notifier/notifier_enums.py @@ -8,7 +8,7 @@ @serializable(canonical_name="EMAIL_TYPES", version=1) class EMAIL_TYPES(Enum): - PASSWORD_RESET_EMAIL = "PasswordResetTemplate" # nosec + PASSWORD_RESET_EMAIL = "PasswordResetTemplate" # nosec ONBOARD_EMAIL = "OnBoardEmailTemplate" REQUEST_EMAIL = "RequestEmailTemplate" REQUEST_UPDATE_EMAIL = "RequestUpdateEmailTemplate" From f813e07c8f8367ded5bee8dea4d0f61c81a6dd73 Mon Sep 17 00:00:00 2001 From: IonesioJunior Date: Wed, 24 Jul 2024 17:52:07 -0300 Subject: [PATCH 12/46] Add PwdResetConfig in ServerSettings --- .../service/notification/email_templates.py | 4 +- .../src/syft/service/settings/settings.py | 53 ++++++++++++++++++- .../src/syft/service/user/user_service.py | 27 +++++++--- 3 files changed, 73 insertions(+), 11 deletions(-) diff --git a/packages/syft/src/syft/service/notification/email_templates.py b/packages/syft/src/syft/service/notification/email_templates.py index bd65592d498..e35cd51677a 100644 --- a/packages/syft/src/syft/service/notification/email_templates.py +++ b/packages/syft/src/syft/service/notification/email_templates.py @@ -37,7 +37,9 @@ def email_body(notification: "Notification", context: AuthedServiceContext) -> s if not user: raise Exception("User not found!") - user.reset_token = user_service.generate_new_password_reset_token() + user.reset_token = user_service.generate_new_password_reset_token( + context.server.settings.pwd_token_config + ) user.reset_token_date = datetime.now() result = user_service.stash.update( diff --git a/packages/syft/src/syft/service/settings/settings.py b/packages/syft/src/syft/service/settings/settings.py index 4c710e354a6..80b9982e9f5 100644 --- a/packages/syft/src/syft/service/settings/settings.py +++ b/packages/syft/src/syft/service/settings/settings.py @@ -2,6 +2,11 @@ import logging from typing import Any +# third party +from pydantic import field_validator +from pydantic import model_validator +from typing_extensions import Self + # relative from ...abstract_server import ServerSideType from ...abstract_server import ServerType @@ -10,6 +15,7 @@ from ...service.worker.utils import DEFAULT_WORKER_POOL_NAME from ...types.syft_object import PartialSyftObject from ...types.syft_object import SYFT_OBJECT_VERSION_1 +from ...types.syft_object import SYFT_OBJECT_VERSION_2 from ...types.syft_object import SyftObject from ...types.uid import UID from ...util import options @@ -22,7 +28,32 @@ @serializable() -class ServerSettingsUpdate(PartialSyftObject): +class PwdTokenResetConfig(SyftObject): + __canonical_name__ = "PwdTokenResetConfig" + __version__ = SYFT_OBJECT_VERSION_1 + ascii: bool = True + numbers: bool = True + token_len: int = 12 + + @model_validator(mode="after") + def validate_char_types(self) -> Self: + if not self.ascii and not self.numbers: + raise ValueError( + "Invalid config, at least one of the ascii/number options must be true." + ) + + return self + + @field_validator("token_len") + @classmethod + def check_token_len(cls, value: int) -> int: + if value < 4: + raise ValueError("Token length must be greater than 4.") + return value + + +@serializable() +class ServerSettingsUpdateV1(PartialSyftObject): __canonical_name__ = "ServerSettingsUpdate" __version__ = SYFT_OBJECT_VERSION_1 id: UID @@ -37,10 +68,27 @@ class ServerSettingsUpdate(PartialSyftObject): eager_execution_enabled: bool = False +@serializable() +class ServerSettingsUpdate(PartialSyftObject): + __canonical_name__ = "ServerSettingsUpdate" + __version__ = SYFT_OBJECT_VERSION_2 + id: UID + name: str + organization: str + description: str + on_board: bool + signup_enabled: bool + admin_email: str + association_request_auto_approval: bool + welcome_markdown: HTMLObject | MarkdownDescription + eager_execution_enabled: bool = False + pwd_token_config: PwdTokenResetConfig + + @serializable() class ServerSettings(SyftObject): __canonical_name__ = "ServerSettings" - __version__ = SYFT_OBJECT_VERSION_1 + __version__ = SYFT_OBJECT_VERSION_2 __repr_attrs__ = [ "name", "organization", @@ -65,6 +113,7 @@ class ServerSettings(SyftObject): association_request_auto_approval: bool eager_execution_enabled: bool = False default_worker_pool: str = DEFAULT_WORKER_POOL_NAME + pwd_token_config: PwdTokenResetConfig = PwdTokenResetConfig() welcome_markdown: HTMLObject | MarkdownDescription = HTMLObject( text=DEFAULT_WELCOME_MSG ) diff --git a/packages/syft/src/syft/service/user/user_service.py b/packages/syft/src/syft/service/user/user_service.py index 103cf18675c..3d722938e5d 100644 --- a/packages/syft/src/syft/service/user/user_service.py +++ b/packages/syft/src/syft/service/user/user_service.py @@ -31,6 +31,7 @@ from ..service import SERVICE_TO_TYPES from ..service import TYPE_TO_SERVICE from ..service import service_method +from ..settings.settings import PwdTokenResetConfig from ..settings.settings_stash import SettingsStash from .user import User from .user import UserCreate @@ -120,11 +121,11 @@ def forgot_password( root_context = AuthedServiceContext(server=context.server, credentials=root_key) link = LinkedObject.with_context(user, context=root_context) notifier_service = context.server.get_service("notifierservice") - # Notifier is active - notification_is_enabled = notifier_service.settings(context=root_context).active + notifier = notifier_service.settings(context=root_context) + notification_is_enabled = notifier.active # Email is enabled - email_is_enabled = notifier_service.settings(context=root_context).email_enabled + email_is_enabled = notifier.email_enabled # User Preferences allow email notification user_allow_email_notifications = user.notifications_enabled[NOTIFIERS.EMAIL] @@ -208,7 +209,9 @@ def request_password_reset( message="You can't request password reset for an Admin user." ) - user.reset_token = self.generate_new_password_reset_token() + user.reset_token = self.generate_new_password_reset_token( + context.server.settings.pwd_token_config + ) user.reset_token_date = datetime.now() result = self.stash.update( @@ -276,12 +279,20 @@ def reset_password( ) return SyftSuccess(message="User Password updated successfully!") - def generate_new_password_reset_token(self) -> str: - token_len = 12 - valid_characters = string.ascii_letters + string.digits + def generate_new_password_reset_token( + self, token_config: PwdTokenResetConfig + ) -> str: + valid_characters = "" + if token_config.ascii: + valid_characters += string.ascii_letters + + if token_config.numbers: + valid_characters += string.digits + + # valid_characters = string.ascii_letters + string.digits generated_token = "".join( - secrets.choice(valid_characters) for _ in range(token_len) + secrets.choice(valid_characters) for _ in range(token_config.token_len) ) return generated_token From a6af2e6ce3a91ca2cb5e843c169b067cc601be9a Mon Sep 17 00:00:00 2001 From: IonesioJunior Date: Wed, 24 Jul 2024 19:09:50 -0300 Subject: [PATCH 13/46] Fix setup update permission issue/Fix protocol versions --- .../src/syft/protocol/protocol_version.json | 39 ++++++++++++++----- .../syft/service/settings/settings_service.py | 7 +++- packages/syft/src/syft/service/user/user.py | 34 ++++++++++++++++ 3 files changed, 70 insertions(+), 10 deletions(-) diff --git a/packages/syft/src/syft/protocol/protocol_version.json b/packages/syft/src/syft/protocol/protocol_version.json index 43920df4894..f31ffbb0ad6 100644 --- a/packages/syft/src/syft/protocol/protocol_version.json +++ b/packages/syft/src/syft/protocol/protocol_version.json @@ -4,15 +4,10 @@ }, "dev": { "object_versions": { - "User": { + "UserNotificationActivity": { "1": { "version": 1, - "hash": "2df4b68182c558dba5485a8a6867acf2a5c341b249ad67373a504098aa8c4343", - "action": "remove" - }, - "2": { - "version": 2, - "hash": "af6fb5b2e1606e97838f4a60f0536ad95db606d455e94acbd1977df866608a2c", + "hash": "422fd01c6d9af38688a9982abd34e80794a1f6ddd444cca225d77f49189847a9", "action": "add" } }, @@ -28,10 +23,36 @@ "action": "add" } }, - "UserNotificationActivity": { + "PwdTokenResetConfig": { "1": { "version": 1, - "hash": "437e9fed52cab4fec48a22450898f82eba05206f66b66d2b53f22192b7f33274", + "hash": "88f1f450d5ef7b00acc179ed75f3d01ebb4f206ff47d0bb8f45a98f1ff42cba2", + "action": "add" + } + }, + "ServerSettingsUpdate": { + "2": { + "version": 2, + "hash": "7ccd479b2ba7ef042de0dfe3c2110ac301f73e062a6cfa4ab2ec55d1ab93aaf0", + "action": "add" + } + }, + "ServerSettings": { + "1": { + "version": 1, + "hash": "5a1e7470cbeaaae5b80ac9beecb743734f7e4e42d429a09ea8defa569a5ddff1", + "action": "remove" + }, + "2": { + "version": 2, + "hash": "b68b9c62d3417029fcaab7f22f77fa9d0d339f38c8d64644af681af0a55f1ec5", + "action": "add" + } + }, + "User": { + "2": { + "version": 2, + "hash": "af6fb5b2e1606e97838f4a60f0536ad95db606d455e94acbd1977df866608a2c", "action": "add" } } diff --git a/packages/syft/src/syft/service/settings/settings_service.py b/packages/syft/src/syft/service/settings/settings_service.py index d21fe17d8c6..f41114dcbb9 100644 --- a/packages/syft/src/syft/service/settings/settings_service.py +++ b/packages/syft/src/syft/service/settings/settings_service.py @@ -69,7 +69,12 @@ def set( else: return SyftError(message=result.err()) - @service_method(path="settings.update", name="update", autosplat=["settings"]) + @service_method( + path="settings.update", + name="update", + autosplat=["settings"], + roles=ADMIN_ROLE_LEVEL, + ) def update( self, context: AuthedServiceContext, settings: ServerSettingsUpdate ) -> Result[SyftSuccess, SyftError]: diff --git a/packages/syft/src/syft/service/user/user.py b/packages/syft/src/syft/service/user/user.py index 231b4a8f00a..48e60f87382 100644 --- a/packages/syft/src/syft/service/user/user.py +++ b/packages/syft/src/syft/service/user/user.py @@ -37,6 +37,40 @@ from .user_roles import ServiceRole +@serializable() +class UserV1(SyftObject): + # version + __canonical_name__ = "User" + __version__ = SYFT_OBJECT_VERSION_1 + + id: UID | None = None # type: ignore[assignment] + + # fields + notifications_enabled: dict[NOTIFIERS, bool] = { + NOTIFIERS.EMAIL: True, + NOTIFIERS.SMS: False, + NOTIFIERS.SLACK: False, + NOTIFIERS.APP: False, + } + email: EmailStr | None = None + name: str | None = None + hashed_password: str | None = None + salt: str | None = None + signing_key: SyftSigningKey | None = None + verify_key: SyftVerifyKey | None = None + role: ServiceRole | None = None + institution: str | None = None + website: str | None = None + created_at: str | None = None + # TODO where do we put this flag? + mock_execution_permission: bool = False + + # serde / storage rules + __attr_searchable__ = ["name", "email", "verify_key", "role"] + __attr_unique__ = ["email", "signing_key", "verify_key"] + __repr_attrs__ = ["name", "email"] + + @serializable() class User(SyftObject): # version From 0b8980c9321a72485bf1f1c3fb390794e1e5d707 Mon Sep 17 00:00:00 2001 From: IonesioJunior Date: Thu, 25 Jul 2024 09:53:10 -0300 Subject: [PATCH 14/46] Replace absolute imports --- packages/syft/src/syft/service/user/user.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/syft/src/syft/service/user/user.py b/packages/syft/src/syft/service/user/user.py index 7edf43e20d1..9177e167ccf 100644 --- a/packages/syft/src/syft/service/user/user.py +++ b/packages/syft/src/syft/service/user/user.py @@ -13,15 +13,13 @@ from pydantic import ValidationError from pydantic import field_validator -# syft absolute -from syft.types.syft_migration import migrate - # relative from ...client.api import APIRegistry from ...serde.serializable import serializable from ...server.credentials import SyftSigningKey from ...server.credentials import SyftVerifyKey from ...types.syft_metaclass import Empty +from ...types.syft_migration import migrate from ...types.syft_object import PartialSyftObject from ...types.syft_object import SYFT_OBJECT_VERSION_1 from ...types.syft_object import SYFT_OBJECT_VERSION_2 From 74f1b9da8124b0468a2c59fca716d17e103f8916 Mon Sep 17 00:00:00 2001 From: IonesioJunior Date: Fri, 26 Jul 2024 10:40:58 -0300 Subject: [PATCH 15/46] Fix pending issues --- .../service/notification/email_templates.py | 7 ++- .../src/syft/service/notifier/notifier.py | 46 +++++++++++++++++ .../src/syft/service/settings/settings.py | 50 ------------------- packages/syft/src/syft/service/user/user.py | 13 ++++- .../src/syft/service/user/user_service.py | 20 +++----- 5 files changed, 70 insertions(+), 66 deletions(-) diff --git a/packages/syft/src/syft/service/notification/email_templates.py b/packages/syft/src/syft/service/notification/email_templates.py index e35cd51677a..fec2810b02a 100644 --- a/packages/syft/src/syft/service/notification/email_templates.py +++ b/packages/syft/src/syft/service/notification/email_templates.py @@ -72,7 +72,6 @@ def email_body(notification: "Notification", context: AuthedServiceContext) -> s p { font-size: 16px; line-height: 1.5; - text-align: center; } .button { display: block; @@ -96,9 +95,13 @@ def email_body(notification: "Notification", context: AuthedServiceContext) -> s body = f"""

Password Reset

-

Hello,

We received a request to reset your password. Your new temporary token is:

{user.reset_token}

+

Use + + syft_client.reset_password(token='{user.reset_token}', new_password=*****) + . + to reset your password.

If you didn't request a password reset, please ignore this email.

""" diff --git a/packages/syft/src/syft/service/notifier/notifier.py b/packages/syft/src/syft/service/notifier/notifier.py index 19934327ed0..d9cdef82c2c 100644 --- a/packages/syft/src/syft/service/notifier/notifier.py +++ b/packages/syft/src/syft/service/notifier/notifier.py @@ -7,6 +7,7 @@ # 2) .....user_settings().x # stdlib +from collections.abc import Callable from datetime import datetime from typing import TypeVar @@ -18,9 +19,12 @@ # relative from ...serde.serializable import serializable from ...server.credentials import SyftVerifyKey +from ...types.syft_migration import migrate from ...types.syft_object import SYFT_OBJECT_VERSION_1 from ...types.syft_object import SYFT_OBJECT_VERSION_2 from ...types.syft_object import SyftObject +from ...types.transforms import drop +from ...types.transforms import make_set_default from ..context import AuthedServiceContext from ..notification.notifications import Notification from ..response import SyftError @@ -139,6 +143,34 @@ class NotificationPreferences(SyftObject): app: bool = False +@serializable() +class NotifierSettingsV1(SyftObject): + __canonical_name__ = "NotifierSettings" + __version__ = SYFT_OBJECT_VERSION_1 + __repr_attrs__ = [ + "active", + "email_enabled", + ] + active: bool = False + + notifiers: dict[NOTIFIERS, type[TBaseNotifier]] = { + NOTIFIERS.EMAIL: EmailNotifier, + } + + notifiers_status: dict[NOTIFIERS, bool] = { + NOTIFIERS.EMAIL: True, + NOTIFIERS.SMS: False, + NOTIFIERS.SLACK: False, + NOTIFIERS.APP: False, + } + + email_sender: str | None = "" + email_server: str | None = "" + email_port: int | None = 587 + email_username: str | None = "" + email_password: str | None = "" + + @serializable() class NotifierSettings(SyftObject): __canonical_name__ = "NotifierSettings" @@ -249,3 +281,17 @@ def select_notifiers(self, notification: Notification) -> list[BaseNotifier]: notifier_objs.append(self.notifiers[notifier_type]()) # type: ignore[misc] return notifier_objs + + +@migrate(NotifierSettingsV1, NotifierSettings) +def migrate_server_settings_v1_to_current() -> list[Callable]: + return [ + make_set_default("email_activity", {}), + make_set_default("email_rate_limit", {}), + ] + + +@migrate(NotifierSettings, NotifierSettingsV1) +def migrate_server_settings_v2_to_v1() -> list[Callable]: + # Use drop function on "notifications_enabled" attrubute + return [drop(["email_activity"]), drop(["email_rate_limit"])] diff --git a/packages/syft/src/syft/service/settings/settings.py b/packages/syft/src/syft/service/settings/settings.py index 16634b20acc..4ed29c7fd40 100644 --- a/packages/syft/src/syft/service/settings/settings.py +++ b/packages/syft/src/syft/service/settings/settings.py @@ -174,56 +174,6 @@ class ServerSettingsV2(SyftObject): ) notifications_enabled: bool - def _repr_html_(self) -> Any: - # .api.services.notifications.settings() is how the server itself would dispatch notifications. - # .api.services.notifications.user_settings() sets if a specific user wants or not to receive notifications. - # Class NotifierSettings holds both pieces of info. - # Users will get notification x where x in {email, slack, sms, app} if three things are set to True: - # 1) .....settings().active - # 2) .....settings().x_enabled - # 3) .....user_settings().x - - preferences = self._get_api().services.notifications.settings() - if not preferences: - notification_print_str = "Create notification settings using enable_notifications from user_service" - else: - notifications = [] - if preferences.email_enabled: - notifications.append("email") - if preferences.sms_enabled: - notifications.append("sms") - if preferences.slack_enabled: - notifications.append("slack") - if preferences.app_enabled: - notifications.append("app") - - # self.notifications_enabled = preferences.active - if preferences.active: - if notifications: - notification_print_str = f"Enabled via {', '.join(notifications)}" - else: - notification_print_str = "Enabled without any communication method" - else: - notification_print_str = "Disabled" - - return f""" - -
-

Settings

-

Id: {self.id}

-

Name: {self.name}

-

Organization: {self.organization}

-

Description: {self.description}

-

Deployed on: {self.deployed_on}

-

Signup enabled: {self.signup_enabled}

-

Notifications enabled: {notification_print_str}

-

Admin email: {self.admin_email}

-
- - """ - @serializable() class ServerSettings(SyftObject): diff --git a/packages/syft/src/syft/service/user/user.py b/packages/syft/src/syft/service/user/user.py index 9177e167ccf..b37464d6c7a 100644 --- a/packages/syft/src/syft/service/user/user.py +++ b/packages/syft/src/syft/service/user/user.py @@ -112,12 +112,23 @@ def migrate_server_user_update_v1_current() -> list[Callable]: return [ make_set_default("reset_token", None), make_set_default("reset_token_date", None), + make_set_default( + "__attr_searchable__", + ["name", "email", "verify_key", "role", "reset_token"], + ), ] @migrate(User, UserV1) def migrate_server_user_downgrade_current_v1() -> list[Callable]: - return [drop("reset_token"), drop("reset_token_date")] + return [ + drop("reset_token"), + drop("reset_token_date"), + drop("__attr_searchable__"), + make_set_default( + "__attr_searchable__", ["name", "email", "verify_key", "role"] + ), + ] def default_role(role: ServiceRole) -> Callable: diff --git a/packages/syft/src/syft/service/user/user_service.py b/packages/syft/src/syft/service/user/user_service.py index 3d722938e5d..9ea91ca4ee1 100644 --- a/packages/syft/src/syft/service/user/user_service.py +++ b/packages/syft/src/syft/service/user/user_service.py @@ -97,13 +97,14 @@ def create( def forgot_password( self, context: AuthedServiceContext, email: str ) -> SyftSuccess | SyftError: + success_msg = ( + "If the email is valid, we sent a password " + + "reset token to your email or a password request to the admin." + ) result = self.stash.get_by_email(credentials=context.credentials, email=email) # Isn't a valid email if result.is_err(): - return SyftSuccess( - message="If the email is valid, we sent a password \ - reset token to your email or a password request to the admin." - ) + return SyftSuccess(message=success_msg) user = result.ok() user_role = self.get_role_for_credentials(user.verify_key) @@ -159,10 +160,7 @@ def forgot_password( if isinstance(result, SyftError): return result - return SyftSuccess( - message="If the email is valid, we sent a password reset \ - token to your email or a password request to the admin." - ) + return SyftSuccess(message=success_msg) # Email notification is Enabled # Therefore, we can directly send a message to the user with its new password. @@ -180,9 +178,7 @@ def forgot_password( if isinstance(result, SyftError): return result - return SyftSuccess( - message="If the email is valid, we sent a password request to the admin." - ) + return SyftSuccess(message=success_msg) @service_method( path="user.request_password_reset", @@ -289,8 +285,6 @@ def generate_new_password_reset_token( if token_config.numbers: valid_characters += string.digits - # valid_characters = string.ascii_letters + string.digits - generated_token = "".join( secrets.choice(valid_characters) for _ in range(token_config.token_len) ) From 886b1fc76d8dbd90f4003bb02b9d370403581574 Mon Sep 17 00:00:00 2001 From: IonesioJunior Date: Fri, 26 Jul 2024 10:54:49 -0300 Subject: [PATCH 16/46] Add token exp as a PwdResetToken config option --- .../src/syft/protocol/protocol_version.json | 66 ++----------------- .../src/syft/service/settings/settings.py | 1 + .../src/syft/service/user/user_service.py | 3 +- 3 files changed, 7 insertions(+), 63 deletions(-) diff --git a/packages/syft/src/syft/protocol/protocol_version.json b/packages/syft/src/syft/protocol/protocol_version.json index 4ce7a814058..78dae434fe2 100644 --- a/packages/syft/src/syft/protocol/protocol_version.json +++ b/packages/syft/src/syft/protocol/protocol_version.json @@ -1,66 +1,8 @@ { + "1": { + "release_name": "0.8.7.json" + }, "2": { "release_name": "0.8.8.json" - }, - "dev": { - "object_versions": { - "UserNotificationActivity": { - "1": { - "version": 1, - "hash": "422fd01c6d9af38688a9982abd34e80794a1f6ddd444cca225d77f49189847a9", - "action": "add" - } - }, - "NotifierSettings": { - "1": { - "version": 1, - "hash": "65c8ab814d35fac32f68d3000756692592cc59940f30e3af3dcdfa2328755b9d", - "action": "remove" - }, - "2": { - "version": 2, - "hash": "be8b52597fc628d1b7cd22b776ee81416e1adbb04a45188778eb0e32ed1416b4", - "action": "add" - } - }, - "PwdTokenResetConfig": { - "1": { - "version": 1, - "hash": "88f1f450d5ef7b00acc179ed75f3d01ebb4f206ff47d0bb8f45a98f1ff42cba2", - "action": "add" - } - }, - "ServerSettingsUpdate": { - "2": { - "version": 2, - "hash": "23b2716e9dceca667e228408e2416c82f11821e322e5bccf1f83406f3d09abdc", - "action": "add" - }, - "3": { - "version": 3, - "hash": "335c7946f2e52d09c7b26f511120cd340717c74c5cca9107e84f839da993c55c", - "action": "add" - } - }, - "User": { - "2": { - "version": 2, - "hash": "af6fb5b2e1606e97838f4a60f0536ad95db606d455e94acbd1977df866608a2c", - "action": "add" - } - }, - "ServerSettings": { - "2": { - "version": 2, - "hash": "7727ea54e494dc9deaa0d1bd38ac8a6180bc192b74eec5659adbc338a19e21f5", - "action": "add" - }, - "3": { - "version": 3, - "hash": "997667e1cba22d151857aacc2caba6b1ca73c1648adbd03461dc74a0c0c372b3", - "action": "add" - } - } - } } -} +} diff --git a/packages/syft/src/syft/service/settings/settings.py b/packages/syft/src/syft/service/settings/settings.py index 4ed29c7fd40..67720658c80 100644 --- a/packages/syft/src/syft/service/settings/settings.py +++ b/packages/syft/src/syft/service/settings/settings.py @@ -39,6 +39,7 @@ class PwdTokenResetConfig(SyftObject): ascii: bool = True numbers: bool = True token_len: int = 12 + token_exp_min: int = 30 @model_validator(mode="after") def validate_char_types(self) -> Self: diff --git a/packages/syft/src/syft/service/user/user_service.py b/packages/syft/src/syft/service/user/user_service.py index 9ea91ca4ee1..0dd2aade952 100644 --- a/packages/syft/src/syft/service/user/user_service.py +++ b/packages/syft/src/syft/service/user/user_service.py @@ -249,7 +249,8 @@ def reset_password( time_difference = now - user.reset_token_date # If token expired - if time_difference > timedelta(minutes=30): + expiration_time = context.server.settings.pwd_token_config.token_exp_min + if time_difference > timedelta(minutes=expiration_time): return invalid_token_error if not validate_password(new_password): From d745a9c60ceedcc53aaae4611c919786877b65f6 Mon Sep 17 00:00:00 2001 From: IonesioJunior Date: Fri, 26 Jul 2024 11:31:27 -0300 Subject: [PATCH 17/46] Fix linting --- packages/syft/src/syft/protocol/protocol_version.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/syft/src/syft/protocol/protocol_version.json b/packages/syft/src/syft/protocol/protocol_version.json index 78dae434fe2..0eb298b0648 100644 --- a/packages/syft/src/syft/protocol/protocol_version.json +++ b/packages/syft/src/syft/protocol/protocol_version.json @@ -5,4 +5,4 @@ "2": { "release_name": "0.8.8.json" } -} +} From 5aa4cdd83f406789492d1061a32d7c674864d1cc Mon Sep 17 00:00:00 2001 From: Irina Bejan Date: Tue, 30 Jul 2024 12:12:50 +0100 Subject: [PATCH 18/46] Update README file --- README.md | 167 +++++++++++++++++++++++++++++++++++------------------- 1 file changed, 110 insertions(+), 57 deletions(-) diff --git a/README.md b/README.md index 78d48b156f4..fc2a07b6c2a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -
+


@@ -6,11 +6,27 @@ Syft Logo -Perform data science on `data` that remains in `someone else's` server +

Data Science on data you are not allowed to see

+ +PySyft enables a new way to do data science, where you can use non-public information, without seeing nor obtaining a copy of the data itself. All you need is to connect to a Datasite! + +Datasites are like websites, but for data. Designed with the principles of structured transparency, it enables data owners to control how their data is protected and data scientists to use data responsibly. + +PySyft supports any statistical analysis or machine learning, offering support for running directly Python code - even using third-party Python libraries. + +

Supported on:

+ +✅ Linux +✅ macOS +✅ Windows +✅ Docker +✅ Kubernetes + # Quickstart -✅ `Linux` ✅ `macOS` ✅ `Windows` ✅ `Docker` ✅ `Kubernetes` +Try out your first query against a live demo Datasite! + ## Install Client @@ -18,34 +34,45 @@ Perform data science on `data` that remains in `someone else's` server $ pip install -U syft[data_science] ``` +More instructions are available here. + ## Launch Server +Launch a development server directly in your Jupyter Notebook: + ```python -# from Jupyter / Python import syft as sy -sy.requires(">=0.8.8,<0.8.9") + +sy.requires(">=0.9,<0.9.1") + server = sy.orchestra.launch( name="my-datasite", port=8080, create_producer=True, n_consumers=1, - dev_mode=True, + dev_mode=False, reset=True, # resets database ) ``` +or from the command line: ```bash -# or from the command line $ syft launch --name=my-datasite --port=8080 --reset=True Starting syft-datasite server on 0.0.0.0:8080 ``` +Datasite servers can be deployed as a single container using Docker or directly in Kubernetes. Check out our deployment guide. + ## Launch Client +Main way to use a Datasite is via our Syft client, in a Jupyter Notebook. Check out our PySyft client guide: + ```python import syft as sy -sy.requires(">=0.8.8,<0.8.9") + +sy.requires(">=0.9,<0.9.1") + datasite_client = sy.login( port=8080, email="info@openmined.org", @@ -53,24 +80,62 @@ datasite_client = sy.login( ) ``` -## PySyft in 10 minutes +## PySyft - Getting started 📝 + +Learn about PySyft via our getting started guide: + +- PySyft from the ground up +- Part 1: Datasets & Assets +- Part 2: Client and Datasite Access +- Part 3: Propose the research study +- Part 4: Review Code Requests +- Part 5: Retrieving Results + + +# PySyft In-depth + +📚 Check out our docs website. + +Quick PySyft components links: +- DataSite Server + +- Syft Client + +- Datasets API (`.datasets`) + +- Users API (`.users`) + +- Projects API (`.projects`) + +- Request API (`.requests`) + +- Code API (`.code`) -📝 API Example Notebooks +- Syft Policies API (`.policy`) -- 00-load-data.ipynb -- 01-submit-code.ipynb -- 02-review-code-and-approve.ipynb -- 03-data-scientist-download-result.ipynb -- 04-pytorch-example.ipynb -- 05-custom-policy.ipynb -- 06-multiple-code-requests.ipynb -- 07-datasite-register-control-flow.ipynb -- 08-code-version.ipynb -- 09-blob-storage.ipynb -- 10-container-images.ipynb -- 11-container-images-k8s.ipynb -- 12-custom-api-endpoint.ipynb +- Settings API (`.settings`) +- Notifications API (`.notifications`) + +- Sync API (`.sync`) + + +## Why use PySyft? + +In a variety of domains across society, data owners have **valid concerns about the risks associated with sharing their data**, such as legal risks, privacy invasion (*misuing the data*), or intellectual property (*copying and redistributing it*). + +Datasites enable data scientists to **answer questions** without even seeing or acquiring a copy of the data, **within the data owners's definition of acceptable use**. We call this process Remote Data Science. + +This means that the **current risks** of sharing information with someone will **no longer prevent** the vast benefits such as innovation, insights and scientific discovery. With each Datasite, data owners are able to enable `1000x more accesible data` in each scientific field and lead, together with data scientists, breakthrough innovation. + +Learn more about our work on our website. + + +## Support + +For questions about PySyft, reach out via `#support` on Slack. + + + -# Versions +## Syft Versions -`0.9.0` (Beta) - `dev` branch 👈🏽 API - Coming soon... -`0.8.8` (Stable) - API +:exclamation: PySyft and Syft Server must use the same `version`. -Deprecated: +### Latest Stable +`0.8.8` (Stable) - Docs +- Install PySyft (Stable): `pip install -U syft` + + +### Latest Beta +`0.9.0` (Beta) - `dev` branch 👈🏽 +- Install PySyft (Beta): `pip install -U syft --pre` + +**Deprecated**: - `0.8.7` - API - `0.8.6` - API @@ -163,12 +232,7 @@ Deprecated: - `0.5.1` - Course 2 + M1 Hotfix - `0.2.0` - `0.5.0` -PySyft and Syft Server use the same `version` and its best to match them up where possible. We release weekly betas which can be used in each context: - -PySyft (Stable): `pip install -U syft` - -PySyft (Beta): `pip install -U syft --pre` - + - + Provide `datasets` which they would like to make available for `study` by an `outside party` they may or may not `fully trust` has good intentions. - Are end `users` who desire to perform `computations` or `answer` a specific `question` using one or more data owners' `datasets`. @@ -282,22 +338,22 @@ Are end `users` who desire to perform `computations` or `answer` a specific `que - Manages the `remote study` of the data by a `Data Scientist` and allows the `Data Owner` to manage the `data` and control the `privacy guarantees` of the subjects under study. It also acts as a `gatekeeper` for the `Data Scientist's` access to the data to compute and experiment with the results. - Provides services to a group of `Data Owners` and `Data Scientists`, such as dataset `search` and bulk `project approval` (legal / technical) to participate in a project. A gateway server acts as a bridge between it's members (`Datasites`) and their subscribers (`Data Scientists`) and can provide access to a collection of `datasites` at once. - + --> # Community +OpenMined is a growing community of over 15000 engineers, educators, scientists, product managers and privacy-aware individuals. +
@@ -377,7 +433,7 @@ Provides services to a group of `Data Owners` and `Data Scientists`, such as dat # Contributors -OpenMined and Syft appreciates all contributors, if you would like to fix a bug or suggest a new feature, please see our [guidelines](https://openmined.github.io/PySyft/developer_guide/index.html).
+OpenMined and Syft appreciates all contributors, if you would like to fix a bug or suggest a new feature, please reach out via Github or Slack! @@ -441,9 +497,6 @@ OpenMined and Syft appreciates all contributors, if you would like to fix a bug
-# Disclaimer - -Syft is under active development and is not yet ready for pilots on private data without our assistance. As early access participants, please contact us via [Slack](https://slack.openmined.org/) or email if you would like to ask a question or have a use case that you would like to discuss. # License From f095193ba68f54fec18a85b6dd916e398e26f6c0 Mon Sep 17 00:00:00 2001 From: Irina Bejan Date: Tue, 30 Jul 2024 12:13:34 +0100 Subject: [PATCH 19/46] Add missing link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fc2a07b6c2a..12b31dbf5a4 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ PySyft enables a new way to do data science, where you can use non-public information, without seeing nor obtaining a copy of the data itself. All you need is to connect to a Datasite! -Datasites are like websites, but for data. Designed with the principles of structured transparency, it enables data owners to control how their data is protected and data scientists to use data responsibly. +Datasites are like websites, but for data. Designed with the principles of structured transparency, it enables data owners to control how their data is protected and data scientists to use data responsibly. PySyft supports any statistical analysis or machine learning, offering support for running directly Python code - even using third-party Python libraries. From 022d4dd4ee403779342bad17c017211bfdcf30f4 Mon Sep 17 00:00:00 2001 From: Irina Bejan Date: Tue, 30 Jul 2024 12:14:59 +0100 Subject: [PATCH 20/46] Remove outdated parts --- README.md | 187 ------------------------------------------------------ 1 file changed, 187 deletions(-) diff --git a/README.md b/README.md index 12b31dbf5a4..ad7c1ea00fc 100644 --- a/README.md +++ b/README.md @@ -135,75 +135,6 @@ Learn more about our work on our website. For questions about PySyft, reach out via `#support` on Slack. - - - - ## Syft Versions :exclamation: PySyft and Syft Server must use the same `version`. @@ -232,124 +163,6 @@ helm install ... --set ingress.class="gce" - `0.5.1` - Course 2 + M1 Hotfix - `0.2.0` - `0.5.0` - - - - - # Community OpenMined is a growing community of over 15000 engineers, educators, scientists, product managers and privacy-aware individuals. From a1affa7e4b2f047ae941d375b66dfb7b9e7ef559 Mon Sep 17 00:00:00 2001 From: Irina Bejan Date: Tue, 30 Jul 2024 15:49:54 +0300 Subject: [PATCH 21/46] Remove the join us screenshot for conciseness --- README.md | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index ad7c1ea00fc..63b6ef1da1b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@


+ Syft Logo @@ -165,25 +166,14 @@ For questions about PySyft, reach out via `#support` on -
- -
- - - - - - - - -
-
- +
@@ -192,6 +182,8 @@ OpenMined is a growing community of over 15000 engineers, educators, scientists,

+📖 Beyond Privacy Trade-offs with Structured Transpar..
+📖 Structured access: an emerging paradigm for safe AI..
🎥 PETs: Remote Data Science Unleashed - R gov 2021
🎥 Introduction to Remote Data Science - PyTorch 2021
🎥 The Future of AI Tools - PyTorch 2020
@@ -205,7 +197,7 @@ OpenMined is a growing community of over 15000 engineers, educators, scientists,

- +
@@ -225,18 +217,18 @@ OpenMined is a growing community of over 15000 engineers, educators, scientists,
- +
- +
- +
From 8f7780f933749c65eac99d2f48bf2c3bb8455b15 Mon Sep 17 00:00:00 2001 From: Irina Bejan Date: Tue, 30 Jul 2024 15:54:28 +0300 Subject: [PATCH 22/46] Fix videos & papers sizes --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 63b6ef1da1b..d3be0aaaa36 100644 --- a/README.md +++ b/README.md @@ -180,10 +180,11 @@ OpenMined is a fully distributed, open-source community of over 16,000 engineers - -

-📖 Beyond Privacy Trade-offs with Structured Transpar..
-📖 Structured access: an emerging paradigm for safe AI..
+
+
+

+📖 Beyond Privacy Trade-offs with Structured Transparency
+📖 Structured access: an emerging paradigm for safe AI deployment
🎥 PETs: Remote Data Science Unleashed - R gov 2021
🎥 Introduction to Remote Data Science - PyTorch 2021
🎥 The Future of AI Tools - PyTorch 2020
From ac0382d87db953ee19b052156623cedd310b66af Mon Sep 17 00:00:00 2001 From: Irina Bejan Date: Tue, 30 Jul 2024 16:00:54 +0300 Subject: [PATCH 23/46] Fix linter --- README.md | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index d3be0aaaa36..09052aea08d 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@



- Syft Logo @@ -9,7 +8,7 @@

Data Science on data you are not allowed to see

-PySyft enables a new way to do data science, where you can use non-public information, without seeing nor obtaining a copy of the data itself. All you need is to connect to a Datasite! +PySyft enables a new way to do data science, where you can use non-public information, without seeing nor obtaining a copy of the data itself. All you need is to connect to a Datasite! Datasites are like websites, but for data. Designed with the principles of structured transparency, it enables data owners to control how their data is protected and data scientists to use data responsibly. @@ -18,17 +17,15 @@ PySyft supports any statistical analysis or machine learning, offering support f

Supported on:

✅ Linux -✅ macOS +✅ macOS ✅ Windows ✅ Docker ✅ Kubernetes - # Quickstart Try out your first query against a live demo Datasite! - ## Install Client ```bash @@ -57,6 +54,7 @@ server = sy.orchestra.launch( ``` or from the command line: + ```bash $ syft launch --name=my-datasite --port=8080 --reset=True @@ -81,7 +79,7 @@ datasite_client = sy.login( ) ``` -## PySyft - Getting started 📝 +## PySyft - Getting started 📝 Learn about PySyft via our getting started guide: @@ -92,12 +90,12 @@ Learn about PySyft via our getting started guide: - Part 4: Review Code Requests - Part 5: Retrieving Results - # PySyft In-depth 📚 Check out our docs website. Quick PySyft components links: + - DataSite Server - Syft Client @@ -120,7 +118,6 @@ Quick PySyft components links: - Sync API (`.sync`) - ## Why use PySyft? In a variety of domains across society, data owners have **valid concerns about the risks associated with sharing their data**, such as legal risks, privacy invasion (*misuing the data*), or intellectual property (*copying and redistributing it*). @@ -131,22 +128,22 @@ This means that the **current risks** of sharing information with someone will * Learn more about our work on our website. - ## Support For questions about PySyft, reach out via `#support` on Slack. ## Syft Versions -:exclamation: PySyft and Syft Server must use the same `version`. +:exclamation: PySyft and Syft Server must use the same `version`. ### Latest Stable -`0.8.8` (Stable) - Docs -- Install PySyft (Stable): `pip install -U syft` +- `0.8.8` (Stable) - Docs +- Install PySyft (Stable): `pip install -U syft` ### Latest Beta -`0.9.0` (Beta) - `dev` branch 👈🏽 + +- `0.9.0` (Beta) - `dev` branch 👈🏽 - Install PySyft (Beta): `pip install -U syft --pre` **Deprecated**: @@ -166,7 +163,7 @@ For questions about PySyft, reach out via `#support` on @@ -303,7 +300,6 @@ OpenMined and Syft appreciates all contributors, if you would like to fix a bug
- # License [Apache License 2.0](LICENSE)
From 43220215f24f0fc8b1b174ef28d5a26c3973dfda Mon Sep 17 00:00:00 2001 From: IonesioJunior Date: Tue, 30 Jul 2024 10:15:50 -0300 Subject: [PATCH 24/46] Improve code readability --- .../src/syft/service/user/user_service.py | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/packages/syft/src/syft/service/user/user_service.py b/packages/syft/src/syft/service/user/user_service.py index 0dd2aade952..06014015c57 100644 --- a/packages/syft/src/syft/service/user/user_service.py +++ b/packages/syft/src/syft/service/user/user_service.py @@ -159,24 +159,23 @@ def forgot_password( result = method(context=root_context, notification=message) if isinstance(result, SyftError): return result + else: + # Email notification is Enabled + # Therefore, we can directly send a message to the + # user with its new password. + message = CreateNotification( + subject="You requested a password reset.", + from_user_verify_key=root_key, + to_user_verify_key=user.verify_key, + linked_obj=link, + notifier_types=[NOTIFIERS.EMAIL], + email_template=PasswordResetTemplate, + ) - return SyftSuccess(message=success_msg) - - # Email notification is Enabled - # Therefore, we can directly send a message to the user with its new password. - message = CreateNotification( - subject="You requested a password reset.", - from_user_verify_key=root_key, - to_user_verify_key=user.verify_key, - linked_obj=link, - notifier_types=[NOTIFIERS.EMAIL], - email_template=PasswordResetTemplate, - ) - - method = context.server.get_service_method(NotificationService.send) - result = method(context=root_context, notification=message) - if isinstance(result, SyftError): - return result + method = context.server.get_service_method(NotificationService.send) + result = method(context=root_context, notification=message) + if isinstance(result, SyftError): + return result return SyftSuccess(message=success_msg) From ee7d2d30da93a045ad4db8b923d8b910b6a1f180 Mon Sep 17 00:00:00 2001 From: Shubham Gupta Date: Tue, 30 Jul 2024 19:12:51 +0530 Subject: [PATCH 25/46] fix lint --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 09052aea08d..3ee7ca9d1bd 100644 --- a/README.md +++ b/README.md @@ -120,7 +120,7 @@ Quick PySyft components links: ## Why use PySyft? -In a variety of domains across society, data owners have **valid concerns about the risks associated with sharing their data**, such as legal risks, privacy invasion (*misuing the data*), or intellectual property (*copying and redistributing it*). +In a variety of domains across society, data owners have **valid concerns about the risks associated with sharing their data**, such as legal risks, privacy invasion (_misuing the data_), or intellectual property (_copying and redistributing it_). Datasites enable data scientists to **answer questions** without even seeing or acquiring a copy of the data, **within the data owners's definition of acceptable use**. We call this process Remote Data Science. @@ -143,7 +143,7 @@ For questions about PySyft, reach out via `#support` on +


@@ -136,79 +136,23 @@ For questions about PySyft, reach out via `#support` on Docs - Install PySyft (Stable): `pip install -U syft` -### Latest Beta +**Latest Beta** - `0.9.0` (Beta) - `dev` branch 👈🏽 - Install PySyft (Beta): `pip install -U syft --pre` -**Deprecated**: - -- `0.8.7` - API -- `0.8.6` - API -- `0.8.5-post.2` - API -- `0.8.4` - API -- `0.8.3` - API -- `0.8.2` - API -- `0.8.1` - API -- `0.8.0` - API -- `0.7.0` - Course 3 Updated -- `0.6.0` - Course 3 -- `0.5.1` - Course 2 + M1 Hotfix -- `0.2.0` - `0.5.0` +Find more about previous releases here. # Community OpenMined is a fully distributed, open-source community of over 16,000 engineers, researchers, community organizers, product managers, writers, teachers, and enthusiasts. - - - - - - - -
- - - - -
- - - - - - - - -
-
+ # Courses diff --git a/releases.md b/releases.md new file mode 100644 index 00000000000..d95a4457be9 --- /dev/null +++ b/releases.md @@ -0,0 +1,28 @@ +# Releases + +:exclamation: PySyft and Syft Server must use the same `version`. + +### Latest Stable + +- `0.8.8` (Stable) - Docs +- Install PySyft (Stable): `pip install -U syft` + +### Latest Beta + +- `0.9.0` (Beta) - `dev` branch 👈🏽 +- Install PySyft (Beta): `pip install -U syft --pre` + +**Deprecated**: + +- `0.8.7` - API +- `0.8.6` - API +- `0.8.5-post.2` - API +- `0.8.4` - API +- `0.8.3` - API +- `0.8.2` - API +- `0.8.1` - API +- `0.8.0` - API +- `0.7.0` - Course 3 Updated +- `0.6.0` - Course 3 +- `0.5.1` - Course 2 + M1 Hotfix +- `0.2.0` - `0.5.0` \ No newline at end of file From 2858fd662229a660353aa6c3c6b7a776fe5af3e6 Mon Sep 17 00:00:00 2001 From: Andrew Trask Date: Tue, 30 Jul 2024 16:09:55 +0100 Subject: [PATCH 27/46] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index be0f41db0d8..42fe299be53 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ PySyft enables a new way to do data science, where you can use non-public information, without seeing nor obtaining a copy of the data itself. All you need is to connect to a Datasite! -Datasites are like websites, but for data. Designed with the principles of structured transparency, it enables data owners to control how their data is protected and data scientists to use data responsibly. +Datasites are like websites, but for data. Designed with the principles of structured transparency, they enable data owners to control how their data is protected and data scientists to use data responsibly. PySyft supports any statistical analysis or machine learning, offering support for running directly Python code - even using third-party Python libraries. From db2d0178e0971ec88ec5e3031d959530ef325142 Mon Sep 17 00:00:00 2001 From: Andrew Trask Date: Tue, 30 Jul 2024 16:10:46 +0100 Subject: [PATCH 28/46] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 42fe299be53..4658da926ce 100644 --- a/README.md +++ b/README.md @@ -10,9 +10,9 @@ PySyft enables a new way to do data science, where you can use non-public information, without seeing nor obtaining a copy of the data itself. All you need is to connect to a Datasite! -Datasites are like websites, but for data. Designed with the principles of structured transparency, they enable data owners to control how their data is protected and data scientists to use data responsibly. +Datasites are like websites, but for data. Designed with the principles of structured transparency, they enable data owners to control how their data is protected and data scientists to use data without obtaining a copy. -PySyft supports any statistical analysis or machine learning, offering support for running directly Python code - even using third-party Python libraries. +PySyft supports any statistical analysis or machine learning, offering support for directly running Python code - even using third-party Python libraries.

Supported on:

From 89ee38798555fbdebe840662507cb957cad2abc6 Mon Sep 17 00:00:00 2001 From: IonesioJunior Date: Tue, 30 Jul 2024 15:34:29 -0300 Subject: [PATCH 29/46] ADD protocol version --- .../src/syft/protocol/protocol_version.json | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/packages/syft/src/syft/protocol/protocol_version.json b/packages/syft/src/syft/protocol/protocol_version.json index 0eb298b0648..9cf7d42efd0 100644 --- a/packages/syft/src/syft/protocol/protocol_version.json +++ b/packages/syft/src/syft/protocol/protocol_version.json @@ -4,5 +4,51 @@ }, "2": { "release_name": "0.8.8.json" + }, + "dev": { + "object_versions": { + "User": { + "2": { + "version": 2, + "hash": "af6fb5b2e1606e97838f4a60f0536ad95db606d455e94acbd1977df866608a2c", + "action": "add" + } + }, + "UserNotificationActivity": { + "1": { + "version": 1, + "hash": "422fd01c6d9af38688a9982abd34e80794a1f6ddd444cca225d77f49189847a9", + "action": "add" + } + }, + "NotifierSettings": { + "2": { + "version": 2, + "hash": "be8b52597fc628d1b7cd22b776ee81416e1adbb04a45188778eb0e32ed1416b4", + "action": "add" + } + }, + "PwdTokenResetConfig": { + "1": { + "version": 1, + "hash": "0415a272428f22add4896c64aa9f29c8c1d35619e2433da6564eb5f1faff39ac", + "action": "add" + } + }, + "ServerSettingsUpdate": { + "3": { + "version": 3, + "hash": "335c7946f2e52d09c7b26f511120cd340717c74c5cca9107e84f839da993c55c", + "action": "add" + } + }, + "ServerSettings": { + "3": { + "version": 3, + "hash": "997667e1cba22d151857aacc2caba6b1ca73c1648adbd03461dc74a0c0c372b3", + "action": "add" + } + } + } } } From 84c214a0c12778f0c88d113386f9c795b1c1ca0f Mon Sep 17 00:00:00 2001 From: Irina Bejan Date: Tue, 30 Jul 2024 23:25:34 +0300 Subject: [PATCH 30/46] Integrate feedback --- README.md | 12 ++-- docs/img/Syft-Logo-Light.svg | 126 +++++++++++++++++++++++++++++++++++ docs/img/Syft-Logo.svg | 126 +++++++++++++++++++++++++++++++++++ 3 files changed, 260 insertions(+), 4 deletions(-) create mode 100644 docs/img/Syft-Logo-Light.svg create mode 100644 docs/img/Syft-Logo.svg diff --git a/README.md b/README.md index 4658da926ce..39ea1560eb7 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,8 @@

- - Syft Logo + + Syft Logo

Data Science on data you are not allowed to see

@@ -150,7 +150,7 @@ Find more about previous releases here. # Community -OpenMined is a fully distributed, open-source community of over 16,000 engineers, researchers, community organizers, product managers, writers, teachers, and enthusiasts. +Supported by the OpenMined Foundation, the OpenMined Community is an online network of over 17,000 technologists, researchers, and industry professionals keen to *unlock 1000x more data in every scientific field and industry*. @@ -180,13 +180,17 @@ OpenMined is a fully distributed, open-source community of over 16,000 engineers # Contributors -OpenMined and Syft appreciates all contributors, if you would like to fix a bug or suggest a new feature, please reach out via Github or Slack! +OpenMined and Syft appreciates all contributors, if you would like to fix a bug or suggest a new feature, please reach out via Github or Slack! Contributors +# About OpenMined + +OpenMined is a non-profit foundation creating technology infrastructure that helps researchers get answers from data without needing a copy or direct access. Our community of technologists is building Syft. + # Supporters diff --git a/docs/img/Syft-Logo-Light.svg b/docs/img/Syft-Logo-Light.svg new file mode 100644 index 00000000000..8d1bff88f21 --- /dev/null +++ b/docs/img/Syft-Logo-Light.svg @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/img/Syft-Logo.svg b/docs/img/Syft-Logo.svg new file mode 100644 index 00000000000..24adb15bbf7 --- /dev/null +++ b/docs/img/Syft-Logo.svg @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 3942ae39184a4fa12e9293aa162763da72c5f92d Mon Sep 17 00:00:00 2001 From: Irina Bejan Date: Tue, 30 Jul 2024 23:30:38 +0300 Subject: [PATCH 31/46] Add donation CTA --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 39ea1560eb7..e33cfd95c92 100644 --- a/README.md +++ b/README.md @@ -191,6 +191,9 @@ OpenMined and Syft appreciates all contributors, if you would like to fix a bug OpenMined is a non-profit foundation creating technology infrastructure that helps researchers get answers from data without needing a copy or direct access. Our community of technologists is building Syft. + + # Supporters
From 82c5cd8bda309ee864cbb3ed749f6ff92d630e7f Mon Sep 17 00:00:00 2001 From: Shubham Gupta Date: Wed, 31 Jul 2024 12:53:02 +0530 Subject: [PATCH 32/46] fix lint --- README.md | 2 +- releases.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e33cfd95c92..e117ee5905c 100644 --- a/README.md +++ b/README.md @@ -150,7 +150,7 @@ Find more about previous releases here. # Community -Supported by the OpenMined Foundation, the OpenMined Community is an online network of over 17,000 technologists, researchers, and industry professionals keen to *unlock 1000x more data in every scientific field and industry*. +Supported by the OpenMined Foundation, the OpenMined Community is an online network of over 17,000 technologists, researchers, and industry professionals keen to _unlock 1000x more data in every scientific field and industry_. diff --git a/releases.md b/releases.md index d95a4457be9..1f9ec045d23 100644 --- a/releases.md +++ b/releases.md @@ -9,7 +9,7 @@ ### Latest Beta -- `0.9.0` (Beta) - `dev` branch 👈🏽 +- `0.9.0` (Beta) - `dev` branch 👈🏽 - Install PySyft (Beta): `pip install -U syft --pre` **Deprecated**: @@ -25,4 +25,4 @@ - `0.7.0` - Course 3 Updated - `0.6.0` - Course 3 - `0.5.1` - Course 2 + M1 Hotfix -- `0.2.0` - `0.5.0` \ No newline at end of file +- `0.2.0` - `0.5.0` From 8c558afb68ac2b284131f1192cffffb2dd8a51c2 Mon Sep 17 00:00:00 2001 From: Irina Bejan Date: Wed, 31 Jul 2024 12:28:22 +0300 Subject: [PATCH 33/46] Update file names --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index e117ee5905c..cb52188f19a 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@

Data Science on data you are not allowed to see

-PySyft enables a new way to do data science, where you can use non-public information, without seeing nor obtaining a copy of the data itself. All you need is to connect to a Datasite! +PySyft enables a new way to do data science, where you can use non-public information, without seeing nor obtaining a copy of the data itself. All you need is to connect to a Datasite! Datasites are like websites, but for data. Designed with the principles of structured transparency, they enable data owners to control how their data is protected and data scientists to use data without obtaining a copy. @@ -96,27 +96,27 @@ Learn about PySyft via our getting started guide: Quick PySyft components links: -- DataSite Server +- DataSite Server -- Syft Client +- Syft Client - Datasets API (`.datasets`) - Users API (`.users`) -- Projects API (`.projects`) +- Projects API (`.projects`) -- Request API (`.requests`) +- Request API (`.requests`) - Code API (`.code`) -- Syft Policies API (`.policy`) +- Syft Policies API (`.policy`) -- Settings API (`.settings`) +- Settings API (`.settings`) - Notifications API (`.notifications`) -- Sync API (`.sync`) +- Sync API (`.sync`) ## Why use PySyft? From 7594e8514e521afe173c1f9c0c18c7e516699746 Mon Sep 17 00:00:00 2001 From: IonesioJunior Date: Wed, 31 Jul 2024 11:16:02 -0300 Subject: [PATCH 34/46] Update syft version for prepare migration data CI --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index 5fd5cf7fc6f..4e5ae2d2001 100644 --- a/tox.ini +++ b/tox.ini @@ -1078,7 +1078,7 @@ commands = description = Prepare Migration Data pip_pre = True deps = - syft==0.8.7 + syft==0.8.8 nbmake allowlist_externals = bash From 30584e2bc0da19d472403c496b2ca60edda9b57e Mon Sep 17 00:00:00 2001 From: IonesioJunior Date: Wed, 31 Jul 2024 12:18:28 -0300 Subject: [PATCH 35/46] Fix migration tests --- packages/syft/src/syft/service/user/user.py | 23 +++++++++++++++++++ .../src/syft/types/syft_object_registry.py | 5 +++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/packages/syft/src/syft/service/user/user.py b/packages/syft/src/syft/service/user/user.py index b37464d6c7a..be3fe07bba0 100644 --- a/packages/syft/src/syft/service/user/user.py +++ b/packages/syft/src/syft/service/user/user.py @@ -395,6 +395,24 @@ def user_create_to_user() -> list[Callable]: ] +@transform(UserV1, UserView) +def userv1_to_view_user() -> list[Callable]: + return [ + keep( + [ + "id", + "email", + "name", + "role", + "institution", + "website", + "mock_execution_permission", + "notifications_enabled", + ] + ) + ] + + @transform(User, UserView) def user_to_view_user() -> list[Callable]: return [ @@ -423,6 +441,11 @@ class UserPrivateKey(SyftObject): role: ServiceRole +@transform(UserV1, UserPrivateKey) +def userv1_to_user_verify() -> list[Callable]: + return [keep(["email", "signing_key", "id", "role"])] + + @transform(User, UserPrivateKey) def user_to_user_verify() -> list[Callable]: return [keep(["email", "signing_key", "id", "role"])] diff --git a/packages/syft/src/syft/types/syft_object_registry.py b/packages/syft/src/syft/types/syft_object_registry.py index d5cc342635e..3d0548f6cf1 100644 --- a/packages/syft/src/syft/types/syft_object_registry.py +++ b/packages/syft/src/syft/types/syft_object_registry.py @@ -131,7 +131,10 @@ def get_transform( klass_from = type_from_mro.__name__ version_from = None for type_to_mro in type_to.mro(): - if issubclass(type_to_mro, SyftBaseObject): + if ( + issubclass(type_to_mro, SyftBaseObject) + and type_to_mro != SyftBaseObject + ): klass_to = type_to_mro.__canonical_name__ version_to = type_to_mro.__version__ else: From 470cae83db0c59070c5ebbeef48f4d8d8a76a24c Mon Sep 17 00:00:00 2001 From: IonesioJunior Date: Wed, 31 Jul 2024 13:26:52 -0300 Subject: [PATCH 36/46] Fix user transform --- packages/syft/src/syft/service/user/user.py | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/syft/src/syft/service/user/user.py b/packages/syft/src/syft/service/user/user.py index be3fe07bba0..cb9b8860c03 100644 --- a/packages/syft/src/syft/service/user/user.py +++ b/packages/syft/src/syft/service/user/user.py @@ -112,6 +112,7 @@ def migrate_server_user_update_v1_current() -> list[Callable]: return [ make_set_default("reset_token", None), make_set_default("reset_token_date", None), + drop("__attr_searchable__"), make_set_default( "__attr_searchable__", ["name", "email", "verify_key", "role", "reset_token"], From e3529e3072c165596d3a3ce10902e0f8659e8cf8 Mon Sep 17 00:00:00 2001 From: IonesioJunior Date: Wed, 31 Jul 2024 15:22:41 -0300 Subject: [PATCH 37/46] ADD test notebook --- .../api/0.8/13-forgot-user-password.ipynb | 170 ++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100644 notebooks/api/0.8/13-forgot-user-password.ipynb diff --git a/notebooks/api/0.8/13-forgot-user-password.ipynb b/notebooks/api/0.8/13-forgot-user-password.ipynb new file mode 100644 index 00000000000..dc778a92f7e --- /dev/null +++ b/notebooks/api/0.8/13-forgot-user-password.ipynb @@ -0,0 +1,170 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# Forgot User Password" + ] + }, + { + "cell_type": "markdown", + "id": "1", + "metadata": {}, + "source": [ + "## Initialize the server" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "# stdlib\n", + "\n", + "# syft absolute\n", + "import syft as sy\n", + "from syft import SyftError\n", + "from syft import SyftSuccess\n", + "\n", + "server = sy.orchestra.launch(\n", + " name=\"test-datasite-1\",\n", + " dev_mode=True,\n", + " create_producer=True,\n", + " n_consumers=3,\n", + " reset=True,\n", + " port=8081,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "3", + "metadata": {}, + "source": [ + "## Register a new user" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], + "source": [ + "datasite_client = server.login(email=\"info@openmined.org\", password=\"changethis\")\n", + "datasite_client.register(\n", + " email=\"user@openmined.org\",\n", + " password=\"verysecurepassword\",\n", + " password_verify=\"verysecurepassword\",\n", + " name=\"New User\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "5", + "metadata": {}, + "source": [ + "### Ask for a password reset - Notifier disabled Workflow" + ] + }, + { + "cell_type": "markdown", + "id": "6", + "metadata": {}, + "source": [ + "### Call for users.forgot_password" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7", + "metadata": {}, + "outputs": [], + "source": [ + "guest_client = server.login_as_guest()\n", + "res = guest_client.users.forgot_password(email=\"user@openmined.org\")\n", + "\n", + "assert isinstance(res, SyftSuccess)" + ] + }, + { + "cell_type": "markdown", + "id": "8", + "metadata": {}, + "source": [ + "### Admin generates a temp token" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9", + "metadata": {}, + "outputs": [], + "source": [ + "temp_token = datasite_client.users.request_password_reset(\n", + " datasite_client.notifications[0].linked_obj.resolve.id\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "10", + "metadata": {}, + "source": [ + "### User use this token to reset password" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "11", + "metadata": {}, + "outputs": [], + "source": [ + "res = guest_client.users.reset_password(token=temp_token, new_password=\"Password123\")\n", + "\n", + "assert isinstance(res, SyftSuccess)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12", + "metadata": {}, + "outputs": [], + "source": [ + "new_user_session = server.login(email=\"user@openmined.org\", password=\"Password123\")\n", + "\n", + "assert not isinstance(new_user_session, SyftError)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 200829966dc0360d95ddfcf43159c71153e4c5d8 Mon Sep 17 00:00:00 2001 From: IonesioJunior Date: Wed, 31 Jul 2024 15:48:45 -0300 Subject: [PATCH 38/46] Set a fix number of rounds --- packages/syft/src/syft/service/user/user_service.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/syft/src/syft/service/user/user_service.py b/packages/syft/src/syft/service/user/user_service.py index 06014015c57..336f94b5e42 100644 --- a/packages/syft/src/syft/service/user/user_service.py +++ b/packages/syft/src/syft/service/user/user_service.py @@ -259,7 +259,7 @@ def reset_password( and at least one number." ) - salt, hashed = salt_and_hash_password(new_password, len(new_password)) + salt, hashed = salt_and_hash_password(new_password, 12) user.hashed_password = hashed user.salt = salt From a51d8821d8dc121c11244546916640f23510f09b Mon Sep 17 00:00:00 2001 From: IonesioJunior Date: Wed, 31 Jul 2024 16:29:55 -0300 Subject: [PATCH 39/46] Update test notebook --- notebooks/api/0.8/13-forgot-user-password.ipynb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/notebooks/api/0.8/13-forgot-user-password.ipynb b/notebooks/api/0.8/13-forgot-user-password.ipynb index dc778a92f7e..960a046d6e5 100644 --- a/notebooks/api/0.8/13-forgot-user-password.ipynb +++ b/notebooks/api/0.8/13-forgot-user-password.ipynb @@ -128,9 +128,7 @@ "metadata": {}, "outputs": [], "source": [ - "res = guest_client.users.reset_password(token=temp_token, new_password=\"Password123\")\n", - "\n", - "assert isinstance(res, SyftSuccess)" + "guest_client.users.reset_password(token=temp_token, new_password=\"Password123\")" ] }, { From 98f650c1721b857814883c2805f08c35796ffeeb Mon Sep 17 00:00:00 2001 From: IonesioJunior Date: Wed, 31 Jul 2024 16:42:25 -0300 Subject: [PATCH 40/46] Update notebook to show the error message --- notebooks/api/0.8/13-forgot-user-password.ipynb | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/notebooks/api/0.8/13-forgot-user-password.ipynb b/notebooks/api/0.8/13-forgot-user-password.ipynb index 960a046d6e5..afb8e091c4c 100644 --- a/notebooks/api/0.8/13-forgot-user-password.ipynb +++ b/notebooks/api/0.8/13-forgot-user-password.ipynb @@ -27,7 +27,6 @@ "\n", "# syft absolute\n", "import syft as sy\n", - "from syft import SyftError\n", "from syft import SyftSuccess\n", "\n", "server = sy.orchestra.launch(\n", @@ -128,7 +127,10 @@ "metadata": {}, "outputs": [], "source": [ - "guest_client.users.reset_password(token=temp_token, new_password=\"Password123\")" + "res = guest_client.users.reset_password(token=temp_token, new_password=\"Password123\")\n", + "\n", + "if not isinstance(res, SyftSuccess):\n", + " raise Exception(f\"Res isn't SyftSuccess, its {res}\")" ] }, { @@ -140,7 +142,8 @@ "source": [ "new_user_session = server.login(email=\"user@openmined.org\", password=\"Password123\")\n", "\n", - "assert not isinstance(new_user_session, SyftError)" + "if not isinstance(new_user_session, SyftSuccess):\n", + " raise Exception(f\"Res isn't SyftSuccess, its {new_user_session}\")" ] } ], From 11fe2741518b7da36062006156f887573f9f2c2b Mon Sep 17 00:00:00 2001 From: IonesioJunior Date: Wed, 31 Jul 2024 16:52:10 -0300 Subject: [PATCH 41/46] Update notebook to show the error message --- notebooks/api/0.8/13-forgot-user-password.ipynb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/notebooks/api/0.8/13-forgot-user-password.ipynb b/notebooks/api/0.8/13-forgot-user-password.ipynb index afb8e091c4c..91b7ef69427 100644 --- a/notebooks/api/0.8/13-forgot-user-password.ipynb +++ b/notebooks/api/0.8/13-forgot-user-password.ipynb @@ -89,7 +89,8 @@ "guest_client = server.login_as_guest()\n", "res = guest_client.users.forgot_password(email=\"user@openmined.org\")\n", "\n", - "assert isinstance(res, SyftSuccess)" + "if not isinstance(res, SyftSuccess):\n", + " raise Exception(f\"Res isn't SyftSuccess, its {res}\")" ] }, { @@ -109,7 +110,10 @@ "source": [ "temp_token = datasite_client.users.request_password_reset(\n", " datasite_client.notifications[0].linked_obj.resolve.id\n", - ")" + ")\n", + "\n", + "if not isinstance(temp_token, str):\n", + " raise Exception(f\"temp_token isn't a string, its {res}\")" ] }, { From f203c63e21ecb86b51ef9e0fbe0675b437544da1 Mon Sep 17 00:00:00 2001 From: IonesioJunior Date: Wed, 31 Jul 2024 17:05:44 -0300 Subject: [PATCH 42/46] Update notebook to show the error message --- .../api/0.8/13-forgot-user-password.ipynb | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/notebooks/api/0.8/13-forgot-user-password.ipynb b/notebooks/api/0.8/13-forgot-user-password.ipynb index 91b7ef69427..4d7f6a96426 100644 --- a/notebooks/api/0.8/13-forgot-user-password.ipynb +++ b/notebooks/api/0.8/13-forgot-user-password.ipynb @@ -94,9 +94,19 @@ ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": null, "id": "8", "metadata": {}, + "outputs": [], + "source": [ + "res" + ] + }, + { + "cell_type": "markdown", + "id": "9", + "metadata": {}, "source": [ "### Admin generates a temp token" ] @@ -104,7 +114,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9", + "id": "10", "metadata": {}, "outputs": [], "source": [ @@ -113,12 +123,12 @@ ")\n", "\n", "if not isinstance(temp_token, str):\n", - " raise Exception(f\"temp_token isn't a string, its {res}\")" + " raise Exception(f\"temp_token isn't a string, its {temp_token}\")" ] }, { "cell_type": "markdown", - "id": "10", + "id": "11", "metadata": {}, "source": [ "### User use this token to reset password" @@ -127,7 +137,7 @@ { "cell_type": "code", "execution_count": null, - "id": "11", + "id": "12", "metadata": {}, "outputs": [], "source": [ @@ -140,7 +150,7 @@ { "cell_type": "code", "execution_count": null, - "id": "12", + "id": "13", "metadata": {}, "outputs": [], "source": [ From c19853e9cb3af1e5836d75ce063d31b8ee89f90e Mon Sep 17 00:00:00 2001 From: IonesioJunior Date: Wed, 31 Jul 2024 17:31:05 -0300 Subject: [PATCH 43/46] Update test notebook to get the latest notification --- .../api/0.8/13-forgot-user-password.ipynb | 40 +++++++++---------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/notebooks/api/0.8/13-forgot-user-password.ipynb b/notebooks/api/0.8/13-forgot-user-password.ipynb index 4d7f6a96426..8ad3cdf0918 100644 --- a/notebooks/api/0.8/13-forgot-user-password.ipynb +++ b/notebooks/api/0.8/13-forgot-user-password.ipynb @@ -27,6 +27,7 @@ "\n", "# syft absolute\n", "import syft as sy\n", + "from syft import SyftError\n", "from syft import SyftSuccess\n", "\n", "server = sy.orchestra.launch(\n", @@ -55,12 +56,15 @@ "outputs": [], "source": [ "datasite_client = server.login(email=\"info@openmined.org\", password=\"changethis\")\n", - "datasite_client.register(\n", - " email=\"user@openmined.org\",\n", + "res = datasite_client.register(\n", + " email=\"new_syft_user@openmined.org\",\n", " password=\"verysecurepassword\",\n", " password_verify=\"verysecurepassword\",\n", " name=\"New User\",\n", - ")" + ")\n", + "\n", + "if not isinstance(res, SyftSuccess):\n", + " raise Exception(f\"Res isn't SyftSuccess, its {res}\")" ] }, { @@ -87,25 +91,15 @@ "outputs": [], "source": [ "guest_client = server.login_as_guest()\n", - "res = guest_client.users.forgot_password(email=\"user@openmined.org\")\n", + "res = guest_client.users.forgot_password(email=\"new_syft_user@openmined.org\")\n", "\n", "if not isinstance(res, SyftSuccess):\n", " raise Exception(f\"Res isn't SyftSuccess, its {res}\")" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "8", - "metadata": {}, - "outputs": [], - "source": [ - "res" - ] - }, { "cell_type": "markdown", - "id": "9", + "id": "8", "metadata": {}, "source": [ "### Admin generates a temp token" @@ -114,12 +108,12 @@ { "cell_type": "code", "execution_count": null, - "id": "10", + "id": "9", "metadata": {}, "outputs": [], "source": [ "temp_token = datasite_client.users.request_password_reset(\n", - " datasite_client.notifications[0].linked_obj.resolve.id\n", + " datasite_client.notifications[-1].linked_obj.resolve.id\n", ")\n", "\n", "if not isinstance(temp_token, str):\n", @@ -128,7 +122,7 @@ }, { "cell_type": "markdown", - "id": "11", + "id": "10", "metadata": {}, "source": [ "### User use this token to reset password" @@ -137,7 +131,7 @@ { "cell_type": "code", "execution_count": null, - "id": "12", + "id": "11", "metadata": {}, "outputs": [], "source": [ @@ -150,13 +144,15 @@ { "cell_type": "code", "execution_count": null, - "id": "13", + "id": "12", "metadata": {}, "outputs": [], "source": [ - "new_user_session = server.login(email=\"user@openmined.org\", password=\"Password123\")\n", + "new_user_session = server.login(\n", + " email=\"new_syft_user@openmined.org\", password=\"Password123\"\n", + ")\n", "\n", - "if not isinstance(new_user_session, SyftSuccess):\n", + "if isinstance(new_user_session, SyftError):\n", " raise Exception(f\"Res isn't SyftSuccess, its {new_user_session}\")" ] } From c3a0f86d787ee26153cfedea2639b79d73dddc5c Mon Sep 17 00:00:00 2001 From: alfred-openmined-bot <145415986+alfred-openmined-bot@users.noreply.github.com> Date: Thu, 1 Aug 2024 06:54:33 +0000 Subject: [PATCH 44/46] [syft]bump version --- .bumpversion.cfg | 2 +- VERSION | 2 +- packages/grid/VERSION | 2 +- .../backend/grid/images/worker_cpu.dockerfile | 2 +- packages/grid/devspace.yaml | 2 +- packages/grid/frontend/package.json | 2 +- packages/grid/helm/repo/index.yaml | 213 ++++++++++-------- packages/grid/helm/repo/syft-0.9.0-beta.4.tgz | Bin 0 -> 10451 bytes packages/grid/helm/syft/Chart.yaml | 4 +- packages/grid/helm/syft/templates/NOTES.txt | 45 +++- packages/grid/helm/syft/values.yaml | 2 +- packages/syft/setup.cfg | 2 +- packages/syft/src/syft/VERSION | 2 +- packages/syft/src/syft/__init__.py | 2 +- packages/syftcli/manifest.yml | 8 +- 15 files changed, 173 insertions(+), 117 deletions(-) create mode 100644 packages/grid/helm/repo/syft-0.9.0-beta.4.tgz diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 0fc9bcf16cf..45a6aac01ce 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.9.0-beta.3 +current_version = 0.9.0-beta.4 tag = False tag_name = {new_version} commit = True diff --git a/VERSION b/VERSION index f74ed6cb9df..35cdd5829a6 100644 --- a/VERSION +++ b/VERSION @@ -1,5 +1,5 @@ # Mono Repo Global Version -__version__ = "0.9.0-beta.3" +__version__ = "0.9.0-beta.4" # elsewhere we can call this file: `python VERSION` and simply take the stdout # stdlib diff --git a/packages/grid/VERSION b/packages/grid/VERSION index f74ed6cb9df..35cdd5829a6 100644 --- a/packages/grid/VERSION +++ b/packages/grid/VERSION @@ -1,5 +1,5 @@ # Mono Repo Global Version -__version__ = "0.9.0-beta.3" +__version__ = "0.9.0-beta.4" # elsewhere we can call this file: `python VERSION` and simply take the stdout # stdlib diff --git a/packages/grid/backend/grid/images/worker_cpu.dockerfile b/packages/grid/backend/grid/images/worker_cpu.dockerfile index 3f7baa8520f..9982d3fb089 100644 --- a/packages/grid/backend/grid/images/worker_cpu.dockerfile +++ b/packages/grid/backend/grid/images/worker_cpu.dockerfile @@ -5,7 +5,7 @@ # NOTE: This dockerfile will be built inside a syft-backend container in PROD # Hence COPY will not work the same way in DEV vs. PROD -ARG SYFT_VERSION_TAG="0.9.0-beta.3" +ARG SYFT_VERSION_TAG="0.9.0-beta.4" FROM openmined/syft-backend:${SYFT_VERSION_TAG} # should match base image python version diff --git a/packages/grid/devspace.yaml b/packages/grid/devspace.yaml index cfa734a6928..1ee88131645 100644 --- a/packages/grid/devspace.yaml +++ b/packages/grid/devspace.yaml @@ -28,7 +28,7 @@ vars: DOCKER_IMAGE_RATHOLE: openmined/syft-rathole DOCKER_IMAGE_ENCLAVE_ATTESTATION: openmined/syft-enclave-attestation CONTAINER_REGISTRY: "docker.io" - VERSION: "0.9.0-beta.3" + VERSION: "0.9.0-beta.4" PLATFORM: $(uname -m | grep -q 'arm64' && echo "arm64" || echo "amd64") # This is a list of `images` that DevSpace can build for this project diff --git a/packages/grid/frontend/package.json b/packages/grid/frontend/package.json index 3fc6edd48af..737d9cad300 100644 --- a/packages/grid/frontend/package.json +++ b/packages/grid/frontend/package.json @@ -1,6 +1,6 @@ { "name": "syft-ui", - "version": "0.9.0-beta.3", + "version": "0.9.0-beta.4", "private": true, "scripts": { "dev": "pnpm i && vite dev --host --port 80", diff --git a/packages/grid/helm/repo/index.yaml b/packages/grid/helm/repo/index.yaml index 0632a030e55..9dba575b8f4 100644 --- a/packages/grid/helm/repo/index.yaml +++ b/packages/grid/helm/repo/index.yaml @@ -1,9 +1,22 @@ apiVersion: v1 entries: syft: + - apiVersion: v2 + appVersion: 0.9.0-beta.4 + created: "2024-08-01T06:52:36.197258654Z" + description: Perform numpy-like analysis on data that remains in someone elses + server + digest: 5a3cd3dd57609231ffc13e6af8d55f68b1b79fbbe8261740db957526fb8a536a + home: https://github.com/OpenMined/PySyft/ + icon: https://raw.githubusercontent.com/OpenMined/PySyft/dev/docs/img/title_syft_light.png + name: syft + type: application + urls: + - https://openmined.github.io/PySyft/helm/syft-0.9.0-beta.4.tgz + version: 0.9.0-beta.4 - apiVersion: v2 appVersion: 0.9.0-beta.3 - created: "2024-07-30T07:52:02.555199795Z" + created: "2024-08-01T06:52:36.196130576Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: affe0898286720a0281c2363bed404a09d229a5359951b4dfdd8e746d628b4cb @@ -16,7 +29,7 @@ entries: version: 0.9.0-beta.3 - apiVersion: v2 appVersion: 0.9.0-beta.2 - created: "2024-07-30T07:52:02.554486414Z" + created: "2024-08-01T06:52:36.19514055Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 105b60f0ff01f50386d2b063cb58c0e91ee41b74cefee7bca3f56e4025c38dd1 @@ -29,7 +42,7 @@ entries: version: 0.9.0-beta.2 - apiVersion: v2 appVersion: 0.9.0-beta.1 - created: "2024-07-30T07:52:02.553765819Z" + created: "2024-08-01T06:52:36.194442669Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 10246075684d168e6a51c009581b77df8d729e29e11abc4a360fae42659a6409 @@ -42,7 +55,7 @@ entries: version: 0.9.0-beta.1 - apiVersion: v2 appVersion: 0.8.8 - created: "2024-07-30T07:52:02.553000261Z" + created: "2024-08-01T06:52:36.193735049Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 46f75bdf8c39e0f17de266bf19b64852e0dbf7f7bcea60bf7a19018ff17370ad @@ -55,7 +68,7 @@ entries: version: 0.8.8 - apiVersion: v2 appVersion: 0.8.8-beta.4 - created: "2024-07-30T07:52:02.551541399Z" + created: "2024-08-01T06:52:36.192992394Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: cc0a3b49df19435a407e4764be6c5748511f14273e668e7f1d326af28b29f22a @@ -68,7 +81,7 @@ entries: version: 0.8.8-beta.4 - apiVersion: v2 appVersion: 0.8.8-beta.3 - created: "2024-07-30T07:52:02.550844138Z" + created: "2024-08-01T06:52:36.192294473Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: de2fba39516e98be39ae0110a2cfa5bfa2b665d7a35a4516b43c5310bbf621dc @@ -81,7 +94,7 @@ entries: version: 0.8.8-beta.3 - apiVersion: v2 appVersion: 0.8.8-beta.2 - created: "2024-07-30T07:52:02.550142499Z" + created: "2024-08-01T06:52:36.191584429Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 1323f4082c65944b522cd8e36dc7285c83c7dfcf6a56f7962665a8b1256a4d09 @@ -94,7 +107,7 @@ entries: version: 0.8.8-beta.2 - apiVersion: v2 appVersion: 0.8.8-beta.1 - created: "2024-07-30T07:52:02.549409011Z" + created: "2024-08-01T06:52:36.190848467Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: ec027b50b8182ef656be14ddca9537785c37712a4be8cb940f30ac029b63de2d @@ -107,7 +120,7 @@ entries: version: 0.8.8-beta.1 - apiVersion: v2 appVersion: 0.8.7 - created: "2024-07-30T07:52:02.54871199Z" + created: "2024-08-01T06:52:36.190128765Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 7ea7f63d1c6d0948860547f8aa39343fc5ef399c8e62d9d7edd4473cf44d8186 @@ -120,7 +133,7 @@ entries: version: 0.8.7 - apiVersion: v2 appVersion: 0.8.7-beta.16 - created: "2024-07-30T07:52:02.541931969Z" + created: "2024-08-01T06:52:36.183346132Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 75190eae57b64c2c47ab4a7fe3c6e94f35eb8045807a843ec8d7b26585c9e840 @@ -133,7 +146,7 @@ entries: version: 0.8.7-beta.16 - apiVersion: v2 appVersion: 0.8.7-beta.15 - created: "2024-07-30T07:52:02.540990643Z" + created: "2024-08-01T06:52:36.182506757Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 56879d9a9f10febce88676d3d20621d74d17f9e33f5df6ae1e9bc3078c216f0c @@ -146,7 +159,7 @@ entries: version: 0.8.7-beta.15 - apiVersion: v2 appVersion: 0.8.7-beta.14 - created: "2024-07-30T07:52:02.540152078Z" + created: "2024-08-01T06:52:36.181649649Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 6e7cbca1d603ba11e09ae2a3089cfdafaa08cfa07c553c4f0fb8b42f8d3028f7 @@ -159,7 +172,7 @@ entries: version: 0.8.7-beta.14 - apiVersion: v2 appVersion: 0.8.7-beta.13 - created: "2024-07-30T07:52:02.539284649Z" + created: "2024-08-01T06:52:36.180331296Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 1dbe3ecdfec57bf25020cbcff783fab908f0eb0640ad684470b2fd1da1928005 @@ -172,7 +185,7 @@ entries: version: 0.8.7-beta.13 - apiVersion: v2 appVersion: 0.8.7-beta.12 - created: "2024-07-30T07:52:02.538557312Z" + created: "2024-08-01T06:52:36.179322956Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: e92b2f3a522dabb3a79ff762a7042ae16d2bf3a53eebbb2885a69b9f834d109c @@ -185,7 +198,7 @@ entries: version: 0.8.7-beta.12 - apiVersion: v2 appVersion: 0.8.7-beta.11 - created: "2024-07-30T07:52:02.537044321Z" + created: "2024-08-01T06:52:36.178619274Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 099f6cbd44b699ee2410a4be012ed1a8a65bcacb06a43057b2779d7fe34fc0ad @@ -198,7 +211,7 @@ entries: version: 0.8.7-beta.11 - apiVersion: v2 appVersion: 0.8.7-beta.10 - created: "2024-07-30T07:52:02.536350606Z" + created: "2024-08-01T06:52:36.177917015Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 00773cb241522e281c1915339fc362e047650e08958a736e93d6539f44cb5e25 @@ -211,7 +224,7 @@ entries: version: 0.8.7-beta.10 - apiVersion: v2 appVersion: 0.8.7-beta.9 - created: "2024-07-30T07:52:02.547873315Z" + created: "2024-08-01T06:52:36.189228556Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: a3f8e85d9ddef7a644b959fcc2fcb0fc08f7b6abae1045e893d0d62fa4ae132e @@ -224,7 +237,7 @@ entries: version: 0.8.7-beta.9 - apiVersion: v2 appVersion: 0.8.7-beta.8 - created: "2024-07-30T07:52:02.547221759Z" + created: "2024-08-01T06:52:36.18782329Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: a422ac88d8fd1fb80d5004d5eb6e95fa9efc7f6a87da12e5ac04829da7f04c4d @@ -237,7 +250,7 @@ entries: version: 0.8.7-beta.8 - apiVersion: v2 appVersion: 0.8.7-beta.7 - created: "2024-07-30T07:52:02.546554715Z" + created: "2024-08-01T06:52:36.187136049Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 0dc313a1092e6256a7c8aad002c8ec380b3add2c289d680db1e238a336399b7a @@ -250,7 +263,7 @@ entries: version: 0.8.7-beta.7 - apiVersion: v2 appVersion: 0.8.7-beta.6 - created: "2024-07-30T07:52:02.545905463Z" + created: "2024-08-01T06:52:36.186516243Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 052a2ec1102d2a4c9915f95647abd4a6012f56fa05a106f4952ee9b55bf7bae8 @@ -263,7 +276,7 @@ entries: version: 0.8.7-beta.6 - apiVersion: v2 appVersion: 0.8.7-beta.5 - created: "2024-07-30T07:52:02.544434458Z" + created: "2024-08-01T06:52:36.185896658Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 1728af756907c3fcbe87c2fd2de014a2d963c22a4c2eb6af6596b525a9b9a18a @@ -276,7 +289,7 @@ entries: version: 0.8.7-beta.5 - apiVersion: v2 appVersion: 0.8.7-beta.4 - created: "2024-07-30T07:52:02.543810193Z" + created: "2024-08-01T06:52:36.18527056Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 387a57a3904a05ed61e92ee48605ef6fd5044ff7e822e0924e0d4c485e2c88d2 @@ -289,7 +302,7 @@ entries: version: 0.8.7-beta.4 - apiVersion: v2 appVersion: 0.8.7-beta.3 - created: "2024-07-30T07:52:02.543190437Z" + created: "2024-08-01T06:52:36.184613455Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 3668002b7a4118516b2ecd61d6275f60d83fc12841587ab8f62e1c1200731c67 @@ -302,7 +315,7 @@ entries: version: 0.8.7-beta.3 - apiVersion: v2 appVersion: 0.8.7-beta.2 - created: "2024-07-30T07:52:02.542557446Z" + created: "2024-08-01T06:52:36.183981907Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: e62217ffcadee2b8896ab0543f9ccc42f2df898fd979438ac9376d780b802af7 @@ -315,7 +328,7 @@ entries: version: 0.8.7-beta.2 - apiVersion: v2 appVersion: 0.8.7-beta.1 - created: "2024-07-30T07:52:02.535679053Z" + created: "2024-08-01T06:52:36.177245292Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 553981fe1d5c980e6903b3ff2f1b9b97431f6dd8aee91e3976bcc5594285235e @@ -328,7 +341,7 @@ entries: version: 0.8.7-beta.1 - apiVersion: v2 appVersion: 0.8.6 - created: "2024-07-30T07:52:02.53516825Z" + created: "2024-08-01T06:52:36.176733878Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: ddbbe6fea1702e57404875eb3019a3b1a341017bdbb5fbc6ce418507e5c15756 @@ -341,7 +354,7 @@ entries: version: 0.8.6 - apiVersion: v2 appVersion: 0.8.6-beta.1 - created: "2024-07-30T07:52:02.534628343Z" + created: "2024-08-01T06:52:36.176197107Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: cc2c81ef6796ac853dce256e6bf8a6af966c21803e6534ea21920af681c62e61 @@ -354,7 +367,7 @@ entries: version: 0.8.6-beta.1 - apiVersion: v2 appVersion: 0.8.5 - created: "2024-07-30T07:52:02.534086482Z" + created: "2024-08-01T06:52:36.175652522Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: db5d90d44006209fd5ecdebd88f5fd56c70f7c76898343719a0ff8da46da948a @@ -367,7 +380,7 @@ entries: version: 0.8.5 - apiVersion: v2 appVersion: 0.8.5-post.2 - created: "2024-07-30T07:52:02.533282402Z" + created: "2024-08-01T06:52:36.17485224Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: ea3f7269b55f773fa165d7008c054b7cf3ec4c62eb40a96f08cd3a9b77fd2165 @@ -380,7 +393,7 @@ entries: version: 0.8.5-post.2 - apiVersion: v2 appVersion: 0.8.5-post.1 - created: "2024-07-30T07:52:02.532699474Z" + created: "2024-08-01T06:52:36.174298878Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 9deb844d3dc2d8480c60f8c631dcc7794adfb39cec3aa3b1ce22ea26fdf87d02 @@ -393,7 +406,7 @@ entries: version: 0.8.5-post.1 - apiVersion: v2 appVersion: 0.8.5-beta.10 - created: "2024-07-30T07:52:02.524984229Z" + created: "2024-08-01T06:52:36.166741692Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 9cfe01e8f57eca462261a24a805b41509be2de9a0fee76e331d124ed98c4bc49 @@ -406,7 +419,7 @@ entries: version: 0.8.5-beta.10 - apiVersion: v2 appVersion: 0.8.5-beta.9 - created: "2024-07-30T07:52:02.531873443Z" + created: "2024-08-01T06:52:36.173503595Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 057f1733f2bc966e15618f62629315c8207773ef6211c79c4feb557dae15c32b @@ -419,7 +432,7 @@ entries: version: 0.8.5-beta.9 - apiVersion: v2 appVersion: 0.8.5-beta.8 - created: "2024-07-30T07:52:02.531097445Z" + created: "2024-08-01T06:52:36.172097458Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 921cbce836c3032ef62b48cc82b5b4fcbe44fb81d473cf4d69a4bf0f806eb298 @@ -432,7 +445,7 @@ entries: version: 0.8.5-beta.8 - apiVersion: v2 appVersion: 0.8.5-beta.7 - created: "2024-07-30T07:52:02.529642591Z" + created: "2024-08-01T06:52:36.171306523Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 75482e955b2b9853a80bd653afb1d56535f78f3bfb7726798522307eb3effbbd @@ -445,7 +458,7 @@ entries: version: 0.8.5-beta.7 - apiVersion: v2 appVersion: 0.8.5-beta.6 - created: "2024-07-30T07:52:02.528891289Z" + created: "2024-08-01T06:52:36.170556915Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 6a2dfaf65ca855e1b3d7b966d4ff291e6fcbe761e2fc2a78033211ccd3a75de0 @@ -458,7 +471,7 @@ entries: version: 0.8.5-beta.6 - apiVersion: v2 appVersion: 0.8.5-beta.5 - created: "2024-07-30T07:52:02.528139616Z" + created: "2024-08-01T06:52:36.169806266Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: fead03823bef04d66901d563aa755c68ab277f72b126aaa6f0dce76a6f3bdb6d @@ -471,7 +484,7 @@ entries: version: 0.8.5-beta.5 - apiVersion: v2 appVersion: 0.8.5-beta.4 - created: "2024-07-30T07:52:02.527372726Z" + created: "2024-08-01T06:52:36.169053983Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 93e4539d5726a7fd0d6a3e93d1c17c6a358a923ddc01d102eab22f37377502ab @@ -484,7 +497,7 @@ entries: version: 0.8.5-beta.4 - apiVersion: v2 appVersion: 0.8.5-beta.3 - created: "2024-07-30T07:52:02.52654962Z" + created: "2024-08-01T06:52:36.168298194Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: f91e9390edf3441469048f5da646099af98f8b6d199409d0e2c1e6da3a51f054 @@ -497,7 +510,7 @@ entries: version: 0.8.5-beta.3 - apiVersion: v2 appVersion: 0.8.5-beta.2 - created: "2024-07-30T07:52:02.525785675Z" + created: "2024-08-01T06:52:36.167535672Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 59159c3aa4888038edc3c0135c83402363d7a0639fe62966a1e9d4928a364fa8 @@ -510,7 +523,7 @@ entries: version: 0.8.5-beta.2 - apiVersion: v2 appVersion: 0.8.5-beta.1 - created: "2024-07-30T07:52:02.524197541Z" + created: "2024-08-01T06:52:36.165966807Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 65aeb74c52ed8ba5474af500b4c1188a570ee4cb1f2a2da356b3488d28356ed9 @@ -522,7 +535,7 @@ entries: version: 0.8.5-beta.1 - apiVersion: v2 appVersion: 0.8.4 - created: "2024-07-30T07:52:02.523777909Z" + created: "2024-08-01T06:52:36.165336389Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 08afea8e3a9eef225b7e611f0bc1216c140053ef8e51439b02337faeac621fd0 @@ -534,7 +547,7 @@ entries: version: 0.8.4 - apiVersion: v2 appVersion: 0.8.4-beta.31 - created: "2024-07-30T07:52:02.520538172Z" + created: "2024-08-01T06:52:36.16242496Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: fabf3e2f37e53fa623f5d3d99b00feae06e278e5cd63bce419089946312ab1fc @@ -546,7 +559,7 @@ entries: version: 0.8.4-beta.31 - apiVersion: v2 appVersion: 0.8.4-beta.30 - created: "2024-07-30T07:52:02.52011886Z" + created: "2024-08-01T06:52:36.162020757Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 6e8f792709f73ec14eab48a268bdf50a4505b340bd142cddd7c7bfffd94009ad @@ -558,7 +571,7 @@ entries: version: 0.8.4-beta.30 - apiVersion: v2 appVersion: 0.8.4-beta.29 - created: "2024-07-30T07:52:02.519367047Z" + created: "2024-08-01T06:52:36.161263084Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 4c985d6a9b3456769c4013f9e85e7374c0f963d2d27627e61f914f5537de1971 @@ -570,7 +583,7 @@ entries: version: 0.8.4-beta.29 - apiVersion: v2 appVersion: 0.8.4-beta.28 - created: "2024-07-30T07:52:02.51896133Z" + created: "2024-08-01T06:52:36.160856526Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: bd2aa3c92c768c47c502e31a326f341addcb34e64d22cdcbf5cc3f19689d859c @@ -582,7 +595,7 @@ entries: version: 0.8.4-beta.28 - apiVersion: v2 appVersion: 0.8.4-beta.27 - created: "2024-07-30T07:52:02.518551395Z" + created: "2024-08-01T06:52:36.160446892Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: e8ad0869993af39d7adda8cb868dc0b24cfb63b4bb9820dc579939c1007a60ba @@ -594,7 +607,7 @@ entries: version: 0.8.4-beta.27 - apiVersion: v2 appVersion: 0.8.4-beta.26 - created: "2024-07-30T07:52:02.518138565Z" + created: "2024-08-01T06:52:36.160026468Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 30dccf630aa25a86a03c67572fe5411687d8ce6d58def448ea10efdba2b85e3a @@ -606,7 +619,7 @@ entries: version: 0.8.4-beta.26 - apiVersion: v2 appVersion: 0.8.4-beta.25 - created: "2024-07-30T07:52:02.517708863Z" + created: "2024-08-01T06:52:36.159589914Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: b6e2043bcf5a0335967d770c7939f5a7832955359a7d871c90b265660ff26e5f @@ -618,7 +631,7 @@ entries: version: 0.8.4-beta.25 - apiVersion: v2 appVersion: 0.8.4-beta.24 - created: "2024-07-30T07:52:02.517258292Z" + created: "2024-08-01T06:52:36.159134866Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: b19efa95394d50bb8d76da6ec306de5d3bb9ea55371fafea95a1282a697fa33e @@ -630,7 +643,7 @@ entries: version: 0.8.4-beta.24 - apiVersion: v2 appVersion: 0.8.4-beta.23 - created: "2024-07-30T07:52:02.516825515Z" + created: "2024-08-01T06:52:36.15852575Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 5c5d05c15bff548574896118ce92335ae10c5b78f5307fe9b2618e5a5aa71a5c @@ -642,7 +655,7 @@ entries: version: 0.8.4-beta.23 - apiVersion: v2 appVersion: 0.8.4-beta.22 - created: "2024-07-30T07:52:02.516242358Z" + created: "2024-08-01T06:52:36.157598Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 0160dbce938198132ca9cd2a5cb362816344687291f5b6d7cf6de8f2855e9414 @@ -654,7 +667,7 @@ entries: version: 0.8.4-beta.22 - apiVersion: v2 appVersion: 0.8.4-beta.21 - created: "2024-07-30T07:52:02.515282758Z" + created: "2024-08-01T06:52:36.157187214Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 7dce153d2fcae7513e9c132e139b2721fd975ea3cc43a370e34dbeb2a1b7f683 @@ -666,7 +679,7 @@ entries: version: 0.8.4-beta.21 - apiVersion: v2 appVersion: 0.8.4-beta.20 - created: "2024-07-30T07:52:02.514870298Z" + created: "2024-08-01T06:52:36.156777771Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: c51189a187bbf24135382e25cb00964e0330dfcd3b2f0c884581a6686f05dd28 @@ -678,7 +691,7 @@ entries: version: 0.8.4-beta.20 - apiVersion: v2 appVersion: 0.8.4-beta.19 - created: "2024-07-30T07:52:02.513887054Z" + created: "2024-08-01T06:52:36.155797323Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 8219575dedb42fa2ddbf2768a4e9afbfacbc2dff7e953d77c7b10a41b78dc687 @@ -690,7 +703,7 @@ entries: version: 0.8.4-beta.19 - apiVersion: v2 appVersion: 0.8.4-beta.18 - created: "2024-07-30T07:52:02.51344515Z" + created: "2024-08-01T06:52:36.155357192Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 6418cde559cf12f1f7fea5a2b123bba950e50eeb3be002441827d2ab7f9e4ef7 @@ -702,7 +715,7 @@ entries: version: 0.8.4-beta.18 - apiVersion: v2 appVersion: 0.8.4-beta.16 - created: "2024-07-30T07:52:02.513035806Z" + created: "2024-08-01T06:52:36.154957467Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 9c9840a7c9476dbb08e0ac83926330718fe50c89879752dd8f92712b036109c0 @@ -714,7 +727,7 @@ entries: version: 0.8.4-beta.16 - apiVersion: v2 appVersion: 0.8.4-beta.15 - created: "2024-07-30T07:52:02.512631241Z" + created: "2024-08-01T06:52:36.154556579Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 0955fd22da028315e30c68132cbfa4bdc82bae622039bcfce0de339707bb82eb @@ -726,7 +739,7 @@ entries: version: 0.8.4-beta.15 - apiVersion: v2 appVersion: 0.8.4-beta.14 - created: "2024-07-30T07:52:02.512188014Z" + created: "2024-08-01T06:52:36.154155051Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 56208571956abe20ed7a5cc1867cab2667ed792c63e53d0e8bb70a9b438b7bf6 @@ -738,7 +751,7 @@ entries: version: 0.8.4-beta.14 - apiVersion: v2 appVersion: 0.8.4-beta.13 - created: "2024-07-30T07:52:02.511832842Z" + created: "2024-08-01T06:52:36.153803836Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: d7222c72412b6ee5833fbb07d2549be179cdfc7ccd89e0ad947d112fce799b83 @@ -750,7 +763,7 @@ entries: version: 0.8.4-beta.13 - apiVersion: v2 appVersion: 0.8.4-beta.12 - created: "2024-07-30T07:52:02.511380467Z" + created: "2024-08-01T06:52:36.153451539Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: af08c723756e397962b2d5190dedfd50797b771c5caf58b93a6f65d8fa24785c @@ -762,7 +775,7 @@ entries: version: 0.8.4-beta.12 - apiVersion: v2 appVersion: 0.8.4-beta.11 - created: "2024-07-30T07:52:02.511028791Z" + created: "2024-08-01T06:52:36.153102849Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: a0235835ba57d185a83dd8a26281fa37b2077c3a37fe3a1c50585005695927e3 @@ -774,7 +787,7 @@ entries: version: 0.8.4-beta.11 - apiVersion: v2 appVersion: 0.8.4-beta.10 - created: "2024-07-30T07:52:02.510681654Z" + created: "2024-08-01T06:52:36.152752445Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 910ddfeba0c5e66651500dd11404afff092adc0f768ed68e0d93b04b83aa4388 @@ -786,7 +799,7 @@ entries: version: 0.8.4-beta.10 - apiVersion: v2 appVersion: 0.8.4-beta.9 - created: "2024-07-30T07:52:02.522909196Z" + created: "2024-08-01T06:52:36.164487887Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: c25ca8a9f072d6a5d02232448deaef5668aca05f24dfffbba3ebe30a4f75bb26 @@ -798,7 +811,7 @@ entries: version: 0.8.4-beta.9 - apiVersion: v2 appVersion: 0.8.4-beta.8 - created: "2024-07-30T07:52:02.522355593Z" + created: "2024-08-01T06:52:36.164150658Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 7249a39d4137e457b369384ba0a365c271c780d93a8327ce25083df763c39999 @@ -810,7 +823,7 @@ entries: version: 0.8.4-beta.8 - apiVersion: v2 appVersion: 0.8.4-beta.7 - created: "2024-07-30T07:52:02.521971066Z" + created: "2024-08-01T06:52:36.163810955Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: ee750c7c8d6ea05bd447375e624fdd7f66dd87680ab81f7b7e73df7379a9024a @@ -822,7 +835,7 @@ entries: version: 0.8.4-beta.7 - apiVersion: v2 appVersion: 0.8.4-beta.6 - created: "2024-07-30T07:52:02.521579615Z" + created: "2024-08-01T06:52:36.163442618Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 0e046be9f73df7444a995608c59af16fab9030b139b2acb4d6db6185b8eb5337 @@ -834,7 +847,7 @@ entries: version: 0.8.4-beta.6 - apiVersion: v2 appVersion: 0.8.4-beta.5 - created: "2024-07-30T07:52:02.521228801Z" + created: "2024-08-01T06:52:36.163107653Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: b56e9a23d46810eccdb4cf5272cc05126da3f6db314e541959c3efb5f260620b @@ -846,7 +859,7 @@ entries: version: 0.8.4-beta.5 - apiVersion: v2 appVersion: 0.8.4-beta.4 - created: "2024-07-30T07:52:02.520885831Z" + created: "2024-08-01T06:52:36.162765355Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 1d5808ecaf55391f3b27ae6236400066508acbd242e33db24a1ab4bffa77409e @@ -858,7 +871,7 @@ entries: version: 0.8.4-beta.4 - apiVersion: v2 appVersion: 0.8.4-beta.3 - created: "2024-07-30T07:52:02.51971155Z" + created: "2024-08-01T06:52:36.161609049Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: b64efa8529d82be56c6ab60487ed24420a5614d96d2509c1f93c1003eda71a54 @@ -870,7 +883,7 @@ entries: version: 0.8.4-beta.3 - apiVersion: v2 appVersion: 0.8.4-beta.2 - created: "2024-07-30T07:52:02.514445265Z" + created: "2024-08-01T06:52:36.156354502Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -886,7 +899,7 @@ entries: version: 0.8.4-beta.2 - apiVersion: v2 appVersion: 0.8.4-beta.1 - created: "2024-07-30T07:52:02.510311433Z" + created: "2024-08-01T06:52:36.152380722Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -902,7 +915,7 @@ entries: version: 0.8.4-beta.1 - apiVersion: v2 appVersion: 0.8.3 - created: "2024-07-30T07:52:02.509304673Z" + created: "2024-08-01T06:52:36.151042326Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -918,7 +931,7 @@ entries: version: 0.8.3 - apiVersion: v2 appVersion: 0.8.3-beta.6 - created: "2024-07-30T07:52:02.508015117Z" + created: "2024-08-01T06:52:36.150389279Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -934,7 +947,7 @@ entries: version: 0.8.3-beta.6 - apiVersion: v2 appVersion: 0.8.3-beta.5 - created: "2024-07-30T07:52:02.507440846Z" + created: "2024-08-01T06:52:36.149811231Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -950,7 +963,7 @@ entries: version: 0.8.3-beta.5 - apiVersion: v2 appVersion: 0.8.3-beta.4 - created: "2024-07-30T07:52:02.506856866Z" + created: "2024-08-01T06:52:36.149205441Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -966,7 +979,7 @@ entries: version: 0.8.3-beta.4 - apiVersion: v2 appVersion: 0.8.3-beta.2 - created: "2024-07-30T07:52:02.506193899Z" + created: "2024-08-01T06:52:36.148548076Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -982,7 +995,7 @@ entries: version: 0.8.3-beta.2 - apiVersion: v2 appVersion: 0.8.3-beta.1 - created: "2024-07-30T07:52:02.505603407Z" + created: "2024-08-01T06:52:36.147999533Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -998,7 +1011,7 @@ entries: version: 0.8.3-beta.1 - apiVersion: v2 appVersion: 0.8.2 - created: "2024-07-30T07:52:02.505051788Z" + created: "2024-08-01T06:52:36.147413991Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1014,7 +1027,7 @@ entries: version: 0.8.2 - apiVersion: v2 appVersion: 0.8.2-beta.60 - created: "2024-07-30T07:52:02.504407877Z" + created: "2024-08-01T06:52:36.146763849Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1030,7 +1043,7 @@ entries: version: 0.8.2-beta.60 - apiVersion: v2 appVersion: 0.8.2-beta.59 - created: "2024-07-30T07:52:02.503739971Z" + created: "2024-08-01T06:52:36.146101333Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1046,7 +1059,7 @@ entries: version: 0.8.2-beta.59 - apiVersion: v2 appVersion: 0.8.2-beta.58 - created: "2024-07-30T07:52:02.485726571Z" + created: "2024-08-01T06:52:36.144754784Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1062,7 +1075,7 @@ entries: version: 0.8.2-beta.58 - apiVersion: v2 appVersion: 0.8.2-beta.57 - created: "2024-07-30T07:52:02.484751702Z" + created: "2024-08-01T06:52:36.144121854Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1078,7 +1091,7 @@ entries: version: 0.8.2-beta.57 - apiVersion: v2 appVersion: 0.8.2-beta.56 - created: "2024-07-30T07:52:02.484113191Z" + created: "2024-08-01T06:52:36.143450613Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1094,7 +1107,7 @@ entries: version: 0.8.2-beta.56 - apiVersion: v2 appVersion: 0.8.2-beta.52 - created: "2024-07-30T07:52:02.483451787Z" + created: "2024-08-01T06:52:36.142816941Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1110,7 +1123,7 @@ entries: version: 0.8.2-beta.52 - apiVersion: v2 appVersion: 0.8.2-beta.51 - created: "2024-07-30T07:52:02.482814638Z" + created: "2024-08-01T06:52:36.14218316Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1126,7 +1139,7 @@ entries: version: 0.8.2-beta.51 - apiVersion: v2 appVersion: 0.8.2-beta.50 - created: "2024-07-30T07:52:02.482155248Z" + created: "2024-08-01T06:52:36.141538858Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1142,7 +1155,7 @@ entries: version: 0.8.2-beta.50 - apiVersion: v2 appVersion: 0.8.2-beta.49 - created: "2024-07-30T07:52:02.481447427Z" + created: "2024-08-01T06:52:36.140893445Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1158,7 +1171,7 @@ entries: version: 0.8.2-beta.49 - apiVersion: v2 appVersion: 0.8.2-beta.48 - created: "2024-07-30T07:52:02.480769352Z" + created: "2024-08-01T06:52:36.140236069Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1174,7 +1187,7 @@ entries: version: 0.8.2-beta.48 - apiVersion: v2 appVersion: 0.8.2-beta.47 - created: "2024-07-30T07:52:02.480081679Z" + created: "2024-08-01T06:52:36.139260278Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1190,7 +1203,7 @@ entries: version: 0.8.2-beta.47 - apiVersion: v2 appVersion: 0.8.2-beta.46 - created: "2024-07-30T07:52:02.478762129Z" + created: "2024-08-01T06:52:36.138112819Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1206,7 +1219,7 @@ entries: version: 0.8.2-beta.46 - apiVersion: v2 appVersion: 0.8.2-beta.45 - created: "2024-07-30T07:52:02.478196233Z" + created: "2024-08-01T06:52:36.137547224Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1222,7 +1235,7 @@ entries: version: 0.8.2-beta.45 - apiVersion: v2 appVersion: 0.8.2-beta.44 - created: "2024-07-30T07:52:02.477596554Z" + created: "2024-08-01T06:52:36.13697156Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1238,7 +1251,7 @@ entries: version: 0.8.2-beta.44 - apiVersion: v2 appVersion: 0.8.2-beta.43 - created: "2024-07-30T07:52:02.477030318Z" + created: "2024-08-01T06:52:36.136400766Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1254,7 +1267,7 @@ entries: version: 0.8.2-beta.43 - apiVersion: v2 appVersion: 0.8.2-beta.41 - created: "2024-07-30T07:52:02.476373301Z" + created: "2024-08-01T06:52:36.13573797Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1270,7 +1283,7 @@ entries: version: 0.8.2-beta.41 - apiVersion: v2 appVersion: 0.8.2-beta.40 - created: "2024-07-30T07:52:02.47569704Z" + created: "2024-08-01T06:52:36.135048134Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1286,7 +1299,7 @@ entries: version: 0.8.2-beta.40 - apiVersion: v2 appVersion: 0.8.2-beta.39 - created: "2024-07-30T07:52:02.475111828Z" + created: "2024-08-01T06:52:36.134484242Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1302,7 +1315,7 @@ entries: version: 0.8.2-beta.39 - apiVersion: v2 appVersion: 0.8.2-beta.38 - created: "2024-07-30T07:52:02.474545501Z" + created: "2024-08-01T06:52:36.133913408Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1318,7 +1331,7 @@ entries: version: 0.8.2-beta.38 - apiVersion: v2 appVersion: 0.8.2-beta.37 - created: "2024-07-30T07:52:02.473933359Z" + created: "2024-08-01T06:52:36.133295025Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1334,7 +1347,7 @@ entries: version: 0.8.2-beta.37 - apiVersion: v2 appVersion: 0.8.1 - created: "2024-07-30T07:52:02.472951647Z" + created: "2024-08-01T06:52:36.132373518Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1348,4 +1361,4 @@ entries: urls: - https://openmined.github.io/PySyft/helm/syft-0.8.1.tgz version: 0.8.1 -generated: "2024-07-30T07:52:02.47182193Z" +generated: "2024-08-01T06:52:36.131207554Z" diff --git a/packages/grid/helm/repo/syft-0.9.0-beta.4.tgz b/packages/grid/helm/repo/syft-0.9.0-beta.4.tgz new file mode 100644 index 0000000000000000000000000000000000000000..dfd98425d2c59b7ec9139df1d0604deefb3799ce GIT binary patch literal 10451 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 Date: Thu, 1 Aug 2024 13:29:45 +0530 Subject: [PATCH 45/46] fix helm index overwrite on releases --- .github/workflows/cd-feature-branch.yml | 2 +- .github/workflows/cd-syft.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cd-feature-branch.yml b/.github/workflows/cd-feature-branch.yml index 40fc583caad..9391998930f 100644 --- a/.github/workflows/cd-feature-branch.yml +++ b/.github/workflows/cd-feature-branch.yml @@ -346,8 +346,8 @@ jobs: - name: Copy helm repo files from Syft Repo run: | - cp packages/grid/helm/repo/index.yaml ghpages/helm/ cp packages/grid/helm/repo/syft-${{ needs.merge-docker-images.outputs.server_version }}.tgz ghpages/helm/ + cd ghpages/helm && helm repo index . --url https://openmined.github.io/PySyft/helm - name: Commit changes to gh-pages uses: EndBug/add-and-commit@v9 diff --git a/.github/workflows/cd-syft.yml b/.github/workflows/cd-syft.yml index a186bd95061..977c51f30bb 100644 --- a/.github/workflows/cd-syft.yml +++ b/.github/workflows/cd-syft.yml @@ -557,8 +557,8 @@ jobs: - name: Copy helm repo files from Syft Repo run: | - cp packages/grid/helm/repo/index.yaml ghpages/helm/ cp packages/grid/helm/repo/syft-${{ steps.release_checks.outputs.syft_version }}.tgz ghpages/helm/ + cd ghpages/helm && helm repo index . --url https://openmined.github.io/PySyft/helm - name: Commit changes to gh-pages uses: EndBug/add-and-commit@v9 From 88bc1378bcd5ed64692bc39e058982e38a843627 Mon Sep 17 00:00:00 2001 From: alfred-openmined-bot <145415986+alfred-openmined-bot@users.noreply.github.com> Date: Thu, 1 Aug 2024 08:15:42 +0000 Subject: [PATCH 46/46] [syft]bump version --- .bumpversion.cfg | 2 +- VERSION | 2 +- packages/grid/VERSION | 2 +- .../backend/grid/images/worker_cpu.dockerfile | 2 +- packages/grid/devspace.yaml | 2 +- packages/grid/frontend/package.json | 2 +- packages/grid/helm/repo/index.yaml | 215 ++++++++++-------- packages/grid/helm/repo/syft-0.9.0-beta.5.tgz | Bin 0 -> 10452 bytes packages/grid/helm/syft/Chart.yaml | 4 +- packages/grid/helm/syft/values.yaml | 2 +- packages/syft/setup.cfg | 2 +- packages/syft/src/syft/VERSION | 2 +- packages/syft/src/syft/__init__.py | 2 +- packages/syftcli/manifest.yml | 8 +- 14 files changed, 130 insertions(+), 117 deletions(-) create mode 100644 packages/grid/helm/repo/syft-0.9.0-beta.5.tgz diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 45a6aac01ce..5c66408e810 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.9.0-beta.4 +current_version = 0.9.0-beta.5 tag = False tag_name = {new_version} commit = True diff --git a/VERSION b/VERSION index 35cdd5829a6..0d9ec17e955 100644 --- a/VERSION +++ b/VERSION @@ -1,5 +1,5 @@ # Mono Repo Global Version -__version__ = "0.9.0-beta.4" +__version__ = "0.9.0-beta.5" # elsewhere we can call this file: `python VERSION` and simply take the stdout # stdlib diff --git a/packages/grid/VERSION b/packages/grid/VERSION index 35cdd5829a6..0d9ec17e955 100644 --- a/packages/grid/VERSION +++ b/packages/grid/VERSION @@ -1,5 +1,5 @@ # Mono Repo Global Version -__version__ = "0.9.0-beta.4" +__version__ = "0.9.0-beta.5" # elsewhere we can call this file: `python VERSION` and simply take the stdout # stdlib diff --git a/packages/grid/backend/grid/images/worker_cpu.dockerfile b/packages/grid/backend/grid/images/worker_cpu.dockerfile index 9982d3fb089..ecc357c807d 100644 --- a/packages/grid/backend/grid/images/worker_cpu.dockerfile +++ b/packages/grid/backend/grid/images/worker_cpu.dockerfile @@ -5,7 +5,7 @@ # NOTE: This dockerfile will be built inside a syft-backend container in PROD # Hence COPY will not work the same way in DEV vs. PROD -ARG SYFT_VERSION_TAG="0.9.0-beta.4" +ARG SYFT_VERSION_TAG="0.9.0-beta.5" FROM openmined/syft-backend:${SYFT_VERSION_TAG} # should match base image python version diff --git a/packages/grid/devspace.yaml b/packages/grid/devspace.yaml index 1ee88131645..7c478773f94 100644 --- a/packages/grid/devspace.yaml +++ b/packages/grid/devspace.yaml @@ -28,7 +28,7 @@ vars: DOCKER_IMAGE_RATHOLE: openmined/syft-rathole DOCKER_IMAGE_ENCLAVE_ATTESTATION: openmined/syft-enclave-attestation CONTAINER_REGISTRY: "docker.io" - VERSION: "0.9.0-beta.4" + VERSION: "0.9.0-beta.5" PLATFORM: $(uname -m | grep -q 'arm64' && echo "arm64" || echo "amd64") # This is a list of `images` that DevSpace can build for this project diff --git a/packages/grid/frontend/package.json b/packages/grid/frontend/package.json index 737d9cad300..c3cdc58e7f3 100644 --- a/packages/grid/frontend/package.json +++ b/packages/grid/frontend/package.json @@ -1,6 +1,6 @@ { "name": "syft-ui", - "version": "0.9.0-beta.4", + "version": "0.9.0-beta.5", "private": true, "scripts": { "dev": "pnpm i && vite dev --host --port 80", diff --git a/packages/grid/helm/repo/index.yaml b/packages/grid/helm/repo/index.yaml index 9dba575b8f4..cac506e6bc3 100644 --- a/packages/grid/helm/repo/index.yaml +++ b/packages/grid/helm/repo/index.yaml @@ -1,9 +1,22 @@ apiVersion: v1 entries: syft: + - apiVersion: v2 + appVersion: 0.9.0-beta.5 + created: "2024-08-01T08:13:52.692668271Z" + description: Perform numpy-like analysis on data that remains in someone elses + server + digest: a4eafd04b39b0c75d6a28ed2f7cfece450150477dc2c6a01e10e2087a5b02835 + home: https://github.com/OpenMined/PySyft/ + icon: https://raw.githubusercontent.com/OpenMined/PySyft/dev/docs/img/title_syft_light.png + name: syft + type: application + urls: + - https://openmined.github.io/PySyft/helm/syft-0.9.0-beta.5.tgz + version: 0.9.0-beta.5 - apiVersion: v2 appVersion: 0.9.0-beta.4 - created: "2024-08-01T06:52:36.197258654Z" + created: "2024-08-01T08:13:52.691928697Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 5a3cd3dd57609231ffc13e6af8d55f68b1b79fbbe8261740db957526fb8a536a @@ -16,7 +29,7 @@ entries: version: 0.9.0-beta.4 - apiVersion: v2 appVersion: 0.9.0-beta.3 - created: "2024-08-01T06:52:36.196130576Z" + created: "2024-08-01T08:13:52.691219099Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: affe0898286720a0281c2363bed404a09d229a5359951b4dfdd8e746d628b4cb @@ -29,7 +42,7 @@ entries: version: 0.9.0-beta.3 - apiVersion: v2 appVersion: 0.9.0-beta.2 - created: "2024-08-01T06:52:36.19514055Z" + created: "2024-08-01T08:13:52.690491217Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 105b60f0ff01f50386d2b063cb58c0e91ee41b74cefee7bca3f56e4025c38dd1 @@ -42,7 +55,7 @@ entries: version: 0.9.0-beta.2 - apiVersion: v2 appVersion: 0.9.0-beta.1 - created: "2024-08-01T06:52:36.194442669Z" + created: "2024-08-01T08:13:52.689786658Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 10246075684d168e6a51c009581b77df8d729e29e11abc4a360fae42659a6409 @@ -55,7 +68,7 @@ entries: version: 0.9.0-beta.1 - apiVersion: v2 appVersion: 0.8.8 - created: "2024-08-01T06:52:36.193735049Z" + created: "2024-08-01T08:13:52.689085947Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 46f75bdf8c39e0f17de266bf19b64852e0dbf7f7bcea60bf7a19018ff17370ad @@ -68,7 +81,7 @@ entries: version: 0.8.8 - apiVersion: v2 appVersion: 0.8.8-beta.4 - created: "2024-08-01T06:52:36.192992394Z" + created: "2024-08-01T08:13:52.688378874Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: cc0a3b49df19435a407e4764be6c5748511f14273e668e7f1d326af28b29f22a @@ -81,7 +94,7 @@ entries: version: 0.8.8-beta.4 - apiVersion: v2 appVersion: 0.8.8-beta.3 - created: "2024-08-01T06:52:36.192294473Z" + created: "2024-08-01T08:13:52.687663054Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: de2fba39516e98be39ae0110a2cfa5bfa2b665d7a35a4516b43c5310bbf621dc @@ -94,7 +107,7 @@ entries: version: 0.8.8-beta.3 - apiVersion: v2 appVersion: 0.8.8-beta.2 - created: "2024-08-01T06:52:36.191584429Z" + created: "2024-08-01T08:13:52.686936735Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 1323f4082c65944b522cd8e36dc7285c83c7dfcf6a56f7962665a8b1256a4d09 @@ -107,7 +120,7 @@ entries: version: 0.8.8-beta.2 - apiVersion: v2 appVersion: 0.8.8-beta.1 - created: "2024-08-01T06:52:36.190848467Z" + created: "2024-08-01T08:13:52.685555539Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: ec027b50b8182ef656be14ddca9537785c37712a4be8cb940f30ac029b63de2d @@ -120,7 +133,7 @@ entries: version: 0.8.8-beta.1 - apiVersion: v2 appVersion: 0.8.7 - created: "2024-08-01T06:52:36.190128765Z" + created: "2024-08-01T08:13:52.684842675Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 7ea7f63d1c6d0948860547f8aa39343fc5ef399c8e62d9d7edd4473cf44d8186 @@ -133,7 +146,7 @@ entries: version: 0.8.7 - apiVersion: v2 appVersion: 0.8.7-beta.16 - created: "2024-08-01T06:52:36.183346132Z" + created: "2024-08-01T08:13:52.678846967Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 75190eae57b64c2c47ab4a7fe3c6e94f35eb8045807a843ec8d7b26585c9e840 @@ -146,7 +159,7 @@ entries: version: 0.8.7-beta.16 - apiVersion: v2 appVersion: 0.8.7-beta.15 - created: "2024-08-01T06:52:36.182506757Z" + created: "2024-08-01T08:13:52.677218041Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 56879d9a9f10febce88676d3d20621d74d17f9e33f5df6ae1e9bc3078c216f0c @@ -159,7 +172,7 @@ entries: version: 0.8.7-beta.15 - apiVersion: v2 appVersion: 0.8.7-beta.14 - created: "2024-08-01T06:52:36.181649649Z" + created: "2024-08-01T08:13:52.676389953Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 6e7cbca1d603ba11e09ae2a3089cfdafaa08cfa07c553c4f0fb8b42f8d3028f7 @@ -172,7 +185,7 @@ entries: version: 0.8.7-beta.14 - apiVersion: v2 appVersion: 0.8.7-beta.13 - created: "2024-08-01T06:52:36.180331296Z" + created: "2024-08-01T08:13:52.675530667Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 1dbe3ecdfec57bf25020cbcff783fab908f0eb0640ad684470b2fd1da1928005 @@ -185,7 +198,7 @@ entries: version: 0.8.7-beta.13 - apiVersion: v2 appVersion: 0.8.7-beta.12 - created: "2024-08-01T06:52:36.179322956Z" + created: "2024-08-01T08:13:52.674808175Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: e92b2f3a522dabb3a79ff762a7042ae16d2bf3a53eebbb2885a69b9f834d109c @@ -198,7 +211,7 @@ entries: version: 0.8.7-beta.12 - apiVersion: v2 appVersion: 0.8.7-beta.11 - created: "2024-08-01T06:52:36.178619274Z" + created: "2024-08-01T08:13:52.674085532Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 099f6cbd44b699ee2410a4be012ed1a8a65bcacb06a43057b2779d7fe34fc0ad @@ -211,7 +224,7 @@ entries: version: 0.8.7-beta.11 - apiVersion: v2 appVersion: 0.8.7-beta.10 - created: "2024-08-01T06:52:36.177917015Z" + created: "2024-08-01T08:13:52.673382927Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 00773cb241522e281c1915339fc362e047650e08958a736e93d6539f44cb5e25 @@ -224,7 +237,7 @@ entries: version: 0.8.7-beta.10 - apiVersion: v2 appVersion: 0.8.7-beta.9 - created: "2024-08-01T06:52:36.189228556Z" + created: "2024-08-01T08:13:52.684007293Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: a3f8e85d9ddef7a644b959fcc2fcb0fc08f7b6abae1045e893d0d62fa4ae132e @@ -237,7 +250,7 @@ entries: version: 0.8.7-beta.9 - apiVersion: v2 appVersion: 0.8.7-beta.8 - created: "2024-08-01T06:52:36.18782329Z" + created: "2024-08-01T08:13:52.683351655Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: a422ac88d8fd1fb80d5004d5eb6e95fa9efc7f6a87da12e5ac04829da7f04c4d @@ -250,7 +263,7 @@ entries: version: 0.8.7-beta.8 - apiVersion: v2 appVersion: 0.8.7-beta.7 - created: "2024-08-01T06:52:36.187136049Z" + created: "2024-08-01T08:13:52.682674187Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 0dc313a1092e6256a7c8aad002c8ec380b3add2c289d680db1e238a336399b7a @@ -263,7 +276,7 @@ entries: version: 0.8.7-beta.7 - apiVersion: v2 appVersion: 0.8.7-beta.6 - created: "2024-08-01T06:52:36.186516243Z" + created: "2024-08-01T08:13:52.682052031Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 052a2ec1102d2a4c9915f95647abd4a6012f56fa05a106f4952ee9b55bf7bae8 @@ -276,7 +289,7 @@ entries: version: 0.8.7-beta.6 - apiVersion: v2 appVersion: 0.8.7-beta.5 - created: "2024-08-01T06:52:36.185896658Z" + created: "2024-08-01T08:13:52.681423193Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 1728af756907c3fcbe87c2fd2de014a2d963c22a4c2eb6af6596b525a9b9a18a @@ -289,7 +302,7 @@ entries: version: 0.8.7-beta.5 - apiVersion: v2 appVersion: 0.8.7-beta.4 - created: "2024-08-01T06:52:36.18527056Z" + created: "2024-08-01T08:13:52.680790227Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 387a57a3904a05ed61e92ee48605ef6fd5044ff7e822e0924e0d4c485e2c88d2 @@ -302,7 +315,7 @@ entries: version: 0.8.7-beta.4 - apiVersion: v2 appVersion: 0.8.7-beta.3 - created: "2024-08-01T06:52:36.184613455Z" + created: "2024-08-01T08:13:52.680153434Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 3668002b7a4118516b2ecd61d6275f60d83fc12841587ab8f62e1c1200731c67 @@ -315,7 +328,7 @@ entries: version: 0.8.7-beta.3 - apiVersion: v2 appVersion: 0.8.7-beta.2 - created: "2024-08-01T06:52:36.183981907Z" + created: "2024-08-01T08:13:52.679467239Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: e62217ffcadee2b8896ab0543f9ccc42f2df898fd979438ac9376d780b802af7 @@ -328,7 +341,7 @@ entries: version: 0.8.7-beta.2 - apiVersion: v2 appVersion: 0.8.7-beta.1 - created: "2024-08-01T06:52:36.177245292Z" + created: "2024-08-01T08:13:52.672706952Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 553981fe1d5c980e6903b3ff2f1b9b97431f6dd8aee91e3976bcc5594285235e @@ -341,7 +354,7 @@ entries: version: 0.8.7-beta.1 - apiVersion: v2 appVersion: 0.8.6 - created: "2024-08-01T06:52:36.176733878Z" + created: "2024-08-01T08:13:52.672182989Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: ddbbe6fea1702e57404875eb3019a3b1a341017bdbb5fbc6ce418507e5c15756 @@ -354,7 +367,7 @@ entries: version: 0.8.6 - apiVersion: v2 appVersion: 0.8.6-beta.1 - created: "2024-08-01T06:52:36.176197107Z" + created: "2024-08-01T08:13:52.671632877Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: cc2c81ef6796ac853dce256e6bf8a6af966c21803e6534ea21920af681c62e61 @@ -367,7 +380,7 @@ entries: version: 0.8.6-beta.1 - apiVersion: v2 appVersion: 0.8.5 - created: "2024-08-01T06:52:36.175652522Z" + created: "2024-08-01T08:13:52.671060223Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: db5d90d44006209fd5ecdebd88f5fd56c70f7c76898343719a0ff8da46da948a @@ -380,7 +393,7 @@ entries: version: 0.8.5 - apiVersion: v2 appVersion: 0.8.5-post.2 - created: "2024-08-01T06:52:36.17485224Z" + created: "2024-08-01T08:13:52.669572178Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: ea3f7269b55f773fa165d7008c054b7cf3ec4c62eb40a96f08cd3a9b77fd2165 @@ -393,7 +406,7 @@ entries: version: 0.8.5-post.2 - apiVersion: v2 appVersion: 0.8.5-post.1 - created: "2024-08-01T06:52:36.174298878Z" + created: "2024-08-01T08:13:52.6690296Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 9deb844d3dc2d8480c60f8c631dcc7794adfb39cec3aa3b1ce22ea26fdf87d02 @@ -406,7 +419,7 @@ entries: version: 0.8.5-post.1 - apiVersion: v2 appVersion: 0.8.5-beta.10 - created: "2024-08-01T06:52:36.166741692Z" + created: "2024-08-01T08:13:52.661227898Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 9cfe01e8f57eca462261a24a805b41509be2de9a0fee76e331d124ed98c4bc49 @@ -419,7 +432,7 @@ entries: version: 0.8.5-beta.10 - apiVersion: v2 appVersion: 0.8.5-beta.9 - created: "2024-08-01T06:52:36.173503595Z" + created: "2024-08-01T08:13:52.668275009Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 057f1733f2bc966e15618f62629315c8207773ef6211c79c4feb557dae15c32b @@ -432,7 +445,7 @@ entries: version: 0.8.5-beta.9 - apiVersion: v2 appVersion: 0.8.5-beta.8 - created: "2024-08-01T06:52:36.172097458Z" + created: "2024-08-01T08:13:52.667521569Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 921cbce836c3032ef62b48cc82b5b4fcbe44fb81d473cf4d69a4bf0f806eb298 @@ -445,7 +458,7 @@ entries: version: 0.8.5-beta.8 - apiVersion: v2 appVersion: 0.8.5-beta.7 - created: "2024-08-01T06:52:36.171306523Z" + created: "2024-08-01T08:13:52.666758702Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 75482e955b2b9853a80bd653afb1d56535f78f3bfb7726798522307eb3effbbd @@ -458,7 +471,7 @@ entries: version: 0.8.5-beta.7 - apiVersion: v2 appVersion: 0.8.5-beta.6 - created: "2024-08-01T06:52:36.170556915Z" + created: "2024-08-01T08:13:52.665972441Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 6a2dfaf65ca855e1b3d7b966d4ff291e6fcbe761e2fc2a78033211ccd3a75de0 @@ -471,7 +484,7 @@ entries: version: 0.8.5-beta.6 - apiVersion: v2 appVersion: 0.8.5-beta.5 - created: "2024-08-01T06:52:36.169806266Z" + created: "2024-08-01T08:13:52.665216788Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: fead03823bef04d66901d563aa755c68ab277f72b126aaa6f0dce76a6f3bdb6d @@ -484,7 +497,7 @@ entries: version: 0.8.5-beta.5 - apiVersion: v2 appVersion: 0.8.5-beta.4 - created: "2024-08-01T06:52:36.169053983Z" + created: "2024-08-01T08:13:52.664452157Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 93e4539d5726a7fd0d6a3e93d1c17c6a358a923ddc01d102eab22f37377502ab @@ -497,7 +510,7 @@ entries: version: 0.8.5-beta.4 - apiVersion: v2 appVersion: 0.8.5-beta.3 - created: "2024-08-01T06:52:36.168298194Z" + created: "2024-08-01T08:13:52.663670215Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: f91e9390edf3441469048f5da646099af98f8b6d199409d0e2c1e6da3a51f054 @@ -510,7 +523,7 @@ entries: version: 0.8.5-beta.3 - apiVersion: v2 appVersion: 0.8.5-beta.2 - created: "2024-08-01T06:52:36.167535672Z" + created: "2024-08-01T08:13:52.662816499Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 59159c3aa4888038edc3c0135c83402363d7a0639fe62966a1e9d4928a364fa8 @@ -523,7 +536,7 @@ entries: version: 0.8.5-beta.2 - apiVersion: v2 appVersion: 0.8.5-beta.1 - created: "2024-08-01T06:52:36.165966807Z" + created: "2024-08-01T08:13:52.660463599Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 65aeb74c52ed8ba5474af500b4c1188a570ee4cb1f2a2da356b3488d28356ed9 @@ -535,7 +548,7 @@ entries: version: 0.8.5-beta.1 - apiVersion: v2 appVersion: 0.8.4 - created: "2024-08-01T06:52:36.165336389Z" + created: "2024-08-01T08:13:52.660084935Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 08afea8e3a9eef225b7e611f0bc1216c140053ef8e51439b02337faeac621fd0 @@ -547,7 +560,7 @@ entries: version: 0.8.4 - apiVersion: v2 appVersion: 0.8.4-beta.31 - created: "2024-08-01T06:52:36.16242496Z" + created: "2024-08-01T08:13:52.657516204Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: fabf3e2f37e53fa623f5d3d99b00feae06e278e5cd63bce419089946312ab1fc @@ -559,7 +572,7 @@ entries: version: 0.8.4-beta.31 - apiVersion: v2 appVersion: 0.8.4-beta.30 - created: "2024-08-01T06:52:36.162020757Z" + created: "2024-08-01T08:13:52.657104839Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 6e8f792709f73ec14eab48a268bdf50a4505b340bd142cddd7c7bfffd94009ad @@ -571,7 +584,7 @@ entries: version: 0.8.4-beta.30 - apiVersion: v2 appVersion: 0.8.4-beta.29 - created: "2024-08-01T06:52:36.161263084Z" + created: "2024-08-01T08:13:52.656326824Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 4c985d6a9b3456769c4013f9e85e7374c0f963d2d27627e61f914f5537de1971 @@ -583,7 +596,7 @@ entries: version: 0.8.4-beta.29 - apiVersion: v2 appVersion: 0.8.4-beta.28 - created: "2024-08-01T06:52:36.160856526Z" + created: "2024-08-01T08:13:52.655905932Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: bd2aa3c92c768c47c502e31a326f341addcb34e64d22cdcbf5cc3f19689d859c @@ -595,7 +608,7 @@ entries: version: 0.8.4-beta.28 - apiVersion: v2 appVersion: 0.8.4-beta.27 - created: "2024-08-01T06:52:36.160446892Z" + created: "2024-08-01T08:13:52.655466987Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: e8ad0869993af39d7adda8cb868dc0b24cfb63b4bb9820dc579939c1007a60ba @@ -607,7 +620,7 @@ entries: version: 0.8.4-beta.27 - apiVersion: v2 appVersion: 0.8.4-beta.26 - created: "2024-08-01T06:52:36.160026468Z" + created: "2024-08-01T08:13:52.654490293Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 30dccf630aa25a86a03c67572fe5411687d8ce6d58def448ea10efdba2b85e3a @@ -619,7 +632,7 @@ entries: version: 0.8.4-beta.26 - apiVersion: v2 appVersion: 0.8.4-beta.25 - created: "2024-08-01T06:52:36.159589914Z" + created: "2024-08-01T08:13:52.653833994Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: b6e2043bcf5a0335967d770c7939f5a7832955359a7d871c90b265660ff26e5f @@ -631,7 +644,7 @@ entries: version: 0.8.4-beta.25 - apiVersion: v2 appVersion: 0.8.4-beta.24 - created: "2024-08-01T06:52:36.159134866Z" + created: "2024-08-01T08:13:52.653426296Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: b19efa95394d50bb8d76da6ec306de5d3bb9ea55371fafea95a1282a697fa33e @@ -643,7 +656,7 @@ entries: version: 0.8.4-beta.24 - apiVersion: v2 appVersion: 0.8.4-beta.23 - created: "2024-08-01T06:52:36.15852575Z" + created: "2024-08-01T08:13:52.653017547Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 5c5d05c15bff548574896118ce92335ae10c5b78f5307fe9b2618e5a5aa71a5c @@ -655,7 +668,7 @@ entries: version: 0.8.4-beta.23 - apiVersion: v2 appVersion: 0.8.4-beta.22 - created: "2024-08-01T06:52:36.157598Z" + created: "2024-08-01T08:13:52.652605963Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 0160dbce938198132ca9cd2a5cb362816344687291f5b6d7cf6de8f2855e9414 @@ -667,7 +680,7 @@ entries: version: 0.8.4-beta.22 - apiVersion: v2 appVersion: 0.8.4-beta.21 - created: "2024-08-01T06:52:36.157187214Z" + created: "2024-08-01T08:13:52.652184921Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 7dce153d2fcae7513e9c132e139b2721fd975ea3cc43a370e34dbeb2a1b7f683 @@ -679,7 +692,7 @@ entries: version: 0.8.4-beta.21 - apiVersion: v2 appVersion: 0.8.4-beta.20 - created: "2024-08-01T06:52:36.156777771Z" + created: "2024-08-01T08:13:52.651753459Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: c51189a187bbf24135382e25cb00964e0330dfcd3b2f0c884581a6686f05dd28 @@ -691,7 +704,7 @@ entries: version: 0.8.4-beta.20 - apiVersion: v2 appVersion: 0.8.4-beta.19 - created: "2024-08-01T06:52:36.155797323Z" + created: "2024-08-01T08:13:52.650753742Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 8219575dedb42fa2ddbf2768a4e9afbfacbc2dff7e953d77c7b10a41b78dc687 @@ -703,7 +716,7 @@ entries: version: 0.8.4-beta.19 - apiVersion: v2 appVersion: 0.8.4-beta.18 - created: "2024-08-01T06:52:36.155357192Z" + created: "2024-08-01T08:13:52.650321749Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 6418cde559cf12f1f7fea5a2b123bba950e50eeb3be002441827d2ab7f9e4ef7 @@ -715,7 +728,7 @@ entries: version: 0.8.4-beta.18 - apiVersion: v2 appVersion: 0.8.4-beta.16 - created: "2024-08-01T06:52:36.154957467Z" + created: "2024-08-01T08:13:52.649907941Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 9c9840a7c9476dbb08e0ac83926330718fe50c89879752dd8f92712b036109c0 @@ -727,7 +740,7 @@ entries: version: 0.8.4-beta.16 - apiVersion: v2 appVersion: 0.8.4-beta.15 - created: "2024-08-01T06:52:36.154556579Z" + created: "2024-08-01T08:13:52.649488952Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 0955fd22da028315e30c68132cbfa4bdc82bae622039bcfce0de339707bb82eb @@ -739,7 +752,7 @@ entries: version: 0.8.4-beta.15 - apiVersion: v2 appVersion: 0.8.4-beta.14 - created: "2024-08-01T06:52:36.154155051Z" + created: "2024-08-01T08:13:52.649041762Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 56208571956abe20ed7a5cc1867cab2667ed792c63e53d0e8bb70a9b438b7bf6 @@ -751,7 +764,7 @@ entries: version: 0.8.4-beta.14 - apiVersion: v2 appVersion: 0.8.4-beta.13 - created: "2024-08-01T06:52:36.153803836Z" + created: "2024-08-01T08:13:52.64865329Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: d7222c72412b6ee5833fbb07d2549be179cdfc7ccd89e0ad947d112fce799b83 @@ -763,7 +776,7 @@ entries: version: 0.8.4-beta.13 - apiVersion: v2 appVersion: 0.8.4-beta.12 - created: "2024-08-01T06:52:36.153451539Z" + created: "2024-08-01T08:13:52.647881145Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: af08c723756e397962b2d5190dedfd50797b771c5caf58b93a6f65d8fa24785c @@ -775,7 +788,7 @@ entries: version: 0.8.4-beta.12 - apiVersion: v2 appVersion: 0.8.4-beta.11 - created: "2024-08-01T06:52:36.153102849Z" + created: "2024-08-01T08:13:52.647292281Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: a0235835ba57d185a83dd8a26281fa37b2077c3a37fe3a1c50585005695927e3 @@ -787,7 +800,7 @@ entries: version: 0.8.4-beta.11 - apiVersion: v2 appVersion: 0.8.4-beta.10 - created: "2024-08-01T06:52:36.152752445Z" + created: "2024-08-01T08:13:52.646943764Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 910ddfeba0c5e66651500dd11404afff092adc0f768ed68e0d93b04b83aa4388 @@ -799,7 +812,7 @@ entries: version: 0.8.4-beta.10 - apiVersion: v2 appVersion: 0.8.4-beta.9 - created: "2024-08-01T06:52:36.164487887Z" + created: "2024-08-01T08:13:52.659679772Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: c25ca8a9f072d6a5d02232448deaef5668aca05f24dfffbba3ebe30a4f75bb26 @@ -811,7 +824,7 @@ entries: version: 0.8.4-beta.9 - apiVersion: v2 appVersion: 0.8.4-beta.8 - created: "2024-08-01T06:52:36.164150658Z" + created: "2024-08-01T08:13:52.659341494Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 7249a39d4137e457b369384ba0a365c271c780d93a8327ce25083df763c39999 @@ -823,7 +836,7 @@ entries: version: 0.8.4-beta.8 - apiVersion: v2 appVersion: 0.8.4-beta.7 - created: "2024-08-01T06:52:36.163810955Z" + created: "2024-08-01T08:13:52.659002594Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: ee750c7c8d6ea05bd447375e624fdd7f66dd87680ab81f7b7e73df7379a9024a @@ -835,7 +848,7 @@ entries: version: 0.8.4-beta.7 - apiVersion: v2 appVersion: 0.8.4-beta.6 - created: "2024-08-01T06:52:36.163442618Z" + created: "2024-08-01T08:13:52.658533263Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 0e046be9f73df7444a995608c59af16fab9030b139b2acb4d6db6185b8eb5337 @@ -847,7 +860,7 @@ entries: version: 0.8.4-beta.6 - apiVersion: v2 appVersion: 0.8.4-beta.5 - created: "2024-08-01T06:52:36.163107653Z" + created: "2024-08-01T08:13:52.658197619Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: b56e9a23d46810eccdb4cf5272cc05126da3f6db314e541959c3efb5f260620b @@ -859,7 +872,7 @@ entries: version: 0.8.4-beta.5 - apiVersion: v2 appVersion: 0.8.4-beta.4 - created: "2024-08-01T06:52:36.162765355Z" + created: "2024-08-01T08:13:52.65785921Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: 1d5808ecaf55391f3b27ae6236400066508acbd242e33db24a1ab4bffa77409e @@ -871,7 +884,7 @@ entries: version: 0.8.4-beta.4 - apiVersion: v2 appVersion: 0.8.4-beta.3 - created: "2024-08-01T06:52:36.161609049Z" + created: "2024-08-01T08:13:52.656685701Z" description: Perform numpy-like analysis on data that remains in someone elses server digest: b64efa8529d82be56c6ab60487ed24420a5614d96d2509c1f93c1003eda71a54 @@ -883,7 +896,7 @@ entries: version: 0.8.4-beta.3 - apiVersion: v2 appVersion: 0.8.4-beta.2 - created: "2024-08-01T06:52:36.156354502Z" + created: "2024-08-01T08:13:52.651326536Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -899,7 +912,7 @@ entries: version: 0.8.4-beta.2 - apiVersion: v2 appVersion: 0.8.4-beta.1 - created: "2024-08-01T06:52:36.152380722Z" + created: "2024-08-01T08:13:52.646545654Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -915,7 +928,7 @@ entries: version: 0.8.4-beta.1 - apiVersion: v2 appVersion: 0.8.3 - created: "2024-08-01T06:52:36.151042326Z" + created: "2024-08-01T08:13:52.645991625Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -931,7 +944,7 @@ entries: version: 0.8.3 - apiVersion: v2 appVersion: 0.8.3-beta.6 - created: "2024-08-01T06:52:36.150389279Z" + created: "2024-08-01T08:13:52.645328864Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -947,7 +960,7 @@ entries: version: 0.8.3-beta.6 - apiVersion: v2 appVersion: 0.8.3-beta.5 - created: "2024-08-01T06:52:36.149811231Z" + created: "2024-08-01T08:13:52.644563833Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -963,7 +976,7 @@ entries: version: 0.8.3-beta.5 - apiVersion: v2 appVersion: 0.8.3-beta.4 - created: "2024-08-01T06:52:36.149205441Z" + created: "2024-08-01T08:13:52.643981782Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -979,7 +992,7 @@ entries: version: 0.8.3-beta.4 - apiVersion: v2 appVersion: 0.8.3-beta.2 - created: "2024-08-01T06:52:36.148548076Z" + created: "2024-08-01T08:13:52.643247698Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -995,7 +1008,7 @@ entries: version: 0.8.3-beta.2 - apiVersion: v2 appVersion: 0.8.3-beta.1 - created: "2024-08-01T06:52:36.147999533Z" + created: "2024-08-01T08:13:52.642652483Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1011,7 +1024,7 @@ entries: version: 0.8.3-beta.1 - apiVersion: v2 appVersion: 0.8.2 - created: "2024-08-01T06:52:36.147413991Z" + created: "2024-08-01T08:13:52.642070682Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1027,7 +1040,7 @@ entries: version: 0.8.2 - apiVersion: v2 appVersion: 0.8.2-beta.60 - created: "2024-08-01T06:52:36.146763849Z" + created: "2024-08-01T08:13:52.64021289Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1043,7 +1056,7 @@ entries: version: 0.8.2-beta.60 - apiVersion: v2 appVersion: 0.8.2-beta.59 - created: "2024-08-01T06:52:36.146101333Z" + created: "2024-08-01T08:13:52.639551361Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1059,7 +1072,7 @@ entries: version: 0.8.2-beta.59 - apiVersion: v2 appVersion: 0.8.2-beta.58 - created: "2024-08-01T06:52:36.144754784Z" + created: "2024-08-01T08:13:52.63886199Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1075,7 +1088,7 @@ entries: version: 0.8.2-beta.58 - apiVersion: v2 appVersion: 0.8.2-beta.57 - created: "2024-08-01T06:52:36.144121854Z" + created: "2024-08-01T08:13:52.638189251Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1091,7 +1104,7 @@ entries: version: 0.8.2-beta.57 - apiVersion: v2 appVersion: 0.8.2-beta.56 - created: "2024-08-01T06:52:36.143450613Z" + created: "2024-08-01T08:13:52.637538382Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1107,7 +1120,7 @@ entries: version: 0.8.2-beta.56 - apiVersion: v2 appVersion: 0.8.2-beta.52 - created: "2024-08-01T06:52:36.142816941Z" + created: "2024-08-01T08:13:52.636899515Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1123,7 +1136,7 @@ entries: version: 0.8.2-beta.52 - apiVersion: v2 appVersion: 0.8.2-beta.51 - created: "2024-08-01T06:52:36.14218316Z" + created: "2024-08-01T08:13:52.636251932Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1139,7 +1152,7 @@ entries: version: 0.8.2-beta.51 - apiVersion: v2 appVersion: 0.8.2-beta.50 - created: "2024-08-01T06:52:36.141538858Z" + created: "2024-08-01T08:13:52.63557801Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1155,7 +1168,7 @@ entries: version: 0.8.2-beta.50 - apiVersion: v2 appVersion: 0.8.2-beta.49 - created: "2024-08-01T06:52:36.140893445Z" + created: "2024-08-01T08:13:52.634540818Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1171,7 +1184,7 @@ entries: version: 0.8.2-beta.49 - apiVersion: v2 appVersion: 0.8.2-beta.48 - created: "2024-08-01T06:52:36.140236069Z" + created: "2024-08-01T08:13:52.632908596Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1187,7 +1200,7 @@ entries: version: 0.8.2-beta.48 - apiVersion: v2 appVersion: 0.8.2-beta.47 - created: "2024-08-01T06:52:36.139260278Z" + created: "2024-08-01T08:13:52.631728684Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1203,7 +1216,7 @@ entries: version: 0.8.2-beta.47 - apiVersion: v2 appVersion: 0.8.2-beta.46 - created: "2024-08-01T06:52:36.138112819Z" + created: "2024-08-01T08:13:52.630817912Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1219,7 +1232,7 @@ entries: version: 0.8.2-beta.46 - apiVersion: v2 appVersion: 0.8.2-beta.45 - created: "2024-08-01T06:52:36.137547224Z" + created: "2024-08-01T08:13:52.630221134Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1235,7 +1248,7 @@ entries: version: 0.8.2-beta.45 - apiVersion: v2 appVersion: 0.8.2-beta.44 - created: "2024-08-01T06:52:36.13697156Z" + created: "2024-08-01T08:13:52.629655042Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1251,7 +1264,7 @@ entries: version: 0.8.2-beta.44 - apiVersion: v2 appVersion: 0.8.2-beta.43 - created: "2024-08-01T06:52:36.136400766Z" + created: "2024-08-01T08:13:52.629066509Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1267,7 +1280,7 @@ entries: version: 0.8.2-beta.43 - apiVersion: v2 appVersion: 0.8.2-beta.41 - created: "2024-08-01T06:52:36.13573797Z" + created: "2024-08-01T08:13:52.628405631Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1283,7 +1296,7 @@ entries: version: 0.8.2-beta.41 - apiVersion: v2 appVersion: 0.8.2-beta.40 - created: "2024-08-01T06:52:36.135048134Z" + created: "2024-08-01T08:13:52.627715619Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1299,7 +1312,7 @@ entries: version: 0.8.2-beta.40 - apiVersion: v2 appVersion: 0.8.2-beta.39 - created: "2024-08-01T06:52:36.134484242Z" + created: "2024-08-01T08:13:52.627098884Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1315,7 +1328,7 @@ entries: version: 0.8.2-beta.39 - apiVersion: v2 appVersion: 0.8.2-beta.38 - created: "2024-08-01T06:52:36.133913408Z" + created: "2024-08-01T08:13:52.625730869Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1331,7 +1344,7 @@ entries: version: 0.8.2-beta.38 - apiVersion: v2 appVersion: 0.8.2-beta.37 - created: "2024-08-01T06:52:36.133295025Z" + created: "2024-08-01T08:13:52.625156372Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1347,7 +1360,7 @@ entries: version: 0.8.2-beta.37 - apiVersion: v2 appVersion: 0.8.1 - created: "2024-08-01T06:52:36.132373518Z" + created: "2024-08-01T08:13:52.624523256Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -1361,4 +1374,4 @@ entries: urls: - https://openmined.github.io/PySyft/helm/syft-0.8.1.tgz version: 0.8.1 -generated: "2024-08-01T06:52:36.131207554Z" +generated: "2024-08-01T08:13:52.623794422Z" diff --git a/packages/grid/helm/repo/syft-0.9.0-beta.5.tgz b/packages/grid/helm/repo/syft-0.9.0-beta.5.tgz new file mode 100644 index 0000000000000000000000000000000000000000..544956ed3c5e9cbb518baad32d67db44427ca79f GIT binary patch literal 10452 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 KxOq|lIspK-$f6Pe literal 0 HcmV?d00001 diff --git a/packages/grid/helm/syft/Chart.yaml b/packages/grid/helm/syft/Chart.yaml index 376a1b0257d..49dec1b3a9e 100644 --- a/packages/grid/helm/syft/Chart.yaml +++ b/packages/grid/helm/syft/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: syft description: Perform numpy-like analysis on data that remains in someone elses server type: application -version: "0.9.0-beta.4" -appVersion: "0.9.0-beta.4" +version: "0.9.0-beta.5" +appVersion: "0.9.0-beta.5" home: https://github.com/OpenMined/PySyft/ icon: https://raw.githubusercontent.com/OpenMined/PySyft/dev/docs/img/title_syft_light.png diff --git a/packages/grid/helm/syft/values.yaml b/packages/grid/helm/syft/values.yaml index 4d40a0a2ec3..6772cc8cefa 100644 --- a/packages/grid/helm/syft/values.yaml +++ b/packages/grid/helm/syft/values.yaml @@ -1,7 +1,7 @@ global: # Affects only backend, frontend, and seaweedfs containers registry: docker.io - version: 0.9.0-beta.4 + version: 0.9.0-beta.5 # Force default secret values for development. DO NOT SET THIS TO FALSE IN PRODUCTION randomizedSecrets: true diff --git a/packages/syft/setup.cfg b/packages/syft/setup.cfg index 3e90c66ffcd..3305d354b1b 100644 --- a/packages/syft/setup.cfg +++ b/packages/syft/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = syft -version = attr: "0.9.0-beta.4" +version = attr: "0.9.0-beta.5" description = Perform numpy-like analysis on data that remains in someone elses server author = OpenMined author_email = info@openmined.org diff --git a/packages/syft/src/syft/VERSION b/packages/syft/src/syft/VERSION index 35cdd5829a6..0d9ec17e955 100644 --- a/packages/syft/src/syft/VERSION +++ b/packages/syft/src/syft/VERSION @@ -1,5 +1,5 @@ # Mono Repo Global Version -__version__ = "0.9.0-beta.4" +__version__ = "0.9.0-beta.5" # elsewhere we can call this file: `python VERSION` and simply take the stdout # stdlib diff --git a/packages/syft/src/syft/__init__.py b/packages/syft/src/syft/__init__.py index 922f9faa7cf..ac0ddbfde31 100644 --- a/packages/syft/src/syft/__init__.py +++ b/packages/syft/src/syft/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.9.0-beta.4" +__version__ = "0.9.0-beta.5" # stdlib from collections.abc import Callable diff --git a/packages/syftcli/manifest.yml b/packages/syftcli/manifest.yml index f911753a15b..4568ffbc19d 100644 --- a/packages/syftcli/manifest.yml +++ b/packages/syftcli/manifest.yml @@ -1,11 +1,11 @@ manifestVersion: 1.0 -syftVersion: 0.9.0-beta.4 -dockerTag: 0.9.0-beta.4 +syftVersion: 0.9.0-beta.5 +dockerTag: 0.9.0-beta.5 images: - - docker.io/openmined/syft-frontend:0.9.0-beta.4 - - docker.io/openmined/syft-backend:0.9.0-beta.4 + - docker.io/openmined/syft-frontend:0.9.0-beta.5 + - docker.io/openmined/syft-backend:0.9.0-beta.5 - docker.io/library/mongo:7.0.4 - docker.io/traefik:v2.11.0