Showing preview only (932K chars total). Download the full file or copy to clipboard to get everything.
Repository: yourkarma/JWT
Branch: master
Commit: 8414cafd0684
Files: 320
Total size: 837.8 KB
Directory structure:
gitextract_ums_flbi/
├── .github/
│ ├── CONTRIBUTING.md
│ ├── ISSUE_TEMPLATE.md
│ ├── PULL_REQUEST_TEMPLATE.md
│ └── workflows/
│ ├── library-builds.yaml
│ ├── unit-tests.yaml
│ └── validations.yaml
├── .gitignore
├── .gitmodules
├── .local_run_travis_script.sh
├── .travis.yml
├── Cartfile
├── Cartfile.resolved
├── Documentation/
│ └── Prerelease/
│ └── custom_claims.md
├── Example/
│ ├── JWTDesktop/
│ │ ├── JWTDesktop/
│ │ │ ├── AppDelegate.h
│ │ │ ├── AppDelegate.m
│ │ │ ├── Assets.xcassets/
│ │ │ │ └── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj/
│ │ │ │ └── Main.storyboard
│ │ │ ├── Info.plist
│ │ │ ├── JWTDecriptedCollectionViewItem.h
│ │ │ ├── JWTDecriptedCollectionViewItem.m
│ │ │ ├── JWTDecriptedCollectionViewItem.xib
│ │ │ ├── JWTDecriptedViewController.h
│ │ │ ├── JWTDecriptedViewController.m
│ │ │ ├── JWTDecriptedViewController.xib
│ │ │ ├── JWTTokenDecoder.h
│ │ │ ├── JWTTokenDecoder.m
│ │ │ ├── JWTTokenTextTypeDescription.h
│ │ │ ├── JWTTokenTextTypeDescription.m
│ │ │ ├── NSArrayExtension.h
│ │ │ ├── NSArrayExtension.m
│ │ │ ├── SignatureValidationDescription.h
│ │ │ ├── SignatureValidationDescription.m
│ │ │ ├── ViewController+Model.h
│ │ │ ├── ViewController+Model.m
│ │ │ ├── ViewController.h
│ │ │ ├── ViewController.m
│ │ │ └── main.m
│ │ ├── JWTDesktop.xcodeproj/
│ │ │ ├── project.pbxproj
│ │ │ └── project.xcworkspace/
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcshareddata/
│ │ │ └── IDEWorkspaceChecks.plist
│ │ └── JWTDesktopTests/
│ │ ├── Info.plist
│ │ └── JWTDesktopTests.m
│ ├── JWTDesktopSwift/
│ │ ├── JWTDesktopSwift/
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets/
│ │ │ │ └── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj/
│ │ │ │ └── Main.storyboard
│ │ │ ├── DecriptedCollectionViewItem.swift
│ │ │ ├── DecriptedCollectionViewItem.xib
│ │ │ ├── DecriptedViewController.swift
│ │ │ ├── DecriptedViewController.xib
│ │ │ ├── Info.plist
│ │ │ ├── ViewController+Model.swift
│ │ │ └── ViewController.swift
│ │ └── JWTDesktopSwift.xcodeproj/
│ │ ├── project.pbxproj
│ │ └── project.xcworkspace/
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ └── IDEWorkspaceChecks.plist
│ ├── JWTDesktopSwiftToolkit/
│ │ ├── .gitignore
│ │ ├── Package.swift
│ │ ├── README.md
│ │ ├── Sources/
│ │ │ └── JWTDesktopSwiftToolkit/
│ │ │ ├── Array+Extension.swift
│ │ │ ├── ColorBridge+Platforms.swift
│ │ │ ├── FontBridge+Platforms.swift
│ │ │ ├── SignatureValidationType.swift
│ │ │ ├── String+Extension.swift
│ │ │ ├── TokenDecoder.swift
│ │ │ └── TokenTextTypeDescription.swift
│ │ └── Tests/
│ │ └── JWTDesktopSwiftToolkitTests/
│ │ └── JWTDesktopSwiftToolkitTests.swift
│ └── JWTSwiftUI/
│ ├── JWTSwiftUI/
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets/
│ │ │ ├── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ └── Contents.json
│ │ ├── Base.lproj/
│ │ │ └── LaunchScreen.storyboard
│ │ ├── BottomView.swift
│ │ ├── ContentView.swift
│ │ ├── HeaderView.swift
│ │ ├── Info.plist
│ │ ├── JWTModel.swift
│ │ ├── Preview Content/
│ │ │ └── Preview Assets.xcassets/
│ │ │ └── Contents.json
│ │ └── SceneDelegate.swift
│ ├── JWTSwiftUI.xcodeproj/
│ │ ├── project.pbxproj
│ │ └── project.xcworkspace/
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ └── IDEWorkspaceChecks.plist
│ ├── MacJWTSwiftUI/
│ │ ├── Assets.xcassets/
│ │ │ ├── AccentColor.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ └── Contents.json
│ │ ├── ContentView.swift
│ │ ├── Info.plist
│ │ ├── MacJWTSwiftUI.entitlements
│ │ ├── MacJWTSwiftUIApp.swift
│ │ └── Preview Content/
│ │ └── Preview Assets.xcassets/
│ │ └── Contents.json
│ └── iOSJWTSwiftUI/
│ ├── Assets.xcassets/
│ │ ├── AccentColor.colorset/
│ │ │ └── Contents.json
│ │ ├── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ └── Contents.json
│ ├── ContentView.swift
│ ├── Info.plist
│ ├── Preview Content/
│ │ └── Preview Assets.xcassets/
│ │ └── Contents.json
│ └── iOSJWTSwiftUIApp.swift
├── JWT.podspec
├── LICENSE
├── Package.resolved
├── Package.swift
├── README.md
├── Scripts/
│ ├── Test certificate and private key 1.p12
│ ├── Test certificate and private key 2.p12
│ ├── Test certificate and public key 1.pem
│ ├── Test certificate and public key 2.pem
│ ├── cert_1.cer
│ ├── cert_1.crt
│ ├── cert_1.csr
│ ├── cert_1.p12
│ ├── ci-xcode-select.sh
│ ├── generate_ec_curved_keys.rb
│ ├── generate_keys.rb
│ ├── openssl_help.sh
│ ├── private_1.pem
│ ├── private_256_right.p12
│ ├── private_256_right.pem
│ ├── private_256_wrong.p12
│ ├── private_256_wrong.pem
│ ├── public_256_right.pem
│ ├── public_256_wrong.pem
│ ├── test_cert_public_256_right.pem
│ └── test_cert_public_256_wrong.pem
├── Sources/
│ └── JWT/
│ ├── Algorithms/
│ │ ├── Base/
│ │ │ ├── JWTAlgorithmErrorDescription+Subclass.m
│ │ │ ├── JWTAlgorithmErrorDescription.m
│ │ │ ├── JWTAlgorithmFactory.m
│ │ │ └── JWTAlgorithmNone.m
│ │ ├── ESFamily/
│ │ │ ├── JWTAlgorithmAsymmetricBase.m
│ │ │ └── JWTAlgorithmESBase.m
│ │ ├── HSFamily/
│ │ │ └── JWTAlgorithmHSBase.m
│ │ ├── Holders/
│ │ │ ├── JWTAlgorithmDataHolder+FluentStyle.m
│ │ │ ├── JWTAlgorithmDataHolder.m
│ │ │ └── JWTAlgorithmDataHolderChain.m
│ │ └── RSFamily/
│ │ ├── JWTAlgorithmRSBase.m
│ │ └── RSKeys/
│ │ ├── JWTCryptoKey.m
│ │ ├── JWTCryptoKeyExtractor+FluentStyle.m
│ │ ├── JWTCryptoKeyExtractor.m
│ │ ├── JWTCryptoSecurity+ErrorHandling.m
│ │ ├── JWTCryptoSecurity+ExternalRepresentation.m
│ │ ├── JWTCryptoSecurity+Extraction.m
│ │ └── JWTCryptoSecurity.m
│ ├── ClaimSet/
│ │ ├── JWTClaim.m
│ │ ├── JWTClaimBase.m
│ │ ├── JWTClaimSerializerBase.m
│ │ ├── JWTClaimSerializerVariations.m
│ │ ├── JWTClaimVariations.m
│ │ ├── JWTClaimVerifierBase.m
│ │ ├── JWTClaimVerifierVariations.m
│ │ ├── JWTClaimsProviderBase.m
│ │ ├── JWTClaimsSet.m
│ │ ├── JWTClaimsSetBase.m
│ │ ├── JWTClaimsSetCoordinatorBase.m
│ │ ├── JWTClaimsSetDSLBase.m
│ │ ├── JWTClaimsSetSerializer.m
│ │ ├── JWTClaimsSetSerializerBase.m
│ │ ├── JWTClaimsSetVerifier.m
│ │ └── JWTClaimsSetVerifierBase.m
│ ├── Coding/
│ │ ├── JWTBuilder+FluentStyle.m
│ │ ├── JWTCoding+ResultTypes.m
│ │ ├── JWTCoding+VersionOne.m
│ │ ├── JWTCoding+VersionThree.m
│ │ ├── JWTCoding+VersionTwo.m
│ │ ├── JWTCoding.m
│ │ └── JWTCodingBuilder+FluentStyle.m
│ ├── Supplement/
│ │ ├── JWTBase64Coder.m
│ │ └── JWTErrorDescription.m
│ └── include/
│ ├── JWTAlgorithm.h
│ ├── JWTAlgorithmAsymmetricBase.h
│ ├── JWTAlgorithmDataHolder+FluentStyle.h
│ ├── JWTAlgorithmDataHolder.h
│ ├── JWTAlgorithmDataHolderChain.h
│ ├── JWTAlgorithmESBase.h
│ ├── JWTAlgorithmErrorDescription+Subclass.h
│ ├── JWTAlgorithmErrorDescription.h
│ ├── JWTAlgorithmFactory.h
│ ├── JWTAlgorithmHSBase.h
│ ├── JWTAlgorithmNone.h
│ ├── JWTAlgorithmRSBase.h
│ ├── JWTBase64Coder.h
│ ├── JWTBuilder+FluentStyle.h
│ ├── JWTClaim.h
│ ├── JWTClaimBase.h
│ ├── JWTClaimSerializerBase.h
│ ├── JWTClaimSerializerVariations.h
│ ├── JWTClaimVariations.h
│ ├── JWTClaimVerifierBase.h
│ ├── JWTClaimVerifierVariations.h
│ ├── JWTClaimsProviderBase.h
│ ├── JWTClaimsSet.h
│ ├── JWTClaimsSetBase.h
│ ├── JWTClaimsSetCoordinatorBase.h
│ ├── JWTClaimsSetDSLBase.h
│ ├── JWTClaimsSetSerializer.h
│ ├── JWTClaimsSetSerializerBase.h
│ ├── JWTClaimsSetVerifier.h
│ ├── JWTClaimsSetVerifierBase.h
│ ├── JWTClaimsSetsProtocols.h
│ ├── JWTCoding+ResultTypes.h
│ ├── JWTCoding+VersionOne.h
│ ├── JWTCoding+VersionThree.h
│ ├── JWTCoding+VersionTwo.h
│ ├── JWTCoding.h
│ ├── JWTCodingBuilder+FluentStyle.h
│ ├── JWTCryptoKey.h
│ ├── JWTCryptoKeyExtractor+FluentStyle.h
│ ├── JWTCryptoKeyExtractor.h
│ ├── JWTCryptoSecurity+ErrorHandling.h
│ ├── JWTCryptoSecurity+ExternalRepresentation.h
│ ├── JWTCryptoSecurity+Extraction.h
│ ├── JWTCryptoSecurity.h
│ ├── JWTDeprecations.h
│ ├── JWTErrorDescription.h
│ └── JWTRSAlgorithm.h
├── Tests/
│ └── JWTTests/
│ ├── Helpers/
│ │ └── JWTAssetAccessor.m
│ ├── Resources/
│ │ ├── Certificates.xcassets/
│ │ │ ├── Contents.json
│ │ │ ├── es256/
│ │ │ │ ├── Contents.json
│ │ │ │ ├── certificate.cer.dataset/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── ec-prime256v1.cer
│ │ │ │ ├── original.private.pem.dataset/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── ec-prime256v1-private.pem
│ │ │ │ ├── original.public.pem.dataset/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── ec-prime256v1-public.pem
│ │ │ │ ├── p12_password.txt.dataset/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── ec-prime256v1-p12-password.txt
│ │ │ │ ├── private.p12.dataset/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── ec-prime256v1-private.p12
│ │ │ │ ├── private.pem.dataset/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── ec-prime256v1-private.pem
│ │ │ │ └── public.pem.dataset/
│ │ │ │ ├── Contents.json
│ │ │ │ └── ec-prime256v1-public.pem
│ │ │ ├── es384/
│ │ │ │ ├── Contents.json
│ │ │ │ ├── certificate.cer.dataset/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── ec-secp384r1.cer
│ │ │ │ ├── original.private.pem.dataset/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── ec-secp384r1-private.pem
│ │ │ │ ├── original.public.pem.dataset/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── ec-secp384r1-public.pem
│ │ │ │ ├── p12_password.txt.dataset/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── ec-secp384r1-p12-password.txt
│ │ │ │ ├── private.p12.dataset/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── ec-secp384r1-private.p12
│ │ │ │ ├── private.pem.dataset/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── ec-secp384r1-private.pem
│ │ │ │ └── public.pem.dataset/
│ │ │ │ ├── Contents.json
│ │ │ │ └── ec-secp384r1-public.pem
│ │ │ ├── es512/
│ │ │ │ ├── Contents.json
│ │ │ │ ├── certificate.cer.dataset/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── ec-secp521r1.cer
│ │ │ │ ├── original.private.pem.dataset/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── ec-secp521r1-private.pem
│ │ │ │ ├── original.public.pem.dataset/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── ec-secp521r1-public.pem
│ │ │ │ ├── p12_password.txt.dataset/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── ec-secp521r1-p12-password.txt
│ │ │ │ ├── private.p12.dataset/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── ec-secp521r1-private.p12
│ │ │ │ ├── private.pem.dataset/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── ec-secp521r1-private.pem
│ │ │ │ └── public.pem.dataset/
│ │ │ │ ├── Contents.json
│ │ │ │ └── ec-secp521r1-public.pem
│ │ │ ├── rs256/
│ │ │ │ ├── Contents.json
│ │ │ │ ├── certificate.cer.dataset/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── rsa-2048.cer
│ │ │ │ ├── p12_password.txt.dataset/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── rsa-2048-p12-password.txt
│ │ │ │ ├── private.p12.dataset/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── rsa-2048-private.p12
│ │ │ │ ├── private.pem.dataset/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── rsa-2048-private.pem
│ │ │ │ └── public.pem.dataset/
│ │ │ │ ├── Contents.json
│ │ │ │ └── rsa-2048-public.pem
│ │ │ ├── rs256old/
│ │ │ │ ├── Contents.json
│ │ │ │ ├── certificate.cer.dataset/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── rs256-cert.cer
│ │ │ │ ├── p12_password.txt.dataset/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── password.txt
│ │ │ │ ├── private.p12.dataset/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── rs256-private.p12
│ │ │ │ ├── private.pem.dataset/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── rs256-private.pem
│ │ │ │ └── public.pem.dataset/
│ │ │ │ ├── Contents.json
│ │ │ │ └── rs256-public.pem
│ │ │ ├── rs384/
│ │ │ │ ├── Contents.json
│ │ │ │ ├── certificate.cer.dataset/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── rsa-3072.cer
│ │ │ │ ├── p12_password.txt.dataset/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── rsa-3072-p12-password.txt
│ │ │ │ ├── private.p12.dataset/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── rsa-3072-private.p12
│ │ │ │ ├── private.pem.dataset/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── rsa-3072-private.pem
│ │ │ │ └── public.pem.dataset/
│ │ │ │ ├── Contents.json
│ │ │ │ └── rsa-3072-public.pem
│ │ │ └── rs512/
│ │ │ ├── Contents.json
│ │ │ ├── certificate.cer.dataset/
│ │ │ │ ├── Contents.json
│ │ │ │ └── rsa-4096.cer
│ │ │ ├── p12_password.txt.dataset/
│ │ │ │ ├── Contents.json
│ │ │ │ └── rsa-4096-p12-password.txt
│ │ │ ├── private.p12.dataset/
│ │ │ │ ├── Contents.json
│ │ │ │ └── rsa-4096-private.p12
│ │ │ ├── private.pem.dataset/
│ │ │ │ ├── Contents.json
│ │ │ │ └── rsa-4096-private.pem
│ │ │ └── public.pem.dataset/
│ │ │ ├── Contents.json
│ │ │ └── rsa-4096-public.pem
│ │ └── template/
│ │ ├── Contents.json
│ │ ├── certificate.cer.dataset/
│ │ │ └── Contents.json
│ │ ├── p12_password.txt.dataset/
│ │ │ └── Contents.json
│ │ ├── private.p12.dataset/
│ │ │ └── Contents.json
│ │ ├── private.pem.dataset/
│ │ │ └── Contents.json
│ │ ├── public.pem.dataset/
│ │ │ └── Contents.json
│ │ └── request.csr.dataset/
│ │ └── Contents.json
│ ├── Tests/
│ │ ├── Algorithms/
│ │ │ ├── JWTAlgorithmAsymmetricTests.m
│ │ │ ├── JWTAlgorithmHSTests.m
│ │ │ └── JWTAlgorithmNoneTests.m
│ │ ├── ClaimSet/
│ │ │ ├── JWTClaimsCustomClaimsBaseTests.m
│ │ │ ├── JWTClaimsSerializerBaseTests.m
│ │ │ └── JWTClaimsSerializerTests.m
│ │ ├── JWT/
│ │ │ ├── JWTIssuesTests.m
│ │ │ └── JWTReadmeTests.m
│ │ └── JWTCoding/
│ │ └── JWTCodingTests.m
│ └── include/
│ └── JWTAssetAccessor.h
└── VERSION
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/CONTRIBUTING.md
================================================
# Contributing to JWT
We want to make contributing to this project as easy and transparent as possible. Here are a few guidelines for making all our lives easier.
## Reporting Issues
A great way to contribute to the project is to send a detailed issue when you encounter an problem.
It is very important to check for the same problem or suggestion in the project's issue list first. If you find a match, just add a small comment there.
Doing this helps prioritize the most common problems and requests.
When reporting issues, please include the following:
- The platform name and version (e.g. iOS 8.1)
- The library version
- The integration method (e.g. CocoaPods/Carthage/manually)
- The version of Xcode you're using
- The full output of any stack trace or compiler error
- A small demo project that replicates the issue (especially if the way to reproduce the issue is not straight-forward)
- Any other details that would be useful in understanding the problem
This information will help us review and fix your issue faster.
Please do not be offended if we close your issue and reference this document.
If you believe the issue is truely a fault in the project’s codebase, re-open it.
## Pull Requests
We gladly accept any PR's assuming they are well written, documented ( if necessary ) and preferably have test code.
If you're unsure if we'll accept a new feature please open an issue requesting it and we can have a discussion before you code and submit a PR.
Checklist:
- Fork the repo and create your branch from the latest master (to minimize the conflicts)
- If you've added code that should be tested, add tests.
- If you've changed APIs, update the documentation.
- Ensure the test suite passes.
- Make sure your code lints (pod lib lint)
================================================
FILE: .github/ISSUE_TEMPLATE.md
================================================
### New Issue Checklist
- [ ] I have read and understood the [CONTRIBUTING guide](https://github.com/yourkarma/JWT/blob/master/.github/CONTRIBUTING.md)
- [ ] I have read the [Documentation](https://github.com/yourkarma/JWT#documentation)
- [ ] I have searched for a similar issue in the [project](https://github.com/yourkarma/JWT/issues) and found none
### Issue Info
Info | Value |
-------------------------|-------------------------------------|
Platform Name | e.g. ios / osx / tvos / watchos
Platform Version | e.g. 8.0
CocoaLumberjack Version | e.g. 2.3.0
Integration Method | e.g. carthage / cocoapods / manually
Xcode Version | e.g. Xcode 7.3
Repro rate | e.g. all the time (100%) / sometimes x% / only once
Demo project link | e.g. link to a demo project that highlights the issue
### Issue Description and Steps
Please fill in the detailed description of the issue (full output of any stack trace, compiler error, ...) and the steps to reproduce the issue.
================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
### New Pull Request Checklist
- [ ] I have searched for a similar pull request in the [project](https://github.com/yourkarma/JWT/pulls) and found none
- [ ] I have updated this branch with the latest master to avoid conflicts (via merge from master or rebase)
- [ ] I have added the required tests to prove the fix/feature I am adding
- [ ] I have updated the documentation (if necessary)
- [ ] I have run the tests and they pass
- [ ] I have run the lint and it passes (`pod lib lint`)
Before merge, please, assure that your commits are grouped.
Please, don't make several PRs with single commit, group PRs into one if possible.
This merge request fixes / refers to the following issues: ...
### Pull Request Description
...
================================================
FILE: .github/workflows/library-builds.yaml
================================================
name: Library Builds
on:
push:
branches: [ ci/github_actions, master ]
pull_request:
branches: [ master ]
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
env:
LC_CTYPE: en_US.UTF-8
LANG: en_US.UTF-8
jobs:
static-library:
runs-on: macos-11
strategy:
matrix:
include:
- scheme: JWT
sdk: macosx
destination: 'platform=macosx'
- scheme: JWT
sdk: iphonesimulator
destination: 'platform=iOS Simulator,name=iPhone 13,OS=latest'
- scheme: JWT
sdk: appletvsimulator
destination: 'platform=tvOS Simulator,name=Apple TV,OS=latest'
- scheme: JWT
sdk: watchsimulator
destination: 'platform=watchOS Simulator,name=Apple Watch Series 6 - 44mm,OS=latest'
steps:
- uses: actions/checkout@v2
- run: gem install xcpretty --no-document
- run: set -o pipefail
- run: ./Scripts/ci-xcode-select.sh
- run: xcodebuild clean build -scheme "${{ matrix.scheme }}" -sdk "${{ matrix.sdk }}" -destination "${{ matrix.destination }}" | xcpretty && exit ${PIPESTATUS[0]}
================================================
FILE: .github/workflows/unit-tests.yaml
================================================
name: Unit Tests
on:
push:
branches: [ ci/github_actions, master ]
pull_request:
branches: [ master ]
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
env:
LC_CTYPE: en_US.UTF-8
LANG: en_US.UTF-8
jobs:
caution:
runs-on: macos-11
steps:
- run: echo "Do not forget to change runs-on (os target) to macos-latest when it become latest"
- run: echo "Do not forget to add macOS tests when Apple fix Apple.car catalog compilation for macOS"
xcode:
runs-on: macos-11
strategy:
matrix:
include:
- scheme: JWT
sdk: iphonesimulator
destination: 'platform=iOS Simulator,name=iPhone 13,OS=latest'
- scheme: JWT
sdk: appletvsimulator
destination: 'platform=tvOS Simulator,name=Apple TV,OS=latest'
- scheme: JWT
sdk: watchsimulator
destination: 'platform=watchOS Simulator,name=Apple Watch Series 6 - 44mm,OS=latest'
steps:
- uses: actions/checkout@v2
- run: gem install xcpretty --no-document
- run: ./Scripts/ci-xcode-select.sh
- run: xcodebuild test -scheme "${{ matrix.scheme }}" -sdk "${{ matrix.sdk }}" -destination "${{ matrix.destination }}" | xcpretty && exit ${PIPESTATUS[0]}
================================================
FILE: .github/workflows/validations.yaml
================================================
name: Validations
on:
push:
branches: [ ci/github_actions, master ]
pull_request:
branches: [ master ]
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
jobs:
validate-third-party-packages-managers:
runs-on: macos-11
steps:
- uses: actions/checkout@v2
- run: gem install xcpretty --no-document
- run: set -o pipefail
- run: swift --version
- run: xcodebuild -version
- run: ./Scripts/ci-xcode-select.sh
# cocoapods
- run: pod lib lint --allow-warnings
# also add validation for spm later.
================================================
FILE: .gitignore
================================================
# Mac OS
.DS_Store
# Xcode
#
build/
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
*.xccheckout
*.moved-aside
DerivedData
*.hmap
*.ipa
*.xcuserstate
# AppCode JetBrains
.idea/
# rvm
.ruby-version
.ruby-gemset
Example/**/.ruby-version
Example/**/.ruby-gemset
Inspection/**/.ruby-version
Inspection/**/.ruby-gemset
# Pods
Pods/Pods.xcodeproj/xcuserdata/
Pods/
Example/**/Pods/Pods.xcodeproj/xcuserdata/
Example/**/Pods/
Inspection/**/Pods/Pods.xcodeproj/xcuserdata/
Inspection/**/Pods/
# Carthage
Example/CarthageCompatibility/Carthage/
================================================
FILE: .gitmodules
================================================
================================================
FILE: .local_run_travis_script.sh
================================================
cat .travis.yml | perl -lne '/^script:/ ... eof() and /^\s+-/ and s/^\s+-// and print and print qx($_)'
================================================
FILE: .travis.yml
================================================
language: objective-c
matrix:
include:
- osx_image: xcode12.5
# - osx_image: xcode8.3
before_install:
# - brew update
#- if brew outdated | grep -qx xctool; then brew upgrade xctool; fi
# install
# - rvm use 2.2.2 --install --binary --fuzzy
# - gem install cocoapods --no-rdoc --no-ri --no-document --quiet
- gem install xcpretty --no-document
# - pod --version
# - pod setup --silent > /dev/null
# - pod repo update --silent
- xcpretty --version
- xcodebuild -version
- xcodebuild -showsdks
script:
# 32-bit tests
# - xctool -sdk iphonesimulator clean test -destination "name=iPhone 5" -find-target "JWTTests"
# 64-bit tests
# - xctool -sdk iphonesimulator clean test -destination "name=iPhone 5s" -find-target "JWTTests"
# Thanks CocoaLumberjack!
- set -o pipefail
- echo Check if the library described by the podspec can be built
- pod lib lint --allow-warnings
# Unused.
# - echo "Build as dynamic framework (ObjectiveC), each platform (osx, ios)"
# - xcodebuild clean build -project Framework/JWT.xcodeproj -scheme 'JWT-macOS' -configuration Release -sdk macosx | xcpretty -c
# - xcodebuild clean build -project Framework/JWT.xcodeproj -scheme 'JWT-iOS' -configuration Release -sdk iphonesimulator | xcpretty -c
# - echo "Build as dynamic framework (Swift), each platform (osx, ios)"
# - xcodebuild clean build -project Framework/JWT.xcodeproj -scheme 'JWT-macOS-Swift' -configuration Release -sdk macosx | xcpretty -c
# - xcodebuild clean build -project Framework/JWT.xcodeproj -scheme 'JWT-iOS-Swift' -configuration Release -sdk iphonesimulator | xcpretty -c
# Framework.
- echo "Build dynamic universal for each platform (osx, ios)"
- xcodebuild clean build -project Framework/JWT.xcodeproj -scheme 'JWT' -configuration Release -sdk macosx | xcpretty -c
- xcodebuild clean build -project Framework/JWT.xcodeproj -scheme 'JWT' -configuration Release -sdk iphonesimulator | xcpretty -c
- xcodebuild clean build -project Framework/JWT.xcodeproj -scheme 'JWT' -configuration Release -sdk appletvsimulator | xcpretty -c
- xcodebuild clean build -project Framework/JWT.xcodeproj -scheme 'JWT' -configuration Release -sdk watchsimulator | xcpretty -c
# Static Library.
# We need to change order in case of xcodebuild bug.
# xcodebuild does not remove static library on -clean action.
# In this case
# static library after framework is ok.
# framework after static library is bad.
# beer and wine order, heh.
- echo "Build iOS Static library"
- xcodebuild clean build -project Framework/JWT.xcodeproj -scheme 'JWT-Static' -configuration Release -sdk macosx | xcpretty -c
- xcodebuild clean build -project Framework/JWT.xcodeproj -scheme 'JWT-Static' -configuration Release -sdk iphonesimulator | xcpretty -c
- xcodebuild clean build -project Framework/JWT.xcodeproj -scheme 'JWT-Static' -configuration Release -sdk appletvsimulator | xcpretty -c
- xcodebuild clean build -project Framework/JWT.xcodeproj -scheme 'JWT-Static' -configuration Release -sdk watchsimulator | xcpretty -c
# Tests.
- echo Run iOS Tests
# 32-bit tests
# TODO: Add xsimctl invocation to install iPhone 5 or 5s simulators.
# - echo 32-bit tests
# - xcodebuild test -project 'Tests/Tests.xcodeproj' -scheme 'iOS_Tests' -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 5,OS=latest' | xcpretty -c
# # 64-bit tests
- echo Run iOS 64-bit tests
- xcodebuild test -project 'Tests/Tests.xcodeproj' -scheme 'iOS_Tests' -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 11,OS=latest' | xcpretty -c
# mac OS tests
- echo Run Mac OS tests
- xcodebuild test -project 'Tests/Tests.xcodeproj' -scheme 'macOS_Tests' -sdk macosx | xcpretty -c
# tvOS tests
- echo Run tvOS tests
- xcodebuild test -project 'Tests/Tests.xcodeproj' -scheme 'tvOS_Tests' -sdk appletvsimulator -destination 'platform=tvOS Simulator,name=Apple TV,OS=latest' | xcpretty -c
# watchOS tests
- echo Run watchOS tests
- xcodebuild test -project 'Tests/Tests.xcodeproj' -scheme 'watchOS_Tests' -sdk watchsimulator -destination 'platform=watchOS Simulator,name=Apple Watch Series 6 - 44mm,OS=latest'
================================================
FILE: Cartfile
================================================
github "https://github.com/soheilbm/Base64.git" "Cartfile"
================================================
FILE: Cartfile.resolved
================================================
github "soheilbm/Base64" "67083ec1e3e970ec920cbf126e6957c6e9e88ae4"
================================================
FILE: Documentation/Prerelease/custom_claims.md
================================================
# Custom Claims.
## Intro.
Consider the following problem.
You have an integer interval and you would like to know if untrusted and trusted intervals intersection is empty or not.
If they have intersection and it is not empty, then, we would like to say "yes" to untrusted value.
Otherwise we treat it as malicious and discard it.
In simple example, we may have
```
trustedValue
// 1...5
untrustedValue
// 2...6
```
They have non-empty intersection which equals to `2...5`.
## Example Data.
We may encode this special claim as two numbers that are separated by comma.
Let's call our claim as "intersection".
JSON for this claim `1...5` will be equal to
```json
{
"intersection": "1,5"
}
```
## Example.
We have to define three components for our case.
1. Define a claim.
2. Define a serializer.
3. Define a verifier.
## Define a claim.
```objective-c
/// Define a name of a claim.
@interface JWTClaimsNames (Custom)
@property (copy, nonatomic, readonly, class) NSString *intersectionOfIntervals;
@end
@implementation JWTClaimsNames (Custom)
+ (NSString *)intersectionOfIntervals { return @"intersectionOfIntervals"; }
@end
/// Define a claim
@interface JWTClaimCustomIntersectionOfIntervals : JWTClaimBase
@end
@implementation JWTClaimCustomIntersectionOfIntervals
+ (NSString *)name { return JWTClaimsNames.intersectionOfIntervals; }
@end
```
## Define a serializer.
```objective-c
/// Define a serializer
@interface JWTClaimSerializerForInterval : JWTClaimSerializerBase
@end
@implementation JWTClaimSerializerForInterval
- (NSObject *)deserializedClaimValue:(NSObject *)value forName:(NSString *)name {
if ([value isKindOfClass:NSString.class]) {
__auto_type array = [(NSString *)value componentsSeparatedByString:@","];
__auto_type result = [NSMutableArray array];
for (NSString *item in array) {
[result addObject:@(item.integerValue)];
}
__auto_type descriptor = [[NSSortDescriptor alloc] initWithKey:@"integerValue" ascending:YES];
return [result sortedArrayUsingDescriptors:@[descriptor]];
}
return value;
}
- (NSObject *)serializedClaimValue:(id<JWTClaimProtocol>)claim {
__auto_type value = claim.value;
if ([value isKindOfClass:NSArray.class]) {
__auto_type descriptor = [[NSSortDescriptor alloc] initWithKey:@"integerValue" ascending:YES];
__auto_type sortedArray = [(NSArray *)claim.value sortedArrayUsingDescriptors:@[descriptor]];
return [sortedArray componentsJoinedByString:@","];
}
return value;
}
@end
```
## Define a verifier.
```objective-c
/// Define a verifier.
@interface JWTClaimVerifierForIntersection : JWTClaimVerifierBase
@end
@implementation JWTClaimVerifierForIntersection
- (BOOL)verifyValue:(NSObject *)value withTrustedValue:(NSObject *)trustedValue {
if ([value isKindOfClass:NSArray.class] && [trustedValue isKindOfClass:NSArray.class]) {
__auto_type lhs = (NSArray *)value;
__auto_type rhs = (NSArray *)trustedValue;
if (rhs.count != 2) {
return NO;
}
if (lhs.count > 2 || lhs.count == 0) {
return NO;
}
__auto_type lowerBorder = ((NSNumber *)rhs.firstObject).integerValue;
__auto_type upperBorder = ((NSNumber *)rhs.lastObject).integerValue;
if (lhs.count == 1) {
__auto_type checkValue = ((NSNumber *)lhs.firstObject).integerValue;
return lowerBorder <= checkValue && upperBorder >= checkValue;
}
if (lhs.count == 2) {
__auto_type untrustedLowerBorder = ((NSNumber *)lhs.firstObject).integerValue;
__auto_type untrustedUpperBorder = ((NSNumber *)lhs.lastObject).integerValue;
return (untrustedLowerBorder >= lowerBorder && untrustedLowerBorder <= upperBorder) || (untrustedUpperBorder >= lowerBorder && untrustedUpperBorder <= upperBorder);
}
}
return NO;
}
@end
```
## Add DSL if needed.
```objective-c
@interface JWTClaimsSetDSLBase (CustomDSL)
@property (copy, nonatomic, readwrite) NSArray *intersection;
@end
@implementation JWTClaimsSetDSLBase (CustomDSL)
- (NSArray *)intersection {
return (NSArray *)[self dslValueForName:JWTClaimsNames.intersectionOfIntervals];
}
- (void)setIntersection:(NSArray *)intersection {
[self dslSetValue:intersection forName:JWTClaimsNames.intersectionOfIntervals];
}
@end
@interface JWTClaimVariations (CustomDSL)
+ (id<JWTClaimProtocol>)intersectionOfIntervals;
@end
@implementation JWTClaimVariations (CustomDSL)
+ (id<JWTClaimProtocol>)intersectionOfIntervals {
return [JWTClaimCustomIntersectionOfIntervals new];
}
@end
@interface JWTClaimSerializerVariations (CustomDSL)
+ (id<JWTClaimSerializerProtocol>)interval;
@end
@implementation JWTClaimSerializerVariations (CustomDSL)
+ (id<JWTClaimSerializerProtocol>)interval {
return [JWTClaimSerializerForInterval new];
}
@end
@interface JWTClaimVerifierVariations (CustomDSL)
+ (id<JWTClaimVerifierProtocol>)intersection;
@end
@implementation JWTClaimVerifierVariations (CustomDSL)
+ (id<JWTClaimVerifierProtocol>)intersection {
return [JWTClaimVerifierForIntersection new];
}
@end
```
## Put everything together.
```objective-c
- (void)test {
/// Setup ClaimsSetCoordinator
__auto_type claim = JWTClaimVariations.intersectionOfIntervals;
__auto_type claimSerializer = JWTClaimSerializerVariations.interval;
__auto_type claimVerifier = JWTClaimVerifierVariations.intersection;
id<JWTClaimsSetCoordinatorProtocol> claimsSetCoordinator = [JWTClaimsSetCoordinatorBase new];
[claimsSetCoordinator registerClaim:claim serializer:claimSerializer verifier:claimVerifier forClaimName:JWTClaimsNames.intersectionOfIntervals];
__auto_type deserialized = ({
claimsSetCoordinator.configureClaimsSet(^JWTClaimsSetDSLBase *(JWTClaimsSetDSLBase *claimsSetDSL) {
claimsSetDSL.intersection = @[@(2), @(5)];
return claimsSetDSL;
});
self.claimsSetCoordinator.claimsSetStorage;
});
__auto_type serialized = ({
__auto_type dictionary = [self.claimsSetCoordinator.claimsSetSerializer dictionaryFromClaimsSet:deserialized];
dictionary;
});
__auto_type result = @{
JWTClaimsNames.intersectionOfIntervals : @"2,5"
};
XCTAssertEqual(serialized.count, 1);
XCTAssertEqualObjects(serialized, result);
}
```
## Use with decoding and encoding.
```objective-c
- (void)testEncodingAndDecodingViaCoordinator {
id<JWTClaimsSetCoordinatorProtocol> claimsSetCoordinator = [JWTClaimsSetCoordinatorBase new];
__auto_type claimsSetDSL = claimsSetCoordinator.dslDesrciption;
// fill it
claimsSetDSL.issuer = @"Facebook";
claimsSetDSL.subject = @"Token";
claimsSetDSL.audience = @"https://jwt.io";
claimsSetCoordinator.claimsSetStorage = claimsSetDSL.claimsSetStorage;
// encode it
__auto_type secret = @"secret";
__auto_type algorithmName = @"HS384";
__auto_type headers = @{@"custom":@"value"};
id<JWTAlgorithmDataHolderProtocol>holder = [JWTAlgorithmHSFamilyDataHolder new].algorithmName(algorithmName).secret(secret);
JWTCodingResultType *result = [JWTEncodingBuilder encodeClaimsSetWithCoordinator:claimsSetCoordinator].headers(headers).addHolder(holder).result;
NSString *encodedToken = result.successResult.encoded;
if (result.successResult) {
// handle encoded result
NSLog(@"encoded result: %@", result.successResult.encoded);
}
else {
// handle error
NSLog(@"encode failed, error: %@", result.errorResult.error);
}
// decode it
// you can set any property that you want, all properties are optional
__auto_type trustedClaimsSet = claimsSetDSL.claimsSetStorage;
NSNumber *options = @(JWTCodingDecodingOptionsNone);
NSString *yourJwt = encodedToken; // from previous example
JWTCodingResultType *decodedResult = [JWTDecodingBuilder decodeMessage:yourJwt].claimsSetCoordinator(claimsSetCoordinator).addHolder(holder).options(options).and.result;
if (decodedResult.successResult) {
// handle decoded result
NSLog(@"decoded result: %@", decodedResult.successResult.headerAndPayloadDictionary);
NSLog(@"headers: %@", decodedResult.successResult.headers);
NSLog(@"payload: %@", decodedResult.successResult.payload);
NSLog(@"trustedClaimsSet: %@", [claimsSetCoordinator.claimsSetSerializer dictionaryFromClaimsSet:trustedClaimsSet]);
NSLog(@"decodedClaimsSet: %@", [claimsSetCoordinator.claimsSetSerializer dictionaryFromClaimsSet:decodedResult.successResult.claimsSetStorage]);
}
else {
// handle error
NSLog(@"decode failed, error: %@", decodedResult.errorResult.error);
}
}
```
================================================
FILE: Example/JWTDesktop/JWTDesktop/AppDelegate.h
================================================
//
// AppDelegate.h
// JWTDesktop
//
// Created by Lobanov Dmitry on 23.05.16.
// Copyright © 2016 JWT. All rights reserved.
//
#import <Cocoa/Cocoa.h>
@interface AppDelegate : NSObject <NSApplicationDelegate>
@end
================================================
FILE: Example/JWTDesktop/JWTDesktop/AppDelegate.m
================================================
//
// AppDelegate.m
// JWTDesktop
//
// Created by Lobanov Dmitry on 23.05.16.
// Copyright © 2016 JWT. All rights reserved.
//
#import "AppDelegate.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
// Insert code here to initialize your application
}
- (void)applicationWillTerminate:(NSNotification *)aNotification {
// Insert code here to tear down your application
}
@end
================================================
FILE: Example/JWTDesktop/JWTDesktop/Assets.xcassets/AppIcon.appiconset/Contents.json
================================================
{
"images" : [
{
"size" : "16x16",
"idiom" : "mac",
"filename" : "jwt_icon_16x16.png",
"scale" : "1x"
},
{
"idiom" : "mac",
"size" : "16x16",
"filename" : "jwt_icon_32x32.png",
"scale" : "2x"
},
{
"size" : "32x32",
"idiom" : "mac",
"filename" : "jwt_icon_32x32.png",
"scale" : "1x"
},
{
"idiom" : "mac",
"size" : "32x32",
"filename" : "jwt_icon_64x64.png",
"scale" : "2x"
},
{
"size" : "128x128",
"idiom" : "mac",
"filename" : "jwt_icon_128x128.png",
"scale" : "1x"
},
{
"idiom" : "mac",
"size" : "128x128",
"filename" : "jwt_icon_256x256.png",
"scale" : "2x"
},
{
"size" : "256x256",
"idiom" : "mac",
"filename" : "jwt_icon_256x256.png",
"scale" : "1x"
},
{
"size" : "256x256",
"idiom" : "mac",
"filename" : "jwt_icon_512x512.png",
"scale" : "2x"
},
{
"size" : "512x512",
"idiom" : "mac",
"filename" : "jwt_icon_512x512.png",
"scale" : "1x"
},
{
"size" : "512x512",
"idiom" : "mac",
"filename" : "jwt_icon_1024x1024.png",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Example/JWTDesktop/JWTDesktop/Base.lproj/Main.storyboard
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="18122" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" initialViewController="B8D-0N-5wS">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="18122"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--Application-->
<scene sceneID="JPo-4y-FX3">
<objects>
<application id="hnw-xV-0zn" sceneMemberID="viewController">
<menu key="mainMenu" title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
<items>
<menuItem title="JWTDesktop" id="1Xt-HY-uBw">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="JWTDesktop" systemMenu="apple" id="uQy-DD-JDr">
<items>
<menuItem title="About JWTDesktop" id="5kV-Vb-QxS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontStandardAboutPanel:" target="Ady-hI-5gd" id="Exp-CZ-Vem"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="VOq-y0-SEH"/>
<menuItem title="Preferences…" keyEquivalent="," id="BOF-NM-1cW"/>
<menuItem isSeparatorItem="YES" id="wFC-TO-SCJ"/>
<menuItem title="Services" id="NMo-om-nkz">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Services" systemMenu="services" id="hz9-B4-Xy5"/>
</menuItem>
<menuItem isSeparatorItem="YES" id="4je-JR-u6R"/>
<menuItem title="Hide JWTDesktop" keyEquivalent="h" id="Olw-nP-bQN">
<connections>
<action selector="hide:" target="Ady-hI-5gd" id="PnN-Uc-m68"/>
</connections>
</menuItem>
<menuItem title="Hide Others" keyEquivalent="h" id="Vdr-fp-XzO">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="hideOtherApplications:" target="Ady-hI-5gd" id="VT4-aY-XCT"/>
</connections>
</menuItem>
<menuItem title="Show All" id="Kd2-mp-pUS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="unhideAllApplications:" target="Ady-hI-5gd" id="Dhg-Le-xox"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/>
<menuItem title="Quit JWTDesktop" keyEquivalent="q" id="4sb-4s-VLi">
<connections>
<action selector="terminate:" target="Ady-hI-5gd" id="Te7-pn-YzF"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="File" id="dMs-cI-mzQ">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="File" id="bib-Uj-vzu">
<items>
<menuItem title="New" keyEquivalent="n" id="Was-JA-tGl">
<connections>
<action selector="newDocument:" target="Ady-hI-5gd" id="4Si-XN-c54"/>
</connections>
</menuItem>
<menuItem title="Open…" keyEquivalent="o" id="IAo-SY-fd9">
<connections>
<action selector="openDocument:" target="Ady-hI-5gd" id="bVn-NM-KNZ"/>
</connections>
</menuItem>
<menuItem title="Open Recent" id="tXI-mr-wws">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Open Recent" systemMenu="recentDocuments" id="oas-Oc-fiZ">
<items>
<menuItem title="Clear Menu" id="vNY-rz-j42">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="clearRecentDocuments:" target="Ady-hI-5gd" id="Daa-9d-B3U"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem isSeparatorItem="YES" id="m54-Is-iLE"/>
<menuItem title="Close" keyEquivalent="w" id="DVo-aG-piG">
<connections>
<action selector="performClose:" target="Ady-hI-5gd" id="HmO-Ls-i7Q"/>
</connections>
</menuItem>
<menuItem title="Save…" keyEquivalent="s" id="pxx-59-PXV">
<connections>
<action selector="saveDocument:" target="Ady-hI-5gd" id="teZ-XB-qJY"/>
</connections>
</menuItem>
<menuItem title="Save As…" keyEquivalent="S" id="Bw7-FT-i3A">
<connections>
<action selector="saveDocumentAs:" target="Ady-hI-5gd" id="mDf-zr-I0C"/>
</connections>
</menuItem>
<menuItem title="Revert to Saved" id="KaW-ft-85H">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="revertDocumentToSaved:" target="Ady-hI-5gd" id="iJ3-Pv-kwq"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="aJh-i4-bef"/>
<menuItem title="Page Setup…" keyEquivalent="P" id="qIS-W8-SiK">
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
<connections>
<action selector="runPageLayout:" target="Ady-hI-5gd" id="Din-rz-gC5"/>
</connections>
</menuItem>
<menuItem title="Print…" keyEquivalent="p" id="aTl-1u-JFS">
<connections>
<action selector="print:" target="Ady-hI-5gd" id="qaZ-4w-aoO"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Edit" id="5QF-Oa-p0T">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Edit" id="W48-6f-4Dl">
<items>
<menuItem title="Undo" keyEquivalent="z" id="dRJ-4n-Yzg">
<connections>
<action selector="undo:" target="Ady-hI-5gd" id="M6e-cu-g7V"/>
</connections>
</menuItem>
<menuItem title="Redo" keyEquivalent="Z" id="6dh-zS-Vam">
<connections>
<action selector="redo:" target="Ady-hI-5gd" id="oIA-Rs-6OD"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="WRV-NI-Exz"/>
<menuItem title="Cut" keyEquivalent="x" id="uRl-iY-unG">
<connections>
<action selector="cut:" target="Ady-hI-5gd" id="YJe-68-I9s"/>
</connections>
</menuItem>
<menuItem title="Copy" keyEquivalent="c" id="x3v-GG-iWU">
<connections>
<action selector="copy:" target="Ady-hI-5gd" id="G1f-GL-Joy"/>
</connections>
</menuItem>
<menuItem title="Paste" keyEquivalent="v" id="gVA-U4-sdL">
<connections>
<action selector="paste:" target="Ady-hI-5gd" id="UvS-8e-Qdg"/>
</connections>
</menuItem>
<menuItem title="Paste and Match Style" keyEquivalent="V" id="WeT-3V-zwk">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="pasteAsPlainText:" target="Ady-hI-5gd" id="cEh-KX-wJQ"/>
</connections>
</menuItem>
<menuItem title="Delete" id="pa3-QI-u2k">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="delete:" target="Ady-hI-5gd" id="0Mk-Ml-PaM"/>
</connections>
</menuItem>
<menuItem title="Select All" keyEquivalent="a" id="Ruw-6m-B2m">
<connections>
<action selector="selectAll:" target="Ady-hI-5gd" id="VNm-Mi-diN"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="uyl-h8-XO2"/>
<menuItem title="Find" id="4EN-yA-p0u">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Find" id="1b7-l0-nxx">
<items>
<menuItem title="Find…" tag="1" keyEquivalent="f" id="Xz5-n4-O0W">
<connections>
<action selector="performFindPanelAction:" target="Ady-hI-5gd" id="cD7-Qs-BN4"/>
</connections>
</menuItem>
<menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="YEy-JH-Tfz">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="performFindPanelAction:" target="Ady-hI-5gd" id="WD3-Gg-5AJ"/>
</connections>
</menuItem>
<menuItem title="Find Next" tag="2" keyEquivalent="g" id="q09-fT-Sye">
<connections>
<action selector="performFindPanelAction:" target="Ady-hI-5gd" id="NDo-RZ-v9R"/>
</connections>
</menuItem>
<menuItem title="Find Previous" tag="3" keyEquivalent="G" id="OwM-mh-QMV">
<connections>
<action selector="performFindPanelAction:" target="Ady-hI-5gd" id="HOh-sY-3ay"/>
</connections>
</menuItem>
<menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="buJ-ug-pKt">
<connections>
<action selector="performFindPanelAction:" target="Ady-hI-5gd" id="U76-nv-p5D"/>
</connections>
</menuItem>
<menuItem title="Jump to Selection" keyEquivalent="j" id="S0p-oC-mLd">
<connections>
<action selector="centerSelectionInVisibleArea:" target="Ady-hI-5gd" id="IOG-6D-g5B"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Spelling and Grammar" id="Dv1-io-Yv7">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Spelling" id="3IN-sU-3Bg">
<items>
<menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="HFo-cy-zxI">
<connections>
<action selector="showGuessPanel:" target="Ady-hI-5gd" id="vFj-Ks-hy3"/>
</connections>
</menuItem>
<menuItem title="Check Document Now" keyEquivalent=";" id="hz2-CU-CR7">
<connections>
<action selector="checkSpelling:" target="Ady-hI-5gd" id="fz7-VC-reM"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="bNw-od-mp5"/>
<menuItem title="Check Spelling While Typing" id="rbD-Rh-wIN">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleContinuousSpellChecking:" target="Ady-hI-5gd" id="7w6-Qz-0kB"/>
</connections>
</menuItem>
<menuItem title="Check Grammar With Spelling" id="mK6-2p-4JG">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleGrammarChecking:" target="Ady-hI-5gd" id="muD-Qn-j4w"/>
</connections>
</menuItem>
<menuItem title="Correct Spelling Automatically" id="78Y-hA-62v">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticSpellingCorrection:" target="Ady-hI-5gd" id="2lM-Qi-WAP"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Substitutions" id="9ic-FL-obx">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Substitutions" id="FeM-D8-WVr">
<items>
<menuItem title="Show Substitutions" id="z6F-FW-3nz">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontSubstitutionsPanel:" target="Ady-hI-5gd" id="oku-mr-iSq"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="gPx-C9-uUO"/>
<menuItem title="Smart Copy/Paste" id="9yt-4B-nSM">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleSmartInsertDelete:" target="Ady-hI-5gd" id="3IJ-Se-DZD"/>
</connections>
</menuItem>
<menuItem title="Smart Quotes" id="hQb-2v-fYv">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticQuoteSubstitution:" target="Ady-hI-5gd" id="ptq-xd-QOA"/>
</connections>
</menuItem>
<menuItem title="Smart Dashes" id="rgM-f4-ycn">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticDashSubstitution:" target="Ady-hI-5gd" id="oCt-pO-9gS"/>
</connections>
</menuItem>
<menuItem title="Smart Links" id="cwL-P1-jid">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticLinkDetection:" target="Ady-hI-5gd" id="Gip-E3-Fov"/>
</connections>
</menuItem>
<menuItem title="Data Detectors" id="tRr-pd-1PS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticDataDetection:" target="Ady-hI-5gd" id="R1I-Nq-Kbl"/>
</connections>
</menuItem>
<menuItem title="Text Replacement" id="HFQ-gK-NFA">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticTextReplacement:" target="Ady-hI-5gd" id="DvP-Fe-Py6"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Transformations" id="2oI-Rn-ZJC">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Transformations" id="c8a-y6-VQd">
<items>
<menuItem title="Make Upper Case" id="vmV-6d-7jI">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="uppercaseWord:" target="Ady-hI-5gd" id="sPh-Tk-edu"/>
</connections>
</menuItem>
<menuItem title="Make Lower Case" id="d9M-CD-aMd">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="lowercaseWord:" target="Ady-hI-5gd" id="iUZ-b5-hil"/>
</connections>
</menuItem>
<menuItem title="Capitalize" id="UEZ-Bs-lqG">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="capitalizeWord:" target="Ady-hI-5gd" id="26H-TL-nsh"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Speech" id="xrE-MZ-jX0">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Speech" id="3rS-ZA-NoH">
<items>
<menuItem title="Start Speaking" id="Ynk-f8-cLZ">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="startSpeaking:" target="Ady-hI-5gd" id="654-Ng-kyl"/>
</connections>
</menuItem>
<menuItem title="Stop Speaking" id="Oyz-dy-DGm">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="stopSpeaking:" target="Ady-hI-5gd" id="dX8-6p-jy9"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Format" id="jxT-CU-nIS">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Format" id="GEO-Iw-cKr">
<items>
<menuItem title="Font" id="Gi5-1S-RQB">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Font" systemMenu="font" id="aXa-aM-Jaq">
<items>
<menuItem title="Show Fonts" keyEquivalent="t" id="Q5e-8K-NDq"/>
<menuItem title="Bold" tag="2" keyEquivalent="b" id="GB9-OM-e27"/>
<menuItem title="Italic" tag="1" keyEquivalent="i" id="Vjx-xi-njq"/>
<menuItem title="Underline" keyEquivalent="u" id="WRG-CD-K1S">
<connections>
<action selector="underline:" target="Ady-hI-5gd" id="FYS-2b-JAY"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="5gT-KC-WSO"/>
<menuItem title="Bigger" tag="3" keyEquivalent="+" id="Ptp-SP-VEL"/>
<menuItem title="Smaller" tag="4" keyEquivalent="-" id="i1d-Er-qST"/>
<menuItem isSeparatorItem="YES" id="kx3-Dk-x3B"/>
<menuItem title="Kern" id="jBQ-r6-VK2">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Kern" id="tlD-Oa-oAM">
<items>
<menuItem title="Use Default" id="GUa-eO-cwY">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useStandardKerning:" target="Ady-hI-5gd" id="6dk-9l-Ckg"/>
</connections>
</menuItem>
<menuItem title="Use None" id="cDB-IK-hbR">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="turnOffKerning:" target="Ady-hI-5gd" id="U8a-gz-Maa"/>
</connections>
</menuItem>
<menuItem title="Tighten" id="46P-cB-AYj">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="tightenKerning:" target="Ady-hI-5gd" id="hr7-Nz-8ro"/>
</connections>
</menuItem>
<menuItem title="Loosen" id="ogc-rX-tC1">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="loosenKerning:" target="Ady-hI-5gd" id="8i4-f9-FKE"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Ligatures" id="o6e-r0-MWq">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Ligatures" id="w0m-vy-SC9">
<items>
<menuItem title="Use Default" id="agt-UL-0e3">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useStandardLigatures:" target="Ady-hI-5gd" id="7uR-wd-Dx6"/>
</connections>
</menuItem>
<menuItem title="Use None" id="J7y-lM-qPV">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="turnOffLigatures:" target="Ady-hI-5gd" id="iX2-gA-Ilz"/>
</connections>
</menuItem>
<menuItem title="Use All" id="xQD-1f-W4t">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useAllLigatures:" target="Ady-hI-5gd" id="KcB-kA-TuK"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Baseline" id="OaQ-X3-Vso">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Baseline" id="ijk-EB-dga">
<items>
<menuItem title="Use Default" id="3Om-Ey-2VK">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="unscript:" target="Ady-hI-5gd" id="0vZ-95-Ywn"/>
</connections>
</menuItem>
<menuItem title="Superscript" id="Rqc-34-cIF">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="superscript:" target="Ady-hI-5gd" id="3qV-fo-wpU"/>
</connections>
</menuItem>
<menuItem title="Subscript" id="I0S-gh-46l">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="subscript:" target="Ady-hI-5gd" id="Q6W-4W-IGz"/>
</connections>
</menuItem>
<menuItem title="Raise" id="2h7-ER-AoG">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="raiseBaseline:" target="Ady-hI-5gd" id="4sk-31-7Q9"/>
</connections>
</menuItem>
<menuItem title="Lower" id="1tx-W0-xDw">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="lowerBaseline:" target="Ady-hI-5gd" id="OF1-bc-KW4"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem isSeparatorItem="YES" id="Ndw-q3-faq"/>
<menuItem title="Show Colors" keyEquivalent="C" id="bgn-CT-cEk">
<connections>
<action selector="orderFrontColorPanel:" target="Ady-hI-5gd" id="mSX-Xz-DV3"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="iMs-zA-UFJ"/>
<menuItem title="Copy Style" keyEquivalent="c" id="5Vv-lz-BsD">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="copyFont:" target="Ady-hI-5gd" id="GJO-xA-L4q"/>
</connections>
</menuItem>
<menuItem title="Paste Style" keyEquivalent="v" id="vKC-jM-MkH">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="pasteFont:" target="Ady-hI-5gd" id="JfD-CL-leO"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Text" id="Fal-I4-PZk">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Text" id="d9c-me-L2H">
<items>
<menuItem title="Align Left" keyEquivalent="{" id="ZM1-6Q-yy1">
<connections>
<action selector="alignLeft:" target="Ady-hI-5gd" id="zUv-R1-uAa"/>
</connections>
</menuItem>
<menuItem title="Center" keyEquivalent="|" id="VIY-Ag-zcb">
<connections>
<action selector="alignCenter:" target="Ady-hI-5gd" id="spX-mk-kcS"/>
</connections>
</menuItem>
<menuItem title="Justify" id="J5U-5w-g23">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="alignJustified:" target="Ady-hI-5gd" id="ljL-7U-jND"/>
</connections>
</menuItem>
<menuItem title="Align Right" keyEquivalent="}" id="wb2-vD-lq4">
<connections>
<action selector="alignRight:" target="Ady-hI-5gd" id="r48-bG-YeY"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="4s2-GY-VfK"/>
<menuItem title="Writing Direction" id="H1b-Si-o9J">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Writing Direction" id="8mr-sm-Yjd">
<items>
<menuItem title="Paragraph" enabled="NO" id="ZvO-Gk-QUH">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem id="YGs-j5-SAR">
<string key="title"> Default</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionNatural:" target="Ady-hI-5gd" id="qtV-5e-UBP"/>
</connections>
</menuItem>
<menuItem id="Lbh-J2-qVU">
<string key="title"> Left to Right</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionLeftToRight:" target="Ady-hI-5gd" id="S0X-9S-QSf"/>
</connections>
</menuItem>
<menuItem id="jFq-tB-4Kx">
<string key="title"> Right to Left</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionRightToLeft:" target="Ady-hI-5gd" id="5fk-qB-AqJ"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="swp-gr-a21"/>
<menuItem title="Selection" enabled="NO" id="cqv-fj-IhA">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem id="Nop-cj-93Q">
<string key="title"> Default</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionNatural:" target="Ady-hI-5gd" id="lPI-Se-ZHp"/>
</connections>
</menuItem>
<menuItem id="BgM-ve-c93">
<string key="title"> Left to Right</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionLeftToRight:" target="Ady-hI-5gd" id="caW-Bv-w94"/>
</connections>
</menuItem>
<menuItem id="RB4-Sm-HuC">
<string key="title"> Right to Left</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionRightToLeft:" target="Ady-hI-5gd" id="EXD-6r-ZUu"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem isSeparatorItem="YES" id="fKy-g9-1gm"/>
<menuItem title="Show Ruler" id="vLm-3I-IUL">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleRuler:" target="Ady-hI-5gd" id="FOx-HJ-KwY"/>
</connections>
</menuItem>
<menuItem title="Copy Ruler" keyEquivalent="c" id="MkV-Pr-PK5">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="copyRuler:" target="Ady-hI-5gd" id="71i-fW-3W2"/>
</connections>
</menuItem>
<menuItem title="Paste Ruler" keyEquivalent="v" id="LVM-kO-fVI">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="pasteRuler:" target="Ady-hI-5gd" id="cSh-wd-qM2"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="View" id="H8h-7b-M4v">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="View" id="HyV-fh-RgO">
<items>
<menuItem title="Show Toolbar" keyEquivalent="t" id="snW-S8-Cw5">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="toggleToolbarShown:" target="Ady-hI-5gd" id="BXY-wc-z0C"/>
</connections>
</menuItem>
<menuItem title="Customize Toolbar…" id="1UK-8n-QPP">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="runToolbarCustomizationPalette:" target="Ady-hI-5gd" id="pQI-g3-MTW"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Window" id="aUF-d1-5bR">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Window" systemMenu="window" id="Td7-aD-5lo">
<items>
<menuItem title="Minimize" keyEquivalent="m" id="OY7-WF-poV">
<connections>
<action selector="performMiniaturize:" target="Ady-hI-5gd" id="VwT-WD-YPe"/>
</connections>
</menuItem>
<menuItem title="Zoom" id="R4o-n2-Eq4">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="performZoom:" target="Ady-hI-5gd" id="DIl-cC-cCs"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="eu3-7i-yIM"/>
<menuItem title="Bring All to Front" id="LE2-aR-0XJ">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="arrangeInFront:" target="Ady-hI-5gd" id="DRN-fu-gQh"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Help" id="wpr-3q-Mcd">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Help" systemMenu="help" id="F2S-fz-NVQ">
<items>
<menuItem title="JWTDesktop Help" keyEquivalent="?" id="FKE-Sm-Kum">
<connections>
<action selector="showHelp:" target="Ady-hI-5gd" id="y7X-2Q-9no"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
<connections>
<outlet property="delegate" destination="Voe-Tx-rLC" id="PrD-fu-P6m"/>
</connections>
</application>
<customObject id="Voe-Tx-rLC" customClass="AppDelegate"/>
<customObject id="Ady-hI-5gd" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="75" y="0.0"/>
</scene>
<!--Window Controller-->
<scene sceneID="R2V-B0-nI4">
<objects>
<windowController id="B8D-0N-5wS" sceneMemberID="viewController">
<window key="window" title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="IQv-IB-iLA">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="196" y="240" width="1200" height="700"/>
<rect key="screenRect" x="0.0" y="0.0" width="1680" height="1027"/>
<value key="minSize" type="size" width="1200" height="700"/>
<connections>
<outlet property="delegate" destination="B8D-0N-5wS" id="aef-aY-oqt"/>
</connections>
</window>
<connections>
<segue destination="XfG-lQ-9wD" kind="relationship" relationship="window.shadowedContentViewController" id="cq2-FE-JQM"/>
</connections>
</windowController>
<customObject id="Oky-zY-oP4" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="75" y="250"/>
</scene>
<!--View Controller-->
<scene sceneID="hIz-AP-VOD">
<objects>
<viewController id="XfG-lQ-9wD" customClass="ViewController" sceneMemberID="viewController">
<view key="view" id="m2S-Jp-Qdl">
<rect key="frame" x="0.0" y="0.0" width="480" height="419"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="D7O-XY-wd0" userLabel="AlgorithmLabel">
<rect key="frame" x="200" y="372" width="42" height="17"/>
<constraints>
<constraint firstAttribute="height" constant="17" id="ogT-iD-x9z"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Label" id="Mqt-PB-Gyr">
<font key="font" metaFont="system" size="15"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="yLZ-Ur-huV" userLabel="AlgorithmPopUpButton">
<rect key="frame" x="245" y="367" width="78" height="25"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="ZCZ-l0-XGK" id="MuX-3E-XCZ">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="tac-Di-AVm">
<items>
<menuItem title="Item 1" state="on" id="ZCZ-l0-XGK"/>
<menuItem title="Item 2" id="vFH-Hr-A7D"/>
<menuItem title="Item 3" id="Lh6-h4-7w2"/>
</items>
</menu>
</popUpButtonCell>
</popUpButton>
<scrollView horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="vXl-0B-yeH" userLabel="EncodedTextView">
<rect key="frame" x="0.0" y="60" width="240" height="214"/>
<clipView key="contentView" drawsBackground="NO" id="R7p-T4-mLk">
<rect key="frame" x="1" y="1" width="223" height="212"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textView importsGraphics="NO" verticallyResizable="YES" usesFontPanel="YES" findStyle="panel" continuousSpellChecking="YES" allowsUndo="YES" usesRuler="YES" allowsNonContiguousLayout="YES" quoteSubstitution="YES" dashSubstitution="YES" spellingCorrection="YES" smartInsertDelete="YES" id="RyK-m8-XF3">
<rect key="frame" x="0.0" y="0.0" width="223" height="212"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
<size key="minSize" width="223" height="212"/>
<size key="maxSize" width="463" height="10000000"/>
<color key="insertionPointColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
</textView>
</subviews>
</clipView>
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="YES" id="SoX-cs-HKu">
<rect key="frame" x="-100" y="-100" width="87" height="18"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" verticalHuggingPriority="750" horizontal="NO" id="zi3-uo-nJE">
<rect key="frame" x="224" y="1" width="15" height="212"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="z9r-5V-pdS" userLabel="SignatureStatusLabel">
<rect key="frame" x="-2" y="0.0" width="484" height="42"/>
<constraints>
<constraint firstAttribute="height" constant="42" id="6dl-ZT-MyL"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Label" id="VyQ-In-KTB">
<font key="font" metaFont="system" size="20"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="onc-Qp-bvF" userLabel="DecriptedView">
<rect key="frame" x="240" y="60" width="240" height="214"/>
</customView>
<scrollView hidden="YES" autohidesScrollers="YES" horizontalLineScroll="19" horizontalPageScroll="10" verticalLineScroll="19" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="YfF-j3-Hxy">
<rect key="frame" x="240" y="60" width="240" height="214"/>
<clipView key="contentView" id="EN9-WY-TeV">
<rect key="frame" x="1" y="1" width="238" height="212"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnSelection="YES" multipleSelection="NO" autosaveColumns="NO" rowSizeStyle="automatic" headerView="XGD-yA-t3I" viewBased="YES" id="k0L-7X-cJD">
<rect key="frame" x="0.0" y="0.0" width="238" height="189"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<size key="intercellSpacing" width="3" height="2"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<tableColumns>
<tableColumn width="116" minWidth="40" maxWidth="1000" id="LUu-TS-BnO">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border">
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
</tableHeaderCell>
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" title="Text Cell" id="zVw-sn-xsB">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
<prototypeCellViews>
<tableCellView id="Ndj-Sw-gih">
<rect key="frame" x="1" y="1" width="121" height="17"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ECA-No-Hn9">
<rect key="frame" x="0.0" y="0.0" width="100" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="ZpF-cY-Xm5">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<connections>
<outlet property="textField" destination="ECA-No-Hn9" id="osv-Pt-m98"/>
</connections>
</tableCellView>
</prototypeCellViews>
</tableColumn>
<tableColumn width="107" minWidth="40" maxWidth="1000" id="57l-wv-6gg">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border">
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
</tableHeaderCell>
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" title="Text Cell" id="pzs-PF-w82">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
<prototypeCellViews>
<tableCellView id="VaR-Ux-pdL">
<rect key="frame" x="125" y="1" width="111" height="17"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="M6U-vg-KMX">
<rect key="frame" x="0.0" y="0.0" width="100" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="Thw-Ot-bJy">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<connections>
<outlet property="textField" destination="M6U-vg-KMX" id="RwW-7Y-Ysb"/>
</connections>
</tableCellView>
</prototypeCellViews>
</tableColumn>
</tableColumns>
</tableView>
</subviews>
</clipView>
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="ZeW-jA-PoF">
<rect key="frame" x="1" y="403" width="0.0" height="15"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="NO" id="HyQ-Zd-Vdq">
<rect key="frame" x="224" y="17" width="15" height="102"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<tableHeaderView key="headerView" wantsLayer="YES" id="XGD-yA-t3I">
<rect key="frame" x="0.0" y="0.0" width="238" height="23"/>
<autoresizingMask key="autoresizingMask"/>
</tableHeaderView>
</scrollView>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="r3U-FI-Ege" userLabel="SecretLabel">
<rect key="frame" x="200" y="333" width="42" height="19"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Label" id="fQG-yn-1WT">
<font key="font" metaFont="system" size="15"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="BTt-D8-1HI" userLabel="SecretTextField">
<rect key="frame" x="248" y="332" width="96" height="21"/>
<constraints>
<constraint firstAttribute="width" constant="96" id="s60-lV-Tu8"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="Bvo-u9-SsL">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button translatesAutoresizingMaskIntoConstraints="NO" id="Keu-Ro-sxF" userLabel="SecretBase64EncodedCheckButton">
<rect key="frame" x="350" y="334" width="65" height="18"/>
<buttonCell key="cell" type="check" title="Check" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="Gz5-wv-UKC">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="hHo-Z6-vG4">
<rect key="frame" x="246" y="295" width="65" height="18"/>
<buttonCell key="cell" type="check" title="Check" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="EV4-dK-pUy">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="aAy-qn-Th9" userLabel="SecretLabel">
<rect key="frame" x="200" y="294" width="42" height="19"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Label" id="p8g-IV-fjY">
<font key="font" metaFont="system" size="15"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<constraints>
<constraint firstItem="onc-Qp-bvF" firstAttribute="bottom" secondItem="vXl-0B-yeH" secondAttribute="bottom" id="0HY-I0-wEK"/>
<constraint firstItem="r3U-FI-Ege" firstAttribute="top" secondItem="D7O-XY-wd0" secondAttribute="bottom" constant="20" id="1Qf-Ce-W8e"/>
<constraint firstItem="vXl-0B-yeH" firstAttribute="width" secondItem="m2S-Jp-Qdl" secondAttribute="width" multiplier="0.5" id="3Dn-kb-PNS"/>
<constraint firstItem="z9r-5V-pdS" firstAttribute="leading" secondItem="m2S-Jp-Qdl" secondAttribute="leading" id="494-o1-g5h"/>
<constraint firstItem="r3U-FI-Ege" firstAttribute="trailing" secondItem="D7O-XY-wd0" secondAttribute="trailing" id="EIi-q3-9Wt"/>
<constraint firstAttribute="trailing" secondItem="z9r-5V-pdS" secondAttribute="trailing" id="JXb-Wb-ogn"/>
<constraint firstItem="YfF-j3-Hxy" firstAttribute="width" secondItem="m2S-Jp-Qdl" secondAttribute="width" multiplier="0.5" id="LZE-Uu-4nJ"/>
<constraint firstItem="vXl-0B-yeH" firstAttribute="top" secondItem="aAy-qn-Th9" secondAttribute="bottom" constant="20" id="NvW-rU-RUb"/>
<constraint firstItem="aAy-qn-Th9" firstAttribute="trailing" secondItem="r3U-FI-Ege" secondAttribute="trailing" id="O2p-ba-IzE"/>
<constraint firstItem="yLZ-Ur-huV" firstAttribute="leading" secondItem="D7O-XY-wd0" secondAttribute="trailing" constant="8" id="Vkp-E6-cas"/>
<constraint firstItem="vXl-0B-yeH" firstAttribute="leading" secondItem="m2S-Jp-Qdl" secondAttribute="leading" id="WNg-2P-bo9"/>
<constraint firstAttribute="bottom" secondItem="z9r-5V-pdS" secondAttribute="bottom" id="Xhx-2U-thk"/>
<constraint firstItem="onc-Qp-bvF" firstAttribute="top" secondItem="vXl-0B-yeH" secondAttribute="top" id="Ziw-za-CvC"/>
<constraint firstItem="aAy-qn-Th9" firstAttribute="centerY" secondItem="hHo-Z6-vG4" secondAttribute="centerY" id="ajs-pE-Qpb"/>
<constraint firstItem="aAy-qn-Th9" firstAttribute="top" secondItem="r3U-FI-Ege" secondAttribute="bottom" constant="20" id="fJy-4P-4fw"/>
<constraint firstItem="BTt-D8-1HI" firstAttribute="centerY" secondItem="r3U-FI-Ege" secondAttribute="centerY" id="fjf-QS-OxH"/>
<constraint firstItem="YfF-j3-Hxy" firstAttribute="top" secondItem="vXl-0B-yeH" secondAttribute="top" id="g8n-YR-4sW"/>
<constraint firstItem="yLZ-Ur-huV" firstAttribute="centerY" secondItem="D7O-XY-wd0" secondAttribute="centerY" id="lAI-mA-w2k"/>
<constraint firstItem="BTt-D8-1HI" firstAttribute="leading" secondItem="r3U-FI-Ege" secondAttribute="trailing" constant="8" id="lG2-WC-bz8"/>
<constraint firstItem="YfF-j3-Hxy" firstAttribute="bottom" secondItem="vXl-0B-yeH" secondAttribute="bottom" id="mIQ-YL-mwL"/>
<constraint firstItem="z9r-5V-pdS" firstAttribute="top" secondItem="vXl-0B-yeH" secondAttribute="bottom" constant="18" id="oca-GD-oG2"/>
<constraint firstItem="Keu-Ro-sxF" firstAttribute="leading" secondItem="BTt-D8-1HI" secondAttribute="trailing" constant="8" id="pXk-7F-X4I"/>
<constraint firstItem="Keu-Ro-sxF" firstAttribute="centerY" secondItem="BTt-D8-1HI" secondAttribute="centerY" id="qbF-2d-lJ7"/>
<constraint firstItem="D7O-XY-wd0" firstAttribute="trailing" secondItem="vXl-0B-yeH" secondAttribute="trailing" id="rjF-97-w5U"/>
<constraint firstItem="hHo-Z6-vG4" firstAttribute="leading" secondItem="aAy-qn-Th9" secondAttribute="trailing" constant="8" id="sk8-3o-le0"/>
<constraint firstItem="onc-Qp-bvF" firstAttribute="width" secondItem="m2S-Jp-Qdl" secondAttribute="width" multiplier="0.5" id="tPn-hi-t4X"/>
<constraint firstItem="D7O-XY-wd0" firstAttribute="top" secondItem="m2S-Jp-Qdl" secondAttribute="top" constant="30" id="uuY-0O-dAg"/>
<constraint firstAttribute="trailing" secondItem="YfF-j3-Hxy" secondAttribute="trailing" id="wyt-Tf-7aH"/>
<constraint firstAttribute="trailing" secondItem="onc-Qp-bvF" secondAttribute="trailing" id="zLM-Zt-oqT"/>
</constraints>
</view>
<connections>
<outlet property="algorithmLabel" destination="D7O-XY-wd0" id="1ue-3n-vwa"/>
<outlet property="algorithmPopUpButton" destination="yLZ-Ur-huV" id="EQM-5o-5aG"/>
<outlet property="decodedTableView" destination="k0L-7X-cJD" id="xYU-YU-Cqr"/>
<outlet property="decriptedView" destination="onc-Qp-bvF" id="OGU-wc-0es"/>
<outlet property="encodedTextView" destination="RyK-m8-XF3" id="d26-Oy-Vfp"/>
<outlet property="secretIsBase64EncodedCheckButton" destination="Keu-Ro-sxF" id="tt7-ed-K8b"/>
<outlet property="secretLabel" destination="r3U-FI-Ege" id="QLn-bc-q86"/>
<outlet property="secretTextField" destination="BTt-D8-1HI" id="dpP-AC-fcK"/>
<outlet property="signatureLabel" destination="aAy-qn-Th9" id="Unh-fc-8fV"/>
<outlet property="signatureStatusLabel" destination="z9r-5V-pdS" id="TG0-L5-4mT"/>
<outlet property="signatureVerificationCheckButton" destination="hHo-Z6-vG4" id="rwD-7l-L6q"/>
</connections>
</viewController>
<customObject id="rPt-NT-nkU" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="75" y="729.5"/>
</scene>
</scenes>
</document>
================================================
FILE: Example/JWTDesktop/JWTDesktop/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSMinimumSystemVersion</key>
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2016 JWT. All rights reserved.</string>
<key>NSMainStoryboardFile</key>
<string>Main</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
</dict>
</plist>
================================================
FILE: Example/JWTDesktop/JWTDesktop/JWTDecriptedCollectionViewItem.h
================================================
//
// JWTDecriptedCollectionViewItem.h
// JWTDesktop
//
// Created by Lobanov Dmitry on 25.09.16.
// Copyright © 2016 JWT. All rights reserved.
//
#import <Cocoa/Cocoa.h>
@interface JWTDecriptedCollectionViewItem : NSCollectionViewItem
- (void)updateWithText:(NSString *)text;
- (void)updateWithTextColor:(NSColor *)color;
+ (NSFont *)defaultFont;
@end
================================================
FILE: Example/JWTDesktop/JWTDesktop/JWTDecriptedCollectionViewItem.m
================================================
//
// JWTDecriptedCollectionViewItem.m
// JWTDesktop
//
// Created by Lobanov Dmitry on 25.09.16.
// Copyright © 2016 JWT. All rights reserved.
//
#import "JWTDecriptedCollectionViewItem.h"
@interface JWTDecriptedCollectionViewItem ()
@property (unsafe_unretained) IBOutlet NSTextView *textView;
@end
@implementation JWTDecriptedCollectionViewItem
- (void)updateWithText:(NSString *)text {
self.textView.string = text;
}
- (void)updateWithTextColor:(NSColor *)color {
self.textView.textColor = color;
}
- (void)viewDidLoad {
[super viewDidLoad];
self.textView.font = [self.class defaultFont];
// Do view setup here.
}
+ (NSFont *)defaultFont {
return [NSFont boldSystemFontOfSize:14];
}
@end
================================================
FILE: Example/JWTDesktop/JWTDesktop/JWTDecriptedCollectionViewItem.xib
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="11201" systemVersion="16A323" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="11201"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="JWTDecriptedCollectionViewItem">
<connections>
<outlet property="textView" destination="i9Y-Iw-i8t" id="d8h-28-2Lq"/>
<outlet property="view" destination="Hz6-mo-xeY" id="0bl-1N-x8E"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<customView id="Hz6-mo-xeY">
<rect key="frame" x="0.0" y="0.0" width="480" height="272"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<scrollView horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="dM4-Vi-CAL">
<rect key="frame" x="0.0" y="0.0" width="480" height="272"/>
<clipView key="contentView" id="lrE-qz-q1N">
<rect key="frame" x="1" y="1" width="463" height="270"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textView importsGraphics="NO" usesFontPanel="YES" findStyle="panel" continuousSpellChecking="YES" allowsUndo="YES" usesRuler="YES" allowsNonContiguousLayout="YES" quoteSubstitution="YES" dashSubstitution="YES" spellingCorrection="YES" smartInsertDelete="YES" id="i9Y-Iw-i8t">
<rect key="frame" x="0.0" y="0.0" width="463" height="270"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<size key="minSize" width="463" height="270"/>
<size key="maxSize" width="463" height="10000000"/>
<color key="insertionPointColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
</textView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</clipView>
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="YES" id="Pmr-2V-7m1">
<rect key="frame" x="-100" y="-100" width="87" height="18"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" verticalHuggingPriority="750" doubleValue="1" horizontal="NO" id="zk4-hr-bjg">
<rect key="frame" x="464" y="1" width="15" height="270"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
</subviews>
<constraints>
<constraint firstItem="dM4-Vi-CAL" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" id="7wm-ca-hSR"/>
<constraint firstAttribute="trailing" secondItem="dM4-Vi-CAL" secondAttribute="trailing" id="gmh-Ft-0ot"/>
<constraint firstAttribute="bottom" secondItem="dM4-Vi-CAL" secondAttribute="bottom" id="kJd-T3-rsJ"/>
<constraint firstItem="dM4-Vi-CAL" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" id="xkw-5U-Pg1"/>
</constraints>
</customView>
</objects>
</document>
================================================
FILE: Example/JWTDesktop/JWTDesktop/JWTDecriptedViewController.h
================================================
//
// JWTDecriptedViewController.h
// JWTDesktop
//
// Created by Lobanov Dmitry on 25.09.16.
// Copyright © 2016 JWT. All rights reserved.
//
@import Cocoa;
@import JWT;
@interface JWTDecriptedViewController : NSViewController
@property (strong, nonatomic, readwrite) JWTBuilder *builder;
@property (strong, nonatomic, readwrite) JWTCodingResultType *resultType;
@end
================================================
FILE: Example/JWTDesktop/JWTDesktop/JWTDecriptedViewController.m
================================================
//
// JWTDecriptedViewController.m
// JWTDesktop
//
// Created by Lobanov Dmitry on 25.09.16.
// Copyright © 2016 JWT. All rights reserved.
//
#import "JWTDecriptedViewController.h"
#import "JWTDecriptedCollectionViewItem.h"
#import "JWTTokenTextTypeDescription.h"
@interface JWTDecriptedViewController ()
@property (weak) IBOutlet NSCollectionView *collectionView;
@property (copy, nonatomic, readwrite) NSString *collectionViewItemIdentifier;
@property (strong, nonatomic, readwrite) NSArray *cachedResultArray;
@property (strong, nonatomic, readwrite) NSDictionary *cachedErrorDictionary;
@property (assign, nonatomic, readwrite) NSInteger countOfRows;
@property (strong, nonatomic, readwrite) JWTTokenTextTypeDescription *tokenDescription;
@end
@interface JWTDecriptedViewController (NSCollectionViewDelegateFlowLayout)<NSCollectionViewDelegateFlowLayout>
@end
@interface JWTDecriptedViewController (NSCollectionViewDataSource)<NSCollectionViewDataSource>
@end
@implementation JWTDecriptedViewController
- (void)setupUIElements {
self.collectionView.delegate = self;
self.collectionView.dataSource = self;
self.collectionView.minItemSize = NSZeroSize;
self.collectionView.maxItemSize = NSZeroSize;
[self.collectionView registerClass:[JWTDecriptedCollectionViewItem class] forItemWithIdentifier:self.collectionViewItemIdentifier];
}
- (void)viewDidLoad {
[super viewDidLoad];
[self setupUIElements];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reload) name:NSWindowDidResizeNotification object:nil];
}
- (void)reload {
[self reloadCollectionView];
}
- (void)reloadCollectionView {
[self.collectionView reloadData];
}
- (NSString *)jsonStringWithObject:(NSDictionary *)object {
if (object == nil) {
return @"";
}
NSError *error = nil;
NSData *data = [NSJSONSerialization dataWithJSONObject:object options:NSJSONWritingPrettyPrinted error:&error];
if (error != nil) {
return @"";
}
NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
return string ?: @"";
}
- (void)reloadData {
self.cachedResultArray = nil;
self.cachedErrorDictionary = nil;
if (self.resultType) {
if (self.resultType.successResult) {
NSDictionary *result = self.resultType.successResult.headerAndPayloadDictionary;
__auto_type claimsSetStorage = self.resultType.successResult.claimsSetStorage;
__auto_type serializer = [JWTClaimsSetSerializerBase new];
serializer.skipClaimsProviderLookupCheck = YES;
NSDictionary *claims = [serializer dictionaryFromClaimsSet:claimsSetStorage];
self.cachedResultArray = @[
@{@"header" : result[JWTCodingResultComponents.headers] ?: @""},
@{@"payload" : result[JWTCodingResultComponents.payload] ?: @""},
@{@"claimsSet" : claims ?: @""}
];
}
else {
NSString *errorDescription = self.resultType.errorResult.error ? self.resultType.errorResult.error.localizedDescription : @"UnknownError! Report about it!";
self.cachedErrorDictionary = @{
@"error" : errorDescription
};
}
}
else {
NSDictionary *result = self.builder.decode;
if (self.builder.jwtError != nil) {
self.cachedErrorDictionary = @{
@"error" : self.builder.jwtError.localizedDescription
};
}
else if (result != nil) {
self.cachedResultArray = @[
@{@"header" : result[@"header"] ?: @""},
@{@"payload" : result[@"payload"] ?: @""}
];
}
}
}
- (NSInteger)countOfRows {
if (self.cachedErrorDictionary) {
return 1;
}
else if (self.cachedResultArray) {
return self.cachedResultArray.count;
}
else {
return 0;
}
}
- (NSString *)collectionViewItemIdentifier {
if (_collectionViewItemIdentifier == nil) {
_collectionViewItemIdentifier = NSStringFromClass([JWTDecriptedCollectionViewItem class]);
}
return _collectionViewItemIdentifier;
}
- (void)setBuilder:(JWTBuilder *)builder {
if (_builder != builder) {
_builder = builder;
[self reloadData];
[self reloadCollectionView];
}
}
- (void)setResultType:(JWTCodingResultType *)resultType {
if (_resultType != resultType) {
_resultType = resultType;
[self reloadData];
[self reloadCollectionView];
}
}
- (JWTTokenTextTypeDescription *)tokenDescription {
if (!_tokenDescription) {
_tokenDescription = [JWTTokenTextTypeDescription new];
}
return _tokenDescription;
}
#pragma mark - Collection Helpers.
- (NSString *)textForItemAtIndexPath:(NSIndexPath *)path {
NSDictionary *itemResult = nil;
if (self.cachedErrorDictionary != nil) {
itemResult = self.cachedErrorDictionary;
}
else if(self.cachedResultArray != nil) {
itemResult = self.cachedResultArray[path.item];
}
NSString *text = [self jsonStringWithObject:itemResult];
return text;
}
- (NSColor *)colorWithIndexPath:(NSIndexPath *)path {
NSColor *color = nil;
if (self.cachedErrorDictionary) {
color = [self.tokenDescription colorForType:JWTTokenTextTypeHeader];
}
else if (self.cachedResultArray) {
JWTTokenTextType type = MAX(JWTTokenTextTypeDefault, MIN(path.item + 1, JWTTokenTextTypeSignature));
color = [self.tokenDescription colorForType:type];
}
return color;
}
@end
@implementation JWTDecriptedViewController (NSCollectionViewDelegateFlowLayout)
- (NSSize)sizeWithText:(NSString *)text withWidth:(NSInteger)width {
return NSZeroSize;
}
- (NSSize)collectionView:(NSCollectionView *)collectionView layout:(NSCollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
NSString *stringToDisplay = [self textForItemAtIndexPath:indexPath];
CGFloat width = collectionView.frame.size.width;//[[collectionView enclosingScrollView] bounds].size.width;
NSRect estimatedSize = [stringToDisplay boundingRectWithSize:CGSizeMake(width, 10000) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:@{/*NSForegroundColorAttributeName : nil,*/ NSFontAttributeName : JWTDecriptedCollectionViewItem.defaultFont }];
NSInteger height = estimatedSize.size.height;
NSSize size = NSMakeSize(width, height);
return size;
}
@end
@implementation JWTDecriptedViewController (NSCollectionViewDataSource)
- (NSInteger)collectionView:(NSCollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
NSInteger count = self.countOfRows;
return count;
}
- (NSInteger)numberOfSectionsInCollectionView:(NSCollectionView *)collectionView {
return 1;
}
- (NSCollectionViewItem *)collectionView:(NSCollectionView *)collectionView itemForRepresentedObjectAtIndexPath:(NSIndexPath *)indexPath {
NSCollectionViewItem *item = [collectionView makeItemWithIdentifier:self.collectionViewItemIdentifier forIndexPath:indexPath];
NSString *text = [self textForItemAtIndexPath:indexPath];
JWTDecriptedCollectionViewItem *decriptedItem = (JWTDecriptedCollectionViewItem *)item;
[decriptedItem updateWithText:text];
[decriptedItem updateWithTextColor:[self colorWithIndexPath:indexPath]];
return item;
}
@end
================================================
FILE: Example/JWTDesktop/JWTDesktop/JWTDecriptedViewController.xib
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="11201" systemVersion="16A323" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="11201"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="JWTDecriptedViewController">
<connections>
<outlet property="collectionView" destination="mXP-VW-npz" id="V1D-I4-wcM"/>
<outlet property="view" destination="Hz6-mo-xeY" id="0bl-1N-x8E"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<customView id="Hz6-mo-xeY">
<rect key="frame" x="0.0" y="0.0" width="480" height="272"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<scrollView autohidesScrollers="YES" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Ova-Fc-W4C">
<rect key="frame" x="0.0" y="0.0" width="480" height="272"/>
<clipView key="contentView" id="xMO-YT-V6e">
<rect key="frame" x="1" y="1" width="478" height="270"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<collectionView id="mXP-VW-npz">
<rect key="frame" x="0.0" y="0.0" width="478" height="270"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<collectionViewFlowLayout key="collectionViewLayout" minimumInteritemSpacing="10" minimumLineSpacing="10" id="KcQ-Vu-xXO">
<size key="itemSize" width="50" height="50"/>
</collectionViewFlowLayout>
<color key="primaryBackgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</collectionView>
</subviews>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</clipView>
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="dAS-nP-5HK">
<rect key="frame" x="1" y="144" width="233" height="15"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="NO" id="GVr-s4-nLA">
<rect key="frame" x="234" y="1" width="15" height="143"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
</subviews>
<constraints>
<constraint firstAttribute="bottom" secondItem="Ova-Fc-W4C" secondAttribute="bottom" id="LWr-cT-dGa"/>
<constraint firstItem="Ova-Fc-W4C" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" id="hjX-ov-aWZ"/>
<constraint firstItem="Ova-Fc-W4C" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" id="kHB-Er-WN1"/>
<constraint firstAttribute="trailing" secondItem="Ova-Fc-W4C" secondAttribute="trailing" id="qTj-ZS-hGY"/>
</constraints>
</customView>
</objects>
</document>
================================================
FILE: Example/JWTDesktop/JWTDesktop/JWTTokenDecoder.h
================================================
//
// JWTTokenDecoder.h
// JWTDesktop
//
// Created by Lobanov Dmitry on 30.10.2017.
// Copyright © 2017 JWT. All rights reserved.
//
#import <Foundation/Foundation.h>
@import JWT;
@protocol JWTTokenDecoderNecessaryDataObject__Protocol <NSObject>
@property (copy, nonatomic, readonly) NSString *chosenAlgorithmName;
@property (copy, nonatomic, readonly) NSString *chosenSecret;
@property (copy, nonatomic, readonly) NSData *chosenSecretData;
@property (assign, nonatomic, readonly) BOOL isBase64EncodedSecret;
@end
@protocol JWTTokenDecoderProtocol
- (JWTCodingResultType *)decodeToken:(NSString *)token skipSignatureVerification:(BOOL)skipVerification necessaryDataObject:(id<JWTTokenDecoderNecessaryDataObject__Protocol>)object;
@end
@interface JWTTokenDecoder : NSObject <JWTTokenDecoderProtocol>
@end
================================================
FILE: Example/JWTDesktop/JWTDesktop/JWTTokenDecoder.m
================================================
//
// JWTTokenDecoder.m
// JWTDesktop
//
// Created by Lobanov Dmitry on 30.10.2017.
// Copyright © 2017 JWT. All rights reserved.
//
#import "JWTTokenDecoder.h"
@interface JWTTokenDecoder ()
@property (strong, nonatomic, readwrite) JWTBuilder *builder;
@property (strong, nonatomic, readwrite) JWTCodingResultType *resultType;
@property (strong, nonatomic, readonly) JWTTokenDecoder *theDecoder;
@end
@interface JWTTokenDecoder__V2 : NSObject <JWTTokenDecoderProtocol> @end
@implementation JWTTokenDecoder__V2
- (JWTCodingResultType *)decodeToken:(NSString *)token skipSignatureVerification:(BOOL)skipVerification necessaryDataObject:(id<JWTTokenDecoderNecessaryDataObject__Protocol>)object {
NSLog(@"JWT ENCODED TOKEN: %@", token);
NSString *algorithmName = [object chosenAlgorithmName];
NSLog(@"JWT Algorithm NAME: %@", algorithmName);
JWTBuilder *builder = [JWTBuilder decodeMessage:token].algorithmName(algorithmName).options(@(skipVerification));
NSData *secretData = [object chosenSecretData];
NSString *secret = [object chosenSecret];
BOOL isBase64EncodedSecret = [object isBase64EncodedSecret];
if (![algorithmName isEqualToString:JWTAlgorithmNameNone]) {
if (isBase64EncodedSecret && secretData) {
builder.secretData(secretData);
}
else {
builder.secret(secret);
}
}
NSDictionary *decoded = builder.decode;
NSLog(@"JWT ERROR: %@", builder.jwtError);
NSLog(@"JWT DICTIONARY: %@", decoded);
NSError *theError = builder.jwtError;
JWTCodingResultType *resultType = theError ? [[JWTCodingResultType alloc] initWithErrorResult:[[JWTCodingResultTypeError alloc] initWithError:theError]] : nil;
return resultType;
}
@end
@interface JWTTokenDecoder__V3 : NSObject <JWTTokenDecoderProtocol> @end
@implementation JWTTokenDecoder__V3
- (JWTCodingResultType *)decodeToken:(NSString *)token skipSignatureVerification:(BOOL)skipVerification necessaryDataObject:(id<JWTTokenDecoderNecessaryDataObject__Protocol>)object {
NSLog(@"JWT ENCODED TOKEN: %@", token);
NSString *algorithmName = [object chosenAlgorithmName];
NSLog(@"JWT Algorithm NAME: %@", algorithmName);
NSData *secretData = [object chosenSecretData];
NSString *secret = [object chosenSecret];
BOOL isBase64EncodedSecret = [object isBase64EncodedSecret];
NSError *theError = nil;
id<JWTAlgorithm> algorithm = [JWTAlgorithmFactory algorithmByName:algorithmName];
if (!algorithm) {
return nil;
}
id<JWTAlgorithmDataHolderProtocol> holder = nil;
if ([algorithm isKindOfClass:[JWTAlgorithmRSBase class]] || [algorithm.name hasPrefix:@"RS"]) {
NSError *keyError = nil;
id<JWTCryptoKeyProtocol>key = [[JWTCryptoKeyPublic alloc] initWithPemEncoded:secret parameters:nil error:&keyError];
theError = keyError;
if (!theError) {
holder = [JWTAlgorithmRSFamilyDataHolder new].verifyKey(key).algorithmName(algorithmName);
}
}
else if ([algorithm isKindOfClass:[JWTAlgorithmHSBase class]]){
JWTAlgorithmHSFamilyDataHolder *aHolder = [JWTAlgorithmHSFamilyDataHolder new];
if (isBase64EncodedSecret && secretData) {
aHolder.secretData(secretData);
}
else {
aHolder.secret(secret);
}
holder = aHolder.algorithmName(algorithmName);
}
else if ([algorithm isKindOfClass:[JWTAlgorithmNone class]]) {
holder = [JWTAlgorithmNoneDataHolder new];
}
if (theError) {
NSLog(@"JWT internalError: %@", theError);
return [[JWTCodingResultType alloc] initWithErrorResult:[[JWTCodingResultTypeError alloc] initWithError:theError]];
}
JWTCodingBuilder *builder = [JWTDecodingBuilder decodeMessage:token].claimsSetCoordinator([JWTClaimsSetCoordinatorBase new]).addHolder(holder).options(@(skipVerification));
JWTCodingResultType *result = builder.result;
// TODO: Fix
// signature is not verified well even for JWT.IO example.
// it happens in case of base64 data corruption. (url encoded vs not url uncoded)
NSLog(@"JWT ERROR: %@ -> %@", result.errorResult, result.errorResult.error);
NSLog(@"JWT RESULT: %@ -> %@", result.successResult, result.successResult.headerAndPayloadDictionary);
return result;
}
@end
@implementation JWTTokenDecoder
- (id<JWTTokenDecoderProtocol>)theDecoder {
return [JWTTokenDecoder__V3 new];
}
- (JWTCodingResultType *)decodeToken:(NSString *)token skipSignatureVerification:(BOOL)skipVerification necessaryDataObject:(id<JWTTokenDecoderNecessaryDataObject__Protocol>)object {
if (!object) {
return nil;
}
return [self.theDecoder decodeToken:token skipSignatureVerification:skipVerification necessaryDataObject:object];
}
@end
================================================
FILE: Example/JWTDesktop/JWTDesktop/JWTTokenTextTypeDescription.h
================================================
//
// JWTTokenTextTypeDescription.h
// JWTDesktop
//
// Created by Lobanov Dmitry on 25.09.16.
// Copyright © 2016 JWT. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h>
#import <AppKit/AppKit.h>
#import "NSArrayExtension.h"
typedef NS_ENUM(NSInteger, JWTTokenTextType) {
JWTTokenTextTypeDefault, // dot text color
JWTTokenTextTypeHeader,
JWTTokenTextTypePayload,
JWTTokenTextTypeSignature,
JWTTokenTextTypeDot
};
@interface JWTTokenTextTypeAppearanceAttributes : NSObject
@property (copy, nonatomic, readwrite) NSColor *color;
@property (copy, nonatomic, readwrite) NSFont *font;
@end
@interface JWTTokenTextTypeDescription: NSObject
- (NSColor *)colorForType:(JWTTokenTextType)type;
- (NSFont *)font;
- (NSDictionary *)encodedTextAttributesForType:(JWTTokenTextType)type;
+ (NSArray <NSNumber *>*)typicalSchemeComponents;
@end
@interface JWTTokenTextTypeSerialization: NSObject
- (NSString *)textPartFromTexts:(NSArray *)texts type:(JWTTokenTextType)type;
@end
@interface JWTTokenTextTypeAppearance: NSObject
- (NSArray <JWTTokenTextTypeAppearanceAttributes *>*)attributesForText:(NSString *)text;
- (NSAttributedString *)attributedStringForText:(NSString *)text;
@end
================================================
FILE: Example/JWTDesktop/JWTDesktop/JWTTokenTextTypeDescription.m
================================================
//
// JWTTokenTextTypeDescription.m
// JWTDesktop
//
// Created by Lobanov Dmitry on 25.09.16.
// Copyright © 2016 JWT. All rights reserved.
//
#import "JWTTokenTextTypeDescription.h"
@interface JWTTokenTextTypeAppearanceAttributes ()
@property (copy, nonatomic, readwrite) NSString *part;
@end
@implementation JWTTokenTextTypeAppearanceAttributes
- (instancetype)initWithColor:(NSColor *)color font:(NSFont *)font {
if (self = [super init]) {
self.color = color;
self.font = font;
}
return self;
}
@end
@interface JWTTokenTextTypeDescription ()
@property (strong, nonatomic, readwrite) NSDictionary *textColors;
@end
@implementation JWTTokenTextTypeDescription
- (NSDictionary *)encodedTextAttributesForType:(JWTTokenTextType)type {
return @{};
}
- (NSColor *)colorForType:(JWTTokenTextType)type {
switch (type) {
case JWTTokenTextTypeDefault: return [NSColor blackColor];
case JWTTokenTextTypeHeader: return [NSColor redColor];
case JWTTokenTextTypePayload: return [NSColor magentaColor];
case JWTTokenTextTypeSignature: return [NSColor colorWithRed:0 green:185/255.0f blue:241/255.0f alpha:1.0f];
case JWTTokenTextTypeDot: return [NSColor blackColor];
default: return nil;
}
}
- (NSFont *)font {
return [NSFont boldSystemFontOfSize:22];
}
+ (NSArray <NSNumber *>*)typicalSchemeComponents {
return @[
@(JWTTokenTextTypeHeader),
@(JWTTokenTextTypeDot),
@(JWTTokenTextTypePayload),
@(JWTTokenTextTypeDot),
@(JWTTokenTextTypeSignature)
];
}
@end
@implementation JWTTokenTextTypeSerialization
- (NSString *)textPartFromTexts:(NSArray *)texts type:(JWTTokenTextType)type {
NSString *result = nil;
switch (type) {
case JWTTokenTextTypeHeader: {
return [NSArrayExtension extendedArray:texts objectAtIndex:0];
}
case JWTTokenTextTypePayload: {
return [NSArrayExtension extendedArray:texts objectAtIndex:1];
}
case JWTTokenTextTypeSignature: {
if (texts.count > 2) {
return [[texts subarrayWithRange:NSMakeRange(2, texts.count - 2)] componentsJoinedByString:@"."];
}
return nil;
}
case JWTTokenTextTypeDot: return @".";
default: return nil;
}
return result;
}
@end
@interface JWTTokenTextTypeAppearance ()
@property (strong, nonatomic, readwrite) JWTTokenTextTypeSerialization *serialization;
@property (strong, nonatomic, readwrite) JWTTokenTextTypeDescription *tokenTypeDescription;
@end
@implementation JWTTokenTextTypeAppearance
- (instancetype)init {
if (self = [super init]) {
self.serialization = [JWTTokenTextTypeSerialization new];
self.tokenTypeDescription = [JWTTokenTextTypeDescription new];
}
return self;
}
- (NSArray<JWTTokenTextTypeAppearanceAttributes *> *)attributesForText:(NSString *)text {
__auto_type texts = [text componentsSeparatedByString:@"."];
__auto_type result = [NSMutableArray array];
for (NSNumber *component in JWTTokenTextTypeDescription.typicalSchemeComponents) {
__auto_type type = (JWTTokenTextType)component.integerValue;
__auto_type object = [self.serialization textPartFromTexts:texts type:type];
if (object) {
__auto_type color = [self.tokenTypeDescription colorForType:type];
__auto_type font = self.tokenTypeDescription.font;
__auto_type component = [[JWTTokenTextTypeAppearanceAttributes alloc] initWithColor:color font:font];
component.part = object;
[result addObject:component];
}
}
return [result copy];
}
- (NSAttributedString *)attributedStringForText:(NSString *)text {
__auto_type string = [NSMutableAttributedString new];
__auto_type attributes = [self attributesForText:text];
for (JWTTokenTextTypeAppearanceAttributes *attribute in attributes) {
__auto_type attributes = @{
NSForegroundColorAttributeName : attribute.color,
NSFontAttributeName : attribute.font
};
__auto_type component = [[NSAttributedString alloc] initWithString:attribute.part attributes:attributes];
[string appendAttributedString:component];
}
return [string copy];
}
@end
================================================
FILE: Example/JWTDesktop/JWTDesktop/NSArrayExtension.h
================================================
//
// NSArrayExtension.h
// JWTDesktop
//
// Created by Lobanov Dmitry on 30.10.2017.
// Copyright © 2017 JWT. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface NSArrayExtension : NSObject
+ (id)extendedArray:(NSArray *)array objectAtIndex:(NSInteger)index;
@end
================================================
FILE: Example/JWTDesktop/JWTDesktop/NSArrayExtension.m
================================================
//
// NSArrayExtension.m
// JWTDesktop
//
// Created by Lobanov Dmitry on 30.10.2017.
// Copyright © 2017 JWT. All rights reserved.
//
#import "NSArrayExtension.h"
@implementation NSArrayExtension
+ (id)extendedArray:(NSArray *)array objectAtIndex:(NSInteger)index {
if (array.count) {
return index >= array.count ? nil : [array objectAtIndex:index];
}
return nil;
}
@end
================================================
FILE: Example/JWTDesktop/JWTDesktop/SignatureValidationDescription.h
================================================
//
// SignatureValidationDescription.h
// JWTDesktop
//
// Created by Lobanov Dmitry on 30.10.2017.
// Copyright © 2017 JWT. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h>
typedef NS_ENUM(NSInteger, SignatureValidationType) {
SignatureValidationTypeUnknown,
SignatureValidationTypeValid,
SignatureValidationTypeInvalid
};
@interface SignatureValidationDescription : NSObject
@property (assign, nonatomic, readwrite) SignatureValidationType signatureValidation;
@property (assign, nonatomic, readonly) NSColor* currentColor;
@property (assign, nonatomic, readonly) NSString* currentTitle;
@end
================================================
FILE: Example/JWTDesktop/JWTDesktop/SignatureValidationDescription.m
================================================
//
// SignatureValidationDescription.m
// JWTDesktop
//
// Created by Lobanov Dmitry on 30.10.2017.
// Copyright © 2017 JWT. All rights reserved.
//
#import "SignatureValidationDescription.h"
#import <Cocoa/Cocoa.h>
@interface SignatureValidationDescription ()
- (NSColor *)colorForSignatureValidation:(SignatureValidationType)signatureValidation;
- (NSString *)titleForSignatureValidation:(SignatureValidationType)signatureValidation;
@end
@implementation SignatureValidationDescription
- (NSColor *)colorForSignatureValidation:(SignatureValidationType)signatureValidation {
id result = nil;
switch (signatureValidation) {
case SignatureValidationTypeUnknown: {
result = [NSColor darkGrayColor];
break;
}
case SignatureValidationTypeInvalid: {
result = [NSColor redColor];
break;
}
case SignatureValidationTypeValid: {
result = [NSColor colorWithRed:0 green:185/255.0f blue:241/255.0f alpha:1.0f];
break;
}
default:
break;
}
return result;
}
- (NSString *)titleForSignatureValidation:(SignatureValidationType)signatureValidation {
id result = nil;
switch (signatureValidation) {
case SignatureValidationTypeUnknown: {
result = @"Signature Unknown";
break;
}
case SignatureValidationTypeInvalid: {
result = @"Signature Invalid";
break;
}
case SignatureValidationTypeValid: {
result = @"Signature Valid";
break;
}
default:
break;
}
return result ?: @"Signature Unknown";
}
- (NSColor *)currentColor {
return [self colorForSignatureValidation:self.signatureValidation];
}
- (NSString *)currentTitle {
return [self titleForSignatureValidation:self.signatureValidation];
}
@end
================================================
FILE: Example/JWTDesktop/JWTDesktop/ViewController+Model.h
================================================
//
// ViewController+Model.h
// JWTDesktop
//
// Created by Lobanov Dmitry on 30.10.2017.
// Copyright © 2017 JWT. All rights reserved.
//
#import "ViewController.h"
#import "JWTTokenTextTypeDescription.h"
#import "SignatureValidationDescription.h"
#import "JWTTokenDecoder.h"
@interface ViewController (Model)
@end
@interface ViewController__Model : NSObject
@property (strong, nonatomic, readwrite) JWTTokenTextTypeAppearance *tokenAppearance;
@property (strong, nonatomic, readwrite) SignatureValidationDescription *signatureValidationDescription;
@property (strong, nonatomic, readwrite) JWTTokenDecoder *decoder;
@end
@interface ViewController__Model (JWTAlgorithms)
@property (strong, nonatomic, readonly) NSArray *availableAlgorithms;
@property (strong, nonatomic, readonly) NSArray *availableAlgorithmsNames;
@end
@interface ViewController__DataSeed: NSObject
@property (copy, nonatomic, readonly) NSString *algorithmName;
@property (copy, nonatomic, readonly) NSString *secret;
@property (copy, nonatomic, readonly) NSString *token;
@end
@interface ViewController__DataSeed (Create)
+ (instancetype)defaultDataSeed;
+ (instancetype)HS256;
+ (instancetype)RS256;
+ (instancetype)HS256__WithoutClaimsSet;
+ (instancetype)HS256__LongSecret__32;
+ (instancetype)RS256__Corrupted;
+ (instancetype)RS256__Corrupted_2;
@end
================================================
FILE: Example/JWTDesktop/JWTDesktop/ViewController+Model.m
================================================
//
// ViewController+Model.m
// JWTDesktop
//
// Created by Lobanov Dmitry on 30.10.2017.
// Copyright © 2017 JWT. All rights reserved.
//
#import "ViewController+Model.h"
@import JWT;
@implementation ViewController (Model)
@end
@implementation ViewController__Model
- (instancetype)init {
if (self = [super init]) {
self.tokenAppearance = [JWTTokenTextTypeAppearance new];
self.signatureValidationDescription = [SignatureValidationDescription new];
self.decoder = [JWTTokenDecoder new];
}
return self;
}
@end
@implementation ViewController__Model (JWTAlgorithms)
- (NSArray *)availableAlgorithms {
return [JWTAlgorithmFactory algorithms];
}
- (NSArray *)availableAlgorithmsNames {
return [[self availableAlgorithms] valueForKey:@"name"];
}
@end
@interface ViewController__DataSeed ()
@property (copy, nonatomic, readwrite) NSString *algorithmName;
@property (copy, nonatomic, readwrite) NSString *secret;
@property (copy, nonatomic, readwrite) NSString *token;
@end
@implementation ViewController__DataSeed
- (instancetype)initWithAlgorithName:(NSString *)algorithmName secret:(NSString *)secret token:(NSString *)token {
self = [super init];
if (self) {
self.algorithmName = algorithmName;
self.secret = secret;
self.token = token;
}
return self;
}
@end
@implementation ViewController__DataSeed (Create)
+ (instancetype)template {
NSString *token = @"";
NSString *secret = @"";
NSString *algorithmName = @"";
return [[self alloc] initWithAlgorithName:(NSString *)algorithmName secret:(NSString *)secret token:(NSString *)token];
}
+ (instancetype)defaultDataSeed {
return
// [self RS256];
[self RS256__Corrupted_2];
}
+ (instancetype)RS256 {
NSString *token = @"eyJraWQiOiJqd3RfdWF0X2tleXMiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiI1MDAxIiwiaXNzIjoiQ0xNIiwiZXhwIjoxNTA4MjQ5NTU3LCJqdGkiOiI2MjcyM2E4Yi0zOTZmLTQxYmYtOTljMi02NWRkMzk2MDNiNjQifQ.Cej8RJ6e2HEU27rh_TyHZBoMI1jErmhOfSFY4SRzRoijSP628hM82XxjDX24HsKqIsK1xeeGI1yg1bed4RPhnmDGt4jAY73nqguZ1oqZ2DTcfZ5olxCXyLLaytl2XH7-62M_mFUcGj7I2mwts1DQkHWnFky2i4uJXlksHFkUg2xZoGEjVHo0bxCxgQ5yQiOpxC5VodN5rAPM3A5yMG6EijOp-dvUThjoJ4RFTGKozw_x_Qg6RLGDusNcmLIMbHasTsyZAZle6RFkwO0Sij1k6z6_xssbOl-Q57m7CeYgVHMORdzy4Smkmh-0gzeiLsGbCL4fhgdHydpIFajW-eOXMw";
NSString *secret = @"-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoPryo3IisfK3a028bwgso/CW5kB84mk6Y7rO76FxJRTWnOAla0Uf0OpIID7go4Qck66yT4/uPpiOQIR0oW0plTekkDP75EG3d/2mtzhiCtELV4F1r9b/InCN5dYYK8USNkKXgjbeVyatdUvCtokz10/ibNZ9qikgKf58qXnn2anGvpE6ded5FOUEukOjr7KSAfD0KDNYWgZcG7HZBxn/3N7ND9D0ATu2vxlJsNGOkH6WL1EmObo/QygBXzuZm5o0N0W15EXpWVbl4Ye7xqPnvc1i2DTKxNUcyhXfDbLw1ee2d9T/WU5895Ko2bQ/O/zPwUSobM3m+fPMW8kp5914kwIDAQAB-----END PUBLIC KEY-----";
NSString *algorithmName = JWTAlgorithmNameRS256;
return [[self alloc] initWithAlgorithName:(NSString *)algorithmName secret:(NSString *)secret token:(NSString *)token];
}
+ (instancetype)HS256 {
NSString *token = @"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ";
NSString *secret = @"secret";
NSString *algorithmName = JWTAlgorithmNameHS256;
return [[self alloc] initWithAlgorithName:(NSString *)algorithmName secret:(NSString *)secret token:(NSString *)token];
}
+ (instancetype)HS256__WithoutClaimsSet {
NSString *token = @"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJvaG9oIjoiMTIzNDU2Nzg5MCIsImhhaGEiOiJKb2huIERvZSIsIm9oaGhoaCI6dHJ1ZX0.5V2Jk3Nnaj1czth5x7ssXgy12K_Oe1Lew1yfgQokpqE";
NSString *secret = @"secret";
NSString *algorithmName = JWTAlgorithmNameHS256;
return [[self alloc] initWithAlgorithName:(NSString *)algorithmName secret:(NSString *)secret token:(NSString *)token];
}
+ (instancetype)HS256__LongSecret__32 {
NSString *token = @"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiSm9obiBEb2UifQ.RbAcmsAGL1QWvoT1DUrAF-3Wwxvj8VvPHYFNEcUNog8";
NSString *secret = @"qwertyuiopasdfghjklzxcvbnm123456";
NSString *algorithmName = JWTAlgorithmNameHS256;
return [[self alloc] initWithAlgorithName:(NSString *)algorithmName secret:(NSString *)secret token:(NSString *)token];
}
+ (instancetype)RS256__Corrupted {
NSString *token = @"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.EkN-DOsnsuRjRO6BxXemmJDm3HbxrbRzXglbN2S4sOkopdU4IsDxTI8jO19W_A4K8ZPJijNLis4EZsHeY559a4DFOd50_OqgHGuERTqYZyuhtF39yxJPAjUESwxk2J5k_4zM3O-vtd1Ghyo4IbqKKSy6J9mTniYJPenn5-HIirE";
NSString *secret = @"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDdlatRjRjogo3WojgGHFHYLugdUWAY9iR3fy4arWNA1KoS8kVw33cJibXr8bvwUAUparCwlvdbH6dvEOfou0/gCFQsHUfQrSDv+MuSUMAe8jzKE4qW+jK+xQU9a03GUnKHkkle+Q0pX/g6jXZ7r1/xAK5Do2kQ+X5xK9cipRgEKwIDAQAB";
NSString *algorithmName = JWTAlgorithmNameRS256;
return [[self alloc] initWithAlgorithName:(NSString *)algorithmName secret:(NSString *)secret token:(NSString *)token];
}
+ (instancetype)RS256__Corrupted_2 {
NSString *token = @"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.EkN-DOsnsuRjRO6BxXemmJDm3HbxrbRzXglbN2S4sOkopdU4IsDxTI8jO19W_A4K8ZPJijNLis4EZsHeY559a4DFOd50_OqgHGuERTqYZyuhtF39yxJPAjUESwxk2J5k_4zM3O-vtd1Ghyo4IbqKKSy6J9mTniYJPenn5-HIirE";
NSString *secret = @"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDdlatRjRjogo3WojgGHFHYLugdUWAY9iR3fy4arWNA1KoS8kVw33cJibXr8bvwUAUparCwlvdbH6dvEOfou0/gCFQsHUfQrSDv+MuSUMAe8jzKE4qW+jK+xQU9a03GUnKHkkle+Q0pX/g6jXZ7r1/xAK5Do2kQ+X5xK9cipRgEKwIDAQAB";
NSString *algorithmName = JWTAlgorithmNameRS256;
return [[self alloc] initWithAlgorithName:(NSString *)algorithmName secret:(NSString *)secret token:(NSString *)token];
}
@end
================================================
FILE: Example/JWTDesktop/JWTDesktop/ViewController.h
================================================
//
// ViewController.h
// JWTDesktop
//
// Created by Lobanov Dmitry on 23.05.16.
// Copyright © 2016 JWT. All rights reserved.
//
#import <Cocoa/Cocoa.h>
@interface ViewController : NSViewController
@end
================================================
FILE: Example/JWTDesktop/JWTDesktop/ViewController.m
================================================
//
// ViewController.m
// JWTDesktop
//
// Created by Lobanov Dmitry on 23.05.16.
// Copyright © 2016 JWT. All rights reserved.
//
#import "ViewController.h"
@import JWT;
#import "JWTTokenTextTypeDescription.h"
#import "SignatureValidationDescription.h"
#import "JWTDecriptedViewController.h"
#import "ViewController+Model.h"
@interface ViewController() <NSTextViewDelegate, NSTextFieldDelegate, NSTableViewDelegate, NSTableViewDataSource>
@property (weak) IBOutlet NSTextField *algorithmLabel;
@property (weak) IBOutlet NSPopUpButton *algorithmPopUpButton;
@property (weak) IBOutlet NSTextField *secretLabel;
@property (weak) IBOutlet NSTextField *secretTextField;
@property (weak) IBOutlet NSButton *secretIsBase64EncodedCheckButton;
@property (weak) IBOutlet NSTextField *signatureLabel;
@property (weak) IBOutlet NSButton *signatureVerificationCheckButton;
@property (unsafe_unretained) IBOutlet NSTextView *encodedTextView;
@property (unsafe_unretained) IBOutlet NSTextView *decodedTextView;
@property (weak) IBOutlet NSTableView *decodedTableView;
@property (weak) IBOutlet NSView * decriptedView;
@property (strong, nonatomic, readwrite) JWTDecriptedViewController *decriptedViewController;
@property (weak) IBOutlet NSTextField *signatureStatusLabel;
@property (strong, nonatomic, readwrite) ViewController__Model *model;
@end
// it catches all data from view controller
@interface ViewController (JWTTokenDecoderNecessaryDataObject__Protocol) <JWTTokenDecoderNecessaryDataObject__Protocol>
@end
@implementation ViewController (JWTTokenDecoderNecessaryDataObject__Protocol)
- (NSString *)chosenAlgorithmName {
return [self.algorithmPopUpButton selectedItem].title;
}
- (NSData *)chosenSecretData {
NSString *secret = [self chosenSecret];
BOOL isBase64Encoded = [self isBase64EncodedSecret];
NSData *result = nil;
if (isBase64Encoded) {
result = [[NSData alloc] initWithBase64EncodedString:secret options:0];
if (!result) {
self.secretIsBase64EncodedCheckButton.integerValue = 0;
}
}
return result;
}
- (NSString *)chosenSecret {
return self.secretTextField.stringValue;
}
- (BOOL)isBase64EncodedSecret {
return self.secretIsBase64EncodedCheckButton.integerValue == 1;
}
@end
@implementation ViewController
//func encodedTextAttributes(_ enumerate: (NSRange, [NSAttributedString.Key : Any]) -> ()) {
// let textStorage = self.encodedTextView.textStorage!
// let string = textStorage.string
// let range = NSMakeRange(0, string.count)
// if let attributedString = self.model.appearance.encodedAttributedString(text: string) {
// attributedString.enumerateAttributes(in: range, options: []) { (attributes, range, bool) in
// enumerate(range, attributes)
// }
// }
//}
- (void)encodedTextAttributes:(void(^)(NSRange range, NSDictionary* dictionary))block {
if (!block) {
return;
}
__auto_type textStorage = self.encodedTextView.textStorage;
__auto_type string = textStorage.string;
__auto_type range = NSMakeRange(0, string.length);
__auto_type attributedString = [self.model.tokenAppearance attributedStringForText:string];
if (attributedString != nil) {
[attributedString enumerateAttributesInRange:range options:0 usingBlock:^(NSDictionary<NSAttributedStringKey,id> * _Nonnull attrs, NSRange range, BOOL * _Nonnull stop) {
block(range, attrs);
}];
}
}
#pragma mark - Refresh UI
- (void)refreshUI {
NSTextStorage *textStorage = self.encodedTextView.textStorage;
NSString *string = textStorage.string;
[self encodedTextAttributes:^(NSRange range, NSDictionary *dictionary) {
[textStorage setAttributes:dictionary range:range];
}];
BOOL signatureVerified = [self.model.decoder decodeToken:string skipSignatureVerification:NO necessaryDataObject:self].errorResult == nil;
[self signatureReactOnVerifiedToken:signatureVerified];
__auto_type shouldSkipVerification = self.signatureVerificationCheckButton.integerValue == 1;
__auto_type result = [self.model.decoder decodeToken:string skipSignatureVerification:shouldSkipVerification necessaryDataObject:self];
// will be udpated.
self.decriptedViewController.resultType = result;
}
#pragma mark - Signature Customization
- (void)signatureReactOnVerifiedToken:(BOOL)verified {
SignatureValidationType type = verified ? SignatureValidationTypeValid : SignatureValidationTypeInvalid;
self.model.signatureValidationDescription.signatureValidation = type;
self.signatureStatusLabel.textColor = self.model.signatureValidationDescription.currentColor;
self.signatureStatusLabel.stringValue = self.model.signatureValidationDescription.currentTitle;
}
#pragma mark - Setup
- (void)setupModel {
self.model = [ViewController__Model new];
}
- (void)setupTop {
// top label.
self.algorithmLabel.stringValue = @"Algorithm";
// pop up button.
[self.algorithmPopUpButton removeAllItems];
[self.algorithmPopUpButton addItemsWithTitles:self.model.availableAlgorithmsNames];
[self.algorithmPopUpButton setAction:@selector(popUpButtonValueChanged:)];
[self.algorithmPopUpButton setTarget:self];
// secretLabel
self.secretLabel.stringValue = @"Secret";
// secretTextField
self.secretTextField.placeholderString = @"Secret";
self.secretTextField.delegate = self;
// check button
self.secretIsBase64EncodedCheckButton.title = @"is Base64Encoded Secret";
self.secretIsBase64EncodedCheckButton.integerValue = NO;
[self.secretIsBase64EncodedCheckButton setTarget:self];
[self.secretIsBase64EncodedCheckButton setAction:@selector(checkBoxState:)];
// skip signature verification
self.signatureLabel.stringValue = @"Signature";
self.signatureVerificationCheckButton.title = @"Skip signature verification";
self.signatureVerificationCheckButton.integerValue = 0;
[self.signatureVerificationCheckButton setTarget:self];
[self.signatureVerificationCheckButton setAction:@selector(checkBoxState:)];
}
- (void)setupBottom {
self.signatureStatusLabel.alignment = NSTextAlignmentCenter;
self.signatureStatusLabel.textColor = [NSColor whiteColor];
self.signatureStatusLabel.drawsBackground = YES;
self.model.signatureValidationDescription.signatureValidation = SignatureValidationTypeUnknown;
self.signatureStatusLabel.textColor = self.model.signatureValidationDescription.currentColor;
self.signatureStatusLabel.stringValue = self.model.signatureValidationDescription.currentTitle;
}
- (void)setupEncodingDecodingViews {
self.encodedTextView.delegate = self;
// self.decodedTextView.delegate = self;
self.decodedTableView.delegate = self;
self.decodedTableView.dataSource = self;
//thanks!
//http://stackoverflow.com/questions/7545490/how-can-i-have-the-only-column-of-my-nstableview-take-all-the-width-of-the-table
NSTableView *tableView = self.decodedTableView;
[tableView setColumnAutoresizingStyle:NSTableViewUniformColumnAutoresizingStyle];
[tableView.tableColumns.firstObject setResizingMask:NSTableColumnAutoresizingMask];
//AND
[tableView sizeLastColumnToFit];
}
- (void)setupDecorations {
[self setupTop];
[self setupBottom];
}
- (void)setupDecriptedViews {
NSView *view = self.decriptedView;
self.decriptedViewController = [JWTDecriptedViewController new];
[view addSubview:self.decriptedViewController.view];
// maybe add contstraints.
}
- (void)viewDidLoad {
[super viewDidLoad];
[self setupModel];
[self setupDecorations];
[self setupEncodingDecodingViews];
[self setupDecriptedViews];
[self defaultDataSetup];
[self refreshUI];
// Do any additional setup after loading the view.
}
- (void)defaultDataSetup {
ViewController__DataSeed *dataSeed = [ViewController__DataSeed defaultDataSeed];
[self defaultDataSetupWithToken:dataSeed.token secret:dataSeed.secret algorithmName:dataSeed.algorithmName];
}
- (void)defaultDataSetupWithToken:(NSString *)token secret:(NSString *)secret algorithmName:(NSString *)algorithmName {
if (token == nil || secret == nil || algorithmName == nil) {
NSLog(@"%@ failed! one of them is nil: token:(%@) secret(%@) algorithmName:(%@)algorithm", NSStringFromSelector(_cmd), token, secret, algorithmName);
return;
}
// token
[self.encodedTextView insertText:token replacementRange:NSMakeRange(0, token.length)];
// secret
self.secretTextField.stringValue = secret;
// algorithm
NSInteger index = [self.model.availableAlgorithmsNames indexOfObject:algorithmName];
[self.algorithmPopUpButton selectItemAtIndex:index];
}
- (void)viewWillAppear {
[super viewWillAppear];
NSView *view = self.decriptedView;
__auto_type decriptedView = self.decriptedViewController.view;
view.translatesAutoresizingMaskIntoConstraints = NO;
decriptedView.translatesAutoresizingMaskIntoConstraints = NO;
__auto_type constraints = @[
[decriptedView.leftAnchor constraintEqualToAnchor:view.leftAnchor],
[decriptedView.rightAnchor constraintEqualToAnchor:view.rightAnchor],
[decriptedView.topAnchor constraintEqualToAnchor:view.topAnchor],
[decriptedView.bottomAnchor constraintEqualToAnchor:view.bottomAnchor]
];
[NSLayoutConstraint activateConstraints:constraints];
}
#pragma mark - Actions
- (void)popUpButtonValueChanged:(id)sender {
[self refreshUI];
}
-(IBAction)checkBoxState:(id)sender {
// Under construction
[self refreshUI];
}
#pragma marrk - Delegates / <NSTextFieldDelegate>
- (void)controlTextDidChange:(NSNotification *)obj {
if ([obj.name isEqualToString:NSControlTextDidChangeNotification]) {
NSTextField *textField = (NSTextField *)obj.object;
if (textField == self.secretTextField) {
// refresh UI
[self refreshUI];
}
}
}
#pragma mark - EncodedTextView / <NSTextViewDelegate>
- (void)textDidChange:(NSNotification *)notification {
[self refreshUI];
}
#pragma mark - DecodedTableView / <NSTableViewDataSource>
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
return 4;
}
#pragma mark - DecodedTableView / <NSTableViewDelegate>
- (BOOL)tableView:(NSTableView *)tableView isGroupRow:(NSInteger)row {
return row % 2 == 0;
}
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
// choose by row is section or not
if (row % 2) {
// section
NSView *cell = [tableView makeViewWithIdentifier:@"Cell" owner:self];
((NSTableCellView *)cell).textField.stringValue = @"AH";
return cell;
}
else {
NSView *cell = [tableView makeViewWithIdentifier:@"Cell" owner:self];
((NSTableCellView *)cell).textField.stringValue = @"OH";
// return nil;
return cell;
}
}
- (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row {
// calculate height of row.
// NSView * view = [tableView viewAtColumn:0 row:row makeIfNecessary:NO];
return 40;
}
@end
================================================
FILE: Example/JWTDesktop/JWTDesktop/main.m
================================================
//
// main.m
// JWTDesktop
//
// Created by Lobanov Dmitry on 23.05.16.
// Copyright © 2016 JWT. All rights reserved.
//
#import <Cocoa/Cocoa.h>
int main(int argc, const char * argv[]) {
return NSApplicationMain(argc, argv);
}
================================================
FILE: Example/JWTDesktop/JWTDesktop.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 52;
objects = {
/* Begin PBXBuildFile section */
04526B1A1CF3A2690090C5A3 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 04526B191CF3A2690090C5A3 /* AppDelegate.m */; };
04526B1D1CF3A2690090C5A3 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 04526B1C1CF3A2690090C5A3 /* main.m */; };
04526B201CF3A2690090C5A3 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 04526B1F1CF3A2690090C5A3 /* ViewController.m */; };
04526B221CF3A2690090C5A3 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 04526B211CF3A2690090C5A3 /* Assets.xcassets */; };
04526B251CF3A2690090C5A3 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 04526B231CF3A2690090C5A3 /* Main.storyboard */; };
04526B301CF3A2690090C5A3 /* JWTDesktopTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 04526B2F1CF3A2690090C5A3 /* JWTDesktopTests.m */; };
04701E631D97F001007A0A86 /* JWTDecriptedViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 04701E611D97F001007A0A86 /* JWTDecriptedViewController.m */; };
04701E641D97F001007A0A86 /* JWTDecriptedViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 04701E621D97F001007A0A86 /* JWTDecriptedViewController.xib */; };
04701E681D97F0E5007A0A86 /* JWTDecriptedCollectionViewItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 04701E661D97F0E5007A0A86 /* JWTDecriptedCollectionViewItem.m */; };
04701E691D97F0E5007A0A86 /* JWTDecriptedCollectionViewItem.xib in Resources */ = {isa = PBXBuildFile; fileRef = 04701E671D97F0E5007A0A86 /* JWTDecriptedCollectionViewItem.xib */; };
04701E6C1D981F8C007A0A86 /* JWTTokenTextTypeDescription.m in Sources */ = {isa = PBXBuildFile; fileRef = 04701E6B1D981F8C007A0A86 /* JWTTokenTextTypeDescription.m */; };
0A5BC6ED1FA77232000BDAB4 /* SignatureValidationDescription.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A5BC6EC1FA77232000BDAB4 /* SignatureValidationDescription.m */; };
0A5BC6F01FA773A8000BDAB4 /* ViewController+Model.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A5BC6EF1FA773A8000BDAB4 /* ViewController+Model.m */; };
0A5BC6F31FA77809000BDAB4 /* NSArrayExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A5BC6F21FA77809000BDAB4 /* NSArrayExtension.m */; };
0A5BC6F61FA77D9D000BDAB4 /* JWTTokenDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A5BC6F51FA77D9D000BDAB4 /* JWTTokenDecoder.m */; };
0AC0027F27865AEB002167AD /* JWT in Frameworks */ = {isa = PBXBuildFile; productRef = 0AC0027E27865AEB002167AD /* JWT */; };
DB17256DE61643E08ADC47F5 /* libPods-JWTDesktopTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 447DF4A5AF64E7BE744EEE2F /* libPods-JWTDesktopTests.a */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
04526B2C1CF3A2690090C5A3 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 04526B0D1CF3A2690090C5A3 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 04526B141CF3A2690090C5A3;
remoteInfo = JWTDesktop;
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
0A2D85FD22B53D4800BB4760 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
04526B151CF3A2690090C5A3 /* JWTDesktop.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = JWTDesktop.app; sourceTree = BUILT_PRODUCTS_DIR; };
04526B181CF3A2690090C5A3 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
04526B191CF3A2690090C5A3 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
04526B1C1CF3A2690090C5A3 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
04526B1E1CF3A2690090C5A3 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = "<group>"; };
04526B1F1CF3A2690090C5A3 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = "<group>"; };
04526B211CF3A2690090C5A3 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
04526B241CF3A2690090C5A3 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
04526B261CF3A2690090C5A3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
04526B2B1CF3A2690090C5A3 /* JWTDesktopTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = JWTDesktopTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
04526B2F1CF3A2690090C5A3 /* JWTDesktopTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = JWTDesktopTests.m; sourceTree = "<group>"; };
04526B311CF3A2690090C5A3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
04701E601D97F001007A0A86 /* JWTDecriptedViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JWTDecriptedViewController.h; sourceTree = "<group>"; };
04701E611D97F001007A0A86 /* JWTDecriptedViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JWTDecriptedViewController.m; sourceTree = "<group>"; };
04701E621D97F001007A0A86 /* JWTDecriptedViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = JWTDecriptedViewController.xib; sourceTree = "<group>"; };
04701E651D97F0E5007A0A86 /* JWTDecriptedCollectionViewItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JWTDecriptedCollectionViewItem.h; sourceTree = "<group>"; };
04701E661D97F0E5007A0A86 /* JWTDecriptedCollectionViewItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JWTDecriptedCollectionViewItem.m; sourceTree = "<group>"; };
04701E671D97F0E5007A0A86 /* JWTDecriptedCollectionViewItem.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = JWTDecriptedCollectionViewItem.xib; sourceTree = "<group>"; };
04701E6A1D981F8C007A0A86 /* JWTTokenTextTypeDescription.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JWTTokenTextTypeDescription.h; sourceTree = "<group>"; };
04701E6B1D981F8C007A0A86 /* JWTTokenTextTypeDescription.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JWTTokenTextTypeDescription.m; sourceTree = "<group>"; };
0A5BC6EB1FA77232000BDAB4 /* SignatureValidationDescription.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SignatureValidationDescription.h; sourceTree = "<group>"; };
0A5BC6EC1FA77232000BDAB4 /* SignatureValidationDescription.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SignatureValidationDescription.m; sourceTree = "<group>"; };
0A5BC6EE1FA773A8000BDAB4 /* ViewController+Model.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ViewController+Model.h"; sourceTree = "<group>"; };
0A5BC6EF1FA773A8000BDAB4 /* ViewController+Model.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "ViewController+Model.m"; sourceTree = "<group>"; };
0A5BC6F11FA77809000BDAB4 /* NSArrayExtension.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NSArrayExtension.h; sourceTree = "<group>"; };
0A5BC6F21FA77809000BDAB4 /* NSArrayExtension.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSArrayExtension.m; sourceTree = "<group>"; };
0A5BC6F41FA77D9D000BDAB4 /* JWTTokenDecoder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JWTTokenDecoder.h; sourceTree = "<group>"; };
0A5BC6F51FA77D9D000BDAB4 /* JWTTokenDecoder.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = JWTTokenDecoder.m; sourceTree = "<group>"; };
0AC0027C27865ACA002167AD /* JWT */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = JWT; path = ../..; sourceTree = "<group>"; };
447DF4A5AF64E7BE744EEE2F /* libPods-JWTDesktopTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-JWTDesktopTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
B0EC4FDC2D76F5A1074A63D2 /* libPods-JWTDesktop.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-JWTDesktop.a"; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
04526B121CF3A2690090C5A3 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
0AC0027F27865AEB002167AD /* JWT in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
04526B281CF3A2690090C5A3 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
DB17256DE61643E08ADC47F5 /* libPods-JWTDesktopTests.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
04526B0C1CF3A2690090C5A3 = {
isa = PBXGroup;
children = (
0AC0027C27865ACA002167AD /* JWT */,
04526B171CF3A2690090C5A3 /* JWTDesktop */,
04526B2E1CF3A2690090C5A3 /* JWTDesktopTests */,
04526B161CF3A2690090C5A3 /* Products */,
2756B542175862D629E8ADEC /* Frameworks */,
);
sourceTree = "<group>";
};
04526B161CF3A2690090C5A3 /* Products */ = {
isa = PBXGroup;
children = (
04526B151CF3A2690090C5A3 /* JWTDesktop.app */,
04526B2B1CF3A2690090C5A3 /* JWTDesktopTests.xctest */,
);
name = Products;
sourceTree = "<group>";
};
04526B171CF3A2690090C5A3 /* JWTDesktop */ = {
isa = PBXGroup;
children = (
04526B181CF3A2690090C5A3 /* AppDelegate.h */,
04526B191CF3A2690090C5A3 /* AppDelegate.m */,
04526B1E1CF3A2690090C5A3 /* ViewController.h */,
04526B1F1CF3A2690090C5A3 /* ViewController.m */,
04526B211CF3A2690090C5A3 /* Assets.xcassets */,
04526B231CF3A2690090C5A3 /* Main.storyboard */,
04526B261CF3A2690090C5A3 /* Info.plist */,
04526B1B1CF3A2690090C5A3 /* Supporting Files */,
04701E601D97F001007A0A86 /* JWTDecriptedViewController.h */,
04701E611D97F001007A0A86 /* JWTDecriptedViewController.m */,
04701E621D97F001007A0A86 /* JWTDecriptedViewController.xib */,
04701E651D97F0E5007A0A86 /* JWTDecriptedCollectionViewItem.h */,
04701E661D97F0E5007A0A86 /* JWTDecriptedCollectionViewItem.m */,
04701E671D97F0E5007A0A86 /* JWTDecriptedCollectionViewItem.xib */,
04701E6A1D981F8C007A0A86 /* JWTTokenTextTypeDescription.h */,
04701E6B1D981F8C007A0A86 /* JWTTokenTextTypeDescription.m */,
0A5BC6EB1FA77232000BDAB4 /* SignatureValidationDescription.h */,
0A5BC6EC1FA77232000BDAB4 /* SignatureValidationDescription.m */,
0A5BC6EE1FA773A8000BDAB4 /* ViewController+Model.h */,
0A5BC6EF1FA773A8000BDAB4 /* ViewController+Model.m */,
0A5BC6F11FA77809000BDAB4 /* NSArrayExtension.h */,
0A5BC6F21FA77809000BDAB4 /* NSArrayExtension.m */,
0A5BC6F41FA77D9D000BDAB4 /* JWTTokenDecoder.h */,
0A5BC6F51FA77D9D000BDAB4 /* JWTTokenDecoder.m */,
);
path = JWTDesktop;
sourceTree = "<group>";
};
04526B1B1CF3A2690090C5A3 /* Supporting Files */ = {
isa = PBXGroup;
children = (
04526B1C1CF3A2690090C5A3 /* main.m */,
);
name = "Supporting Files";
sourceTree = "<group>";
};
04526B2E1CF3A2690090C5A3 /* JWTDesktopTests */ = {
isa = PBXGroup;
children = (
04526B2F1CF3A2690090C5A3 /* JWTDesktopTests.m */,
04526B311CF3A2690090C5A3 /* Info.plist */,
);
path = JWTDesktopTests;
sourceTree = "<group>";
};
2756B542175862D629E8ADEC /* Frameworks */ = {
isa = PBXGroup;
children = (
B0EC4FDC2D76F5A1074A63D2 /* libPods-JWTDesktop.a */,
447DF4A5AF64E7BE744EEE2F /* libPods-JWTDesktopTests.a */,
);
name = Frameworks;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
04526B141CF3A2690090C5A3 /* JWTDesktop */ = {
isa = PBXNativeTarget;
buildConfigurationList = 04526B341CF3A2690090C5A3 /* Build configuration list for PBXNativeTarget "JWTDesktop" */;
buildPhases = (
04526B111CF3A2690090C5A3 /* Sources */,
04526B121CF3A2690090C5A3 /* Frameworks */,
04526B131CF3A2690090C5A3 /* Resources */,
0A2D85FD22B53D4800BB4760 /* Embed Frameworks */,
);
buildRules = (
);
dependencies = (
);
name = JWTDesktop;
packageProductDependencies = (
0AC0027E27865AEB002167AD /* JWT */,
);
productName = JWTDesktop;
productReference = 04526B151CF3A2690090C5A3 /* JWTDesktop.app */;
productType = "com.apple.product-type.application";
};
04526B2A1CF3A2690090C5A3 /* JWTDesktopTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 04526B371CF3A2690090C5A3 /* Build configuration list for PBXNativeTarget "JWTDesktopTests" */;
buildPhases = (
E3FC1258955CF36F4AD3F07E /* [CP] Check Pods Manifest.lock */,
04526B271CF3A2690090C5A3 /* Sources */,
04526B281CF3A2690090C5A3 /* Frameworks */,
04526B291CF3A2690090C5A3 /* Resources */,
);
buildRules = (
);
dependencies = (
04526B2D1CF3A2690090C5A3 /* PBXTargetDependency */,
);
name = JWTDesktopTests;
productName = JWTDesktopTests;
productReference = 04526B2B1CF3A2690090C5A3 /* JWTDesktopTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
04526B0D1CF3A2690090C5A3 /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 1250;
ORGANIZATIONNAME = JWT;
TargetAttributes = {
04526B141CF3A2690090C5A3 = {
CreatedOnToolsVersion = 7.3.1;
};
04526B2A1CF3A2690090C5A3 = {
CreatedOnToolsVersion = 7.3.1;
TestTargetID = 04526B141CF3A2690090C5A3;
};
};
};
buildConfigurationList = 04526B101CF3A2690090C5A3 /* Build configuration list for PBXProject "JWTDesktop" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 04526B0C1CF3A2690090C5A3;
productRefGroup = 04526B161CF3A2690090C5A3 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
04526B141CF3A2690090C5A3 /* JWTDesktop */,
04526B2A1CF3A2690090C5A3 /* JWTDesktopTests */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
04526B131CF3A2690090C5A3 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
04526B221CF3A2690090C5A3 /* Assets.xcassets in Resources */,
04701E641D97F001007A0A86 /* JWTDecriptedViewController.xib in Resources */,
04701E691D97F0E5007A0A86 /* JWTDecriptedCollectionViewItem.xib in Resources */,
04526B251CF3A2690090C5A3 /* Main.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
04526B291CF3A2690090C5A3 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
E3FC1258955CF36F4AD3F07E /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-JWTDesktopTests-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
04526B111CF3A2690090C5A3 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
04526B201CF3A2690090C5A3 /* ViewController.m in Sources */,
0A5BC6ED1FA77232000BDAB4 /* SignatureValidationDescription.m in Sources */,
0A5BC6F61FA77D9D000BDAB4 /* JWTTokenDecoder.m in Sources */,
04526B1D1CF3A2690090C5A3 /* main.m in Sources */,
0A5BC6F31FA77809000BDAB4 /* NSArrayExtension.m in Sources */,
04526B1A1CF3A2690090C5A3 /* AppDelegate.m in Sources */,
0A5BC6F01FA773A8000BDAB4 /* ViewController+Model.m in Sources */,
04701E6C1D981F8C007A0A86 /* JWTTokenTextTypeDescription.m in Sources */,
04701E631D97F001007A0A86 /* JWTDecriptedViewController.m in Sources */,
04701E681D97F0E5007A0A86 /* JWTDecriptedCollectionViewItem.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
04526B271CF3A2690090C5A3 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
04526B301CF3A2690090C5A3 /* JWTDesktopTests.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
04526B2D1CF3A2690090C5A3 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 04526B141CF3A2690090C5A3 /* JWTDesktop */;
targetProxy = 04526B2C1CF3A2690090C5A3 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */
04526B231CF3A2690090C5A3 /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
04526B241CF3A2690090C5A3 /* Base */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
04526B321CF3A2690090C5A3 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "-";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.12;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = macosx;
};
name = Debug;
};
04526B331CF3A2690090C5A3 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "-";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.12;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = macosx;
};
name = Release;
};
04526B351CF3A2690090C5A3 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_IDENTITY = "-";
COMBINE_HIDPI_IMAGES = YES;
INFOPLIST_FILE = JWTDesktop/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.io.jwt.JWTDesktop;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Debug;
};
04526B361CF3A2690090C5A3 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_IDENTITY = "-";
COMBINE_HIDPI_IMAGES = YES;
INFOPLIST_FILE = JWTDesktop/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.io.jwt.JWTDesktop;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Release;
};
04526B381CF3A2690090C5A3 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
COMBINE_HIDPI_IMAGES = YES;
INFOPLIST_FILE = JWTDesktopTests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
"@loader_path/../Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.io.jwt.JWTDesktopTests;
PRODUCT_NAME = "$(TARGET_NAME)";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/JWTDesktop.app/Contents/MacOS/JWTDesktop";
};
name = Debug;
};
04526B391CF3A2690090C5A3 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
COMBINE_HIDPI_IMAGES = YES;
INFOPLIST_FILE = JWTDesktopTests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
"@loader_path/../Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.io.jwt.JWTDesktopTests;
PRODUCT_NAME = "$(TARGET_NAME)";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/JWTDesktop.app/Contents/MacOS/JWTDesktop";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
04526B101CF3A2690090C5A3 /* Build configuration list for PBXProject "JWTDesktop" */ = {
isa = XCConfigurationList;
buildConfigurations = (
04526B321CF3A2690090C5A3 /* Debug */,
04526B331CF3A2690090C5A3 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
04526B341CF3A2690090C5A3 /* Build configuration list for PBXNativeTarget "JWTDesktop" */ = {
isa = XCConfigurationList;
buildConfigurations = (
04526B351CF3A2690090C5A3 /* Debug */,
04526B361CF3A2690090C5A3 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
04526B371CF3A2690090C5A3 /* Build configuration list for PBXNativeTarget "JWTDesktopTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
04526B381CF3A2690090C5A3 /* Debug */,
04526B391CF3A2690090C5A3 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
/* Begin XCSwiftPackageProductDependency section */
0AC0027E27865AEB002167AD /* JWT */ = {
isa = XCSwiftPackageProductDependency;
productName = JWT;
};
/* End XCSwiftPackageProductDependency section */
};
rootObject = 04526B0D1CF3A2690090C5A3 /* Project object */;
}
================================================
FILE: Example/JWTDesktop/JWTDesktop.xcodeproj/project.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>
================================================
FILE: Example/JWTDesktop/JWTDesktop.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
================================================
FILE: Example/JWTDesktop/JWTDesktopTests/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>
================================================
FILE: Example/JWTDesktop/JWTDesktopTests/JWTDesktopTests.m
================================================
//
// JWTDesktopTests.m
// JWTDesktopTests
//
// Created by Lobanov Dmitry on 23.05.16.
// Copyright © 2016 JWT. All rights reserved.
//
#import <XCTest/XCTest.h>
@interface JWTDesktopTests : XCTestCase
@end
@implementation JWTDesktopTests
- (void)setUp {
[super setUp];
// Put setup code here. This method is called before the invocation of each test method in the class.
}
- (void)tearDown {
// Put teardown code here. This method is called after the invocation of each test method in the class.
[super tearDown];
}
- (void)testExample {
// This is an example of a functional test case.
// Use XCTAssert and related functions to verify your tests produce the correct results.
}
- (void)testPerformanceExample {
// This is an example of a performance test case.
[self measureBlock:^{
// Put the code you want to measure the time of here.
}];
}
@end
================================================
FILE: Example/JWTDesktopSwift/JWTDesktopSwift/AppDelegate.swift
================================================
//
// AppDelegate.swift
// JWTDesktopSwift
//
// Created by Lobanov Dmitry on 01.10.16.
// Copyright © 2016 JWTIO. All rights reserved.
//
import Cocoa
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
func applicationDidFinishLaunching(_ aNotification: Notification) {
// Insert code here to initialize your application
}
func applicationWillTerminate(_ aNotification: Notification) {
// Insert code here to tear down your application
}
}
================================================
FILE: Example/JWTDesktopSwift/JWTDesktopSwift/Assets.xcassets/AppIcon.appiconset/Contents.json
================================================
{
"images" : [
{
"size" : "16x16",
"idiom" : "mac",
"filename" : "swift_jwt_icon_16x16.png",
"scale" : "1x"
},
{
"idiom" : "mac",
"size" : "16x16",
"filename" : "swift_jwt_icon_32x32.png",
"scale" : "2x"
},
{
"size" : "32x32",
"idiom" : "mac",
"filename" : "swift_jwt_icon_32x32.png",
"scale" : "1x"
},
{
"idiom" : "mac",
"size" : "32x32",
"filename" : "swift_jwt_icon_64x64.png",
"scale" : "2x"
},
{
"size" : "128x128",
"idiom" : "mac",
"filename" : "swift_jwt_icon_128x128.png",
"scale" : "1x"
},
{
"idiom" : "mac",
"size" : "128x128",
"filename" : "swift_jwt_icon_256x256.png",
"scale" : "2x"
},
{
"size" : "256x256",
"idiom" : "mac",
"filename" : "swift_jwt_icon_256x256.png",
"scale" : "1x"
},
{
"size" : "256x256",
"idiom" : "mac",
"filename" : "swift_jwt_icon_512x512.png",
"scale" : "2x"
},
{
"size" : "512x512",
"idiom" : "mac",
"filename" : "swift_jwt_icon_512x512.png",
"scale" : "1x"
},
{
"size" : "512x512",
"idiom" : "mac",
"filename" : "swift_jwt_icon_1024x1024.png",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Example/JWTDesktopSwift/JWTDesktopSwift/Base.lproj/Main.storyboard
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" initialViewController="B8D-0N-5wS">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--Application-->
<scene sceneID="JPo-4y-FX3">
<objects>
<application id="hnw-xV-0zn" sceneMemberID="viewController">
<menu key="mainMenu" title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
<items>
<menuItem title="JWTDesktop" id="1Xt-HY-uBw">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="JWTDesktop" systemMenu="apple" id="uQy-DD-JDr">
<items>
<menuItem title="About JWTDesktop" id="5kV-Vb-QxS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontStandardAboutPanel:" target="Ady-hI-5gd" id="Exp-CZ-Vem"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="VOq-y0-SEH"/>
<menuItem title="Preferences…" keyEquivalent="," id="BOF-NM-1cW"/>
<menuItem isSeparatorItem="YES" id="wFC-TO-SCJ"/>
<menuItem title="Services" id="NMo-om-nkz">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Services" systemMenu="services" id="hz9-B4-Xy5"/>
</menuItem>
<menuItem isSeparatorItem="YES" id="4je-JR-u6R"/>
<menuItem title="Hide JWTDesktop" keyEquivalent="h" id="Olw-nP-bQN">
<connections>
<action selector="hide:" target="Ady-hI-5gd" id="PnN-Uc-m68"/>
</connections>
</menuItem>
<menuItem title="Hide Others" keyEquivalent="h" id="Vdr-fp-XzO">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
gitextract_ums_flbi/ ├── .github/ │ ├── CONTRIBUTING.md │ ├── ISSUE_TEMPLATE.md │ ├── PULL_REQUEST_TEMPLATE.md │ └── workflows/ │ ├── library-builds.yaml │ ├── unit-tests.yaml │ └── validations.yaml ├── .gitignore ├── .gitmodules ├── .local_run_travis_script.sh ├── .travis.yml ├── Cartfile ├── Cartfile.resolved ├── Documentation/ │ └── Prerelease/ │ └── custom_claims.md ├── Example/ │ ├── JWTDesktop/ │ │ ├── JWTDesktop/ │ │ │ ├── AppDelegate.h │ │ │ ├── AppDelegate.m │ │ │ ├── Assets.xcassets/ │ │ │ │ └── AppIcon.appiconset/ │ │ │ │ └── Contents.json │ │ │ ├── Base.lproj/ │ │ │ │ └── Main.storyboard │ │ │ ├── Info.plist │ │ │ ├── JWTDecriptedCollectionViewItem.h │ │ │ ├── JWTDecriptedCollectionViewItem.m │ │ │ ├── JWTDecriptedCollectionViewItem.xib │ │ │ ├── JWTDecriptedViewController.h │ │ │ ├── JWTDecriptedViewController.m │ │ │ ├── JWTDecriptedViewController.xib │ │ │ ├── JWTTokenDecoder.h │ │ │ ├── JWTTokenDecoder.m │ │ │ ├── JWTTokenTextTypeDescription.h │ │ │ ├── JWTTokenTextTypeDescription.m │ │ │ ├── NSArrayExtension.h │ │ │ ├── NSArrayExtension.m │ │ │ ├── SignatureValidationDescription.h │ │ │ ├── SignatureValidationDescription.m │ │ │ ├── ViewController+Model.h │ │ │ ├── ViewController+Model.m │ │ │ ├── ViewController.h │ │ │ ├── ViewController.m │ │ │ └── main.m │ │ ├── JWTDesktop.xcodeproj/ │ │ │ ├── project.pbxproj │ │ │ └── project.xcworkspace/ │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata/ │ │ │ └── IDEWorkspaceChecks.plist │ │ └── JWTDesktopTests/ │ │ ├── Info.plist │ │ └── JWTDesktopTests.m │ ├── JWTDesktopSwift/ │ │ ├── JWTDesktopSwift/ │ │ │ ├── AppDelegate.swift │ │ │ ├── Assets.xcassets/ │ │ │ │ └── AppIcon.appiconset/ │ │ │ │ └── Contents.json │ │ │ ├── Base.lproj/ │ │ │ │ └── Main.storyboard │ │ │ ├── DecriptedCollectionViewItem.swift │ │ │ ├── DecriptedCollectionViewItem.xib │ │ │ ├── DecriptedViewController.swift │ │ │ ├── DecriptedViewController.xib │ │ │ ├── Info.plist │ │ │ ├── ViewController+Model.swift │ │ │ └── ViewController.swift │ │ └── JWTDesktopSwift.xcodeproj/ │ │ ├── project.pbxproj │ │ └── project.xcworkspace/ │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata/ │ │ └── IDEWorkspaceChecks.plist │ ├── JWTDesktopSwiftToolkit/ │ │ ├── .gitignore │ │ ├── Package.swift │ │ ├── README.md │ │ ├── Sources/ │ │ │ └── JWTDesktopSwiftToolkit/ │ │ │ ├── Array+Extension.swift │ │ │ ├── ColorBridge+Platforms.swift │ │ │ ├── FontBridge+Platforms.swift │ │ │ ├── SignatureValidationType.swift │ │ │ ├── String+Extension.swift │ │ │ ├── TokenDecoder.swift │ │ │ └── TokenTextTypeDescription.swift │ │ └── Tests/ │ │ └── JWTDesktopSwiftToolkitTests/ │ │ └── JWTDesktopSwiftToolkitTests.swift │ └── JWTSwiftUI/ │ ├── JWTSwiftUI/ │ │ ├── AppDelegate.swift │ │ ├── Assets.xcassets/ │ │ │ ├── AppIcon.appiconset/ │ │ │ │ └── Contents.json │ │ │ └── Contents.json │ │ ├── Base.lproj/ │ │ │ └── LaunchScreen.storyboard │ │ ├── BottomView.swift │ │ ├── ContentView.swift │ │ ├── HeaderView.swift │ │ ├── Info.plist │ │ ├── JWTModel.swift │ │ ├── Preview Content/ │ │ │ └── Preview Assets.xcassets/ │ │ │ └── Contents.json │ │ └── SceneDelegate.swift │ ├── JWTSwiftUI.xcodeproj/ │ │ ├── project.pbxproj │ │ └── project.xcworkspace/ │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata/ │ │ └── IDEWorkspaceChecks.plist │ ├── MacJWTSwiftUI/ │ │ ├── Assets.xcassets/ │ │ │ ├── AccentColor.colorset/ │ │ │ │ └── Contents.json │ │ │ ├── AppIcon.appiconset/ │ │ │ │ └── Contents.json │ │ │ └── Contents.json │ │ ├── ContentView.swift │ │ ├── Info.plist │ │ ├── MacJWTSwiftUI.entitlements │ │ ├── MacJWTSwiftUIApp.swift │ │ └── Preview Content/ │ │ └── Preview Assets.xcassets/ │ │ └── Contents.json │ └── iOSJWTSwiftUI/ │ ├── Assets.xcassets/ │ │ ├── AccentColor.colorset/ │ │ │ └── Contents.json │ │ ├── AppIcon.appiconset/ │ │ │ └── Contents.json │ │ └── Contents.json │ ├── ContentView.swift │ ├── Info.plist │ ├── Preview Content/ │ │ └── Preview Assets.xcassets/ │ │ └── Contents.json │ └── iOSJWTSwiftUIApp.swift ├── JWT.podspec ├── LICENSE ├── Package.resolved ├── Package.swift ├── README.md ├── Scripts/ │ ├── Test certificate and private key 1.p12 │ ├── Test certificate and private key 2.p12 │ ├── Test certificate and public key 1.pem │ ├── Test certificate and public key 2.pem │ ├── cert_1.cer │ ├── cert_1.crt │ ├── cert_1.csr │ ├── cert_1.p12 │ ├── ci-xcode-select.sh │ ├── generate_ec_curved_keys.rb │ ├── generate_keys.rb │ ├── openssl_help.sh │ ├── private_1.pem │ ├── private_256_right.p12 │ ├── private_256_right.pem │ ├── private_256_wrong.p12 │ ├── private_256_wrong.pem │ ├── public_256_right.pem │ ├── public_256_wrong.pem │ ├── test_cert_public_256_right.pem │ └── test_cert_public_256_wrong.pem ├── Sources/ │ └── JWT/ │ ├── Algorithms/ │ │ ├── Base/ │ │ │ ├── JWTAlgorithmErrorDescription+Subclass.m │ │ │ ├── JWTAlgorithmErrorDescription.m │ │ │ ├── JWTAlgorithmFactory.m │ │ │ └── JWTAlgorithmNone.m │ │ ├── ESFamily/ │ │ │ ├── JWTAlgorithmAsymmetricBase.m │ │ │ └── JWTAlgorithmESBase.m │ │ ├── HSFamily/ │ │ │ └── JWTAlgorithmHSBase.m │ │ ├── Holders/ │ │ │ ├── JWTAlgorithmDataHolder+FluentStyle.m │ │ │ ├── JWTAlgorithmDataHolder.m │ │ │ └── JWTAlgorithmDataHolderChain.m │ │ └── RSFamily/ │ │ ├── JWTAlgorithmRSBase.m │ │ └── RSKeys/ │ │ ├── JWTCryptoKey.m │ │ ├── JWTCryptoKeyExtractor+FluentStyle.m │ │ ├── JWTCryptoKeyExtractor.m │ │ ├── JWTCryptoSecurity+ErrorHandling.m │ │ ├── JWTCryptoSecurity+ExternalRepresentation.m │ │ ├── JWTCryptoSecurity+Extraction.m │ │ └── JWTCryptoSecurity.m │ ├── ClaimSet/ │ │ ├── JWTClaim.m │ │ ├── JWTClaimBase.m │ │ ├── JWTClaimSerializerBase.m │ │ ├── JWTClaimSerializerVariations.m │ │ ├── JWTClaimVariations.m │ │ ├── JWTClaimVerifierBase.m │ │ ├── JWTClaimVerifierVariations.m │ │ ├── JWTClaimsProviderBase.m │ │ ├── JWTClaimsSet.m │ │ ├── JWTClaimsSetBase.m │ │ ├── JWTClaimsSetCoordinatorBase.m │ │ ├── JWTClaimsSetDSLBase.m │ │ ├── JWTClaimsSetSerializer.m │ │ ├── JWTClaimsSetSerializerBase.m │ │ ├── JWTClaimsSetVerifier.m │ │ └── JWTClaimsSetVerifierBase.m │ ├── Coding/ │ │ ├── JWTBuilder+FluentStyle.m │ │ ├── JWTCoding+ResultTypes.m │ │ ├── JWTCoding+VersionOne.m │ │ ├── JWTCoding+VersionThree.m │ │ ├── JWTCoding+VersionTwo.m │ │ ├── JWTCoding.m │ │ └── JWTCodingBuilder+FluentStyle.m │ ├── Supplement/ │ │ ├── JWTBase64Coder.m │ │ └── JWTErrorDescription.m │ └── include/ │ ├── JWTAlgorithm.h │ ├── JWTAlgorithmAsymmetricBase.h │ ├── JWTAlgorithmDataHolder+FluentStyle.h │ ├── JWTAlgorithmDataHolder.h │ ├── JWTAlgorithmDataHolderChain.h │ ├── JWTAlgorithmESBase.h │ ├── JWTAlgorithmErrorDescription+Subclass.h │ ├── JWTAlgorithmErrorDescription.h │ ├── JWTAlgorithmFactory.h │ ├── JWTAlgorithmHSBase.h │ ├── JWTAlgorithmNone.h │ ├── JWTAlgorithmRSBase.h │ ├── JWTBase64Coder.h │ ├── JWTBuilder+FluentStyle.h │ ├── JWTClaim.h │ ├── JWTClaimBase.h │ ├── JWTClaimSerializerBase.h │ ├── JWTClaimSerializerVariations.h │ ├── JWTClaimVariations.h │ ├── JWTClaimVerifierBase.h │ ├── JWTClaimVerifierVariations.h │ ├── JWTClaimsProviderBase.h │ ├── JWTClaimsSet.h │ ├── JWTClaimsSetBase.h │ ├── JWTClaimsSetCoordinatorBase.h │ ├── JWTClaimsSetDSLBase.h │ ├── JWTClaimsSetSerializer.h │ ├── JWTClaimsSetSerializerBase.h │ ├── JWTClaimsSetVerifier.h │ ├── JWTClaimsSetVerifierBase.h │ ├── JWTClaimsSetsProtocols.h │ ├── JWTCoding+ResultTypes.h │ ├── JWTCoding+VersionOne.h │ ├── JWTCoding+VersionThree.h │ ├── JWTCoding+VersionTwo.h │ ├── JWTCoding.h │ ├── JWTCodingBuilder+FluentStyle.h │ ├── JWTCryptoKey.h │ ├── JWTCryptoKeyExtractor+FluentStyle.h │ ├── JWTCryptoKeyExtractor.h │ ├── JWTCryptoSecurity+ErrorHandling.h │ ├── JWTCryptoSecurity+ExternalRepresentation.h │ ├── JWTCryptoSecurity+Extraction.h │ ├── JWTCryptoSecurity.h │ ├── JWTDeprecations.h │ ├── JWTErrorDescription.h │ └── JWTRSAlgorithm.h ├── Tests/ │ └── JWTTests/ │ ├── Helpers/ │ │ └── JWTAssetAccessor.m │ ├── Resources/ │ │ ├── Certificates.xcassets/ │ │ │ ├── Contents.json │ │ │ ├── es256/ │ │ │ │ ├── Contents.json │ │ │ │ ├── certificate.cer.dataset/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── ec-prime256v1.cer │ │ │ │ ├── original.private.pem.dataset/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── ec-prime256v1-private.pem │ │ │ │ ├── original.public.pem.dataset/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── ec-prime256v1-public.pem │ │ │ │ ├── p12_password.txt.dataset/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── ec-prime256v1-p12-password.txt │ │ │ │ ├── private.p12.dataset/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── ec-prime256v1-private.p12 │ │ │ │ ├── private.pem.dataset/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── ec-prime256v1-private.pem │ │ │ │ └── public.pem.dataset/ │ │ │ │ ├── Contents.json │ │ │ │ └── ec-prime256v1-public.pem │ │ │ ├── es384/ │ │ │ │ ├── Contents.json │ │ │ │ ├── certificate.cer.dataset/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── ec-secp384r1.cer │ │ │ │ ├── original.private.pem.dataset/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── ec-secp384r1-private.pem │ │ │ │ ├── original.public.pem.dataset/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── ec-secp384r1-public.pem │ │ │ │ ├── p12_password.txt.dataset/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── ec-secp384r1-p12-password.txt │ │ │ │ ├── private.p12.dataset/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── ec-secp384r1-private.p12 │ │ │ │ ├── private.pem.dataset/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── ec-secp384r1-private.pem │ │ │ │ └── public.pem.dataset/ │ │ │ │ ├── Contents.json │ │ │ │ └── ec-secp384r1-public.pem │ │ │ ├── es512/ │ │ │ │ ├── Contents.json │ │ │ │ ├── certificate.cer.dataset/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── ec-secp521r1.cer │ │ │ │ ├── original.private.pem.dataset/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── ec-secp521r1-private.pem │ │ │ │ ├── original.public.pem.dataset/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── ec-secp521r1-public.pem │ │ │ │ ├── p12_password.txt.dataset/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── ec-secp521r1-p12-password.txt │ │ │ │ ├── private.p12.dataset/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── ec-secp521r1-private.p12 │ │ │ │ ├── private.pem.dataset/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── ec-secp521r1-private.pem │ │ │ │ └── public.pem.dataset/ │ │ │ │ ├── Contents.json │ │ │ │ └── ec-secp521r1-public.pem │ │ │ ├── rs256/ │ │ │ │ ├── Contents.json │ │ │ │ ├── certificate.cer.dataset/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── rsa-2048.cer │ │ │ │ ├── p12_password.txt.dataset/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── rsa-2048-p12-password.txt │ │ │ │ ├── private.p12.dataset/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── rsa-2048-private.p12 │ │ │ │ ├── private.pem.dataset/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── rsa-2048-private.pem │ │ │ │ └── public.pem.dataset/ │ │ │ │ ├── Contents.json │ │ │ │ └── rsa-2048-public.pem │ │ │ ├── rs256old/ │ │ │ │ ├── Contents.json │ │ │ │ ├── certificate.cer.dataset/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── rs256-cert.cer │ │ │ │ ├── p12_password.txt.dataset/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── password.txt │ │ │ │ ├── private.p12.dataset/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── rs256-private.p12 │ │ │ │ ├── private.pem.dataset/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── rs256-private.pem │ │ │ │ └── public.pem.dataset/ │ │ │ │ ├── Contents.json │ │ │ │ └── rs256-public.pem │ │ │ ├── rs384/ │ │ │ │ ├── Contents.json │ │ │ │ ├── certificate.cer.dataset/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── rsa-3072.cer │ │ │ │ ├── p12_password.txt.dataset/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── rsa-3072-p12-password.txt │ │ │ │ ├── private.p12.dataset/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── rsa-3072-private.p12 │ │ │ │ ├── private.pem.dataset/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── rsa-3072-private.pem │ │ │ │ └── public.pem.dataset/ │ │ │ │ ├── Contents.json │ │ │ │ └── rsa-3072-public.pem │ │ │ └── rs512/ │ │ │ ├── Contents.json │ │ │ ├── certificate.cer.dataset/ │ │ │ │ ├── Contents.json │ │ │ │ └── rsa-4096.cer │ │ │ ├── p12_password.txt.dataset/ │ │ │ │ ├── Contents.json │ │ │ │ └── rsa-4096-p12-password.txt │ │ │ ├── private.p12.dataset/ │ │ │ │ ├── Contents.json │ │ │ │ └── rsa-4096-private.p12 │ │ │ ├── private.pem.dataset/ │ │ │ │ ├── Contents.json │ │ │ │ └── rsa-4096-private.pem │ │ │ └── public.pem.dataset/ │ │ │ ├── Contents.json │ │ │ └── rsa-4096-public.pem │ │ └── template/ │ │ ├── Contents.json │ │ ├── certificate.cer.dataset/ │ │ │ └── Contents.json │ │ ├── p12_password.txt.dataset/ │ │ │ └── Contents.json │ │ ├── private.p12.dataset/ │ │ │ └── Contents.json │ │ ├── private.pem.dataset/ │ │ │ └── Contents.json │ │ ├── public.pem.dataset/ │ │ │ └── Contents.json │ │ └── request.csr.dataset/ │ │ └── Contents.json │ ├── Tests/ │ │ ├── Algorithms/ │ │ │ ├── JWTAlgorithmAsymmetricTests.m │ │ │ ├── JWTAlgorithmHSTests.m │ │ │ └── JWTAlgorithmNoneTests.m │ │ ├── ClaimSet/ │ │ │ ├── JWTClaimsCustomClaimsBaseTests.m │ │ │ ├── JWTClaimsSerializerBaseTests.m │ │ │ └── JWTClaimsSerializerTests.m │ │ ├── JWT/ │ │ │ ├── JWTIssuesTests.m │ │ │ └── JWTReadmeTests.m │ │ └── JWTCoding/ │ │ └── JWTCodingTests.m │ └── include/ │ └── JWTAssetAccessor.h └── VERSION
SYMBOL INDEX (75 symbols across 5 files)
FILE: Example/JWTDesktop/JWTDesktop/JWTTokenTextTypeDescription.h
type JWTTokenTextTypeDefault (line 14) | typedef NS_ENUM(NSInteger, JWTTokenTextType) {
FILE: Example/JWTDesktop/JWTDesktop/SignatureValidationDescription.h
type SignatureValidationTypeUnknown (line 12) | typedef NS_ENUM(NSInteger, SignatureValidationType) {
FILE: Scripts/generate_ec_curved_keys.rb
class ShellExecutor (line 4) | class ShellExecutor
method setup (line 8) | def setup (dry_run = false)
method dry? (line 12) | def dry?
method run_command_line (line 17) | def run_command_line(line)
class KeysGenerator (line 35) | class KeysGenerator
type FileFormatsModule (line 36) | module FileFormatsModule
function only_name (line 37) | def only_name(name)
function to_plain_text (line 41) | def to_plain_text(name)
function to_p12 (line 44) | def to_p12(name)
function to_certificate_request (line 49) | def to_certificate_request(name)
function to_certificate (line 54) | def to_certificate(name, format = '.cer')
function to_pem (line 59) | def to_pem(name)
class FileFormats (line 65) | class FileFormats
method initialize (line 70) | def initialize(name)
method valid? (line 73) | def valid?
method to_p12 (line 76) | def to_p12
method to_certificate_requets (line 79) | def to_certificate_requets
method to_certificate (line 82) | def to_certificate
method to_pem (line 85) | def to_pem
method available_ec_curves (line 91) | def available_ec_curves
method available_rsa_sizes (line 95) | def available_rsa_sizes
method initialize (line 102) | def initialize(secret = 'secret')
method type= (line 107) | def type=(value)
method valid? (line 111) | def valid?
method fix (line 115) | def fix
method to_s (line 120) | def to_s
type Generating (line 129) | module Generating
function default_subject (line 130) | def default_subject
function key_and_value_or_empty (line 141) | def key_and_value_or_empty(key, value, delimiter, empty = -> (v){ v....
function subject_value_from_subject (line 146) | def subject_value_from_subject(subject = {})
function subject_key_and_value_from_subject (line 151) | def subject_key_and_value_from_subject(subject = {})
function tool (line 156) | def tool
function suppress_prompt (line 159) | def suppress_prompt(command)
function generate_key (line 163) | def generate_key(type, name, parameters)
function output_key (line 189) | def output_key(access, generated_key_name, name)
function output_public_key (line 192) | def output_public_key(generated_key_name, name)
function output_private_key (line 195) | def output_private_key(generated_key_name, name)
function export_public_key (line 199) | def export_public_key(type, private_key_pem, public_key_pem)
function output_certificate_request (line 205) | def output_certificate_request(private_key_pem, certificate_request,...
function output_certificate (line 211) | def output_certificate(certificate_request, private_key_pem, certifi...
function output_p12 (line 215) | def output_p12(certificate, private_key_pem, p12_name, password_file)
function output_password (line 224) | def output_password(file, password = 'password')
method generated_by_type (line 233) | def generated_by_type(type = self.type)
method generated (line 250) | def generated(type, parameters, private_key_pem, public_key_pem, certi...
class MainWork (line 270) | class MainWork
method work (line 272) | def work(arguments)
method fix_options (line 277) | def fix_options(the_options)
method required_keys (line 287) | def required_keys
method valid_options? (line 290) | def valid_options?(the_options)
method work (line 293) | def work(options = {})
method help_message (line 338) | def help_message(options)
method parse_options (line 359) | def parse_options(arguments)
FILE: Scripts/generate_keys.rb
class ShellExecutor (line 3) | class ShellExecutor
method shared_instance (line 6) | def shared_instance
method setup (line 14) | def setup (dry_run = false)
method dry? (line 18) | def dry?
method run_command_line (line 23) | def run_command_line(line)
class KeyParameters (line 41) | class KeyParameters
method initialize (line 45) | def initialize(type, size, secret = 'secret')
method tool (line 50) | def tool
method curve_by_size (line 53) | def curve_by_size(size)
method suppress_prompt (line 63) | def suppress_prompt(command)
method generate_key (line 66) | def generate_key(name)
method output_key (line 74) | def output_key(type, access, generated_key_name, name)
method output_public_key (line 77) | def output_public_key(generated_key_name, name)
method output_private_key (line 80) | def output_private_key(generated_key_name, name)
class MainWork (line 85) | class MainWork
method work (line 87) | def work(arguments)
method fix_options (line 92) | def fix_options(the_options)
method work (line 104) | def work(options = {})
method help_message (line 125) | def help_message(options)
method parse_options (line 146) | def parse_options(arguments)
FILE: Sources/JWT/include/JWTCoding.h
function interface (line 19) | interface JWT : NSObject @end
Condensed preview — 320 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (925K chars).
[
{
"path": ".github/CONTRIBUTING.md",
"chars": 1765,
"preview": "# Contributing to JWT\n\nWe want to make contributing to this project as easy and transparent as possible. Here are a few "
},
{
"path": ".github/ISSUE_TEMPLATE.md",
"chars": 1078,
"preview": "### New Issue Checklist\n\n- [ ] I have read and understood the [CONTRIBUTING guide](https://github.com/yourkarma/JWT/blob"
},
{
"path": ".github/PULL_REQUEST_TEMPLATE.md",
"chars": 732,
"preview": "### New Pull Request Checklist\n\n- [ ] I have searched for a similar pull request in the [project](https://github.com/you"
},
{
"path": ".github/workflows/library-builds.yaml",
"chars": 1191,
"preview": "name: Library Builds\n\non:\n push:\n branches: [ ci/github_actions, master ]\n pull_request:\n branches: [ master ]\n\n"
},
{
"path": ".github/workflows/unit-tests.yaml",
"chars": 1306,
"preview": "name: Unit Tests\n\non:\n push:\n branches: [ ci/github_actions, master ]\n pull_request:\n branches: [ master ]\n\n # "
},
{
"path": ".github/workflows/validations.yaml",
"chars": 605,
"preview": "name: Validations\n\non:\n push:\n branches: [ ci/github_actions, master ]\n pull_request:\n branches: [ master ]\n\n #"
},
{
"path": ".gitignore",
"chars": 622,
"preview": "# Mac OS\n.DS_Store\n# Xcode\n#\nbuild/\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.p"
},
{
"path": ".gitmodules",
"chars": 0,
"preview": ""
},
{
"path": ".local_run_travis_script.sh",
"chars": 103,
"preview": "cat .travis.yml | perl -lne '/^script:/ ... eof() and /^\\s+-/ and s/^\\s+-// and print and print qx($_)'"
},
{
"path": ".travis.yml",
"chars": 4351,
"preview": "language: objective-c\nmatrix:\n include:\n - osx_image: xcode12.5\n # - osx_image: xcode8.3\n\nbefore_instal"
},
{
"path": "Cartfile",
"chars": 58,
"preview": "github \"https://github.com/soheilbm/Base64.git\" \"Cartfile\""
},
{
"path": "Cartfile.resolved",
"chars": 68,
"preview": "github \"soheilbm/Base64\" \"67083ec1e3e970ec920cbf126e6957c6e9e88ae4\"\n"
},
{
"path": "Documentation/Prerelease/custom_claims.md",
"chars": 8840,
"preview": "# Custom Claims.\n\n## Intro.\n\nConsider the following problem.\nYou have an integer interval and you would like to know if "
},
{
"path": "Example/JWTDesktop/JWTDesktop/AppDelegate.h",
"chars": 224,
"preview": "//\n// AppDelegate.h\n// JWTDesktop\n//\n// Created by Lobanov Dmitry on 23.05.16.\n// Copyright © 2016 JWT. All rights r"
},
{
"path": "Example/JWTDesktop/JWTDesktop/AppDelegate.m",
"chars": 479,
"preview": "//\n// AppDelegate.m\n// JWTDesktop\n//\n// Created by Lobanov Dmitry on 23.05.16.\n// Copyright © 2016 JWT. All rights r"
},
{
"path": "Example/JWTDesktop/JWTDesktop/Assets.xcassets/AppIcon.appiconset/Contents.json",
"chars": 1327,
"preview": "{\n \"images\" : [\n {\n \"size\" : \"16x16\",\n \"idiom\" : \"mac\",\n \"filename\" : \"jwt_icon_16x16.png\",\n \"sc"
},
{
"path": "Example/JWTDesktop/JWTDesktop/Base.lproj/Main.storyboard",
"chars": 85025,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB\" version=\"3.0\" t"
},
{
"path": "Example/JWTDesktop/JWTDesktop/Info.plist",
"chars": 1077,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Example/JWTDesktop/JWTDesktop/JWTDecriptedCollectionViewItem.h",
"chars": 360,
"preview": "//\n// JWTDecriptedCollectionViewItem.h\n// JWTDesktop\n//\n// Created by Lobanov Dmitry on 25.09.16.\n// Copyright © 201"
},
{
"path": "Example/JWTDesktop/JWTDesktop/JWTDecriptedCollectionViewItem.m",
"chars": 728,
"preview": "//\n// JWTDecriptedCollectionViewItem.m\n// JWTDesktop\n//\n// Created by Lobanov Dmitry on 25.09.16.\n// Copyright © 201"
},
{
"path": "Example/JWTDesktop/JWTDesktop/JWTDecriptedCollectionViewItem.xib",
"chars": 4268,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion"
},
{
"path": "Example/JWTDesktop/JWTDesktop/JWTDecriptedViewController.h",
"chars": 377,
"preview": "//\n// JWTDecriptedViewController.h\n// JWTDesktop\n//\n// Created by Lobanov Dmitry on 25.09.16.\n// Copyright © 2016 JW"
},
{
"path": "Example/JWTDesktop/JWTDesktop/JWTDecriptedViewController.m",
"chars": 7800,
"preview": "//\n// JWTDecriptedViewController.m\n// JWTDesktop\n//\n// Created by Lobanov Dmitry on 25.09.16.\n// Copyright © 2016 JW"
},
{
"path": "Example/JWTDesktop/JWTDesktop/JWTDecriptedViewController.xib",
"chars": 4064,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion"
},
{
"path": "Example/JWTDesktop/JWTDesktop/JWTTokenDecoder.h",
"chars": 813,
"preview": "//\n// JWTTokenDecoder.h\n// JWTDesktop\n//\n// Created by Lobanov Dmitry on 30.10.2017.\n// Copyright © 2017 JWT. All ri"
},
{
"path": "Example/JWTDesktop/JWTDesktop/JWTTokenDecoder.m",
"chars": 4825,
"preview": "//\n// JWTTokenDecoder.m\n// JWTDesktop\n//\n// Created by Lobanov Dmitry on 30.10.2017.\n// Copyright © 2017 JWT. All ri"
},
{
"path": "Example/JWTDesktop/JWTDesktop/JWTTokenTextTypeDescription.h",
"chars": 1233,
"preview": "//\n// JWTTokenTextTypeDescription.h\n// JWTDesktop\n//\n// Created by Lobanov Dmitry on 25.09.16.\n// Copyright © 2016 J"
},
{
"path": "Example/JWTDesktop/JWTDesktop/JWTTokenTextTypeDescription.m",
"chars": 4475,
"preview": "//\n// JWTTokenTextTypeDescription.m\n// JWTDesktop\n//\n// Created by Lobanov Dmitry on 25.09.16.\n// Copyright © 2016 J"
},
{
"path": "Example/JWTDesktop/JWTDesktop/NSArrayExtension.h",
"chars": 288,
"preview": "//\n// NSArrayExtension.h\n// JWTDesktop\n//\n// Created by Lobanov Dmitry on 30.10.2017.\n// Copyright © 2017 JWT. All r"
},
{
"path": "Example/JWTDesktop/JWTDesktop/NSArrayExtension.m",
"chars": 398,
"preview": "//\n// NSArrayExtension.m\n// JWTDesktop\n//\n// Created by Lobanov Dmitry on 30.10.2017.\n// Copyright © 2017 JWT. All r"
},
{
"path": "Example/JWTDesktop/JWTDesktop/SignatureValidationDescription.h",
"chars": 647,
"preview": "//\n// SignatureValidationDescription.h\n// JWTDesktop\n//\n// Created by Lobanov Dmitry on 30.10.2017.\n// Copyright © 2"
},
{
"path": "Example/JWTDesktop/JWTDesktop/SignatureValidationDescription.m",
"chars": 1915,
"preview": "//\n// SignatureValidationDescription.m\n// JWTDesktop\n//\n// Created by Lobanov Dmitry on 30.10.2017.\n// Copyright © 2"
},
{
"path": "Example/JWTDesktop/JWTDesktop/ViewController+Model.h",
"chars": 1337,
"preview": "//\n// ViewController+Model.h\n// JWTDesktop\n//\n// Created by Lobanov Dmitry on 30.10.2017.\n// Copyright © 2017 JWT. A"
},
{
"path": "Example/JWTDesktop/JWTDesktop/ViewController+Model.m",
"chars": 5765,
"preview": "//\n// ViewController+Model.m\n// JWTDesktop\n//\n// Created by Lobanov Dmitry on 30.10.2017.\n// Copyright © 2017 JWT. A"
},
{
"path": "Example/JWTDesktop/JWTDesktop/ViewController.h",
"chars": 214,
"preview": "//\n// ViewController.h\n// JWTDesktop\n//\n// Created by Lobanov Dmitry on 23.05.16.\n// Copyright © 2016 JWT. All right"
},
{
"path": "Example/JWTDesktop/JWTDesktop/ViewController.m",
"chars": 11398,
"preview": "//\n// ViewController.m\n// JWTDesktop\n//\n// Created by Lobanov Dmitry on 23.05.16.\n// Copyright © 2016 JWT. All right"
},
{
"path": "Example/JWTDesktop/JWTDesktop/main.m",
"chars": 237,
"preview": "//\n// main.m\n// JWTDesktop\n//\n// Created by Lobanov Dmitry on 23.05.16.\n// Copyright © 2016 JWT. All rights reserved"
},
{
"path": "Example/JWTDesktop/JWTDesktop.xcodeproj/project.pbxproj",
"chars": 26126,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 52;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "Example/JWTDesktop/JWTDesktop.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
"chars": 135,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"self:\">\n </FileRef"
},
{
"path": "Example/JWTDesktop/JWTDesktop.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
"chars": 238,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Example/JWTDesktop/JWTDesktopTests/Info.plist",
"chars": 733,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Example/JWTDesktop/JWTDesktopTests/JWTDesktopTests.m",
"chars": 907,
"preview": "//\n// JWTDesktopTests.m\n// JWTDesktopTests\n//\n// Created by Lobanov Dmitry on 23.05.16.\n// Copyright © 2016 JWT. All"
},
{
"path": "Example/JWTDesktopSwift/JWTDesktopSwift/AppDelegate.swift",
"chars": 505,
"preview": "//\n// AppDelegate.swift\n// JWTDesktopSwift\n//\n// Created by Lobanov Dmitry on 01.10.16.\n// Copyright © 2016 JWTIO. A"
},
{
"path": "Example/JWTDesktopSwift/JWTDesktopSwift/Assets.xcassets/AppIcon.appiconset/Contents.json",
"chars": 1387,
"preview": "{\n \"images\" : [\n {\n \"size\" : \"16x16\",\n \"idiom\" : \"mac\",\n \"filename\" : \"swift_jwt_icon_16x16.png\",\n "
},
{
"path": "Example/JWTDesktopSwift/JWTDesktopSwift/Base.lproj/Main.storyboard",
"chars": 85124,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB\" version=\"3.0\" t"
},
{
"path": "Example/JWTDesktopSwift/JWTDesktopSwift/DecriptedCollectionViewItem.swift",
"chars": 551,
"preview": "//\n// DecriptedCollectionViewItem.swift\n// JWTDesktopSwift\n//\n// Created by Lobanov Dmitry on 01.10.16.\n// Copyright"
},
{
"path": "Example/JWTDesktopSwift/JWTDesktopSwift/DecriptedCollectionViewItem.xib",
"chars": 4326,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion"
},
{
"path": "Example/JWTDesktopSwift/JWTDesktopSwift/DecriptedViewController.swift",
"chars": 6218,
"preview": "//\n// DecriptedViewController.swift\n// JWTDesktopSwift\n//\n// Created by Lobanov Dmitry on 01.10.16.\n// Copyright © 2"
},
{
"path": "Example/JWTDesktopSwift/JWTDesktopSwift/DecriptedViewController.xib",
"chars": 4143,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion"
},
{
"path": "Example/JWTDesktopSwift/JWTDesktopSwift/Info.plist",
"chars": 1109,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Example/JWTDesktopSwift/JWTDesktopSwift/ViewController+Model.swift",
"chars": 2550,
"preview": "//\n// ViewController+Model.swift\n// JWTDesktopSwift\n//\n// Created by Lobanov Dmitry on 30.10.2017.\n// Copyright © 20"
},
{
"path": "Example/JWTDesktopSwift/JWTDesktopSwift/ViewController.swift",
"chars": 10946,
"preview": "//\n// ViewController.swift\n// JWTDesktopSwift\n//\n// Created by Lobanov Dmitry on 01.10.16.\n// Copyright © 2016 JWTIO"
},
{
"path": "Example/JWTDesktopSwift/JWTDesktopSwift.xcodeproj/project.pbxproj",
"chars": 15599,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 52;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "Example/JWTDesktopSwift/JWTDesktopSwift.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
"chars": 135,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"self:\">\n </FileRef"
},
{
"path": "Example/JWTDesktopSwift/JWTDesktopSwift.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
"chars": 238,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Example/JWTDesktopSwiftToolkit/.gitignore",
"chars": 126,
"preview": ".DS_Store\n/.build\n/Packages\n/*.xcodeproj\nxcuserdata/\nDerivedData/\n.swiftpm/xcode/package.xcworkspace/contents.xcworkspac"
},
{
"path": "Example/JWTDesktopSwiftToolkit/Package.swift",
"chars": 1216,
"preview": "// swift-tools-version:5.5\n// The swift-tools-version declares the minimum version of Swift required to build this packa"
},
{
"path": "Example/JWTDesktopSwiftToolkit/README.md",
"chars": 57,
"preview": "# JWTDesktopSwiftToolkit\n\nA description of this package.\n"
},
{
"path": "Example/JWTDesktopSwiftToolkit/Sources/JWTDesktopSwiftToolkit/Array+Extension.swift",
"chars": 312,
"preview": "//\n// Array+Extension.swift\n// JWTDesktopSwift\n//\n// Created by Lobanov Dmitry on 30.10.2017.\n// Copyright © 2017 JW"
},
{
"path": "Example/JWTDesktopSwiftToolkit/Sources/JWTDesktopSwiftToolkit/ColorBridge+Platforms.swift",
"chars": 907,
"preview": "//\n// ColorBridge+Platforms.swift\n// JWTDesktopSwiftToolkit\n//\n// Created by Dmitry Lobanov on 04.06.2021.\n//\n\nimport"
},
{
"path": "Example/JWTDesktopSwiftToolkit/Sources/JWTDesktopSwiftToolkit/FontBridge+Platforms.swift",
"chars": 674,
"preview": "//\n// FontBridge+Platforms.swift\n// JWTDesktopSwiftToolkit\n//\n// Created by Dmitry Lobanov on 04.06.2021.\n//\n\nimport "
},
{
"path": "Example/JWTDesktopSwiftToolkit/Sources/JWTDesktopSwiftToolkit/SignatureValidationType.swift",
"chars": 467,
"preview": "//\n// SignatureValidationType.swift\n// JWTDesktopSwift\n//\n// Created by Lobanov Dmitry on 30.10.2017.\n// Copyright ©"
},
{
"path": "Example/JWTDesktopSwiftToolkit/Sources/JWTDesktopSwiftToolkit/String+Extension.swift",
"chars": 778,
"preview": "//\n// String+Extension.swift\n// JWTDesktopSwift\n//\n// Created by Lobanov Dmitry on 30.10.2017.\n// Copyright © 2017 J"
},
{
"path": "Example/JWTDesktopSwiftToolkit/Sources/JWTDesktopSwiftToolkit/TokenDecoder.swift",
"chars": 6009,
"preview": "//\n// JWTTokenDecoder.swift\n// JWTDesktopSwift\n//\n// Created by Lobanov Dmitry on 30.10.2017.\n// Copyright © 2017 JW"
},
{
"path": "Example/JWTDesktopSwiftToolkit/Sources/JWTDesktopSwiftToolkit/TokenTextTypeDescription.swift",
"chars": 2859,
"preview": "//\n// TokenTextTypeDescription.swift\n// JWTDesktopSwift\n//\n// Created by Lobanov Dmitry on 01.10.16.\n// Copyright © "
},
{
"path": "Example/JWTDesktopSwiftToolkit/Tests/JWTDesktopSwiftToolkitTests/JWTDesktopSwiftToolkitTests.swift",
"chars": 314,
"preview": "import XCTest\n@testable import JWTDesktopSwiftToolkit\n\nfinal class JWTDesktopSwiftToolkitTests: XCTestCase {\n func te"
},
{
"path": "Example/JWTSwiftUI/JWTSwiftUI/AppDelegate.swift",
"chars": 1638,
"preview": "//\n// AppDelegate.swift\n// JWTSwiftUI\n//\n// Created by Dmitry Lobanov on 08/06/2019.\n// Copyright © 2019 Dmitry Loba"
},
{
"path": "Example/JWTSwiftUI/JWTSwiftUI/Assets.xcassets/AppIcon.appiconset/Contents.json",
"chars": 1590,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"iphone\",\n \"size\" : \"20x20\",\n \"scale\" : \"2x\"\n },\n {\n \"idiom\""
},
{
"path": "Example/JWTSwiftUI/JWTSwiftUI/Assets.xcassets/Contents.json",
"chars": 62,
"preview": "{\n \"info\" : {\n \"version\" : 1,\n \"author\" : \"xcode\"\n }\n}"
},
{
"path": "Example/JWTSwiftUI/JWTSwiftUI/Base.lproj/LaunchScreen.storyboard",
"chars": 1665,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
},
{
"path": "Example/JWTSwiftUI/JWTSwiftUI/BottomView.swift",
"chars": 3819,
"preview": "//\n// BottomView.swift\n// JWTSwiftUI\n//\n// Created by Dmitry Lobanov on 08/06/2019.\n// Copyright © 2019 Dmitry Loban"
},
{
"path": "Example/JWTSwiftUI/JWTSwiftUI/ContentView.swift",
"chars": 1783,
"preview": "//\n// ContentView.swift\n// JWTSwiftUI\n//\n// Created by Dmitry Lobanov on 08/06/2019.\n// Copyright © 2019 Dmitry Loba"
},
{
"path": "Example/JWTSwiftUI/JWTSwiftUI/HeaderView.swift",
"chars": 2276,
"preview": "//\n// HeaderView.swift\n// JWTSwiftUI\n//\n// Created by Dmitry Lobanov on 08/06/2019.\n// Copyright © 2019 Dmitry Loban"
},
{
"path": "Example/JWTSwiftUI/JWTSwiftUI/Info.plist",
"chars": 1958,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Example/JWTSwiftUI/JWTSwiftUI/JWTModel.swift",
"chars": 7705,
"preview": "//\n// JWTData.swift\n// JWTSwiftUI\n//\n// Created by Dmitry Lobanov on 11/06/2019.\n// Copyright © 2019 Dmitry Lobanov."
},
{
"path": "Example/JWTSwiftUI/JWTSwiftUI/Preview Content/Preview Assets.xcassets/Contents.json",
"chars": 62,
"preview": "{\n \"info\" : {\n \"version\" : 1,\n \"author\" : \"xcode\"\n }\n}"
},
{
"path": "Example/JWTSwiftUI/JWTSwiftUI/SceneDelegate.swift",
"chars": 2832,
"preview": "//\n// SceneDelegate.swift\n// JWTSwiftUI\n//\n// Created by Dmitry Lobanov on 08/06/2019.\n// Copyright © 2019 Dmitry Lo"
},
{
"path": "Example/JWTSwiftUI/JWTSwiftUI.xcodeproj/project.pbxproj",
"chars": 30402,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 52;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "Example/JWTSwiftUI/JWTSwiftUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
"chars": 135,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"self:\">\n </FileRef"
},
{
"path": "Example/JWTSwiftUI/JWTSwiftUI.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
"chars": 238,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Example/JWTSwiftUI/MacJWTSwiftUI/Assets.xcassets/AccentColor.colorset/Contents.json",
"chars": 123,
"preview": "{\n \"colors\" : [\n {\n \"idiom\" : \"universal\"\n }\n ],\n \"info\" : {\n \"author\" : \"xcode\",\n \"version\" : 1\n }"
},
{
"path": "Example/JWTSwiftUI/MacJWTSwiftUI/Assets.xcassets/AppIcon.appiconset/Contents.json",
"chars": 904,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"mac\",\n \"scale\" : \"1x\",\n \"size\" : \"16x16\"\n },\n {\n \"idiom\" : "
},
{
"path": "Example/JWTSwiftUI/MacJWTSwiftUI/Assets.xcassets/Contents.json",
"chars": 63,
"preview": "{\n \"info\" : {\n \"author\" : \"xcode\",\n \"version\" : 1\n }\n}\n"
},
{
"path": "Example/JWTSwiftUI/MacJWTSwiftUI/ContentView.swift",
"chars": 398,
"preview": "//\n// ContentView.swift\n// MacJWTSwiftUI\n//\n// Created by Dmitry Lobanov on 07.06.2021.\n// Copyright © 2021 Dmitry L"
},
{
"path": "Example/JWTSwiftUI/MacJWTSwiftUI/Info.plist",
"chars": 917,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Example/JWTSwiftUI/MacJWTSwiftUI/MacJWTSwiftUI.entitlements",
"chars": 322,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Example/JWTSwiftUI/MacJWTSwiftUI/MacJWTSwiftUIApp.swift",
"chars": 396,
"preview": "//\n// MacJWTSwiftUIApp.swift\n// MacJWTSwiftUI\n//\n// Created by Dmitry Lobanov on 07.06.2021.\n// Copyright © 2021 Dmi"
},
{
"path": "Example/JWTSwiftUI/MacJWTSwiftUI/Preview Content/Preview Assets.xcassets/Contents.json",
"chars": 63,
"preview": "{\n \"info\" : {\n \"author\" : \"xcode\",\n \"version\" : 1\n }\n}\n"
},
{
"path": "Example/JWTSwiftUI/iOSJWTSwiftUI/Assets.xcassets/AccentColor.colorset/Contents.json",
"chars": 123,
"preview": "{\n \"colors\" : [\n {\n \"idiom\" : \"universal\"\n }\n ],\n \"info\" : {\n \"author\" : \"xcode\",\n \"version\" : 1\n }"
},
{
"path": "Example/JWTSwiftUI/iOSJWTSwiftUI/Assets.xcassets/AppIcon.appiconset/Contents.json",
"chars": 1591,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"iphone\",\n \"scale\" : \"2x\",\n \"size\" : \"20x20\"\n },\n {\n \"idiom\""
},
{
"path": "Example/JWTSwiftUI/iOSJWTSwiftUI/Assets.xcassets/Contents.json",
"chars": 63,
"preview": "{\n \"info\" : {\n \"author\" : \"xcode\",\n \"version\" : 1\n }\n}\n"
},
{
"path": "Example/JWTSwiftUI/iOSJWTSwiftUI/ContentView.swift",
"chars": 398,
"preview": "//\n// ContentView.swift\n// iOSJWTSwiftUI\n//\n// Created by Dmitry Lobanov on 07.06.2021.\n// Copyright © 2021 Dmitry L"
},
{
"path": "Example/JWTSwiftUI/iOSJWTSwiftUI/Info.plist",
"chars": 1580,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Example/JWTSwiftUI/iOSJWTSwiftUI/Preview Content/Preview Assets.xcassets/Contents.json",
"chars": 63,
"preview": "{\n \"info\" : {\n \"author\" : \"xcode\",\n \"version\" : 1\n }\n}\n"
},
{
"path": "Example/JWTSwiftUI/iOSJWTSwiftUI/iOSJWTSwiftUIApp.swift",
"chars": 396,
"preview": "//\n// iOSJWTSwiftUIApp.swift\n// iOSJWTSwiftUI\n//\n// Created by Dmitry Lobanov on 07.06.2021.\n// Copyright © 2021 Dmi"
},
{
"path": "JWT.podspec",
"chars": 961,
"preview": "class VersionFile\n class << self\n def version\n File.new(self.filepath).gets.rstrip\n end\n def filepath\n "
},
{
"path": "LICENSE",
"chars": 1064,
"preview": "Copyright (c) 2013 Karma Mobility, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof"
},
{
"path": "Package.resolved",
"chars": 352,
"preview": "{\n \"object\": {\n \"pins\": [\n {\n \"package\": \"Base64\",\n \"repositoryURL\": \"https://github.com/lolgear/"
},
{
"path": "Package.swift",
"chars": 1100,
"preview": "// swift-tools-version:5.4\n// The swift-tools-version declares the minimum version of Swift required to build this packa"
},
{
"path": "README.md",
"chars": 19427,
"preview": "[](https://jwt.io/)\n\n[\n\n# generate rsa private key.\nopenssl genrsa -out private_1.pem\n\n# request certificate with private key in pem fo"
},
{
"path": "Scripts/private_1.pem",
"chars": 497,
"preview": "-----BEGIN RSA PRIVATE KEY-----\nMIIBOwIBAAJBANY7AQ5MmRhLWrnj3Awbtq3FDMEW9IhNxYuHPtCChpNX505L06NM\nN2GbtrDFvkMWEQpnvblFxme"
},
{
"path": "Scripts/private_256_right.pem",
"chars": 3314,
"preview": "Bag Attributes\n friendlyName: Digital Signing Test\n localKeyID: 6F 37 3B E6 78 85 E0 42 30 AC B7 D1 2F C6 C5 69 20"
},
{
"path": "Scripts/private_256_wrong.pem",
"chars": 3326,
"preview": "Bag Attributes\n friendlyName: Digital Signing Test 2\n localKeyID: 74 36 2D 52 4A CD E9 18 4E 16 B4 14 20 CF DF DB "
},
{
"path": "Scripts/public_256_right.pem",
"chars": 1663,
"preview": "-----BEGIN CERTIFICATE-----\nMIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQsFADBKMR0wGwYDVQQDDBREaWdp\ndGFsIFNpZ25pbmcgVGVzdDELMAk"
},
{
"path": "Scripts/public_256_wrong.pem",
"chars": 1671,
"preview": "-----BEGIN CERTIFICATE-----\nMIIDVzCCAj+gAwIBAgIBATANBgkqhkiG9w0BAQsFADBMMR8wHQYDVQQDDBZEaWdp\ndGFsIFNpZ25pbmcgVGVzdCAyMQs"
},
{
"path": "Scripts/test_cert_public_256_right.pem",
"chars": 1671,
"preview": "-----BEGIN CERTIFICATE-----\nMIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQsFADBKMR0wGwYDVQQDDBREaWdp\ndGFsIFNpZ25pbmcgVGVzdDELMAk"
},
{
"path": "Scripts/test_cert_public_256_wrong.pem",
"chars": 1679,
"preview": "-----BEGIN CERTIFICATE-----\nMIIDVzCCAj+gAwIBAgIBATANBgkqhkiG9w0BAQsFADBMMR8wHQYDVQQDDBZEaWdp\ndGFsIFNpZ25pbmcgVGVzdCAyMQs"
},
{
"path": "Sources/JWT/Algorithms/Base/JWTAlgorithmErrorDescription+Subclass.m",
"chars": 533,
"preview": "//\n// JWTAlgorithmErrorDescription+Subclass.m\n// JWT\n//\n// Created by Dmitry on 7/29/18.\n// Copyright © 2018 JWTIO. "
},
{
"path": "Sources/JWT/Algorithms/Base/JWTAlgorithmErrorDescription.m",
"chars": 2767,
"preview": "//\n// JWTAlgorithmErrorDescription.m\n// JWT\n//\n// Created by Dmitry on 7/29/18.\n// Copyright © 2018 JWTIO. All right"
},
{
"path": "Sources/JWT/Algorithms/Base/JWTAlgorithmFactory.m",
"chars": 4695,
"preview": "//\n// JWTAlgorithmFactory.m\n// JWT\n//\n// Created by Lobanov Dmitry on 07.10.15.\n// Copyright © 2015 Karma. All right"
},
{
"path": "Sources/JWT/Algorithms/Base/JWTAlgorithmNone.m",
"chars": 840,
"preview": "//\n// JWTAlgorithmNone.m\n// JWT\n//\n// Created by Lobanov Dmitry on 16.10.15.\n// Copyright © 2015 Karma. All rights r"
},
{
"path": "Sources/JWT/Algorithms/ESFamily/JWTAlgorithmAsymmetricBase.m",
"chars": 17626,
"preview": "//\n// JWTAlgorithmAsymmetricBase.m\n// Base64\n//\n// Created by Lobanov Dmitry on 12.03.2018.\n//\n\n#import \"JWTAlgorithm"
},
{
"path": "Sources/JWT/Algorithms/ESFamily/JWTAlgorithmESBase.m",
"chars": 1108,
"preview": "//\n// JWTAlgorithmESBase.m\n// Pods\n//\n// Created by Lobanov Dmitry on 12.02.17.\n//\n//\n\n#import \"JWTAlgorithmESBase.h\""
},
{
"path": "Sources/JWT/Algorithms/HSFamily/JWTAlgorithmHSBase.m",
"chars": 3531,
"preview": "//\n// JWTAlgorithmHSBase.m\n// JWT\n//\n// Created by Lobanov Dmitry on 13.03.16.\n// Copyright © 2016 Karma. All rights"
},
{
"path": "Sources/JWT/Algorithms/Holders/JWTAlgorithmDataHolder+FluentStyle.m",
"chars": 455,
"preview": "//\n// JWTAlgorithmDataHolder+FluentStyle.m\n// JWT\n//\n// Created by Dmitry Lobanov on 07/06/2019.\n// Copyright © 2019"
},
{
"path": "Sources/JWT/Algorithms/Holders/JWTAlgorithmDataHolder.m",
"chars": 11160,
"preview": "//\n// JWTAlgorithmDataHolder.m\n// JWT\n//\n// Created by Lobanov Dmitry on 31.08.16.\n// Copyright © 2016 Karma. All ri"
},
{
"path": "Sources/JWT/Algorithms/Holders/JWTAlgorithmDataHolderChain.m",
"chars": 4670,
"preview": "//\n// JWTAlgorithmDataHolderChain.m\n// JWT\n//\n// Created by Lobanov Dmitry on 02.10.16.\n// Copyright © 2016 Karma. A"
},
{
"path": "Sources/JWT/Algorithms/RSFamily/JWTAlgorithmRSBase.m",
"chars": 19917,
"preview": "//\n// JWTAlgorithmRSBase.m\n// JWT\n//\n// Created by Lobanov Dmitry on 13.03.16.\n// Copyright © 2016 Karma. All rights"
},
{
"path": "Sources/JWT/Algorithms/RSFamily/RSKeys/JWTCryptoKey.m",
"chars": 13342,
"preview": "//\n// JWTCryptoKey.m\n// JWT\n//\n// Created by Lobanov Dmitry on 04.02.17.\n// Copyright © 2017 JWTIO. All rights reser"
},
{
"path": "Sources/JWT/Algorithms/RSFamily/RSKeys/JWTCryptoKeyExtractor+FluentStyle.m",
"chars": 382,
"preview": "//\n// JWTCryptoKeyExtractor+FluentStyle.m\n// JWT\n//\n// Created by Dmitry Lobanov on 07/06/2019.\n// Copyright © 2019 "
},
{
"path": "Sources/JWT/Algorithms/RSFamily/RSKeys/JWTCryptoKeyExtractor.m",
"chars": 6400,
"preview": "//\n// JWTCryptoKeyExtractor.m\n// JWT\n//\n// Created by Lobanov Dmitry on 04.02.17.\n// Copyright © 2017 JWTIO. All rig"
},
{
"path": "Sources/JWT/Algorithms/RSFamily/RSKeys/JWTCryptoSecurity+ErrorHandling.m",
"chars": 983,
"preview": "//\n// JWTCryptoSecurity+ErrorHandling.m\n// JWT\n//\n// Created by Dmitry Lobanov on 08.08.2018.\n// Copyright © 2018 JW"
},
{
"path": "Sources/JWT/Algorithms/RSFamily/RSKeys/JWTCryptoSecurity+ExternalRepresentation.m",
"chars": 845,
"preview": "//\n// JWTCryptoSecurity+ExternalRepresentation.m\n// JWT\n//\n// Created by Dmitry Lobanov on 08.08.2018.\n// Copyright "
},
{
"path": "Sources/JWT/Algorithms/RSFamily/RSKeys/JWTCryptoSecurity+Extraction.m",
"chars": 4781,
"preview": "//\n// JWTCryptoSecurity+Extraction.m\n// JWT\n//\n// Created by Dmitry on 7/31/18.\n// Copyright © 2018 JWTIO. All right"
},
{
"path": "Sources/JWT/Algorithms/RSFamily/RSKeys/JWTCryptoSecurity.m",
"chars": 23122,
"preview": "//\n// JWTCryptoSecurity.m\n// JWT\n//\n// Created by Lobanov Dmitry on 04.02.17.\n// Copyright © 2017 JWTIO. All rights "
},
{
"path": "Sources/JWT/ClaimSet/JWTClaim.m",
"chars": 4314,
"preview": "//\n// JWTClaim.m\n// JWT\n//\n// Created by Lobanov Dmitry on 13.02.16.\n// Copyright © 2016 Karma. All rights reserved."
},
{
"path": "Sources/JWT/ClaimSet/JWTClaimBase.m",
"chars": 1066,
"preview": "//\n// JWTClaimBase.m\n// JWT\n//\n// Created by Dmitry Lobanov on 10.08.2020.\n// Copyright © 2020 JWTIO. All rights res"
},
{
"path": "Sources/JWT/ClaimSet/JWTClaimSerializerBase.m",
"chars": 457,
"preview": "//\n// JWTClaimSerializerBase.m\n// JWT\n//\n// Created by Dmitry Lobanov on 30.05.2021.\n// Copyright © 2021 JWTIO. All "
},
{
"path": "Sources/JWT/ClaimSet/JWTClaimSerializerVariations.m",
"chars": 1010,
"preview": "//\n// JWTClaimSerializerVariations.m\n// JWT\n//\n// Created by Dmitry Lobanov on 30.05.2021.\n// Copyright © 2021 JWTIO"
},
{
"path": "Sources/JWT/ClaimSet/JWTClaimVariations.m",
"chars": 3600,
"preview": "//\n// JWTClaimVariations.m\n// JWT\n//\n// Created by Dmitry Lobanov on 10.08.2020.\n// Copyright © 2020 JWTIO. All righ"
},
{
"path": "Sources/JWT/ClaimSet/JWTClaimVerifierBase.m",
"chars": 314,
"preview": "//\n// JWTClaimVerifierBase.m\n// JWT\n//\n// Created by Dmitry Lobanov on 30.05.2021.\n// Copyright © 2021 JWTIO. All ri"
},
{
"path": "Sources/JWT/ClaimSet/JWTClaimVerifierVariations.m",
"chars": 3722,
"preview": "//\n// JWTClaimVerifierVariations.m\n// JWT\n//\n// Created by Dmitry Lobanov on 30.05.2021.\n// Copyright © 2021 JWTIO. "
},
{
"path": "Sources/JWT/ClaimSet/JWTClaimsProviderBase.m",
"chars": 2238,
"preview": "//\n// JWTClaimsProviderBase.m\n// JWT\n//\n// Created by Dmitry Lobanov on 22.05.2021.\n// Copyright © 2021 JWTIO. All r"
},
{
"path": "Sources/JWT/ClaimSet/JWTClaimsSet.m",
"chars": 720,
"preview": "//\n// JWTClaimsSet.m\n// JWT\n//\n// Created by Klaas Pieter Annema on 31-05-13.\n// Copyright (c) 2013 Karma. All right"
},
{
"path": "Sources/JWT/ClaimSet/JWTClaimsSetBase.m",
"chars": 1672,
"preview": "//\n// JWTClaimsSetBase.m\n// JWT\n//\n// Created by Dmitry Lobanov on 10.08.2020.\n// Copyright © 2020 JWTIO. All rights"
},
{
"path": "Sources/JWT/ClaimSet/JWTClaimsSetCoordinatorBase.m",
"chars": 3284,
"preview": "//\n// JWTClaimsSetCoordinatorBase.m\n// JWT\n//\n// Created by Dmitry Lobanov on 31.05.2021.\n// Copyright © 2021 JWTIO."
},
{
"path": "Sources/JWT/ClaimSet/JWTClaimsSetDSLBase.m",
"chars": 3069,
"preview": "//\n// JWTClaimsSetDSLBase.m\n// JWT\n//\n// Created by Dmitry Lobanov on 31.05.2021.\n// Copyright © 2021 JWTIO. All rig"
},
{
"path": "Sources/JWT/ClaimSet/JWTClaimsSetSerializer.m",
"chars": 2698,
"preview": "//\n// JWTClaimsSetSerializer.m\n// JWT\n//\n// Created by Klaas Pieter Annema on 31-05-13.\n// Copyright (c) 2013 Karma."
},
{
"path": "Sources/JWT/ClaimSet/JWTClaimsSetSerializerBase.m",
"chars": 3561,
"preview": "//\n// JWTClaimsSetSerializerBase.m\n// JWT\n//\n// Created by Dmitry Lobanov on 10.08.2020.\n// Copyright © 2020 JWTIO. "
},
{
"path": "Sources/JWT/ClaimSet/JWTClaimsSetVerifier.m",
"chars": 2232,
"preview": "//\n// JWTClaimsSetVerifier.m\n// JWT\n//\n// Created by Lobanov Dmitry on 13.02.16.\n// Copyright © 2016 Karma. All righ"
},
{
"path": "Sources/JWT/ClaimSet/JWTClaimsSetVerifierBase.m",
"chars": 3441,
"preview": "//\n// JWTClaimsSetVerifierBase.m\n// JWT\n//\n// Created by Dmitry Lobanov on 10.08.2020.\n// Copyright © 2020 JWTIO. Al"
},
{
"path": "Sources/JWT/Coding/JWTBuilder+FluentStyle.m",
"chars": 349,
"preview": "//\n// JWTBuilder+FluentStyle.m\n// JWT\n//\n// Created by Dmitry Lobanov on 15/06/2019.\n// Copyright © 2019 JWTIO. All "
},
{
"path": "Sources/JWT/Coding/JWTCoding+ResultTypes.m",
"chars": 3808,
"preview": "//\n// JWTCoding+ResultTypes.m\n// JWT\n//\n// Created by Lobanov Dmitry on 30.11.16.\n// Copyright © 2016 JWTIO. All rig"
},
{
"path": "Sources/JWT/Coding/JWTCoding+VersionOne.m",
"chars": 12985,
"preview": "//\n// JWTCoding+VersionOne.m\n// JWT\n//\n// Created by Lobanov Dmitry on 27.11.16.\n// Copyright © 2016 JWTIO. All righ"
},
{
"path": "Sources/JWT/Coding/JWTCoding+VersionThree.m",
"chars": 23039,
"preview": "//\n// JWTCoding+VersionThree.m\n// JWT\n//\n// Created by Lobanov Dmitry on 27.11.16.\n// Copyright © 2016 JWTIO. All ri"
},
{
"path": "Sources/JWT/Coding/JWTCoding+VersionTwo.m",
"chars": 17971,
"preview": "//\n// JWTCoding+VersionTwo.m\n// JWT\n//\n// Created by Lobanov Dmitry on 27.11.16.\n// Copyright © 2016 JWTIO. All righ"
},
{
"path": "Sources/JWT/Coding/JWTCoding.m",
"chars": 175,
"preview": "//\n// JWT.m\n// JWT\n//\n// Created by Klaas Pieter Annema on 31-05-13.\n// Copyright (c) 2013 Karma. All rights reserve"
},
{
"path": "Sources/JWT/Coding/JWTCodingBuilder+FluentStyle.m",
"chars": 477,
"preview": "//\n// JWTCodingBuilder+FluentStyle.m\n// JWT\n//\n// Created by Dmitry Lobanov on 07/06/2019.\n// Copyright © 2019 JWTIO"
},
{
"path": "Sources/JWT/Supplement/JWTBase64Coder.m",
"chars": 3158,
"preview": "//\n// JWTBase64Coder.m\n// Pods\n//\n// Created by Lobanov Dmitry on 05.10.16.\n//\n//\n\n#import \"JWTBase64Coder.h\"\n\n#ifnde"
},
{
"path": "Sources/JWT/Supplement/JWTErrorDescription.m",
"chars": 4587,
"preview": "//\n// JWTErrorDescription.m\n// JWT\n//\n// Created by Lobanov Dmitry on 27.11.16.\n// Copyright © 2016 JWTIO. All right"
},
{
"path": "Sources/JWT/include/JWTAlgorithm.h",
"chars": 2770,
"preview": "//\n// JWTAlgorithm.h\n// JWT\n//\n// Created by Klaas Pieter Annema on 31-05-13.\n// Copyright (c) 2013 Karma. All right"
},
{
"path": "Sources/JWT/include/JWTAlgorithmAsymmetricBase.h",
"chars": 1037,
"preview": "//\n// JWTAlgorithmAsymmetricBase.h\n// Base64\n//\n// Created by Lobanov Dmitry on 12.03.2018.\n//\n\n#import <Foundation/F"
},
{
"path": "Sources/JWT/include/JWTAlgorithmDataHolder+FluentStyle.h",
"chars": 2569,
"preview": "//\n// JWTAlgorithmDataHolder+FluentStyle.h\n// JWT\n//\n// Created by Dmitry Lobanov on 07/06/2019.\n// Copyright © 2019"
},
{
"path": "Sources/JWT/include/JWTAlgorithmDataHolder.h",
"chars": 3624,
"preview": "//\n// JWTAlgorithmDataHolder.h\n// JWT\n//\n// Created by Lobanov Dmitry on 31.08.16.\n// Copyright © 2016 Karma. All ri"
},
{
"path": "Sources/JWT/include/JWTAlgorithmDataHolderChain.h",
"chars": 1364,
"preview": "//\n// JWTAlgorithmDataHolderChain.h\n// JWT\n//\n// Created by Lobanov Dmitry on 02.10.16.\n// Copyright © 2016 Karma. A"
},
{
"path": "Sources/JWT/include/JWTAlgorithmESBase.h",
"chars": 567,
"preview": "//\n// JWTAlgorithmESBase.h\n// Pods\n//\n// Created by Lobanov Dmitry on 12.02.17.\n//\n//\n\n#import <Foundation/Foundation"
},
{
"path": "Sources/JWT/include/JWTAlgorithmErrorDescription+Subclass.h",
"chars": 765,
"preview": "//\n// JWTAlgorithmErrorDescription+Subclass.h\n// JWT\n//\n// Created by Dmitry on 7/29/18.\n// Copyright © 2018 JWTIO. "
},
{
"path": "Sources/JWT/include/JWTAlgorithmErrorDescription.h",
"chars": 325,
"preview": "//\n// JWTAlgorithmErrorDescription.h\n// JWT\n//\n// Created by Dmitry on 7/29/18.\n// Copyright © 2018 JWTIO. All right"
},
{
"path": "Sources/JWT/include/JWTAlgorithmFactory.h",
"chars": 1030,
"preview": "//\n// JWTAlgorithmFactory.h\n// JWT\n//\n// Created by Lobanov Dmitry on 07.10.15.\n// Copyright © 2015 Karma. All right"
},
{
"path": "Sources/JWT/include/JWTAlgorithmHSBase.h",
"chars": 675,
"preview": "//\n// JWTAlgorithmHSBase.h\n// JWT\n//\n// Created by Lobanov Dmitry on 13.03.16.\n// Copyright © 2016 Karma. All rights"
},
{
"path": "Sources/JWT/include/JWTAlgorithmNone.h",
"chars": 299,
"preview": "//\n// JWTAlgorithmNone.h\n// JWT\n//\n// Created by Lobanov Dmitry on 16.10.15.\n// Copyright © 2015 Karma. All rights r"
},
{
"path": "Sources/JWT/include/JWTAlgorithmRSBase.h",
"chars": 1431,
"preview": "//\n// JWTAlgorithmRSBase.h\n// JWT\n//\n// Created by Lobanov Dmitry on 13.03.16.\n// Copyright © 2016 Karma. All rights"
},
{
"path": "Sources/JWT/include/JWTBase64Coder.h",
"chars": 839,
"preview": "//\n// JWTBase64Coder.h\n// Pods\n//\n// Created by Lobanov Dmitry on 05.10.16.\n//\n//\n\n#import <Foundation/Foundation.h>\n"
},
{
"path": "Sources/JWT/include/JWTBuilder+FluentStyle.h",
"chars": 2616,
"preview": "//\n// JWTBuilder+FluentStyle.h\n// JWT\n//\n// Created by Dmitry Lobanov on 15/06/2019.\n// Copyright © 2019 JWTIO. All "
},
{
"path": "Sources/JWT/include/JWTClaim.h",
"chars": 426,
"preview": "//\n// JWTClaim.h\n// JWT\n//\n// Created by Lobanov Dmitry on 13.02.16.\n// Copyright © 2016 Karma. All rights reserved."
},
{
"path": "Sources/JWT/include/JWTClaimBase.h",
"chars": 308,
"preview": "//\n// JWTClaimBase.h\n// JWT\n//\n// Created by Dmitry Lobanov on 10.08.2020.\n// Copyright © 2020 JWTIO. All rights res"
},
{
"path": "Sources/JWT/include/JWTClaimSerializerBase.h",
"chars": 339,
"preview": "//\n// JWTClaimSerializerBase.h\n// JWT\n//\n// Created by Dmitry Lobanov on 30.05.2021.\n// Copyright © 2021 JWTIO. All "
},
{
"path": "Sources/JWT/include/JWTClaimSerializerVariations.h",
"chars": 1113,
"preview": "//\n// JWTClaimSerializerVariations.h\n// JWT\n//\n// Created by Dmitry Lobanov on 30.05.2021.\n// Copyright © 2021 JWTIO"
},
{
"path": "Sources/JWT/include/JWTClaimVariations.h",
"chars": 1640,
"preview": "//\n// JWTClaimVariations.h\n// JWT\n//\n// Created by Dmitry Lobanov on 10.08.2020.\n// Copyright © 2020 JWTIO. All righ"
},
{
"path": "Sources/JWT/include/JWTClaimVerifierBase.h",
"chars": 333,
"preview": "//\n// JWTClaimVerifierBase.h\n// JWT\n//\n// Created by Dmitry Lobanov on 30.05.2021.\n// Copyright © 2021 JWTIO. All ri"
},
{
"path": "Sources/JWT/include/JWTClaimVerifierVariations.h",
"chars": 1341,
"preview": "//\n// JWTClaimVerifierVariations.h\n// JWT\n//\n// Created by Dmitry Lobanov on 30.05.2021.\n// Copyright © 2021 JWTIO. "
},
{
"path": "Sources/JWT/include/JWTClaimsProviderBase.h",
"chars": 336,
"preview": "//\n// JWTClaimsProviderBase.h\n// JWT\n//\n// Created by Dmitry Lobanov on 22.05.2021.\n// Copyright © 2021 JWTIO. All r"
},
{
"path": "Sources/JWT/include/JWTClaimsSet.h",
"chars": 752,
"preview": "//\n// JWTClaimsSet.h\n// JWT\n//\n// Created by Klaas Pieter Annema on 31-05-13.\n// Copyright (c) 2013 Karma. All right"
},
{
"path": "Sources/JWT/include/JWTClaimsSetBase.h",
"chars": 320,
"preview": "//\n// JWTClaimsSetBase.h\n// JWT\n//\n// Created by Dmitry Lobanov on 10.08.2020.\n// Copyright © 2020 JWTIO. All rights"
},
{
"path": "Sources/JWT/include/JWTClaimsSetCoordinatorBase.h",
"chars": 1049,
"preview": "//\n// JWTClaimsSetCoordinatorBase.h\n// JWT\n//\n// Created by Dmitry Lobanov on 31.05.2021.\n// Copyright © 2021 JWTIO."
},
{
"path": "Sources/JWT/include/JWTClaimsSetDSLBase.h",
"chars": 1313,
"preview": "//\n// JWTClaimsSetDSLBase.h\n// JWT\n//\n// Created by Dmitry Lobanov on 31.05.2021.\n// Copyright © 2021 JWTIO. All rig"
},
{
"path": "Sources/JWT/include/JWTClaimsSetSerializer.h",
"chars": 432,
"preview": "//\n// JWTClaimsSetSerializer.h\n// JWT\n//\n// Created by Klaas Pieter Annema on 31-05-13.\n// Copyright (c) 2013 Karma."
},
{
"path": "Sources/JWT/include/JWTClaimsSetSerializerBase.h",
"chars": 633,
"preview": "//\n// JWTClaimsSetSerializerBase.h\n// JWT\n//\n// Created by Dmitry Lobanov on 10.08.2020.\n// Copyright © 2020 JWTIO. "
},
{
"path": "Sources/JWT/include/JWTClaimsSetVerifier.h",
"chars": 355,
"preview": "//\n// JWTClaimsSetVerifier.h\n// JWT\n//\n// Created by Lobanov Dmitry on 13.02.16.\n// Copyright © 2016 Karma. All righ"
},
{
"path": "Sources/JWT/include/JWTClaimsSetVerifierBase.h",
"chars": 545,
"preview": "//\n// JWTClaimsSetVerifierBase.h\n// JWT\n//\n// Created by Dmitry Lobanov on 10.08.2020.\n// Copyright © 2020 JWTIO. Al"
},
{
"path": "Sources/JWT/include/JWTClaimsSetsProtocols.h",
"chars": 3635,
"preview": "//\n// JWTClaimsSetsProtocols.h\n// JWT\n//\n// Created by Dmitry Lobanov on 09.08.2020.\n// Copyright © 2020 JWTIO. All "
},
{
"path": "Sources/JWT/include/JWTCoding+ResultTypes.h",
"chars": 2566,
"preview": "//\n// JWTCoding+ResultTypes.h\n// JWT\n//\n// Created by Lobanov Dmitry on 30.11.16.\n// Copyright © 2016 JWTIO. All rig"
},
{
"path": "Sources/JWT/include/JWTCoding+VersionOne.h",
"chars": 7666,
"preview": "//\n// JWTCoding+VersionOne.h\n// JWT\n//\n// Created by Lobanov Dmitry on 27.11.16.\n// Copyright © 2016 JWTIO. All righ"
},
{
"path": "Sources/JWT/include/JWTCoding+VersionThree.h",
"chars": 3284,
"preview": "//\n// JWTCoding+VersionThree.h\n// JWT\n//\n// Created by Lobanov Dmitry on 27.11.16.\n// Copyright © 2016 JWTIO. All ri"
},
{
"path": "Sources/JWT/include/JWTCoding+VersionTwo.h",
"chars": 3893,
"preview": "//\n// JWTCoding+VersionTwo.h\n// JWT\n//\n// Created by Lobanov Dmitry on 27.11.16.\n// Copyright © 2016 JWTIO. All righ"
},
{
"path": "Sources/JWT/include/JWTCoding.h",
"chars": 665,
"preview": "//\n// JWT.h\n// JWT\n//\n// Created by Klaas Pieter Annema on 31-05-13.\n// Copyright (c) 2013 Karma. All rights reserve"
},
{
"path": "Sources/JWT/include/JWTCodingBuilder+FluentStyle.h",
"chars": 2039,
"preview": "//\n// JWTCodingBuilder+FluentStyle.h\n// JWT\n//\n// Created by Dmitry Lobanov on 07/06/2019.\n// Copyright © 2019 JWTIO"
},
{
"path": "Sources/JWT/include/JWTCryptoKey.h",
"chars": 2801,
"preview": "//\n// JWTCryptoKey.h\n// JWT\n//\n// Created by Lobanov Dmitry on 04.02.17.\n// Copyright © 2017 JWTIO. All rights reser"
},
{
"path": "Sources/JWT/include/JWTCryptoKeyExtractor+FluentStyle.h",
"chars": 529,
"preview": "//\n// JWTCryptoKeyExtractor+FluentStyle.h\n// JWT\n//\n// Created by Dmitry Lobanov on 07/06/2019.\n// Copyright © 2019 "
},
{
"path": "Sources/JWT/include/JWTCryptoKeyExtractor.h",
"chars": 1376,
"preview": "//\n// JWTCryptoKeyExtractor.h\n// JWT\n//\n// Created by Lobanov Dmitry on 04.02.17.\n// Copyright © 2017 JWTIO. All rig"
},
{
"path": "Sources/JWT/include/JWTCryptoSecurity+ErrorHandling.h",
"chars": 318,
"preview": "//\n// JWTCryptoSecurity+ErrorHandling.h\n// JWT\n//\n// Created by Dmitry Lobanov on 08.08.2018.\n// Copyright © 2018 JW"
}
]
// ... and 120 more files (download for full content)
About this extraction
This page contains the full source code of the yourkarma/JWT GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 320 files (837.8 KB), approximately 232.6k tokens, and a symbol index with 75 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.