diff options
| -rw-r--r-- | .github/FUNDING.yml | 3 | ||||
| -rw-r--r-- | .github/workflows/build.yml | 52 | ||||
| -rw-r--r-- | README.md | 10 | ||||
| -rw-r--r-- | configure.ac | 29 | ||||
| -rw-r--r-- | include/libideviceactivation.h | 70 | ||||
| -rw-r--r-- | src/activation.c | 174 | ||||
| -rw-r--r-- | tools/ideviceactivation.c | 27 |
7 files changed, 176 insertions, 189 deletions
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..e995b30 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,3 @@ +github: nikias +patreon: nikias +custom: ["https://www.paypal.me/NikiasBassen"] diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c5ecca4..2389b50 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,6 +2,7 @@ name: build on: push: + pull_request: schedule: - cron: '0 0 1 * *' @@ -17,28 +18,28 @@ jobs: run: | echo "target_triplet=`gcc -dumpmachine`" >> $GITHUB_ENV - name: fetch libplist - uses: dawidd6/action-download-artifact@v2 + uses: dawidd6/action-download-artifact@v6 with: github_token: ${{secrets.GITHUB_TOKEN}} workflow: build.yml name: libplist-latest_${{env.target_triplet}} repo: libimobiledevice/libplist - name: fetch libusbmuxd - uses: dawidd6/action-download-artifact@v2 + uses: dawidd6/action-download-artifact@v6 with: github_token: ${{secrets.GITHUB_TOKEN}} workflow: build.yml name: libusbmuxd-latest_${{env.target_triplet}} repo: libimobiledevice/libusbmuxd - name: fetch libimobiledevice-glue - uses: dawidd6/action-download-artifact@v2 + uses: dawidd6/action-download-artifact@v6 with: github_token: ${{secrets.GITHUB_TOKEN}} workflow: build.yml name: libimobiledevice-glue-latest_${{env.target_triplet}} repo: libimobiledevice/libimobiledevice-glue - name: fetch libimobiledevice - uses: dawidd6/action-download-artifact@v2 + uses: dawidd6/action-download-artifact@v6 with: github_token: ${{secrets.GITHUB_TOKEN}} workflow: build.yml @@ -53,7 +54,7 @@ jobs: rm -rf extract/lib sudo cp -r extract/* / sudo ldconfig - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: fetch-depth: 0 - name: autogen @@ -68,7 +69,7 @@ jobs: DESTDIR=`pwd`/dest make install tar -C dest -cf libideviceactivation.tar usr - name: publish artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: libideviceactivation-latest_${{env.target_triplet}} path: libideviceactivation.tar @@ -84,28 +85,28 @@ jobs: fi shell: bash - name: fetch libplist - uses: dawidd6/action-download-artifact@v2 + uses: dawidd6/action-download-artifact@v6 with: github_token: ${{secrets.GITHUB_TOKEN}} workflow: build.yml name: libplist-latest_macOS repo: libimobiledevice/libplist - name: fetch libusbmuxd - uses: dawidd6/action-download-artifact@v2 + uses: dawidd6/action-download-artifact@v6 with: github_token: ${{secrets.GITHUB_TOKEN}} workflow: build.yml name: libusbmuxd-latest_macOS repo: libimobiledevice/libusbmuxd - name: fetch libimobiledevice-glue - uses: dawidd6/action-download-artifact@v2 + uses: dawidd6/action-download-artifact@v6 with: github_token: ${{secrets.GITHUB_TOKEN}} workflow: build.yml name: libimobiledevice-glue-latest_macOS repo: libimobiledevice/libimobiledevice-glue - name: fetch libimobiledevice - uses: dawidd6/action-download-artifact@v2 + uses: dawidd6/action-download-artifact@v6 with: github_token: ${{secrets.GITHUB_TOKEN}} workflow: build.yml @@ -118,7 +119,7 @@ jobs: tar -C extract -xvf $I done sudo cp -r extract/* / - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: install additional requirements run: | SDKDIR=`xcrun --sdk macosx --show-sdk-path 2>/dev/null` @@ -151,12 +152,12 @@ jobs: DESTDIR=`pwd`/dest make install tar -C dest -cf libideviceactivation.tar usr - name: publish artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: libideviceactivation-latest_macOS path: libideviceactivation.tar build-windows: - runs-on: windows-2019 + runs-on: windows-latest defaults: run: shell: msys2 {0} @@ -177,6 +178,9 @@ jobs: base-devel git mingw-w64-${{ matrix.arch }}-gcc + mingw-w64-${{ matrix.arch }}-pkg-config + mingw-w64-${{ matrix.arch }}-openssl + mingw-w64-${{ matrix.arch }}-libxml2 make libtool autoconf @@ -187,28 +191,28 @@ jobs: echo "dest=$dest" >> $GITHUB_ENV echo "target_triplet=`gcc -dumpmachine`" >> $GITHUB_ENV - name: fetch libplist - uses: dawidd6/action-download-artifact@v2 + uses: dawidd6/action-download-artifact@v6 with: github_token: ${{secrets.GITHUB_TOKEN}} workflow: build.yml name: libplist-latest_${{ matrix.arch }}-${{ env.dest }} repo: libimobiledevice/libplist - name: fetch libusbmuxd - uses: dawidd6/action-download-artifact@v2 + uses: dawidd6/action-download-artifact@v6 with: github_token: ${{secrets.GITHUB_TOKEN}} workflow: build.yml name: libusbmuxd-latest_${{ matrix.arch }}-${{ env.dest }} repo: libimobiledevice/libusbmuxd - name: fetch libimobiledevice-glue - uses: dawidd6/action-download-artifact@v2 + uses: dawidd6/action-download-artifact@v6 with: github_token: ${{secrets.GITHUB_TOKEN}} workflow: build.yml name: libimobiledevice-glue-latest_${{ matrix.arch }}-${{ env.dest }} repo: libimobiledevice/libimobiledevice-glue - name: fetch libimobiledevice - uses: dawidd6/action-download-artifact@v2 + uses: dawidd6/action-download-artifact@v6 with: github_token: ${{secrets.GITHUB_TOKEN}} workflow: build.yml @@ -221,12 +225,18 @@ jobs: tar -C extract -xvf $I done cp -r extract/* / - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: install additional requirements run: | - # + mkdir deps + FILENAME="libcurl-8.1.0-static.tar.bz2" + curl -o $FILENAME.b64 -Ls "https://gist.github.com/nikias/6c397a0a2f4f4eafd91b81cccd22b761/raw/85216e60af6787f3b351291165eb91bd585ff09a/libcurl-8.1.0-static-${{matrix.arch}}-${{env.dest}}.tar.bz2" + base64 -d < $FILENAME.b64 > $FILENAME + tar -C deps -xjf $FILENAME + echo "LIBCURL_CFLAGS=-I`pwd`/deps/include -DCURL_STATICLIB" >> $GITHUB_ENV + echo "LIBCURL_LIBS=-Xlinker `pwd`/deps/lib/libcurl.a -Xlinker /${{env.dest}}/lib/libzstd.a -Xlinker /${{env.dest}}/lib/libz.a -Xlinker -lws2_32 -Xlinker -lcrypt32 -Xlinker -lwldap32 -Xlinker -lbcrypt -Xlinker -lssl -Xlinker -lcrypto" >> $GITHUB_ENV - name: autogen - run: ./autogen.sh CC=gcc CXX=g++ + run: ./autogen.sh libcurl_CFLAGS="${{env.LIBCURL_CFLAGS}}" libcurl_LIBS="${{env.LIBCURL_LIBS}}" - name: make run: make - name: make install @@ -237,7 +247,7 @@ jobs: DESTDIR=`pwd`/dest make install tar -C dest -cf libideviceactivation.tar ${{ env.dest }} - name: publish artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: libideviceactivation-latest_${{ matrix.arch }}-${{ env.dest }} path: libideviceactivation.tar @@ -54,9 +54,9 @@ sudo make install ## Usage -To query the activation status of a device use: +To query the activation state of a device use: ```shell -ideviceactivation status +ideviceactivation state ``` To activate a device use: @@ -93,8 +93,8 @@ We are still working on the guidelines so bear with us! ## Links * Homepage: https://libimobiledevice.org/ -* Repository: https://git.libimobiledevice.org/libideviceactivation.git -* Repository (Mirror): https://github.com/libimobiledevice/libideviceactivation.git +* Repository: https://github.com/libimobiledevice/libideviceactivation.git +* Repository (Mirror): https://git.libimobiledevice.org/libideviceactivation.git * Issue Tracker: https://github.com/libimobiledevice/libideviceactivation/issues * Mailing List: https://lists.libimobiledevice.org/mailman/listinfo/libimobiledevice-devel * Twitter: https://twitter.com/libimobiledev @@ -118,4 +118,4 @@ iPadOS, tvOS, watchOS, and macOS are trademarks of Apple Inc. This project is an independent software library and has not been authorized, sponsored, or otherwise approved by Apple Inc. -README Updated on: 2022-04-04 +README Updated on: 2024-10-22 diff --git a/configure.ac b/configure.ac index 2f93895..d4e1d79 100644 --- a/configure.ac +++ b/configure.ac @@ -61,44 +61,25 @@ case ${host_os} in *mingw32*|*cygwin*) AC_MSG_RESULT([${host_os}]) win32=true + deplibs_check_method='pass_all' ;; darwin*|*android*) AC_MSG_RESULT([${host_os}]) ;; *) AC_MSG_RESULT([${host_os}]) - AX_PTHREAD([], [AC_MSG_ERROR([pthread is required to build ${PACKAGE}])]) - AC_CHECK_LIB(pthread, [pthread_once], [], [AC_MSG_ERROR([pthread with pthread_once required to build ${PACKAGE}])]) ;; esac AM_CONDITIONAL(WIN32, test x$win32 = xtrue) -# Check if the C compiler supports __attribute__((constructor)) -AC_CACHE_CHECK([wether the C compiler supports constructor/destructor attributes], - ac_cv_attribute_constructor, [ - ac_cv_attribute_constructor=no - AC_COMPILE_IFELSE([AC_LANG_PROGRAM( - [[ - static void __attribute__((constructor)) test_constructor(void) { - } - static void __attribute__((destructor)) test_destructor(void) { - } - ]], [])], - [ac_cv_attribute_constructor=yes] - )] -) -if test "$ac_cv_attribute_constructor" = "yes"; then - AC_DEFINE(HAVE_ATTRIBUTE_CONSTRUCTOR, 1, [Define if the C compiler supports constructor/destructor attributes]) +AS_COMPILER_FLAGS(GLOBAL_CFLAGS, "-Wall -Wextra -Wmissing-declarations -Wredundant-decls -Wshadow -Wpointer-arith -Wwrite-strings -Wswitch-default -Wno-unused-parameter -fsigned-char -fvisibility=hidden") + +if test "x$enable_static" = "xyes" -a "x$enable_shared" = "xno"; then + GLOBAL_CFLAGS+=" -DIDEVICE_ACTIVATION_STATIC" fi -AS_COMPILER_FLAGS(GLOBAL_CFLAGS, "-Wall -Wextra -Wmissing-declarations -Wredundant-decls -Wshadow -Wpointer-arith -Wwrite-strings -Wswitch-default -Wno-unused-parameter -fsigned-char -fvisibility=hidden") AC_SUBST(GLOBAL_CFLAGS) -case "$GLOBAL_CFLAGS" in - *-fvisibility=hidden*) - AC_DEFINE([HAVE_FVISIBILITY], [1], [Define if compiled with -fvisibility=hidden]) -esac - m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])]) AC_CONFIG_FILES([ diff --git a/include/libideviceactivation.h b/include/libideviceactivation.h index 9b78c20..dbee85b 100644 --- a/include/libideviceactivation.h +++ b/include/libideviceactivation.h @@ -31,6 +31,16 @@ extern "C" { #include <libimobiledevice/lockdown.h> #include <plist/plist.h> +#ifndef IDEVICE_ACTIVATION_API + #ifdef IDEVICE_ACTIVATION_STATIC + #define IDEVICE_ACTIVATION_API + #elif defined(_WIN32) + #define IDEVICE_ACTIVATION_API __declspec(dllimport) + #else + #define IDEVICE_ACTIVATION_API + #endif +#endif + typedef enum { IDEVICE_ACTIVATION_E_SUCCESS = 0, IDEVICE_ACTIVATION_E_INCOMPLETE_INFO = -1, @@ -55,44 +65,44 @@ typedef idevice_activation_response* idevice_activation_response_t; /* Interface */ -void idevice_activation_set_debug_level(int level); +IDEVICE_ACTIVATION_API void idevice_activation_set_debug_level(int level); -idevice_activation_error_t idevice_activation_request_new(idevice_activation_client_type_t activation_type, idevice_activation_request_t* request); -idevice_activation_error_t idevice_activation_request_new_from_lockdownd(idevice_activation_client_type_t activation_type, lockdownd_client_t lockdown, idevice_activation_request_t* request); -idevice_activation_error_t idevice_activation_drm_handshake_request_new(idevice_activation_client_type_t client_type, idevice_activation_request_t* request); -void idevice_activation_request_free(idevice_activation_request_t request); +IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_request_new(idevice_activation_client_type_t activation_type, idevice_activation_request_t* request); +IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_request_new_from_lockdownd(idevice_activation_client_type_t activation_type, lockdownd_client_t lockdown, idevice_activation_request_t* request); +IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_drm_handshake_request_new(idevice_activation_client_type_t client_type, idevice_activation_request_t* request); +IDEVICE_ACTIVATION_API void idevice_activation_request_free(idevice_activation_request_t request); -void idevice_activation_request_get_fields(idevice_activation_request_t request, plist_t* fields); -void idevice_activation_request_set_fields(idevice_activation_request_t request, plist_t fields); -void idevice_activation_request_set_fields_from_response(idevice_activation_request_t request, const idevice_activation_response_t response); -void idevice_activation_request_set_field(idevice_activation_request_t request, const char* key, const char* value); -void idevice_activation_request_get_field(idevice_activation_request_t request, const char* key, char** value); +IDEVICE_ACTIVATION_API void idevice_activation_request_get_fields(idevice_activation_request_t request, plist_t* fields); +IDEVICE_ACTIVATION_API void idevice_activation_request_set_fields(idevice_activation_request_t request, plist_t fields); +IDEVICE_ACTIVATION_API void idevice_activation_request_set_fields_from_response(idevice_activation_request_t request, const idevice_activation_response_t response); +IDEVICE_ACTIVATION_API void idevice_activation_request_set_field(idevice_activation_request_t request, const char* key, const char* value); +IDEVICE_ACTIVATION_API void idevice_activation_request_get_field(idevice_activation_request_t request, const char* key, char** value); -void idevice_activation_request_get_url(idevice_activation_request_t request, const char** url); -void idevice_activation_request_set_url(idevice_activation_request_t request, const char* url); +IDEVICE_ACTIVATION_API void idevice_activation_request_get_url(idevice_activation_request_t request, const char** url); +IDEVICE_ACTIVATION_API void idevice_activation_request_set_url(idevice_activation_request_t request, const char* url); -idevice_activation_error_t idevice_activation_response_new(idevice_activation_response_t* response); -idevice_activation_error_t idevice_activation_response_new_from_html(const char* content, idevice_activation_response_t* response); -idevice_activation_error_t idevice_activation_response_to_buffer(idevice_activation_response_t response, char** buffer, size_t* size); -void idevice_activation_response_free(idevice_activation_response_t response); +IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_response_new(idevice_activation_response_t* response); +IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_response_new_from_html(const char* content, idevice_activation_response_t* response); +IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_response_to_buffer(idevice_activation_response_t response, char** buffer, size_t* size); +IDEVICE_ACTIVATION_API void idevice_activation_response_free(idevice_activation_response_t response); -void idevice_activation_response_get_field(idevice_activation_response_t response, const char* key, char** value); -void idevice_activation_response_get_fields(idevice_activation_response_t response, plist_t* fields); -void idevice_activation_response_get_label(idevice_activation_response_t response, const char* key, char** value); -void idevice_activation_response_get_placeholder(idevice_activation_response_t response, const char* key, char **value); +IDEVICE_ACTIVATION_API void idevice_activation_response_get_field(idevice_activation_response_t response, const char* key, char** value); +IDEVICE_ACTIVATION_API void idevice_activation_response_get_fields(idevice_activation_response_t response, plist_t* fields); +IDEVICE_ACTIVATION_API void idevice_activation_response_get_label(idevice_activation_response_t response, const char* key, char** value); +IDEVICE_ACTIVATION_API void idevice_activation_response_get_placeholder(idevice_activation_response_t response, const char* key, char **value); -void idevice_activation_response_get_title(idevice_activation_response_t response, const char** title); -void idevice_activation_response_get_description(idevice_activation_response_t response, const char** description); -void idevice_activation_response_get_activation_record(idevice_activation_response_t response, plist_t* activation_record); -void idevice_activation_response_get_headers(idevice_activation_response_t response, plist_t* headers); +IDEVICE_ACTIVATION_API void idevice_activation_response_get_title(idevice_activation_response_t response, const char** title); +IDEVICE_ACTIVATION_API void idevice_activation_response_get_description(idevice_activation_response_t response, const char** description); +IDEVICE_ACTIVATION_API void idevice_activation_response_get_activation_record(idevice_activation_response_t response, plist_t* activation_record); +IDEVICE_ACTIVATION_API void idevice_activation_response_get_headers(idevice_activation_response_t response, plist_t* headers); -int idevice_activation_response_is_activation_acknowledged(idevice_activation_response_t response); -int idevice_activation_response_is_authentication_required(idevice_activation_response_t response); -int idevice_activation_response_field_requires_input(idevice_activation_response_t response, const char* key); -int idevice_activation_response_field_secure_input(idevice_activation_response_t response, const char* key); -int idevice_activation_response_has_errors(idevice_activation_response_t response); +IDEVICE_ACTIVATION_API int idevice_activation_response_is_activation_acknowledged(idevice_activation_response_t response); +IDEVICE_ACTIVATION_API int idevice_activation_response_is_authentication_required(idevice_activation_response_t response); +IDEVICE_ACTIVATION_API int idevice_activation_response_field_requires_input(idevice_activation_response_t response, const char* key); +IDEVICE_ACTIVATION_API int idevice_activation_response_field_secure_input(idevice_activation_response_t response, const char* key); +IDEVICE_ACTIVATION_API int idevice_activation_response_has_errors(idevice_activation_response_t response); -idevice_activation_error_t idevice_activation_send_request(idevice_activation_request_t request, idevice_activation_response_t* response); +IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_send_request(idevice_activation_request_t request, idevice_activation_response_t* response); #ifdef __cplusplus } diff --git a/src/activation.c b/src/activation.c index 4260c20..2b329ce 100644 --- a/src/activation.c +++ b/src/activation.c @@ -32,25 +32,52 @@ #include <libxml/HTMLtree.h> #include <curl/curl.h> -#ifdef WIN32 -#define IDEVICE_ACTIVATION_API __declspec( dllexport ) +#ifdef IDEVICE_ACTIVATION_STATIC + #define IDEVICE_ACTIVATION_API +#elif defined(_WIN32) + #define IDEVICE_ACTIVATION_API __declspec( dllexport ) #else -#ifdef HAVE_FVISIBILITY -#define IDEVICE_ACTIVATION_API __attribute__((visibility("default"))) -#else -#define IDEVICE_ACTIVATION_API -#endif + #if __GNUC__ >= 4 + #define IDEVICE_ACTIVATION_API __attribute__((visibility("default"))) + #else + #define IDEVICE_ACTIVATION_API + #endif #endif -#ifdef WIN32 +#ifdef _WIN32 #include <windows.h> #define strncasecmp _strnicmp -#else -#include <pthread.h> #endif #include <libideviceactivation.h> +// Reference: https://stackoverflow.com/a/2390626/1806760 +// Initializer/finalizer sample for MSVC and GCC/Clang. +// 2010-2016 Joe Lowe. Released into the public domain. + +#ifdef __cplusplus + #define INITIALIZER(f) \ + static void f(void); \ + struct f##_t_ { f##_t_(void) { f(); } }; static f##_t_ f##_; \ + static void f(void) +#elif defined(_MSC_VER) + #pragma section(".CRT$XCU",read) + #define INITIALIZER2_(f,p) \ + static void f(void); \ + __declspec(allocate(".CRT$XCU")) void (*f##_)(void) = f; \ + __pragma(comment(linker,"/include:" p #f "_")) \ + static void f(void) + #ifdef _WIN64 + #define INITIALIZER(f) INITIALIZER2_(f,"") + #else + #define INITIALIZER(f) INITIALIZER2_(f,"_") + #endif +#else + #define INITIALIZER(f) \ + static void f(void) __attribute__((__constructor__)); \ + static void f(void) +#endif + #define IDEVICE_ACTIVATION_USER_AGENT_IOS "iOS Device Activator (MobileActivation-592.103.2)" #define IDEVICE_ACTIVATION_USER_AGENT_ITUNES "iTunes/11.1.4 (Macintosh; OS X 10.9.1) AppleWebKit/537.73.11" #define IDEVICE_ACTIVATION_DEFAULT_URL "https://albert.apple.com/deviceservices/deviceActivation" @@ -90,81 +117,20 @@ struct idevice_activation_response_private { int has_errors; }; - -static void internal_libideviceactivation_init(void) -{ - curl_global_init(CURL_GLOBAL_ALL); -} - static void internal_libideviceactivation_deinit(void) { curl_global_cleanup(); } -#ifdef WIN32 -typedef volatile struct { - LONG lock; - int state; -} thread_once_t; - -static thread_once_t init_once = {0, 0}; -static thread_once_t deinit_once = {0, 0}; - -static void thread_once(thread_once_t *once_control, void (*init_routine)(void)) -{ - while (InterlockedExchange(&(once_control->lock), 1) != 0) { - Sleep(1); - } - if (!once_control->state) { - once_control->state = 1; - init_routine(); - } - InterlockedExchange(&(once_control->lock), 0); -} -#else -static pthread_once_t init_once = PTHREAD_ONCE_INIT; -static pthread_once_t deinit_once = PTHREAD_ONCE_INIT; -#define thread_once pthread_once -#endif - -#ifndef HAVE_ATTRIBUTE_CONSTRUCTOR - #if defined(__llvm__) || defined(__GNUC__) - #define HAVE_ATTRIBUTE_CONSTRUCTOR - #endif -#endif - -#ifdef HAVE_ATTRIBUTE_CONSTRUCTOR -static void __attribute__((constructor)) libideviceactivation_initialize(void) +INITIALIZER(internal_libideviceactivation_init) { - thread_once(&init_once, internal_libideviceactivation_init); -} - -static void __attribute__((destructor)) libideviceactivation_deinitialize(void) -{ - thread_once(&deinit_once, internal_libideviceactivation_deinit); -} -#elif defined(WIN32) -BOOL WINAPI DllMain(HINSTANCE hModule, DWORD dwReason, LPVOID lpReserved) -{ - switch (dwReason) { - case DLL_PROCESS_ATTACH: - thread_once(&init_once, internal_libideviceactivation_init); - break; - case DLL_PROCESS_DETACH: - thread_once(&deinit_once, internal_libideviceactivation_deinit); - break; - default: - break; - } - return 1; + curl_global_init(CURL_GLOBAL_ALL); + atexit(internal_libideviceactivation_deinit); } -#else -#warning No compiler support for constructor/destructor attributes, some features might not be available. -#endif static int debug_level = 0; -IDEVICE_ACTIVATION_API void idevice_activation_set_debug_level(int level) { +void idevice_activation_set_debug_level(int level) { debug_level = level; } @@ -721,7 +687,7 @@ static int idevice_activation_curl_debug_callback(CURL *handle, curl_infotype ty return 0; } -IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_request_new(idevice_activation_client_type_t client_type, idevice_activation_request_t* request) +idevice_activation_error_t idevice_activation_request_new(idevice_activation_client_type_t client_type, idevice_activation_request_t* request) { if (!request) return IDEVICE_ACTIVATION_E_INTERNAL_ERROR; @@ -741,7 +707,7 @@ IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_request_new return IDEVICE_ACTIVATION_E_SUCCESS; } -IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_request_new_from_lockdownd(idevice_activation_client_type_t client_type, lockdownd_client_t lockdown, idevice_activation_request** request) +idevice_activation_error_t idevice_activation_request_new_from_lockdownd(idevice_activation_client_type_t client_type, lockdownd_client_t lockdown, idevice_activation_request** request) { if (!lockdown || !request) { return IDEVICE_ACTIVATION_E_INTERNAL_ERROR; @@ -864,7 +830,7 @@ IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_request_new return IDEVICE_ACTIVATION_E_SUCCESS; } -IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_drm_handshake_request_new(idevice_activation_client_type_t client_type, idevice_activation_request_t* request) +idevice_activation_error_t idevice_activation_drm_handshake_request_new(idevice_activation_client_type_t client_type, idevice_activation_request_t* request) { if (!request) return IDEVICE_ACTIVATION_E_INTERNAL_ERROR; @@ -884,7 +850,7 @@ IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_drm_handsha return IDEVICE_ACTIVATION_E_SUCCESS; } -IDEVICE_ACTIVATION_API void idevice_activation_request_free(idevice_activation_request_t request) +void idevice_activation_request_free(idevice_activation_request_t request) { if (!request) return; @@ -893,7 +859,7 @@ IDEVICE_ACTIVATION_API void idevice_activation_request_free(idevice_activation_r free(request); } -IDEVICE_ACTIVATION_API void idevice_activation_request_get_fields(idevice_activation_request_t request, plist_t* fields) +void idevice_activation_request_get_fields(idevice_activation_request_t request, plist_t* fields) { if (!request || !fields) return; @@ -901,7 +867,7 @@ IDEVICE_ACTIVATION_API void idevice_activation_request_get_fields(idevice_activa *fields = plist_copy(request->fields); } -IDEVICE_ACTIVATION_API void idevice_activation_request_set_fields(idevice_activation_request_t request, plist_t fields) +void idevice_activation_request_set_fields(idevice_activation_request_t request, plist_t fields) { if (!request || !fields) return; @@ -923,7 +889,7 @@ IDEVICE_ACTIVATION_API void idevice_activation_request_set_fields(idevice_activa plist_dict_merge(&request->fields, fields); } -IDEVICE_ACTIVATION_API void idevice_activation_request_set_fields_from_response(idevice_activation_request_t request, const idevice_activation_response_t response) +void idevice_activation_request_set_fields_from_response(idevice_activation_request_t request, const idevice_activation_response_t response) { if (!request || !response) return; @@ -936,7 +902,7 @@ IDEVICE_ACTIVATION_API void idevice_activation_request_set_fields_from_response( } } -IDEVICE_ACTIVATION_API void idevice_activation_request_set_field(idevice_activation_request_t request, const char* key, const char* value) +void idevice_activation_request_set_field(idevice_activation_request_t request, const char* key, const char* value) { if (!request || !key || !value) return; @@ -944,7 +910,7 @@ IDEVICE_ACTIVATION_API void idevice_activation_request_set_field(idevice_activat plist_dict_set_item(request->fields, key, plist_new_string(value)); } -IDEVICE_ACTIVATION_API void idevice_activation_request_get_field(idevice_activation_request_t request, const char* key, char** value) +void idevice_activation_request_get_field(idevice_activation_request_t request, const char* key, char** value) { if (!request || !key || !value) return; @@ -964,7 +930,7 @@ IDEVICE_ACTIVATION_API void idevice_activation_request_get_field(idevice_activat *value = tmp_value; } -IDEVICE_ACTIVATION_API void idevice_activation_request_get_url(idevice_activation_request_t request, const char** url) +void idevice_activation_request_get_url(idevice_activation_request_t request, const char** url) { if (!request || !url) return; @@ -972,7 +938,7 @@ IDEVICE_ACTIVATION_API void idevice_activation_request_get_url(idevice_activatio *url = request->url; } -IDEVICE_ACTIVATION_API void idevice_activation_request_set_url(idevice_activation_request_t request, const char* url) +void idevice_activation_request_set_url(idevice_activation_request_t request, const char* url) { if (!request || !url) return; @@ -981,7 +947,7 @@ IDEVICE_ACTIVATION_API void idevice_activation_request_set_url(idevice_activatio request->url = strdup(url); } -IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_response_new(idevice_activation_response_t* response) +idevice_activation_error_t idevice_activation_response_new(idevice_activation_response_t* response) { if (!response) return IDEVICE_ACTIVATION_E_INTERNAL_ERROR; @@ -1012,7 +978,7 @@ IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_response_ne return IDEVICE_ACTIVATION_E_SUCCESS; } -IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_response_new_from_html(const char* content, idevice_activation_response_t* response) +idevice_activation_error_t idevice_activation_response_new_from_html(const char* content, idevice_activation_response_t* response) { if (!content || !response) return IDEVICE_ACTIVATION_E_INTERNAL_ERROR; @@ -1050,7 +1016,7 @@ IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_response_ne return result; } -IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_response_to_buffer(idevice_activation_response_t response, char** buffer, size_t* size) +idevice_activation_error_t idevice_activation_response_to_buffer(idevice_activation_response_t response, char** buffer, size_t* size) { if (!response || !buffer || !size) return IDEVICE_ACTIVATION_E_INTERNAL_ERROR; @@ -1068,7 +1034,7 @@ IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_response_to return IDEVICE_ACTIVATION_E_SUCCESS; } -IDEVICE_ACTIVATION_API void idevice_activation_response_free(idevice_activation_response_t response) +void idevice_activation_response_free(idevice_activation_response_t response) { if (!response) return; @@ -1086,7 +1052,7 @@ IDEVICE_ACTIVATION_API void idevice_activation_response_free(idevice_activation_ free(response); } -IDEVICE_ACTIVATION_API void idevice_activation_response_get_field(idevice_activation_response_t response, const char* key, char** value) +void idevice_activation_response_get_field(idevice_activation_response_t response, const char* key, char** value) { if (!response || !key || !value) return; @@ -1099,14 +1065,14 @@ IDEVICE_ACTIVATION_API void idevice_activation_response_get_field(idevice_activa } } -IDEVICE_ACTIVATION_API void idevice_activation_response_get_fields(idevice_activation_response_t response, plist_t* fields) +void idevice_activation_response_get_fields(idevice_activation_response_t response, plist_t* fields) { if (response && response->fields && fields) { *fields = plist_copy(response->fields); } } -IDEVICE_ACTIVATION_API void idevice_activation_response_get_label(idevice_activation_response_t response, const char* key, char** value) +void idevice_activation_response_get_label(idevice_activation_response_t response, const char* key, char** value) { if (!response || !key || !value) return; @@ -1118,7 +1084,7 @@ IDEVICE_ACTIVATION_API void idevice_activation_response_get_label(idevice_activa } } -IDEVICE_ACTIVATION_API void idevice_activation_response_get_placeholder(idevice_activation_response_t response, const char* key, char** value) +void idevice_activation_response_get_placeholder(idevice_activation_response_t response, const char* key, char** value) { if (!response || !key || !value) return; @@ -1130,7 +1096,7 @@ IDEVICE_ACTIVATION_API void idevice_activation_response_get_placeholder(idevice_ } } -IDEVICE_ACTIVATION_API void idevice_activation_response_get_title(idevice_activation_response_t response, const char** title) +void idevice_activation_response_get_title(idevice_activation_response_t response, const char** title) { if (!response || !title) return; @@ -1138,7 +1104,7 @@ IDEVICE_ACTIVATION_API void idevice_activation_response_get_title(idevice_activa *title = response->title; } -IDEVICE_ACTIVATION_API void idevice_activation_response_get_description(idevice_activation_response_t response, const char** description) +void idevice_activation_response_get_description(idevice_activation_response_t response, const char** description) { if (!response || !description) return; @@ -1146,7 +1112,7 @@ IDEVICE_ACTIVATION_API void idevice_activation_response_get_description(idevice_ *description = response->description; } -IDEVICE_ACTIVATION_API void idevice_activation_response_get_activation_record(idevice_activation_response_t response, plist_t* activation_record) +void idevice_activation_response_get_activation_record(idevice_activation_response_t response, plist_t* activation_record) { if (!response || !activation_record) return; @@ -1158,7 +1124,7 @@ IDEVICE_ACTIVATION_API void idevice_activation_response_get_activation_record(id } } -IDEVICE_ACTIVATION_API void idevice_activation_response_get_headers(idevice_activation_response_t response, plist_t* headers) +void idevice_activation_response_get_headers(idevice_activation_response_t response, plist_t* headers) { if (!response || !headers) return; @@ -1166,7 +1132,7 @@ IDEVICE_ACTIVATION_API void idevice_activation_response_get_headers(idevice_acti *headers = plist_copy(response->headers); } -IDEVICE_ACTIVATION_API int idevice_activation_response_is_activation_acknowledged(idevice_activation_response_t response) +int idevice_activation_response_is_activation_acknowledged(idevice_activation_response_t response) { if (!response) return 0; @@ -1174,7 +1140,7 @@ IDEVICE_ACTIVATION_API int idevice_activation_response_is_activation_acknowledge return response->is_activation_ack; } -IDEVICE_ACTIVATION_API int idevice_activation_response_is_authentication_required(idevice_activation_response_t response) +int idevice_activation_response_is_authentication_required(idevice_activation_response_t response) { if (!response) return 0; @@ -1182,7 +1148,7 @@ IDEVICE_ACTIVATION_API int idevice_activation_response_is_authentication_require return response->is_auth_required; } -IDEVICE_ACTIVATION_API int idevice_activation_response_field_requires_input(idevice_activation_response_t response, const char* key) +int idevice_activation_response_field_requires_input(idevice_activation_response_t response, const char* key) { if (!response || !key) return 0; @@ -1190,7 +1156,7 @@ IDEVICE_ACTIVATION_API int idevice_activation_response_field_requires_input(idev return (plist_dict_get_item(response->fields_require_input, key) ? 1 : 0); } -IDEVICE_ACTIVATION_API int idevice_activation_response_field_secure_input(idevice_activation_response_t response, const char* key) +int idevice_activation_response_field_secure_input(idevice_activation_response_t response, const char* key) { if (!response || !key) return 0; @@ -1198,7 +1164,7 @@ IDEVICE_ACTIVATION_API int idevice_activation_response_field_secure_input(idevic return (plist_dict_get_item(response->fields_secure_input, key) ? 1 : 0); } -IDEVICE_ACTIVATION_API int idevice_activation_response_has_errors(idevice_activation_response_t response) +int idevice_activation_response_has_errors(idevice_activation_response_t response) { if (!response) return 0; @@ -1206,7 +1172,7 @@ IDEVICE_ACTIVATION_API int idevice_activation_response_has_errors(idevice_activa return response->has_errors; } -IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_send_request(idevice_activation_request_t request, idevice_activation_response_t* response) +idevice_activation_error_t idevice_activation_send_request(idevice_activation_request_t request, idevice_activation_response_t* response) { idevice_activation_error_t result = IDEVICE_ACTIVATION_E_SUCCESS; diff --git a/tools/ideviceactivation.c b/tools/ideviceactivation.c index 757c54e..0ea3901 100644 --- a/tools/ideviceactivation.c +++ b/tools/ideviceactivation.c @@ -30,7 +30,7 @@ #include <string.h> #include <unistd.h> #include <ctype.h> -#ifndef WIN32 +#ifndef _WIN32 #include <signal.h> #endif @@ -40,7 +40,7 @@ #include <libimobiledevice/mobileactivation.h> #include <libideviceactivation.h> -#ifdef WIN32 +#ifdef _WIN32 #include <windows.h> #include <conio.h> #else @@ -60,6 +60,7 @@ static void print_usage(int argc, char **argv) printf(" activate\t\tattempt to activate the device\n"); printf(" deactivate\t\tdeactivate the device\n"); printf(" state\t\t\tquery device about its activation state\n"); + printf(" itunes\t\ttell the device that it has been connected to iTunes (useful for < iOS 4)\n"); printf("\n"); printf("The following OPTIONS are accepted:\n"); printf(" -d, --debug\t\tenable communication debugging\n"); @@ -74,7 +75,7 @@ static void print_usage(int argc, char **argv) printf("Bug Reports: <" PACKAGE_BUGREPORT ">\n"); } -#ifdef WIN32 +#ifdef _WIN32 #define BS_CC '\b' #define my_getch getch #else @@ -142,11 +143,11 @@ int main(int argc, char *argv[]) int use_network = 0; typedef enum { - OP_NONE = 0, OP_ACTIVATE, OP_DEACTIVATE, OP_GETSTATE + OP_NONE = 0, OP_ACTIVATE, OP_DEACTIVATE, OP_GETSTATE, OP_ITUNES } op_t; op_t op = OP_NONE; -#ifndef WIN32 +#ifndef _WIN32 signal(SIGPIPE, SIG_IGN); #endif /* parse cmdline args */ @@ -202,6 +203,10 @@ int main(int argc, char *argv[]) op = OP_GETSTATE; continue; } + else if (!strcmp(argv[i], "itunes")) { + op = OP_ITUNES; + continue; + } else { print_usage(argc, argv); return EXIT_SUCCESS; @@ -602,6 +607,18 @@ int main(int argc, char *argv[]) } } break; + + case OP_ITUNES: { + // set iTunesHasConnected if we succeeded + if (LOCKDOWN_E_SUCCESS != lockdownd_set_value(lockdown, NULL, "iTunesHasConnected", plist_new_bool(1))) { + fprintf(stderr, "Failed to set iTunesHasConnected on device.\n"); + result = EXIT_FAILURE; + goto cleanup; + } + result = EXIT_SUCCESS; + printf("Successfully set 'iTunesHasConnected'.\n"); + } + break; } cleanup: |
