diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..ae22d88 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "swift" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "weekly" diff --git a/.github/workflows/IPSWDownloads.yml b/.github/workflows/IPSWDownloads.yml new file mode 100644 index 0000000..d55ca89 --- /dev/null +++ b/.github/workflows/IPSWDownloads.yml @@ -0,0 +1,165 @@ +name: IPSWDownloads +on: + push: + branches-ignore: + - '*WIP' + +jobs: + build-ubuntu: + name: Build on Ubuntu + env: + PACKAGE_NAME: IPSWDownloads + SWIFT_VER: ${{ matrix.swift-version }} + runs-on: ${{ matrix.runs-on }} + if: "!contains(github.event.head_commit.message, 'ci skip')" + strategy: + matrix: + runs-on: [ubuntu-20.04, ubuntu-22.04] + swift-version: [5.9] + steps: + - uses: actions/checkout@v3 + - name: Cache swift package modules + id: cache-spm-linux + uses: actions/cache@v3 + env: + cache-name: SPM + with: + path: .build + key: ${{ env.cache-name }}-${{ runner.os }}-${{ env.SWIFT_VER }}-${{ hashFiles('Package.resolved') }}-${{ env.RELEASE_DOT }} + restore-keys: | + ${{ env.cache-name }}-${{ runner.os }}-${{ env.SWIFT_VER }}-${{ hashFiles('Package.resolved') }} + ${{ env.cache-name }}-${{ runner.os }}-${{ env.SWIFT_VER }} + - name: Set Ubuntu Release DOT + run: echo "RELEASE_DOT=$(lsb_release -sr)" >> $GITHUB_ENV + - name: Set Ubuntu Release NUM + run: echo "RELEASE_NUM=${RELEASE_DOT//[-._]/}" >> $GITHUB_ENV + - name: Set Ubuntu Codename + run: echo "RELEASE_NAME=$(lsb_release -sc)" >> $GITHUB_ENV + - name: Cache swift + id: cache-swift-linux + uses: actions/cache@v3 + env: + cache-name: swift + with: + path: swift-${{ env.SWIFT_VER }}-RELEASE-ubuntu${{ env.RELEASE_DOT }} + key: ${{ env.cache-name }}-${{ runner.os }}-${{ env.SWIFT_VER }}-${{ env.RELEASE_DOT }} + - name: Download Swift + if: steps.cache-swift-linux.outputs.cache-hit != 'true' + run: curl -O https://download.swift.org/swift-${SWIFT_VER}-release/ubuntu${RELEASE_NUM}/swift-${SWIFT_VER}-RELEASE/swift-${SWIFT_VER}-RELEASE-ubuntu${RELEASE_DOT}.tar.gz + - name: Extract Swift + if: steps.cache-swift-linux.outputs.cache-hit != 'true' + run: tar xzf swift-${SWIFT_VER}-RELEASE-ubuntu${RELEASE_DOT}.tar.gz + - name: Add Path + run: echo "$GITHUB_WORKSPACE/swift-${SWIFT_VER}-RELEASE-ubuntu${RELEASE_DOT}/usr/bin" >> $GITHUB_PATH + - name: Build + run: swift build + - name: Run tests + run: swift test --enable-test-discovery --enable-code-coverage + - name: Prepare Code Coverage + run: llvm-cov export -format="lcov" .build/x86_64-unknown-linux-gnu/debug/${{ env.PACKAGE_NAME }}PackageTests.xctest -instr-profile .build/debug/codecov/default.profdata > info.lcov + - name: Upload coverage reports to Codecov + uses: codecov/codecov-action@v3 + with: + token: ${{ secrets.CODECOV_TOKEN }} + flags: spm,${{ env.RELEASE_NAME }},${{ env.SWIFT_VER }} + build-macos: + name: Build on macOS + env: + PACKAGE_NAME: IPSWDownloads + runs-on: ${{ matrix.runs-on }} + if: "!contains(github.event.head_commit.message, 'ci skip')" + strategy: + matrix: + include: + - runs-on: macos-13 + xcode: "/Applications/Xcode_15.0.1.app" + iOSVersion: "17.0.1" + watchOSVersion: "10.0" + watchName: "Apple Watch Series 9 (41mm)" + iPhoneName: "iPhone 15" + - runs-on: macos-13 + xcode: "/Applications/Xcode_15.1.app" + iOSVersion: "17.2" + watchOSVersion: "10.2" + watchName: "Apple Watch Series 9 (45mm)" + iPhoneName: "iPhone 15 Pro" + - runs-on: macos-13-xlarge + xcode: "/Applications/Xcode_15.2.app" + iOSVersion: "17.2" + watchOSVersion: "10.2" + watchName: "Apple Watch Ultra 2 (49mm)" + iPhoneName: "iPhone 15 Pro Max" + steps: + - uses: actions/checkout@v3 + - name: Cache swift package modules + id: cache-spm-macos + uses: actions/cache@v3 + env: + cache-name: cache-spm + with: + path: .build + key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('Package.resolved') }} + restore-keys: | + ${{ runner.os }}-build-${{ env.cache-name }}- + ${{ runner.os }}-build- + ${{ runner.os }}- + - name: Cache mint + if: ${{ github.event_name == 'pull_request' && ( github.base_ref == 'main' || endsWith( github.ref_name , 'Prep') ) && matrix.xcode == '/Applications/Xcode_15.2.app' }} + id: cache-mint + uses: actions/cache@v3 + env: + cache-name: cache-mint + with: + path: .mint + key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('Mintfile') }} + restore-keys: | + ${{ runner.os }}-build-${{ env.cache-name }}- + ${{ runner.os }}-build- + ${{ runner.os }}- + - name: Set Xcode Name + run: echo "XCODE_NAME=$(basename -- ${{ matrix.xcode }} | sed 's/\.[^.]*$//' | cut -d'_' -f2)" >> $GITHUB_ENV + - name: Setup Xcode + run: sudo xcode-select -s ${{ matrix.xcode }}/Contents/Developer + - name: Install mint + if: ${{ github.event_name == 'pull_request' && ( github.base_ref == 'main' || endsWith( github.ref_name , 'Prep') ) && matrix.xcode == '/Applications/Xcode_15.2.app' }} + run: | + brew update + brew install mint + # - name: Initialize CodeQL + # if: startsWith(matrix.xcode,'/Applications/Xcode_15.1') + # uses: github/codeql-action/init@v3 + # with: + # languages: ${{ matrix.language }} + - name: Build + run: swift build + # - name: Perform CodeQL Analysis + # if: startsWith(matrix.xcode,'/Applications/Xcode_15.1') + # uses: github/codeql-action/analyze@v3 + - name: Run Swift Package tests + run: swift test -v --enable-code-coverage + - uses: sersoft-gmbh/swift-coverage-action@v4 + - name: Upload SPM to CodeCov.io + run: bash <(curl https://codecov.io/bash) -F spm -F macOS -F ${XCODE_NAME} + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + - name: Clean up spm build directory + run: rm -rf .build + - name: Lint + run: ./scripts/lint.sh + if: ${{ github.event_name == 'pull_request' && ( github.base_ref == 'main' || endsWith( github.ref_name , 'Prep') ) && matrix.xcode == '/Applications/Xcode_15.2.app' }} + - name: Run iOS target tests + run: xcodebuild test -scheme IPSWDownloads -sdk iphonesimulator -destination 'platform=iOS Simulator,name=${{ matrix.iPhoneName }},OS=${{ matrix.iOSVersion }}' -enableCodeCoverage YES build test + - uses: sersoft-gmbh/swift-coverage-action@v4 + - name: Upload coverage reports to Codecov + uses: codecov/codecov-action@v3 + with: + token: ${{ secrets.CODECOV_TOKEN }} + flags: iOS,iOS${{ matrix.iOSVersion }},macOS,${{ env.XCODE_NAME }} + - name: Run watchOS target tests + run: xcodebuild test -scheme IPSWDownloads -sdk watchsimulator -destination 'platform=watchOS Simulator,name=${{ matrix.watchName }},OS=${{ matrix.watchOSVersion }}' -enableCodeCoverage YES build test + - uses: sersoft-gmbh/swift-coverage-action@v4 + - name: Upload coverage reports to Codecov + uses: codecov/codecov-action@v3 + with: + token: ${{ secrets.CODECOV_TOKEN }} + flags: watchOS,watchOS${{ matrix.watchOSVersion }},macOS,${{ env.XCODE_NAME }} diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 0000000..dfa85e7 --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,75 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + schedule: + - cron: '16 9 * * 1' + +jobs: + analyze: + name: Analyze + # Runner size impacts CodeQL analysis time. To learn more, please see: + # - https://gh.io/recommended-hardware-resources-for-running-codeql + # - https://gh.io/supported-runners-and-hardware-resources + # - https://gh.io/using-larger-runners + # Consider using larger runners for possible analysis time improvements. + runs-on: ${{ (matrix.language == 'swift' && 'macos-13') || 'ubuntu-latest' }} + timeout-minutes: ${{ (matrix.language == 'swift' && 120) || 360 }} + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ 'swift' ] + # CodeQL supports [ 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'swift' ] + # Use only 'java-kotlin' to analyze code written in Java, Kotlin or both + # Use only 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both + # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Xcode + run: sudo xcode-select -s /Applications/Xcode_15.1.app/Contents/Developer + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v3 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + + # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality + + + # Autobuild attempts to build any compiled languages (C/C++, C#, Go, Java, or Swift). + # If this step fails, then you should remove it and run the build manually (see below) + - run: | + echo "Run, Build Application using script" + swift build + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v3 + with: + category: "/language:${{matrix.language}}" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f964942 --- /dev/null +++ b/.gitignore @@ -0,0 +1,145 @@ +# Created by https://www.toptal.com/developers/gitignore/api/swift,swiftpm,swiftpackagemanager,xcode,macos +# Edit at https://www.toptal.com/developers/gitignore?templates=swift,swiftpm,swiftpackagemanager,xcode,macos + +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### Swift ### +# Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## User settings +xcuserdata/ + +## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) +*.xcscmblueprint +*.xccheckout + +## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) +build/ +DerivedData/ +*.moved-aside +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 + +## Obj-C/Swift specific +*.hmap + +## App packaging +*.ipa +*.dSYM.zip +*.dSYM + +## Playgrounds +timeline.xctimeline +playground.xcworkspace + +# Swift Package Manager +# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. +Packages/ +Package.pins +#Package.resolved +*.xcodeproj +# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata +# hence it is not needed unless you have added a package configuration file to your project +.swiftpm + +.build/ + +# CocoaPods +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control +# Pods/ +# Add this line if you want to avoid checking in source code from the Xcode workspace +# *.xcworkspace + +# Carthage +# Add this line if you want to avoid checking in source code from Carthage dependencies. +# Carthage/Checkouts + +Carthage/Build/ + +# Accio dependency management +Dependencies/ +.accio/ + +# fastlane +# It is recommended to not store the screenshots in the git repo. +# Instead, use fastlane to re-generate the screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://docs.fastlane.tools/best-practices/source-control/#source-control + +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots/**/*.png +fastlane/test_output + +# Code Injection +# After new code Injection tools there's a generated folder /iOSInjectionProject +# https://github.com/johnno1962/injectionforxcode + +iOSInjectionProject/ + +### SwiftPackageManager ### +Packages +xcuserdata +*.xcodeproj + + +### SwiftPM ### + + +### Xcode ### +# Xcode +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + + + + +## Gcc Patch +/*.gcno + +### Xcode Patch ### +*.xcodeproj/* +!*.xcodeproj/project.pbxproj +!*.xcodeproj/xcshareddata/ +!*.xcworkspace/contents.xcworkspacedata +**/xcshareddata/WorkspaceSettings.xcsettings + +# End of https://www.toptal.com/developers/gitignore/api/swift,swiftpm,swiftpackagemanager,xcode,macos +Output +.mint \ No newline at end of file diff --git a/.hound.yml b/.hound.yml new file mode 100644 index 0000000..6941f63 --- /dev/null +++ b/.hound.yml @@ -0,0 +1,2 @@ +swiftlint: + config_file: .swiftlint.yml diff --git a/.periphery.yml b/.periphery.yml new file mode 100644 index 0000000..793b8c2 --- /dev/null +++ b/.periphery.yml @@ -0,0 +1,3 @@ +retain_public: true +targets: +- IPSWDownloads diff --git a/.spi.yml b/.spi.yml new file mode 100644 index 0000000..5974102 --- /dev/null +++ b/.spi.yml @@ -0,0 +1,4 @@ +version: 1 +builder: + configs: + - documentation_targets: [IPSWDownloads] diff --git a/.swift-version b/.swift-version new file mode 100644 index 0000000..95ee81a --- /dev/null +++ b/.swift-version @@ -0,0 +1 @@ +5.9 diff --git a/.swiftformat b/.swiftformat new file mode 100644 index 0000000..9a8c2b4 --- /dev/null +++ b/.swiftformat @@ -0,0 +1,7 @@ +--indent 2 +--header strip +--commas inline +--disable wrapMultilineStatementBraces, redundantInternal +--extensionacl on-declarations +--decimalgrouping 3,4 +--exclude .build, DerivedData, Sources/IPSWDownloads/Generated diff --git a/.swiftlint.yml b/.swiftlint.yml new file mode 100644 index 0000000..3425645 --- /dev/null +++ b/.swiftlint.yml @@ -0,0 +1,118 @@ +opt_in_rules: + - array_init + - attributes + - closure_body_length + - closure_end_indentation + - closure_spacing + - collection_alignment + - conditional_returns_on_newline + - contains_over_filter_count + - contains_over_filter_is_empty + - contains_over_first_not_nil + - contains_over_range_nil_comparison + - convenience_type + - discouraged_object_literal + - discouraged_optional_boolean + - empty_collection_literal + - empty_count + - empty_string + - empty_xctest_method + - enum_case_associated_values_count + - expiring_todo + - explicit_acl + - explicit_init + - explicit_top_level_acl + - fallthrough + - fatal_error_message + - file_header + - file_name + - file_name_no_space + - file_types_order + - first_where + - flatmap_over_map_reduce + - force_unwrapping + - function_default_parameter_at_end + - ibinspectable_in_extension + - identical_operands + - implicit_return + - implicitly_unwrapped_optional + - indentation_width + - joined_default_parameter + - last_where + - legacy_multiple + - legacy_random + - literal_expression_end_indentation + - lower_acl_than_parent + - missing_docs + - modifier_order + - multiline_arguments + - multiline_arguments_brackets + - multiline_function_chains + - multiline_literal_brackets + - multiline_parameters + - nimble_operator + - nslocalizedstring_key + - nslocalizedstring_require_bundle + - number_separator + - object_literal + - operator_usage_whitespace + - optional_enum_case_matching + - overridden_super_call + - override_in_extension + - pattern_matching_keywords + - prefer_self_type_over_type_of_self + - prefer_zero_over_explicit_init + - private_action + - private_outlet + - prohibited_interface_builder + - prohibited_super_call + - quick_discouraged_call + - quick_discouraged_focused_test + - quick_discouraged_pending_test + - reduce_into + - redundant_nil_coalescing + - redundant_type_annotation + - required_enum_case + - single_test_class + - sorted_first_last + - sorted_imports + - static_operator + - strict_fileprivate + - strong_iboutlet + - switch_case_on_newline + - toggle_bool + - trailing_closure + - type_contents_order + - unavailable_function + - unneeded_parentheses_in_closure_argument + - unowned_variable_capture + - untyped_error_in_catch + - vertical_parameter_alignment_on_call + - vertical_whitespace_between_cases + - vertical_whitespace_closing_braces + - vertical_whitespace_opening_braces + - xct_specific_matcher + - yoda_condition +cyclomatic_complexity: + - 6 + - 9 +file_length: + - 200 + - 550 +function_body_length: + - 15 + - 25 +function_parameter_count: 8 +line_length: + - 90 + - 90 +identifier_name: + excluded: + - id +excluded: + - Tests + - DerivedData + - .build + - Sources/IPSWDownloads/Generated +indentation_width: + indentation_width: 2 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..b29299c --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 BrightDigit + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Mintfile b/Mintfile new file mode 100644 index 0000000..f204f4a --- /dev/null +++ b/Mintfile @@ -0,0 +1,2 @@ +nicklockwood/SwiftFormat@0.52.11 +realm/SwiftLint@0.54.0 diff --git a/Package.resolved b/Package.resolved new file mode 100644 index 0000000..6ebeb54 --- /dev/null +++ b/Package.resolved @@ -0,0 +1,95 @@ +{ + "pins" : [ + { + "identity" : "openapikit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/mattpolzin/OpenAPIKit", + "state" : { + "revision" : "283454875cc6e5b2801d184d65835b92252d1784", + "version" : "3.1.2" + } + }, + { + "identity" : "swift-algorithms", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-algorithms", + "state" : { + "revision" : "f6919dfc309e7f1b56224378b11e28bab5bccc42", + "version" : "1.2.0" + } + }, + { + "identity" : "swift-argument-parser", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-argument-parser", + "state" : { + "revision" : "c8ed701b513cf5177118a175d85fbbbcd707ab41", + "version" : "1.3.0" + } + }, + { + "identity" : "swift-collections", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-collections", + "state" : { + "revision" : "d029d9d39c87bed85b1c50adee7c41795261a192", + "version" : "1.0.6" + } + }, + { + "identity" : "swift-http-types", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-http-types", + "state" : { + "revision" : "1827dc94bdab2eb5f2fc804e9b0cb43574282566", + "version" : "1.0.2" + } + }, + { + "identity" : "swift-numerics", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-numerics.git", + "state" : { + "revision" : "0a5bc04095a675662cf24757cc0640aa2204253b", + "version" : "1.0.2" + } + }, + { + "identity" : "swift-openapi-generator", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-openapi-generator", + "state" : { + "revision" : "76994bfc77061c6cfa3b82415613a9dfbfb47f28", + "version" : "1.1.0" + } + }, + { + "identity" : "swift-openapi-runtime", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-openapi-runtime", + "state" : { + "revision" : "fd101c320185313bbf9c5a45b827b17eda9ff18a", + "version" : "1.1.0" + } + }, + { + "identity" : "swift-openapi-urlsession", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-openapi-urlsession", + "state" : { + "revision" : "aac0a8273fa1186641e0b336da3f1be01aa6a0eb", + "version" : "1.0.0" + } + }, + { + "identity" : "yams", + "kind" : "remoteSourceControl", + "location" : "https://github.com/jpsim/Yams", + "state" : { + "revision" : "0d9ee7ea8c4ebd4a489ad7a73d5c6cad55d6fed3", + "version" : "5.0.6" + } + } + ], + "version" : 2 +} diff --git a/Package.swift b/Package.swift new file mode 100644 index 0000000..e9d8af7 --- /dev/null +++ b/Package.swift @@ -0,0 +1,30 @@ +// swift-tools-version: 5.9 +// swiftlint:disable explicit_acl explicit_top_level_acl +import PackageDescription + +let package = Package( + name: "IPSWDownloads", + platforms: [.macOS(.v10_15), .iOS(.v13), .tvOS(.v13), .watchOS(.v6), .visionOS(.v1)], + products: [ + .library(name: "IPSWDownloads", targets: ["IPSWDownloads"]) + ], + dependencies: [ + .package(url: "https://github.com/apple/swift-openapi-generator", from: "1.0.0"), + .package(url: "https://github.com/apple/swift-openapi-runtime", from: "1.0.0"), + .package(url: "https://github.com/apple/swift-openapi-urlsession", from: "1.0.0") + ], + targets: [ + .target( + name: "IPSWDownloads", + dependencies: [ + .product(name: "OpenAPIRuntime", package: "swift-openapi-runtime"), + .product(name: "OpenAPIURLSession", package: "swift-openapi-urlsession") + ] + ), + .testTarget( + name: "IPSWDownloadsTests", + dependencies: ["IPSWDownloads"] + ) + ] +) +// swiftlint:enable explicit_acl explicit_top_level_acl diff --git a/README.md b/README.md new file mode 100644 index 0000000..d03d58e --- /dev/null +++ b/README.md @@ -0,0 +1,86 @@ +

IPSWDownloads

+ +Provides a Swift-friendly API into the API for [IPSW Downloads](http://ipsw.me). Used by [Bushel](https://getbushel.app). + +[![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fbrightdigit%2FIPSWDownloads%2Fbadge%3Ftype%3Dswift-versions)](https://swiftpackageindex.com/brightdigit/IPSWDownloads) +[![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fbrightdigit%2FIPSWDownloads%2Fbadge%3Ftype%3Dplatforms)](https://swiftpackageindex.com/brightdigit/IPSWDownloads) +[![DocC](https://img.shields.io/badge/DocC-read-success?logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOBAMAAADtZjDiAAAEsmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjE0IgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iMTQiCiAgIGV4aWY6Q29sb3JTcGFjZT0iMSIKICAgdGlmZjpJbWFnZVdpZHRoPSIxNCIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMTQiCiAgIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiCiAgIHRpZmY6WFJlc29sdXRpb249Ijk2LjAiCiAgIHRpZmY6WVJlc29sdXRpb249Ijk2LjAiCiAgIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiCiAgIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIKICAgeG1wOk1vZGlmeURhdGU9IjIwMjEtMDgtMDRUMTU6MzA6MjUtMDQ6MDAiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjEtMDgtMDRUMTU6MzA6MjUtMDQ6MDAiPgogICA8eG1wTU06SGlzdG9yeT4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgc3RFdnQ6YWN0aW9uPSJwcm9kdWNlZCIKICAgICAgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWZmaW5pdHkgRGVzaWduZXIgMS45LjMiCiAgICAgIHN0RXZ0OndoZW49IjIwMjEtMDgtMDRUMTU6MzA6MjUtMDQ6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KPD94cGFja2V0IGVuZD0iciI/PmJ/d+MAAAGCaUNDUHNSR0IgSUVDNjE5NjYtMi4xAAAokXWRzytEURTHP/NDJkaEhYXFpBmrIT9qYqPMpKEmTWOUwWbmmR9qfrzem0mTrbKdosTGrwV/AVtlrRSRkp2yJjboOc+okcy5nXs+93vvOd17LlijWSWn2wcgly9qkaDfNRebdzU+4sBOOx7ccUVXx8PhEHXt7QaLGa/6zFr1z/1rzUtJXQGLQ3hMUbWi8KRwaKWomrwp3Klk4kvCx8JeTS4ofG3qiSo/mZyu8ofJWjQSAGubsCv9ixO/WMloOWF5Oe5ctqT83Md8iTOZn52R2CPejU6EIH5cTDFBAB+DjMrso48h+mVFnfyB7/xpCpKryKxSRmOZNBmKeEUtSfWkxJToSRlZymb///ZVTw0PVas7/dDwYBgvHmjcgM+KYbzvG8bnAdju4Sxfyy/swcir6JWa5t6F1jU4Oa9piS04XYeuOzWuxb8lm7g1lYLnI2iJQcclNC1Ue/azz+EtRFflqy5gewd65Xzr4hdYDGff+AQ5OQAAADBQTFRFDGnVkeT/Arf8AAAADUa77vr/DZX9Y9X/A8P/Nc//0vH/DWfWBKj1C4zwnN3/JkXJIU7IDQAAABB0Uk5T////////////////////AOAjXRkAAAAJcEhZcwAADsQAAA7EAZUrDhsAAABkSURBVAiZY/gPAQz////o6AfTs9Z1gOj2cKnwjv8MP7rini8V6mf4MXFp6aqgHoZPnfOiVmmcZ/h2oqmuqNef4VuOhpISC5BOu9RxwMWf4f+3uxdY/EHm3L3AADbvL+9+MA0GABhFRINKb0NBAAAAAElFTkSuQmCC)](https://IPSWDownloads.dev/) + + +[![Twitter](https://img.shields.io/badge/twitter-@brightdigit-blue.svg?style=flat)](http://twitter.com/brightdigit) +![GitHub](https://img.shields.io/github/license/brightdigit/IPSWDownloads) +[![IPSWDownloads](https://github.com/brightdigit/IPSWDownloads/actions/workflows/IPSWDownloads.yml/badge.svg)](https://github.com/brightdigit/IPSWDownloads/actions/workflows/IPSWDownloads.yml) +![GitHub issues](https://img.shields.io/github/issues/brightdigit/IPSWDownloads) + + +[![Codecov](https://img.shields.io/codecov/c/github/brightdigit/IPSWDownloads)](https://codecov.io/gh/brightdigit/IPSWDownloads) +[![CodeFactor](https://www.codefactor.io/repository/github/brightdigit/IPSWDownloads/badge)](https://www.codefactor.io/repository/github/brightdigit/IPSWDownloads) +[![codebeat badge](https://codebeat.co/badges/a891b07c-4cdb-42cf-a97c-bfae45b378d6)](https://codebeat.co/projects/github-com-brightdigit-IPSWDownloads-main) +[![Code Climate maintainability](https://img.shields.io/codeclimate/maintainability/brightdigit/IPSWDownloads)](https://codeclimate.com/github/brightdigit/IPSWDownloads) +[![Code Climate technical debt](https://img.shields.io/codeclimate/tech-debt/brightdigit/IPSWDownloads?label=debt)](https://codeclimate.com/github/brightdigit/IPSWDownloads) +[![Code Climate issues](https://img.shields.io/codeclimate/issues/brightdigit/IPSWDownloads)](https://codeclimate.com/github/brightdigit/IPSWDownloads) +[![Reviewed by Hound](https://img.shields.io/badge/Reviewed_by-Hound-8E64B0.svg)](https://houndci.com) + +## Introduction + +Provides a Swift-friendly API into the API for [IPSW Downloads](http://ipsw.me). + +## Installation + +### Requirements + +**Apple Platforms** + +- Xcode 15.0.1 or later +- Swift 5.9 or later +- iOS 17.0 / watchOS 10.0 / tvOS 17.0 / macOS 14.0 / visionOS 1.0 or later deployment targets + +**Linux** + +- Ubuntu 20.04 or later +- Swift 5.9 or later + +### Swift Package Manager + +Swift Package Manager is Apple's decentralized dependency manager to integrate libraries to your Swift projects. It is now fully integrated with Xcode 11. + +To integrate **IPSWDownloads** into your project using SPM, specify it in your Package.swift file: + +```swift +let package = Package( + ... + dependencies: [ + .package(url: "https://github.com/brightdigit/IPSWDownloads", from: "1.0.0-beta.1") + ], + targets: [ + .target( + name: "YourTarget", + dependencies: ["IPSWDownloads", ...]), + ... + ] +) +``` + +If this is for an Xcode project simply import the repo at: + +``` +https://github.com/brightdigit/IPSWDownloads +``` + +## Usage + +_Coming Soon!_ + +## Documentation + +Be sure to check out the [IPSW Downloads API for more details](https://ipswdownloads.docs.apiary.io/). + +## Roadmap + +## 1.0.0 + +- [ ] Coming Soon + +## License + +This code is distributed under the MIT license. See the [LICENSE](LICENSE) file for more info. diff --git a/Scripts/generate.sh b/Scripts/generate.sh new file mode 100755 index 0000000..0d42eaf --- /dev/null +++ b/Scripts/generate.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +swift run swift-openapi-generator generate --output-directory Sources/IPSWDownloads/Generated --config openapi-generator-config.yaml openapi.yaml \ No newline at end of file diff --git a/Scripts/gh-md-toc b/Scripts/gh-md-toc new file mode 100755 index 0000000..ef389e7 --- /dev/null +++ b/Scripts/gh-md-toc @@ -0,0 +1,361 @@ +#!/usr/bin/env bash + +# +# Steps: +# +# 1. Download corresponding html file for some README.md: +# curl -s $1 +# +# 2. Discard rows where no substring 'user-content-' (github's markup): +# awk '/user-content-/ { ... +# +# 3.1 Get last number in each row like ' ... sitemap.js.*<\/h/)+2, RLENGTH-5) +# +# 5. Find anchor and insert it inside "(...)": +# substr($0, match($0, "href=\"[^\"]+?\" ")+6, RLENGTH-8) +# + +gh_toc_version="0.7.0" + +gh_user_agent="gh-md-toc v$gh_toc_version" + +# +# Download rendered into html README.md by its url. +# +# +gh_toc_load() { + local gh_url=$1 + + if type curl &>/dev/null; then + curl --user-agent "$gh_user_agent" -s "$gh_url" + elif type wget &>/dev/null; then + wget --user-agent="$gh_user_agent" -qO- "$gh_url" + else + echo "Please, install 'curl' or 'wget' and try again." + exit 1 + fi +} + +# +# Converts local md file into html by GitHub +# +# -> curl -X POST --data '{"text": "Hello world github/linguist#1 **cool**, and #1!"}' https://api.github.com/markdown +#

Hello world github/linguist#1 cool, and #1!

'" +gh_toc_md2html() { + local gh_file_md=$1 + URL=https://api.github.com/markdown/raw + + if [ ! -z "$GH_TOC_TOKEN" ]; then + TOKEN=$GH_TOC_TOKEN + else + TOKEN_FILE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/token.txt" + if [ -f "$TOKEN_FILE" ]; then + TOKEN="$(cat $TOKEN_FILE)" + fi + fi + if [ ! -z "${TOKEN}" ]; then + AUTHORIZATION="Authorization: token ${TOKEN}" + fi + + # echo $URL 1>&2 + OUTPUT=$(curl -s \ + --user-agent "$gh_user_agent" \ + --data-binary @"$gh_file_md" \ + -H "Content-Type:text/plain" \ + -H "$AUTHORIZATION" \ + "$URL") + + if [ "$?" != "0" ]; then + echo "XXNetworkErrorXX" + fi + if [ "$(echo "${OUTPUT}" | awk '/API rate limit exceeded/')" != "" ]; then + echo "XXRateLimitXX" + else + echo "${OUTPUT}" + fi +} + + +# +# Is passed string url +# +gh_is_url() { + case $1 in + https* | http*) + echo "yes";; + *) + echo "no";; + esac +} + +# +# TOC generator +# +gh_toc(){ + local gh_src=$1 + local gh_src_copy=$1 + local gh_ttl_docs=$2 + local need_replace=$3 + local no_backup=$4 + local no_footer=$5 + + if [ "$gh_src" = "" ]; then + echo "Please, enter URL or local path for a README.md" + exit 1 + fi + + + # Show "TOC" string only if working with one document + if [ "$gh_ttl_docs" = "1" ]; then + + echo "Table of Contents" + echo "=================" + echo "" + gh_src_copy="" + + fi + + if [ "$(gh_is_url "$gh_src")" == "yes" ]; then + gh_toc_load "$gh_src" | gh_toc_grab "$gh_src_copy" + if [ "${PIPESTATUS[0]}" != "0" ]; then + echo "Could not load remote document." + echo "Please check your url or network connectivity" + exit 1 + fi + if [ "$need_replace" = "yes" ]; then + echo + echo "!! '$gh_src' is not a local file" + echo "!! Can't insert the TOC into it." + echo + fi + else + local rawhtml=$(gh_toc_md2html "$gh_src") + if [ "$rawhtml" == "XXNetworkErrorXX" ]; then + echo "Parsing local markdown file requires access to github API" + echo "Please make sure curl is installed and check your network connectivity" + exit 1 + fi + if [ "$rawhtml" == "XXRateLimitXX" ]; then + echo "Parsing local markdown file requires access to github API" + echo "Error: You exceeded the hourly limit. See: https://developer.github.com/v3/#rate-limiting" + TOKEN_FILE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/token.txt" + echo "or place GitHub auth token here: ${TOKEN_FILE}" + exit 1 + fi + local toc=`echo "$rawhtml" | gh_toc_grab "$gh_src_copy"` + echo "$toc" + if [ "$need_replace" = "yes" ]; then + if grep -Fxq "" $gh_src && grep -Fxq "" $gh_src; then + echo "Found markers" + else + echo "You don't have or in your file...exiting" + exit 1 + fi + local ts="<\!--ts-->" + local te="<\!--te-->" + local dt=`date +'%F_%H%M%S'` + local ext=".orig.${dt}" + local toc_path="${gh_src}.toc.${dt}" + local toc_footer="" + # http://fahdshariff.blogspot.ru/2012/12/sed-mutli-line-replacement-between-two.html + # clear old TOC + sed -i${ext} "/${ts}/,/${te}/{//!d;}" "$gh_src" + # create toc file + echo "${toc}" > "${toc_path}" + if [ "${no_footer}" != "yes" ]; then + echo -e "\n${toc_footer}\n" >> "$toc_path" + fi + + # insert toc file + if [[ "`uname`" == "Darwin" ]]; then + sed -i "" "/${ts}/r ${toc_path}" "$gh_src" + else + sed -i "/${ts}/r ${toc_path}" "$gh_src" + fi + echo + if [ "${no_backup}" = "yes" ]; then + rm ${toc_path} ${gh_src}${ext} + fi + echo "!! TOC was added into: '$gh_src'" + if [ -z "${no_backup}" ]; then + echo "!! Origin version of the file: '${gh_src}${ext}'" + echo "!! TOC added into a separate file: '${toc_path}'" + fi + echo + fi + fi +} + +# +# Grabber of the TOC from rendered html +# +# $1 - a source url of document. +# It's need if TOC is generated for multiple documents. +# +gh_toc_grab() { + common_awk_script=' + modified_href = "" + split(href, chars, "") + for (i=1;i <= length(href); i++) { + c = chars[i] + res = "" + if (c == "+") { + res = " " + } else { + if (c == "%") { + res = "\\x" + } else { + res = c "" + } + } + modified_href = modified_href res + } + print sprintf("%*s", (level-1)*3, "") "* [" text "](" gh_url modified_href ")" + ' + if [ `uname -s` == "OS/390" ]; then + grepcmd="pcregrep -o" + echoargs="" + awkscript='{ + level = substr($0, length($0), 1) + text = substr($0, match($0, /a>.*<\/h/)+2, RLENGTH-5) + href = substr($0, match($0, "href=\"([^\"]+)?\"")+6, RLENGTH-7) + '"$common_awk_script"' + }' + else + grepcmd="grep -Eo" + echoargs="-e" + awkscript='{ + level = substr($0, length($0), 1) + text = substr($0, match($0, /a>.*<\/h/)+2, RLENGTH-5) + href = substr($0, match($0, "href=\"[^\"]+?\"")+6, RLENGTH-7) + '"$common_awk_script"' + }' + fi + href_regex='href=\"[^\"]+?\"' + + # if closed is on the new line, then move it on the prev line + # for example: + # was: The command foo1 + # + # became: The command foo1 + sed -e ':a' -e 'N' -e '$!ba' -e 's/\n<\/h/<\/h/g' | + + # find strings that corresponds to template + $grepcmd '//g' | sed 's/<\/code>//g' | + + # remove g-emoji + sed 's/]*[^<]*<\/g-emoji> //g' | + + # now all rows are like: + # ... / placeholders" + echo " $app_name - Create TOC for markdown from STDIN" + echo " $app_name --help Show help" + echo " $app_name --version Show version" + return + fi + + if [ "$1" = '--version' ]; then + echo "$gh_toc_version" + echo + echo "os: `lsb_release -d | cut -f 2`" + echo "kernel: `cat /proc/version`" + echo "shell: `$SHELL --version`" + echo + for tool in curl wget grep awk sed; do + printf "%-5s: " $tool + echo `$tool --version | head -n 1` + done + return + fi + + if [ "$1" = "-" ]; then + if [ -z "$TMPDIR" ]; then + TMPDIR="/tmp" + elif [ -n "$TMPDIR" -a ! -d "$TMPDIR" ]; then + mkdir -p "$TMPDIR" + fi + local gh_tmp_md + if [ `uname -s` == "OS/390" ]; then + local timestamp=$(date +%m%d%Y%H%M%S) + gh_tmp_md="$TMPDIR/tmp.$timestamp" + else + gh_tmp_md=$(mktemp $TMPDIR/tmp.XXXXXX) + fi + while read input; do + echo "$input" >> "$gh_tmp_md" + done + gh_toc_md2html "$gh_tmp_md" | gh_toc_grab "" + return + fi + + if [ "$1" = '--insert' ]; then + need_replace="yes" + shift + fi + + if [ "$1" = '--no-backup' ]; then + need_replace="yes" + no_backup="yes" + shift + fi + + if [ "$1" = '--hide-footer' ]; then + need_replace="yes" + no_footer="yes" + shift + fi + + for md in "$@" + do + echo "" + gh_toc "$md" "$#" "$need_replace" "$no_backup" "$no_footer" + done + + echo "" + echo "Created by [gh-md-toc](https://github.com/ekalinin/github-markdown-toc)" +} + +# +# Entry point +# +gh_toc_app "$@" + diff --git a/Scripts/lint.sh b/Scripts/lint.sh new file mode 100755 index 0000000..4c0d481 --- /dev/null +++ b/Scripts/lint.sh @@ -0,0 +1,45 @@ +#!/bin/sh + +if [ -z "$SRCROOT" ]; then + SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + PACKAGE_DIR="${SCRIPT_DIR}/.." +else + PACKAGE_DIR="${SRCROOT}" +fi + +if [ -z "$GITHUB_ACTION" ]; then + MINT_CMD="/opt/homebrew/bin/mint" +else + MINT_CMD="mint" +fi + +export MINT_PATH="$PACKAGE_DIR/.mint" +MINT_ARGS="-n -m $PACKAGE_DIR/Mintfile --silent" +MINT_RUN="$MINT_CMD run $MINT_ARGS" + +if [ "$LINT_MODE" == "NONE" ]; then + exit +elif [ "$LINT_MODE" == "STRICT" ]; then + SWIFTFORMAT_OPTIONS="" + SWIFTLINT_OPTIONS="--strict" +else + SWIFTFORMAT_OPTIONS="" + SWIFTLINT_OPTIONS="" +fi + +pushd $PACKAGE_DIR + +$MINT_CMD bootstrap -m Mintfile + +if [ -z "$CI" ]; then + $MINT_RUN swiftformat . + $MINT_RUN swiftlint autocorrect +fi + +if [ -z "$FORMAT_ONLY"]; then + $MINT_RUN periphery scan + $MINT_RUN swiftformat --lint $SWIFTFORMAT_OPTIONS . + $MINT_RUN swiftlint lint $SWIFTLINT_OPTIONS +fi + +popd diff --git a/Sources/IPSWDownloads/Board.swift b/Sources/IPSWDownloads/Board.swift new file mode 100644 index 0000000..59e1144 --- /dev/null +++ b/Sources/IPSWDownloads/Board.swift @@ -0,0 +1,44 @@ +// +// File.swift +// +// +// Created by Leo Dion on 1/11/24. +// +import Foundation + +public struct Board { + public let boardconfig: String + public let platform: String + + /// The CHIP tag is a 16-bit unsigned integer + /// that denotes the type of chip the firmware is to be installed to. + /// It is one of the few tags that is not read from the fuses, + /// but is instead hardcoded in the bootchain. + /// It is used to prevent incompatible firmwares from being installed; + /// different processors may have their MMIO registers in different locations. + public let cpid: Int + + /// The Board ID of a device + /// (also known as BORD, BDID, or ApBoardId) is a value + /// (usually represented as `uint8\_t`) + /// hat represents multiple characteristics of the logic board + public let bdid: Int + + public init(boardconfig: String, platform: String, cpid: Int, bdid: Int) { + self.boardconfig = boardconfig + self.platform = platform + self.cpid = cpid + self.bdid = bdid + } +} + +extension Board { + internal init(component: Components.Schemas.Board) { + self.init( + boardconfig: component.boardconfig, + platform: component.platform, + cpid: component.cpid, + bdid: component.bdid + ) + } +} diff --git a/Sources/IPSWDownloads/Device.swift b/Sources/IPSWDownloads/Device.swift new file mode 100644 index 0000000..002c4b3 --- /dev/null +++ b/Sources/IPSWDownloads/Device.swift @@ -0,0 +1,32 @@ +// +// File.swift +// +// +// Created by Leo Dion on 1/11/24. +// +import Foundation + +public struct Device { + public let name: String + public let identifier: String + public let firmwares: [Firmware] + public let boards: [Board] + + public init(name: String, identifier: String, firmwares: [Firmware], boards: [Board]) { + self.name = name + self.identifier = identifier + self.firmwares = firmwares + self.boards = boards + } +} + +extension Device { + internal init(component: Components.Schemas.Device) throws { + try self.init( + name: component.name, + identifier: component.identifier, + firmwares: component.firmwares.map(Firmware.init(component:)), + boards: component.boards.map(Board.init(component:)) + ) + } +} diff --git a/Sources/IPSWDownloads/Firmware.swift b/Sources/IPSWDownloads/Firmware.swift new file mode 100644 index 0000000..a6ed03d --- /dev/null +++ b/Sources/IPSWDownloads/Firmware.swift @@ -0,0 +1,61 @@ +// +// File.swift +// +// +// Created by Leo Dion on 1/11/24. +// +import Foundation + +public struct Firmware { + public let identifier: String + public let version: OperatingSystemVersion + public let buildid: String + public let sha1sum: String + public let md5sum: String + public let filesize: Int + public let url: URL + public let releasedate: Date + public let uploaddate: Date + public let signed: Bool + + public init( + identifier: String, + version: OperatingSystemVersion, + buildid: String, + sha1sum: String, + md5sum: String, + filesize: Int, + url: URL, + releasedate: Date, + uploaddate: Date, + signed: Bool + ) { + self.identifier = identifier + self.version = version + self.buildid = buildid + self.sha1sum = sha1sum + self.md5sum = md5sum + self.filesize = filesize + self.url = url + self.releasedate = releasedate + self.uploaddate = uploaddate + self.signed = signed + } +} + +extension Firmware { + internal init(component: Components.Schemas.Firmware) throws { + try self.init( + identifier: component.identifier, + version: OperatingSystemVersion(string: component.version), + buildid: component.buildid, + sha1sum: component.sha1sum, + md5sum: component.md5sum, + filesize: component.filesize, + url: URL(validatingURL: component.url), + releasedate: component.releasedate, + uploaddate: component.uploaddate, + signed: component.signed + ) + } +} diff --git a/Sources/IPSWDownloads/FirmwareType.swift b/Sources/IPSWDownloads/FirmwareType.swift new file mode 100644 index 0000000..7285d08 --- /dev/null +++ b/Sources/IPSWDownloads/FirmwareType.swift @@ -0,0 +1,15 @@ +// +// File.swift +// +// +// Created by Leo Dion on 1/11/24. +// +import Foundation + +/// Type of Firmware file. +public enum FirmwareType: String { + /// IPSW File + case ipsw + /// OTA Firmware + case ota +} diff --git a/Sources/IPSWDownloads/Generated/Client.swift b/Sources/IPSWDownloads/Generated/Client.swift new file mode 100644 index 0000000..74c4f61 --- /dev/null +++ b/Sources/IPSWDownloads/Generated/Client.swift @@ -0,0 +1,181 @@ +// Generated by swift-openapi-generator, do not modify. +@_spi(Generated) import OpenAPIRuntime +#if os(Linux) +@preconcurrency import struct Foundation.URL +@preconcurrency import struct Foundation.Data +@preconcurrency import struct Foundation.Date +#else +import struct Foundation.URL +import struct Foundation.Data +import struct Foundation.Date +#endif +import HTTPTypes +/// Download current and previous versions of Apple's iOS Firmware, iTunes and OTA updates. +internal struct Client: APIProtocol { + /// The underlying HTTP client. + private let client: UniversalClient + /// Creates a new client. + /// - Parameters: + /// - serverURL: The server URL that the client connects to. Any server + /// URLs defined in the OpenAPI document are available as static methods + /// on the ``Servers`` type. + /// - configuration: A set of configuration values for the client. + /// - transport: A transport that performs HTTP operations. + /// - middlewares: A list of middlewares to call before the transport. + internal init( + serverURL: Foundation.URL, + configuration: Configuration = .init(), + transport: any ClientTransport, + middlewares: [any ClientMiddleware] = [] + ) { + self.client = .init( + serverURL: serverURL, + configuration: configuration, + transport: transport, + middlewares: middlewares + ) + } + private var converter: Converter { + client.converter + } + /// Get Firmwares For Device + /// + /// GetFirmwaresForDevice returns Firmwares for a given Device. An optional "type" get parameter may be + /// specified to retrieve OTA Firmwares instead of normal IPSW files. + /// As of 2021-03-04, it is recommended that you use the "boards" property of the device, as devices can have multiple boards. + /// + /// - Remark: HTTP `GET /device/{identifier}`. + /// - Remark: Generated from `#/paths//device/{identifier}/get(getDevice)`. + internal func getDevice(_ input: Operations.getDevice.Input) async throws -> Operations.getDevice.Output { + try await client.send( + input: input, + forOperation: Operations.getDevice.id, + serializer: { input in + let path = try converter.renderedPath( + template: "/device/{}", + parameters: [ + input.path.identifier + ] + ) + var request: HTTPTypes.HTTPRequest = .init( + soar_path: path, + method: .get + ) + suppressMutabilityWarning(&request) + try converter.setQueryItemAsURI( + in: &request, + style: .form, + explode: true, + name: "type", + value: input.query._type + ) + converter.setAcceptHeader( + in: &request.headerFields, + contentTypes: input.headers.accept + ) + return (request, nil) + }, + deserializer: { response, responseBody in + switch response.status.code { + case 200: + let headers: Operations.getDevice.Output.Ok.Headers = .init( + Access_hyphen_Control_hyphen_Allow_hyphen_Methods: try converter.getOptionalHeaderFieldAsURI( + in: response.headerFields, + name: "Access-Control-Allow-Methods", + as: Swift.String.self + ), + Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI( + in: response.headerFields, + name: "Access-Control-Allow-Origin", + as: Swift.String.self + ), + Cache_hyphen_Control: try converter.getOptionalHeaderFieldAsURI( + in: response.headerFields, + name: "Cache-Control", + as: Swift.String.self + ), + Expires: try converter.getOptionalHeaderFieldAsURI( + in: response.headerFields, + name: "Expires", + as: Swift.String.self + ), + X_hyphen_Data_hyphen_Location: try converter.getOptionalHeaderFieldAsURI( + in: response.headerFields, + name: "X-Data-Location", + as: Swift.String.self + ) + ) + let contentType = converter.extractContentTypeIfPresent(in: response.headerFields) + let body: Operations.getDevice.Output.Ok.Body + let chosenContentType = try converter.bestContentType( + received: contentType, + options: [ + "application/json", + "application/x-plist", + "application/xml" + ] + ) + switch chosenContentType { + case "application/json": + body = try await converter.getResponseBodyAsJSON( + Components.Schemas.Device.self, + from: responseBody, + transforming: { value in + .json(value) + } + ) + case "application/x-plist": + body = try converter.getResponseBodyAsBinary( + OpenAPIRuntime.HTTPBody.self, + from: responseBody, + transforming: { value in + .application_x_hyphen_plist(value) + } + ) + case "application/xml": + body = try converter.getResponseBodyAsBinary( + OpenAPIRuntime.HTTPBody.self, + from: responseBody, + transforming: { value in + .xml(value) + } + ) + default: + preconditionFailure("bestContentType chose an invalid content type.") + } + return .ok(.init( + headers: headers, + body: body + )) + case 404: + let headers: Operations.getDevice.Output.NotFound.Headers = .init( + Access_hyphen_Control_hyphen_Allow_hyphen_Methods: try converter.getOptionalHeaderFieldAsURI( + in: response.headerFields, + name: "Access-Control-Allow-Methods", + as: Swift.String.self + ), + Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI( + in: response.headerFields, + name: "Access-Control-Allow-Origin", + as: Swift.String.self + ), + X_hyphen_Data_hyphen_Location: try converter.getOptionalHeaderFieldAsURI( + in: response.headerFields, + name: "X-Data-Location", + as: Swift.String.self + ) + ) + return .notFound(.init(headers: headers)) + default: + return .undocumented( + statusCode: response.status.code, + .init( + headerFields: response.headerFields, + body: responseBody + ) + ) + } + } + ) + } +} diff --git a/Sources/IPSWDownloads/Generated/Types.swift b/Sources/IPSWDownloads/Generated/Types.swift new file mode 100644 index 0000000..c842f81 --- /dev/null +++ b/Sources/IPSWDownloads/Generated/Types.swift @@ -0,0 +1,542 @@ +// Generated by swift-openapi-generator, do not modify. +@_spi(Generated) import OpenAPIRuntime +#if os(Linux) +@preconcurrency import struct Foundation.URL +@preconcurrency import struct Foundation.Data +@preconcurrency import struct Foundation.Date +#else +import struct Foundation.URL +import struct Foundation.Data +import struct Foundation.Date +#endif +/// A type that performs HTTP operations defined by the OpenAPI document. +internal protocol APIProtocol: Sendable { + /// Get Firmwares For Device + /// + /// GetFirmwaresForDevice returns Firmwares for a given Device. An optional "type" get parameter may be + /// specified to retrieve OTA Firmwares instead of normal IPSW files. + /// As of 2021-03-04, it is recommended that you use the "boards" property of the device, as devices can have multiple boards. + /// + /// - Remark: HTTP `GET /device/{identifier}`. + /// - Remark: Generated from `#/paths//device/{identifier}/get(getDevice)`. + func getDevice(_ input: Operations.getDevice.Input) async throws -> Operations.getDevice.Output +} + +/// Convenience overloads for operation inputs. +extension APIProtocol { + /// Get Firmwares For Device + /// + /// GetFirmwaresForDevice returns Firmwares for a given Device. An optional "type" get parameter may be + /// specified to retrieve OTA Firmwares instead of normal IPSW files. + /// As of 2021-03-04, it is recommended that you use the "boards" property of the device, as devices can have multiple boards. + /// + /// - Remark: HTTP `GET /device/{identifier}`. + /// - Remark: Generated from `#/paths//device/{identifier}/get(getDevice)`. + internal func getDevice( + path: Operations.getDevice.Input.Path, + query: Operations.getDevice.Input.Query, + headers: Operations.getDevice.Input.Headers = .init() + ) async throws -> Operations.getDevice.Output { + try await getDevice(Operations.getDevice.Input( + path: path, + query: query, + headers: headers + )) + } +} + +/// Server URLs defined in the OpenAPI document. +internal enum Servers { + internal static func server1() throws -> Foundation.URL { + try Foundation.URL( + validatingOpenAPIServerURL: "https://api.ipsw.me/v4", + variables: [] + ) + } +} + +/// Types generated from the components section of the OpenAPI document. +internal enum Components { + /// Types generated from the `#/components/schemas` section of the OpenAPI document. + internal enum Schemas { + /// - Remark: Generated from `#/components/schemas/Board`. + internal struct Board: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/Board/boardconfig`. + internal var boardconfig: Swift.String + /// - Remark: Generated from `#/components/schemas/Board/platform`. + internal var platform: Swift.String + /// - Remark: Generated from `#/components/schemas/Board/cpid`. + internal var cpid: Swift.Int + /// - Remark: Generated from `#/components/schemas/Board/bdid`. + internal var bdid: Swift.Int + /// Creates a new `Board`. + /// + /// - Parameters: + /// - boardconfig: + /// - platform: + /// - cpid: + /// - bdid: + internal init( + boardconfig: Swift.String, + platform: Swift.String, + cpid: Swift.Int, + bdid: Swift.Int + ) { + self.boardconfig = boardconfig + self.platform = platform + self.cpid = cpid + self.bdid = bdid + } + internal enum CodingKeys: String, CodingKey { + case boardconfig + case platform + case cpid + case bdid + } + } + /// - Remark: Generated from `#/components/schemas/Firmware`. + internal struct Firmware: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/Firmware/identifier`. + internal var identifier: Swift.String + /// - Remark: Generated from `#/components/schemas/Firmware/version`. + internal var version: Swift.String + /// - Remark: Generated from `#/components/schemas/Firmware/buildid`. + internal var buildid: Swift.String + /// - Remark: Generated from `#/components/schemas/Firmware/sha1sum`. + internal var sha1sum: Swift.String + /// - Remark: Generated from `#/components/schemas/Firmware/md5sum`. + internal var md5sum: Swift.String + /// - Remark: Generated from `#/components/schemas/Firmware/filesize`. + internal var filesize: Swift.Int + /// - Remark: Generated from `#/components/schemas/Firmware/url`. + internal var url: Swift.String + /// - Remark: Generated from `#/components/schemas/Firmware/releasedate`. + internal var releasedate: Foundation.Date + /// - Remark: Generated from `#/components/schemas/Firmware/uploaddate`. + internal var uploaddate: Foundation.Date + /// - Remark: Generated from `#/components/schemas/Firmware/signed`. + internal var signed: Swift.Bool + /// Creates a new `Firmware`. + /// + /// - Parameters: + /// - identifier: + /// - version: + /// - buildid: + /// - sha1sum: + /// - md5sum: + /// - filesize: + /// - url: + /// - releasedate: + /// - uploaddate: + /// - signed: + internal init( + identifier: Swift.String, + version: Swift.String, + buildid: Swift.String, + sha1sum: Swift.String, + md5sum: Swift.String, + filesize: Swift.Int, + url: Swift.String, + releasedate: Foundation.Date, + uploaddate: Foundation.Date, + signed: Swift.Bool + ) { + self.identifier = identifier + self.version = version + self.buildid = buildid + self.sha1sum = sha1sum + self.md5sum = md5sum + self.filesize = filesize + self.url = url + self.releasedate = releasedate + self.uploaddate = uploaddate + self.signed = signed + } + internal enum CodingKeys: String, CodingKey { + case identifier + case version + case buildid + case sha1sum + case md5sum + case filesize + case url + case releasedate + case uploaddate + case signed + } + } + /// - Remark: Generated from `#/components/schemas/Device`. + internal struct Device: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/Device/name`. + internal var name: Swift.String + /// - Remark: Generated from `#/components/schemas/Device/identifier`. + internal var identifier: Swift.String + /// - Remark: Generated from `#/components/schemas/Device/firmwares`. + internal var firmwares: [Components.Schemas.Firmware] + /// - Remark: Generated from `#/components/schemas/Device/boards`. + internal var boards: [Components.Schemas.Board] + /// - Remark: Generated from `#/components/schemas/Device/boardconfig`. + internal var boardconfig: Swift.String? + /// - Remark: Generated from `#/components/schemas/Device/platform`. + internal var platform: Swift.String? + /// - Remark: Generated from `#/components/schemas/Device/cpid`. + internal var cpid: Swift.Int? + /// - Remark: Generated from `#/components/schemas/Device/bdid`. + internal var bdid: Swift.Int? + /// Creates a new `Device`. + /// + /// - Parameters: + /// - name: + /// - identifier: + /// - firmwares: + /// - boards: + /// - boardconfig: + /// - platform: + /// - cpid: + /// - bdid: + internal init( + name: Swift.String, + identifier: Swift.String, + firmwares: [Components.Schemas.Firmware], + boards: [Components.Schemas.Board], + boardconfig: Swift.String? = nil, + platform: Swift.String? = nil, + cpid: Swift.Int? = nil, + bdid: Swift.Int? = nil + ) { + self.name = name + self.identifier = identifier + self.firmwares = firmwares + self.boards = boards + self.boardconfig = boardconfig + self.platform = platform + self.cpid = cpid + self.bdid = bdid + } + internal enum CodingKeys: String, CodingKey { + case name + case identifier + case firmwares + case boards + case boardconfig + case platform + case cpid + case bdid + } + } + } + /// Types generated from the `#/components/parameters` section of the OpenAPI document. + internal enum Parameters {} + /// Types generated from the `#/components/requestBodies` section of the OpenAPI document. + internal enum RequestBodies {} + /// Types generated from the `#/components/responses` section of the OpenAPI document. + internal enum Responses {} + /// Types generated from the `#/components/headers` section of the OpenAPI document. + internal enum Headers {} +} + +/// API operations, with input and output types, generated from `#/paths` in the OpenAPI document. +internal enum Operations { + /// Get Firmwares For Device + /// + /// GetFirmwaresForDevice returns Firmwares for a given Device. An optional "type" get parameter may be + /// specified to retrieve OTA Firmwares instead of normal IPSW files. + /// As of 2021-03-04, it is recommended that you use the "boards" property of the device, as devices can have multiple boards. + /// + /// - Remark: HTTP `GET /device/{identifier}`. + /// - Remark: Generated from `#/paths//device/{identifier}/get(getDevice)`. + internal enum getDevice { + internal static let id: Swift.String = "getDevice" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/device/{identifier}/GET/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/device/{identifier}/GET/path/identifier`. + internal var identifier: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - identifier: + internal init(identifier: Swift.String) { + self.identifier = identifier + } + } + internal var path: Operations.getDevice.Input.Path + /// - Remark: Generated from `#/paths/device/{identifier}/GET/query`. + internal struct Query: Sendable, Hashable { + /// - Remark: Generated from `#/paths/device/{identifier}/GET/query/type`. + internal var _type: Swift.String + /// Creates a new `Query`. + /// + /// - Parameters: + /// - _type: + internal init(_type: Swift.String) { + self._type = _type + } + } + internal var query: Operations.getDevice.Input.Query + /// - Remark: Generated from `#/paths/device/{identifier}/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.getDevice.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + internal init( + path: Operations.getDevice.Input.Path, + query: Operations.getDevice.Input.Query, + headers: Operations.getDevice.Input.Headers = .init() + ) { + self.path = path + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/device/{identifier}/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/device/{identifier}/GET/responses/200/headers/Access-Control-Allow-Methods`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Methods: Swift.String? + /// - Remark: Generated from `#/paths/device/{identifier}/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// - Remark: Generated from `#/paths/device/{identifier}/GET/responses/200/headers/Cache-Control`. + internal var Cache_hyphen_Control: Swift.String? + /// - Remark: Generated from `#/paths/device/{identifier}/GET/responses/200/headers/Expires`. + internal var Expires: Swift.String? + /// - Remark: Generated from `#/paths/device/{identifier}/GET/responses/200/headers/X-Data-Location`. + internal var X_hyphen_Data_hyphen_Location: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Methods: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + /// - Cache_hyphen_Control: + /// - Expires: + /// - X_hyphen_Data_hyphen_Location: + internal init( + Access_hyphen_Control_hyphen_Allow_hyphen_Methods: Swift.String? = nil, + Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil, + Cache_hyphen_Control: Swift.String? = nil, + Expires: Swift.String? = nil, + X_hyphen_Data_hyphen_Location: Swift.String? = nil + ) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Methods = Access_hyphen_Control_hyphen_Allow_hyphen_Methods + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + self.Cache_hyphen_Control = Cache_hyphen_Control + self.Expires = Expires + self.X_hyphen_Data_hyphen_Location = X_hyphen_Data_hyphen_Location + } + } + /// Received HTTP response headers + internal var headers: Operations.getDevice.Output.Ok.Headers + /// - Remark: Generated from `#/paths/device/{identifier}/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/device/{identifier}/GET/responses/200/content/application\/json`. + case json(Components.Schemas.Device) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Device { + get throws { + switch self { + case let .json(body): + return body + default: + try throwUnexpectedResponseBody( + expectedContent: "application/json", + body: self + ) + } + } + } + /// - Remark: Generated from `#/paths/device/{identifier}/GET/responses/200/content/application\/x-plist`. + case application_x_hyphen_plist(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_plist`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_plist`. + /// - SeeAlso: `.application_x_hyphen_plist`. + internal var application_x_hyphen_plist: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_plist(body): + return body + default: + try throwUnexpectedResponseBody( + expectedContent: "application/x-plist", + body: self + ) + } + } + } + /// - Remark: Generated from `#/paths/device/{identifier}/GET/responses/200/content/application\/xml`. + case xml(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.xml`. + /// + /// - Throws: An error if `self` is not `.xml`. + /// - SeeAlso: `.xml`. + internal var xml: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .xml(body): + return body + default: + try throwUnexpectedResponseBody( + expectedContent: "application/xml", + body: self + ) + } + } + } + } + /// Received HTTP response body + internal var body: Operations.getDevice.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.getDevice.Output.Ok.Headers = .init(), + body: Operations.getDevice.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// OK + /// + /// - Remark: Generated from `#/paths//device/{identifier}/get(getDevice)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.getDevice.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.getDevice.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct NotFound: Sendable, Hashable { + /// - Remark: Generated from `#/paths/device/{identifier}/GET/responses/404/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/device/{identifier}/GET/responses/404/headers/Access-Control-Allow-Methods`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Methods: Swift.String? + /// - Remark: Generated from `#/paths/device/{identifier}/GET/responses/404/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// - Remark: Generated from `#/paths/device/{identifier}/GET/responses/404/headers/X-Data-Location`. + internal var X_hyphen_Data_hyphen_Location: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Methods: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + /// - X_hyphen_Data_hyphen_Location: + internal init( + Access_hyphen_Control_hyphen_Allow_hyphen_Methods: Swift.String? = nil, + Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil, + X_hyphen_Data_hyphen_Location: Swift.String? = nil + ) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Methods = Access_hyphen_Control_hyphen_Allow_hyphen_Methods + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + self.X_hyphen_Data_hyphen_Location = X_hyphen_Data_hyphen_Location + } + } + /// Received HTTP response headers + internal var headers: Operations.getDevice.Output.NotFound.Headers + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + internal init(headers: Operations.getDevice.Output.NotFound.Headers = .init()) { + self.headers = headers + } + } + /// Not Found + /// + /// - Remark: Generated from `#/paths//device/{identifier}/get(getDevice)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.getDevice.Output.NotFound) + /// The associated value of the enum case if `self` is `.notFound`. + /// + /// - Throws: An error if `self` is not `.notFound`. + /// - SeeAlso: `.notFound`. + internal var notFound: Operations.getDevice.Output.NotFound { + get throws { + switch self { + case let .notFound(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "notFound", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case application_x_hyphen_plist + case xml + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + case "application/x-plist": + self = .application_x_hyphen_plist + case "application/xml": + self = .xml + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + case .application_x_hyphen_plist: + return "application/x-plist" + case .xml: + return "application/xml" + } + } + internal static var allCases: [Self] { + [ + .json, + .application_x_hyphen_plist, + .xml + ] + } + } + } +} diff --git a/Sources/IPSWDownloads/IPSWDownloads.swift b/Sources/IPSWDownloads/IPSWDownloads.swift new file mode 100644 index 0000000..532cc67 --- /dev/null +++ b/Sources/IPSWDownloads/IPSWDownloads.swift @@ -0,0 +1,58 @@ +// +// File.swift +// +// +// Created by Leo Dion on 1/11/24. +// +import Foundation +import OpenAPIRuntime + +/// Client for downloading current and previous versions +/// of Apple's iOS Firmware, iTunes and OTA updates. +public struct IPSWDownloads { + // swiftlint:disable:next force_try + private static let serverURL = try! Servers.server1() + + /// The underlying generated client to make HTTP requests to IPSWDownloads. + private let underlyingClient: any APIProtocol + + /// An internal initializer used by other initializers and by tests. + /// - Parameter underlyingClient: The client to use to make HTTP requests. + private init(underlyingClient: any APIProtocol) { + self.underlyingClient = underlyingClient + } + + /// Creates a new client for IPSWDownloads. + /// + /// - Parameters: + /// - transport: Client transport for connecting to the server. + /// - serverURL: Optional server url otherwise the default url is used. + public init( + transport: any ClientTransport, + serverURL: URL? = nil + ) { + self.init( + underlyingClient: Client( + serverURL: serverURL ?? Self.serverURL, + transport: transport + ) + ) + } + + /// Returns Firmwares for a given Device. + /// - Parameters: + /// - identifier: Device Identifier + /// - type: Specifies the type of Firmware files + /// - Returns: Device object containing the list of firmware object. + public func device( + withIdentifier identifier: String, + type: FirmwareType + ) async throws -> Device { + let input = Operations.getDevice.Input( + path: .init(identifier: identifier), + query: .init(_type: type.rawValue) + ) + let device = try await underlyingClient.getDevice(input).ok.body.json + return try Device(component: device) + } +} diff --git a/Sources/IPSWDownloads/OperatingSystemVersion.swift b/Sources/IPSWDownloads/OperatingSystemVersion.swift new file mode 100644 index 0000000..81a1d06 --- /dev/null +++ b/Sources/IPSWDownloads/OperatingSystemVersion.swift @@ -0,0 +1,17 @@ +import Foundation + +extension OperatingSystemVersion { + internal init(string: String) throws { + let components = string.components(separatedBy: ".").compactMap(Int.init) + + guard components.count == 2 || components.count == 3 else { + throw RuntimeError.invalidVersion(string) + } + + self.init( + majorVersion: components[0], + minorVersion: components[1], + patchVersion: components.count == 3 ? components[2] : 0 + ) + } +} diff --git a/Sources/IPSWDownloads/RuntimeError.swift b/Sources/IPSWDownloads/RuntimeError.swift new file mode 100644 index 0000000..33b8372 --- /dev/null +++ b/Sources/IPSWDownloads/RuntimeError.swift @@ -0,0 +1,12 @@ +// +// File.swift +// +// +// Created by Leo Dion on 1/11/24. +// +import Foundation + +internal enum RuntimeError: Error { + case invalidURL(String) + case invalidVersion(String) +} diff --git a/Sources/IPSWDownloads/URL.swift b/Sources/IPSWDownloads/URL.swift new file mode 100644 index 0000000..855ef01 --- /dev/null +++ b/Sources/IPSWDownloads/URL.swift @@ -0,0 +1,17 @@ +// +// File.swift +// +// +// Created by Leo Dion on 1/11/24. +// +import Foundation + +extension URL { + /// Returns a validated server URL, or throws an error. + /// - Parameter string: A URL string. + /// - Throws: If the provided string doesn't convert to URL. + public init(validatingURL string: String) throws { + guard let url = Self(string: string) else { throw RuntimeError.invalidURL(string) } + self = url + } +} diff --git a/Tests/IPSWDownloadsTests/IPSWDownloadsTest.swift b/Tests/IPSWDownloadsTests/IPSWDownloadsTest.swift new file mode 100644 index 0000000..d8da57e --- /dev/null +++ b/Tests/IPSWDownloadsTests/IPSWDownloadsTest.swift @@ -0,0 +1,19 @@ +import IPSWDownloads +import OpenAPIURLSession +import XCTest + +final class IPSWDownloadsTest: XCTestCase { + var client: IPSWDownloads! + + override func setUp() { + assert(client == nil) + client = IPSWDownloads(transport: URLSessionTransport()) + } + + func testExample() async throws { + let device = try await client.device(withIdentifier: "VirtualMac2,1", type: .ipsw) + XCTAssertEqual(device.identifier, "VirtualMac2,1") + XCTAssertGreaterThan(device.firmwares.count, 10) + XCTAssertNotNil(device.firmwares.first) + } +} diff --git a/Tests/IPSWDownloadsTests/OperatingSystemVersionTest.swift b/Tests/IPSWDownloadsTests/OperatingSystemVersionTest.swift new file mode 100644 index 0000000..031017b --- /dev/null +++ b/Tests/IPSWDownloadsTests/OperatingSystemVersionTest.swift @@ -0,0 +1,62 @@ +@testable import IPSWDownloads +import XCTest + +extension OperatingSystemVersion: Equatable { + public static func == (lhs: OperatingSystemVersion, rhs: OperatingSystemVersion) -> Bool { + lhs.majorVersion == rhs.majorVersion && + lhs.minorVersion == rhs.minorVersion && + lhs.patchVersion == rhs.patchVersion + } + + static func random() -> OperatingSystemVersion { + .init( + majorVersion: .random(in: 1 ... 25), + minorVersion: .random(in: 0 ... 25), + patchVersion: Bool.random() ? .random(in: 1 ... 25) : 0 + ) + } + + func string(trimZeroPatch: Bool) -> String { + let values: [Int?] = [ + majorVersion, + minorVersion, + (!trimZeroPatch || patchVersion > 0) ? patchVersion : nil + ] + return values.compactMap { + $0?.description + }.joined(separator: ".") + } + + func parsed(trimZeroPatch: Bool) throws -> OperatingSystemVersion { + try .init(string: string(trimZeroPatch: trimZeroPatch)) + } +} + +public class OperatingSystemVersionTests: XCTestCase { + func testInitStringValid() throws { + let validCount = Int.random(in: 20 ... 50) + let values: [OperatingSystemVersion] = (0 ..< validCount).map { _ in + .random() + } + for value in values { + try XCTAssertEqual(value, value.parsed(trimZeroPatch: false)) + try XCTAssertEqual(value, value.parsed(trimZeroPatch: true)) + } + } + + func testInitStringInvalid() throws { + let validCount = Int.random(in: 20 ... 50) + let strings: [String] = (0 ..< validCount).map { _ in + UUID().uuidString + } + for string in strings { + var actual: String? + do { + _ = try OperatingSystemVersion(string: string) + } catch let RuntimeError.invalidVersion(value) { + actual = value + } + XCTAssertEqual(string, actual) + } + } +} diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 0000000..abe856b --- /dev/null +++ b/codecov.yml @@ -0,0 +1,3 @@ +ignore: + - "Tests/**/*" + - "Sources/**/Generated/*" diff --git a/openapi-generator-config.yaml b/openapi-generator-config.yaml new file mode 100644 index 0000000..baa0f6f --- /dev/null +++ b/openapi-generator-config.yaml @@ -0,0 +1,7 @@ +generate: + - types + - client +accessModifier: internal +filter: + operations: + - getDevice diff --git a/openapi.yaml b/openapi.yaml new file mode 100644 index 0000000..1e67562 --- /dev/null +++ b/openapi.yaml @@ -0,0 +1,5806 @@ +openapi: 3.0.3 +info: + title: IPSW Downloads API + version: 1.0.0 + description: >- + Download current and previous versions of Apple's iOS Firmware, iTunes and + OTA updates. +servers: + - url: https://api.ipsw.me/v4 +paths: + /device/{identifier}: + get: + responses: + '200': + description: OK + headers: + Access-Control-Allow-Methods: + schema: + type: string + Access-Control-Allow-Origin: + schema: + type: string + Cache-Control: + schema: + type: string + Expires: + schema: + type: string + X-Data-Location: + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/Device' + examples: + example1: + value: + name: iPhone 6s + identifier: iPhone8,1 + firmwares: + - identifier: iPhone8,1 + version: 13.1.3 + buildid: 17A878 + sha1sum: 96be7a8e55ec4bd1867bd1d7f18b1f24f8731838 + md5sum: e7f95f23dd0d8f406b2ef95d4b63bc5c + filesize: 3652675161 + url: >- + http://updates-http.cdn-apple.com/2019FallFCS/fullrestores/061-30582/2A093596-EB7A-11E9-9505-C810329334FA/iPhone_4.7_13.1.3_17A878_Restore.ipsw + releasedate: '2019-10-15T17:00:31Z' + uploaddate: '2019-10-10T17:31:00Z' + signed: true + - identifier: iPhone8,1 + version: 13.1.2 + buildid: 17A860 + sha1sum: a90465c172cd77bcb5bf112993c8ee7caba632d1 + md5sum: 5c247ad50b0bd470ea976c742bc42240 + filesize: 3654014311 + url: >- + http://updates-http.cdn-apple.com/2019FallFCS/fullrestores/061-22597/37272F4C-E18B-11E9-9F72-B96496A9EC6E/iPhone_4.7_13.1.2_17A860_Restore.ipsw + releasedate: '2019-09-30T17:11:19Z' + uploaddate: '2019-09-28T01:09:45Z' + signed: true + - identifier: iPhone8,1 + version: 13.1.1 + buildid: 17A854 + sha1sum: 6fd3eaa23d13d26f8174c353d92b55c0ecc1698b + md5sum: a902e7dae4d9f15fe9d1a1a317a04740 + filesize: 3651115452 + url: >- + http://updates-http.cdn-apple.com/2019FallFCS/fullrestores/061-18421/E8F8D60E-DED8-11E9-A685-B200DC34986D/iPhone_4.7_13.1.1_17A854_Restore.ipsw + releasedate: '2019-09-27T16:58:00Z' + uploaddate: '2019-09-24T14:51:54Z' + signed: false + - identifier: iPhone8,1 + version: '13.1' + buildid: 17A844 + sha1sum: 3421b3825922e4f3d32e890a75b8ad3ba69a69f2 + md5sum: a8cc4f157d799b1776028c7ce305ddf2 + filesize: 3652404986 + url: >- + http://updates-http.cdn-apple.com/2019FallFCS/fullrestores/091-99496/DCDE77CC-D986-11E9-AC76-A120DCDBD6A3/iPhone_4.7_13.1_17A844_Restore.ipsw + releasedate: '2019-09-24T17:03:38Z' + uploaddate: '2019-09-17T20:21:50Z' + signed: false + boards: + - boardconfig: N71AP + platform: s8000 + cpid: 32768 + bdid: 4 + - boardconfig: N71mAP + platform: s8003 + cpid: 32771 + bdid: 4 + boardconfig: N71AP + platform: s8000 + cpid: 32768 + bdid: 4 + example2: + value: + name: iPhone 6+ + identifier: iPhone7,1 + firmwares: + - identifier: iPhone7,1 + version: 12.4.2 + buildid: 16G114 + sha1sum: 58a91fa4d73077133772e464f761c96ad91df683 + md5sum: 10d9aeb0d87a04a40417be05c0b19a44 + filesize: 3328746693 + url: >- + http://updates-http.cdn-apple.com/2019SummerFCS/fullrestores/061-20538/FD3DCDB6-DC8C-11E9-ABB0-278C66A83945/iPhone_5.5_12.4.2_16G114_Restore.ipsw + releasedate: '2019-09-26T17:04:56Z' + uploaddate: '2019-09-21T16:42:04Z' + signed: true + - identifier: iPhone7,1 + version: 12.4.1 + buildid: 16G102 + sha1sum: 671863b1a34cb4d8abc44919679c645f0500486d + md5sum: 8a374df4132aedddd0207c8978080b35 + filesize: 3345837529 + url: >- + http://updates-http.cdn-apple.com/2019SummerFCS/fullrestores/061-05190/A449778A-C4E7-11E9-BE68-18610AD8B7A1/iPhone_5.5_12.4.1_16G102_Restore.ipsw + releasedate: '2019-08-26T18:30:09Z' + uploaddate: '2019-08-22T14:27:57Z' + signed: false + - identifier: iPhone7,1 + version: '12.4' + buildid: 16G77 + sha1sum: e435aa95763167106707e5d6534a4dcb66408f18 + md5sum: 75279e6f2f850ba825addfe590afb8ba + filesize: 3345389368 + url: >- + http://updates-http.cdn-apple.com/2019SummerFCS/fullrestores/041-86579/9E26E61A-A743-11E9-87D6-F185B65480B0/iPhone_5.5_12.4_16G77_Restore.ipsw + releasedate: '2019-07-22T17:08:32Z' + uploaddate: '2019-07-15T21:08:52Z' + signed: false + - identifier: iPhone7,1 + version: 12.3.1 + buildid: 16F203 + sha1sum: a168b1bc901fb64cf725ab0dcca183dd684770dc + md5sum: 84a83ab5e05e2560fd6b08d6c014cd82 + filesize: 3339505439 + url: >- + http://updates-http.cdn-apple.com/2019SpringFCS/fullrestores/041-68573/CC468F46-7C96-11E9-80BA-4EF06256CCDB/iPhone_5.5_12.3.1_16F203_Restore.ipsw + releasedate: '2019-05-24T17:02:33Z' + uploaddate: '2019-05-22T13:57:50Z' + signed: false + boards: + - boardconfig: N56AP + platform: t7000 + cpid: 28672 + bdid: 4 + boardconfig: N56AP + platform: t7000 + cpid: 28672 + bdid: 4 + example3: + value: + name: iPhone 3G + identifier: iPhone1,2 + firmwares: + - identifier: iPhone1,2 + version: 4.2.1 + buildid: 8C148 + sha1sum: d2ed58586e8ca2153f2e2ec585bba8afc5173378 + md5sum: 8b1657935408a1638b69740b282f62b3 + filesize: 338579762 + url: >- + http://appldnld.apple.com/iPhone4/061-9853.20101122.Vfgt5/iPhone1,2_4.2.1_8C148_Restore.ipsw + releasedate: null + uploaddate: '2010-11-18T17:30:48Z' + signed: true + - identifier: iPhone1,2 + version: '4.1' + buildid: 8B117 + sha1sum: d87bab469dd1146ab83ddcc23f03b3164d7e09d4 + md5sum: 8cc589baad3c80dd8324c37d7dc00750 + filesize: 323137556 + url: >- + http://appldnld.apple.com/iPhone4/061-7932.20100908.3fgt5/iPhone1,2_4.1_8B117_Restore.ipsw + releasedate: null + uploaddate: '2010-09-03T14:12:24Z' + signed: true + - identifier: iPhone1,2 + version: 4.0.2 + buildid: 8A400 + sha1sum: ee2bc74719170a7a2440b593b6f300727c930c69 + md5sum: 6f3aefe1f8f516ae6e91fe993749347a + filesize: 320216794 + url: >- + http://appldnld.apple.com/iPhone4/061-8802.20100811.XcfpR/iPhone1,2_4.0.2_8A400_Restore.ipsw + releasedate: null + uploaddate: '2010-08-09T19:52:20Z' + signed: true + - identifier: iPhone1,2 + version: 4.0.1 + buildid: 8A306 + sha1sum: 940bd2b36c646f6673419eab661ac1f13248e592 + md5sum: 8a952dbd03fa5e85da1a31092c651a25 + filesize: 320237975 + url: >- + http://appldnld.apple.com/iPhone4/061-8616.20100715.phnt4/iPhone1,2_4.0.1_8A306_Restore.ipsw + releasedate: null + uploaddate: '2010-07-13T20:13:59Z' + signed: true + boards: + - boardconfig: n82ap + platform: s5l8900x + cpid: 35072 + bdid: 4 + boardconfig: n82ap + platform: s5l8900x + cpid: 35072 + bdid: 4 + example4: + value: + name: iPod touch 1G + identifier: iPod1,1 + firmwares: + - identifier: iPod1,1 + version: 1.1.5 + buildid: 4B1 + sha1sum: 1b818911316e4248ee01d3ec67f9d39afc3db240 + md5sum: 80b46fe8db7cfe58bb67e8553f495a8d + filesize: 173519637 + url: >- + http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPod/SBML/osx/bundles/061-4841.20080714.bgy8O/iPod1,1_1.1.5_4B1_Restore.ipsw + releasedate: null + uploaddate: '2008-07-14T21:39:28Z' + signed: false + - identifier: iPod1,1 + version: 1.1.4 + buildid: 4A102 + sha1sum: c148d1eb1c979bb6434175411d4a372103a4fdd2 + md5sum: 0ed3435b4ead9aa5606ca0af66eedd90 + filesize: 173519589 + url: >- + http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPod/SBML/osx/bundles/061-4312.20080226.Btu45/iPod1,1_1.1.4_4A102_Restore.ipsw + releasedate: null + uploaddate: '2008-02-22T23:28:42Z' + signed: false + - identifier: iPod1,1 + version: 1.1.3 + buildid: 4A93 + sha1sum: 8dca23eec69d5ae58fbf3d4a23276e46cbb2e3c6 + md5sum: 12d996c376d378c1333b0343ddad6cb0 + filesize: 173511411 + url: >- + http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPod/SBML/osx/061-4060.20080115.9Iuh5/iPod1,1_1.1.3_4A93_Restore.ipsw + releasedate: null + uploaddate: '2008-01-10T04:03:18Z' + signed: false + - identifier: iPod1,1 + version: 1.1.2 + buildid: 3B48b + sha1sum: 108d8ffe9ea75e61cd5e57170ad388b7fa00d923 + md5sum: a7469c40e204a607becabaca841b718f + filesize: 165567897 + url: >- + http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPod/SBML/osx/bundles/061-4036.20071107.9g3DF/iPod1,1_1.1.2_3B48b_Restore.ipsw + releasedate: null + uploaddate: '2007-11-07T20:25:19Z' + signed: false + boards: + - boardconfig: n45ap + platform: s5l8900x + cpid: 35072 + bdid: 2 + boardconfig: n45ap + platform: s5l8900x + cpid: 35072 + bdid: 2 + example5: + value: + name: Apple TV 2G + identifier: AppleTV2,1 + firmwares: + - identifier: AppleTV2,1 + version: 7.1.2 + buildid: 11D258 + sha1sum: 4724347f2700dfe82fb864ecc8cdf66ea33262b1 + md5sum: 6677e7611ebed25d8dc33d2401b75de2 + filesize: 698547170 + url: >- + http://appldnld.apple.com/iOS8/031-07202.20140917.tF6Fs/AppleTV2,1_6.2.1_11D258_Restore.ipsw + releasedate: '2014-09-17T17:59:02Z' + uploaddate: '2014-09-03T17:55:56Z' + signed: true + - identifier: AppleTV2,1 + version: 7.1.2 + buildid: 11D257c + sha1sum: a772321de7a4e4b5fa710ec3660d4a640c04ead8 + md5sum: 2b5ad301db18658c06ba12841c250f4d + filesize: 698406382 + url: >- + http://appldnld.apple.com/iOS7.1/031-04317.20140630.2qAFy/AppleTV2,1_6.2_11D257c_Restore.ipsw + releasedate: '2014-06-30T18:28:53Z' + uploaddate: '2014-06-27T22:43:09Z' + signed: false + - identifier: AppleTV2,1 + version: 7.1.1 + buildid: 11D201c + sha1sum: 500dcc8878d0ef51b57f7c8260076d3970235d5a + md5sum: 1b8d3e39e1523aeee697c0be90236e9f + filesize: 698303443 + url: >- + http://appldnld.apple.com/iOS7.1/031-01311.20140422.EaugX/AppleTV2,1_6.1.1_11D201c_Restore.ipsw + releasedate: '2014-04-22T17:46:02Z' + uploaddate: '2014-04-16T23:38:39Z' + signed: false + - identifier: AppleTV2,1 + version: '7.1' + buildid: 11D169b + sha1sum: db425818155c27df710547329c6bcdd3a7f78c1e + md5sum: 8107d3d44f22c234ccf15c976c8f0331 + filesize: 698244610 + url: >- + http://appldnld.apple.com/iOS7.1/031-4478.20140310.XDdib/AppleTV2,1_6.1_11D169b_Restore.ipsw + releasedate: '2014-03-10T17:57:25Z' + uploaddate: '2014-03-06T20:49:52Z' + signed: false + boards: + - boardconfig: k66ap + platform: s5l8930x + cpid: 35120 + bdid: 16 + boardconfig: k66ap + platform: s5l8930x + cpid: 35120 + bdid: 16 + example6: + value: + name: iPhone 5 (GSM) + identifier: iPhone5,1 + firmwares: + - identifier: iPhone5,1 + buildid: 14G61 + version: 10.3.4 + url: >- + http://updates-http.cdn-apple.com/2019/ios/091-24443-20190722-9357424A-9931-11E9-BCE8-56D0A77C2E40/com_apple_MobileAsset_SoftwareUpdate/fb90f2903f57aceabaf43bdc5aa99364faa8593e.zip + filesize: 66410207 + prerequisitebuildid: 14F89 + prerequisiteversion: 10.3.2 + releasetype: '' + uploaddate: '2019-06-27T23:34:39Z' + releasedate: '2019-07-22T17:07:55Z' + marketingversion: '' + signed: true + - identifier: iPhone5,1 + buildid: 14G61 + version: 10.3.4 + url: >- + http://updates-http.cdn-apple.com/2019/ios/091-24423-20190722-9357424A-9931-11E9-BCE8-53D0A77C2E40/com_apple_MobileAsset_SoftwareUpdate/1bc7b173cae90361d7820409ecc2fa5d5427144a.zip + filesize: 48460066 + prerequisitebuildid: 14G57 + prerequisiteversion: 10.3.3 + releasetype: '' + uploaddate: '2019-06-27T23:34:34Z' + releasedate: '2019-07-22T17:07:56Z' + marketingversion: '' + signed: true + - identifier: iPhone5,1 + buildid: 14G61 + version: 10.3.4 + url: >- + http://updates-http.cdn-apple.com/2019/ios/091-24531-20190722-93574B96-9931-11E9-B99A-5FD0A77C2E40/com_apple_MobileAsset_SoftwareUpdate/510f3fd40401a3fb35b1a22fa160f9a29730ec0c.zip + filesize: 36390797 + prerequisitebuildid: 14G60 + prerequisiteversion: 10.3.3 + releasetype: '' + uploaddate: '2019-06-27T23:34:27Z' + releasedate: '2019-07-22T17:07:56Z' + marketingversion: '' + signed: true + - identifier: iPhone5,1 + buildid: 14G61 + version: 10.3.4 + url: >- + http://updates-http.cdn-apple.com/2019/ios/091-24126-20190722-93574042-9931-11E9-BCE8-43D0A77C2E40/com_apple_MobileAsset_SoftwareUpdate/716406ffa26c805728d3078b56129ac07fc6516c.zip + filesize: 143957900 + prerequisitebuildid: '14E304' + prerequisiteversion: 10.3.1 + releasetype: '' + uploaddate: '2019-06-27T23:34:27Z' + releasedate: '2019-07-22T17:07:55Z' + marketingversion: '' + signed: true + boards: + - boardconfig: N41AP + platform: s5l8950x + cpid: 35152 + bdid: 0 + boardconfig: N41AP + platform: s5l8950x + cpid: 35152 + bdid: 0 + application/x-plist: + examples: + example1: + value: > + + + + + + + BDID + 4 + BoardConfig + N71AP + Boards + + + BDID + 4 + BoardConfig + N71AP + CPID + 32768 + Platform + s8000 + + + BDID + 4 + BoardConfig + N71mAP + CPID + 32771 + Platform + s8003 + + + CPID + 32768 + Firmwares + + + BuildID + 17A878 + Filesize + 3652675161 + Identifier + iPhone8,1 + MD5sum + e7f95f23dd0d8f406b2ef95d4b63bc5c + ReleaseDate + 2019-10-15T17:00:31Z + SHA1sum + 96be7a8e55ec4bd1867bd1d7f18b1f24f8731838 + Signed + + URL + http://updates-http.cdn-apple.com/2019FallFCS/fullrestores/061-30582/2A093596-EB7A-11E9-9505-C810329334FA/iPhone_4.7_13.1.3_17A878_Restore.ipsw + UploadDate + 2019-10-10T17:31:00Z + Version + 13.1.3 + + + BuildID + 17A860 + Filesize + 3654014311 + Identifier + iPhone8,1 + MD5sum + 5c247ad50b0bd470ea976c742bc42240 + ReleaseDate + 2019-09-30T17:11:19Z + SHA1sum + a90465c172cd77bcb5bf112993c8ee7caba632d1 + Signed + + URL + http://updates-http.cdn-apple.com/2019FallFCS/fullrestores/061-22597/37272F4C-E18B-11E9-9F72-B96496A9EC6E/iPhone_4.7_13.1.2_17A860_Restore.ipsw + UploadDate + 2019-09-28T01:09:45Z + Version + 13.1.2 + + + BuildID + 17A854 + Filesize + 3651115452 + Identifier + iPhone8,1 + MD5sum + a902e7dae4d9f15fe9d1a1a317a04740 + ReleaseDate + 2019-09-27T16:58:00Z + SHA1sum + 6fd3eaa23d13d26f8174c353d92b55c0ecc1698b + Signed + + URL + http://updates-http.cdn-apple.com/2019FallFCS/fullrestores/061-18421/E8F8D60E-DED8-11E9-A685-B200DC34986D/iPhone_4.7_13.1.1_17A854_Restore.ipsw + UploadDate + 2019-09-24T14:51:54Z + Version + 13.1.1 + + + BuildID + 17A844 + Filesize + 3652404986 + Identifier + iPhone8,1 + MD5sum + a8cc4f157d799b1776028c7ce305ddf2 + ReleaseDate + 2019-09-24T17:03:38Z + SHA1sum + 3421b3825922e4f3d32e890a75b8ad3ba69a69f2 + Signed + + URL + http://updates-http.cdn-apple.com/2019FallFCS/fullrestores/091-99496/DCDE77CC-D986-11E9-AC76-A120DCDBD6A3/iPhone_4.7_13.1_17A844_Restore.ipsw + UploadDate + 2019-09-17T20:21:50Z + Version + 13.1 + + + Identifier + iPhone8,1 + Name + iPhone 6s + Platform + s8000 + + + example2: + value: > + + + + + + + BDID + 4 + BoardConfig + N56AP + Boards + + + BDID + 4 + BoardConfig + N56AP + CPID + 28672 + Platform + t7000 + + + CPID + 28672 + Firmwares + + + BuildID + 16G114 + Filesize + 3328746693 + Identifier + iPhone7,1 + MD5sum + 10d9aeb0d87a04a40417be05c0b19a44 + ReleaseDate + 2019-09-26T17:04:56Z + SHA1sum + 58a91fa4d73077133772e464f761c96ad91df683 + Signed + + URL + http://updates-http.cdn-apple.com/2019SummerFCS/fullrestores/061-20538/FD3DCDB6-DC8C-11E9-ABB0-278C66A83945/iPhone_5.5_12.4.2_16G114_Restore.ipsw + UploadDate + 2019-09-21T16:42:04Z + Version + 12.4.2 + + + BuildID + 16G102 + Filesize + 3345837529 + Identifier + iPhone7,1 + MD5sum + 8a374df4132aedddd0207c8978080b35 + ReleaseDate + 2019-08-26T18:30:09Z + SHA1sum + 671863b1a34cb4d8abc44919679c645f0500486d + Signed + + URL + http://updates-http.cdn-apple.com/2019SummerFCS/fullrestores/061-05190/A449778A-C4E7-11E9-BE68-18610AD8B7A1/iPhone_5.5_12.4.1_16G102_Restore.ipsw + UploadDate + 2019-08-22T14:27:57Z + Version + 12.4.1 + + + BuildID + 16G77 + Filesize + 3345389368 + Identifier + iPhone7,1 + MD5sum + 75279e6f2f850ba825addfe590afb8ba + ReleaseDate + 2019-07-22T17:08:32Z + SHA1sum + e435aa95763167106707e5d6534a4dcb66408f18 + Signed + + URL + http://updates-http.cdn-apple.com/2019SummerFCS/fullrestores/041-86579/9E26E61A-A743-11E9-87D6-F185B65480B0/iPhone_5.5_12.4_16G77_Restore.ipsw + UploadDate + 2019-07-15T21:08:52Z + Version + 12.4 + + + BuildID + 16F203 + Filesize + 3339505439 + Identifier + iPhone7,1 + MD5sum + 84a83ab5e05e2560fd6b08d6c014cd82 + ReleaseDate + 2019-05-24T17:02:33Z + SHA1sum + a168b1bc901fb64cf725ab0dcca183dd684770dc + Signed + + URL + http://updates-http.cdn-apple.com/2019SpringFCS/fullrestores/041-68573/CC468F46-7C96-11E9-80BA-4EF06256CCDB/iPhone_5.5_12.3.1_16F203_Restore.ipsw + UploadDate + 2019-05-22T13:57:50Z + Version + 12.3.1 + + + Identifier + iPhone7,1 + Name + iPhone 6+ + Platform + t7000 + + + example3: + value: > + + + + + + + BDID + 4 + BoardConfig + n82ap + Boards + + + BDID + 4 + BoardConfig + n82ap + CPID + 35072 + Platform + s5l8900x + + + CPID + 35072 + Firmwares + + + BuildID + 8C148 + Filesize + 338579762 + Identifier + iPhone1,2 + MD5sum + 8b1657935408a1638b69740b282f62b3 + ReleaseDate + null + SHA1sum + d2ed58586e8ca2153f2e2ec585bba8afc5173378 + Signed + + URL + http://appldnld.apple.com/iPhone4/061-9853.20101122.Vfgt5/iPhone1,2_4.2.1_8C148_Restore.ipsw + UploadDate + 2010-11-18T17:30:48Z + Version + 4.2.1 + + + BuildID + 8B117 + Filesize + 323137556 + Identifier + iPhone1,2 + MD5sum + 8cc589baad3c80dd8324c37d7dc00750 + ReleaseDate + null + SHA1sum + d87bab469dd1146ab83ddcc23f03b3164d7e09d4 + Signed + + URL + http://appldnld.apple.com/iPhone4/061-7932.20100908.3fgt5/iPhone1,2_4.1_8B117_Restore.ipsw + UploadDate + 2010-09-03T14:12:24Z + Version + 4.1 + + + BuildID + 8A400 + Filesize + 320216794 + Identifier + iPhone1,2 + MD5sum + 6f3aefe1f8f516ae6e91fe993749347a + ReleaseDate + null + SHA1sum + ee2bc74719170a7a2440b593b6f300727c930c69 + Signed + + URL + http://appldnld.apple.com/iPhone4/061-8802.20100811.XcfpR/iPhone1,2_4.0.2_8A400_Restore.ipsw + UploadDate + 2010-08-09T19:52:20Z + Version + 4.0.2 + + + BuildID + 8A306 + Filesize + 320237975 + Identifier + iPhone1,2 + MD5sum + 8a952dbd03fa5e85da1a31092c651a25 + ReleaseDate + null + SHA1sum + 940bd2b36c646f6673419eab661ac1f13248e592 + Signed + + URL + http://appldnld.apple.com/iPhone4/061-8616.20100715.phnt4/iPhone1,2_4.0.1_8A306_Restore.ipsw + UploadDate + 2010-07-13T20:13:59Z + Version + 4.0.1 + + + Identifier + iPhone1,2 + Name + iPhone 3G + Platform + s5l8900x + + + example4: + value: > + + + + + + + BDID + 2 + BoardConfig + n45ap + Boards + + + BDID + 2 + BoardConfig + n45ap + CPID + 35072 + Platform + s5l8900x + + + CPID + 35072 + Firmwares + + + BuildID + 4B1 + Filesize + 173519637 + Identifier + iPod1,1 + MD5sum + 80b46fe8db7cfe58bb67e8553f495a8d + ReleaseDate + null + SHA1sum + 1b818911316e4248ee01d3ec67f9d39afc3db240 + Signed + + URL + http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPod/SBML/osx/bundles/061-4841.20080714.bgy8O/iPod1,1_1.1.5_4B1_Restore.ipsw + UploadDate + 2008-07-14T21:39:28Z + Version + 1.1.5 + + + BuildID + 4A102 + Filesize + 173519589 + Identifier + iPod1,1 + MD5sum + 0ed3435b4ead9aa5606ca0af66eedd90 + ReleaseDate + null + SHA1sum + c148d1eb1c979bb6434175411d4a372103a4fdd2 + Signed + + URL + http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPod/SBML/osx/bundles/061-4312.20080226.Btu45/iPod1,1_1.1.4_4A102_Restore.ipsw + UploadDate + 2008-02-22T23:28:42Z + Version + 1.1.4 + + + BuildID + 4A93 + Filesize + 173511411 + Identifier + iPod1,1 + MD5sum + 12d996c376d378c1333b0343ddad6cb0 + ReleaseDate + null + SHA1sum + 8dca23eec69d5ae58fbf3d4a23276e46cbb2e3c6 + Signed + + URL + http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPod/SBML/osx/061-4060.20080115.9Iuh5/iPod1,1_1.1.3_4A93_Restore.ipsw + UploadDate + 2008-01-10T04:03:18Z + Version + 1.1.3 + + + BuildID + 3B48b + Filesize + 165567897 + Identifier + iPod1,1 + MD5sum + a7469c40e204a607becabaca841b718f + ReleaseDate + null + SHA1sum + 108d8ffe9ea75e61cd5e57170ad388b7fa00d923 + Signed + + URL + http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPod/SBML/osx/bundles/061-4036.20071107.9g3DF/iPod1,1_1.1.2_3B48b_Restore.ipsw + UploadDate + 2007-11-07T20:25:19Z + Version + 1.1.2 + + + Identifier + iPod1,1 + Name + iPod touch 1G + Platform + s5l8900x + + + example5: + value: > + + + + + + + BDID + 16 + BoardConfig + k66ap + Boards + + + BDID + 16 + BoardConfig + k66ap + CPID + 35120 + Platform + s5l8930x + + + CPID + 35120 + Firmwares + + + BuildID + 11D258 + Filesize + 698547170 + Identifier + AppleTV2,1 + MD5sum + 6677e7611ebed25d8dc33d2401b75de2 + ReleaseDate + 2014-09-17T17:59:02Z + SHA1sum + 4724347f2700dfe82fb864ecc8cdf66ea33262b1 + Signed + + URL + http://appldnld.apple.com/iOS8/031-07202.20140917.tF6Fs/AppleTV2,1_6.2.1_11D258_Restore.ipsw + UploadDate + 2014-09-03T17:55:56Z + Version + 7.1.2 + + + BuildID + 11D257c + Filesize + 698406382 + Identifier + AppleTV2,1 + MD5sum + 2b5ad301db18658c06ba12841c250f4d + ReleaseDate + 2014-06-30T18:28:53Z + SHA1sum + a772321de7a4e4b5fa710ec3660d4a640c04ead8 + Signed + + URL + http://appldnld.apple.com/iOS7.1/031-04317.20140630.2qAFy/AppleTV2,1_6.2_11D257c_Restore.ipsw + UploadDate + 2014-06-27T22:43:09Z + Version + 7.1.2 + + + BuildID + 11D201c + Filesize + 698303443 + Identifier + AppleTV2,1 + MD5sum + 1b8d3e39e1523aeee697c0be90236e9f + ReleaseDate + 2014-04-22T17:46:02Z + SHA1sum + 500dcc8878d0ef51b57f7c8260076d3970235d5a + Signed + + URL + http://appldnld.apple.com/iOS7.1/031-01311.20140422.EaugX/AppleTV2,1_6.1.1_11D201c_Restore.ipsw + UploadDate + 2014-04-16T23:38:39Z + Version + 7.1.1 + + + BuildID + 11D169b + Filesize + 698244610 + Identifier + AppleTV2,1 + MD5sum + 8107d3d44f22c234ccf15c976c8f0331 + ReleaseDate + 2014-03-10T17:57:25Z + SHA1sum + db425818155c27df710547329c6bcdd3a7f78c1e + Signed + + URL + http://appldnld.apple.com/iOS7.1/031-4478.20140310.XDdib/AppleTV2,1_6.1_11D169b_Restore.ipsw + UploadDate + 2014-03-06T20:49:52Z + Version + 7.1 + + + Identifier + AppleTV2,1 + Name + Apple TV 2G + Platform + s5l8930x + + + example6: + value: > + + + + + + + BDID + 0 + BoardConfig + N41AP + Boards + + + BDID + 0 + BoardConfig + N41AP + CPID + 35152 + Platform + s5l8950x + + + CPID + 35152 + Firmwares + + + BuildID + 14G61 + Filesize + 66410207 + Identifier + iPhone5,1 + MarketingVersion + + PrerequisiteBuild + 14F89 + PrerequisiteVersion + 10.3.2 + ReleaseDate + 2019-07-22T17:07:55Z + Releasetype + + Signed + + URL + http://updates-http.cdn-apple.com/2019/ios/091-24443-20190722-9357424A-9931-11E9-BCE8-56D0A77C2E40/com_apple_MobileAsset_SoftwareUpdate/fb90f2903f57aceabaf43bdc5aa99364faa8593e.zip + UploadDate + 2019-06-27T23:34:39Z + Version + 10.3.4 + + + BuildID + 14G61 + Filesize + 48460066 + Identifier + iPhone5,1 + MarketingVersion + + PrerequisiteBuild + 14G57 + PrerequisiteVersion + 10.3.3 + ReleaseDate + 2019-07-22T17:07:56Z + Releasetype + + Signed + + URL + http://updates-http.cdn-apple.com/2019/ios/091-24423-20190722-9357424A-9931-11E9-BCE8-53D0A77C2E40/com_apple_MobileAsset_SoftwareUpdate/1bc7b173cae90361d7820409ecc2fa5d5427144a.zip + UploadDate + 2019-06-27T23:34:34Z + Version + 10.3.4 + + + BuildID + 14G61 + Filesize + 36390797 + Identifier + iPhone5,1 + MarketingVersion + + PrerequisiteBuild + 14G60 + PrerequisiteVersion + 10.3.3 + ReleaseDate + 2019-07-22T17:07:56Z + Releasetype + + Signed + + URL + http://updates-http.cdn-apple.com/2019/ios/091-24531-20190722-93574B96-9931-11E9-B99A-5FD0A77C2E40/com_apple_MobileAsset_SoftwareUpdate/510f3fd40401a3fb35b1a22fa160f9a29730ec0c.zip + UploadDate + 2019-06-27T23:34:27Z + Version + 10.3.4 + + + BuildID + 14G61 + Filesize + 143957900 + Identifier + iPhone5,1 + MarketingVersion + + PrerequisiteBuild + 14E304 + PrerequisiteVersion + 10.3.1 + ReleaseDate + 2019-07-22T17:07:55Z + Releasetype + + Signed + + URL + http://updates-http.cdn-apple.com/2019/ios/091-24126-20190722-93574042-9931-11E9-BCE8-43D0A77C2E40/com_apple_MobileAsset_SoftwareUpdate/716406ffa26c805728d3078b56129ac07fc6516c.zip + UploadDate + 2019-06-27T23:34:27Z + Version + 10.3.4 + + + Identifier + iPhone5,1 + Name + iPhone 5 (GSM) + Platform + s5l8950x + + + application/xml: + examples: + example1: + value: | + + + + iPhone 6s + iPhone8,1 + + iPhone8,1 + 13.1.3 + 17A878 + 96be7a8e55ec4bd1867bd1d7f18b1f24f8731838 + e7f95f23dd0d8f406b2ef95d4b63bc5c + 3652675161 + http://updates-http.cdn-apple.com/2019FallFCS/fullrestores/061-30582/2A093596-EB7A-11E9-9505-C810329334FA/iPhone_4.7_13.1.3_17A878_Restore.ipsw + 2019-10-15T17:00:31Z + 2019-10-10T17:31:00Z + false + true + + + iPhone8,1 + 13.1.2 + 17A860 + a90465c172cd77bcb5bf112993c8ee7caba632d1 + 5c247ad50b0bd470ea976c742bc42240 + 3654014311 + http://updates-http.cdn-apple.com/2019FallFCS/fullrestores/061-22597/37272F4C-E18B-11E9-9F72-B96496A9EC6E/iPhone_4.7_13.1.2_17A860_Restore.ipsw + 2019-09-30T17:11:19Z + 2019-09-28T01:09:45Z + false + true + + + iPhone8,1 + 13.1.1 + 17A854 + 6fd3eaa23d13d26f8174c353d92b55c0ecc1698b + a902e7dae4d9f15fe9d1a1a317a04740 + 3651115452 + http://updates-http.cdn-apple.com/2019FallFCS/fullrestores/061-18421/E8F8D60E-DED8-11E9-A685-B200DC34986D/iPhone_4.7_13.1.1_17A854_Restore.ipsw + 2019-09-27T16:58:00Z + 2019-09-24T14:51:54Z + false + false + + + iPhone8,1 + 13.1 + 17A844 + 3421b3825922e4f3d32e890a75b8ad3ba69a69f2 + a8cc4f157d799b1776028c7ce305ddf2 + 3652404986 + http://updates-http.cdn-apple.com/2019FallFCS/fullrestores/091-99496/DCDE77CC-D986-11E9-AC76-A120DCDBD6A3/iPhone_4.7_13.1_17A844_Restore.ipsw + 2019-09-24T17:03:38Z + 2019-09-17T20:21:50Z + false + false + + + N71AP + s8000 + 32768 + 4 + + + N71mAP + s8003 + 32771 + 4 + + N71AP + s8000 + 32768 + 4 + + + example2: + value: | + + + + iPhone 6+ + iPhone7,1 + + iPhone7,1 + 12.4.2 + 16G114 + 58a91fa4d73077133772e464f761c96ad91df683 + 10d9aeb0d87a04a40417be05c0b19a44 + 3328746693 + http://updates-http.cdn-apple.com/2019SummerFCS/fullrestores/061-20538/FD3DCDB6-DC8C-11E9-ABB0-278C66A83945/iPhone_5.5_12.4.2_16G114_Restore.ipsw + 2019-09-26T17:04:56Z + 2019-09-21T16:42:04Z + false + true + + + iPhone7,1 + 12.4.1 + 16G102 + 671863b1a34cb4d8abc44919679c645f0500486d + 8a374df4132aedddd0207c8978080b35 + 3345837529 + http://updates-http.cdn-apple.com/2019SummerFCS/fullrestores/061-05190/A449778A-C4E7-11E9-BE68-18610AD8B7A1/iPhone_5.5_12.4.1_16G102_Restore.ipsw + 2019-08-26T18:30:09Z + 2019-08-22T14:27:57Z + false + false + + + iPhone7,1 + 12.4 + 16G77 + e435aa95763167106707e5d6534a4dcb66408f18 + 75279e6f2f850ba825addfe590afb8ba + 3345389368 + http://updates-http.cdn-apple.com/2019SummerFCS/fullrestores/041-86579/9E26E61A-A743-11E9-87D6-F185B65480B0/iPhone_5.5_12.4_16G77_Restore.ipsw + 2019-07-22T17:08:32Z + 2019-07-15T21:08:52Z + false + false + + + iPhone7,1 + 12.3.1 + 16F203 + a168b1bc901fb64cf725ab0dcca183dd684770dc + 84a83ab5e05e2560fd6b08d6c014cd82 + 3339505439 + http://updates-http.cdn-apple.com/2019SpringFCS/fullrestores/041-68573/CC468F46-7C96-11E9-80BA-4EF06256CCDB/iPhone_5.5_12.3.1_16F203_Restore.ipsw + 2019-05-24T17:02:33Z + 2019-05-22T13:57:50Z + false + false + + + N56AP + t7000 + 28672 + 4 + + N56AP + t7000 + 28672 + 4 + + + example3: + value: | + + + + iPhone 3G + iPhone1,2 + + iPhone1,2 + 4.2.1 + 8C148 + d2ed58586e8ca2153f2e2ec585bba8afc5173378 + 8b1657935408a1638b69740b282f62b3 + 338579762 + http://appldnld.apple.com/iPhone4/061-9853.20101122.Vfgt5/iPhone1,2_4.2.1_8C148_Restore.ipsw + null + 2010-11-18T17:30:48Z + false + true + + + iPhone1,2 + 4.1 + 8B117 + d87bab469dd1146ab83ddcc23f03b3164d7e09d4 + 8cc589baad3c80dd8324c37d7dc00750 + 323137556 + http://appldnld.apple.com/iPhone4/061-7932.20100908.3fgt5/iPhone1,2_4.1_8B117_Restore.ipsw + null + 2010-09-03T14:12:24Z + false + true + + + iPhone1,2 + 4.0.2 + 8A400 + ee2bc74719170a7a2440b593b6f300727c930c69 + 6f3aefe1f8f516ae6e91fe993749347a + 320216794 + http://appldnld.apple.com/iPhone4/061-8802.20100811.XcfpR/iPhone1,2_4.0.2_8A400_Restore.ipsw + null + 2010-08-09T19:52:20Z + false + true + + + iPhone1,2 + 4.0.1 + 8A306 + 940bd2b36c646f6673419eab661ac1f13248e592 + 8a952dbd03fa5e85da1a31092c651a25 + 320237975 + http://appldnld.apple.com/iPhone4/061-8616.20100715.phnt4/iPhone1,2_4.0.1_8A306_Restore.ipsw + null + 2010-07-13T20:13:59Z + false + true + + + n82ap + s5l8900x + 35072 + 4 + + n82ap + s5l8900x + 35072 + 4 + + + example4: + value: | + + + + iPod touch 1G + iPod1,1 + + iPod1,1 + 1.1.5 + 4B1 + 1b818911316e4248ee01d3ec67f9d39afc3db240 + 80b46fe8db7cfe58bb67e8553f495a8d + 173519637 + http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPod/SBML/osx/bundles/061-4841.20080714.bgy8O/iPod1,1_1.1.5_4B1_Restore.ipsw + null + 2008-07-14T21:39:28Z + false + false + + + iPod1,1 + 1.1.4 + 4A102 + c148d1eb1c979bb6434175411d4a372103a4fdd2 + 0ed3435b4ead9aa5606ca0af66eedd90 + 173519589 + http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPod/SBML/osx/bundles/061-4312.20080226.Btu45/iPod1,1_1.1.4_4A102_Restore.ipsw + null + 2008-02-22T23:28:42Z + false + false + + + iPod1,1 + 1.1.3 + 4A93 + 8dca23eec69d5ae58fbf3d4a23276e46cbb2e3c6 + 12d996c376d378c1333b0343ddad6cb0 + 173511411 + http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPod/SBML/osx/061-4060.20080115.9Iuh5/iPod1,1_1.1.3_4A93_Restore.ipsw + null + 2008-01-10T04:03:18Z + false + false + + + iPod1,1 + 1.1.2 + 3B48b + 108d8ffe9ea75e61cd5e57170ad388b7fa00d923 + a7469c40e204a607becabaca841b718f + 165567897 + http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPod/SBML/osx/bundles/061-4036.20071107.9g3DF/iPod1,1_1.1.2_3B48b_Restore.ipsw + null + 2007-11-07T20:25:19Z + false + false + + + n45ap + s5l8900x + 35072 + 2 + + n45ap + s5l8900x + 35072 + 2 + + + example5: + value: | + + + + Apple TV 2G + AppleTV2,1 + + AppleTV2,1 + 7.1.2 + 11D258 + 4724347f2700dfe82fb864ecc8cdf66ea33262b1 + 6677e7611ebed25d8dc33d2401b75de2 + 698547170 + http://appldnld.apple.com/iOS8/031-07202.20140917.tF6Fs/AppleTV2,1_6.2.1_11D258_Restore.ipsw + 2014-09-17T17:59:02Z + 2014-09-03T17:55:56Z + false + true + + + AppleTV2,1 + 7.1.2 + 11D257c + a772321de7a4e4b5fa710ec3660d4a640c04ead8 + 2b5ad301db18658c06ba12841c250f4d + 698406382 + http://appldnld.apple.com/iOS7.1/031-04317.20140630.2qAFy/AppleTV2,1_6.2_11D257c_Restore.ipsw + 2014-06-30T18:28:53Z + 2014-06-27T22:43:09Z + false + false + + + AppleTV2,1 + 7.1.1 + 11D201c + 500dcc8878d0ef51b57f7c8260076d3970235d5a + 1b8d3e39e1523aeee697c0be90236e9f + 698303443 + http://appldnld.apple.com/iOS7.1/031-01311.20140422.EaugX/AppleTV2,1_6.1.1_11D201c_Restore.ipsw + 2014-04-22T17:46:02Z + 2014-04-16T23:38:39Z + false + false + + + AppleTV2,1 + 7.1 + 11D169b + db425818155c27df710547329c6bcdd3a7f78c1e + 8107d3d44f22c234ccf15c976c8f0331 + 698244610 + http://appldnld.apple.com/iOS7.1/031-4478.20140310.XDdib/AppleTV2,1_6.1_11D169b_Restore.ipsw + 2014-03-10T17:57:25Z + 2014-03-06T20:49:52Z + false + false + + + k66ap + s5l8930x + 35120 + 16 + + k66ap + s5l8930x + 35120 + 16 + + + example6: + value: | + + + + iPhone 5 (GSM) + iPhone5,1 + + iPhone5,1 + 14G61 + 10.3.4 + http://updates-http.cdn-apple.com/2019/ios/091-24443-20190722-9357424A-9931-11E9-BCE8-56D0A77C2E40/com_apple_MobileAsset_SoftwareUpdate/fb90f2903f57aceabaf43bdc5aa99364faa8593e.zip + 66410207 + 14F89 + 10.3.2 + + 2019-06-27T23:34:39Z + 2019-07-22T17:07:55Z + + true + + + iPhone5,1 + 14G61 + 10.3.4 + http://updates-http.cdn-apple.com/2019/ios/091-24423-20190722-9357424A-9931-11E9-BCE8-53D0A77C2E40/com_apple_MobileAsset_SoftwareUpdate/1bc7b173cae90361d7820409ecc2fa5d5427144a.zip + 48460066 + 14G57 + 10.3.3 + + 2019-06-27T23:34:34Z + 2019-07-22T17:07:56Z + + true + + + iPhone5,1 + 14G61 + 10.3.4 + http://updates-http.cdn-apple.com/2019/ios/091-24531-20190722-93574B96-9931-11E9-B99A-5FD0A77C2E40/com_apple_MobileAsset_SoftwareUpdate/510f3fd40401a3fb35b1a22fa160f9a29730ec0c.zip + 36390797 + 14G60 + 10.3.3 + + 2019-06-27T23:34:27Z + 2019-07-22T17:07:56Z + + true + + + iPhone5,1 + 14G61 + 10.3.4 + http://updates-http.cdn-apple.com/2019/ios/091-24126-20190722-93574042-9931-11E9-BCE8-43D0A77C2E40/com_apple_MobileAsset_SoftwareUpdate/716406ffa26c805728d3078b56129ac07fc6516c.zip + 143957900 + 14E304 + 10.3.1 + + 2019-06-27T23:34:27Z + 2019-07-22T17:07:55Z + + true + + + N41AP + s5l8950x + 35152 + 0 + + N41AP + s5l8950x + 35152 + 0 + + + '404': + description: Not Found + headers: + Access-Control-Allow-Methods: + schema: + type: string + Access-Control-Allow-Origin: + schema: + type: string + X-Data-Location: + schema: + type: string + content: {} + summary: Get Firmwares For Device + operationId: getDevice + description: >- + GetFirmwaresForDevice returns Firmwares for a given Device. An optional + "type" get parameter may be + + specified to retrieve OTA Firmwares instead of normal IPSW files. + + As of 2021-03-04, it is recommended that you use the "boards" property + of the device, as devices can have multiple boards. + tags: + - Api + parameters: + - name: identifier + in: path + description: '' + required: true + example: iPhone8,1 + schema: + type: string + - name: type + in: query + description: '' + required: true + example: ipsw + schema: + type: string + + /devices: + get: + responses: + '200': + description: OK + headers: + Access-Control-Allow-Methods: + schema: + type: string + Access-Control-Allow-Origin: + schema: + type: string + Cache-Control: + schema: + type: string + Expires: + schema: + type: string + X-Data-Location: + schema: + type: string + content: + application/json: + schema: + type: array + items: + schema: + $ref: '#/components/schemas/Device' + example: + - name: iPhone 2G + identifier: iPhone1,1 + boards: + - boardconfig: m68ap + platform: s5l8900x + cpid: 35072 + bdid: 0 + boardconfig: m68ap + platform: s5l8900x + cpid: 35072 + bdid: 0 + - name: iPhone 3G + identifier: iPhone1,2 + boards: + - boardconfig: n82ap + platform: s5l8900x + cpid: 35072 + bdid: 4 + boardconfig: n82ap + platform: s5l8900x + cpid: 35072 + bdid: 4 + - name: iPhone 3G[S] + identifier: iPhone2,1 + boards: + - boardconfig: n88ap + platform: s5l8920x + cpid: 35104 + bdid: 0 + boardconfig: n88ap + platform: s5l8920x + cpid: 35104 + bdid: 0 + - name: iPhone 4 (GSM) + identifier: iPhone3,1 + boards: + - boardconfig: n90ap + platform: s5l8930x + cpid: 35120 + bdid: 0 + boardconfig: n90ap + platform: s5l8930x + cpid: 35120 + bdid: 0 + application/x-plist: + example: > + + + + + + + + BDID + 0 + BoardConfig + m68ap + Boards + + + BDID + 0 + BoardConfig + m68ap + CPID + 35072 + Platform + s5l8900x + + + CPID + 35072 + Firmwares + Identifier + iPhone1,1 + Name + iPhone 2G + Platform + s5l8900x + + + BDID + 4 + BoardConfig + n82ap + Boards + + + BDID + 4 + BoardConfig + n82ap + CPID + 35072 + Platform + s5l8900x + + + CPID + 35072 + Firmwares + Identifier + iPhone1,2 + Name + iPhone 3G + Platform + s5l8900x + + + BDID + 0 + BoardConfig + n88ap + Boards + + + BDID + 0 + BoardConfig + n88ap + CPID + 35104 + Platform + s5l8920x + + + CPID + 35104 + Firmwares + Identifier + iPhone2,1 + Name + iPhone 3G[S] + Platform + s5l8920x + + + BDID + 0 + BoardConfig + n90ap + Boards + + + BDID + 0 + BoardConfig + n90ap + CPID + 35120 + Platform + s5l8930x + + + CPID + 35120 + Firmwares + Identifier + iPhone3,1 + Name + iPhone 4 (GSM) + Platform + s5l8930x + + + + application/xml: + example: | + + + + iPhone 2G + iPhone1,1 + + m68ap + s5l8900x + 35072 + 0 + + m68ap + s5l8900x + 35072 + 0 + + + iPhone 3G + iPhone1,2 + + n82ap + s5l8900x + 35072 + 4 + + n82ap + s5l8900x + 35072 + 4 + + + iPhone 3G[S] + iPhone2,1 + + n88ap + s5l8920x + 35104 + 0 + + n88ap + s5l8920x + 35104 + 0 + + + iPhone 4 (GSM) + iPhone3,1 + + n90ap + s5l8930x + 35120 + 0 + + n90ap + s5l8930x + 35120 + 0 + + + summary: Get Devices + operationId: devices + description: >- + GetDevices returns a list of all devices known to IPSW Downloads + + If you wish to only get devices which have Firmware Keys, add the + ?keysOnly=true parameter. + + As of 2021-03-04, it is recommended that you use the "boards" property + of each device, as devices can have multiple boards. + tags: + - Api + parameters: + - name: keysOnly + in: query + description: '' + required: true + example: 'true' + schema: + type: boolean + + /ipsw/download/{identifier}/{buildid}: + get: + responses: + '302': + description: Found + headers: + Access-Control-Allow-Methods: + schema: + type: string + Access-Control-Allow-Origin: + schema: + type: string + Location: + schema: + type: string + content: + text/html; charset=utf-8: + examples: + example1: + value: > + Found. + example2: + value: > + Found. + '404': + description: Not Found + headers: + Access-Control-Allow-Methods: + schema: + type: string + Access-Control-Allow-Origin: + schema: + type: string + X-Data-Location: + schema: + type: string + content: {} + summary: Download IPSW + operationId: ipswDownload + description: >- + DownloadIPSW redirects to download an IPSW as specified by its + identifier and buildid + tags: + - Api + parameters: + - name: identifier + in: path + description: '' + required: true + example: iPhone7,1 + schema: + type: string + - name: buildid + in: path + description: '' + required: true + example: 13A452 + schema: + type: string + /ipsw/{identifier}/{buildid}: + get: + responses: + '200': + description: OK + headers: + Access-Control-Allow-Methods: + schema: + type: string + Access-Control-Allow-Origin: + schema: + type: string + Cache-Control: + schema: + type: string + Expires: + schema: + type: string + X-Data-Location: + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/Firmware' + examples: + example1: + value: + identifier: iPhone7,1 + version: 11.1.1 + buildid: 15B150 + sha1sum: 8c12060e24a88948beea1d13c0aee27556da56cd + md5sum: 153f062e1d6c4c73dfedff8c251ac197 + filesize: 2861115955 + url: >- + http://appldnld.apple.com/ios11.1.1/091-42060-20171106-4525F990-C39A-11E7-B0E4-37BCF8FD2868/iPhone_5.5_11.1.1_15B150_Restore.ipsw + releasedate: '2017-11-09T17:58:14Z' + uploaddate: '2017-11-07T09:14:12Z' + signed: false + example2: + value: + identifier: iPhone6,1 + version: 10.3.2 + buildid: 14F89 + sha1sum: ecf5350d9715769b400a6336f5267b4605bd2786 + md5sum: 5ede4d1f9751bce2933f7465aea28658 + filesize: 2540881652 + url: >- + http://appldnld.apple.com/ios10.3.2/031-98771-20170515-E1F8ADA4-2F92-11E7-B86F-ED688FB7FE33/iPhone_4.0_64bit_10.3.2_14F89_Restore.ipsw + releasedate: '2017-05-15T17:13:42Z' + uploaddate: '2017-05-03T00:06:06Z' + signed: false + example3: + value: + identifier: iPhone1,2 + version: '2.2' + buildid: 5G77 + sha1sum: f67f8b2b842428bf89456cda0c2d5cf954d111a4 + md5sum: fd33b6f92a6b5bc3dd0fa40b39a40c0c + filesize: 258342348 + url: >- + http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPhone/061-5778.20081120.Aqw4R/iPhone1,2_2.2_5G77_Restore.ipsw + releasedate: null + uploaddate: '2008-11-17T22:00:12Z' + signed: false + application/x-plist: + examples: + example1: + value: > + + + + + + + BuildID + 15B150 + Filesize + 2861115955 + Identifier + iPhone7,1 + MD5sum + 153f062e1d6c4c73dfedff8c251ac197 + ReleaseDate + 2017-11-09T17:58:14Z + SHA1sum + 8c12060e24a88948beea1d13c0aee27556da56cd + Signed + + URL + http://appldnld.apple.com/ios11.1.1/091-42060-20171106-4525F990-C39A-11E7-B0E4-37BCF8FD2868/iPhone_5.5_11.1.1_15B150_Restore.ipsw + UploadDate + 2017-11-07T09:14:12Z + Version + 11.1.1 + + + example2: + value: > + + + + + + + BuildID + 14F89 + Filesize + 2540881652 + Identifier + iPhone6,1 + MD5sum + 5ede4d1f9751bce2933f7465aea28658 + ReleaseDate + 2017-05-15T17:13:42Z + SHA1sum + ecf5350d9715769b400a6336f5267b4605bd2786 + Signed + + URL + http://appldnld.apple.com/ios10.3.2/031-98771-20170515-E1F8ADA4-2F92-11E7-B86F-ED688FB7FE33/iPhone_4.0_64bit_10.3.2_14F89_Restore.ipsw + UploadDate + 2017-05-03T00:06:06Z + Version + 10.3.2 + + + example3: + value: > + + + + + + + BuildID + 5G77 + Filesize + 258342348 + Identifier + iPhone1,2 + MD5sum + fd33b6f92a6b5bc3dd0fa40b39a40c0c + ReleaseDate + null + SHA1sum + f67f8b2b842428bf89456cda0c2d5cf954d111a4 + Signed + + URL + http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPhone/061-5778.20081120.Aqw4R/iPhone1,2_2.2_5G77_Restore.ipsw + UploadDate + 2008-11-17T22:00:12Z + Version + 2.2 + + + application/xml: + examples: + example1: + value: | + + + + iPhone7,1 + 11.1.1 + 15B150 + 8c12060e24a88948beea1d13c0aee27556da56cd + 153f062e1d6c4c73dfedff8c251ac197 + 2861115955 + http://appldnld.apple.com/ios11.1.1/091-42060-20171106-4525F990-C39A-11E7-B0E4-37BCF8FD2868/iPhone_5.5_11.1.1_15B150_Restore.ipsw + 2017-11-09T17:58:14Z + 2017-11-07T09:14:12Z + false + false + + + example2: + value: | + + + + iPhone6,1 + 10.3.2 + 14F89 + ecf5350d9715769b400a6336f5267b4605bd2786 + 5ede4d1f9751bce2933f7465aea28658 + 2540881652 + http://appldnld.apple.com/ios10.3.2/031-98771-20170515-E1F8ADA4-2F92-11E7-B86F-ED688FB7FE33/iPhone_4.0_64bit_10.3.2_14F89_Restore.ipsw + 2017-05-15T17:13:42Z + 2017-05-03T00:06:06Z + false + false + + + example3: + value: | + + + + iPhone1,2 + 2.2 + 5G77 + f67f8b2b842428bf89456cda0c2d5cf954d111a4 + fd33b6f92a6b5bc3dd0fa40b39a40c0c + 258342348 + http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPhone/061-5778.20081120.Aqw4R/iPhone1,2_2.2_5G77_Restore.ipsw + null + 2008-11-17T22:00:12Z + false + false + + + '404': + description: Not Found + headers: + Access-Control-Allow-Methods: + schema: + type: string + Access-Control-Allow-Origin: + schema: + type: string + X-Data-Location: + schema: + type: string + content: {} + summary: Get IPSW Information + operationId: ipswByIdentifierAndBuild + description: >- + GetIPSWInformation returns all known information for an IPSW as + specified by identifier and buildid + tags: + - Api + parameters: + - name: identifier + in: path + description: '' + required: true + example: iPhone7,1 + schema: + type: string + - name: buildid + in: path + description: '' + required: true + example: 15B150 + schema: + type: string + + /ipsw/{version}: + get: + responses: + '200': + description: OK + headers: + Access-Control-Allow-Methods: + schema: + type: string + Access-Control-Allow-Origin: + schema: + type: string + Cache-Control: + schema: + type: string + Expires: + schema: + type: string + X-Data-Location: + schema: + type: string + content: + application/json: + schema: + type: array + items: + schema: + $ref: '#/components/schemas/Firmware' + examples: + example1: + value: + - identifier: AppleTV2,1 + version: 4.2.1 + buildid: 8C154 + sha1sum: c2b1adea595afa2b9caf633f0a820d3b66424dbf + md5sum: 3fe1a01b8f5c8425a074ffd6deea7c86 + filesize: 279991056 + url: >- + http://appldnld.apple.com/AppleTV/061-9978.20101214.gmabr/AppleTV2,1_4.2.1_8C154_Restore.ipsw + releasedate: null + uploaddate: '2010-12-13T05:04:45Z' + signed: false + - identifier: iPhone2,1 + version: 4.2.1 + buildid: 8C148a + sha1sum: 2787bb9fbf18594279d05682e6fd16d2b9612a2a + md5sum: d688d2d48c8b054367adef8e7ab4f5ea + filesize: 420813164 + url: >- + http://appldnld.apple.com/iPhone4/061-9895.20101122.Cdew2/iPhone2,1_4.2.1_8C148a_Restore.ipsw + releasedate: null + uploaddate: '2010-11-21T12:59:55Z' + signed: false + - identifier: iPod4,1 + version: 4.2.1 + buildid: 8C148 + sha1sum: 6a890696126d0cb7f9ccd6b913ecb09cf2029820 + md5sum: 14d1508954532e91172f8704fd941a93 + filesize: 638177119 + url: >- + http://appldnld.apple.com/iPhone4/061-9859.20101122.$erft/iPod4,1_4.2.1_8C148_Restore.ipsw + releasedate: null + uploaddate: '2010-11-18T17:55:40Z' + signed: false + - identifier: iPad1,1 + version: 4.2.1 + buildid: 8C148 + sha1sum: 8717b3bedc925b587566442ad375aa65d857e79a + md5sum: 9402d5f05348fd68c87f885ff4cb4717 + filesize: 578084840 + url: >- + http://appldnld.apple.com/iPad/061-9857.20101122.VGthy/iPad1,1_4.2.1_8C148_Restore.ipsw + releasedate: null + uploaddate: '2010-11-18T17:31:47Z' + signed: false + example2: + value: + - identifier: iPhone1,1 + version: '2.2' + buildid: 5G77 + sha1sum: cbfc6ff886ce89868a55547b9fb980dbf92e6418 + md5sum: 3603b5d9536cd0b269261cab406a7c38 + filesize: 257576980 + url: >- + http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPhone/061-5779.20081120.Pt5yH/iPhone1,1_2.2_5G77_Restore.ipsw + releasedate: null + uploaddate: '2008-11-17T22:00:17Z' + signed: false + - identifier: iPhone1,2 + version: '2.2' + buildid: 5G77 + sha1sum: f67f8b2b842428bf89456cda0c2d5cf954d111a4 + md5sum: fd33b6f92a6b5bc3dd0fa40b39a40c0c + filesize: 258342348 + url: >- + http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPhone/061-5778.20081120.Aqw4R/iPhone1,2_2.2_5G77_Restore.ipsw + releasedate: null + uploaddate: '2008-11-17T22:00:12Z' + signed: false + - identifier: iPod2,1 + version: '2.2' + buildid: 5G77a + sha1sum: 34a0a489605f34d6cc6c9954edcaaf9a050deedc + md5sum: 47e7d154616aff63c622f506568a96b2 + filesize: 291123491 + url: >- + http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPod/SBML/osx/061-5358.20081120.Gtghy/iPod2,1_2.2_5G77a_Restore.ipsw + releasedate: null + uploaddate: '2008-11-17T21:58:35Z' + signed: false + example3: + value: + - identifier: iPad5,1 + version: 10.3.3 + buildid: 14G60 + sha1sum: ed9ac58b8817faa1abec0478a2d2710da42f19c4 + md5sum: 9ca42a38b9804d93637b0b23d965190e + filesize: 2549277532 + url: >- + http://appldnld.apple.com/ios10.3.3/091-23287-20170719-CA9523BC-6977-11E7-A56D-329100BA0AE3/iPad_64bit_TouchID_10.3.3_14G60_Restore.ipsw + releasedate: '2017-07-19T17:08:50Z' + uploaddate: '2017-07-15T16:27:39Z' + signed: false + - identifier: iPad3,4 + version: 10.3.3 + buildid: 14G60 + sha1sum: 88bb926d58e9e2497fcc2a941987314fd6656cc2 + md5sum: 612c6d5367cc6bb7032e70489a6ee4ca + filesize: 1930250488 + url: >- + http://appldnld.apple.com/ios10.3.3/091-23117-20170719-CA973B02-6977-11E7-953B-279100BA0AE3/iPad_32bit_10.3.3_14G60_Restore.ipsw + releasedate: '2017-07-19T17:08:50Z' + uploaddate: '2017-07-15T16:27:38Z' + signed: true + - identifier: iPad6,11 + version: 10.3.3 + buildid: 14G60 + sha1sum: 0bdf196a2e23a9f177402ce3bb047f0e828c0481 + md5sum: eb4bbe3f1c1b2fdd12ea61921ca4d570 + filesize: 2457699238 + url: >- + http://appldnld.apple.com/ios10.3.3/091-23331-20170719-CA996666-6977-11E7-81A4-399100BA0AE3/iPad_6,11_iPad_6,12_10.3.3_14G60_Restore.ipsw + releasedate: '2017-07-19T17:08:48Z' + uploaddate: '2017-07-15T16:27:41Z' + signed: false + - identifier: iPhone7,2 + version: 10.3.3 + buildid: 14G60 + sha1sum: c5e6caabd61022ed5580301cd8fec3c6c4bb4abf + md5sum: a3797cb1ee920204a97855b7657441ca + filesize: 2622984304 + url: >- + http://appldnld.apple.com/ios10.3.3/091-23441-20170719-CA9B0570-6977-11E7-95CC-3F9100BA0AE3/iPhone_4.7_10.3.3_14G60_Restore.ipsw + releasedate: '2017-07-19T17:08:47Z' + uploaddate: '2017-07-15T16:29:01Z' + signed: false + example4: + value: + - identifier: iPhone1,1 + version: 3.1.3 + buildid: '7E18' + sha1sum: eab23a7f8d2a17cb71046c50fc5f67ec390a3c2b + md5sum: b8aebb134d92298adced1a22dfac6df2 + filesize: 238319275 + url: >- + http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPhone/061-7481.20100202.4orot/iPhone1,1_3.1.3_7E18_Restore.ipsw + releasedate: null + uploaddate: '2010-01-22T01:53:08Z' + signed: false + - identifier: iPod3,1 + version: 3.1.3 + buildid: '7E18' + sha1sum: 375fd469b18bfc0b74c7cfa5b4d5945197b1d106 + md5sum: a73de2cfafef3463e9afa491f20c5213 + filesize: 295870806 + url: >- + http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPhone/061-7473.20100202.4i44t/iPod3,1_3.1.3_7E18_Restore.ipsw + releasedate: null + uploaddate: '2010-01-22T01:53:06Z' + signed: false + - identifier: iPhone2,1 + version: 3.1.3 + buildid: '7E18' + sha1sum: 8cb3775e62c6f72059a962bf891b4e145b965052 + md5sum: 4117e4b22565e69205a84e9eeef0583e + filesize: 305122343 + url: >- + http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPhone/061-7472.20100202.8tugj/iPhone2,1_3.1.3_7E18_Restore.ipsw + releasedate: null + uploaddate: '2010-01-22T01:52:31Z' + signed: false + - identifier: iPhone1,2 + version: 3.1.3 + buildid: '7E18' + sha1sum: f5950afca546f93e281ba3cdb08bc0cfed7f0896 + md5sum: 82e93e4e51b0e4503a8165507b8a3df2 + filesize: 239139281 + url: >- + http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPhone/061-7468.20100202.pbnrt/iPhone1,2_3.1.3_7E18_Restore.ipsw + releasedate: null + uploaddate: '2010-01-22T01:49:43Z' + signed: false + application/x-plist: + examples: + example1: + value: > + + + + + + + + BuildID + 8C154 + Filesize + 279991056 + Identifier + AppleTV2,1 + MD5sum + 3fe1a01b8f5c8425a074ffd6deea7c86 + ReleaseDate + null + SHA1sum + c2b1adea595afa2b9caf633f0a820d3b66424dbf + Signed + + URL + http://appldnld.apple.com/AppleTV/061-9978.20101214.gmabr/AppleTV2,1_4.2.1_8C154_Restore.ipsw + UploadDate + 2010-12-13T05:04:45Z + Version + 4.2.1 + + + BuildID + 8C148a + Filesize + 420813164 + Identifier + iPhone2,1 + MD5sum + d688d2d48c8b054367adef8e7ab4f5ea + ReleaseDate + null + SHA1sum + 2787bb9fbf18594279d05682e6fd16d2b9612a2a + Signed + + URL + http://appldnld.apple.com/iPhone4/061-9895.20101122.Cdew2/iPhone2,1_4.2.1_8C148a_Restore.ipsw + UploadDate + 2010-11-21T12:59:55Z + Version + 4.2.1 + + + BuildID + 8C148 + Filesize + 638177119 + Identifier + iPod4,1 + MD5sum + 14d1508954532e91172f8704fd941a93 + ReleaseDate + null + SHA1sum + 6a890696126d0cb7f9ccd6b913ecb09cf2029820 + Signed + + URL + http://appldnld.apple.com/iPhone4/061-9859.20101122.$erft/iPod4,1_4.2.1_8C148_Restore.ipsw + UploadDate + 2010-11-18T17:55:40Z + Version + 4.2.1 + + + BuildID + 8C148 + Filesize + 578084840 + Identifier + iPad1,1 + MD5sum + 9402d5f05348fd68c87f885ff4cb4717 + ReleaseDate + null + SHA1sum + 8717b3bedc925b587566442ad375aa65d857e79a + Signed + + URL + http://appldnld.apple.com/iPad/061-9857.20101122.VGthy/iPad1,1_4.2.1_8C148_Restore.ipsw + UploadDate + 2010-11-18T17:31:47Z + Version + 4.2.1 + + + + example2: + value: > + + + + + + + + BuildID + 5G77 + Filesize + 257576980 + Identifier + iPhone1,1 + MD5sum + 3603b5d9536cd0b269261cab406a7c38 + ReleaseDate + null + SHA1sum + cbfc6ff886ce89868a55547b9fb980dbf92e6418 + Signed + + URL + http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPhone/061-5779.20081120.Pt5yH/iPhone1,1_2.2_5G77_Restore.ipsw + UploadDate + 2008-11-17T22:00:17Z + Version + 2.2 + + + BuildID + 5G77 + Filesize + 258342348 + Identifier + iPhone1,2 + MD5sum + fd33b6f92a6b5bc3dd0fa40b39a40c0c + ReleaseDate + null + SHA1sum + f67f8b2b842428bf89456cda0c2d5cf954d111a4 + Signed + + URL + http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPhone/061-5778.20081120.Aqw4R/iPhone1,2_2.2_5G77_Restore.ipsw + UploadDate + 2008-11-17T22:00:12Z + Version + 2.2 + + + BuildID + 5G77a + Filesize + 291123491 + Identifier + iPod2,1 + MD5sum + 47e7d154616aff63c622f506568a96b2 + ReleaseDate + null + SHA1sum + 34a0a489605f34d6cc6c9954edcaaf9a050deedc + Signed + + URL + http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPod/SBML/osx/061-5358.20081120.Gtghy/iPod2,1_2.2_5G77a_Restore.ipsw + UploadDate + 2008-11-17T21:58:35Z + Version + 2.2 + + + + example3: + value: > + + + + + + + + BuildID + 14G60 + Filesize + 2549277532 + Identifier + iPad5,1 + MD5sum + 9ca42a38b9804d93637b0b23d965190e + ReleaseDate + 2017-07-19T17:08:50Z + SHA1sum + ed9ac58b8817faa1abec0478a2d2710da42f19c4 + Signed + + URL + http://appldnld.apple.com/ios10.3.3/091-23287-20170719-CA9523BC-6977-11E7-A56D-329100BA0AE3/iPad_64bit_TouchID_10.3.3_14G60_Restore.ipsw + UploadDate + 2017-07-15T16:27:39Z + Version + 10.3.3 + + + BuildID + 14G60 + Filesize + 1930250488 + Identifier + iPad3,4 + MD5sum + 612c6d5367cc6bb7032e70489a6ee4ca + ReleaseDate + 2017-07-19T17:08:50Z + SHA1sum + 88bb926d58e9e2497fcc2a941987314fd6656cc2 + Signed + + URL + http://appldnld.apple.com/ios10.3.3/091-23117-20170719-CA973B02-6977-11E7-953B-279100BA0AE3/iPad_32bit_10.3.3_14G60_Restore.ipsw + UploadDate + 2017-07-15T16:27:38Z + Version + 10.3.3 + + + BuildID + 14G60 + Filesize + 2457699238 + Identifier + iPad6,11 + MD5sum + eb4bbe3f1c1b2fdd12ea61921ca4d570 + ReleaseDate + 2017-07-19T17:08:48Z + SHA1sum + 0bdf196a2e23a9f177402ce3bb047f0e828c0481 + Signed + + URL + http://appldnld.apple.com/ios10.3.3/091-23331-20170719-CA996666-6977-11E7-81A4-399100BA0AE3/iPad_6,11_iPad_6,12_10.3.3_14G60_Restore.ipsw + UploadDate + 2017-07-15T16:27:41Z + Version + 10.3.3 + + + BuildID + 14G60 + Filesize + 2622984304 + Identifier + iPhone7,2 + MD5sum + a3797cb1ee920204a97855b7657441ca + ReleaseDate + 2017-07-19T17:08:47Z + SHA1sum + c5e6caabd61022ed5580301cd8fec3c6c4bb4abf + Signed + + URL + http://appldnld.apple.com/ios10.3.3/091-23441-20170719-CA9B0570-6977-11E7-95CC-3F9100BA0AE3/iPhone_4.7_10.3.3_14G60_Restore.ipsw + UploadDate + 2017-07-15T16:29:01Z + Version + 10.3.3 + + + + example4: + value: > + + + + + + + + BuildID + 7E18 + Filesize + 238319275 + Identifier + iPhone1,1 + MD5sum + b8aebb134d92298adced1a22dfac6df2 + ReleaseDate + null + SHA1sum + eab23a7f8d2a17cb71046c50fc5f67ec390a3c2b + Signed + + URL + http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPhone/061-7481.20100202.4orot/iPhone1,1_3.1.3_7E18_Restore.ipsw + UploadDate + 2010-01-22T01:53:08Z + Version + 3.1.3 + + + BuildID + 7E18 + Filesize + 295870806 + Identifier + iPod3,1 + MD5sum + a73de2cfafef3463e9afa491f20c5213 + ReleaseDate + null + SHA1sum + 375fd469b18bfc0b74c7cfa5b4d5945197b1d106 + Signed + + URL + http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPhone/061-7473.20100202.4i44t/iPod3,1_3.1.3_7E18_Restore.ipsw + UploadDate + 2010-01-22T01:53:06Z + Version + 3.1.3 + + + BuildID + 7E18 + Filesize + 305122343 + Identifier + iPhone2,1 + MD5sum + 4117e4b22565e69205a84e9eeef0583e + ReleaseDate + null + SHA1sum + 8cb3775e62c6f72059a962bf891b4e145b965052 + Signed + + URL + http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPhone/061-7472.20100202.8tugj/iPhone2,1_3.1.3_7E18_Restore.ipsw + UploadDate + 2010-01-22T01:52:31Z + Version + 3.1.3 + + + BuildID + 7E18 + Filesize + 239139281 + Identifier + iPhone1,2 + MD5sum + 82e93e4e51b0e4503a8165507b8a3df2 + ReleaseDate + null + SHA1sum + f5950afca546f93e281ba3cdb08bc0cfed7f0896 + Signed + + URL + http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPhone/061-7468.20100202.pbnrt/iPhone1,2_3.1.3_7E18_Restore.ipsw + UploadDate + 2010-01-22T01:49:43Z + Version + 3.1.3 + + + + application/xml: + examples: + example1: + value: | + + + + AppleTV2,1 + 4.2.1 + 8C154 + c2b1adea595afa2b9caf633f0a820d3b66424dbf + 3fe1a01b8f5c8425a074ffd6deea7c86 + 279991056 + http://appldnld.apple.com/AppleTV/061-9978.20101214.gmabr/AppleTV2,1_4.2.1_8C154_Restore.ipsw + null + 2010-12-13T05:04:45Z + false + false + + + iPhone2,1 + 4.2.1 + 8C148a + 2787bb9fbf18594279d05682e6fd16d2b9612a2a + d688d2d48c8b054367adef8e7ab4f5ea + 420813164 + http://appldnld.apple.com/iPhone4/061-9895.20101122.Cdew2/iPhone2,1_4.2.1_8C148a_Restore.ipsw + null + 2010-11-21T12:59:55Z + false + false + + + iPod4,1 + 4.2.1 + 8C148 + 6a890696126d0cb7f9ccd6b913ecb09cf2029820 + 14d1508954532e91172f8704fd941a93 + 638177119 + http://appldnld.apple.com/iPhone4/061-9859.20101122.$erft/iPod4,1_4.2.1_8C148_Restore.ipsw + null + 2010-11-18T17:55:40Z + false + false + + + iPad1,1 + 4.2.1 + 8C148 + 8717b3bedc925b587566442ad375aa65d857e79a + 9402d5f05348fd68c87f885ff4cb4717 + 578084840 + http://appldnld.apple.com/iPad/061-9857.20101122.VGthy/iPad1,1_4.2.1_8C148_Restore.ipsw + null + 2010-11-18T17:31:47Z + false + false + + + example2: + value: | + + + + iPhone1,1 + 2.2 + 5G77 + cbfc6ff886ce89868a55547b9fb980dbf92e6418 + 3603b5d9536cd0b269261cab406a7c38 + 257576980 + http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPhone/061-5779.20081120.Pt5yH/iPhone1,1_2.2_5G77_Restore.ipsw + null + 2008-11-17T22:00:17Z + false + false + + + iPhone1,2 + 2.2 + 5G77 + f67f8b2b842428bf89456cda0c2d5cf954d111a4 + fd33b6f92a6b5bc3dd0fa40b39a40c0c + 258342348 + http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPhone/061-5778.20081120.Aqw4R/iPhone1,2_2.2_5G77_Restore.ipsw + null + 2008-11-17T22:00:12Z + false + false + + + iPod2,1 + 2.2 + 5G77a + 34a0a489605f34d6cc6c9954edcaaf9a050deedc + 47e7d154616aff63c622f506568a96b2 + 291123491 + http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPod/SBML/osx/061-5358.20081120.Gtghy/iPod2,1_2.2_5G77a_Restore.ipsw + null + 2008-11-17T21:58:35Z + false + false + + + example3: + value: | + + + + iPad5,1 + 10.3.3 + 14G60 + ed9ac58b8817faa1abec0478a2d2710da42f19c4 + 9ca42a38b9804d93637b0b23d965190e + 2549277532 + http://appldnld.apple.com/ios10.3.3/091-23287-20170719-CA9523BC-6977-11E7-A56D-329100BA0AE3/iPad_64bit_TouchID_10.3.3_14G60_Restore.ipsw + 2017-07-19T17:08:50Z + 2017-07-15T16:27:39Z + false + false + + + iPad3,4 + 10.3.3 + 14G60 + 88bb926d58e9e2497fcc2a941987314fd6656cc2 + 612c6d5367cc6bb7032e70489a6ee4ca + 1930250488 + http://appldnld.apple.com/ios10.3.3/091-23117-20170719-CA973B02-6977-11E7-953B-279100BA0AE3/iPad_32bit_10.3.3_14G60_Restore.ipsw + 2017-07-19T17:08:50Z + 2017-07-15T16:27:38Z + false + true + + + iPad6,11 + 10.3.3 + 14G60 + 0bdf196a2e23a9f177402ce3bb047f0e828c0481 + eb4bbe3f1c1b2fdd12ea61921ca4d570 + 2457699238 + http://appldnld.apple.com/ios10.3.3/091-23331-20170719-CA996666-6977-11E7-81A4-399100BA0AE3/iPad_6,11_iPad_6,12_10.3.3_14G60_Restore.ipsw + 2017-07-19T17:08:48Z + 2017-07-15T16:27:41Z + false + false + + + iPhone7,2 + 10.3.3 + 14G60 + c5e6caabd61022ed5580301cd8fec3c6c4bb4abf + a3797cb1ee920204a97855b7657441ca + 2622984304 + http://appldnld.apple.com/ios10.3.3/091-23441-20170719-CA9B0570-6977-11E7-95CC-3F9100BA0AE3/iPhone_4.7_10.3.3_14G60_Restore.ipsw + 2017-07-19T17:08:47Z + 2017-07-15T16:29:01Z + false + false + + + example4: + value: | + + + + iPhone1,1 + 3.1.3 + 7E18 + eab23a7f8d2a17cb71046c50fc5f67ec390a3c2b + b8aebb134d92298adced1a22dfac6df2 + 238319275 + http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPhone/061-7481.20100202.4orot/iPhone1,1_3.1.3_7E18_Restore.ipsw + null + 2010-01-22T01:53:08Z + false + false + + + iPod3,1 + 3.1.3 + 7E18 + 375fd469b18bfc0b74c7cfa5b4d5945197b1d106 + a73de2cfafef3463e9afa491f20c5213 + 295870806 + http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPhone/061-7473.20100202.4i44t/iPod3,1_3.1.3_7E18_Restore.ipsw + null + 2010-01-22T01:53:06Z + false + false + + + iPhone2,1 + 3.1.3 + 7E18 + 8cb3775e62c6f72059a962bf891b4e145b965052 + 4117e4b22565e69205a84e9eeef0583e + 305122343 + http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPhone/061-7472.20100202.8tugj/iPhone2,1_3.1.3_7E18_Restore.ipsw + null + 2010-01-22T01:52:31Z + false + false + + + iPhone1,2 + 3.1.3 + 7E18 + f5950afca546f93e281ba3cdb08bc0cfed7f0896 + 82e93e4e51b0e4503a8165507b8a3df2 + 239139281 + http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPhone/061-7468.20100202.pbnrt/iPhone1,2_3.1.3_7E18_Restore.ipsw + null + 2010-01-22T01:49:43Z + false + false + + + '404': + description: Not Found + headers: + Access-Control-Allow-Methods: + schema: + type: string + Access-Control-Allow-Origin: + schema: + type: string + X-Data-Location: + schema: + type: string + content: {} + summary: Get IPSW List For Version + operationId: ipswListForVersion + description: GetIPSWListForVersion finds all IPSW files for a given iOS version + tags: + - Api + parameters: + - name: version + in: path + description: '' + required: true + example: 4.2.1 + schema: + type: number + + /itunes/download/{platform}/{version}: + get: + responses: + '302': + description: Found + headers: + Access-Control-Allow-Methods: + schema: + type: string + Access-Control-Allow-Origin: + schema: + type: string + Location: + schema: + type: string + content: + text/html; charset=utf-8: + example: > + Found. + summary: Download Itunes + operationId: itunesDownloadForPlatformAndVersion + description: >- + DownloadItunes redirects to download an iTunes installer as specified by + its platform and version, and architecture for windows + tags: + - Api + parameters: + - name: platform + in: path + description: '' + required: true + example: windows + schema: + type: string + - name: version + in: path + description: '' + required: true + example: '11.1' + schema: + type: number + - name: arch + in: query + description: '' + required: true + example: x64 + schema: + type: string + /itunes/{platform}: + get: + responses: + '200': + description: OK + headers: + Access-Control-Allow-Methods: + schema: + type: string + Access-Control-Allow-Origin: + schema: + type: string + Cache-Control: + schema: + type: string + Expires: + schema: + type: string + X-Data-Location: + schema: + type: string + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/iTunes' + examples: + example1: + value: + - platform: Windows + version: '12.9' + datefound: '2018-09-25T00:00:00Z' + url: >- + https://secure-appldnld.apple.com/itunes12/041-02279-20180912-24D8EE3A-AC7A-11E8-BE19-C36F1B1141A5/iTunesSetup.exe + 64biturl: >- + https://secure-appldnld.apple.com/itunes12/041-02280-20180912-24D8CF68-AC7A-11E8-8B51-C26F1B1141A5/iTunes64Setup.exe + releasedate: '2018-09-25T00:00:00Z' + uploaddate: '2018-09-25T00:00:00Z' + - platform: Windows + version: '12.8' + datefound: '2018-06-10T00:00:00Z' + url: >- + https://secure-appldnld.apple.com/itunes12/091-81691-20180709-C98EBAE5-D5C5-41EC-9847-A5F71D9C4437/iTunesSetup.exe + 64biturl: >- + https://secure-appldnld.apple.com/itunes12/091-81692-20180709-A4DF288B-8929-401F-AD73-4189359D8A6B/iTunes64Setup.exe + releasedate: '2018-06-10T00:00:00Z' + uploaddate: '2018-06-10T00:00:00Z' + - platform: Windows + version: 12.7.5 + datefound: '2018-05-29T00:00:00Z' + url: >- + https://secure-appldnld.apple.com/itunes12/091-81943-20180529-DAFD73DE-5F77-11E8-AF1E-509A897FD268/iTunesSetup.exe + 64biturl: >- + https://secure-appldnld.apple.com/itunes12/091-81934-20180529-DAFCAAD0-5F77-11E8-99A3-4F9A897FD268/iTunes64Setup.exe + releasedate: '2018-05-29T00:00:00Z' + uploaddate: '2018-05-29T00:00:00Z' + - platform: Windows + version: 12.7.4 + datefound: '2018-03-29T02:20:22Z' + url: >- + https://secure-appldnld.apple.com/itunes12/091-76320-20180329-6D5B23D2-32F7-11E8-993D-9ABAB071F5CF/iTunesSetup.exe + 64biturl: >- + https://secure-appldnld.apple.com/itunes12/091-76333-20180329-6D5B026C-32F7-11E8-A675-99BAB071F5CF/iTunes64Setup.exe + releasedate: '2018-03-30T18:33:03Z' + uploaddate: '2018-03-29T02:20:22Z' + example2: + value: + - platform: Mac OS X + version: '12.8' + datefound: '2018-06-10T00:00:00Z' + url: >- + https://secure-appldnld.apple.com/itunes12/091-81690-20180709-3C97E2AB-D6CC-4B92-B290-2F21E56F6F70/iTunes12.8.dmg + releasedate: '2018-06-10T00:00:00Z' + uploaddate: '2018-06-10T00:00:00Z' + - platform: Mac OS X + version: 12.7.5 + datefound: '2018-05-29T00:00:00Z' + url: >- + https://secure-appldnld.apple.com/itunes12/091-81932-20180529-DAFCC9F2-5F77-11E8-B1FB-4E9A897FD268/iTunes12.7.5.dmg + releasedate: '2018-05-29T00:00:00Z' + uploaddate: '2018-05-29T00:00:00Z' + - platform: Mac OS X + version: 12.7.4 + datefound: '2018-03-29T00:57:43Z' + url: >- + https://secure-appldnld.apple.com/itunes12/091-76329-20180329-89A41942-32EB-11E8-9560-CEB2B071F5CF/iTunes12.7.4.dmg + releasedate: '2018-03-29T21:49:29Z' + uploaddate: '2018-03-29T00:57:43Z' + - platform: Mac OS X + version: 12.7.3 + datefound: '2018-01-23T03:17:51Z' + url: >- + https://secure-appldnld.apple.com/itunes12/091-44972-20180123-72201340-FFEA-11E7-9647-DA8C65562ECE/iTunes12.7.3.dmg + releasedate: '2018-02-27T18:12:43Z' + uploaddate: '2018-01-23T03:17:51Z' + application/x-plist: + examples: + example1: + value: > + + + + + + + + Datefound + 2018-09-25T00:00:00Z + Platform + Windows + ReleaseDate + 2018-09-25T00:00:00Z + SixtyFourBitURL + https://secure-appldnld.apple.com/itunes12/041-02280-20180912-24D8CF68-AC7A-11E8-8B51-C26F1B1141A5/iTunes64Setup.exe + URL + https://secure-appldnld.apple.com/itunes12/041-02279-20180912-24D8EE3A-AC7A-11E8-BE19-C36F1B1141A5/iTunesSetup.exe + UploadDate + 2018-09-25T00:00:00Z + Version + 12.9 + + + Datefound + 2018-06-10T00:00:00Z + Platform + Windows + ReleaseDate + 2018-06-10T00:00:00Z + SixtyFourBitURL + https://secure-appldnld.apple.com/itunes12/091-81692-20180709-A4DF288B-8929-401F-AD73-4189359D8A6B/iTunes64Setup.exe + URL + https://secure-appldnld.apple.com/itunes12/091-81691-20180709-C98EBAE5-D5C5-41EC-9847-A5F71D9C4437/iTunesSetup.exe + UploadDate + 2018-06-10T00:00:00Z + Version + 12.8 + + + Datefound + 2018-05-29T00:00:00Z + Platform + Windows + ReleaseDate + 2018-05-29T00:00:00Z + SixtyFourBitURL + https://secure-appldnld.apple.com/itunes12/091-81934-20180529-DAFCAAD0-5F77-11E8-99A3-4F9A897FD268/iTunes64Setup.exe + URL + https://secure-appldnld.apple.com/itunes12/091-81943-20180529-DAFD73DE-5F77-11E8-AF1E-509A897FD268/iTunesSetup.exe + UploadDate + 2018-05-29T00:00:00Z + Version + 12.7.5 + + + Datefound + 2018-03-29T02:20:22Z + Platform + Windows + ReleaseDate + 2018-03-30T18:33:03Z + SixtyFourBitURL + https://secure-appldnld.apple.com/itunes12/091-76333-20180329-6D5B026C-32F7-11E8-A675-99BAB071F5CF/iTunes64Setup.exe + URL + https://secure-appldnld.apple.com/itunes12/091-76320-20180329-6D5B23D2-32F7-11E8-993D-9ABAB071F5CF/iTunesSetup.exe + UploadDate + 2018-03-29T02:20:22Z + Version + 12.7.4 + + + + example2: + value: > + + + + + + + + Datefound + 2018-06-10T00:00:00Z + Platform + Mac OS X + ReleaseDate + 2018-06-10T00:00:00Z + SixtyFourBitURL + + URL + https://secure-appldnld.apple.com/itunes12/091-81690-20180709-3C97E2AB-D6CC-4B92-B290-2F21E56F6F70/iTunes12.8.dmg + UploadDate + 2018-06-10T00:00:00Z + Version + 12.8 + + + Datefound + 2018-05-29T00:00:00Z + Platform + Mac OS X + ReleaseDate + 2018-05-29T00:00:00Z + SixtyFourBitURL + + URL + https://secure-appldnld.apple.com/itunes12/091-81932-20180529-DAFCC9F2-5F77-11E8-B1FB-4E9A897FD268/iTunes12.7.5.dmg + UploadDate + 2018-05-29T00:00:00Z + Version + 12.7.5 + + + Datefound + 2018-03-29T00:57:43Z + Platform + Mac OS X + ReleaseDate + 2018-03-29T21:49:29Z + SixtyFourBitURL + + URL + https://secure-appldnld.apple.com/itunes12/091-76329-20180329-89A41942-32EB-11E8-9560-CEB2B071F5CF/iTunes12.7.4.dmg + UploadDate + 2018-03-29T00:57:43Z + Version + 12.7.4 + + + Datefound + 2018-01-23T03:17:51Z + Platform + Mac OS X + ReleaseDate + 2018-02-27T18:12:43Z + SixtyFourBitURL + + URL + https://secure-appldnld.apple.com/itunes12/091-44972-20180123-72201340-FFEA-11E7-9647-DA8C65562ECE/iTunes12.7.3.dmg + UploadDate + 2018-01-23T03:17:51Z + Version + 12.7.3 + + + + application/xml: + examples: + example1: + value: | + + + + Windows + 12.9 + 2018-09-25T00:00:00Z + https://secure-appldnld.apple.com/itunes12/041-02279-20180912-24D8EE3A-AC7A-11E8-BE19-C36F1B1141A5/iTunesSetup.exe + https://secure-appldnld.apple.com/itunes12/041-02280-20180912-24D8CF68-AC7A-11E8-8B51-C26F1B1141A5/iTunes64Setup.exe + 2018-09-25T00:00:00Z + 2018-09-25T00:00:00Z + + + Windows + 12.8 + 2018-06-10T00:00:00Z + https://secure-appldnld.apple.com/itunes12/091-81691-20180709-C98EBAE5-D5C5-41EC-9847-A5F71D9C4437/iTunesSetup.exe + https://secure-appldnld.apple.com/itunes12/091-81692-20180709-A4DF288B-8929-401F-AD73-4189359D8A6B/iTunes64Setup.exe + 2018-06-10T00:00:00Z + 2018-06-10T00:00:00Z + + + Windows + 12.7.5 + 2018-05-29T00:00:00Z + https://secure-appldnld.apple.com/itunes12/091-81943-20180529-DAFD73DE-5F77-11E8-AF1E-509A897FD268/iTunesSetup.exe + https://secure-appldnld.apple.com/itunes12/091-81934-20180529-DAFCAAD0-5F77-11E8-99A3-4F9A897FD268/iTunes64Setup.exe + 2018-05-29T00:00:00Z + 2018-05-29T00:00:00Z + + + Windows + 12.7.4 + 2018-03-29T02:20:22Z + https://secure-appldnld.apple.com/itunes12/091-76320-20180329-6D5B23D2-32F7-11E8-993D-9ABAB071F5CF/iTunesSetup.exe + https://secure-appldnld.apple.com/itunes12/091-76333-20180329-6D5B026C-32F7-11E8-A675-99BAB071F5CF/iTunes64Setup.exe + 2018-03-30T18:33:03Z + 2018-03-29T02:20:22Z + + + example2: + value: | + + + + Mac OS X + 12.8 + 2018-06-10T00:00:00Z + https://secure-appldnld.apple.com/itunes12/091-81690-20180709-3C97E2AB-D6CC-4B92-B290-2F21E56F6F70/iTunes12.8.dmg + + 2018-06-10T00:00:00Z + 2018-06-10T00:00:00Z + + + Mac OS X + 12.7.5 + 2018-05-29T00:00:00Z + https://secure-appldnld.apple.com/itunes12/091-81932-20180529-DAFCC9F2-5F77-11E8-B1FB-4E9A897FD268/iTunes12.7.5.dmg + + 2018-05-29T00:00:00Z + 2018-05-29T00:00:00Z + + + Mac OS X + 12.7.4 + 2018-03-29T00:57:43Z + https://secure-appldnld.apple.com/itunes12/091-76329-20180329-89A41942-32EB-11E8-9560-CEB2B071F5CF/iTunes12.7.4.dmg + + 2018-03-29T21:49:29Z + 2018-03-29T00:57:43Z + + + Mac OS X + 12.7.3 + 2018-01-23T03:17:51Z + https://secure-appldnld.apple.com/itunes12/091-44972-20180123-72201340-FFEA-11E7-9647-DA8C65562ECE/iTunes12.7.3.dmg + + 2018-02-27T18:12:43Z + 2018-01-23T03:17:51Z + + + '404': + description: Not Found + headers: + Access-Control-Allow-Methods: + schema: + type: string + Access-Control-Allow-Origin: + schema: + type: string + X-Data-Location: + schema: + type: string + content: {} + summary: Find Itunes + operationId: itunesForPlatform + description: >- + FindItunes finds FindItunes versions for a given platform. specify + either "windows" or "macOS" + tags: + - Api + parameters: + - name: platform + in: path + description: '' + required: true + example: windows + schema: + type: string + + /keys/device/{identifier}: + get: + responses: + '200': + description: OK + headers: + Access-Control-Allow-Methods: + schema: + type: string + Access-Control-Allow-Origin: + schema: + type: string + Cache-Control: + schema: + type: string + Expires: + schema: + type: string + X-Data-Location: + schema: + type: string + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/FirmwareKey' + examples: + example1: + value: + - identifier: iPhone3,1 + buildid: 10A403 + codename: Sundance + baseband: 04.12.02 + updateramdiskexists: true + restoreramdiskexists: true + - identifier: iPhone3,1 + buildid: 10A523 + codename: Sundance + baseband: 04.12.02 + updateramdiskexists: true + restoreramdiskexists: true + - identifier: iPhone3,1 + buildid: 10B144 + codename: Brighton + baseband: 04.12.05 + updateramdiskexists: true + restoreramdiskexists: true + - identifier: iPhone3,1 + buildid: 10B146 + codename: Brighton + baseband: 04.12.05 + updateramdiskexists: true + restoreramdiskexists: true + example2: + value: + - identifier: iPad2,4 + buildid: 10A403 + codename: Sundance + updateramdiskexists: true + restoreramdiskexists: true + - identifier: iPad2,4 + buildid: 10A523 + codename: Sundance + updateramdiskexists: true + restoreramdiskexists: true + - identifier: iPad2,4 + buildid: 10B141 + codename: Brighton + updateramdiskexists: true + restoreramdiskexists: true + - identifier: iPad2,4 + buildid: 10B146 + codename: Brighton + updateramdiskexists: true + restoreramdiskexists: true + example3: + value: + - identifier: iPod1,1 + buildid: 3A101a + codename: Snowbird + updateramdiskexists: true + restoreramdiskexists: true + - identifier: iPod1,1 + buildid: 3A110a + codename: Snowbird + updateramdiskexists: true + restoreramdiskexists: true + - identifier: iPod1,1 + buildid: 3B48b + codename: Oktoberfest + updateramdiskexists: true + restoreramdiskexists: true + - identifier: iPod1,1 + buildid: 4A102 + codename: Little Bear + updateramdiskexists: true + restoreramdiskexists: true + application/x-plist: + examples: + example1: + value: > + + + + + + + + Baseband + 04.12.02 + BuildID + 10A403 + CodeName + Sundance + Identifier + iPhone3,1 + Keys + + + RestoreRamdiskExists + + UpdateRamdiskExists + + + + Baseband + 04.12.02 + BuildID + 10A523 + CodeName + Sundance + Identifier + iPhone3,1 + Keys + + + RestoreRamdiskExists + + UpdateRamdiskExists + + + + Baseband + 04.12.05 + BuildID + 10B144 + CodeName + Brighton + Identifier + iPhone3,1 + Keys + + + RestoreRamdiskExists + + UpdateRamdiskExists + + + + Baseband + 04.12.05 + BuildID + 10B146 + CodeName + Brighton + Identifier + iPhone3,1 + Keys + + + RestoreRamdiskExists + + UpdateRamdiskExists + + + + + example2: + value: > + + + + + + + + Baseband + + BuildID + 10A403 + CodeName + Sundance + Identifier + iPad2,4 + Keys + + + RestoreRamdiskExists + + UpdateRamdiskExists + + + + Baseband + + BuildID + 10A523 + CodeName + Sundance + Identifier + iPad2,4 + Keys + + + RestoreRamdiskExists + + UpdateRamdiskExists + + + + Baseband + + BuildID + 10B141 + CodeName + Brighton + Identifier + iPad2,4 + Keys + + + RestoreRamdiskExists + + UpdateRamdiskExists + + + + Baseband + + BuildID + 10B146 + CodeName + Brighton + Identifier + iPad2,4 + Keys + + + RestoreRamdiskExists + + UpdateRamdiskExists + + + + + example3: + value: > + + + + + + + + Baseband + + BuildID + 3A101a + CodeName + Snowbird + Identifier + iPod1,1 + Keys + + + RestoreRamdiskExists + + UpdateRamdiskExists + + + + Baseband + + BuildID + 3A110a + CodeName + Snowbird + Identifier + iPod1,1 + Keys + + + RestoreRamdiskExists + + UpdateRamdiskExists + + + + Baseband + + BuildID + 3B48b + CodeName + Oktoberfest + Identifier + iPod1,1 + Keys + + + RestoreRamdiskExists + + UpdateRamdiskExists + + + + Baseband + + BuildID + 4A102 + CodeName + Little Bear + Identifier + iPod1,1 + Keys + + + RestoreRamdiskExists + + UpdateRamdiskExists + + + + + application/xml: + examples: + example1: + value: | + + + + iPhone3,1 + 10A403 + Sundance + 04.12.02 + true + true + + + iPhone3,1 + 10A523 + Sundance + 04.12.02 + true + true + + + iPhone3,1 + 10B144 + Brighton + 04.12.05 + true + true + + + iPhone3,1 + 10B146 + Brighton + 04.12.05 + true + true + + + example2: + value: | + + + + iPad2,4 + 10A403 + Sundance + + true + true + + + iPad2,4 + 10A523 + Sundance + + true + true + + + iPad2,4 + 10B141 + Brighton + + true + true + + + iPad2,4 + 10B146 + Brighton + + true + true + + + example3: + value: | + + + + iPod1,1 + 3A101a + Snowbird + + true + true + + + iPod1,1 + 3A110a + Snowbird + + true + true + + + iPod1,1 + 3B48b + Oktoberfest + + true + true + + + iPod1,1 + 4A102 + Little Bear + + true + true + + + '404': + description: Not Found + headers: + Access-Control-Allow-Methods: + schema: + type: string + Access-Control-Allow-Origin: + schema: + type: string + X-Data-Location: + schema: + type: string + content: {} + summary: Keys Device List + operationId: firmwareKeysForIdentifier + description: KeysDeviceList returns the firmwares which have keys for a given device + tags: + - Api + parameters: + - name: identifier + in: path + description: '' + required: true + example: iPhone3,1 + schema: + type: string + + /keys/ipsw/{identifier}/{buildid}: + get: + responses: + '200': + description: OK + headers: + Access-Control-Allow-Methods: + schema: + type: string + Access-Control-Allow-Origin: + schema: + type: string + Cache-Control: + schema: + type: string + Expires: + schema: + type: string + X-Data-Location: + schema: + type: string + content: + application/json: + schema: + type: array + items: + schema: + $ref: '#/components/schemas/FirmwareKey' + examples: + example1: + value: + identifier: AppleTV3,1 + buildid: 10B329a + codename: BrightonMaps + updateramdiskexists: false + restoreramdiskexists: true + keys: + - image: GlyphCharging + filename: >- + Firmware/all_flash/all_flash.j33ap.production/glyphcharging.s5l8942x.img3 + kbag: '' + key: >- + 9ea5d333ccc82b7a9668f8d542f783fc0775b866baf0081c2a2c766a82fd4737 + iv: 1083ac52737244647753ff38f2d96e4c + date: '2017-08-28T14:54:24Z' + - image: Kernelcache + filename: kernelcache.release.j33 + kbag: '' + key: >- + 40cfe04545e040890777ff473b97a9899dcde3bb4b1c57e842033a864f953543 + iv: 5259656a5699f44553c2ee05abb58090 + date: '2017-08-28T14:54:24Z' + - image: BatteryLow0 + filename: >- + Firmware/all_flash/all_flash.j33ap.production/batterylow0.s5l8942x.img3 + kbag: '' + key: >- + f313f30c7194d755339749082c086ac9df450ab0363f6875284fc53987ce784e + iv: f10718ca4e30b4449fdc398068445547 + date: '2017-08-28T14:54:24Z' + - image: RootFS + filename: 048-2924-001.dmg + kbag: '' + key: >- + 69504518c7c4d251cbd19c3cc8e7546aab98f0db26fc5078614a33e732e766e9ec8f5872 + iv: '' + date: '2017-08-28T14:54:24Z' + example2: + value: + identifier: iPhone5,4 + buildid: 12A402 + codename: Okemo + baseband: '0' + updateramdiskexists: true + restoreramdiskexists: true + keys: + - image: AppleLogo + filename: >- + Firmware/all_flash/all_flash.n49ap.production/applelogo@2x~iphone.s5l8950x.img3 + kbag: >- + 5c53f34107d09bf829b38a95b26f964a6e85d80f3243da6702bfa19e53c35feab18d253bcb995fbc81d131866413a6ae + key: >- + 6f175ccf6e6c980ab6d6eb7a80622fde81464a65632b5c1b289e66c52ecec567 + iv: 3f21235489e5c5e6092f65c4b63e054e + date: '2015-07-30T00:00:00Z' + - image: BatteryCharging0 + filename: >- + Firmware/all_flash/all_flash.n49ap.production/batterycharging0@2x~iphone.s5l8950x.img3 + kbag: >- + 460ecb620de1a813aa324124f837f68896d3b54c3863c00c6353a10129565e7f6c81ddd62cced616fc31fffb790a9abc + key: >- + 826d846c57a54ffef170966068f710c02247b72fc7b5e16b6cd2f592b72c23e7 + iv: 5c5ed07d75e56102fea8576ac139eee7 + date: '2015-07-30T00:00:00Z' + - image: BatteryCharging1 + filename: >- + Firmware/all_flash/all_flash.n49ap.production/batterycharging1@2x~iphone.s5l8950x.img3 + kbag: >- + 952e783be27a07a0ac607ebcdf81b3256e3652bf3c5fcf3c64f67ea160713fc4e9fdc93566fee2a60e249c314a38cba9 + key: >- + 7281fead490bd2c262f60b9d9ccdbee964b60e127ad9e513bcf61a020da2857c + iv: eb88c863ed92d4b43afdbb90a44f552c + date: '2015-07-30T00:00:00Z' + - image: BatteryFull + filename: >- + Firmware/all_flash/all_flash.n49ap.production/batteryfull@2x~iphone.s5l8950x.img3 + kbag: >- + ee0b0eedb38f49528536263db03f5d356440d6fadf217e8eb23e16d10c2e1273301e7b50c440ca575f09a1d849e7f10d + key: >- + cc62578e3ea833dab8c754e370a1e8ee4898f55d21f30e1e78b68ebc21497ff1 + iv: 933400ada3afbee673e01118b16831f7 + date: '2015-07-30T00:00:00Z' + application/x-plist: + examples: + example1: + value: > + + + + + + + Baseband + + BuildID + 10B329a + CodeName + BrightonMaps + Identifier + AppleTV3,1 + Keys + + + BuildID + 10B329a + Date + 2017-08-28T14:54:24Z + Filename + Firmware/all_flash/all_flash.j33ap.production/glyphcharging.s5l8942x.img3 + IV + 1083ac52737244647753ff38f2d96e4c + Identifier + AppleTV3,1 + Image + GlyphCharging + KBag + + Key + 9ea5d333ccc82b7a9668f8d542f783fc0775b866baf0081c2a2c766a82fd4737 + + + BuildID + 10B329a + Date + 2017-08-28T14:54:24Z + Filename + kernelcache.release.j33 + IV + 5259656a5699f44553c2ee05abb58090 + Identifier + AppleTV3,1 + Image + Kernelcache + KBag + + Key + 40cfe04545e040890777ff473b97a9899dcde3bb4b1c57e842033a864f953543 + + + BuildID + 10B329a + Date + 2017-08-28T14:54:24Z + Filename + Firmware/all_flash/all_flash.j33ap.production/batterylow0.s5l8942x.img3 + IV + f10718ca4e30b4449fdc398068445547 + Identifier + AppleTV3,1 + Image + BatteryLow0 + KBag + + Key + f313f30c7194d755339749082c086ac9df450ab0363f6875284fc53987ce784e + + + BuildID + 10B329a + Date + 2017-08-28T14:54:24Z + Filename + 048-2924-001.dmg + IV + + Identifier + AppleTV3,1 + Image + RootFS + KBag + + Key + 69504518c7c4d251cbd19c3cc8e7546aab98f0db26fc5078614a33e732e766e9ec8f5872 + + + RestoreRamdiskExists + + UpdateRamdiskExists + + + + example2: + value: > + + + + + + + Baseband + 0 + BuildID + 12A402 + CodeName + Okemo + Identifier + iPhone5,4 + Keys + + + BuildID + 12A402 + Date + 2015-07-30T00:00:00Z + Filename + Firmware/all_flash/all_flash.n49ap.production/applelogo@2x~iphone.s5l8950x.img3 + IV + 3f21235489e5c5e6092f65c4b63e054e + Identifier + iPhone5,4 + Image + AppleLogo + KBag + 5c53f34107d09bf829b38a95b26f964a6e85d80f3243da6702bfa19e53c35feab18d253bcb995fbc81d131866413a6ae + Key + 6f175ccf6e6c980ab6d6eb7a80622fde81464a65632b5c1b289e66c52ecec567 + + + BuildID + 12A402 + Date + 2015-07-30T00:00:00Z + Filename + Firmware/all_flash/all_flash.n49ap.production/batterycharging0@2x~iphone.s5l8950x.img3 + IV + 5c5ed07d75e56102fea8576ac139eee7 + Identifier + iPhone5,4 + Image + BatteryCharging0 + KBag + 460ecb620de1a813aa324124f837f68896d3b54c3863c00c6353a10129565e7f6c81ddd62cced616fc31fffb790a9abc + Key + 826d846c57a54ffef170966068f710c02247b72fc7b5e16b6cd2f592b72c23e7 + + + BuildID + 12A402 + Date + 2015-07-30T00:00:00Z + Filename + Firmware/all_flash/all_flash.n49ap.production/batterycharging1@2x~iphone.s5l8950x.img3 + IV + eb88c863ed92d4b43afdbb90a44f552c + Identifier + iPhone5,4 + Image + BatteryCharging1 + KBag + 952e783be27a07a0ac607ebcdf81b3256e3652bf3c5fcf3c64f67ea160713fc4e9fdc93566fee2a60e249c314a38cba9 + Key + 7281fead490bd2c262f60b9d9ccdbee964b60e127ad9e513bcf61a020da2857c + + + BuildID + 12A402 + Date + 2015-07-30T00:00:00Z + Filename + Firmware/all_flash/all_flash.n49ap.production/batteryfull@2x~iphone.s5l8950x.img3 + IV + 933400ada3afbee673e01118b16831f7 + Identifier + iPhone5,4 + Image + BatteryFull + KBag + ee0b0eedb38f49528536263db03f5d356440d6fadf217e8eb23e16d10c2e1273301e7b50c440ca575f09a1d849e7f10d + Key + cc62578e3ea833dab8c754e370a1e8ee4898f55d21f30e1e78b68ebc21497ff1 + + + RestoreRamdiskExists + + UpdateRamdiskExists + + + + application/xml: + examples: + example1: + value: | + + + + AppleTV3,1 + 10B329a + BrightonMaps + + false + true + + AppleTV3,1 + 10B329a + GlyphCharging + Firmware/all_flash/all_flash.j33ap.production/glyphcharging.s5l8942x.img3 + + 9ea5d333ccc82b7a9668f8d542f783fc0775b866baf0081c2a2c766a82fd4737 + 1083ac52737244647753ff38f2d96e4c + 2017-08-28T14:54:24Z + + + AppleTV3,1 + 10B329a + Kernelcache + kernelcache.release.j33 + + 40cfe04545e040890777ff473b97a9899dcde3bb4b1c57e842033a864f953543 + 5259656a5699f44553c2ee05abb58090 + 2017-08-28T14:54:24Z + + + AppleTV3,1 + 10B329a + BatteryLow0 + Firmware/all_flash/all_flash.j33ap.production/batterylow0.s5l8942x.img3 + + f313f30c7194d755339749082c086ac9df450ab0363f6875284fc53987ce784e + f10718ca4e30b4449fdc398068445547 + 2017-08-28T14:54:24Z + + + AppleTV3,1 + 10B329a + RootFS + 048-2924-001.dmg + + 69504518c7c4d251cbd19c3cc8e7546aab98f0db26fc5078614a33e732e766e9ec8f5872 + + 2017-08-28T14:54:24Z + + + + example2: + value: | + + + + iPhone5,4 + 12A402 + Okemo + 0 + true + true + + iPhone5,4 + 12A402 + AppleLogo + Firmware/all_flash/all_flash.n49ap.production/applelogo@2x~iphone.s5l8950x.img3 + 5c53f34107d09bf829b38a95b26f964a6e85d80f3243da6702bfa19e53c35feab18d253bcb995fbc81d131866413a6ae + 6f175ccf6e6c980ab6d6eb7a80622fde81464a65632b5c1b289e66c52ecec567 + 3f21235489e5c5e6092f65c4b63e054e + 2015-07-30T00:00:00Z + + + iPhone5,4 + 12A402 + BatteryCharging0 + Firmware/all_flash/all_flash.n49ap.production/batterycharging0@2x~iphone.s5l8950x.img3 + 460ecb620de1a813aa324124f837f68896d3b54c3863c00c6353a10129565e7f6c81ddd62cced616fc31fffb790a9abc + 826d846c57a54ffef170966068f710c02247b72fc7b5e16b6cd2f592b72c23e7 + 5c5ed07d75e56102fea8576ac139eee7 + 2015-07-30T00:00:00Z + + + iPhone5,4 + 12A402 + BatteryCharging1 + Firmware/all_flash/all_flash.n49ap.production/batterycharging1@2x~iphone.s5l8950x.img3 + 952e783be27a07a0ac607ebcdf81b3256e3652bf3c5fcf3c64f67ea160713fc4e9fdc93566fee2a60e249c314a38cba9 + 7281fead490bd2c262f60b9d9ccdbee964b60e127ad9e513bcf61a020da2857c + eb88c863ed92d4b43afdbb90a44f552c + 2015-07-30T00:00:00Z + + + iPhone5,4 + 12A402 + BatteryFull + Firmware/all_flash/all_flash.n49ap.production/batteryfull@2x~iphone.s5l8950x.img3 + ee0b0eedb38f49528536263db03f5d356440d6fadf217e8eb23e16d10c2e1273301e7b50c440ca575f09a1d849e7f10d + cc62578e3ea833dab8c754e370a1e8ee4898f55d21f30e1e78b68ebc21497ff1 + 933400ada3afbee673e01118b16831f7 + 2015-07-30T00:00:00Z + + + + '404': + description: Not Found + headers: + Access-Control-Allow-Methods: + schema: + type: string + Access-Control-Allow-Origin: + schema: + type: string + X-Data-Location: + schema: + type: string + content: {} + summary: Keys For IPSW + operationId: firmwareKeysForIdentifierAndBuild + description: KeysForIPSW returns FirmwareKeys for a given IPSW + tags: + - Api + parameters: + - name: identifier + in: path + description: '' + required: true + example: AppleTV3,1 + schema: + type: string + - name: buildid + in: path + description: '' + required: true + example: 10B329a + schema: + type: string + + /model/{model}: + get: + responses: + '200': + description: OK + headers: + Access-Control-Allow-Methods: + schema: + type: string + Access-Control-Allow-Origin: + schema: + type: string + Cache-Control: + schema: + type: string + Expires: + schema: + type: string + X-Data-Location: + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/Model' + examples: + example1: + value: + identifier: iPad7,1 + example2: + value: + identifier: iPod5,1 + application/x-plist: + examples: + example1: + value: > + + + + + + + Identifier + iPad7,1 + + + example2: + value: > + + + + + + + Identifier + iPod5,1 + + + application/xml: + examples: + example1: + value: | + + + + iPad7,1 + + + example2: + value: | + + + + iPod5,1 + + + '404': + description: Not Found + headers: + Access-Control-Allow-Methods: + schema: + type: string + Access-Control-Allow-Origin: + schema: + type: string + X-Data-Location: + schema: + type: string + content: {} + summary: Identify Model + operationId: identifierForModel + description: IdentifyModel finds the identifier of a given model number + tags: + - Api + parameters: + - name: model + in: path + description: '' + required: true + example: A1670 + schema: + type: string + + /ota/documentation/{device}/{version}: + get: + responses: + '200': + description: OK + headers: + Access-Control-Allow-Methods: + schema: + type: string + Access-Control-Allow-Origin: + schema: + type: string + Cache-Control: + schema: + type: string + Expires: + schema: + type: string + X-Data-Location: + schema: + type: string + X-Frame-Options: + schema: + type: string + content: + text/html: + examples: + example1: + value: | + This is an example OTA documentation HTML result. + example2: + value: | + This is an example OTA documentation HTML result. + '404': + description: Not Found + headers: + Access-Control-Allow-Methods: + schema: + type: string + Access-Control-Allow-Origin: + schema: + type: string + Cache-Control: + schema: + type: string + Expires: + schema: + type: string + X-Data-Location: + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundDetails' + example: + status: 404 + message: not found + summary: OTA Documentation + operationId: otaDocumentationForDeviceAndVersion + description: >- + OTADocumentation returns the documentation for a given device type and + version + tags: + - Api + parameters: + - name: device + in: path + description: '' + required: true + example: iPhone + schema: + type: string + - name: version + in: path + description: '' + required: true + example: '11.2' + schema: + type: number + /ota/download/{identifier}/{buildid}: + get: + responses: + '302': + description: Found + headers: + Access-Control-Allow-Methods: + schema: + type: string + Access-Control-Allow-Origin: + schema: + type: string + Location: + schema: + type: string + content: + text/html; charset=utf-8: + example: > + Found. + summary: Download OTA + operationId: otaDownloadForIdentifierAndBuild + description: >- + DownloadOTA redirects to download an OTA Firmware as specified by its + identifier, buildid and optionally prerequisite + tags: + - Api + parameters: + - name: identifier + in: path + description: '' + required: true + example: iPhone3,3 + schema: + type: string + - name: buildid + in: path + description: '' + required: true + example: 11D201 + schema: + type: string + - name: prerequisite + in: query + description: '' + required: true + example: 11D167 + schema: + type: string + /ota/{identifier}/{buildid}: + get: + responses: + '200': + description: OK + headers: + Access-Control-Allow-Methods: + schema: + type: string + Access-Control-Allow-Origin: + schema: + type: string + Cache-Control: + schema: + type: string + Expires: + schema: + type: string + X-Data-Location: + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/OTA' + example: + identifier: iPhone3,3 + buildid: 11D201 + version: 7.1.1 + url: >- + http://appldnld.apple.com/iOS7.1/031-00205.20140425.Th1s3/com_apple_MobileAsset_SoftwareUpdate/eca55b74f8f6539d000d9148f38cfe6eb5717cda.zip + filesize: 16299751 + prerequisitebuildid: 11D167 + prerequisiteversion: '7.1' + releasetype: 'null' + uploaddate: '2014-04-15T15:25:54Z' + releasedate: '2014-04-22T17:56:18Z' + marketingversion: null + signed: false + application/x-plist: + example: > + + + + + + + BuildID + 11D201 + Filesize + 16299751 + Identifier + iPhone3,3 + MarketingVersion + + PrerequisiteBuild + 11D167 + PrerequisiteVersion + 7.1 + ReleaseDate + 2014-04-22T17:56:18Z + Releasetype + null + Signed + + URL + http://appldnld.apple.com/iOS7.1/031-00205.20140425.Th1s3/com_apple_MobileAsset_SoftwareUpdate/eca55b74f8f6539d000d9148f38cfe6eb5717cda.zip + UploadDate + 2014-04-15T15:25:54Z + Version + 7.1.1 + + + application/xml: + example: | + + + + iPhone3,3 + 11D201 + 7.1.1 + http://appldnld.apple.com/iOS7.1/031-00205.20140425.Th1s3/com_apple_MobileAsset_SoftwareUpdate/eca55b74f8f6539d000d9148f38cfe6eb5717cda.zip + 16299751 + 11D167 + 7.1 + null + 2014-04-15T15:25:54Z + 2014-04-22T17:56:18Z + + false + + + summary: Get OTA Information + operationId: otaInformationForIdentifierAndBuild + description: >- + GetOTAInformation returns all known information for an OTA specified by + its identifier and build (and optionally + + prerequisite firmware) + tags: + - Api + parameters: + - name: identifier + in: path + description: '' + required: true + example: iPhone3,3 + schema: + type: string + - name: buildid + in: path + description: '' + required: true + example: 11D201 + schema: + type: string + - name: prerequisite + in: query + description: '' + required: true + example: 11D167 + schema: + type: string + + /ota/{version}: + get: + responses: + '200': + description: OK + headers: + Access-Control-Allow-Methods: + schema: + type: string + Access-Control-Allow-Origin: + schema: + type: string + Cache-Control: + schema: + type: string + Expires: + schema: + type: string + X-Data-Location: + schema: + type: string + content: + application/json: + schema: + type: array + items: + schema: + $ref: '#/components/schemas/OTA' + examples: + example1: + value: + - identifier: AppleTV3,1 + buildid: 12A365b + version: '8.0' + url: >- + http://appldnld.apple.com/iOS8/031-05657.20140917.LLFDi/com_apple_MobileAsset_SoftwareUpdate/abf42e951ff9397c6bb288e722d8811b3d7f11a2.zip + filesize: 541919807 + prerequisitebuildid: 11D169b + prerequisiteversion: '7.1' + releasetype: 'null' + uploaddate: '2014-09-09T05:55:40Z' + releasedate: '2014-09-17T17:54:04Z' + marketingversion: null + signed: false + - identifier: AppleTV3,1 + buildid: 12A365b + version: '8.0' + url: >- + http://appldnld.apple.com/iOS8/031-05644.20140917.aZNEo/com_apple_MobileAsset_SoftwareUpdate/90a74d5acbde4aec4191b2513272011b66ebdf84.zip + filesize: 541908385 + prerequisitebuildid: 11D201c + prerequisiteversion: 7.1.1 + releasetype: 'null' + uploaddate: '2014-09-09T05:55:19Z' + releasedate: '2014-09-17T17:54:04Z' + marketingversion: null + signed: false + - identifier: AppleTV3,1 + buildid: 12A365b + version: '8.0' + url: >- + http://appldnld.apple.com/iOS8/031-05616.20140917.jYJmH/com_apple_MobileAsset_SoftwareUpdate/38b2fe1810f1fa57fd346b88f3b7d19e6fb1d128.zip + filesize: 541828041 + prerequisitebuildid: 11D257c + prerequisiteversion: 7.1.2 + releasetype: 'null' + uploaddate: '2014-09-09T05:47:45Z' + releasedate: '2014-09-17T17:54:04Z' + marketingversion: null + signed: false + - identifier: AppleTV3,1 + buildid: 12A5365b + version: '8.0' + url: >- + http://appldnld.apple.com/iOS8/031-05408.20140917.uPtTD/com_apple_MobileAsset_SoftwareUpdate/0dd5a269619de15c1ff64577034e88fb98eae60b.zip + filesize: 931428635 + prerequisitebuildid: 12A4345d + prerequisiteversion: '8.0' + releasetype: Beta + uploaddate: '2014-09-09T05:43:28Z' + releasedate: '2014-09-17T17:54:02Z' + marketingversion: null + signed: false + example2: + value: + - identifier: iPad3,4 + buildid: 14G60 + version: 10.3.3 + url: >- + http://appldnld.apple.com/ios10.3.3/091-23239-20170719-77F53FDC-6992-11E7-B3A1-7C034A4DD6D5/com_apple_MobileAsset_SoftwareUpdate/cb7b5863ff3bd4c635976294d602eda576479cef.zip + filesize: 514599537 + prerequisitebuildid: 14A346 + prerequisiteversion: '10.0' + releasetype: '' + uploaddate: '2017-07-15T19:32:55Z' + releasedate: '2017-07-19T16:58:07Z' + marketingversion: null + signed: false + - identifier: iPad3,4 + buildid: 14G60 + version: 10.3.3 + url: >- + http://appldnld.apple.com/ios10.3.3/091-23239-20170719-77F53FDC-6992-11E7-B3A1-7C034A4DD6D5/com_apple_MobileAsset_SoftwareUpdate/cb7b5863ff3bd4c635976294d602eda576479cef.zip + filesize: 514599537 + prerequisitebuildid: 14B72 + prerequisiteversion: '10.1' + releasetype: '' + uploaddate: '2017-07-15T19:32:55Z' + releasedate: '2017-07-19T16:58:11Z' + marketingversion: null + signed: false + - identifier: iPad3,4 + buildid: 14G60 + version: 10.3.3 + url: >- + http://appldnld.apple.com/ios10.3.3/091-23239-20170719-77F53FDC-6992-11E7-B3A1-7C034A4DD6D5/com_apple_MobileAsset_SoftwareUpdate/cb7b5863ff3bd4c635976294d602eda576479cef.zip + filesize: 514599537 + prerequisitebuildid: 14B150 + prerequisiteversion: 10.1.1 + releasetype: '' + uploaddate: '2017-07-15T19:32:55Z' + releasedate: '2017-07-19T16:58:11Z' + marketingversion: null + signed: false + - identifier: iPad3,4 + buildid: 14G60 + version: 10.3.3 + url: >- + http://appldnld.apple.com/ios10.3.3/091-23239-20170719-77F53FDC-6992-11E7-B3A1-7C034A4DD6D5/com_apple_MobileAsset_SoftwareUpdate/cb7b5863ff3bd4c635976294d602eda576479cef.zip + filesize: 514599537 + prerequisitebuildid: 14B100 + prerequisiteversion: 10.1.1 + releasetype: '' + uploaddate: '2017-07-15T19:32:55Z' + releasedate: '2017-07-19T16:58:10Z' + marketingversion: null + signed: false + application/x-plist: + examples: + example1: + value: > + + + + + + + + BuildID + 12A365b + Filesize + 541919807 + Identifier + AppleTV3,1 + MarketingVersion + + PrerequisiteBuild + 11D169b + PrerequisiteVersion + 7.1 + ReleaseDate + 2014-09-17T17:54:04Z + Releasetype + null + Signed + + URL + http://appldnld.apple.com/iOS8/031-05657.20140917.LLFDi/com_apple_MobileAsset_SoftwareUpdate/abf42e951ff9397c6bb288e722d8811b3d7f11a2.zip + UploadDate + 2014-09-09T05:55:40Z + Version + 8.0 + + + BuildID + 12A365b + Filesize + 541908385 + Identifier + AppleTV3,1 + MarketingVersion + + PrerequisiteBuild + 11D201c + PrerequisiteVersion + 7.1.1 + ReleaseDate + 2014-09-17T17:54:04Z + Releasetype + null + Signed + + URL + http://appldnld.apple.com/iOS8/031-05644.20140917.aZNEo/com_apple_MobileAsset_SoftwareUpdate/90a74d5acbde4aec4191b2513272011b66ebdf84.zip + UploadDate + 2014-09-09T05:55:19Z + Version + 8.0 + + + BuildID + 12A365b + Filesize + 541828041 + Identifier + AppleTV3,1 + MarketingVersion + + PrerequisiteBuild + 11D257c + PrerequisiteVersion + 7.1.2 + ReleaseDate + 2014-09-17T17:54:04Z + Releasetype + null + Signed + + URL + http://appldnld.apple.com/iOS8/031-05616.20140917.jYJmH/com_apple_MobileAsset_SoftwareUpdate/38b2fe1810f1fa57fd346b88f3b7d19e6fb1d128.zip + UploadDate + 2014-09-09T05:47:45Z + Version + 8.0 + + + BuildID + 12A5365b + Filesize + 931428635 + Identifier + AppleTV3,1 + MarketingVersion + + PrerequisiteBuild + 12A4345d + PrerequisiteVersion + 8.0 + ReleaseDate + 2014-09-17T17:54:02Z + Releasetype + Beta + Signed + + URL + http://appldnld.apple.com/iOS8/031-05408.20140917.uPtTD/com_apple_MobileAsset_SoftwareUpdate/0dd5a269619de15c1ff64577034e88fb98eae60b.zip + UploadDate + 2014-09-09T05:43:28Z + Version + 8.0 + + + + example2: + value: > + + + + + + + + BuildID + 14G60 + Filesize + 514599537 + Identifier + iPad3,4 + MarketingVersion + + PrerequisiteBuild + 14A346 + PrerequisiteVersion + 10.0 + ReleaseDate + 2017-07-19T16:58:07Z + Releasetype + + Signed + + URL + http://appldnld.apple.com/ios10.3.3/091-23239-20170719-77F53FDC-6992-11E7-B3A1-7C034A4DD6D5/com_apple_MobileAsset_SoftwareUpdate/cb7b5863ff3bd4c635976294d602eda576479cef.zip + UploadDate + 2017-07-15T19:32:55Z + Version + 10.3.3 + + + BuildID + 14G60 + Filesize + 514599537 + Identifier + iPad3,4 + MarketingVersion + + PrerequisiteBuild + 14B72 + PrerequisiteVersion + 10.1 + ReleaseDate + 2017-07-19T16:58:11Z + Releasetype + + Signed + + URL + http://appldnld.apple.com/ios10.3.3/091-23239-20170719-77F53FDC-6992-11E7-B3A1-7C034A4DD6D5/com_apple_MobileAsset_SoftwareUpdate/cb7b5863ff3bd4c635976294d602eda576479cef.zip + UploadDate + 2017-07-15T19:32:55Z + Version + 10.3.3 + + + BuildID + 14G60 + Filesize + 514599537 + Identifier + iPad3,4 + MarketingVersion + + PrerequisiteBuild + 14B150 + PrerequisiteVersion + 10.1.1 + ReleaseDate + 2017-07-19T16:58:11Z + Releasetype + + Signed + + URL + http://appldnld.apple.com/ios10.3.3/091-23239-20170719-77F53FDC-6992-11E7-B3A1-7C034A4DD6D5/com_apple_MobileAsset_SoftwareUpdate/cb7b5863ff3bd4c635976294d602eda576479cef.zip + UploadDate + 2017-07-15T19:32:55Z + Version + 10.3.3 + + + BuildID + 14G60 + Filesize + 514599537 + Identifier + iPad3,4 + MarketingVersion + + PrerequisiteBuild + 14B100 + PrerequisiteVersion + 10.1.1 + ReleaseDate + 2017-07-19T16:58:10Z + Releasetype + + Signed + + URL + http://appldnld.apple.com/ios10.3.3/091-23239-20170719-77F53FDC-6992-11E7-B3A1-7C034A4DD6D5/com_apple_MobileAsset_SoftwareUpdate/cb7b5863ff3bd4c635976294d602eda576479cef.zip + UploadDate + 2017-07-15T19:32:55Z + Version + 10.3.3 + + + + application/xml: + examples: + example1: + value: | + + + + AppleTV3,1 + 12A365b + 8.0 + http://appldnld.apple.com/iOS8/031-05657.20140917.LLFDi/com_apple_MobileAsset_SoftwareUpdate/abf42e951ff9397c6bb288e722d8811b3d7f11a2.zip + 541919807 + 11D169b + 7.1 + null + 2014-09-09T05:55:40Z + 2014-09-17T17:54:04Z + + false + + + AppleTV3,1 + 12A365b + 8.0 + http://appldnld.apple.com/iOS8/031-05644.20140917.aZNEo/com_apple_MobileAsset_SoftwareUpdate/90a74d5acbde4aec4191b2513272011b66ebdf84.zip + 541908385 + 11D201c + 7.1.1 + null + 2014-09-09T05:55:19Z + 2014-09-17T17:54:04Z + + false + + + AppleTV3,1 + 12A365b + 8.0 + http://appldnld.apple.com/iOS8/031-05616.20140917.jYJmH/com_apple_MobileAsset_SoftwareUpdate/38b2fe1810f1fa57fd346b88f3b7d19e6fb1d128.zip + 541828041 + 11D257c + 7.1.2 + null + 2014-09-09T05:47:45Z + 2014-09-17T17:54:04Z + + false + + + AppleTV3,1 + 12A5365b + 8.0 + http://appldnld.apple.com/iOS8/031-05408.20140917.uPtTD/com_apple_MobileAsset_SoftwareUpdate/0dd5a269619de15c1ff64577034e88fb98eae60b.zip + 931428635 + 12A4345d + 8.0 + Beta + 2014-09-09T05:43:28Z + 2014-09-17T17:54:02Z + + false + + + example2: + value: | + + + + iPad3,4 + 14G60 + 10.3.3 + http://appldnld.apple.com/ios10.3.3/091-23239-20170719-77F53FDC-6992-11E7-B3A1-7C034A4DD6D5/com_apple_MobileAsset_SoftwareUpdate/cb7b5863ff3bd4c635976294d602eda576479cef.zip + 514599537 + 14A346 + 10.0 + + 2017-07-15T19:32:55Z + 2017-07-19T16:58:07Z + + false + + + iPad3,4 + 14G60 + 10.3.3 + http://appldnld.apple.com/ios10.3.3/091-23239-20170719-77F53FDC-6992-11E7-B3A1-7C034A4DD6D5/com_apple_MobileAsset_SoftwareUpdate/cb7b5863ff3bd4c635976294d602eda576479cef.zip + 514599537 + 14B72 + 10.1 + + 2017-07-15T19:32:55Z + 2017-07-19T16:58:11Z + + false + + + iPad3,4 + 14G60 + 10.3.3 + http://appldnld.apple.com/ios10.3.3/091-23239-20170719-77F53FDC-6992-11E7-B3A1-7C034A4DD6D5/com_apple_MobileAsset_SoftwareUpdate/cb7b5863ff3bd4c635976294d602eda576479cef.zip + 514599537 + 14B150 + 10.1.1 + + 2017-07-15T19:32:55Z + 2017-07-19T16:58:11Z + + false + + + iPad3,4 + 14G60 + 10.3.3 + http://appldnld.apple.com/ios10.3.3/091-23239-20170719-77F53FDC-6992-11E7-B3A1-7C034A4DD6D5/com_apple_MobileAsset_SoftwareUpdate/cb7b5863ff3bd4c635976294d602eda576479cef.zip + 514599537 + 14B100 + 10.1.1 + + 2017-07-15T19:32:55Z + 2017-07-19T16:58:10Z + + false + + + '404': + description: Not Found + headers: + Access-Control-Allow-Methods: + schema: + type: string + Access-Control-Allow-Origin: + schema: + type: string + X-Data-Location: + schema: + type: string + content: {} + summary: Get OTA List For Version + operationId: otasForVersion + description: GetOTAListForVersion finds all OTA files for a given iOS version + tags: + - Api + parameters: + - name: version + in: path + description: '' + required: true + example: '8.0' + schema: + type: number + + /releases: + get: + responses: + '200': + description: OK + headers: + Access-Control-Allow-Methods: + schema: + type: string + Access-Control-Allow-Origin: + schema: + type: string + Cache-Control: + schema: + type: string + Expires: + schema: + type: string + X-Data-Location: + schema: + type: string + content: + application/json: + schema: + type: array + items: + schema: + $ref: '#/components/schemas/ReleaseDate' + example: + - date: '2021-03-04' + releases: + - name: watchOS 5.3.9 (16U693) + date: '2021-03-04T13:42:36Z' + count: 200 + type: watchOS + - name: watchOS 6.3 (17U208) + date: '2021-03-04T13:42:46Z' + count: 80 + type: watchOS + - name: watchOS 6.3 (17U6208) + date: '2021-03-04T13:42:58Z' + count: 12 + type: watchOS + - name: watchOS 6.3 (17U216) + date: '2021-03-04T13:44:01Z' + count: 144 + type: watchOS + - date: '2020-11-18' + releases: + - name: iOS 11.0.1 (20B29) + date: '2020-11-18T00:06:43Z' + count: 4 + type: iOS + - date: '2019-10-16' + releases: + - name: watchOS 6.1 (17S5076a) + date: '2019-10-16T17:12:16Z' + count: 324 + type: watchOS + - date: '2019-10-15' + releases: + - name: iOS 13.1.3 (17A878) + date: '2019-10-15T17:00:26Z' + count: 51 + type: iOS + - name: iOS OTA 9.9.13.1.3 (17A878) + date: '2019-10-15T17:06:55Z' + count: 50 + type: iOS OTA + application/x-plist: + example: > + + + + + + + + Date + 2021-03-04 + Releases + + + Count + 200 + Date + 2021-03-04T13:42:36Z + Name + watchOS 5.3.9 (16U693) + Type + watchOS + + + Count + 80 + Date + 2021-03-04T13:42:46Z + Name + watchOS 6.3 (17U208) + Type + watchOS + + + Count + 12 + Date + 2021-03-04T13:42:58Z + Name + watchOS 6.3 (17U6208) + Type + watchOS + + + Count + 144 + Date + 2021-03-04T13:44:01Z + Name + watchOS 6.3 (17U216) + Type + watchOS + + + + + Date + 2020-11-18 + Releases + + + Count + 4 + Date + 2020-11-18T00:06:43Z + Name + iOS 11.0.1 (20B29) + Type + iOS + + + + + Date + 2019-10-16 + Releases + + + Count + 324 + Date + 2019-10-16T17:12:16Z + Name + watchOS 6.1 (17S5076a) + Type + watchOS + + + + + Date + 2019-10-15 + Releases + + + Count + 51 + Date + 2019-10-15T17:00:26Z + Name + iOS 13.1.3 (17A878) + Type + iOS + + + Count + 50 + Date + 2019-10-15T17:06:55Z + Name + iOS OTA 9.9.13.1.3 (17A878) + Type + iOS OTA + + + + + + application/xml: + example: | + + + + 2021-03-04 + + watchOS 5.3.9 (16U693) + 2021-03-04T13:42:36Z + 200 + watchOS + + + watchOS 6.3 (17U208) + 2021-03-04T13:42:46Z + 80 + watchOS + + + watchOS 6.3 (17U6208) + 2021-03-04T13:42:58Z + 12 + watchOS + + + watchOS 6.3 (17U216) + 2021-03-04T13:44:01Z + 144 + watchOS + + + + 2020-11-18 + + iOS 11.0.1 (20B29) + 2020-11-18T00:06:43Z + 4 + iOS + + + + 2019-10-16 + + watchOS 6.1 (17S5076a) + 2019-10-16T17:12:16Z + 324 + watchOS + + + + 2019-10-15 + + iOS 13.1.3 (17A878) + 2019-10-15T17:00:26Z + 51 + iOS + + + iOS OTA 9.9.13.1.3 (17A878) + 2019-10-15T17:06:55Z + 50 + iOS OTA + + + + summary: Releases + operationId: releases + description: >- + Releases returns the release timeline of all entities in the IPSW + Downloads database + tags: + - Api + parameters: + +components: + schemas: + NotFoundDetails: + type: object + properties: + status: + type: integer + message: + type: string + ReleaseDate: + type: object + properties: + date: + type: string + format: date + releases: + type: array + items: + schema: + $ref: '#/components/schemas/ReleaseEntry' + required: + - date + - releases + ReleaseEntry: + type: object + properties: + name: + type: string + date: + type: string + format: date-time + count: + type: integer + type: + type: string + required: + - name + - date + - count + - type + OTA: + type: object + properties: + identifier: + type: string + buildid: + type: string + version: + type: string + url: + type: string + filesize: + type: integer + prerequisitebuildid: + type: string + prerequisiteversion: + type: string + releasetype: + type: string + uploaddate: + type: string + format: date-time + releasedate: + type: string + format: date-time + marketingversion: + nullable: true + signed: + type: boolean + required: + - identifier + - buildid + - version + - url + - filesize + - prerequisitebuildid + - prerequisiteversion + - releasetype + - uploaddate + - releasedate + - marketingversion + - signed + Model: + type: object + properties: + identifier: + type: string + Key: + type: object + properties: + image: + type: string + filename: + type: string + kbag: + type: string + key: + type: string + iv: + type: string + date: + type: string + format: date-time + required: + - image + - filename + - kbag + - key + - iv + - date + FirmwareKey: + type: object + properties: + identifier: + type: string + buildid: + type: string + codename: + type: string + baseband: + type: string + updateramdiskexists: + type: boolean + restoreramdiskexists: + type: boolean + keys: + type: array + items: + $ref: '#/components/schemas/Key' + required: + - identifier + - buildid + - codename + - updateramdiskexists + - restoreramdiskexists + iTunes: + type: object + properties: + platform: + type: string + version: + type: string + datefound: + type: string + format: date-time + url: + type: string + format: uri + 64biturl: + type: string + format: uri + releasedate: + type: string + format: date-time + uploaddate: + type: string + format: date-time + required: + - platform + - version + - datefound + - url + - releasedate + - uploaddate + Board: + type: object + properties: + boardconfig: + type: string + platform: + type: string + cpid: + type: integer + bdid: + type: integer + required: + - boardconfig + - platform + - cpid + - bdid + Firmware: + type: object + required: + - identifier + - version + - buildid + - sha1sum + - md5sum + - filesize + - url + - releasedate + - uploaddate + - signed + properties: + identifier: + type: string + version: + type: string + buildid: + type: string + sha1sum: + type: string + md5sum: + type: string + filesize: + type: integer + url: + type: string + format: uri + releasedate: + type: string + format: date-time + uploaddate: + type: string + format: date-time + signed: + type: boolean + Device: + type: object + required: + - name + - identifier + - firmwares + - boards + properties: + name: + type: string + identifier: + type: string + firmwares: + type: array + items: + $ref: '#/components/schemas/Firmware' + boards: + type: array + items: + $ref: '#/components/schemas/Board' + boardconfig: + type: string + platform: + type: string + cpid: + type: integer + bdid: + type: integer +tags: + - name: Api + diff --git a/project.yml b/project.yml new file mode 100644 index 0000000..0fadf8f --- /dev/null +++ b/project.yml @@ -0,0 +1,15 @@ +name: IPSWDownloads +options: + preGenCommand: ./Scripts/generate.sh +settings: + LINT_MODE: ${LINT_MODE} +packages: + IPSWDownloads: + path: . +aggregateTargets: + Lint: + buildScripts: + - path: Scripts/lint.sh + name: Lint + basedOnDependencyAnalysis: false + schemes: {} \ No newline at end of file