├── .gitignore ├── README.md ├── iReSign.app └── Contents │ ├── Info.plist │ ├── MacOS │ └── iReSign │ ├── PkgInfo │ └── Resources │ ├── Icon.icns │ ├── ResourceRules.plist │ ├── en.lproj │ ├── InfoPlist.strings │ └── MainMenu.nib │ └── zh-Hans.lproj │ ├── InfoPlist.strings │ └── MainMenu.nib └── iReSign ├── Icon.icns ├── en.lproj ├── InfoPlist.strings └── MainMenu.xib ├── iReSign.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcshareddata │ │ └── iReSign.xccheckout │ └── xcuserdata │ │ └── kramer.xcuserdatad │ │ ├── UserInterfaceState.xcuserstate │ │ └── WorkspaceSettings.xcsettings └── xcuserdata │ └── kramer.xcuserdatad │ └── xcschemes │ ├── iReSign.xcscheme │ └── xcschememanagement.plist └── iReSign ├── IRHelpWindow.h ├── IRHelpWindow.m ├── IRTextFieldDrag.h ├── IRTextFieldDrag.m ├── ResourceRules.plist ├── en.lproj ├── InfoPlist.strings └── MainMenu.xib ├── iReSign-Info.plist ├── iReSign-Prefix.pch ├── iReSignAppDelegate.h ├── iReSignAppDelegate.m ├── main.m └── zh-Hans.lproj ├── InfoPlist.strings └── MainMenu.xib /.gitignore: -------------------------------------------------------------------------------- 1 | DerivedData 2 | xcuserdata -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | iReSign 2 | ======= 3 | 4 | iReSign allows iDevice app bundles (.ipa) files to be signed or resigned with a digital certificate from Apple for distribution. It can also create signed iDevice app bundles (.ipa) files from .xcarchive files. This tool is aimed at enterprises users, for enterprise deployment, when the person signing the app is different than the person(s) developing it. 5 | 6 | How to use 7 | ======= 8 | 9 | iReSign allows you to re-sign any unencrypted ipa-file with any certificate for which you hold the corresponding private key. iResign can also created a signed ipa-file from an xcarchive file. 10 | 11 | 1. Drag your unsigned .ipa or .xcarchive file to the top box, or use the browse button. 12 | 13 | 2. Enter your full certificate name from Keychain Access, for example "iPhone Developer: Firstname Lastname (XXXXXXXXXX)" in the bottom box. 14 | 15 | 3. Click ReSign! and wait. The resigned file will be saved in the same folder as the original file. 16 | 17 | License 18 | ======= 19 | 20 | Copyright (c) 2014 Maciej Swic 21 | 22 | Permission is hereby granted, free of charge, to any person obtaining a copy 23 | of this software and associated documentation files (the "Software"), to deal 24 | in the Software without restriction, including without limitation the rights 25 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 26 | copies of the Software, and to permit persons to whom the Software is 27 | furnished to do so, subject to the following conditions: 28 | 29 | The above copyright notice and this permission notice shall be included in 30 | all copies or substantial portions of the Software. 31 | 32 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 33 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 34 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 35 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 36 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 37 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 38 | THE SOFTWARE. -------------------------------------------------------------------------------- /iReSign.app/Contents/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildMachineOSBuild 6 | 15A235d 7 | CFBundleDevelopmentRegion 8 | en 9 | CFBundleExecutable 10 | iReSign 11 | CFBundleIconFile 12 | Icon.icns 13 | CFBundleIdentifier 14 | com.appulize.iReSign 15 | CFBundleInfoDictionaryVersion 16 | 6.0 17 | CFBundleName 18 | iReSign 19 | CFBundlePackageType 20 | APPL 21 | CFBundleShortVersionString 22 | 1.4 23 | CFBundleSignature 24 | ???? 25 | CFBundleVersion 26 | 1.0 27 | DTCompiler 28 | com.apple.compilers.llvm.clang.1_0 29 | DTPlatformBuild 30 | 6E35b 31 | DTPlatformVersion 32 | GM 33 | DTSDKBuild 34 | 14D125 35 | DTSDKName 36 | macosx10.10 37 | DTXcode 38 | 0640 39 | DTXcodeBuild 40 | 6E35b 41 | LSApplicationCategoryType 42 | public.app-category.developer-tools 43 | LSMinimumSystemVersion 44 | 10.6.8 45 | NSMainNibFile 46 | MainMenu 47 | NSPrincipalClass 48 | NSApplication 49 | 50 | 51 | -------------------------------------------------------------------------------- /iReSign.app/Contents/MacOS/iReSign: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maciekish/iReSign/df764ae3a57ed19a17eba293d876cdcd588921bf/iReSign.app/Contents/MacOS/iReSign -------------------------------------------------------------------------------- /iReSign.app/Contents/PkgInfo: -------------------------------------------------------------------------------- 1 | APPL???? -------------------------------------------------------------------------------- /iReSign.app/Contents/Resources/Icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maciekish/iReSign/df764ae3a57ed19a17eba293d876cdcd588921bf/iReSign.app/Contents/Resources/Icon.icns -------------------------------------------------------------------------------- /iReSign.app/Contents/Resources/ResourceRules.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | rules 6 | 7 | .* 8 | 9 | Info.plist 10 | 11 | omit 12 | 13 | weight 14 | 10 15 | 16 | ResourceRules.plist 17 | 18 | omit 19 | 20 | weight 21 | 100 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /iReSign.app/Contents/Resources/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maciekish/iReSign/df764ae3a57ed19a17eba293d876cdcd588921bf/iReSign.app/Contents/Resources/en.lproj/InfoPlist.strings -------------------------------------------------------------------------------- /iReSign.app/Contents/Resources/en.lproj/MainMenu.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maciekish/iReSign/df764ae3a57ed19a17eba293d876cdcd588921bf/iReSign.app/Contents/Resources/en.lproj/MainMenu.nib -------------------------------------------------------------------------------- /iReSign.app/Contents/Resources/zh-Hans.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maciekish/iReSign/df764ae3a57ed19a17eba293d876cdcd588921bf/iReSign.app/Contents/Resources/zh-Hans.lproj/InfoPlist.strings -------------------------------------------------------------------------------- /iReSign.app/Contents/Resources/zh-Hans.lproj/MainMenu.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maciekish/iReSign/df764ae3a57ed19a17eba293d876cdcd588921bf/iReSign.app/Contents/Resources/zh-Hans.lproj/MainMenu.nib -------------------------------------------------------------------------------- /iReSign/Icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maciekish/iReSign/df764ae3a57ed19a17eba293d876cdcd588921bf/iReSign/Icon.icns -------------------------------------------------------------------------------- /iReSign/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /iReSign/en.lproj/MainMenu.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1080 5 | 12C60 6 | 2844 7 | 1187.34 8 | 625.00 9 | 10 | com.apple.InterfaceBuilder.CocoaPlugin 11 | 2844 12 | 13 | 14 | NSButton 15 | NSButtonCell 16 | NSCustomObject 17 | NSMenu 18 | NSMenuItem 19 | NSProgressIndicator 20 | NSTextField 21 | NSTextFieldCell 22 | NSView 23 | NSWindowTemplate 24 | 25 | 26 | com.apple.InterfaceBuilder.CocoaPlugin 27 | 28 | 29 | PluginDependencyRecalculationVersion 30 | 31 | 32 | 33 | 34 | NSApplication 35 | 36 | 37 | FirstResponder 38 | 39 | 40 | NSApplication 41 | 42 | 43 | AMainMenu 44 | 45 | 46 | 47 | iReSign 48 | 49 | 1048576 50 | 2147483647 51 | 52 | NSImage 53 | NSMenuCheckmark 54 | 55 | 56 | NSImage 57 | NSMenuMixedState 58 | 59 | submenuAction: 60 | 61 | iReSign 62 | 63 | 64 | 65 | About iReSign 66 | 67 | 2147483647 68 | 69 | 70 | 71 | 72 | 73 | YES 74 | YES 75 | 76 | 77 | 1048576 78 | 2147483647 79 | 80 | 81 | 82 | 83 | 84 | Preferences… 85 | , 86 | 1048576 87 | 2147483647 88 | 89 | 90 | 91 | 92 | 93 | YES 94 | YES 95 | 96 | 97 | 1048576 98 | 2147483647 99 | 100 | 101 | 102 | 103 | 104 | Services 105 | 106 | 1048576 107 | 2147483647 108 | 109 | 110 | submenuAction: 111 | 112 | Services 113 | 114 | _NSServicesMenu 115 | 116 | 117 | 118 | 119 | YES 120 | YES 121 | 122 | 123 | 1048576 124 | 2147483647 125 | 126 | 127 | 128 | 129 | 130 | Hide iReSign 131 | h 132 | 1048576 133 | 2147483647 134 | 135 | 136 | 137 | 138 | 139 | Hide Others 140 | h 141 | 1572864 142 | 2147483647 143 | 144 | 145 | 146 | 147 | 148 | Show All 149 | 150 | 1048576 151 | 2147483647 152 | 153 | 154 | 155 | 156 | 157 | YES 158 | YES 159 | 160 | 161 | 1048576 162 | 2147483647 163 | 164 | 165 | 166 | 167 | 168 | Quit iReSign 169 | q 170 | 1048576 171 | 2147483647 172 | 173 | 174 | 175 | 176 | _NSAppleMenu 177 | 178 | 179 | 180 | 181 | Help 182 | 183 | 2147483647 184 | 185 | 186 | submenuAction: 187 | 188 | Help 189 | 190 | 191 | 192 | How to 193 | ? 194 | 1048576 195 | 2147483647 196 | 197 | 198 | 199 | 200 | _NSHelpMenu 201 | 202 | 203 | 204 | _NSMainMenu 205 | 206 | 207 | 4359 208 | 2 209 | {{335, 390}, {340, 163}} 210 | 1954021376 211 | iReSign 212 | NSWindow 213 | 214 | 215 | 216 | 217 | 256 218 | 219 | 220 | 221 | 266 222 | {{20, 121}, {208, 22}} 223 | 224 | 225 | 226 | YES 227 | 228 | -1804599231 229 | 272630784 230 | 231 | 232 | LucidaGrande 233 | 13 234 | 1044 235 | 236 | /path/to/app.ipa 237 | 238 | YES 239 | 240 | 6 241 | System 242 | textBackgroundColor 243 | 244 | 3 245 | MQA 246 | 247 | 248 | 249 | 6 250 | System 251 | textColor 252 | 253 | 3 254 | MAA 255 | 256 | 257 | 258 | NO 259 | 260 | 261 | 262 | 266 263 | {{20, 31}, {208, 22}} 264 | 265 | 266 | 267 | YES 268 | 269 | -1804599231 270 | 272630784 271 | 272 | 273 | Certificate name from Keychain 274 | 275 | YES 276 | 277 | 278 | 279 | NO 280 | 281 | 282 | 283 | 265 284 | {{230, 114}, {96, 32}} 285 | 286 | 287 | 288 | YES 289 | 290 | 67108864 291 | 134217728 292 | Browse 293 | 294 | 295 | -2038284288 296 | 129 297 | 298 | 299 | 200 300 | 25 301 | 302 | NO 303 | 304 | 305 | 306 | 266 307 | {{20, 91}, {208, 22}} 308 | 309 | 310 | 311 | YES 312 | 313 | -1804599231 314 | 272630784 315 | 316 | 317 | /path/to/.mobileprovision 318 | 319 | YES 320 | 321 | 322 | 323 | NO 324 | 325 | 326 | 327 | 265 328 | {{230, 84}, {96, 32}} 329 | 330 | 331 | 332 | YES 333 | 334 | 67108864 335 | 134217728 336 | Browse 337 | 338 | 339 | -2038284288 340 | 129 341 | 342 | 343 | 200 344 | 25 345 | 346 | NO 347 | 348 | 349 | 350 | 265 351 | {{230, 24}, {96, 32}} 352 | 353 | 354 | 355 | YES 356 | 357 | 67108864 358 | 134217728 359 | ReSign! 360 | 361 | 362 | -2038284288 363 | 129 364 | 365 | 366 | 200 367 | 25 368 | 369 | NO 370 | 371 | 372 | 373 | -2147483380 374 | {{41, 6}, {282, 17}} 375 | 376 | 377 | YES 378 | 379 | 68157504 380 | 272630784 381 | 382 | 383 | Please wait 384 | 385 | 386 | 6 387 | System 388 | controlColor 389 | 390 | 3 391 | MC42NjY2NjY2NjY3AA 392 | 393 | 394 | 395 | 6 396 | System 397 | controlTextColor 398 | 399 | 400 | 401 | NO 402 | 403 | 404 | 405 | 268 406 | {{20, 6}, {16, 16}} 407 | 408 | 409 | 410 | 28938 411 | 100 412 | 413 | 414 | 415 | 266 416 | {{20, 61}, {208, 22}} 417 | 418 | 419 | 420 | YES 421 | 422 | -1267728319 423 | 272630784 424 | 425 | 426 | com.companyname.appname 427 | 428 | YES 429 | 430 | 431 | 432 | NO 433 | 434 | 435 | 436 | 268 437 | {{234, 63}, {88, 18}} 438 | 439 | 440 | 441 | _NS:9 442 | YES 443 | 444 | 67108864 445 | 268435456 446 | Change ID 447 | 448 | _NS:9 449 | 450 | 1211912448 451 | 2 452 | 453 | NSImage 454 | NSSwitch 455 | 456 | 457 | NSSwitch 458 | 459 | 460 | 461 | 200 462 | 25 463 | 464 | NO 465 | 466 | 467 | {340, 163} 468 | 469 | 470 | 471 | 472 | {{0, 0}, {2560, 1418}} 473 | {10000000000000, 10000000000000} 474 | NO 475 | 22 476 | YES 477 | 478 | 479 | iReSignAppDelegate 480 | 481 | 482 | NSFontManager 483 | 484 | 485 | 486 | 487 | 488 | 489 | terminate: 490 | 491 | 492 | 493 | 449 494 | 495 | 496 | 497 | orderFrontStandardAboutPanel: 498 | 499 | 500 | 501 | 142 502 | 503 | 504 | 505 | delegate 506 | 507 | 508 | 509 | 495 510 | 511 | 512 | 513 | hide: 514 | 515 | 516 | 517 | 367 518 | 519 | 520 | 521 | hideOtherApplications: 522 | 523 | 524 | 525 | 368 526 | 527 | 528 | 529 | unhideAllApplications: 530 | 531 | 532 | 533 | 370 534 | 535 | 536 | 537 | initialFirstResponder 538 | 539 | 540 | 541 | 581 542 | 543 | 544 | 545 | window 546 | 547 | 548 | 549 | 532 550 | 551 | 552 | 553 | browseButton 554 | 555 | 556 | 557 | 546 558 | 559 | 560 | 561 | certField 562 | 563 | 564 | 565 | 547 566 | 567 | 568 | 569 | pathField 570 | 571 | 572 | 573 | 548 574 | 575 | 576 | 577 | resignButton 578 | 579 | 580 | 581 | 549 582 | 583 | 584 | 585 | browse: 586 | 587 | 588 | 589 | 550 590 | 591 | 592 | 593 | resign: 594 | 595 | 596 | 597 | 551 598 | 599 | 600 | 601 | showHelp: 602 | 603 | 604 | 605 | 552 606 | 607 | 608 | 609 | statusLabel 610 | 611 | 612 | 613 | 561 614 | 615 | 616 | 617 | flurry 618 | 619 | 620 | 621 | 562 622 | 623 | 624 | 625 | provisioningPathField 626 | 627 | 628 | 629 | 569 630 | 631 | 632 | 633 | provisioningBrowseButton 634 | 635 | 636 | 637 | 570 638 | 639 | 640 | 641 | provisioningBrowse: 642 | 643 | 644 | 645 | 571 646 | 647 | 648 | 649 | bundleIDField 650 | 651 | 652 | 653 | 576 654 | 655 | 656 | 657 | changeBundleIDCheckbox 658 | 659 | 660 | 661 | 577 662 | 663 | 664 | 665 | changeBundleIDPressed: 666 | 667 | 668 | 669 | 578 670 | 671 | 672 | 673 | nextKeyView 674 | 675 | 676 | 677 | 583 678 | 679 | 680 | 681 | nextKeyView 682 | 683 | 684 | 685 | 584 686 | 687 | 688 | 689 | nextKeyView 690 | 691 | 692 | 693 | 589 694 | 695 | 696 | 697 | nextKeyView 698 | 699 | 700 | 701 | 585 702 | 703 | 704 | 705 | nextKeyView 706 | 707 | 708 | 709 | 586 710 | 711 | 712 | 713 | nextKeyView 714 | 715 | 716 | 717 | 587 718 | 719 | 720 | 721 | nextKeyView 722 | 723 | 724 | 725 | 588 726 | 727 | 728 | 729 | 730 | 731 | 0 732 | 733 | 734 | 735 | 736 | 737 | -2 738 | 739 | 740 | File's Owner 741 | 742 | 743 | -1 744 | 745 | 746 | First Responder 747 | 748 | 749 | -3 750 | 751 | 752 | Application 753 | 754 | 755 | 29 756 | 757 | 758 | 759 | 760 | 761 | 762 | 763 | 764 | 56 765 | 766 | 767 | 768 | 769 | 770 | 771 | 772 | 57 773 | 774 | 775 | 776 | 777 | 778 | 779 | 780 | 781 | 782 | 783 | 784 | 785 | 786 | 787 | 788 | 789 | 790 | 58 791 | 792 | 793 | 794 | 795 | 134 796 | 797 | 798 | 799 | 800 | 150 801 | 802 | 803 | 804 | 805 | 136 806 | 807 | 808 | 809 | 810 | 144 811 | 812 | 813 | 814 | 815 | 129 816 | 817 | 818 | 819 | 820 | 143 821 | 822 | 823 | 824 | 825 | 236 826 | 827 | 828 | 829 | 830 | 131 831 | 832 | 833 | 834 | 835 | 836 | 837 | 838 | 149 839 | 840 | 841 | 842 | 843 | 145 844 | 845 | 846 | 847 | 848 | 130 849 | 850 | 851 | 852 | 853 | 420 854 | 855 | 856 | 857 | 858 | 490 859 | 860 | 861 | 862 | 863 | 864 | 865 | 866 | 491 867 | 868 | 869 | 870 | 871 | 872 | 873 | 874 | 492 875 | 876 | 877 | 878 | 879 | 494 880 | 881 | 882 | 883 | 884 | 371 885 | 886 | 887 | 888 | 889 | 890 | 891 | 892 | 372 893 | 894 | 895 | 896 | 897 | 898 | 899 | 900 | 901 | 902 | 903 | 904 | 905 | 906 | 907 | 908 | 909 | 557 910 | 911 | 912 | 913 | 914 | 555 915 | 916 | 917 | 918 | 919 | 920 | 921 | 922 | 556 923 | 924 | 925 | 926 | 927 | 539 928 | 929 | 930 | 931 | 932 | 933 | 934 | 935 | 540 936 | 937 | 938 | 939 | 940 | 535 941 | 942 | 943 | 944 | 945 | 946 | 947 | 948 | 536 949 | 950 | 951 | 952 | 953 | 543 954 | 955 | 956 | 957 | 958 | 959 | 960 | 961 | 544 962 | 963 | 964 | 965 | 966 | 533 967 | 968 | 969 | 970 | 971 | 972 | 973 | 974 | 534 975 | 976 | 977 | 978 | 979 | 563 980 | 981 | 982 | 983 | 984 | 985 | 986 | 987 | 564 988 | 989 | 990 | 991 | 992 | 993 | 994 | 995 | 565 996 | 997 | 998 | 999 | 1000 | 566 1001 | 1002 | 1003 | 1004 | 1005 | 572 1006 | 1007 | 1008 | 1009 | 1010 | 1011 | 1012 | 1013 | 573 1014 | 1015 | 1016 | 1017 | 1018 | 574 1019 | 1020 | 1021 | 1022 | 1023 | 1024 | 1025 | 1026 | 575 1027 | 1028 | 1029 | 1030 | 1031 | 1032 | 1033 | com.apple.InterfaceBuilder.CocoaPlugin 1034 | com.apple.InterfaceBuilder.CocoaPlugin 1035 | com.apple.InterfaceBuilder.CocoaPlugin 1036 | com.apple.InterfaceBuilder.CocoaPlugin 1037 | com.apple.InterfaceBuilder.CocoaPlugin 1038 | com.apple.InterfaceBuilder.CocoaPlugin 1039 | com.apple.InterfaceBuilder.CocoaPlugin 1040 | com.apple.InterfaceBuilder.CocoaPlugin 1041 | com.apple.InterfaceBuilder.CocoaPlugin 1042 | com.apple.InterfaceBuilder.CocoaPlugin 1043 | com.apple.InterfaceBuilder.CocoaPlugin 1044 | com.apple.InterfaceBuilder.CocoaPlugin 1045 | com.apple.InterfaceBuilder.CocoaPlugin 1046 | com.apple.InterfaceBuilder.CocoaPlugin 1047 | com.apple.InterfaceBuilder.CocoaPlugin 1048 | 1049 | 1050 | com.apple.InterfaceBuilder.CocoaPlugin 1051 | {{380, 496}, {480, 360}} 1052 | 1053 | com.apple.InterfaceBuilder.CocoaPlugin 1054 | com.apple.InterfaceBuilder.CocoaPlugin 1055 | com.apple.InterfaceBuilder.CocoaPlugin 1056 | com.apple.InterfaceBuilder.CocoaPlugin 1057 | com.apple.InterfaceBuilder.CocoaPlugin 1058 | com.apple.InterfaceBuilder.CocoaPlugin 1059 | IRTextFieldDrag 1060 | com.apple.InterfaceBuilder.CocoaPlugin 1061 | com.apple.InterfaceBuilder.CocoaPlugin 1062 | com.apple.InterfaceBuilder.CocoaPlugin 1063 | com.apple.InterfaceBuilder.CocoaPlugin 1064 | com.apple.InterfaceBuilder.CocoaPlugin 1065 | com.apple.InterfaceBuilder.CocoaPlugin 1066 | IRTextFieldDrag 1067 | com.apple.InterfaceBuilder.CocoaPlugin 1068 | com.apple.InterfaceBuilder.CocoaPlugin 1069 | com.apple.InterfaceBuilder.CocoaPlugin 1070 | com.apple.InterfaceBuilder.CocoaPlugin 1071 | com.apple.InterfaceBuilder.CocoaPlugin 1072 | com.apple.InterfaceBuilder.CocoaPlugin 1073 | IRTextFieldDrag 1074 | com.apple.InterfaceBuilder.CocoaPlugin 1075 | com.apple.InterfaceBuilder.CocoaPlugin 1076 | com.apple.InterfaceBuilder.CocoaPlugin 1077 | com.apple.InterfaceBuilder.CocoaPlugin 1078 | com.apple.InterfaceBuilder.CocoaPlugin 1079 | IRTextFieldDrag 1080 | com.apple.InterfaceBuilder.CocoaPlugin 1081 | com.apple.InterfaceBuilder.CocoaPlugin 1082 | com.apple.InterfaceBuilder.CocoaPlugin 1083 | com.apple.InterfaceBuilder.CocoaPlugin 1084 | com.apple.InterfaceBuilder.CocoaPlugin 1085 | 1086 | 1087 | 1088 | 1089 | 1090 | 589 1091 | 1092 | 1093 | 1094 | 1095 | IRTextFieldDrag 1096 | NSTextField 1097 | 1098 | IBProjectSource 1099 | ./Classes/IRTextFieldDrag.h 1100 | 1101 | 1102 | 1103 | iReSignAppDelegate 1104 | NSObject 1105 | 1106 | id 1107 | id 1108 | id 1109 | id 1110 | id 1111 | 1112 | 1113 | 1114 | browse: 1115 | id 1116 | 1117 | 1118 | changeBundleIDPressed: 1119 | id 1120 | 1121 | 1122 | provisioningBrowse: 1123 | id 1124 | 1125 | 1126 | resign: 1127 | id 1128 | 1129 | 1130 | showHelp: 1131 | id 1132 | 1133 | 1134 | 1135 | NSButton 1136 | IRTextFieldDrag 1137 | IRTextFieldDrag 1138 | NSButton 1139 | NSProgressIndicator 1140 | IRTextFieldDrag 1141 | NSButton 1142 | IRTextFieldDrag 1143 | NSButton 1144 | NSTextField 1145 | NSWindow 1146 | 1147 | 1148 | 1149 | browseButton 1150 | NSButton 1151 | 1152 | 1153 | bundleIDField 1154 | IRTextFieldDrag 1155 | 1156 | 1157 | certField 1158 | IRTextFieldDrag 1159 | 1160 | 1161 | changeBundleIDCheckbox 1162 | NSButton 1163 | 1164 | 1165 | flurry 1166 | NSProgressIndicator 1167 | 1168 | 1169 | pathField 1170 | IRTextFieldDrag 1171 | 1172 | 1173 | provisioningBrowseButton 1174 | NSButton 1175 | 1176 | 1177 | provisioningPathField 1178 | IRTextFieldDrag 1179 | 1180 | 1181 | resignButton 1182 | NSButton 1183 | 1184 | 1185 | statusLabel 1186 | NSTextField 1187 | 1188 | 1189 | window 1190 | NSWindow 1191 | 1192 | 1193 | 1194 | IBProjectSource 1195 | ./Classes/iReSignAppDelegate.h 1196 | 1197 | 1198 | 1199 | 1200 | 0 1201 | IBCocoaFramework 1202 | 1203 | com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 1204 | 1205 | 1206 | YES 1207 | 3 1208 | 1209 | {11, 11} 1210 | {10, 3} 1211 | {15, 15} 1212 | 1213 | 1214 | 1215 | -------------------------------------------------------------------------------- /iReSign/iReSign.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 4C8EAD45185B74B90095DC6B /* IRHelpWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C8EAD44185B74B90095DC6B /* IRHelpWindow.m */; }; 11 | 5B9E4C4C166AB3F7006D9F8F /* IRTextFieldDrag.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B9E4C4B166AB3F7006D9F8F /* IRTextFieldDrag.m */; }; 12 | C115EE2B13815024003B9ACC /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C115EE2A13815024003B9ACC /* Cocoa.framework */; }; 13 | C115EE3513815024003B9ACC /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = C115EE3313815024003B9ACC /* InfoPlist.strings */; }; 14 | C115EE3813815024003B9ACC /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C115EE3713815024003B9ACC /* main.m */; }; 15 | C115EE3E13815024003B9ACC /* iReSignAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = C115EE3D13815024003B9ACC /* iReSignAppDelegate.m */; }; 16 | C115EE4113815024003B9ACC /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = C115EE3F13815024003B9ACC /* MainMenu.xib */; }; 17 | C142471F138174E500F5B51F /* ResourceRules.plist in Resources */ = {isa = PBXBuildFile; fileRef = C142471E138174E500F5B51F /* ResourceRules.plist */; }; 18 | C14247301381B75B00F5B51F /* Icon.icns in Resources */ = {isa = PBXBuildFile; fileRef = C142472F1381B75B00F5B51F /* Icon.icns */; }; 19 | /* End PBXBuildFile section */ 20 | 21 | /* Begin PBXFileReference section */ 22 | 4C8EAD43185B74B90095DC6B /* IRHelpWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IRHelpWindow.h; sourceTree = ""; }; 23 | 4C8EAD44185B74B90095DC6B /* IRHelpWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IRHelpWindow.m; sourceTree = ""; }; 24 | 5B9E4C4A166AB3F7006D9F8F /* IRTextFieldDrag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IRTextFieldDrag.h; sourceTree = ""; }; 25 | 5B9E4C4B166AB3F7006D9F8F /* IRTextFieldDrag.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IRTextFieldDrag.m; sourceTree = ""; }; 26 | C115EE2613815024003B9ACC /* iReSign.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iReSign.app; sourceTree = BUILT_PRODUCTS_DIR; }; 27 | C115EE2A13815024003B9ACC /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 28 | C115EE2D13815024003B9ACC /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; 29 | C115EE2E13815024003B9ACC /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; 30 | C115EE2F13815024003B9ACC /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 31 | C115EE3213815024003B9ACC /* iReSign-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "iReSign-Info.plist"; sourceTree = ""; }; 32 | C115EE3413815024003B9ACC /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 33 | C115EE3613815024003B9ACC /* iReSign-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "iReSign-Prefix.pch"; sourceTree = ""; }; 34 | C115EE3713815024003B9ACC /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 35 | C115EE3C13815024003B9ACC /* iReSignAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = iReSignAppDelegate.h; sourceTree = ""; }; 36 | C115EE3D13815024003B9ACC /* iReSignAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = iReSignAppDelegate.m; sourceTree = ""; }; 37 | C115EE4013815024003B9ACC /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = ""; }; 38 | C142471E138174E500F5B51F /* ResourceRules.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = ResourceRules.plist; sourceTree = ""; }; 39 | C142472F1381B75B00F5B51F /* Icon.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = Icon.icns; path = ../Icon.icns; sourceTree = ""; }; 40 | DF1BF30B18D76F3800AF6E6F /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "zh-Hans"; path = "zh-Hans.lproj/MainMenu.xib"; sourceTree = ""; }; 41 | DF1BF30C18D76F3800AF6E6F /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/InfoPlist.strings"; sourceTree = ""; }; 42 | /* End PBXFileReference section */ 43 | 44 | /* Begin PBXFrameworksBuildPhase section */ 45 | C115EE2313815024003B9ACC /* Frameworks */ = { 46 | isa = PBXFrameworksBuildPhase; 47 | buildActionMask = 2147483647; 48 | files = ( 49 | C115EE2B13815024003B9ACC /* Cocoa.framework in Frameworks */, 50 | ); 51 | runOnlyForDeploymentPostprocessing = 0; 52 | }; 53 | /* End PBXFrameworksBuildPhase section */ 54 | 55 | /* Begin PBXGroup section */ 56 | C115EE1B13815023003B9ACC = { 57 | isa = PBXGroup; 58 | children = ( 59 | C115EE3013815024003B9ACC /* iReSign */, 60 | C115EE2913815024003B9ACC /* Frameworks */, 61 | C115EE2713815024003B9ACC /* Products */, 62 | ); 63 | sourceTree = ""; 64 | }; 65 | C115EE2713815024003B9ACC /* Products */ = { 66 | isa = PBXGroup; 67 | children = ( 68 | C115EE2613815024003B9ACC /* iReSign.app */, 69 | ); 70 | name = Products; 71 | sourceTree = ""; 72 | }; 73 | C115EE2913815024003B9ACC /* Frameworks */ = { 74 | isa = PBXGroup; 75 | children = ( 76 | C115EE2A13815024003B9ACC /* Cocoa.framework */, 77 | C115EE2C13815024003B9ACC /* Other Frameworks */, 78 | ); 79 | name = Frameworks; 80 | sourceTree = ""; 81 | }; 82 | C115EE2C13815024003B9ACC /* Other Frameworks */ = { 83 | isa = PBXGroup; 84 | children = ( 85 | C115EE2D13815024003B9ACC /* AppKit.framework */, 86 | C115EE2E13815024003B9ACC /* CoreData.framework */, 87 | C115EE2F13815024003B9ACC /* Foundation.framework */, 88 | ); 89 | name = "Other Frameworks"; 90 | sourceTree = ""; 91 | }; 92 | C115EE3013815024003B9ACC /* iReSign */ = { 93 | isa = PBXGroup; 94 | children = ( 95 | C115EE3C13815024003B9ACC /* iReSignAppDelegate.h */, 96 | C115EE3D13815024003B9ACC /* iReSignAppDelegate.m */, 97 | C115EE3F13815024003B9ACC /* MainMenu.xib */, 98 | 5B9E4C4A166AB3F7006D9F8F /* IRTextFieldDrag.h */, 99 | 5B9E4C4B166AB3F7006D9F8F /* IRTextFieldDrag.m */, 100 | 4C8EAD43185B74B90095DC6B /* IRHelpWindow.h */, 101 | 4C8EAD44185B74B90095DC6B /* IRHelpWindow.m */, 102 | C115EE3113815024003B9ACC /* Supporting Files */, 103 | ); 104 | path = iReSign; 105 | sourceTree = ""; 106 | }; 107 | C115EE3113815024003B9ACC /* Supporting Files */ = { 108 | isa = PBXGroup; 109 | children = ( 110 | C142472F1381B75B00F5B51F /* Icon.icns */, 111 | C142471E138174E500F5B51F /* ResourceRules.plist */, 112 | C115EE3213815024003B9ACC /* iReSign-Info.plist */, 113 | C115EE3313815024003B9ACC /* InfoPlist.strings */, 114 | C115EE3613815024003B9ACC /* iReSign-Prefix.pch */, 115 | C115EE3713815024003B9ACC /* main.m */, 116 | ); 117 | name = "Supporting Files"; 118 | sourceTree = ""; 119 | }; 120 | /* End PBXGroup section */ 121 | 122 | /* Begin PBXNativeTarget section */ 123 | C115EE2513815024003B9ACC /* iReSign */ = { 124 | isa = PBXNativeTarget; 125 | buildConfigurationList = C115EE4413815024003B9ACC /* Build configuration list for PBXNativeTarget "iReSign" */; 126 | buildPhases = ( 127 | C115EE2213815024003B9ACC /* Sources */, 128 | C115EE2313815024003B9ACC /* Frameworks */, 129 | C115EE2413815024003B9ACC /* Resources */, 130 | ); 131 | buildRules = ( 132 | ); 133 | dependencies = ( 134 | ); 135 | name = iReSign; 136 | productName = iReSign; 137 | productReference = C115EE2613815024003B9ACC /* iReSign.app */; 138 | productType = "com.apple.product-type.application"; 139 | }; 140 | /* End PBXNativeTarget section */ 141 | 142 | /* Begin PBXProject section */ 143 | C115EE1D13815023003B9ACC /* Project object */ = { 144 | isa = PBXProject; 145 | attributes = { 146 | LastUpgradeCheck = 0500; 147 | ORGANIZATIONNAME = nil; 148 | }; 149 | buildConfigurationList = C115EE2013815023003B9ACC /* Build configuration list for PBXProject "iReSign" */; 150 | compatibilityVersion = "Xcode 3.2"; 151 | developmentRegion = English; 152 | hasScannedForEncodings = 0; 153 | knownRegions = ( 154 | en, 155 | "zh-Hans", 156 | ); 157 | mainGroup = C115EE1B13815023003B9ACC; 158 | productRefGroup = C115EE2713815024003B9ACC /* Products */; 159 | projectDirPath = ""; 160 | projectRoot = ""; 161 | targets = ( 162 | C115EE2513815024003B9ACC /* iReSign */, 163 | ); 164 | }; 165 | /* End PBXProject section */ 166 | 167 | /* Begin PBXResourcesBuildPhase section */ 168 | C115EE2413815024003B9ACC /* Resources */ = { 169 | isa = PBXResourcesBuildPhase; 170 | buildActionMask = 2147483647; 171 | files = ( 172 | C115EE3513815024003B9ACC /* InfoPlist.strings in Resources */, 173 | C115EE4113815024003B9ACC /* MainMenu.xib in Resources */, 174 | C142471F138174E500F5B51F /* ResourceRules.plist in Resources */, 175 | C14247301381B75B00F5B51F /* Icon.icns in Resources */, 176 | ); 177 | runOnlyForDeploymentPostprocessing = 0; 178 | }; 179 | /* End PBXResourcesBuildPhase section */ 180 | 181 | /* Begin PBXSourcesBuildPhase section */ 182 | C115EE2213815024003B9ACC /* Sources */ = { 183 | isa = PBXSourcesBuildPhase; 184 | buildActionMask = 2147483647; 185 | files = ( 186 | C115EE3813815024003B9ACC /* main.m in Sources */, 187 | 4C8EAD45185B74B90095DC6B /* IRHelpWindow.m in Sources */, 188 | C115EE3E13815024003B9ACC /* iReSignAppDelegate.m in Sources */, 189 | 5B9E4C4C166AB3F7006D9F8F /* IRTextFieldDrag.m in Sources */, 190 | ); 191 | runOnlyForDeploymentPostprocessing = 0; 192 | }; 193 | /* End PBXSourcesBuildPhase section */ 194 | 195 | /* Begin PBXVariantGroup section */ 196 | C115EE3313815024003B9ACC /* InfoPlist.strings */ = { 197 | isa = PBXVariantGroup; 198 | children = ( 199 | C115EE3413815024003B9ACC /* en */, 200 | DF1BF30C18D76F3800AF6E6F /* zh-Hans */, 201 | ); 202 | name = InfoPlist.strings; 203 | sourceTree = ""; 204 | }; 205 | C115EE3F13815024003B9ACC /* MainMenu.xib */ = { 206 | isa = PBXVariantGroup; 207 | children = ( 208 | C115EE4013815024003B9ACC /* en */, 209 | DF1BF30B18D76F3800AF6E6F /* zh-Hans */, 210 | ); 211 | name = MainMenu.xib; 212 | sourceTree = ""; 213 | }; 214 | /* End PBXVariantGroup section */ 215 | 216 | /* Begin XCBuildConfiguration section */ 217 | C115EE4213815024003B9ACC /* Debug */ = { 218 | isa = XCBuildConfiguration; 219 | buildSettings = { 220 | CLANG_WARN_BOOL_CONVERSION = YES; 221 | CLANG_WARN_CONSTANT_CONVERSION = YES; 222 | CLANG_WARN_EMPTY_BODY = YES; 223 | CLANG_WARN_ENUM_CONVERSION = YES; 224 | CLANG_WARN_INT_CONVERSION = YES; 225 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 226 | GCC_C_LANGUAGE_STANDARD = gnu99; 227 | GCC_OPTIMIZATION_LEVEL = 0; 228 | GCC_PREPROCESSOR_DEFINITIONS = DEBUG; 229 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 230 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0; 231 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 232 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 233 | GCC_WARN_UNDECLARED_SELECTOR = YES; 234 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 235 | GCC_WARN_UNUSED_FUNCTION = YES; 236 | GCC_WARN_UNUSED_VARIABLE = YES; 237 | MACOSX_DEPLOYMENT_TARGET = 10.6; 238 | ONLY_ACTIVE_ARCH = YES; 239 | SDKROOT = macosx; 240 | }; 241 | name = Debug; 242 | }; 243 | C115EE4313815024003B9ACC /* Release */ = { 244 | isa = XCBuildConfiguration; 245 | buildSettings = { 246 | CLANG_WARN_BOOL_CONVERSION = YES; 247 | CLANG_WARN_CONSTANT_CONVERSION = YES; 248 | CLANG_WARN_EMPTY_BODY = YES; 249 | CLANG_WARN_ENUM_CONVERSION = YES; 250 | CLANG_WARN_INT_CONVERSION = YES; 251 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 252 | GCC_C_LANGUAGE_STANDARD = gnu99; 253 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0; 254 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 255 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 256 | GCC_WARN_UNDECLARED_SELECTOR = YES; 257 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 258 | GCC_WARN_UNUSED_FUNCTION = YES; 259 | GCC_WARN_UNUSED_VARIABLE = YES; 260 | MACOSX_DEPLOYMENT_TARGET = 10.6; 261 | ONLY_ACTIVE_ARCH = NO; 262 | SDKROOT = macosx; 263 | }; 264 | name = Release; 265 | }; 266 | C115EE4513815024003B9ACC /* Debug */ = { 267 | isa = XCBuildConfiguration; 268 | buildSettings = { 269 | ALWAYS_SEARCH_USER_PATHS = NO; 270 | CLANG_ENABLE_OBJC_ARC = YES; 271 | COMBINE_HIDPI_IMAGES = YES; 272 | COPY_PHASE_STRIP = NO; 273 | GCC_DYNAMIC_NO_PIC = NO; 274 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 275 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 276 | GCC_PREFIX_HEADER = "iReSign/iReSign-Prefix.pch"; 277 | INFOPLIST_FILE = "iReSign/iReSign-Info.plist"; 278 | MACOSX_DEPLOYMENT_TARGET = 10.6.8; 279 | PRODUCT_NAME = "$(TARGET_NAME)"; 280 | WRAPPER_EXTENSION = app; 281 | }; 282 | name = Debug; 283 | }; 284 | C115EE4613815024003B9ACC /* Release */ = { 285 | isa = XCBuildConfiguration; 286 | buildSettings = { 287 | ALWAYS_SEARCH_USER_PATHS = NO; 288 | CLANG_ENABLE_OBJC_ARC = YES; 289 | COMBINE_HIDPI_IMAGES = YES; 290 | COPY_PHASE_STRIP = YES; 291 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 292 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 293 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 294 | GCC_PREFIX_HEADER = "iReSign/iReSign-Prefix.pch"; 295 | INFOPLIST_FILE = "iReSign/iReSign-Info.plist"; 296 | MACOSX_DEPLOYMENT_TARGET = 10.6.8; 297 | PRODUCT_NAME = "$(TARGET_NAME)"; 298 | WRAPPER_EXTENSION = app; 299 | }; 300 | name = Release; 301 | }; 302 | /* End XCBuildConfiguration section */ 303 | 304 | /* Begin XCConfigurationList section */ 305 | C115EE2013815023003B9ACC /* Build configuration list for PBXProject "iReSign" */ = { 306 | isa = XCConfigurationList; 307 | buildConfigurations = ( 308 | C115EE4213815024003B9ACC /* Debug */, 309 | C115EE4313815024003B9ACC /* Release */, 310 | ); 311 | defaultConfigurationIsVisible = 0; 312 | defaultConfigurationName = Release; 313 | }; 314 | C115EE4413815024003B9ACC /* Build configuration list for PBXNativeTarget "iReSign" */ = { 315 | isa = XCConfigurationList; 316 | buildConfigurations = ( 317 | C115EE4513815024003B9ACC /* Debug */, 318 | C115EE4613815024003B9ACC /* Release */, 319 | ); 320 | defaultConfigurationIsVisible = 0; 321 | defaultConfigurationName = Release; 322 | }; 323 | /* End XCConfigurationList section */ 324 | }; 325 | rootObject = C115EE1D13815023003B9ACC /* Project object */; 326 | } 327 | -------------------------------------------------------------------------------- /iReSign/iReSign.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /iReSign/iReSign.xcodeproj/project.xcworkspace/xcshareddata/iReSign.xccheckout: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDESourceControlProjectFavoriteDictionaryKey 6 | 7 | IDESourceControlProjectIdentifier 8 | 55C76783-2CEC-4A8B-BA32-DF9DAB6B90C5 9 | IDESourceControlProjectName 10 | iReSign 11 | IDESourceControlProjectOriginsDictionary 12 | 13 | 43280492CE74ADAC7B7AD1393F0FB52CA2FE257C 14 | github.com:maciekish/iReSign.git 15 | 16 | IDESourceControlProjectPath 17 | iReSign/iReSign.xcodeproj 18 | IDESourceControlProjectRelativeInstallPathDictionary 19 | 20 | 43280492CE74ADAC7B7AD1393F0FB52CA2FE257C 21 | ../../.. 22 | 23 | IDESourceControlProjectURL 24 | github.com:maciekish/iReSign.git 25 | IDESourceControlProjectVersion 26 | 111 27 | IDESourceControlProjectWCCIdentifier 28 | 43280492CE74ADAC7B7AD1393F0FB52CA2FE257C 29 | IDESourceControlProjectWCConfigurations 30 | 31 | 32 | IDESourceControlRepositoryExtensionIdentifierKey 33 | public.vcs.git 34 | IDESourceControlWCCIdentifierKey 35 | 43280492CE74ADAC7B7AD1393F0FB52CA2FE257C 36 | IDESourceControlWCCName 37 | iReSign 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /iReSign/iReSign.xcodeproj/project.xcworkspace/xcuserdata/kramer.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maciekish/iReSign/df764ae3a57ed19a17eba293d876cdcd588921bf/iReSign/iReSign.xcodeproj/project.xcworkspace/xcuserdata/kramer.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /iReSign/iReSign.xcodeproj/project.xcworkspace/xcuserdata/kramer.xcuserdatad/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges 6 | 7 | SnapshotAutomaticallyBeforeSignificantChanges 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /iReSign/iReSign.xcodeproj/xcuserdata/kramer.xcuserdatad/xcschemes/iReSign.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 51 | 52 | 58 | 59 | 60 | 61 | 62 | 63 | 69 | 70 | 76 | 77 | 78 | 79 | 81 | 82 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /iReSign/iReSign.xcodeproj/xcuserdata/kramer.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | iReSign.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | C115EE2513815024003B9ACC 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /iReSign/iReSign/IRHelpWindow.h: -------------------------------------------------------------------------------- 1 | // 2 | // IRHelpWindow.h 3 | // iReSign 4 | // 5 | // Created by Kramer on 12/13/13. 6 | // Copyright (c) 2013 nil. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface IRHelpWindow : NSWindow 12 | 13 | // Close the window 14 | - (IBAction)closeOK:(id)sender; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /iReSign/iReSign/IRHelpWindow.m: -------------------------------------------------------------------------------- 1 | // 2 | // IRHelpWindow.m 3 | // iReSign 4 | // 5 | // Created by Shmoopi on 12/13/13. 6 | // Copyright (c) 2013 nil. All rights reserved. 7 | // 8 | 9 | #import "IRHelpWindow.h" 10 | 11 | @implementation IRHelpWindow 12 | 13 | // Move the window by dragging 14 | - (BOOL)isMovableByWindowBackground { 15 | return YES; 16 | } 17 | 18 | // Close the window 19 | - (IBAction)closeOK:(id)sender { 20 | [self close]; 21 | } 22 | 23 | @end 24 | -------------------------------------------------------------------------------- /iReSign/iReSign/IRTextFieldDrag.h: -------------------------------------------------------------------------------- 1 | // 2 | // IRTextFieldDrag.h 3 | // iReSign 4 | // 5 | // Created by Esteban Bouza on 01/12/12. 6 | // 7 | 8 | #import 9 | 10 | @interface IRTextFieldDrag : NSTextField 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /iReSign/iReSign/IRTextFieldDrag.m: -------------------------------------------------------------------------------- 1 | // 2 | // IRTextFieldDrag.m 3 | // iReSign 4 | // 5 | // Created by Esteban Bouza on 01/12/12. 6 | // 7 | 8 | #import "IRTextFieldDrag.h" 9 | 10 | @implementation IRTextFieldDrag 11 | 12 | - (void)awakeFromNib { 13 | [self registerForDraggedTypes:@[NSFilenamesPboardType]]; 14 | } 15 | 16 | - (BOOL)performDragOperation:(id )sender 17 | { 18 | NSPasteboard *pboard = [sender draggingPasteboard]; 19 | 20 | if ( [[pboard types] containsObject:NSURLPboardType] ) { 21 | NSArray *files = [pboard propertyListForType:NSFilenamesPboardType]; 22 | if (files.count <= 0) { 23 | return NO; 24 | } 25 | self.stringValue = [files objectAtIndex:0]; 26 | 27 | } 28 | return YES; 29 | } 30 | 31 | 32 | // Source: http://www.cocoabuilder.com/archive/cocoa/11014-dnd-for-nstextfields-drag-drop.html 33 | - (NSDragOperation)draggingEntered:(id )sender { 34 | 35 | if (!self.isEnabled) return NSDragOperationNone; 36 | 37 | NSPasteboard *pboard; 38 | NSDragOperation sourceDragMask; 39 | 40 | sourceDragMask = [sender draggingSourceOperationMask]; 41 | pboard = [sender draggingPasteboard]; 42 | 43 | if ( [[pboard types] containsObject:NSColorPboardType] ) { 44 | if (sourceDragMask & NSDragOperationCopy) { 45 | return NSDragOperationCopy; 46 | } 47 | } 48 | if ( [[pboard types] containsObject:NSFilenamesPboardType] ) { 49 | if (sourceDragMask & NSDragOperationCopy) { 50 | return NSDragOperationCopy; 51 | } 52 | } 53 | 54 | return NSDragOperationNone; 55 | } 56 | 57 | 58 | @end 59 | -------------------------------------------------------------------------------- /iReSign/iReSign/ResourceRules.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | rules 6 | 7 | .* 8 | 9 | Info.plist 10 | 11 | omit 12 | 13 | weight 14 | 10 15 | 16 | ResourceRules.plist 17 | 18 | omit 19 | 20 | weight 21 | 100 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /iReSign/iReSign/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /iReSign/iReSign/en.lproj/MainMenu.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 146 | 158 | 169 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | iReSign allows you to re-sign any unencrypted ipa-file with any certificate for which you hold the corresponding private key. 274 | 275 | 1. Drag your unsigned .ipa file to the top box, or use the browse button. 276 | 277 | 2. Enter your full certificate name from Keychain Access, for example "iPhone Developer: Firstname Lastname (XXXXXXXXXX)" in the bottom box. 278 | 279 | 3. Click ReSign! and wait. The resigned file will be saved in the same folder as the original file. 280 | 281 | 282 | 283 | 284 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | -------------------------------------------------------------------------------- /iReSign/iReSign/iReSign-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIconFile 10 | Icon.icns 11 | CFBundleIdentifier 12 | com.appulize.${PRODUCT_NAME:rfc1034identifier} 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.4 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1.0 25 | LSApplicationCategoryType 26 | public.app-category.developer-tools 27 | LSMinimumSystemVersion 28 | ${MACOSX_DEPLOYMENT_TARGET} 29 | NSMainNibFile 30 | MainMenu 31 | NSPrincipalClass 32 | NSApplication 33 | 34 | 35 | -------------------------------------------------------------------------------- /iReSign/iReSign/iReSign-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'iReSign' target in the 'iReSign' project 3 | // 4 | 5 | #ifdef __OBJC__ 6 | #import 7 | #endif 8 | -------------------------------------------------------------------------------- /iReSign/iReSign/iReSignAppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // iReSignAppDelegate.h 3 | // iReSign 4 | // 5 | // Created by Maciej Swic on 2011-05-16. 6 | // Copyright (c) 2011 Maciej Swic, Licensed under the MIT License. 7 | // See README.md for details 8 | // 9 | 10 | #import 11 | #import "IRTextFieldDrag.h" 12 | 13 | @interface iReSignAppDelegate : NSObject { 14 | @private 15 | NSWindow *__unsafe_unretained window; 16 | 17 | NSUserDefaults *defaults; 18 | 19 | NSTask *unzipTask; 20 | NSTask *copyTask; 21 | NSTask *provisioningTask; 22 | NSTask *codesignTask; 23 | NSTask *generateEntitlementsTask; 24 | NSTask *verifyTask; 25 | NSTask *zipTask; 26 | NSString *sourcePath; 27 | NSString *appPath; 28 | NSString *frameworksDirPath; 29 | NSString *frameworkPath; 30 | NSString *workingPath; 31 | NSString *appName; 32 | NSString *fileName; 33 | 34 | NSString *entitlementsResult; 35 | NSString *codesigningResult; 36 | NSString *verificationResult; 37 | 38 | NSMutableArray *frameworks; 39 | Boolean hasFrameworks; 40 | 41 | IBOutlet IRTextFieldDrag *pathField; 42 | IBOutlet IRTextFieldDrag *provisioningPathField; 43 | IBOutlet IRTextFieldDrag *entitlementField; 44 | IBOutlet IRTextFieldDrag *bundleIDField; 45 | IBOutlet NSButton *browseButton; 46 | IBOutlet NSButton *provisioningBrowseButton; 47 | IBOutlet NSButton *entitlementBrowseButton; 48 | IBOutlet NSButton *resignButton; 49 | IBOutlet NSTextField *statusLabel; 50 | IBOutlet NSProgressIndicator *flurry; 51 | IBOutlet NSButton *changeBundleIDCheckbox; 52 | 53 | IBOutlet NSComboBox *certComboBox; 54 | NSMutableArray *certComboBoxItems; 55 | NSTask *certTask; 56 | NSArray *getCertsResult; 57 | 58 | } 59 | 60 | @property (unsafe_unretained) IBOutlet NSWindow *window; 61 | 62 | @property (nonatomic, strong) NSString *workingPath; 63 | 64 | - (IBAction)resign:(id)sender; 65 | - (IBAction)browse:(id)sender; 66 | - (IBAction)provisioningBrowse:(id)sender; 67 | - (IBAction)entitlementBrowse:(id)sender; 68 | - (IBAction)changeBundleIDPressed:(id)sender; 69 | 70 | - (void)checkUnzip:(NSTimer *)timer; 71 | - (void)checkCopy:(NSTimer *)timer; 72 | - (void)doProvisioning; 73 | - (void)checkProvisioning:(NSTimer *)timer; 74 | - (void)doCodeSigning; 75 | - (void)checkCodesigning:(NSTimer *)timer; 76 | - (void)doVerifySignature; 77 | - (void)checkVerificationProcess:(NSTimer *)timer; 78 | - (void)doZip; 79 | - (void)checkZip:(NSTimer *)timer; 80 | - (void)disableControls; 81 | - (void)enableControls; 82 | 83 | @end 84 | -------------------------------------------------------------------------------- /iReSign/iReSign/iReSignAppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // iReSignAppDelegate.m 3 | // iReSign 4 | // 5 | // Created by Maciej Swic on 2011-05-16. 6 | // Copyright (c) 2011 Maciej Swic, Licensed under the MIT License. 7 | // See README.md for details 8 | // 9 | 10 | #import "iReSignAppDelegate.h" 11 | 12 | static NSString *kKeyPrefsBundleIDChange = @"keyBundleIDChange"; 13 | 14 | static NSString *kKeyBundleIDPlistApp = @"CFBundleIdentifier"; 15 | static NSString *kKeyBundleIDPlistiTunesArtwork = @"softwareVersionBundleId"; 16 | static NSString *kKeyInfoPlistApplicationProperties = @"ApplicationProperties"; 17 | static NSString *kKeyInfoPlistApplicationPath = @"ApplicationPath"; 18 | static NSString *kFrameworksDirName = @"Frameworks"; 19 | static NSString *kPayloadDirName = @"Payload"; 20 | static NSString *kProductsDirName = @"Products"; 21 | static NSString *kInfoPlistFilename = @"Info.plist"; 22 | static NSString *kiTunesMetadataFileName = @"iTunesMetadata"; 23 | 24 | @implementation iReSignAppDelegate 25 | 26 | @synthesize window,workingPath; 27 | 28 | - (void)applicationDidFinishLaunching:(NSNotification *)aNotification 29 | { 30 | [flurry setAlphaValue:0.5]; 31 | 32 | defaults = [NSUserDefaults standardUserDefaults]; 33 | 34 | // Look up available signing certificates 35 | [self getCerts]; 36 | 37 | if ([defaults valueForKey:@"ENTITLEMENT_PATH"]) 38 | [entitlementField setStringValue:[defaults valueForKey:@"ENTITLEMENT_PATH"]]; 39 | if ([defaults valueForKey:@"MOBILEPROVISION_PATH"]) 40 | [provisioningPathField setStringValue:[defaults valueForKey:@"MOBILEPROVISION_PATH"]]; 41 | 42 | if (![[NSFileManager defaultManager] fileExistsAtPath:@"/usr/bin/zip"]) { 43 | [self showAlertOfKind:NSCriticalAlertStyle WithTitle:@"Error" AndMessage:@"This app cannot run without the zip utility present at /usr/bin/zip"]; 44 | exit(0); 45 | } 46 | if (![[NSFileManager defaultManager] fileExistsAtPath:@"/usr/bin/unzip"]) { 47 | [self showAlertOfKind:NSCriticalAlertStyle WithTitle:@"Error" AndMessage:@"This app cannot run without the unzip utility present at /usr/bin/unzip"]; 48 | exit(0); 49 | } 50 | if (![[NSFileManager defaultManager] fileExistsAtPath:@"/usr/bin/codesign"]) { 51 | [self showAlertOfKind:NSCriticalAlertStyle WithTitle:@"Error" AndMessage:@"This app cannot run without the codesign utility present at /usr/bin/codesign"]; 52 | exit(0); 53 | } 54 | } 55 | 56 | 57 | - (IBAction)resign:(id)sender { 58 | //Save cert name 59 | [defaults setValue:[NSNumber numberWithInteger:[certComboBox indexOfSelectedItem]] forKey:@"CERT_INDEX"]; 60 | [defaults setValue:[entitlementField stringValue] forKey:@"ENTITLEMENT_PATH"]; 61 | [defaults setValue:[provisioningPathField stringValue] forKey:@"MOBILEPROVISION_PATH"]; 62 | [defaults setValue:[bundleIDField stringValue] forKey:kKeyPrefsBundleIDChange]; 63 | [defaults synchronize]; 64 | 65 | codesigningResult = nil; 66 | verificationResult = nil; 67 | 68 | sourcePath = [pathField stringValue]; 69 | workingPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"com.appulize.iresign"]; 70 | 71 | if ([certComboBox objectValue]) { 72 | if (([[[sourcePath pathExtension] lowercaseString] isEqualToString:@"ipa"]) || 73 | ([[[sourcePath pathExtension] lowercaseString] isEqualToString:@"xcarchive"])) { 74 | [self disableControls]; 75 | 76 | NSLog(@"Setting up working directory in %@",workingPath); 77 | [statusLabel setHidden:NO]; 78 | [statusLabel setStringValue:@"Setting up working directory"]; 79 | 80 | [[NSFileManager defaultManager] removeItemAtPath:workingPath error:nil]; 81 | 82 | [[NSFileManager defaultManager] createDirectoryAtPath:workingPath withIntermediateDirectories:TRUE attributes:nil error:nil]; 83 | 84 | if ([[[sourcePath pathExtension] lowercaseString] isEqualToString:@"ipa"]) { 85 | if (sourcePath && [sourcePath length] > 0) { 86 | NSLog(@"Unzipping %@",sourcePath); 87 | [statusLabel setStringValue:@"Extracting original app"]; 88 | } 89 | 90 | unzipTask = [[NSTask alloc] init]; 91 | [unzipTask setLaunchPath:@"/usr/bin/unzip"]; 92 | [unzipTask setArguments:[NSArray arrayWithObjects:@"-q", sourcePath, @"-d", workingPath, nil]]; 93 | 94 | [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(checkUnzip:) userInfo:nil repeats:TRUE]; 95 | 96 | [unzipTask launch]; 97 | } 98 | else { 99 | NSString* payloadPath = [workingPath stringByAppendingPathComponent:kPayloadDirName]; 100 | 101 | NSLog(@"Setting up %@ path in %@", kPayloadDirName, payloadPath); 102 | [statusLabel setStringValue:[NSString stringWithFormat:@"Setting up %@ path", kPayloadDirName]]; 103 | 104 | [[NSFileManager defaultManager] createDirectoryAtPath:payloadPath withIntermediateDirectories:TRUE attributes:nil error:nil]; 105 | 106 | NSLog(@"Retrieving %@", kInfoPlistFilename); 107 | [statusLabel setStringValue:[NSString stringWithFormat:@"Retrieving %@", kInfoPlistFilename]]; 108 | 109 | NSString* infoPListPath = [sourcePath stringByAppendingPathComponent:kInfoPlistFilename]; 110 | 111 | NSDictionary* infoPListDict = [NSDictionary dictionaryWithContentsOfFile:infoPListPath]; 112 | 113 | if (infoPListDict != nil) { 114 | NSString* applicationPath = nil; 115 | 116 | NSDictionary* applicationPropertiesDict = [infoPListDict objectForKey:kKeyInfoPlistApplicationProperties]; 117 | 118 | if (applicationPropertiesDict != nil) { 119 | applicationPath = [applicationPropertiesDict objectForKey:kKeyInfoPlistApplicationPath]; 120 | } 121 | 122 | if (applicationPath != nil) { 123 | applicationPath = [[sourcePath stringByAppendingPathComponent:kProductsDirName] stringByAppendingPathComponent:applicationPath]; 124 | 125 | NSLog(@"Copying %@ to %@ path in %@", applicationPath, kPayloadDirName, payloadPath); 126 | [statusLabel setStringValue:[NSString stringWithFormat:@"Copying .xcarchive app to %@ path", kPayloadDirName]]; 127 | 128 | copyTask = [[NSTask alloc] init]; 129 | [copyTask setLaunchPath:@"/bin/cp"]; 130 | [copyTask setArguments:[NSArray arrayWithObjects:@"-r", applicationPath, payloadPath, nil]]; 131 | 132 | [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(checkCopy:) userInfo:nil repeats:TRUE]; 133 | 134 | [copyTask launch]; 135 | } 136 | else { 137 | [self showAlertOfKind:NSCriticalAlertStyle WithTitle:@"Error" AndMessage:[NSString stringWithFormat:@"Unable to parse %@", kInfoPlistFilename]]; 138 | [self enableControls]; 139 | [statusLabel setStringValue:@"Ready"]; 140 | } 141 | } 142 | else { 143 | [self showAlertOfKind:NSCriticalAlertStyle WithTitle:@"Error" AndMessage:[NSString stringWithFormat:@"Retrieve %@ failed", kInfoPlistFilename]]; 144 | [self enableControls]; 145 | [statusLabel setStringValue:@"Ready"]; 146 | } 147 | } 148 | } 149 | else { 150 | [self showAlertOfKind:NSCriticalAlertStyle WithTitle:@"Error" AndMessage:@"You must choose an *.ipa or *.xcarchive file"]; 151 | [self enableControls]; 152 | [statusLabel setStringValue:@"Please try again"]; 153 | } 154 | } else { 155 | [self showAlertOfKind:NSCriticalAlertStyle WithTitle:@"Error" AndMessage:@"You must choose an signing certificate from dropdown."]; 156 | [self enableControls]; 157 | [statusLabel setStringValue:@"Please try again"]; 158 | } 159 | } 160 | 161 | - (void)checkUnzip:(NSTimer *)timer { 162 | if ([unzipTask isRunning] == 0) { 163 | [timer invalidate]; 164 | unzipTask = nil; 165 | 166 | if ([[NSFileManager defaultManager] fileExistsAtPath:[workingPath stringByAppendingPathComponent:kPayloadDirName]]) { 167 | NSLog(@"Unzipping done"); 168 | [statusLabel setStringValue:@"Original app extracted"]; 169 | 170 | if (changeBundleIDCheckbox.state == NSOnState) { 171 | [self doBundleIDChange:bundleIDField.stringValue]; 172 | } 173 | 174 | if ([[provisioningPathField stringValue] isEqualTo:@""]) { 175 | [self doCodeSigning]; 176 | } else { 177 | [self doProvisioning]; 178 | } 179 | } else { 180 | [self showAlertOfKind:NSCriticalAlertStyle WithTitle:@"Error" AndMessage:@"Unzip failed"]; 181 | [self enableControls]; 182 | [statusLabel setStringValue:@"Ready"]; 183 | } 184 | } 185 | } 186 | 187 | - (void)checkCopy:(NSTimer *)timer { 188 | if ([copyTask isRunning] == 0) { 189 | [timer invalidate]; 190 | copyTask = nil; 191 | 192 | NSLog(@"Copy done"); 193 | [statusLabel setStringValue:@".xcarchive app copied"]; 194 | 195 | if (changeBundleIDCheckbox.state == NSOnState) { 196 | [self doBundleIDChange:bundleIDField.stringValue]; 197 | } 198 | 199 | if ([[provisioningPathField stringValue] isEqualTo:@""]) { 200 | [self doCodeSigning]; 201 | } else { 202 | [self doProvisioning]; 203 | } 204 | } 205 | } 206 | 207 | - (BOOL)doBundleIDChange:(NSString *)newBundleID { 208 | BOOL success = YES; 209 | 210 | success &= [self doAppBundleIDChange:newBundleID]; 211 | success &= [self doITunesMetadataBundleIDChange:newBundleID]; 212 | 213 | return success; 214 | } 215 | 216 | 217 | - (BOOL)doITunesMetadataBundleIDChange:(NSString *)newBundleID { 218 | NSArray *dirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:workingPath error:nil]; 219 | NSString *infoPlistPath = nil; 220 | 221 | for (NSString *file in dirContents) { 222 | if ([[[file pathExtension] lowercaseString] isEqualToString:@"plist"]) { 223 | infoPlistPath = [workingPath stringByAppendingPathComponent:file]; 224 | break; 225 | } 226 | } 227 | 228 | return [self changeBundleIDForFile:infoPlistPath bundleIDKey:kKeyBundleIDPlistiTunesArtwork newBundleID:newBundleID plistOutOptions:NSPropertyListXMLFormat_v1_0]; 229 | 230 | } 231 | 232 | - (BOOL)doAppBundleIDChange:(NSString *)newBundleID { 233 | NSArray *dirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[workingPath stringByAppendingPathComponent:kPayloadDirName] error:nil]; 234 | NSString *infoPlistPath = nil; 235 | 236 | for (NSString *file in dirContents) { 237 | if ([[[file pathExtension] lowercaseString] isEqualToString:@"app"]) { 238 | infoPlistPath = [[[workingPath stringByAppendingPathComponent:kPayloadDirName] 239 | stringByAppendingPathComponent:file] 240 | stringByAppendingPathComponent:kInfoPlistFilename]; 241 | break; 242 | } 243 | } 244 | 245 | return [self changeBundleIDForFile:infoPlistPath bundleIDKey:kKeyBundleIDPlistApp newBundleID:newBundleID plistOutOptions:NSPropertyListBinaryFormat_v1_0]; 246 | } 247 | 248 | - (BOOL)changeBundleIDForFile:(NSString *)filePath bundleIDKey:(NSString *)bundleIDKey newBundleID:(NSString *)newBundleID plistOutOptions:(NSPropertyListWriteOptions)options { 249 | 250 | NSMutableDictionary *plist = nil; 251 | 252 | if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) { 253 | plist = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath]; 254 | [plist setObject:newBundleID forKey:bundleIDKey]; 255 | 256 | NSData *xmlData = [NSPropertyListSerialization dataWithPropertyList:plist format:options options:kCFPropertyListImmutable error:nil]; 257 | 258 | return [xmlData writeToFile:filePath atomically:YES]; 259 | 260 | } 261 | 262 | return NO; 263 | } 264 | 265 | 266 | - (void)doProvisioning { 267 | NSArray *dirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[workingPath stringByAppendingPathComponent:kPayloadDirName] error:nil]; 268 | 269 | for (NSString *file in dirContents) { 270 | if ([[[file pathExtension] lowercaseString] isEqualToString:@"app"]) { 271 | appPath = [[workingPath stringByAppendingPathComponent:kPayloadDirName] stringByAppendingPathComponent:file]; 272 | if ([[NSFileManager defaultManager] fileExistsAtPath:[appPath stringByAppendingPathComponent:@"embedded.mobileprovision"]]) { 273 | NSLog(@"Found embedded.mobileprovision, deleting."); 274 | [[NSFileManager defaultManager] removeItemAtPath:[appPath stringByAppendingPathComponent:@"embedded.mobileprovision"] error:nil]; 275 | } 276 | break; 277 | } 278 | } 279 | 280 | NSString *targetPath = [appPath stringByAppendingPathComponent:@"embedded.mobileprovision"]; 281 | 282 | provisioningTask = [[NSTask alloc] init]; 283 | [provisioningTask setLaunchPath:@"/bin/cp"]; 284 | [provisioningTask setArguments:[NSArray arrayWithObjects:[provisioningPathField stringValue], targetPath, nil]]; 285 | 286 | [provisioningTask launch]; 287 | 288 | [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(checkProvisioning:) userInfo:nil repeats:TRUE]; 289 | } 290 | 291 | - (void)checkProvisioning:(NSTimer *)timer { 292 | if ([provisioningTask isRunning] == 0) { 293 | [timer invalidate]; 294 | provisioningTask = nil; 295 | 296 | NSArray *dirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[workingPath stringByAppendingPathComponent:kPayloadDirName] error:nil]; 297 | 298 | for (NSString *file in dirContents) { 299 | if ([[[file pathExtension] lowercaseString] isEqualToString:@"app"]) { 300 | appPath = [[workingPath stringByAppendingPathComponent:kPayloadDirName] stringByAppendingPathComponent:file]; 301 | if ([[NSFileManager defaultManager] fileExistsAtPath:[appPath stringByAppendingPathComponent:@"embedded.mobileprovision"]]) { 302 | 303 | BOOL identifierOK = FALSE; 304 | NSString *identifierInProvisioning = @""; 305 | 306 | NSString *embeddedProvisioning = [NSString stringWithContentsOfFile:[appPath stringByAppendingPathComponent:@"embedded.mobileprovision"] encoding:NSASCIIStringEncoding error:nil]; 307 | NSArray* embeddedProvisioningLines = [embeddedProvisioning componentsSeparatedByCharactersInSet: 308 | [NSCharacterSet newlineCharacterSet]]; 309 | 310 | for (int i = 0; i < [embeddedProvisioningLines count]; i++) { 311 | if ([[embeddedProvisioningLines objectAtIndex:i] rangeOfString:@"application-identifier"].location != NSNotFound) { 312 | 313 | NSInteger fromPosition = [[embeddedProvisioningLines objectAtIndex:i+1] rangeOfString:@""].location + 8; 314 | 315 | NSInteger toPosition = [[embeddedProvisioningLines objectAtIndex:i+1] rangeOfString:@""].location; 316 | 317 | NSRange range; 318 | range.location = fromPosition; 319 | range.length = toPosition-fromPosition; 320 | 321 | NSString *fullIdentifier = [[embeddedProvisioningLines objectAtIndex:i+1] substringWithRange:range]; 322 | 323 | NSArray *identifierComponents = [fullIdentifier componentsSeparatedByString:@"."]; 324 | 325 | if ([[identifierComponents lastObject] isEqualTo:@"*"]) { 326 | identifierOK = TRUE; 327 | } 328 | 329 | for (int i = 1; i < [identifierComponents count]; i++) { 330 | identifierInProvisioning = [identifierInProvisioning stringByAppendingString:[identifierComponents objectAtIndex:i]]; 331 | if (i < [identifierComponents count]-1) { 332 | identifierInProvisioning = [identifierInProvisioning stringByAppendingString:@"."]; 333 | } 334 | } 335 | break; 336 | } 337 | } 338 | 339 | NSLog(@"Mobileprovision identifier: %@",identifierInProvisioning); 340 | 341 | NSDictionary *infoplist = [NSDictionary dictionaryWithContentsOfFile:[appPath stringByAppendingPathComponent:@"Info.plist"]]; 342 | if ([identifierInProvisioning isEqualTo:[infoplist objectForKey:kKeyBundleIDPlistApp]]) { 343 | NSLog(@"Identifiers match"); 344 | identifierOK = TRUE; 345 | } 346 | 347 | if (identifierOK) { 348 | NSLog(@"Provisioning completed."); 349 | [statusLabel setStringValue:@"Provisioning completed"]; 350 | [self doEntitlementsFixing]; 351 | } else { 352 | [self showAlertOfKind:NSCriticalAlertStyle WithTitle:@"Error" AndMessage:@"Product identifiers don't match"]; 353 | [self enableControls]; 354 | [statusLabel setStringValue:@"Ready"]; 355 | } 356 | } else { 357 | [self showAlertOfKind:NSCriticalAlertStyle WithTitle:@"Error" AndMessage:@"Provisioning failed"]; 358 | [self enableControls]; 359 | [statusLabel setStringValue:@"Ready"]; 360 | } 361 | break; 362 | } 363 | } 364 | } 365 | } 366 | 367 | - (void)doEntitlementsFixing 368 | { 369 | if (![entitlementField.stringValue isEqualToString:@""] || [provisioningPathField.stringValue isEqualToString:@""]) { 370 | [self doCodeSigning]; 371 | return; // Using a pre-made entitlements file or we're not re-provisioning. 372 | } 373 | 374 | [statusLabel setStringValue:@"Generating entitlements"]; 375 | 376 | if (appPath) { 377 | generateEntitlementsTask = [[NSTask alloc] init]; 378 | [generateEntitlementsTask setLaunchPath:@"/usr/bin/security"]; 379 | [generateEntitlementsTask setArguments:@[@"cms", @"-D", @"-i", provisioningPathField.stringValue]]; 380 | [generateEntitlementsTask setCurrentDirectoryPath:workingPath]; 381 | 382 | [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(checkEntitlementsFix:) userInfo:nil repeats:TRUE]; 383 | 384 | NSPipe *pipe=[NSPipe pipe]; 385 | [generateEntitlementsTask setStandardOutput:pipe]; 386 | [generateEntitlementsTask setStandardError:pipe]; 387 | NSFileHandle *handle = [pipe fileHandleForReading]; 388 | 389 | [generateEntitlementsTask launch]; 390 | 391 | [NSThread detachNewThreadSelector:@selector(watchEntitlements:) 392 | toTarget:self withObject:handle]; 393 | } 394 | } 395 | 396 | - (void)watchEntitlements:(NSFileHandle*)streamHandle { 397 | @autoreleasepool { 398 | entitlementsResult = [[NSString alloc] initWithData:[streamHandle readDataToEndOfFile] encoding:NSASCIIStringEncoding]; 399 | } 400 | } 401 | 402 | - (void)checkEntitlementsFix:(NSTimer *)timer { 403 | if ([generateEntitlementsTask isRunning] == 0) { 404 | [timer invalidate]; 405 | generateEntitlementsTask = nil; 406 | NSLog(@"Entitlements fixed done"); 407 | [statusLabel setStringValue:@"Entitlements generated"]; 408 | [self doEntitlementsEdit]; 409 | } 410 | } 411 | 412 | - (void)doEntitlementsEdit 413 | { 414 | NSDictionary* entitlements = entitlementsResult.propertyList; 415 | entitlements = entitlements[@"Entitlements"]; 416 | NSString* filePath = [workingPath stringByAppendingPathComponent:@"entitlements.plist"]; 417 | NSData *xmlData = [NSPropertyListSerialization dataWithPropertyList:entitlements format:NSPropertyListXMLFormat_v1_0 options:kCFPropertyListImmutable error:nil]; 418 | if(![xmlData writeToFile:filePath atomically:YES]) { 419 | NSLog(@"Error writing entitlements file."); 420 | [self showAlertOfKind:NSCriticalAlertStyle WithTitle:@"Error" AndMessage:@"Failed entitlements generation"]; 421 | [self enableControls]; 422 | [statusLabel setStringValue:@"Ready"]; 423 | } 424 | else { 425 | entitlementField.stringValue = filePath; 426 | [self doCodeSigning]; 427 | } 428 | } 429 | 430 | - (void)doCodeSigning { 431 | appPath = nil; 432 | frameworksDirPath = nil; 433 | hasFrameworks = NO; 434 | frameworks = [[NSMutableArray alloc] init]; 435 | 436 | NSArray *dirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[workingPath stringByAppendingPathComponent:kPayloadDirName] error:nil]; 437 | 438 | for (NSString *file in dirContents) { 439 | if ([[[file pathExtension] lowercaseString] isEqualToString:@"app"]) { 440 | appPath = [[workingPath stringByAppendingPathComponent:kPayloadDirName] stringByAppendingPathComponent:file]; 441 | frameworksDirPath = [appPath stringByAppendingPathComponent:kFrameworksDirName]; 442 | NSLog(@"Found %@",appPath); 443 | appName = file; 444 | if ([[NSFileManager defaultManager] fileExistsAtPath:frameworksDirPath]) { 445 | NSLog(@"Found %@",frameworksDirPath); 446 | hasFrameworks = YES; 447 | NSArray *frameworksContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:frameworksDirPath error:nil]; 448 | for (NSString *frameworkFile in frameworksContents) { 449 | NSString *extension = [[frameworkFile pathExtension] lowercaseString]; 450 | if ([extension isEqualTo:@"framework"] || [extension isEqualTo:@"dylib"]) { 451 | frameworkPath = [frameworksDirPath stringByAppendingPathComponent:frameworkFile]; 452 | NSLog(@"Found %@",frameworkPath); 453 | [frameworks addObject:frameworkPath]; 454 | } 455 | } 456 | } 457 | [statusLabel setStringValue:[NSString stringWithFormat:@"Codesigning %@",file]]; 458 | break; 459 | } 460 | } 461 | 462 | if (appPath) { 463 | if (hasFrameworks) { 464 | [self signFile:[frameworks lastObject]]; 465 | [frameworks removeLastObject]; 466 | } else { 467 | [self signFile:appPath]; 468 | } 469 | } 470 | } 471 | 472 | - (void)signFile:(NSString*)filePath { 473 | NSLog(@"Codesigning %@", filePath); 474 | [statusLabel setStringValue:[NSString stringWithFormat:@"Codesigning %@",filePath]]; 475 | 476 | NSMutableArray *arguments = [NSMutableArray arrayWithObjects:@"-fs", [certComboBox objectValue], nil]; 477 | NSDictionary *systemVersionDictionary = [NSDictionary dictionaryWithContentsOfFile:@"/System/Library/CoreServices/SystemVersion.plist"]; 478 | NSString * systemVersion = [systemVersionDictionary objectForKey:@"ProductVersion"]; 479 | NSArray * version = [systemVersion componentsSeparatedByString:@"."]; 480 | if ([version[0] intValue]<10 || ([version[0] intValue]==10 && ([version[1] intValue]<9 || ([version[1] intValue]==9 && [version[2] intValue]<5)))) { 481 | 482 | /* 483 | Before OSX 10.9, code signing requires a version 1 signature. 484 | The resource envelope is necessary. 485 | To ensure it is added, append the resource flag to the arguments. 486 | */ 487 | 488 | NSString *resourceRulesPath = [[NSBundle mainBundle] pathForResource:@"ResourceRules" ofType:@"plist"]; 489 | NSString *resourceRulesArgument = [NSString stringWithFormat:@"--resource-rules=%@",resourceRulesPath]; 490 | [arguments addObject:resourceRulesArgument]; 491 | } else { 492 | 493 | /* 494 | For OSX 10.9 and later, code signing requires a version 2 signature. 495 | The resource envelope is obsolete. 496 | To ensure it is ignored, remove the resource key from the Info.plist file. 497 | */ 498 | 499 | NSString *infoPath = [NSString stringWithFormat:@"%@/Info.plist", filePath]; 500 | NSMutableDictionary *infoDict = [NSMutableDictionary dictionaryWithContentsOfFile:infoPath]; 501 | [infoDict removeObjectForKey:@"CFBundleResourceSpecification"]; 502 | [infoDict writeToFile:infoPath atomically:YES]; 503 | [arguments addObject:@"--no-strict"]; // http://stackoverflow.com/a/26204757 504 | } 505 | 506 | if (![[entitlementField stringValue] isEqualToString:@""]) { 507 | [arguments addObject:[NSString stringWithFormat:@"--entitlements=%@", [entitlementField stringValue]]]; 508 | } 509 | 510 | [arguments addObjectsFromArray:[NSArray arrayWithObjects:filePath, nil]]; 511 | 512 | codesignTask = [[NSTask alloc] init]; 513 | [codesignTask setLaunchPath:@"/usr/bin/codesign"]; 514 | [codesignTask setArguments:arguments]; 515 | 516 | [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(checkCodesigning:) userInfo:nil repeats:TRUE]; 517 | 518 | 519 | NSPipe *pipe=[NSPipe pipe]; 520 | [codesignTask setStandardOutput:pipe]; 521 | [codesignTask setStandardError:pipe]; 522 | NSFileHandle *handle=[pipe fileHandleForReading]; 523 | 524 | [codesignTask launch]; 525 | 526 | [NSThread detachNewThreadSelector:@selector(watchCodesigning:) 527 | toTarget:self withObject:handle]; 528 | } 529 | 530 | - (void)watchCodesigning:(NSFileHandle*)streamHandle { 531 | @autoreleasepool { 532 | 533 | codesigningResult = [[NSString alloc] initWithData:[streamHandle readDataToEndOfFile] encoding:NSASCIIStringEncoding]; 534 | 535 | } 536 | } 537 | 538 | - (void)checkCodesigning:(NSTimer *)timer { 539 | if ([codesignTask isRunning] == 0) { 540 | [timer invalidate]; 541 | codesignTask = nil; 542 | if (frameworks.count > 0) { 543 | [self signFile:[frameworks lastObject]]; 544 | [frameworks removeLastObject]; 545 | } else if (hasFrameworks) { 546 | hasFrameworks = NO; 547 | [self signFile:appPath]; 548 | } else { 549 | NSLog(@"Codesigning done"); 550 | [statusLabel setStringValue:@"Codesigning completed"]; 551 | [self doVerifySignature]; 552 | } 553 | } 554 | } 555 | 556 | - (void)doVerifySignature { 557 | if (appPath) { 558 | verifyTask = [[NSTask alloc] init]; 559 | [verifyTask setLaunchPath:@"/usr/bin/codesign"]; 560 | [verifyTask setArguments:[NSArray arrayWithObjects:@"-v", appPath, nil]]; 561 | 562 | [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(checkVerificationProcess:) userInfo:nil repeats:TRUE]; 563 | 564 | NSLog(@"Verifying %@",appPath); 565 | [statusLabel setStringValue:[NSString stringWithFormat:@"Verifying %@",appName]]; 566 | 567 | NSPipe *pipe=[NSPipe pipe]; 568 | [verifyTask setStandardOutput:pipe]; 569 | [verifyTask setStandardError:pipe]; 570 | NSFileHandle *handle=[pipe fileHandleForReading]; 571 | 572 | [verifyTask launch]; 573 | 574 | [NSThread detachNewThreadSelector:@selector(watchVerificationProcess:) 575 | toTarget:self withObject:handle]; 576 | } 577 | } 578 | 579 | - (void)watchVerificationProcess:(NSFileHandle*)streamHandle { 580 | @autoreleasepool { 581 | 582 | verificationResult = [[NSString alloc] initWithData:[streamHandle readDataToEndOfFile] encoding:NSASCIIStringEncoding]; 583 | 584 | } 585 | } 586 | 587 | - (void)checkVerificationProcess:(NSTimer *)timer { 588 | if ([verifyTask isRunning] == 0) { 589 | [timer invalidate]; 590 | verifyTask = nil; 591 | if ([verificationResult length] == 0) { 592 | NSLog(@"Verification done"); 593 | [statusLabel setStringValue:@"Verification completed"]; 594 | [self doZip]; 595 | } else { 596 | NSString *error = [[codesigningResult stringByAppendingString:@"\n\n"] stringByAppendingString:verificationResult]; 597 | [self showAlertOfKind:NSCriticalAlertStyle WithTitle:@"Signing failed" AndMessage:error]; 598 | [self enableControls]; 599 | [statusLabel setStringValue:@"Please try again"]; 600 | } 601 | } 602 | } 603 | 604 | - (void)doZip { 605 | if (appPath) { 606 | NSArray *destinationPathComponents = [sourcePath pathComponents]; 607 | NSString *destinationPath = @""; 608 | 609 | for (int i = 0; i < ([destinationPathComponents count]-1); i++) { 610 | destinationPath = [destinationPath stringByAppendingPathComponent:[destinationPathComponents objectAtIndex:i]]; 611 | } 612 | 613 | fileName = [sourcePath lastPathComponent]; 614 | fileName = [fileName substringToIndex:([fileName length] - ([[sourcePath pathExtension] length] + 1))]; 615 | fileName = [fileName stringByAppendingString:@"-resigned"]; 616 | fileName = [fileName stringByAppendingPathExtension:@"ipa"]; 617 | 618 | destinationPath = [destinationPath stringByAppendingPathComponent:fileName]; 619 | 620 | NSLog(@"Dest: %@",destinationPath); 621 | 622 | zipTask = [[NSTask alloc] init]; 623 | [zipTask setLaunchPath:@"/usr/bin/zip"]; 624 | [zipTask setCurrentDirectoryPath:workingPath]; 625 | [zipTask setArguments:[NSArray arrayWithObjects:@"-qry", destinationPath, @".", nil]]; 626 | 627 | [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(checkZip:) userInfo:nil repeats:TRUE]; 628 | 629 | NSLog(@"Zipping %@", destinationPath); 630 | [statusLabel setStringValue:[NSString stringWithFormat:@"Saving %@",fileName]]; 631 | 632 | [zipTask launch]; 633 | } 634 | } 635 | 636 | - (void)checkZip:(NSTimer *)timer { 637 | if ([zipTask isRunning] == 0) { 638 | [timer invalidate]; 639 | zipTask = nil; 640 | NSLog(@"Zipping done"); 641 | [statusLabel setStringValue:[NSString stringWithFormat:@"Saved %@",fileName]]; 642 | 643 | [[NSFileManager defaultManager] removeItemAtPath:workingPath error:nil]; 644 | 645 | [self enableControls]; 646 | 647 | NSString *result = [[codesigningResult stringByAppendingString:@"\n\n"] stringByAppendingString:verificationResult]; 648 | NSLog(@"Codesigning result: %@",result); 649 | } 650 | } 651 | 652 | - (IBAction)browse:(id)sender { 653 | NSOpenPanel* openDlg = [NSOpenPanel openPanel]; 654 | 655 | [openDlg setCanChooseFiles:TRUE]; 656 | [openDlg setCanChooseDirectories:FALSE]; 657 | [openDlg setAllowsMultipleSelection:FALSE]; 658 | [openDlg setAllowsOtherFileTypes:FALSE]; 659 | [openDlg setAllowedFileTypes:@[@"ipa", @"IPA", @"xcarchive"]]; 660 | 661 | if ([openDlg runModal] == NSOKButton) 662 | { 663 | NSString* fileNameOpened = [[[openDlg URLs] objectAtIndex:0] path]; 664 | [pathField setStringValue:fileNameOpened]; 665 | } 666 | } 667 | 668 | - (IBAction)provisioningBrowse:(id)sender { 669 | NSOpenPanel* openDlg = [NSOpenPanel openPanel]; 670 | 671 | [openDlg setCanChooseFiles:TRUE]; 672 | [openDlg setCanChooseDirectories:FALSE]; 673 | [openDlg setAllowsMultipleSelection:FALSE]; 674 | [openDlg setAllowsOtherFileTypes:FALSE]; 675 | [openDlg setAllowedFileTypes:@[@"mobileprovision", @"MOBILEPROVISION"]]; 676 | 677 | if ([openDlg runModal] == NSOKButton) 678 | { 679 | NSString* fileNameOpened = [[[openDlg URLs] objectAtIndex:0] path]; 680 | [provisioningPathField setStringValue:fileNameOpened]; 681 | } 682 | } 683 | 684 | - (IBAction)entitlementBrowse:(id)sender { 685 | NSOpenPanel* openDlg = [NSOpenPanel openPanel]; 686 | 687 | [openDlg setCanChooseFiles:TRUE]; 688 | [openDlg setCanChooseDirectories:FALSE]; 689 | [openDlg setAllowsMultipleSelection:FALSE]; 690 | [openDlg setAllowsOtherFileTypes:FALSE]; 691 | [openDlg setAllowedFileTypes:@[@"plist", @"PLIST"]]; 692 | 693 | if ([openDlg runModal] == NSOKButton) 694 | { 695 | NSString* fileNameOpened = [[[openDlg URLs] objectAtIndex:0] path]; 696 | [entitlementField setStringValue:fileNameOpened]; 697 | } 698 | } 699 | 700 | - (IBAction)changeBundleIDPressed:(id)sender { 701 | 702 | if (sender != changeBundleIDCheckbox) { 703 | return; 704 | } 705 | 706 | bundleIDField.enabled = changeBundleIDCheckbox.state == NSOnState; 707 | } 708 | 709 | - (void)disableControls { 710 | [pathField setEnabled:FALSE]; 711 | [entitlementField setEnabled:FALSE]; 712 | [browseButton setEnabled:FALSE]; 713 | [resignButton setEnabled:FALSE]; 714 | [provisioningBrowseButton setEnabled:NO]; 715 | [provisioningPathField setEnabled:NO]; 716 | [changeBundleIDCheckbox setEnabled:NO]; 717 | [bundleIDField setEnabled:NO]; 718 | [certComboBox setEnabled:NO]; 719 | 720 | [flurry startAnimation:self]; 721 | [flurry setAlphaValue:1.0]; 722 | } 723 | 724 | - (void)enableControls { 725 | [pathField setEnabled:TRUE]; 726 | [entitlementField setEnabled:TRUE]; 727 | [browseButton setEnabled:TRUE]; 728 | [resignButton setEnabled:TRUE]; 729 | [provisioningBrowseButton setEnabled:YES]; 730 | [provisioningPathField setEnabled:YES]; 731 | [changeBundleIDCheckbox setEnabled:YES]; 732 | [bundleIDField setEnabled:changeBundleIDCheckbox.state == NSOnState]; 733 | [certComboBox setEnabled:YES]; 734 | 735 | [flurry stopAnimation:self]; 736 | [flurry setAlphaValue:0.5]; 737 | } 738 | 739 | -(NSInteger)numberOfItemsInComboBox:(NSComboBox *)aComboBox { 740 | NSInteger count = 0; 741 | if ([aComboBox isEqual:certComboBox]) { 742 | count = [certComboBoxItems count]; 743 | } 744 | return count; 745 | } 746 | 747 | - (id)comboBox:(NSComboBox *)aComboBox objectValueForItemAtIndex:(NSInteger)index { 748 | id item = nil; 749 | if ([aComboBox isEqual:certComboBox]) { 750 | item = [certComboBoxItems objectAtIndex:index]; 751 | } 752 | return item; 753 | } 754 | 755 | - (void)getCerts { 756 | 757 | getCertsResult = nil; 758 | 759 | NSLog(@"Getting Certificate IDs"); 760 | [statusLabel setStringValue:@"Getting Signing Certificate IDs"]; 761 | 762 | certTask = [[NSTask alloc] init]; 763 | [certTask setLaunchPath:@"/usr/bin/security"]; 764 | [certTask setArguments:[NSArray arrayWithObjects:@"find-identity", @"-v", @"-p", @"codesigning", nil]]; 765 | 766 | [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(checkCerts:) userInfo:nil repeats:TRUE]; 767 | 768 | NSPipe *pipe=[NSPipe pipe]; 769 | [certTask setStandardOutput:pipe]; 770 | [certTask setStandardError:pipe]; 771 | NSFileHandle *handle=[pipe fileHandleForReading]; 772 | 773 | [certTask launch]; 774 | 775 | [NSThread detachNewThreadSelector:@selector(watchGetCerts:) toTarget:self withObject:handle]; 776 | } 777 | 778 | - (void)watchGetCerts:(NSFileHandle*)streamHandle { 779 | @autoreleasepool { 780 | 781 | NSString *securityResult = [[NSString alloc] initWithData:[streamHandle readDataToEndOfFile] encoding:NSASCIIStringEncoding]; 782 | // Verify the security result 783 | if (securityResult == nil || securityResult.length < 1) { 784 | // Nothing in the result, return 785 | return; 786 | } 787 | NSArray *rawResult = [securityResult componentsSeparatedByString:@"\""]; 788 | NSMutableArray *tempGetCertsResult = [NSMutableArray arrayWithCapacity:20]; 789 | for (int i = 0; i <= [rawResult count] - 2; i+=2) { 790 | 791 | NSLog(@"i:%d", i+1); 792 | if (rawResult.count - 1 < i + 1) { 793 | // Invalid array, don't add an object to that position 794 | } else { 795 | // Valid object 796 | [tempGetCertsResult addObject:[rawResult objectAtIndex:i+1]]; 797 | } 798 | } 799 | 800 | certComboBoxItems = [NSMutableArray arrayWithArray:tempGetCertsResult]; 801 | 802 | [certComboBox reloadData]; 803 | 804 | } 805 | } 806 | 807 | - (void)checkCerts:(NSTimer *)timer { 808 | if ([certTask isRunning] == 0) { 809 | [timer invalidate]; 810 | certTask = nil; 811 | 812 | if ([certComboBoxItems count] > 0) { 813 | NSLog(@"Get Certs done"); 814 | [statusLabel setStringValue:@"Signing Certificate IDs extracted"]; 815 | 816 | if ([defaults valueForKey:@"CERT_INDEX"]) { 817 | 818 | NSInteger selectedIndex = [[defaults valueForKey:@"CERT_INDEX"] integerValue]; 819 | if (selectedIndex != -1) { 820 | NSString *selectedItem = [self comboBox:certComboBox objectValueForItemAtIndex:selectedIndex]; 821 | [certComboBox setObjectValue:selectedItem]; 822 | [certComboBox selectItemAtIndex:selectedIndex]; 823 | } 824 | 825 | [self enableControls]; 826 | } 827 | } else { 828 | [self showAlertOfKind:NSCriticalAlertStyle WithTitle:@"Error" AndMessage:@"Getting Certificate ID's failed"]; 829 | [self enableControls]; 830 | [statusLabel setStringValue:@"Ready"]; 831 | } 832 | } 833 | } 834 | 835 | // If the application dock icon is clicked, reopen the window 836 | - (BOOL)applicationShouldHandleReopen:(NSApplication *)sender hasVisibleWindows:(BOOL)flag { 837 | // Make sure the window is visible 838 | if (![self.window isVisible]) { 839 | // Window isn't shown, show it 840 | [self.window makeKeyAndOrderFront:self]; 841 | } 842 | 843 | // Return YES 844 | return YES; 845 | } 846 | 847 | #pragma mark - Alert Methods 848 | 849 | /* NSRunAlerts are being deprecated in 10.9 */ 850 | 851 | // Show a critical alert 852 | - (void)showAlertOfKind:(NSAlertStyle)style WithTitle:(NSString *)title AndMessage:(NSString *)message { 853 | NSAlert *alert = [[NSAlert alloc] init]; 854 | [alert addButtonWithTitle:@"OK"]; 855 | [alert setMessageText:title]; 856 | [alert setInformativeText:message]; 857 | [alert setAlertStyle:style]; 858 | [alert runModal]; 859 | } 860 | 861 | @end 862 | -------------------------------------------------------------------------------- /iReSign/iReSign/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // iReSign 4 | // 5 | // Created by Maciej Swic on 2011-05-16. 6 | // Copyright (c) 2011 Maciej Swic, Licensed under the MIT License. 7 | // See README.md for details 8 | // 9 | 10 | #import 11 | 12 | int main(int argc, char *argv[]) 13 | { 14 | return NSApplicationMain(argc, (const char **)argv); 15 | } 16 | -------------------------------------------------------------------------------- /iReSign/iReSign/zh-Hans.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /iReSign/iReSign/zh-Hans.lproj/MainMenu.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 146 | 158 | 169 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | iReSign 允许您使用自己的苹果开发者证书重新签名任何未加密的ipa文件,只要遵循如下操作: 274 | 275 | 1. 使用 “浏览” 按键找到需要签名的ipa或者输入需要签名的ipa文件路径。 276 | 277 | 2. 在 “钥匙串访问” 中找到证书全名,如 iPhone Developer: Firstname Lastname (XXXXXXXXXX) 278 | 279 | 3. 点击 “重新签名!" 并等待。 经过重新签名的文件将和原文件放置在同一目录下。 280 | 281 | 282 | 283 | 284 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | --------------------------------------------------------------------------------