summaryrefslogtreecommitdiffstats
path: root/cython/lockdown.pxi
diff options
context:
space:
mode:
Diffstat (limited to 'cython/lockdown.pxi')
-rw-r--r--cython/lockdown.pxi169
1 files changed, 121 insertions, 48 deletions
diff --git a/cython/lockdown.pxi b/cython/lockdown.pxi
index b5207e8..25edb4c 100644
--- a/cython/lockdown.pxi
+++ b/cython/lockdown.pxi
@@ -1,25 +1,48 @@
cdef extern from "libimobiledevice/lockdown.h":
ctypedef enum lockdownd_error_t:
- LOCKDOWN_E_SUCCESS = 0
- LOCKDOWN_E_INVALID_ARG = -1
- LOCKDOWN_E_INVALID_CONF = -2
- LOCKDOWN_E_PLIST_ERROR = -3
- LOCKDOWN_E_PAIRING_FAILED = -4
- LOCKDOWN_E_SSL_ERROR = -5
- LOCKDOWN_E_DICT_ERROR = -6
- LOCKDOWN_E_START_SERVICE_FAILED = -7
- LOCKDOWN_E_NOT_ENOUGH_DATA = -8
- LOCKDOWN_E_SET_VALUE_PROHIBITED = -9
- LOCKDOWN_E_GET_VALUE_PROHIBITED = -10
- LOCKDOWN_E_REMOVE_VALUE_PROHIBITED = -11
- LOCKDOWN_E_MUX_ERROR = -12
- LOCKDOWN_E_ACTIVATION_FAILED = -13
- LOCKDOWN_E_PASSWORD_PROTECTED = -14
- LOCKDOWN_E_NO_RUNNING_SESSION = -15
- LOCKDOWN_E_INVALID_HOST_ID = -16
- LOCKDOWN_E_INVALID_SERVICE = -17
- LOCKDOWN_E_INVALID_ACTIVATION_RECORD = -18
- LOCKDOWN_E_UNKNOWN_ERROR = -256
+ LOCKDOWN_E_SUCCESS
+ LOCKDOWN_E_INVALID_ARG
+ LOCKDOWN_E_INVALID_CONF
+ LOCKDOWN_E_PLIST_ERROR
+ LOCKDOWN_E_PAIRING_FAILED
+ LOCKDOWN_E_SSL_ERROR
+ LOCKDOWN_E_DICT_ERROR
+ LOCKDOWN_E_RECEIVE_TIMEOUT
+ LOCKDOWN_E_SET_VALUE_PROHIBITED
+ LOCKDOWN_E_GET_VALUE_PROHIBITED
+ LOCKDOWN_E_MUX_ERROR
+ LOCKDOWN_E_NO_RUNNING_SESSION
+ LOCKDOWN_E_INVALID_RESPONSE
+ LOCKDOWN_E_MISSING_KEY
+ LOCKDOWN_E_MISSING_VALUE
+ LOCKDOWN_E_GET_PROHIBITED
+ LOCKDOWN_E_SET_PROHIBITED
+ LOCKDOWN_E_REMOVE_PROHIBITED
+ LOCKDOWN_E_IMMUTABLE_VALUE
+ LOCKDOWN_E_PASSWORD_PROTECTED
+ LOCKDOWN_E_USER_DENIED_PAIRING
+ LOCKDOWN_E_PAIRING_DIALOG_RESPONSE_PENDING
+ LOCKDOWN_E_MISSING_HOST_ID
+ LOCKDOWN_E_INVALID_HOST_ID
+ LOCKDOWN_E_SESSION_ACTIVE
+ LOCKDOWN_E_SESSION_INACTIVE
+ LOCKDOWN_E_MISSING_SESSION_ID
+ LOCKDOWN_E_INVALID_SESSION_ID
+ LOCKDOWN_E_MISSING_SERVICE
+ LOCKDOWN_E_INVALID_SERVICE
+ LOCKDOWN_E_SERVICE_LIMIT
+ LOCKDOWN_E_MISSING_PAIR_RECORD
+ LOCKDOWN_E_SAVE_PAIR_RECORD_FAILED
+ LOCKDOWN_E_INVALID_PAIR_RECORD
+ LOCKDOWN_E_INVALID_ACTIVATION_RECORD
+ LOCKDOWN_E_MISSING_ACTIVATION_RECORD
+ LOCKDOWN_E_SERVICE_PROHIBITED
+ LOCKDOWN_E_ESCROW_LOCKED
+ LOCKDOWN_E_PAIRING_PROHIBITED_OVER_THIS_CONNECTION
+ LOCKDOWN_E_FMIP_PROTECTED
+ LOCKDOWN_E_MC_PROTECTED
+ LOCKDOWN_E_MC_CHALLENGE_REQUIRED
+ LOCKDOWN_E_UNKNOWN_ERROR
lockdownd_error_t lockdownd_client_new(idevice_t device, lockdownd_client_t *client, char *label)
lockdownd_error_t lockdownd_client_new_with_handshake(idevice_t device, lockdownd_client_t *client, char *label)
@@ -29,7 +52,7 @@ cdef extern from "libimobiledevice/lockdown.h":
lockdownd_error_t lockdownd_get_value(lockdownd_client_t client, char *domain, char *key, plist.plist_t *value)
lockdownd_error_t lockdownd_set_value(lockdownd_client_t client, char *domain, char *key, plist.plist_t value)
lockdownd_error_t lockdownd_remove_value(lockdownd_client_t client, char *domain, char *key)
- lockdownd_error_t lockdownd_start_service(lockdownd_client_t client, char *service, uint16_t *port)
+ lockdownd_error_t lockdownd_start_service(lockdownd_client_t client, char *identifier, lockdownd_service_descriptor_t *service)
lockdownd_error_t lockdownd_start_session(lockdownd_client_t client, char *host_id, char **session_id, int *ssl_enabled)
lockdownd_error_t lockdownd_stop_session(lockdownd_client_t client, char *session_id)
lockdownd_error_t lockdownd_send(lockdownd_client_t client, plist.plist_t plist)
@@ -43,6 +66,7 @@ cdef extern from "libimobiledevice/lockdown.h":
lockdownd_error_t lockdownd_goodbye(lockdownd_client_t client)
lockdownd_error_t lockdownd_get_sync_data_classes(lockdownd_client_t client, char ***classes, int *count)
lockdownd_error_t lockdownd_data_classes_free(char **classes)
+ lockdownd_error_t lockdownd_service_descriptor_free(lockdownd_service_descriptor_t service)
cdef class LockdownError(BaseError):
def __init__(self, *args, **kwargs):
@@ -53,19 +77,40 @@ cdef class LockdownError(BaseError):
LOCKDOWN_E_PLIST_ERROR: "Property list error",
LOCKDOWN_E_PAIRING_FAILED: "Pairing failed",
LOCKDOWN_E_SSL_ERROR: "SSL error",
- LOCKDOWN_E_DICT_ERROR: "Dict error",
- LOCKDOWN_E_START_SERVICE_FAILED: "Start service failed",
- LOCKDOWN_E_NOT_ENOUGH_DATA: "Not enough data",
- LOCKDOWN_E_SET_VALUE_PROHIBITED: "Set value prohibited",
- LOCKDOWN_E_GET_VALUE_PROHIBITED: "Get value prohibited",
- LOCKDOWN_E_REMOVE_VALUE_PROHIBITED: "Remove value prohibited",
- LOCKDOWN_E_MUX_ERROR: "MUX Error",
- LOCKDOWN_E_ACTIVATION_FAILED: "Activation failed",
- LOCKDOWN_E_PASSWORD_PROTECTED: "Password protected",
+ LOCKDOWN_E_DICT_ERROR: "Dictionary error",
+ LOCKDOWN_E_RECEIVE_TIMEOUT: "Receive timeout",
+ LOCKDOWN_E_MUX_ERROR: "Mux Protocol Error",
LOCKDOWN_E_NO_RUNNING_SESSION: "No running session",
+ LOCKDOWN_E_INVALID_RESPONSE: "Invalid response",
+ LOCKDOWN_E_MISSING_KEY: "Missing key",
+ LOCKDOWN_E_MISSING_VALUE: "Missing value",
+ LOCKDOWN_E_GET_PROHIBITED: "Get value prohibited",
+ LOCKDOWN_E_SET_PROHIBITED: "Set value prohibited",
+ LOCKDOWN_E_REMOVE_PROHIBITED: "Remove value prohibited",
+ LOCKDOWN_E_IMMUTABLE_VALUE: "Immutable value",
+ LOCKDOWN_E_PASSWORD_PROTECTED: "Password protected",
+ LOCKDOWN_E_USER_DENIED_PAIRING: "User denied pairing",
+ LOCKDOWN_E_PAIRING_DIALOG_RESPONSE_PENDING: "Pairing dialog response pending",
+ LOCKDOWN_E_MISSING_HOST_ID: "Missing host ID",
LOCKDOWN_E_INVALID_HOST_ID: "Invalid host ID",
+ LOCKDOWN_E_SESSION_ACTIVE: "Session active",
+ LOCKDOWN_E_SESSION_INACTIVE: "Session inactive",
+ LOCKDOWN_E_MISSING_SESSION_ID: "Missing session ID",
+ LOCKDOWN_E_INVALID_SESSION_ID: "Invalid session ID",
+ LOCKDOWN_E_MISSING_SERVICE: "Missing service",
LOCKDOWN_E_INVALID_SERVICE: "Invalid service",
+ LOCKDOWN_E_SERVICE_LIMIT: "Service limit reached",
+ LOCKDOWN_E_MISSING_PAIR_RECORD: "Missing pair record",
+ LOCKDOWN_E_SAVE_PAIR_RECORD_FAILED: "Saving pair record failed",
+ LOCKDOWN_E_INVALID_PAIR_RECORD: "Invalid pair record",
LOCKDOWN_E_INVALID_ACTIVATION_RECORD: "Invalid activation record",
+ LOCKDOWN_E_MISSING_ACTIVATION_RECORD: "Missing activation record",
+ LOCKDOWN_E_SERVICE_PROHIBITED: "Service prohibited",
+ LOCKDOWN_E_ESCROW_LOCKED: "Escrow locked",
+ LOCKDOWN_E_PAIRING_PROHIBITED_OVER_THIS_CONNECTION: "Pairing prohibited over this connection",
+ LOCKDOWN_E_FMIP_PROTECTED: "Find My iPhone/iPod/iPad protected",
+ LOCKDOWN_E_MC_PROTECTED: "MC protected",
+ LOCKDOWN_E_MC_CHALLENGE_REQUIRED: "MC challenge required",
LOCKDOWN_E_UNKNOWN_ERROR: "Unknown error"
}
BaseError.__init__(self, *args, **kwargs)
@@ -89,6 +134,21 @@ cdef class LockdownPairRecord:
cdef bytes result = self._c_record.root_certificate
return result
+cdef class LockdownServiceDescriptor(Base):
+ #def __cinit__(self, uint16_t port, uint8_t ssl_enabled, *args, **kwargs):
+ def __dealloc__(self):
+ cdef lockdownd_error_t err
+ if self._c_service_descriptor is not NULL:
+ err = lockdownd_service_descriptor_free(self._c_service_descriptor)
+ self._c_service_descriptor = NULL
+ self.handle_error(err)
+ property port:
+ def __get__(self):
+ return self._c_service_descriptor.port
+ property ssl_enabled:
+ def __get__(self):
+ return self._c_service_descriptor.ssl_enabled
+
cdef class LockdownClient(PropertyListService):
def __cinit__(self, iDevice device not None, bytes label=b'', bint handshake=True, *args, **kwargs):
cdef:
@@ -150,51 +210,64 @@ cdef class LockdownClient(PropertyListService):
raise
cpdef set_value(self, bytes domain, bytes key, object value):
- cdef plist.plist_t c_node = plist.native_to_plist_t(value)
+ cdef:
+ plist.plist_t c_node = NULL
+ char* c_domain = NULL
+ char* c_key = NULL
+
+ c_node = plist.native_to_plist_t(value)
+ if domain is not None:
+ c_domain = domain
+ if key is not None:
+ c_key = key
try:
- self.handle_error(lockdownd_set_value(self._c_client, domain, key, c_node))
+ self.handle_error(lockdownd_set_value(self._c_client, c_domain, c_key, c_node))
except BaseError, e:
raise
finally:
if c_node != NULL:
- plist.plist_free(c_node)
+ c_node = NULL
cpdef remove_value(self, bytes domain, bytes key):
self.handle_error(lockdownd_remove_value(self._c_client, domain, key))
- cpdef uint16_t start_service(self, object service):
+ cpdef object start_service(self, object service):
cdef:
char* c_service_name = NULL
- uint16_t port = 0
+ lockdownd_service_descriptor_t c_descriptor = NULL
+ LockdownServiceDescriptor result
if issubclass(service, BaseService) and \
service.__service_name__ is not None \
- and isinstance(service.__service_name__, basestring):
- c_service_name = <bytes>service.__service_name__
- elif isinstance(service, basestring):
- c_service_name = <bytes>service
+ and isinstance(service.__service_name__, (str, bytes)):
+ c_service_name_str = service.__service_name__.encode('utf-8')
+ elif isinstance(service, (str, bytes)):
+ c_service_name_str = service.encode('utf-8')
else:
raise TypeError("LockdownClient.start_service() takes a BaseService or string as its first argument")
+ c_service_name = c_service_name_str
try:
- self.handle_error(lockdownd_start_service(self._c_client, c_service_name, &port))
-
- return port
+ self.handle_error(lockdownd_start_service(self._c_client, c_service_name, &c_descriptor))
+
+ result = LockdownServiceDescriptor.__new__(LockdownServiceDescriptor)
+ result._c_service_descriptor = c_descriptor
+
+ return result
except BaseError, e:
raise
cpdef object get_service_client(self, object service_class):
cdef:
- uint16_t port = 0
- object result
+ LockdownServiceDescriptor descriptor
if not hasattr(service_class, '__service_name__') and \
not service_class.__service_name__ is not None \
- and not isinstance(service_class.__service_name__, basestring):
+ and not isinstance(service_class.__service_name__, (str, bytes)):
raise TypeError("LockdownClient.get_service_client() takes a BaseService as its first argument")
- port = self.start_service(service_class)
- return service_class(self.device, port)
+ descriptor = self.start_service(service_class)
+ return service_class(self.device, descriptor)
cpdef tuple start_session(self, bytes host_id):
cdef:
@@ -202,7 +275,7 @@ cdef class LockdownClient(PropertyListService):
char* c_session_id = NULL
bint ssl_enabled
bytes session_id
- err = lockdownd_start_session(self._c_client, host_id, &c_session_id, &ssl_enabled)
+ err = lockdownd_start_session(self._c_client, host_id, &c_session_id, <int *>&ssl_enabled)
try:
self.handle_error(err)