From 598ef7b1bf3104bfc014de7ae47a841e7faadd52 Mon Sep 17 00:00:00 2001 From: ztby Date: Mon, 9 Nov 2026 22:51:39 +0800 Subject: [PATCH] Terminal 1.0: a-Shell 2.3.2 full + worse_query + native plugin environment --- .gitignore | 16 + LICENSE | 674 +++++ NOTICE | 9 + README.md | 152 ++ env/apt | 316 +++ env/apt-get | 4 + env/ardeb | 71 + env/bash | 38 + env/dpkg | 391 +++ env/dpkg-deb | 22 + env/mkdeb | 109 + env/pkgtool | 286 ++ env/plugin-run | 32 + env/termenv | 222 ++ icon/Assets.xcassets/Contents.json | 6 + .../DisplayIcon.appiconset/Contents.json | 116 + .../DisplayIcon1024.png | Bin 0 -> 37918 bytes .../DisplayIcon20x20@2x.png | Bin 0 -> 1399 bytes .../DisplayIcon20x20@2x~ipad.png | Bin 0 -> 1399 bytes .../DisplayIcon20x20@3x.png | Bin 0 -> 2148 bytes .../DisplayIcon20x20~ipad.png | Bin 0 -> 657 bytes .../DisplayIcon29x29@2x.png | Bin 0 -> 2027 bytes .../DisplayIcon29x29@2x~ipad.png | Bin 0 -> 2027 bytes .../DisplayIcon29x29@3x.png | Bin 0 -> 3340 bytes .../DisplayIcon29x29~ipad.png | Bin 0 -> 1019 bytes .../DisplayIcon40x40@2x.png | Bin 0 -> 3060 bytes .../DisplayIcon40x40@2x~ipad.png | Bin 0 -> 3060 bytes .../DisplayIcon40x40@3x.png | Bin 0 -> 4860 bytes .../DisplayIcon40x40~ipad.png | Bin 0 -> 1399 bytes .../DisplayIcon60x60@2x.png | Bin 0 -> 4860 bytes .../DisplayIcon60x60@3x.png | Bin 0 -> 7630 bytes .../DisplayIcon76x76@2x~ipad.png | Bin 0 -> 6364 bytes .../DisplayIcon76x76~ipad.png | Bin 0 -> 2803 bytes .../DisplayIcon83.5x83.5@2x~ipad.png | Bin 0 -> 7042 bytes icon/icon-master.png | Bin 0 -> 37918 bytes icon/make_icon.py | 142 + icon/out/Assets.car | Bin 0 -> 154744 bytes icon/out/partial-info.plist | 31 + scripts/build_dylib.sh | 14 + scripts/ent.plist | 15 + scripts/inject_dylib.py | 17 + scripts/sign_all.sh | 37 + src/TerminalSBX.m | 2398 +++++++++++++++++ 43 files changed, 5118 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 NOTICE create mode 100644 README.md create mode 100755 env/apt create mode 100755 env/apt-get create mode 100644 env/ardeb create mode 100755 env/bash create mode 100755 env/dpkg create mode 100755 env/dpkg-deb create mode 100755 env/mkdeb create mode 100644 env/pkgtool create mode 100644 env/plugin-run create mode 100755 env/termenv create mode 100644 icon/Assets.xcassets/Contents.json create mode 100644 icon/Assets.xcassets/DisplayIcon.appiconset/Contents.json create mode 100644 icon/Assets.xcassets/DisplayIcon.appiconset/DisplayIcon1024.png create mode 100644 icon/Assets.xcassets/DisplayIcon.appiconset/DisplayIcon20x20@2x.png create mode 100644 icon/Assets.xcassets/DisplayIcon.appiconset/DisplayIcon20x20@2x~ipad.png create mode 100644 icon/Assets.xcassets/DisplayIcon.appiconset/DisplayIcon20x20@3x.png create mode 100644 icon/Assets.xcassets/DisplayIcon.appiconset/DisplayIcon20x20~ipad.png create mode 100644 icon/Assets.xcassets/DisplayIcon.appiconset/DisplayIcon29x29@2x.png create mode 100644 icon/Assets.xcassets/DisplayIcon.appiconset/DisplayIcon29x29@2x~ipad.png create mode 100644 icon/Assets.xcassets/DisplayIcon.appiconset/DisplayIcon29x29@3x.png create mode 100644 icon/Assets.xcassets/DisplayIcon.appiconset/DisplayIcon29x29~ipad.png create mode 100644 icon/Assets.xcassets/DisplayIcon.appiconset/DisplayIcon40x40@2x.png create mode 100644 icon/Assets.xcassets/DisplayIcon.appiconset/DisplayIcon40x40@2x~ipad.png create mode 100644 icon/Assets.xcassets/DisplayIcon.appiconset/DisplayIcon40x40@3x.png create mode 100644 icon/Assets.xcassets/DisplayIcon.appiconset/DisplayIcon40x40~ipad.png create mode 100644 icon/Assets.xcassets/DisplayIcon.appiconset/DisplayIcon60x60@2x.png create mode 100644 icon/Assets.xcassets/DisplayIcon.appiconset/DisplayIcon60x60@3x.png create mode 100644 icon/Assets.xcassets/DisplayIcon.appiconset/DisplayIcon76x76@2x~ipad.png create mode 100644 icon/Assets.xcassets/DisplayIcon.appiconset/DisplayIcon76x76~ipad.png create mode 100644 icon/Assets.xcassets/DisplayIcon.appiconset/DisplayIcon83.5x83.5@2x~ipad.png create mode 100644 icon/icon-master.png create mode 100644 icon/make_icon.py create mode 100644 icon/out/Assets.car create mode 100644 icon/out/partial-info.plist create mode 100644 scripts/build_dylib.sh create mode 100644 scripts/ent.plist create mode 100644 scripts/inject_dylib.py create mode 100755 scripts/sign_all.sh create mode 100644 src/TerminalSBX.m diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..97e0418 --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +# Local build inputs +work/ +build/ +package/ +testapp/ +cert/ +*.ipa +*.p12 +*.mobileprovision +*.tar.gz +*.log +signing/ + +# Research inputs +neofetch-script +a-Shell*.ipa diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..2199637 --- /dev/null +++ b/NOTICE @@ -0,0 +1,9 @@ +terminal_worse is a security-research fork built from: + +- a-Shell by Nicolas Holzschuch (BSD-2-Clause) +- worse_query by Taj C / forcequitOS (GPL-3.0) +- badshell by wormprojects +- pathleak by forcequitOS +- neofetch by Dylan Araps (ASCII art / field inspiration, MIT) + +Project-specific additions are distributed under GPL-3.0. See LICENSE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..a4e563d --- /dev/null +++ b/README.md @@ -0,0 +1,152 @@ +# terminal_worse + +A fork of **a-Shell 2.3.2 (full)** with the **worse_query** sandbox escape, +a native terminal plugin environment, and a small set of UX additions. + +Built and tested on **iPhone 18 Pro Max, iOS 27.0.1 (24A446)**, signed with a +development provisioning profile. Bundle ID: `com.apple.Terminal`. + +> This is a personal security-research project. The repository does NOT +> contain the decrypted a-Shell IPA (it must be supplied locally) and does NOT +> contain the signing certificate or provisioning profile. + +## Features + +- Full a-Shell 2.3.2 app: Python, Perl, TeX, clang/LLVM, SSH, vim, etc. +- `worse_query` app-group sandbox escape covering every path documented by + the upstream project: + - `/var/containers/Data/System` + - `/var/containers/Shared/SystemGroup/*` + - `/var/mobile/Containers/Data/Application/*` + - `/var/mobile/Containers/Data/InternalDaemon/*` + - `/var/mobile/Containers/Data/PluginKitPlugin/*` + - `/var/mobile/Containers/Shared/AppGroup/*` + - `/var/mobile/Containers/Shared/AppGroup` +- Launch-time blocking progress UI, then auto-mount under + `~/Documents/_sandbox/` and run `cd _sandbox; ls`. +- App containers are exposed by bundle ID, with `Documents/ Library/ tmp/ + SystemData/ StoreKit/` and a `_data` link to the full container root. +- `keep_content` is forced off: every launch starts a fresh terminal and does + not restore the previous command history. +- BadShell command set preserved. `badshell` is renamed to **`sbxhelp`**. +- Built-in **`neofetch`** with live device data (OS/build, model, kernel, + uptime, resolution, CPU/GPU, memory, disk, battery, thermal, locale, + timezone, IP). It uses neofetch's compact Apple ASCII art, not a bash + script. +- Terminal-style app icon (generated by `icon/make_icon.py`). + +## Shell commands + +``` +sbxhelp help / mount overview +sbx_status [-v] app group, mount state, active handles +sbx_remount re-run the full auto-mount +sbx_grant [-c] consume a sandbox extension +sbx_release +sbx_ls +sbx_cat +sbx_cp +sbx_write [-a] +sbx_rm [-r] +sbx_hexdump [-n N] +sbx_containers [root] +sbx_id +sbx_sysgroups [filter] +sbx_probe +sbx_paths +bswelcome +neofetch +``` + +## Native plugin environment + +`termenv` creates an independent prefix at `~/Documents/.terminal` and +provides a native `apt`/`dpkg` compatible package front-end for +Terminal-compatible `.deb` files (scripts or iOS/Darwin arm64 payloads). + +```sh +termenv init +source ~/Documents/.terminal/etc/profile # or: termenv on +apt update +apt install +dpkg -i +dpkg -l +mkdeb [arch] +plugin-run [args...] +``` + +Default sources: + +``` +deb [trusted=yes] file://$PREFIX/repo ./ +deb [trusted=yes] https://repo.procurs.us/ ./ +deb [trusted=yes] https://repo.havoc.app/ ./ +``` + +`apt update` downloads `Packages.xz`/`.gz`/plain indexes. Procursus/Havoc +indexes may be unreachable from some networks; the local source still works. + +### Important limitations + +- **Native Mach-O CLI binaries from Procursus/Havoc cannot run in a-Shell.** + `ios_system`'s `isRealCommand` deliberately rejects Mach-O files, and a + non-jailbroken app cannot execute unsigned external executables. Script + plugins (`#!/bin/sh`, python, perl, lua) and WebAssembly plugins can run; + use `plugin-run` for a clear diagnostic. Native binaries require a + jailbreak or a Linux/emulator environment. +- `bash` is a **sh-compatibility launcher**, not GNU bash. `bash -c` and + simple scripts work; bash-specific arrays/`[[` do not. +- The Python package backend (`pkgtool`) is used when available. The + package-install path is still being polished; `apt update`, package + download, extraction, `dpkg -l` and the local `hello` sample are the + current test targets. +- `apt` does not verify GPG signatures; sources are `[trusted=yes]`. + +## Repository layout + +``` +src/TerminalSBX.m injected dylib: worse_query, UI, commands, neofetch +env/ native plugin environment commands +icon/ icon generator + compiled Assets.car +scripts/ entitlements, signing/build helpers +``` + +## Building + +Requirements: macOS + Xcode 27, the decrypted `a-Shell_2.3.2.ipa`, a signing +identity and provisioning profile with an app group. + +1. Extract `Payload/a-Shell.app` to `work/Terminal.app`. +2. Rename the executable `a-Shell` to `Terminal`; set `CFBundleIdentifier` + `com.apple.Terminal`, `CFBundleName`/`CFBundleDisplayName` `Terminal`, + `CFBundleExecutable` `Terminal`, and `AppGroupIdentifier` to a group in + the profile. +3. Build `src/TerminalSBX.m` as `Frameworks/TerminalSBX.dylib` + (`scripts/build_dylib.sh`). +4. Copy `env/*` into `Terminal.app/bin`; copy `icon/out/Assets.car` and the + three `DisplayIcon*.png` files. +5. Add the `sbx_*`, `sbxhelp`, `neofetch` entries to + `commandDictionary.plist` pointing at + `@executable_path/Frameworks/TerminalSBX.dylib`. +6. Inject a weak `LC_LOAD_DYLIB` for + `@executable_path/Frameworks/TerminalSBX.dylib` with LIEF + (`scripts/inject_dylib.py`). +7. Re-sign every framework with the same team, then the app with + `scripts/ent.plist` and the provisioning profile + (`scripts/sign_all.sh`). +8. Install with `devicectl`/Feather/TrollStore as appropriate for the + signing profile. + +The app in this repository is source-only; the signed IPA is a release asset +and is not committed to Git. + +## Credits + +- **a-Shell** — Nicolas Holzschuch, BSD-2-Clause. +- **worse_query** — Taj C / forcequitOS, GPL-3.0. +- **badshell** — wormprojects. +- **pathleak** — forcequitOS. +- **neofetch** — Dylan Araps (ASCII art/field inspiration), MIT. +- The a-Shell full IPA was supplied by the operator for local research. + +All project-specific additions are released under GPL-3.0 (see `LICENSE`). diff --git a/env/apt b/env/apt new file mode 100755 index 0000000..ba0c91c --- /dev/null +++ b/env/apt @@ -0,0 +1,316 @@ +#!/bin/sh +# apt - native Terminal package front-end (Terminal-compatible .deb packages) +# This is not Debian apt: it manages packages built for iOS/Terminal. + +ROOT="${TERM_ROOT:-$HOME/Documents/.terminal}" +LISTS="$ROOT/var/lib/apt/lists" +INDEX="$LISTS/Packages" +CACHE="$ROOT/var/cache/apt/archives" +SOURCES="$ROOT/etc/apt/sources.list" +VISITED="" +DPKG="${APPDIR:-}/bin/dpkg" +[ -f "$DPKG" ] || DPKG="dpkg" + +usage() { + printf '%s\n' "Usage: apt " + printf '%s\n' "" + printf '%s\n' " update Refresh package indexes" + printf '%s\n' " search Search package names/descriptions" + printf '%s\n' " show Show package details" + printf '%s\n' " install Install a package (dependencies are resolved locally)" + printf '%s\n' " remove|purge Remove a package" + printf '%s\n' " list --installed List installed packages" + printf '%s\n' " list List packages in the current index" + printf '%s\n' " clean Clear downloaded archives" + printf '%s\n' " --version Show version" + printf '%s\n' "" + printf '%s\n' "Default repository: file://$ROOT/repo" + printf '%s\n' "Create packages with: mkdeb [arch]" +} +ensure() { + mkdir -p "$ROOT" "$LISTS" "$CACHE" "$ROOT/var/lib/dpkg" "$ROOT/tmp" + [ -f "$ROOT/var/lib/dpkg/status" ] || : > "$ROOT/var/lib/dpkg/status" +} + +field() { + key="$1"; stanza="$2" + tmp="$ROOT/tmp/field.$$" + printf '%s\n' "$stanza" > "$tmp" + awk -v key="$key" 'index($0,key": ")==1 { sub("^" key ": ",""); print; exit }' "$tmp" + rm -f "$tmp" +} + +find_stanza() { + local pkg="$1" + [ -f "$INDEX" ] || return 0 + awk -v pkg="$pkg" 'BEGIN{RS=""; ORS="\n\n"} $0 ~ "(^|\\n)Package: " pkg "(\\n|$)" { print; exit }' "$INDEX" +} + +is_installed() { + out="$ROOT/tmp/dpkg-status.$$" + sh "$DPKG" -s "$1" > "$out" 2>/dev/null + grep -q '^Status: install ok installed' "$out" + result=$? + rm -f "$out" + return $result +} + +decompress_index() { + file="$1" + out="$2" + case "$file" in + *.xz) + xz -d -c "$file" >> "$out" 2>/dev/null || python3 -c 'import lzma,sys; sys.stdout.buffer.write(lzma.open(sys.argv[1],"rb").read())' "$file" >> "$out" 2>/dev/null + ;; + *.gz) + gzip -dc "$file" >> "$out" 2>/dev/null || python3 -c 'import gzip,sys; sys.stdout.buffer.write(gzip.open(sys.argv[1],"rb").read())' "$file" >> "$out" 2>/dev/null + ;; + *) + cat "$file" >> "$out" + ;; + esac +} + +fetch_index() { + URI="$1" + TMPIDX="$ROOT/tmp/index.$$" + rm -f "$TMPIDX" "$TMPIDX.xz" "$TMPIDX.gz" + case "$URI" in + file://*) + DIR="${URI#file://}" + for name in Packages Packages.xz Packages.gz; do + if [ -f "$DIR/$name" ]; then + decompress_index "$DIR/$name" "$INDEX" + return 0 + fi + done + ;; + http://*|https://*) + if curl -L --fail --silent --connect-timeout 10 --max-time 120 "$URI/Packages.xz" -o "$TMPIDX.xz" 2>/dev/null; then + decompress_index "$TMPIDX.xz" "$INDEX" + rm -f "$TMPIDX.xz" + return 0 + fi + if curl -L --fail --silent --connect-timeout 10 --max-time 120 "$URI/Packages.gz" -o "$TMPIDX.gz" 2>/dev/null; then + decompress_index "$TMPIDX.gz" "$INDEX" + rm -f "$TMPIDX.gz" + return 0 + fi + if curl -L --fail --silent --connect-timeout 10 --max-time 120 "$URI/Packages" -o "$TMPIDX" 2>/dev/null; then + cat "$TMPIDX" >> "$INDEX" + rm -f "$TMPIDX" + return 0 + fi + ;; + esac + return 1 +} + +update_lists() { + ensure + echo "apt: updating package lists..." + : > "$INDEX" + if [ ! -f "$SOURCES" ]; then + mkdir -p "$(dirname "$SOURCES")" + printf 'deb [trusted=yes] file://%s/repo ./\n' "$ROOT" > "$SOURCES" + fi + n=1 + while [ $n -le 8 ]; do + LINE=$(awk -v want="$n" '/^deb /{ count++; if (count == want) { print; exit } }' "$SOURCES") + [ -n "$LINE" ] || break + set -- $LINE + if [ "${2:-}" = "[trusted=yes]" ]; then + URI="${3:-}"; SUITE="${4:-./}" + else + URI="${2:-}"; SUITE="${3:-./}" + fi + if [ -n "$URI" ]; then + case "$URI" in + http://*|https://*) + if [ "${APT_SKIP_REMOTE:-0}" = "1" ]; then + echo "Ign:$n $URI (remote skipped)" + n=$((n + 1)) + continue + fi + ;; + esac + if fetch_index "$URI"; then + echo "Get:$n $URI $SUITE" + else + echo "Err:$n $URI (no index / unreachable)" >&2 + fi + fi + n=$((n + 1)) + done + echo "Reading package lists... Done" +} + +search_packages() { + text="${1:-}" + ensure + [ -f "$INDEX" ] || { echo "E: Run 'apt update' first" >&2; return 1; } + awk -v pat="$text" 'BEGIN{RS="";FS="\n"} { + if (pat == "" || tolower($0) ~ tolower(pat)) { + p=""; v=""; d=""; + for (i=1;i<=NF;i++) { + if ($i ~ /^Package: /) p=substr($i,10); + if ($i ~ /^Version: /) v=substr($i,10); + if ($i ~ /^Description: /) d=substr($i,14); + } + if (p != "") printf "%-28s %-16s %s\n", p, v, d; + } + }' "$INDEX" +} + +show_package() { + pkg="${1:-}" + ensure + stanza=$(find_stanza "$pkg") + if [ -z "$stanza" ]; then + echo "E: Unable to locate package $pkg" >&2 + return 1 + fi + printf '%s\n' "$stanza" +} + +install_one() { + local pkg="$1" + local stanza version depends dep filename local_archive base oldifs + [ -n "$pkg" ] || return 0 + case " $VISITED " in *" $pkg "*) return 0 ;; esac + VISITED="$VISITED $pkg" + if is_installed "$pkg"; then + echo "$pkg is already the newest version." + return 0 + fi + stanza=$(find_stanza "$pkg") + if [ -z "$stanza" ]; then + for localdeb in "$ROOT/repo/pool/${pkg}"_*.deb; do + if [ -f "$localdeb" ]; then + echo "Installing $pkg from local pool..." + sh "$DPKG" -i "$localdeb" || return 1 + return 0 + fi + done + echo "E: Unable to locate package $pkg" >&2 + return 1 + fi + version=$(field Version "$stanza") + depends=$(field Depends "$stanza") + if [ -n "$depends" ]; then + oldifs="$IFS" + IFS=',' + for dep in $depends; do + IFS="$oldifs" + dep=${dep%%|*} + dep=${dep%%(*} + dep=$(echo "$dep" | tr -d ' ') + dep=${dep%:any} + [ -n "$dep" ] || continue + if ! is_installed "$dep"; then + if [ -n "$(find_stanza "$dep")" ]; then + echo "Installing dependency: $dep" + install_one "$dep" || return 1 + else + echo "W: dependency '$dep' is not in the index" >&2 + fi + fi + IFS=',' + done + IFS="$oldifs" + fi + filename=$(field Filename "$stanza") + if [ -z "$filename" ]; then + echo "E: package $pkg has no Filename field" >&2 + return 1 + fi + filename="${filename#./}" + local_archive="$CACHE/${pkg}_${version}.deb" + if [ -f "$ROOT/repo/$filename" ]; then + cp "$ROOT/repo/$filename" "$local_archive" || return 1 + else + fetched=0 + BASES=$(awk '/^deb /{for(i=1;i<=NF;i++) if($i ~ /^https?:/) print $i}' "$SOURCES") + for base in $BASES; do + if curl -L --fail --silent --connect-timeout 10 --max-time 180 "$base/$filename" -o "$local_archive" 2>/dev/null; then + fetched=1 + break + fi + done + if [ $fetched -ne 1 ]; then + echo "E: cannot fetch $filename" >&2 + return 1 + fi + fi + echo "Installing $pkg ($version)..." + echo "apt: invoking dpkg..." + sh "$DPKG" -i "$local_archive" || return 1 + return 0 +} + +install_packages() { + ensure + echo "apt: resolving packages..." + [ -f "$INDEX" ] || { echo "E: Run 'apt update' first" >&2; return 1; } + status=0 + for arg in "$@"; do + case "$arg" in + *.deb) + sh "$DPKG" -i "$arg" || status=1 + ;; + *) + install_one "$arg" || status=1 + ;; + esac + done + echo "Done." + return $status +} + +remove_packages() { + status=0 + for pkg in "$@"; do + sh "$DPKG" -r "$pkg" || status=1 + done + return $status +} + +list_installed() { + sh "$DPKG" -l +} + +list_all() { + ensure + [ -f "$INDEX" ] || { echo "E: Run 'apt update' first" >&2; return 1; } + awk 'BEGIN{RS="";FS="\n"} { + p="";v="";a=""; + for(i=1;i<=NF;i++){ + if($i~/^Package: /)p=substr($i,10); + if($i~/^Version: /)v=substr($i,10); + if($i~/^Architecture: /)a=substr($i,14); + } + if(p!="") printf "%-28s %-16s %s\n", p, v, a; + }' "$INDEX" +} + +case "${1:-}" in + update) update_lists ;; + search) shift; search_packages "${1:-}" ;; + show) shift; show_package "${1:-}" ;; + install) shift; install_packages "$@" ;; + remove|uninstall) shift; remove_packages "$@" ;; + purge) shift; remove_packages "$@" ;; + list) + shift + if [ "${1:-}" = "--installed" ]; then list_installed; else list_all; fi + ;; + clean) + rm -f "$CACHE"/*.deb + echo "Cleaned package archives" + ;; + --version|-v) + echo "apt 1.0 (Terminal native package front-end)" + ;; + ""|-h|--help|help) usage ;; + *) usage; exit 2 ;; +esac diff --git a/env/apt-get b/env/apt-get new file mode 100755 index 0000000..5241a99 --- /dev/null +++ b/env/apt-get @@ -0,0 +1,4 @@ +#!/bin/sh +# apt-get compatibility wrapper for the native Terminal package manager. +sh "$APPDIR/bin/apt" "$@" +exit $? diff --git a/env/ardeb b/env/ardeb new file mode 100644 index 0000000..1b41609 --- /dev/null +++ b/env/ardeb @@ -0,0 +1,71 @@ +#!/usr/bin/env python3 +"""Minimal ar archive packer/extractor for .deb files on a-Shell. + +Usage: + ardeb pack [file ...] + ardeb extract +""" + +import os +import sys + + +def pack(out_path, files): + with open(out_path, "wb") as out: + out.write(b"!\n") + for path in files: + data = open(path, "rb").read() + name = os.path.basename(path) + if len(name) > 15: + raise SystemExit("ardeb: member name too long: " + name) + header = ( + name.ljust(16) + + "0".ljust(12) + + "0".ljust(6) + + "0".ljust(6) + + "100644".ljust(8) + + str(len(data)).ljust(10) + + "`\n" + ).encode("ascii") + out.write(header) + out.write(data) + if len(data) & 1: + out.write(b"\n") + + +def extract(archive, dest): + data = open(archive, "rb").read() + if not data.startswith(b"!\n"): + raise SystemExit("ardeb: not an ar archive") + os.makedirs(dest, exist_ok=True) + pos = 8 + while pos + 60 <= len(data): + header = data[pos:pos + 60] + pos += 60 + name = header[:16].decode("ascii", "ignore").strip().rstrip("/") + if not name: + continue + try: + size = int(header[48:58].decode("ascii", "ignore").strip() or "0") + except ValueError: + size = 0 + body = data[pos:pos + size] + pos += size + (size & 1) + if name in (".", ".."): + continue + open(os.path.join(dest, name), "wb").write(body) + + +def main(): + if len(sys.argv) < 4: + raise SystemExit(__doc__) + if sys.argv[1] == "pack": + pack(sys.argv[2], sys.argv[3:]) + elif sys.argv[1] == "extract": + extract(sys.argv[2], sys.argv[3]) + else: + raise SystemExit(__doc__) + + +if __name__ == "__main__": + main() diff --git a/env/bash b/env/bash new file mode 100755 index 0000000..c43c952 --- /dev/null +++ b/env/bash @@ -0,0 +1,38 @@ +#!/bin/sh +# bash-compat - a-Shell POSIX sh compatibility launcher. +# +# GNU bash is not bundled with Terminal. This launcher provides the common +# `bash script` / `bash -c 'command'` interface on top of a-Shell's sh so +# simple plugin scripts work. If a real bash is installed at +# $PREFIX/bin/bash, the prefix PATH takes precedence over this launcher. + +if [ "${1:-}" = "--version" ] || [ "${1:-}" = "-version" ]; then + echo "bash-compat 1.0 (a-Shell POSIX sh; GNU bash is not bundled)" + exit 0 +fi + +if [ "${1:-}" = "-c" ]; then + shift + if [ $# -eq 0 ]; then + echo "bash-compat: -c requires a command" >&2 + exit 2 + fi + command="$1" + shift + sh -c "$command" "$@" + exit $? +fi + +if [ $# -gt 0 ] && [ -f "$1" ]; then + sh "$@" + exit $? +fi + +if [ $# -eq 0 ]; then + echo "bash-compat: a-Shell POSIX sh. GNU bash-specific syntax is not supported." >&2 + sh -s + exit $? +fi + +sh "$@" +exit $? diff --git a/env/dpkg b/env/dpkg new file mode 100755 index 0000000..db9c600 --- /dev/null +++ b/env/dpkg @@ -0,0 +1,391 @@ +#!/bin/sh +# dpkg - native Terminal package manager (Debian .deb format subset) +# +# Packages must be built for the native Terminal/iOS environment (scripts or +# iOS/Darwin arm64 binaries). Debian Linux arm64/amd64 packages are rejected +# by default because their ELF binaries cannot run on iOS without an emulator. + +ROOT="${TERM_ROOT:-$HOME/Documents/.terminal}" +STATUS="$ROOT/var/lib/dpkg/status" +INFO="$ROOT/var/lib/dpkg/info" +FORCE_ARCH=0 + +usage() { + printf '%s\n' "Usage: dpkg " + printf '%s\n' "" + printf '%s\n' " -i, --install Install a Terminal-compatible .deb" + printf '%s\n' " -r, --remove Remove a package" + printf '%s\n' " -P, --purge Remove a package (same as -r here)" + printf '%s\n' " -l, --list List installed packages" + printf '%s\n' " -s, --status Show package status" + printf '%s\n' " -L, --listfiles List files installed by a package" + printf '%s\n' " -x, --extract Extract a .deb data archive" + printf '%s\n' " --contents List the contents of a .deb" + printf '%s\n' " --print-architecture Print the native architecture" + printf '%s\n' " --force-architecture Allow non-native architecture packages" + printf '%s\n' " --version Show version" +} +ensure() { + mkdir -p "$ROOT" "$INFO" "$ROOT/tmp" "$ROOT/var/lib/dpkg" + [ -f "$STATUS" ] || : > "$STATUS" +} + +field() { + key="$1"; file="$2" + awk -v key="$key" 'index($0,key": ")==1 { sub("^" key ": ",""); print; exit }' "$file" +} + +stanza_field() { + key="$1"; stanza="$2" + printf '%s\n' "$stanza" | awk -v key="$key" 'index($0,key": ")==1 { sub("^" key ": ",""); print; exit }' +} + +stanza_for() { + pkg="$1" + awk -v pkg="$pkg" 'BEGIN{RS=""; ORS="\n\n"} $0 ~ "(^|\\n)Package: " pkg "(\\n|$)" { print; exit }' "$STATUS" +} + +remove_status() { + pkg="$1" + TMP="$ROOT/tmp/status.$$" + awk -v pkg="$pkg" 'BEGIN{RS=""; ORS="\n\n"} $0 !~ "(^|\\n)Package: " pkg "(\\n|$)" { print }' "$STATUS" > "$TMP" + mv "$TMP" "$STATUS" +} + +append_status() { + { + echo "Package: $PKG" + echo "Status: install ok installed" + echo "Priority: ${PRIORITY:-optional}" + echo "Section: ${SECTION:-plugins}" + echo "Installed-Size: ${INSTALLED_SIZE:-0}" + echo "Maintainer: ${MAINTAINER:-unknown}" + echo "Architecture: ${ARCH:-iphoneos-arm64}" + echo "Version: $VERSION" + echo "Description: $DESCRIPTION" + echo "" + } >> "$STATUS" +} + +ar_extract() { + archive="$1" + dest="$2" + tar -xf "$archive" -C "$dest" >/dev/null 2>&1 + if [ ! -f "$dest/debian-binary" ]; then + if python3 -c 'pass' >/dev/null 2>&1 && [ -f "$APPDIR/bin/ardeb" ]; then + python3 "$APPDIR/bin/ardeb" extract "$archive" "$dest" + fi + fi +} + +install_deb() { + DEB="$1" + if [ ! -f "$DEB" ]; then + echo "dpkg: cannot access archive '$DEB': No such file" >&2 + return 1 + fi + if python3 -c 'pass' >/dev/null 2>&1 && [ -f "$APPDIR/bin/pkgtool" ]; then + python3 "$APPDIR/bin/pkgtool" install "$DEB" + return $? + fi + ensure + echo "dpkg: unpacking $DEB" + TMP="$ROOT/tmp/dpkg.$$" + rm -rf "$TMP" + mkdir -p "$TMP" + cp "$DEB" "$TMP/pkg.deb" || { rm -rf "$TMP"; return 1; } + ar_extract "$TMP/pkg.deb" "$TMP" + echo "dpkg: ar extracted" + if [ ! -f "$TMP/debian-binary" ]; then + echo "dpkg: '$DEB' is not a Debian-format archive" >&2 + rm -rf "$TMP" + return 1 + fi + + CTRL_ARCHIVE="" + for f in "$TMP"/control.tar.*; do [ -f "$f" ] && { CTRL_ARCHIVE="$f"; break; }; done + DATA_ARCHIVE="" + for f in "$TMP"/data.tar.*; do [ -f "$f" ] && { DATA_ARCHIVE="$f"; break; }; done + if [ -z "$CTRL_ARCHIVE" ] || [ -z "$DATA_ARCHIVE" ]; then + echo "dpkg: missing control or data archive" >&2 + rm -rf "$TMP" + return 1 + fi + + mkdir -p "$TMP/control" + case "$CTRL_ARCHIVE" in + *.gz) tar -xzf "$CTRL_ARCHIVE" -C "$TMP/control" 2>/dev/null ;; + *.xz) tar -xJf "$CTRL_ARCHIVE" -C "$TMP/control" 2>/dev/null ;; + *) tar -xf "$CTRL_ARCHIVE" -C "$TMP/control" 2>/dev/null ;; + esac + CONTROL="" + if [ -f "$TMP/control/control" ]; then + CONTROL="$TMP/control/control" + elif [ -f "$TMP/control/DEBIAN/control" ]; then + CONTROL="$TMP/control/DEBIAN/control" + fi + if [ -z "$CONTROL" ]; then + echo "dpkg: no control file in package" >&2 + rm -rf "$TMP" + return 1 + fi + + PKG=$(field Package "$CONTROL") + VERSION=$(field Version "$CONTROL") + ARCH=$(field Architecture "$CONTROL") + PRIORITY=$(field Priority "$CONTROL") + SECTION=$(field Section "$CONTROL") + MAINTAINER=$(field Maintainer "$CONTROL") + DESCRIPTION=$(field Description "$CONTROL") + [ -n "$PKG" ] && [ -n "$VERSION" ] || { + echo "dpkg: invalid control file (Package/Version missing)" >&2 + rm -rf "$TMP" + return 1 + } + case "$PKG" in + *[!A-Za-z0-9+.-]*|"") echo "dpkg: invalid package name: $PKG" >&2; rm -rf "$TMP"; return 1 ;; + esac + + case "$ARCH" in + ""|all|iphoneos-arm64|darwin-arm64|a-shell) ;; + *) + if [ "$FORCE_ARCH" != "1" ]; then + echo "dpkg: architecture '$ARCH' is not native to iOS/Terminal." >&2 + echo " Debian Linux binaries cannot run without an emulator." >&2 + echo " Use --force-architecture only for script-only packages." >&2 + rm -rf "$TMP" + return 1 + fi + echo "dpkg: warning: forcing architecture '$ARCH'" >&2 + ;; + esac + + echo "Selecting previously unselected package $PKG." + echo "Unpacking $PKG ($VERSION) ..." + + if [ -f "$TMP/control/preinst" ]; then + TERM_ROOT="$ROOT" PREFIX="$ROOT" sh "$TMP/control/preinst" install || { + echo "dpkg: preinst script failed" >&2 + rm -rf "$TMP" + return 1 + } + fi + + echo "dpkg: extracting data archive..." + case "$DATA_ARCHIVE" in + *.gz) tar -tzf "$DATA_ARCHIVE" 2>/dev/null > "$TMP/filelist" ;; + *.xz) tar -tJf "$DATA_ARCHIVE" 2>/dev/null > "$TMP/filelist" ;; + *) tar -tf "$DATA_ARCHIVE" 2>/dev/null > "$TMP/filelist" ;; + esac + awk '{ sub(/^\.\//,""); if ($0 != "") print }' "$TMP/filelist" > "$INFO/$PKG.list" + DATA_OK=0 + case "$DATA_ARCHIVE" in + *.gz) tar -xzf "$DATA_ARCHIVE" -C "$ROOT" --no-same-owner 2>/dev/null && DATA_OK=1 ;; + *.xz) tar -xJf "$DATA_ARCHIVE" -C "$ROOT" --no-same-owner 2>/dev/null && DATA_OK=1 ;; + *) tar -xf "$DATA_ARCHIVE" -C "$ROOT" --no-same-owner 2>/dev/null && DATA_OK=1 ;; + esac + if [ $DATA_OK -ne 1 ]; then + case "$DATA_ARCHIVE" in + *.gz) tar -xzf "$DATA_ARCHIVE" -C "$ROOT" 2>/dev/null && DATA_OK=1 ;; + *.xz) tar -xJf "$DATA_ARCHIVE" -C "$ROOT" 2>/dev/null && DATA_OK=1 ;; + *) tar -xf "$DATA_ARCHIVE" -C "$ROOT" 2>/dev/null && DATA_OK=1 ;; + esac + fi + if [ $DATA_OK -ne 1 ]; then + echo "dpkg: failed to extract data archive" >&2 + rm -rf "$TMP" + return 1 + fi + + # Warn about native Mach-O payloads: a-Shell cannot execute them. + if [ -f "$INFO/$PKG.list" ]; then + for f in $(cat "$INFO/$PKG.list"); do + case "$f" in + bin/*|sbin/*|usr/bin/*|usr/sbin/*|usr/libexec/*) + if file "$ROOT/$f" 2>/dev/null | grep -q 'Mach-O'; then + echo "dpkg: note: $f is a native Mach-O executable; a-Shell cannot run it." >&2 + fi + ;; + esac + done + fi + + remove_status "$PKG" + INSTALLED_SIZE=$(du -sk "$ROOT" 2>/dev/null) + INSTALLED_SIZE=${INSTALLED_SIZE%%[!0-9]*} + append_status + + for script in preinst postinst prerm postrm; do + if [ -f "$TMP/control/$script" ]; then + cp "$TMP/control/$script" "$INFO/$PKG.$script" + chmod +x "$INFO/$PKG.$script" + fi + done + + if [ -f "$TMP/control/postinst" ]; then + TERM_ROOT="$ROOT" PREFIX="$ROOT" sh "$TMP/control/postinst" configure || { + echo "dpkg: postinst script failed" >&2 + rm -rf "$TMP" + return 1 + } + fi + + echo "Setting up $PKG ($VERSION) ..." + rm -rf "$TMP" + return 0 +} + +remove_pkg() { + PKG="$1" + [ -n "$PKG" ] || { usage; return 2; } + ensure + STANZA=$(stanza_for "$PKG") + if [ -z "$STANZA" ]; then + echo "dpkg: package '$PKG' is not installed" >&2 + return 1 + fi + if [ -f "$INFO/$PKG.prerm" ]; then + ( TERM_ROOT="$ROOT" PREFIX="$ROOT" sh "$INFO/$PKG.prerm" remove ) || true + fi + if [ -f "$INFO/$PKG.list" ]; then + for f in $(cat "$INFO/$PKG.list"); do + case "$f" in + ""|/*|../*|*/../*) continue ;; + esac + [ -d "$ROOT/$f" ] && continue + rm -f "$ROOT/$f" + done + fi + if [ -f "$INFO/$PKG.postrm" ]; then + ( TERM_ROOT="$ROOT" PREFIX="$ROOT" sh "$INFO/$PKG.postrm" remove ) || true + fi + remove_status "$PKG" + rm -f "$INFO/$PKG.list" "$INFO/$PKG.preinst" "$INFO/$PKG.postinst" \ + "$INFO/$PKG.prerm" "$INFO/$PKG.postrm" + echo "Removing $PKG ..." + echo "Purging configuration files for $PKG ..." + return 0 +} + +list_packages() { + ensure + echo "Desired=Unknown/Install/Remove/Purge/Hold" + echo "| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend" + echo "|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)" + echo "||/ Name Version Architecture Description" + echo "+++-====================-================-================-=================================" + awk 'BEGIN{RS="";FS="\n"} { + p="";v="";a="";d="";s=""; + for (i=1;i<=NF;i++) { + if ($i ~ /^Package: /) p=substr($i,10); + if ($i ~ /^Version: /) v=substr($i,10); + if ($i ~ /^Architecture: /) a=substr($i,14); + if ($i ~ /^Description: /) d=substr($i,14); + if ($i ~ /^Status: /) s=substr($i,9); + } + if (s ~ /installed/) printf "ii %-20s %-16s %-16s %s\n", p, v, a, d; + }' "$STATUS" +} + +status_pkg() { + PKG="$1" + STANZA=$(stanza_for "$PKG") + if [ -z "$STANZA" ]; then + echo "dpkg-query: package '$PKG' is not installed" >&2 + return 1 + fi + printf '%s\n' "$STANZA" +} + +list_files() { + PKG="$1" + if [ ! -f "$INFO/$PKG.list" ]; then + echo "dpkg-query: package '$PKG' is not installed" >&2 + return 1 + fi + sed "s#^#/#" "$INFO/$PKG.list" +} + +extract_deb() { + DEB="$1"; DEST="$2" + [ -f "$DEB" ] || { echo "dpkg: cannot access '$DEB'" >&2; return 1; } + [ -n "$DEST" ] || { usage; return 2; } + TMP="$ROOT/tmp/dpkg-x.$$" + rm -rf "$TMP"; mkdir -p "$TMP" "$DEST" + cp "$DEB" "$TMP/pkg.deb" + ar_extract "$TMP/pkg.deb" "$TMP" + DATA="" + for f in "$TMP"/data.tar.*; do [ -f "$f" ] && { DATA="$f"; break; }; done + [ -n "$DATA" ] || { echo "dpkg: no data archive" >&2; rm -rf "$TMP"; return 1; } + tar -xf "$DATA" -C "$DEST" --no-same-owner 2>/dev/null || tar -xf "$DATA" -C "$DEST" 2>/dev/null + rm -rf "$TMP" +} + +contents_deb() { + DEB="$1" + [ -f "$DEB" ] || { echo "dpkg: cannot access '$DEB'" >&2; return 1; } + TMP="$ROOT/tmp/dpkg-c.$$" + rm -rf "$TMP"; mkdir -p "$TMP" + cp "$DEB" "$TMP/pkg.deb" + ar_extract "$TMP/pkg.deb" "$TMP" + DATA="" + for f in "$TMP"/data.tar.*; do [ -f "$f" ] && { DATA="$f"; break; }; done + [ -n "$DATA" ] || { echo "dpkg: no data archive" >&2; rm -rf "$TMP"; return 1; } + case "$DATA" in + *.gz) tar -tzf "$DATA" 2>/dev/null > "$TMP/contents" ;; + *.xz) tar -tJf "$DATA" 2>/dev/null > "$TMP/contents" ;; + *) tar -tf "$DATA" 2>/dev/null > "$TMP/contents" ;; + esac + awk '{ sub(/^\.\//,""); if ($0 != "") print }' "$TMP/contents" + rm -rf "$TMP" +} + +case "${1:-}" in + -i|--install) + shift + if [ "${1:-}" = "--force-architecture" ]; then FORCE_ARCH=1; shift; fi + [ -n "${1:-}" ] || { usage; exit 2; } + install_deb "$1" + ;; + -r|--remove|-P|--purge) + shift + remove_pkg "${1:-}" + ;; + -l|--list) + list_packages + ;; + -s|--status) + shift + status_pkg "${1:-}" + ;; + -L|--listfiles) + shift + list_files "${1:-}" + ;; + -x|--extract) + shift + extract_deb "${1:-}" "${2:-}" + ;; + --contents) + shift + contents_deb "${1:-}" + ;; + --print-architecture) + echo "iphoneos-arm64" + ;; + --force-architecture) + FORCE_ARCH=1 + shift + [ -n "${1:-}" ] && install_deb "$1" + ;; + --version|-V) + echo "dpkg 1.0 (Terminal native package manager)" + ;; + ""|-h|--help|help) + usage + ;; + *) + usage + exit 2 + ;; +esac diff --git a/env/dpkg-deb b/env/dpkg-deb new file mode 100755 index 0000000..a9fc7cd --- /dev/null +++ b/env/dpkg-deb @@ -0,0 +1,22 @@ +#!/bin/sh +# dpkg-deb compatibility wrapper (subset: -x, -c, --contents) +case "${1:-}" in + -x|--extract) + shift + sh "$APPDIR/bin/dpkg" -x "$1" "$2" +exit $? + ;; + -c|--contents) + shift + sh "$APPDIR/bin/dpkg" --contents "$1" +exit $? + ;; + -b|--build) + echo "dpkg-deb: use mkdeb [arch]" >&2 + exit 2 + ;; + *) + echo "usage: dpkg-deb -x | -c | (use mkdeb to build)" >&2 + exit 2 + ;; +esac diff --git a/env/mkdeb b/env/mkdeb new file mode 100755 index 0000000..dd96807 --- /dev/null +++ b/env/mkdeb @@ -0,0 +1,109 @@ +#!/bin/sh +# mkdeb - build a Terminal-compatible .deb package and add it to the local repo +# Usage: mkdeb [architecture] +# The payload directory is copied to the prefix root; put files under +# bin/, usr/bin/, lib/, share/, etc. Maintainer scripts may be placed in +# /DEBIAN/{preinst,postinst,prerm,postrm}. + +ROOT="${TERM_ROOT:-$HOME/Documents/.terminal}" +NAME="${1:-}" +VERSION="${2:-}" +PAYLOAD="${3:-}" +ARCH="${4:-iphoneos-arm64}" +MAINTAINER="${MKDEB_MAINTAINER:-Terminal User }" +DESCRIPTION="${MKDEB_DESCRIPTION:-$NAME plugin for Terminal}" + +usage() { + echo "usage: mkdeb [architecture]" >&2 + echo " architecture: iphoneos-arm64 (default), all, darwin-arm64" >&2 + exit 2 +} + +[ -n "$NAME" ] && [ -n "$VERSION" ] && [ -n "$PAYLOAD" ] || usage +[ -d "$PAYLOAD" ] || { echo "mkdeb: payload directory not found: $PAYLOAD" >&2; exit 1; } +case "$NAME" in + *[!A-Za-z0-9+.-]*|"") echo "mkdeb: invalid package name: $NAME" >&2; exit 1 ;; +esac + +echo "mkdeb: start $NAME $VERSION" +mkdir -p "$ROOT/repo/pool" "$ROOT/tmp" "$ROOT/var/lib/dpkg/info" +DEB="$ROOT/repo/pool/${NAME}_${VERSION}_${ARCH}.deb" +if python3 -c 'pass' >/dev/null 2>&1 && [ -f "$APPDIR/bin/pkgtool" ]; then + MKDEB_MAINTAINER="$MAINTAINER" MKDEB_DESCRIPTION="$DESCRIPTION" \ + python3 "$APPDIR/bin/pkgtool" build "$DEB" "$NAME" "$VERSION" "$ARCH" "$PAYLOAD" "${MKDEB_DEPENDS:-}" + exit $? +fi +TMP="$ROOT/tmp/mkdeb.$$" +rm -rf "$TMP" +mkdir -p "$TMP/DEBIAN" + +# Control file. +{ + echo "Package: $NAME" + echo "Version: $VERSION" + echo "Architecture: $ARCH" + echo "Maintainer: $MAINTAINER" + echo "Section: plugins" + echo "Priority: optional" + echo "Description: $DESCRIPTION" + [ -n "${MKDEB_DEPENDS:-}" ] && echo "Depends: $MKDEB_DEPENDS" +} > "$TMP/DEBIAN/control" + +# Optional maintainer scripts from the payload's DEBIAN directory. +for script in preinst postinst prerm postrm; do + if [ -f "$PAYLOAD/DEBIAN/$script" ]; then + cp "$PAYLOAD/DEBIAN/$script" "$TMP/DEBIAN/$script" + chmod +x "$TMP/DEBIAN/$script" + fi +done + +# Build the two tar archives. Copy the payload first (no shell pipeline; +# nested tar pipelines can stall inside a-Shell's in-process command model). +DATA_TMP="$TMP/data" +mkdir -p "$DATA_TMP" +echo "mkdeb: copying payload..." +cp -R "$PAYLOAD"/. "$DATA_TMP"/ 2>/dev/null +rm -rf "$DATA_TMP/DEBIAN" +echo "mkdeb: writing data archive..." +tar -czf "$TMP/data.tar.gz" -C "$DATA_TMP" . +echo "mkdeb: writing control archive..." +tar -czf "$TMP/control.tar.gz" -C "$TMP" DEBIAN +printf '2.0\n' > "$TMP/debian-binary" + +DEB="$ROOT/repo/pool/${NAME}_${VERSION}_${ARCH}.deb" +rm -f "$DEB" +echo "mkdeb: writing ar archive..." +rm -f "$DEB" +tar --format=ar -cf "$DEB" -C "$TMP" debian-binary control.tar.gz data.tar.gz >/dev/null 2>&1 +if [ ! -s "$DEB" ]; then + echo "mkdeb: tar ar writer unavailable; trying Python fallback..." >&2 + if python3 -c 'pass' >/dev/null 2>&1 && [ -f "$APPDIR/bin/ardeb" ]; then + python3 "$APPDIR/bin/ardeb" pack "$DEB" "$TMP/debian-binary" "$TMP/control.tar.gz" "$TMP/data.tar.gz" + fi +fi +if [ ! -s "$DEB" ]; then + echo "mkdeb: failed to create $DEB" >&2 + rm -rf "$TMP" + exit 1 +fi + +# Update Packages: append the new package stanza. +SIZE=$(wc -c < "$DEB" | tr -d ' ') +PACKAGES="$ROOT/repo/Packages" +touch "$PACKAGES" +{ + echo "Package: $NAME" + echo "Version: $VERSION" + echo "Architecture: $ARCH" + echo "Maintainer: $MAINTAINER" + echo "Section: plugins" + echo "Priority: optional" + echo "Filename: pool/$(basename "$DEB")" + echo "Size: $SIZE" + echo "Description: $DESCRIPTION" + [ -n "${MKDEB_DEPENDS:-}" ] && echo "Depends: $MKDEB_DEPENDS" + echo "" +} >> "$PACKAGES" + +rm -rf "$TMP" +echo "$DEB" diff --git a/env/pkgtool b/env/pkgtool new file mode 100644 index 0000000..dae3903 --- /dev/null +++ b/env/pkgtool @@ -0,0 +1,286 @@ +#!/usr/bin/env python3 +"""pkgtool - Python package backend for Terminal's native apt/dpkg. + +This avoids a-Shell's shell/tar/ar quirks for package construction and +extraction. It is used when Python 3 is available (the full a-Shell app has +it). Native Mach-O payloads are installed but flagged as non-runnable. +""" + +import io +import os +import shutil +import sys +import tarfile +import tempfile + +ROOT = os.environ.get("TERM_ROOT") or os.path.join(os.path.expanduser("~"), "Documents", ".terminal") +INFO = os.path.join(ROOT, "var", "lib", "dpkg", "info") +STATUS = os.path.join(ROOT, "var", "lib", "dpkg", "status") +PACKAGES = os.path.join(ROOT, "repo", "Packages") + + +def ar_pack(out_path, members): + with open(out_path, "wb") as out: + out.write(b"!\n") + for path in members: + data = open(path, "rb").read() + name = os.path.basename(path) + if len(name) > 15: + raise SystemExit("pkgtool: ar member name too long: " + name) + header = ( + name.ljust(16) + "0".ljust(12) + "0".ljust(6) + "0".ljust(6) + + "100644".ljust(8) + str(len(data)).ljust(10) + "`\n" + ).encode("ascii") + out.write(header) + out.write(data) + if len(data) & 1: + out.write(b"\n") + + +def ar_unpack(archive, dest): + data = open(archive, "rb").read() + if not data.startswith(b"!\n"): + raise SystemExit("pkgtool: not a Debian ar archive") + pos = 8 + while pos + 60 <= len(data): + header = data[pos:pos + 60] + pos += 60 + name = header[:16].decode("ascii", "ignore").strip().rstrip("/") + if not name: + continue + try: + size = int(header[48:58].decode("ascii", "ignore").strip() or "0") + except ValueError: + size = 0 + body = data[pos:pos + size] + pos += size + (size & 1) + if name in (".", ".."): + continue + open(os.path.join(dest, name), "wb").write(body) + + +def safe_extract(tar_path, dest): + os.makedirs(dest, exist_ok=True) + with tarfile.open(tar_path, "r:*") as tar: + for member in tar.getmembers(): + name = member.name.lstrip("./") + if not name or name.startswith("/") or ".." in name.split("/"): + continue + target = os.path.join(dest, name) + if member.isdir(): + os.makedirs(target, exist_ok=True) + elif member.isfile(): + os.makedirs(os.path.dirname(target), exist_ok=True) + src = tar.extractfile(member) + if src is None: + continue + with open(target, "wb") as out: + shutil.copyfileobj(src, out) + os.chmod(target, member.mode & 0o777) + elif member.issym(): + os.makedirs(os.path.dirname(target), exist_ok=True) + # Symlinks are installed relative to the package root. + try: + os.symlink(member.linkname, target) + except FileExistsError: + os.unlink(target) + os.symlink(member.linkname, target) + + +def parse_control(control_path): + fields = {} + with open(control_path, "r", errors="replace") as f: + for line in f: + if line.startswith(" ") or line.startswith("\t"): + continue + if ":" in line: + k, v = line.split(":", 1) + fields[k.strip()] = v.strip() + return fields + + +def append_packages(fields, filename): + os.makedirs(os.path.dirname(PACKAGES), exist_ok=True) + with open(PACKAGES, "a") as f: + f.write("Package: %s\n" % fields.get("Package", "")) + f.write("Version: %s\n" % fields.get("Version", "")) + f.write("Architecture: %s\n" % fields.get("Architecture", "iphoneos-arm64")) + f.write("Maintainer: %s\n" % fields.get("Maintainer", "unknown")) + f.write("Section: %s\n" % fields.get("Section", "plugins")) + f.write("Priority: %s\n" % fields.get("Priority", "optional")) + f.write("Filename: pool/%s\n" % os.path.basename(filename)) + f.write("Size: %d\n" % os.path.getsize(filename)) + if fields.get("Depends"): + f.write("Depends: %s\n" % fields["Depends"]) + f.write("Description: %s\n\n" % fields.get("Description", "")) + + +def build(out_path, name, version, arch, payload, depends=""): + os.makedirs(os.path.dirname(packages_dir()), exist_ok=True) + tmp = tempfile.mkdtemp(prefix="mkdeb.", dir=os.path.join(ROOT, "tmp")) + try: + control_dir = os.path.join(tmp, "DEBIAN") + os.makedirs(control_dir, exist_ok=True) + control = ( + "Package: %s\nVersion: %s\nArchitecture: %s\n" + "Maintainer: %s\nSection: plugins\nPriority: optional\n" + "Description: %s\n" + % (name, version, arch, + os.environ.get("MKDEB_MAINTAINER", "Terminal User "), + os.environ.get("MKDEB_DESCRIPTION", name + " plugin for Terminal")) + ) + if depends: + control += "Depends: %s\n" % depends + open(os.path.join(control_dir, "control"), "w").write(control) + + payload_debian = os.path.join(payload, "DEBIAN") + if os.path.isdir(payload_debian): + for script in ("preinst", "postinst", "prerm", "postrm"): + src = os.path.join(payload_debian, script) + if os.path.isfile(src): + shutil.copy(src, os.path.join(control_dir, script)) + + control_tar = os.path.join(tmp, "control.tar.gz") + with tarfile.open(control_tar, "w:gz") as tar: + for root, dirs, files in os.walk(control_dir): + for fn in files: + full = os.path.join(root, fn) + arc = os.path.relpath(full, tmp) + tar.add(full, arcname=arc) + + data_tar = os.path.join(tmp, "data.tar.gz") + with tarfile.open(data_tar, "w:gz") as tar: + for root, dirs, files in os.walk(payload): + dirs[:] = [d for d in dirs if not (root == payload and d == "DEBIAN")] + for fn in files: + full = os.path.join(root, fn) + arc = os.path.relpath(full, payload) + tar.add(full, arcname="./" + arc) + open(os.path.join(tmp, "debian-binary"), "w").write("2.0\n") + ar_pack(out_path, [os.path.join(tmp, "debian-binary"), control_tar, data_tar]) + + fields = parse_control(os.path.join(control_dir, "control")) + append_packages(fields, out_path) + print(out_path) + return 0 + finally: + shutil.rmtree(tmp, ignore_errors=True) + + +def packages_dir(): + return os.path.join(ROOT, "repo", "pool") + + +def install(deb): + if not os.path.isfile(deb): + print("pkgtool: cannot access archive %s" % deb, file=sys.stderr) + return 1 + os.makedirs(INFO, exist_ok=True) + os.makedirs(os.path.dirname(STATUS), exist_ok=True) + tmp = tempfile.mkdtemp(prefix="dpkg.", dir=os.path.join(ROOT, "tmp")) + try: + ar_unpack(deb, tmp) + control_tar = data_tar = None + for fn in os.listdir(tmp): + if fn.startswith("control.tar"): + control_tar = os.path.join(tmp, fn) + elif fn.startswith("data.tar"): + data_tar = os.path.join(tmp, fn) + if not control_tar or not data_tar: + print("pkgtool: missing control or data archive", file=sys.stderr) + return 1 + control_dir = os.path.join(tmp, "control") + safe_extract(control_tar, control_dir) + control_path = os.path.join(control_dir, "control") + if not os.path.isfile(control_path): + control_path = os.path.join(control_dir, "DEBIAN", "control") + if not os.path.isfile(control_path): + print("pkgtool: control file not found", file=sys.stderr) + return 1 + fields = parse_control(control_path) + pkg = fields.get("Package", "") + version = fields.get("Version", "") + arch = fields.get("Architecture", "iphoneos-arm64") + if not pkg or not version: + print("pkgtool: invalid control (Package/Version missing)", file=sys.stderr) + return 1 + if arch not in ("", "all", "iphoneos-arm64", "darwin-arm64", "a-shell"): + print("pkgtool: architecture '%s' is not native to iOS/Terminal" % arch, file=sys.stderr) + print("pkgtool: use the shell dpkg --force-architecture only for script packages", file=sys.stderr) + return 1 + + print("Selecting previously unselected package %s." % pkg) + print("Unpacking %s (%s) ..." % (pkg, version)) + safe_extract(data_tar, ROOT) + + file_list = [] + with tarfile.open(data_tar, "r:*") as tar: + for member in tar.getmembers(): + name = member.name.lstrip("./") + if name and not name.startswith("/") and ".." not in name.split("/"): + file_list.append(name) + if member.isfile() and any(part in ("bin", "sbin", "libexec") for part in name.split("/")): + full = os.path.join(ROOT, name) + try: + magic = open(full, "rb").read(4) + except OSError: + magic = b"" + if magic in (b"\xcf\xfa\xed\xfe", b"\xfe\xed\xfa\xcf"): + print("pkgtool: note: %s is a native Mach-O binary; a-Shell cannot run it." % name, file=sys.stderr) + open(os.path.join(INFO, pkg + ".list"), "w").write("\n".join(file_list) + "\n") + + # Maintainer scripts are kept for inspection/removal, but not executed: + # a-Shell has no fork/exec for arbitrary shell children in the Python + # backend. Script-only packages should use dpkg's shell path if needed. + for script in ("preinst", "postinst", "prerm", "postrm"): + src = os.path.join(control_dir, "DEBIAN", script) + if not os.path.isfile(src): + src = os.path.join(control_dir, script) + if os.path.isfile(src): + shutil.copy(src, os.path.join(INFO, pkg + "." + script)) + + # Replace the package stanza in the status database. + stanzas = [] + if os.path.isfile(STATUS): + with open(STATUS, "r", errors="replace") as f: + current = [] + for line in f: + if line.strip() == "": + if current: + stanzas.append("".join(current)) + current = [] + else: + current.append(line) + if current: + stanzas.append("".join(current)) + kept = [s for s in stanzas if not s.startswith("Package: %s\n" % pkg)] + kept.append( + "Package: %s\nStatus: install ok installed\nPriority: %s\nSection: %s\n" + "Maintainer: %s\nArchitecture: %s\nVersion: %s\nDescription: %s\n\n" + % (pkg, fields.get("Priority", "optional"), fields.get("Section", "plugins"), + fields.get("Maintainer", "unknown"), arch, version, + fields.get("Description", "")) + ) + open(STATUS, "w").write("\n".join(kept)) + print("Setting up %s (%s) ..." % (pkg, version)) + return 0 + finally: + shutil.rmtree(tmp, ignore_errors=True) + + +def main(): + if len(sys.argv) < 2: + print(__doc__) + return 2 + cmd = sys.argv[1] + if cmd == "build" and len(sys.argv) >= 7: + return build(sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5], sys.argv[6], + sys.argv[7] if len(sys.argv) > 7 else "") + if cmd == "install" and len(sys.argv) >= 3: + return install(sys.argv[2]) + print(__doc__) + return 2 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/env/plugin-run b/env/plugin-run new file mode 100644 index 0000000..eed65a6 --- /dev/null +++ b/env/plugin-run @@ -0,0 +1,32 @@ +#!/bin/sh +# plugin-run - run a native Terminal plugin safely. +# a-Shell's in-process command loader refuses standalone Mach-O binaries; +# script plugins and WebAssembly plugins can run. This wrapper gives a clear +# error instead of "command not found" for native packages. + +ROOT="${TERM_ROOT:-$HOME/Documents/.terminal}" +if [ $# -eq 0 ]; then + echo "usage: plugin-run [args...]" >&2 + exit 2 +fi + +CMD="$1" +shift +FOUND=$(which "$CMD" 2>/dev/null) +if [ -z "$FOUND" ]; then + echo "plugin-run: '$CMD' not found in PATH" >&2 + exit 127 +fi + +MAGIC=$(dd if="$FOUND" bs=4 count=1 2>/dev/null | od -An -tx1 2>/dev/null | tr -d ' \n') +case "$MAGIC" in + cffaedfe|feedfacf|cafebabe|bebafeca) + echo "plugin-run: '$CMD' is a native Mach-O executable." >&2 + echo "a-Shell does not execute standalone Mach-O binaries in its sandbox." >&2 + echo "Native Procursus/Havoc CLI packages require a jailbreak or a Linux emulator." >&2 + echo "Script plugins (#!/bin/sh, python, perl, lua, wasm) can run normally." >&2 + exit 126 + ;; +esac + +"$FOUND" "$@" diff --git a/env/termenv b/env/termenv new file mode 100755 index 0000000..6c71c92 --- /dev/null +++ b/env/termenv @@ -0,0 +1,222 @@ +#!/bin/sh +# termenv - independent native plugin environment for Terminal +# This is a POSIX sh environment, not a Linux userland. Packages are +# Terminal-compatible .deb files (scripts or iOS/Darwin arm64 binaries). + +ROOT="${TERM_ROOT:-$HOME/Documents/.terminal}" +APPDIR="${APPDIR:-/Applications/Terminal.app}" +PROFILE="$ROOT/etc/profile" +SOURCES="$ROOT/etc/apt/sources.list" + +usage() { + printf '%s\n' "Usage: termenv " + printf '%s\n' "" + printf '%s\n' " init Create the independent prefix and the local apt repository" + printf '%s\n' " status Show prefix, PATH, apt/dpkg and installed packages" + printf '%s\n' " enter Print the command that activates the environment" + printf '%s\n' " run Run a command inside the environment" + printf '%s\n' " on Add activation to ~/Documents/.profile" + printf '%s\n' " off Remove activation from ~/Documents/.profile" + printf '%s\n' " selftest init + apt update + install the sample \"hello\" package" + printf '%s\n' " clean Remove apt caches and temporary files" + printf '%s\n' "" + printf '%s\n' "Environment:" + printf '%s\n' " TERM_ROOT=~/Documents/.terminal" + printf '%s\n' " PREFIX=$TERM_ROOT" +} +ensure_dirs() { + mkdir -p "$ROOT/bin" "$ROOT/sbin" "$ROOT/lib" "$ROOT/include" \ + "$ROOT/share/man" "$ROOT/etc/apt" \ + "$ROOT/var/lib/dpkg/info" "$ROOT/var/lib/apt/lists" \ + "$ROOT/var/cache/apt/archives" "$ROOT/var/log" \ + "$ROOT/tmp" "$ROOT/repo/pool" "$ROOT/home" + [ -f "$ROOT/var/lib/dpkg/status" ] || : > "$ROOT/var/lib/dpkg/status" +} + +write_profile() { + if [ ! -f "$PROFILE" ]; then + cat > "$PROFILE" < "$SOURCES" + return + fi + TMP="$ROOT/tmp/sources.$$" + awk -v desired="$LOCAL_LINE" ' + /^deb .*file:\/\/.*\/\.terminal\/repo/ { print desired; found=1; next } + { print } + END { if (!found) print desired } + ' "$SOURCES" > "$TMP" + mv "$TMP" "$SOURCES" + if ! grep -qF "https://repo.procurs.us/" "$SOURCES"; then + printf '%s\n' "$PROCURUS_LINE" >> "$SOURCES" + fi + if ! grep -qF "https://repo.havoc.app/" "$SOURCES"; then + printf '%s\n' "$HAVOC_LINE" >> "$SOURCES" + fi +} + +make_sample() { + if grep -q '^Package: hello$' "$ROOT/repo/Packages" 2>/dev/null; then + return 0 + fi + SAMPLE="$ROOT/share/termenv/samples/hello" + mkdir -p "$SAMPLE/bin" + cat > "$SAMPLE/bin/hello" << 'EOF' +#!/bin/sh +echo "Hello from the Terminal plugin environment." +echo "PREFIX=$PREFIX" +echo "TERM_ROOT=$TERM_ROOT" +if [ -d "$HOME/Documents/_sandbox" ]; then + echo "Sandbox escape: available (see $HOME/Documents/_sandbox)" +fi +EOF + chmod +x "$SAMPLE/bin/hello" + if [ -f "$APPDIR/bin/mkdeb" ]; then + sh "$APPDIR/bin/mkdeb" hello 1.0.0 "$SAMPLE" iphoneos-arm64 + echo "termenv: mkdeb exit=$?" + fi +} + +do_init() { + echo "termenv: creating directories..." + ensure_dirs + echo "termenv: writing profile/sources..." + write_profile + write_sources + [ -f "$ROOT/repo/Packages" ] || : > "$ROOT/repo/Packages" + echo "termenv: creating sample package..." + make_sample + echo "termenv: sample ready" + echo "Prefix: $ROOT" + echo "Profile: $PROFILE" + echo "Run: source \"$PROFILE\" (or: termenv on)" +} + +do_status() { + ensure_dirs + echo "Terminal native plugin environment" + echo " prefix: $ROOT" + echo " profile: $PROFILE" + echo " apt: $APPDIR/bin/apt" + echo " dpkg: $APPDIR/bin/dpkg" + echo " sources: $SOURCES" + if [ -f "$SOURCES" ]; then + sed 's/^/ /' "$SOURCES" + fi + echo " packages:" + if [ -s "$ROOT/var/lib/dpkg/status" ]; then + awk '/^Package: /{printf " %s", substr($0,10)} /^Version: /{printf " %s", substr($0,10)} /^Status: /{status=substr($0,9)} /^$/{if(status ~ /installed/) print ""}' "$ROOT/var/lib/dpkg/status" + else + echo " (none)" + fi + echo " sandbox: $HOME/Documents/_sandbox" +} + +do_run() { + if [ $# -eq 0 ]; then + echo "usage: termenv run " >&2 + exit 2 + fi + if [ -f "$PROFILE" ]; then + . "$PROFILE" + fi + "$@" +} + +do_on() { + do_init + PROFILE_FILE="$HOME/Documents/.profile" + MARK_BEGIN="# >>> Terminal plugin environment >>>" + MARK_END="# <<< Terminal plugin environment <<<" + if grep -qF "$MARK_BEGIN" "$PROFILE_FILE" 2>/dev/null; then + echo "Activation already present in $PROFILE_FILE" + return 0 + fi + { + echo "$MARK_BEGIN" + echo "source \"\$HOME/Documents/.terminal/etc/profile\"" + echo "$MARK_END" + } >> "$PROFILE_FILE" + echo "Activation added to $PROFILE_FILE" +} + +do_off() { + PROFILE_FILE="$HOME/Documents/.profile" + if [ ! -f "$PROFILE_FILE" ]; then + echo "No $PROFILE_FILE" + return 0 + fi + TMP="$ROOT/tmp/profile.$$" + awk ' + /# >>> Terminal plugin environment >>>/ {skip=1; next} + /# <<< Terminal plugin environment << "$TMP" + mv "$TMP" "$PROFILE_FILE" + echo "Activation removed from $PROFILE_FILE" +} + +do_clean() { + rm -rf "$ROOT/tmp"/* + rm -f "$ROOT/var/cache/apt/archives/"*.deb + echo "Cleaned caches" +} + +do_selftest() { + do_init + . "$PROFILE" + echo "=== apt update ===" + APT_SKIP_REMOTE=1 sh "$APPDIR/bin/apt" update + echo "=== apt install hello ===" + sh "$APPDIR/bin/apt" install hello + echo "=== hello ===" + hello + echo "=== installed packages ===" + sh "$APPDIR/bin/apt" list --installed + echo "=== dpkg -l ===" + sh "$APPDIR/bin/dpkg" -l +} + +case "${1:-}" in + init) do_init ;; + status) do_status ;; + enter) echo "source \"$PROFILE\"" ;; + run) shift; do_run "$@" ;; + on) do_on ;; + off) do_off ;; + clean) do_clean ;; + selftest) do_selftest ;; + ""|-h|--help|help) usage ;; + *) usage; exit 2 ;; +esac diff --git a/icon/Assets.xcassets/Contents.json b/icon/Assets.xcassets/Contents.json new file mode 100644 index 0000000..c47b5f2 --- /dev/null +++ b/icon/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/icon/Assets.xcassets/DisplayIcon.appiconset/Contents.json b/icon/Assets.xcassets/DisplayIcon.appiconset/Contents.json new file mode 100644 index 0000000..4988cff --- /dev/null +++ b/icon/Assets.xcassets/DisplayIcon.appiconset/Contents.json @@ -0,0 +1,116 @@ +{ + "images": [ + { + "filename": "DisplayIcon20x20@2x.png", + "idiom": "iphone", + "scale": "2x", + "size": "20x20" + }, + { + "filename": "DisplayIcon20x20@3x.png", + "idiom": "iphone", + "scale": "3x", + "size": "20x20" + }, + { + "filename": "DisplayIcon29x29@2x.png", + "idiom": "iphone", + "scale": "2x", + "size": "29x29" + }, + { + "filename": "DisplayIcon29x29@3x.png", + "idiom": "iphone", + "scale": "3x", + "size": "29x29" + }, + { + "filename": "DisplayIcon40x40@2x.png", + "idiom": "iphone", + "scale": "2x", + "size": "40x40" + }, + { + "filename": "DisplayIcon40x40@3x.png", + "idiom": "iphone", + "scale": "3x", + "size": "40x40" + }, + { + "filename": "DisplayIcon60x60@2x.png", + "idiom": "iphone", + "scale": "2x", + "size": "60x60" + }, + { + "filename": "DisplayIcon60x60@3x.png", + "idiom": "iphone", + "scale": "3x", + "size": "60x60" + }, + { + "filename": "DisplayIcon20x20~ipad.png", + "idiom": "ipad", + "scale": "1x", + "size": "20x20" + }, + { + "filename": "DisplayIcon20x20@2x~ipad.png", + "idiom": "ipad", + "scale": "2x", + "size": "20x20" + }, + { + "filename": "DisplayIcon29x29~ipad.png", + "idiom": "ipad", + "scale": "1x", + "size": "29x29" + }, + { + "filename": "DisplayIcon29x29@2x~ipad.png", + "idiom": "ipad", + "scale": "2x", + "size": "29x29" + }, + { + "filename": "DisplayIcon40x40~ipad.png", + "idiom": "ipad", + "scale": "1x", + "size": "40x40" + }, + { + "filename": "DisplayIcon40x40@2x~ipad.png", + "idiom": "ipad", + "scale": "2x", + "size": "40x40" + }, + { + "filename": "DisplayIcon76x76~ipad.png", + "idiom": "ipad", + "scale": "1x", + "size": "76x76" + }, + { + "filename": "DisplayIcon76x76@2x~ipad.png", + "idiom": "ipad", + "scale": "2x", + "size": "76x76" + }, + { + "filename": "DisplayIcon83.5x83.5@2x~ipad.png", + "idiom": "ipad", + "scale": "2x", + "size": "83.5x83.5" + }, + { + "filename": "DisplayIcon1024.png", + "idiom": "ios-marketing", + "scale": "1x", + "size": "1024x1024" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/icon/Assets.xcassets/DisplayIcon.appiconset/DisplayIcon1024.png b/icon/Assets.xcassets/DisplayIcon.appiconset/DisplayIcon1024.png new file mode 100644 index 0000000000000000000000000000000000000000..d909c398bd0fdbbba2364ec50eb486f630ce9774 GIT binary patch literal 37918 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 FV1nwWoNoXC literal 0 HcmV?d00001 diff --git a/icon/Assets.xcassets/DisplayIcon.appiconset/DisplayIcon20x20@2x~ipad.png b/icon/Assets.xcassets/DisplayIcon.appiconset/DisplayIcon20x20@2x~ipad.png new file mode 100644 index 0000000000000000000000000000000000000000..bff46f30077c1f046d7e6aed004a086ba93d83e6 GIT binary patch literal 1399 zcmV--1&I2IP)g6s4ArwB%r{RGZI(s9FdTa_yZ7k&WKA-95`^V1P9bs zm3pP9swk)}D9U$}tT$fU&ok&fd%e4flQvb#nx<)%VTEl))lOyxt#l^{QlfcZ`vRZF z*?cIv9sFmR+5y5DNlONF9jKQTAw&=a#E|ECjcuK3KhBY!rwfLT6u-WI_5R1#FSNaz zU;Foe=)8Ll`HSAEpU>$J+B~46)}Zw>fTwj0gwEBq`8K+x>2X2rf(-NSkOv8v0x)IX zCCKYg9a&IJWihs*g$fq9-DTv5Nst7hSm)*U>WFFNG=PD7BNYNHJqAMT`M(+`^;Qk z99Hi@T7uz`(`php=!9jJ?z7ls0TsooZhj~*p!L}V)?|W~OtLR}$HHm2_d*Gb6Q4c8 zWC)Otsf}TcBG8JBK^gx&s0^UzG!dCJXCM&#st#c5?n>-J9jYHvW-fhoO?YDE)>8k$ zR<@p5g_X2A(u<%9X0mz808;POwR{O@4flme+QfQ);9004IcMRY^0Ko za2j4giKcJPe0uim=Wm+W0Py4Q9&+E2&nR^<=q;8DX6VjFgZ_5OaHZ0AB{{ep_CB1S zyRp!@7*bknKiJy%eP#3RI>iNIQ}7Weqt4|hdS`|++nl!UuKOa~iQ~%c0NClB9f4qX zHjJl$EuGo45)2yjf)`$$J#}NDdu>k7d5^yRW9`gZ;lBTz~-EXp!bp^RpG+dFYh z1>*_iAYsFdq$1r~3_2I1*6B8Ck!_?V&PVjy_!^_N?etEiadv*9M5xzVu#n|RowKwj?cwtr-m%hAm`jf@oXM>G9E9>_f4FgHHC;~FfKWne*D4$bzAO$qzAlm6 z@H5$u8y-g`p8fbY{IlmzX{w@yAsz>R_~bN63{vBif8A~Px}w6tJT;j~3UIavmh z(*WgkhA5=4rX3(^JYP0H<4S&yU1+mLM)Jxx*HxsMrg)SKR)PBOrzh*bt?G`l6Y7K^ zqalK;e%#DJ2e@H8mKV$gap8K+NI84aP*p$s-h?vT02t0+sFNy++VS?*B!TP`W+D{Q z^=>Zm0u`b{W*So%v2(Q$YV2wR2)n(0oH$Cd`y8d)F{4mA=rWTX-4J!qmP#S9)*S&7 zS=bLssny{DhRG&DOw2+lm8PkXvgGM0KcTfFICWm=x5#9=9p%XmFbnOI$>Qa|C{LlT zZ5t356htZt&+`BTksGJWBTQYo0z@)QqiCimHjOD7)g(%HmL5s3ZH=}Qt0I#M<=e=b zoQWE(lv0M#Oq`@vtNN@KEnF-YP7~Hz1uefYS-Ewi!`-dPL~%8Xvf5*hqfkiY?G7`0 zj3~?7Ju_9uh$7F6ZIfuN>_&}A)-b448a42?JMfudQf1#n_$H@JSJA?jTAt-_d}6s$ zh>|r&P8y$&$9h-u_wfpkl$bb4z=?=Di620$oY=2E{{xZ+T>Zx(T4n$M002ovPDHLk FV1nwWoNoXC literal 0 HcmV?d00001 diff --git a/icon/Assets.xcassets/DisplayIcon.appiconset/DisplayIcon20x20@3x.png b/icon/Assets.xcassets/DisplayIcon.appiconset/DisplayIcon20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..25c669ac36a7efb89b1526ddc48518493536fb54 GIT binary patch literal 2148 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 literal 0 HcmV?d00001 diff --git a/icon/Assets.xcassets/DisplayIcon.appiconset/DisplayIcon29x29@2x.png b/icon/Assets.xcassets/DisplayIcon.appiconset/DisplayIcon29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..cf229cec2d990861635ae6cfeb424e72d2460308 GIT binary patch literal 2027 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 FV1nwWoNoXC literal 0 HcmV?d00001 diff --git a/icon/Assets.xcassets/DisplayIcon.appiconset/DisplayIcon60x60@2x.png b/icon/Assets.xcassets/DisplayIcon.appiconset/DisplayIcon60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d14e2ea05cb69491a1ebedb9bc2c6fcf9bc08dd4 GIT binary patch literal 4860 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 wL>O`yB*KuxU~g~5WYi4ClEVh($ literal 0 HcmV?d00001 diff --git a/icon/Assets.xcassets/DisplayIcon.appiconset/DisplayIcon76x76@2x~ipad.png b/icon/Assets.xcassets/DisplayIcon.appiconset/DisplayIcon76x76@2x~ipad.png new file mode 100644 index 0000000000000000000000000000000000000000..d30e6eb157e8c8c2d80cd87ffe1b2e18b8322c66 GIT binary patch literal 6364 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 e6B5a>$NvLN7f#3qUSS{r0000s0Ol literal 0 HcmV?d00001 diff --git a/icon/Assets.xcassets/DisplayIcon.appiconset/DisplayIcon76x76~ipad.png b/icon/Assets.xcassets/DisplayIcon.appiconset/DisplayIcon76x76~ipad.png new file mode 100644 index 0000000000000000000000000000000000000000..568987db8671012bf99da478fa0552ad2d82b7de GIT binary patch literal 2803 zcmV1 zO>ARV6~5=(`~K|Mi4%`AlT2sY(NLJSOiR_G3fQm#sRbbxh)M{FC0$mmSyZeL8#V|e zgb)ihY!K=K2^iE$&<>>o6)mMdf=(&ZNyfh!``Lbe_uhl8#WKuGz$hARJ1T0>p7}&5#oUZFKfL5zD2`5H}-~Tbo~DJa>jh69mMk~ zx2?4#;>a3pN;&NOI{E?AngM6jB=C@*7SxVSVnGyZoDddK4?_P30a))7Uo*dxZCUZb zAV5>=N3!WFpLyuz&t3lc<%>24zfGUL#9#P9`sE*{fBcL?$f!m3V{Y~*8_Pf4NIjEd zk`^3yZQBB%K@`bnqC4Td_a{m8-2G=izMQr+ef9kM*G{k1mHPfS-TTg=t=KodY(Mp= zxE->kZ?EzV!H9WJFN;sP)YOZNP#kfR`{~bk`e`_jSZK^lM_;YzxP$8s ze@$jM^M6*=HN{+P|E4bg)`Ao!r*im2M96s(7DwT@nNuUz47zm6vn(riJP52I^}1u7 zcI~(7O=8SOXtZf#74s|b=KGo>6N2d`VS!_otM@ual6-No1OTLzjb<~-UPeJ?M?glQ zFP-v)5WCq92k2-DNqdL@V1f#=K$_|36aImsrY z$RR|3q<1;=FxeQZ3fsT@*!w3Vke`jD%qHz%E2%5DR>pSBLWl!p62_{IH zwdOnZa)&P31ww_1Y)|UDPRAS&x+oix0plJwJ807x=tFDD*cl#pht-vmzUy4iG7x}+ zY|4ASb-~^6wtsu0@oruDAqYelNimWUP=Xlkof0hINTorH)IMqCL2Z(InE(9x@}sM* z5B%yYrRuBY)(1_dHP{FYO;e~(um^`K>mljB2M_}R=;GmlG=w(S9j%(u+f1dOzVGx? zXK%k*tGryi{YEXUbpQbcl8ywcO=i-CIw#J;mp1HGI}sf*u(9>NU-@&1+0!?dclS0I z_v3?%#@7E?%RIDfuQ{d;Xi7lHJ(kZso^Ri1R^wDS&0oq%+BvAUdyB+~w~EaMrV=KL zJR1jYbFiRO?v!5Ku3js9=hMrd%w;dFxCK{t6e+TD_SvuB>z(o5e(rU&xN#nH5CXyDN?p$^IP ziw;6_^&G^3wv4xp+P6lF5R8g8LXor6=aw>;R?_E|>=j!_CdAW1qMT% zG54K-Otp34i)YrK+z7VY(wE%jJjH`s?b3_em8(Vn-*weAI*foOhYgA8_)W~B3o$Wy zzbW_trdmq3wMYpSsGZkqm8-?u|ELDVHZVYroEy<;txYwOD&0LMt7SLc9qt2CF$-wWtw2~lfgM6m;JK{*;WQ8 zLWFj5nrz^iTF1O5iwalM)Srt{F}@c$?Zam1T*h@SSde>o4Qw!t489*oZC-8@G3Beq zzjopyomh)PpLPtY_HGC{{J<3@4?NT5-m=KSgPif8BrM*=x~D!dY#SOgT8V zMK@&xnTNpanQR-UnR_mdyEubvPFxEE-Jj&*9jQWQApqUc#XoLyQ;zfv5sj5VJOC9< z2nEH?LCO~~zVCV%ax^s==$3x(NACcSUeHfrlSvbd7Yc> zF6ksN0+A8}GBguL7|&u3=x-cTi7_i~u1>Qf>x0&#LsVBC2FCSUPB#Te#t=zrlW!$s zmqxxynobh%-Wx;)CrB$}jas_dbrlAkdQk?A%<218(9|mAb}HDpX{U2R?L*+UNp1GTGj{I7aotdv z<{)tF^4indF_JWH57BQl(@U8H2ou6)O*U)p${FASEmyYcrdwh;fZSU*h@%#O(4UTg9^AXtLZM{2s`A zhwts;)mon}T;!;2w*;trutXfvF&u)v#jy2rSA&GuF>~fK@jvtb0>h@KTZn4Ln$lOoxW-Nqd-wL ziy#Ew*I5j`x{GO`?ltZUL2!Q5{yikNfT#}vgCS!$<=In`{V$J>7{ZxY5=Te>?i9gv zeb?g#T#UPT^i=a;B#xcfPWAvHu;Wa0f+R_In~lSz{{zwL=nP3&&HMlW002ovPDHLk FV1fY&U`qf1 literal 0 HcmV?d00001 diff --git a/icon/Assets.xcassets/DisplayIcon.appiconset/DisplayIcon83.5x83.5@2x~ipad.png b/icon/Assets.xcassets/DisplayIcon.appiconset/DisplayIcon83.5x83.5@2x~ipad.png new file mode 100644 index 0000000000000000000000000000000000000000..b675a5badd7f6db6e601fa53cc4843824f3c56f1 GIT binary patch literal 7042 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 literal 0 HcmV?d00001 diff --git a/icon/icon-master.png b/icon/icon-master.png new file mode 100644 index 0000000000000000000000000000000000000000..d909c398bd0fdbbba2364ec50eb486f630ce9774 GIT binary patch literal 37918 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�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

PUN=H7yOLHnB*pEoVwCudV&(qiyjn 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 U)R{7)z>ESj3d|_*f2P1c0sVAGivR!s literal 0 HcmV?d00001 diff --git a/icon/out/partial-info.plist b/icon/out/partial-info.plist new file mode 100644 index 0000000..22e6f7a --- /dev/null +++ b/icon/out/partial-info.plist @@ -0,0 +1,31 @@ + + + + + CFBundleIcons + + CFBundlePrimaryIcon + + CFBundleIconFiles + + DisplayIcon60x60 + + CFBundleIconName + DisplayIcon + + + CFBundleIcons~ipad + + CFBundlePrimaryIcon + + CFBundleIconFiles + + DisplayIcon60x60 + DisplayIcon76x76 + + CFBundleIconName + DisplayIcon + + + + diff --git a/scripts/build_dylib.sh b/scripts/build_dylib.sh new file mode 100644 index 0000000..6a6d05e --- /dev/null +++ b/scripts/build_dylib.sh @@ -0,0 +1,14 @@ +#!/bin/bash +# Build TerminalSBX.dylib for iOS arm64. +set -euo pipefail +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +SDK="$(xcrun --sdk iphoneos --show-sdk-path)" +mkdir -p "$ROOT/build" +xcrun --sdk iphoneos clang \ + -arch arm64 -miphoneos-version-min=15.0 -isysroot "$SDK" \ + -dynamiclib -fobjc-arc -fmodules -fblocks -O2 \ + -Wno-unused-parameter -Wno-arc-performSelector-leaks \ + -framework Foundation -framework Security -framework UIKit -framework Metal \ + -install_name @executable_path/Frameworks/TerminalSBX.dylib \ + -o "$ROOT/build/TerminalSBX.dylib" "$ROOT/src/TerminalSBX.m" +echo "$ROOT/build/TerminalSBX.dylib" diff --git a/scripts/ent.plist b/scripts/ent.plist new file mode 100644 index 0000000..7c915e5 --- /dev/null +++ b/scripts/ent.plist @@ -0,0 +1,15 @@ + + + +application-identifierNL6UD7G49R.com.cert.account.t260930000125 +com.apple.developer.team-identifierNL6UD7G49R +com.apple.security.application-groups +group.com.cert.account.t260930000125.01 +group.com.cert.account.t260930000125.02 +group.com.cert.account.t260930000125.03 +group.com.cert.account.t260930000125.04 +group.com.cert.account.t260930000125.05 + +keychain-access-groupsNL6UD7G49R.* +com.apple.developer.nfc.readersession.formatsTAG + diff --git a/scripts/inject_dylib.py b/scripts/inject_dylib.py new file mode 100644 index 0000000..b9a1346 --- /dev/null +++ b/scripts/inject_dylib.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python3 +"""Inject a weak LC_LOAD_DYLIB into the a-Shell main binary with LIEF.""" +import sys +import lief + +if len(sys.argv) != 3: + raise SystemExit("usage: inject_dylib.py ") + +path, dylib = sys.argv[1], sys.argv[2] +binary = lief.MachO.parse(path).at(0) +if dylib in [lib.name for lib in binary.libraries]: + print("already present") + raise SystemExit(0) +command = lief.MachO.DylibCommand.weak_lib(dylib) +result = binary.add(command) +binary.write(path) +print(result) diff --git a/scripts/sign_all.sh b/scripts/sign_all.sh new file mode 100755 index 0000000..a0a3a94 --- /dev/null +++ b/scripts/sign_all.sh @@ -0,0 +1,37 @@ +#!/bin/bash +# Reference signing pass: sign every framework with the same team, then the +# app with the supplied entitlements and provisioning profile. +# +# Usage: +# IDENTITY=... KEYCHAIN=... PROFILE=... ./sign_all.sh work/Terminal.app +set -euo pipefail +APP="${1:-work/Terminal.app}" +IDENTITY="${IDENTITY:?set IDENTITY}" +KEYCHAIN="${KEYCHAIN:-$HOME/Library/Keychains/login.keychain-db}" +ENT="${ENT:-scripts/ent.plist}" +PROFILE="${PROFILE:?set PROFILE}" + +find "$APP/Frameworks" "$APP/usr" "$APP/Library" -type f \ + \( -name '*.dylib' -o -name '*.so' -o -perm -111 \) -print0 2>/dev/null | +while IFS= read -r -d '' f; do + file -b "$f" | grep -q 'Mach-O' || continue + codesign --force --sign "$IDENTITY" --keychain "$KEYCHAIN" --timestamp=none "$f" +done + +find "$APP/Frameworks" -type d -name '*.framework' -print | + awk '{ print length($0) "\t" $0 }' | sort -rn | cut -f2- | +while IFS= read -r fw; do + codesign --force --sign "$IDENTITY" --keychain "$KEYCHAIN" --timestamp=none "$fw" +done + +for appex in "$APP"/PlugIns/*.appex; do + [ -d "$appex" ] || continue + cp "$PROFILE" "$appex/embedded.mobileprovision" + codesign --force --sign "$IDENTITY" --keychain "$KEYCHAIN" \ + --entitlements "$ENT" --generate-entitlement-der --timestamp=none "$appex" +done + +cp "$PROFILE" "$APP/embedded.mobileprovision" +codesign --force --sign "$IDENTITY" --keychain "$KEYCHAIN" \ + --entitlements "$ENT" --generate-entitlement-der --timestamp=none "$APP" +codesign --verify --strict --verbose=2 "$APP" diff --git a/src/TerminalSBX.m b/src/TerminalSBX.m new file mode 100644 index 0000000..3479118 --- /dev/null +++ b/src/TerminalSBX.m @@ -0,0 +1,2398 @@ +// +// TerminalSBX.m +// Terminal (a-Shell 2.3.2 full + worse_query) +// +// In-process commands and launch-time sandbox escape for a-Shell. +// Primary primitive: worse_query (forcequitOS), GPL-3.0. +// Fallback primitive: class-13 part-domain traversal (Veilpath / bad_query lineage). +// +// This file is loaded by the a-Shell binary at launch (weak LC_LOAD_DYLIB) and +// through commandDictionary.plist. It is not a standalone application. +// + +#import +#import +#import +#import +#import + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// --------------------------------------------------------------------------- +// Output streams +// --------------------------------------------------------------------------- + +static FILE *sbx_out(void) { + typedef FILE *(*ios_stream_fn)(void); + static ios_stream_fn out_fn = NULL; + static int tried = 0; + if (!tried) { + out_fn = (ios_stream_fn)dlsym(RTLD_DEFAULT, "ios_stdout"); + tried = 1; + } + if (out_fn) { + FILE *f = out_fn(); + if (f) return f; + } + FILE **tls = (FILE **)dlsym(RTLD_DEFAULT, "thread_stdout"); + if (tls && *tls) return *tls; + return stdout; +} + +static FILE *sbx_err(void) { + typedef FILE *(*ios_stream_fn)(void); + static ios_stream_fn err_fn = NULL; + static int tried = 0; + if (!tried) { + err_fn = (ios_stream_fn)dlsym(RTLD_DEFAULT, "ios_stderr"); + tried = 1; + } + if (err_fn) { + FILE *f = err_fn(); + if (f) return f; + } + FILE **tls = (FILE **)dlsym(RTLD_DEFAULT, "thread_stderr"); + if (tls && *tls) return *tls; + return stderr; +} + +static void sbx_printf(const char *fmt, ...) { + FILE *f = sbx_out(); + va_list ap; + va_start(ap, fmt); + vfprintf(f, fmt, ap); + va_end(ap); + fflush(f); +} + +static void sbx_eprintf(const char *fmt, ...) { + FILE *f = sbx_err(); + va_list ap; + va_start(ap, fmt); + vfprintf(f, fmt, ap); + va_end(ap); + fflush(f); +} + +// --------------------------------------------------------------------------- +// Launch progress UI +// --------------------------------------------------------------------------- + +@interface SBXProgressViewController : UIViewController +@property (nonatomic, strong) UIProgressView *progressView; +@property (nonatomic, strong) UILabel *titleLabel; +@property (nonatomic, strong) UILabel *statusLabel; +@property (nonatomic, strong) UILabel *percentLabel; +- (void)updateProgress:(double)value status:(NSString *)status; +@end + +@implementation SBXProgressViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + self.view.backgroundColor = [UIColor colorWithWhite:0.0 alpha:0.82]; + self.view.accessibilityViewIsModal = YES; + + UIView *card = [[UIView alloc] initWithFrame:CGRectZero]; + card.translatesAutoresizingMaskIntoConstraints = NO; + card.backgroundColor = [UIColor colorWithWhite:0.12 alpha:0.98]; + card.layer.cornerRadius = 18.0; + card.layer.masksToBounds = YES; + [self.view addSubview:card]; + + self.titleLabel = [[UILabel alloc] initWithFrame:CGRectZero]; + self.titleLabel.text = @"Terminal"; + self.titleLabel.font = [UIFont systemFontOfSize:24 weight:UIFontWeightSemibold]; + self.titleLabel.textColor = [UIColor whiteColor]; + self.titleLabel.textAlignment = NSTextAlignmentCenter; + + self.statusLabel = [[UILabel alloc] initWithFrame:CGRectZero]; + self.statusLabel.text = @"正在获取沙盒扩展…"; + self.statusLabel.font = [UIFont systemFontOfSize:14 weight:UIFontWeightRegular]; + self.statusLabel.textColor = [UIColor colorWithWhite:0.88 alpha:1.0]; + self.statusLabel.textAlignment = NSTextAlignmentCenter; + self.statusLabel.numberOfLines = 0; + + self.progressView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleDefault]; + self.progressView.translatesAutoresizingMaskIntoConstraints = NO; + self.progressView.progressTintColor = [UIColor systemGreenColor]; + self.progressView.trackTintColor = [UIColor colorWithWhite:0.30 alpha:1.0]; + self.progressView.progress = 0.0; + self.progressView.transform = CGAffineTransformMakeScale(1.0, 2.0); + self.progressView.layer.cornerRadius = 2.0; + self.progressView.clipsToBounds = YES; + + self.percentLabel = [[UILabel alloc] initWithFrame:CGRectZero]; + self.percentLabel.text = @"0%"; + self.percentLabel.font = [UIFont monospacedDigitSystemFontOfSize:14 weight:UIFontWeightMedium]; + self.percentLabel.textColor = [UIColor colorWithWhite:0.75 alpha:1.0]; + self.percentLabel.textAlignment = NSTextAlignmentCenter; + + UIStackView *stack = [[UIStackView alloc] initWithArrangedSubviews:@[ + self.titleLabel, self.statusLabel, self.progressView, self.percentLabel + ]]; + stack.translatesAutoresizingMaskIntoConstraints = NO; + stack.axis = UILayoutConstraintAxisVertical; + stack.alignment = UIStackViewAlignmentFill; + stack.spacing = 14.0; + [card addSubview:stack]; + + NSLayoutConstraint *width = [card.widthAnchor constraintEqualToAnchor:self.view.widthAnchor multiplier:0.86]; + width.priority = UILayoutPriorityDefaultHigh; + [NSLayoutConstraint activateConstraints:@[ + [card.centerXAnchor constraintEqualToAnchor:self.view.centerXAnchor], + [card.centerYAnchor constraintEqualToAnchor:self.view.centerYAnchor], + width, + [card.widthAnchor constraintLessThanOrEqualToConstant:420.0], + [stack.topAnchor constraintEqualToAnchor:card.topAnchor constant:28.0], + [stack.leadingAnchor constraintEqualToAnchor:card.leadingAnchor constant:24.0], + [stack.trailingAnchor constraintEqualToAnchor:card.trailingAnchor constant:-24.0], + [stack.bottomAnchor constraintEqualToAnchor:card.bottomAnchor constant:-28.0], + [self.progressView.heightAnchor constraintEqualToConstant:8.0], + ]]; +} + +- (void)updateProgress:(double)value status:(NSString *)status { + if (value < 0.0) value = 0.0; + if (value > 1.0) value = 1.0; + [self.progressView setProgress:(float)value animated:YES]; + self.percentLabel.text = [NSString stringWithFormat:@"%d%%", (int)(value * 100.0 + 0.5)]; + if (status.length > 0) self.statusLabel.text = status; +} + +@end + +static SBXProgressViewController *g_progressVC = nil; +static BOOL g_progressPresenting = NO; +static BOOL g_progressFinished = NO; +static BOOL g_progressEnabled = NO; +static double g_progressValue = 0.0; +static NSString *g_progressStatus = @"正在获取沙盒扩展…"; +static pthread_mutex_t g_progressLock = PTHREAD_MUTEX_INITIALIZER; + +static void sbx_open_sandbox_list(void); + +static UIWindow *sbx_key_window(void) { + UIApplication *app = [UIApplication sharedApplication]; + for (UIScene *scene in app.connectedScenes) { + if (![scene isKindOfClass:[UIWindowScene class]]) continue; + UIWindowScene *windowScene = (UIWindowScene *)scene; + for (UIWindow *window in windowScene.windows) { + if (window.isKeyWindow && !window.hidden) return window; + } + } + for (UIScene *scene in app.connectedScenes) { + if (![scene isKindOfClass:[UIWindowScene class]]) continue; + UIWindowScene *windowScene = (UIWindowScene *)scene; + for (UIWindow *window in windowScene.windows) { + if (!window.hidden) return window; + } + } + return nil; +} + +static void sbx_present_progress_now(void) { + if (g_progressVC != nil || g_progressPresenting || g_progressFinished) return; + UIWindow *window = sbx_key_window(); + if (window == nil || window.rootViewController == nil) return; + + UIViewController *root = window.rootViewController; + while (root.presentedViewController != nil) root = root.presentedViewController; + + pthread_mutex_lock(&g_progressLock); + double value = g_progressValue; + NSString *status = g_progressStatus; + pthread_mutex_unlock(&g_progressLock); + + [window endEditing:YES]; + + g_progressPresenting = YES; + SBXProgressViewController *vc = [[SBXProgressViewController alloc] initWithNibName:nil bundle:nil]; + vc.modalPresentationStyle = UIModalPresentationOverFullScreen; + vc.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; + if (@available(iOS 13.0, *)) vc.modalInPresentation = YES; + [vc updateProgress:value status:status]; + [root presentViewController:vc animated:NO completion:^{ + g_progressPresenting = NO; + if (g_progressFinished) { + [vc dismissViewControllerAnimated:NO completion:nil]; + return; + } + g_progressVC = vc; + pthread_mutex_lock(&g_progressLock); + double current = g_progressValue; + NSString *currentStatus = g_progressStatus; + pthread_mutex_unlock(&g_progressLock); + [vc updateProgress:current status:currentStatus]; + }]; + + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + if (g_progressVC == nil) g_progressPresenting = NO; + }); +} + +static void sbx_present_progress_retry(int attempts) { + if (g_progressVC != nil || g_progressFinished || attempts <= 0) return; + sbx_present_progress_now(); + if (g_progressVC == nil) { + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.25 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + sbx_present_progress_retry(attempts - 1); + }); + } +} + +static void sbx_show_progress(void) { + pthread_mutex_lock(&g_progressLock); + g_progressEnabled = YES; + g_progressFinished = NO; + g_progressValue = 0.01; + g_progressStatus = @"正在初始化沙盒环境…"; + pthread_mutex_unlock(&g_progressLock); + + dispatch_async(dispatch_get_main_queue(), ^{ + sbx_present_progress_retry(80); + }); +} + +static void sbx_progress_set(double value, NSString *status) { + pthread_mutex_lock(&g_progressLock); + if (!g_progressEnabled) { + pthread_mutex_unlock(&g_progressLock); + return; + } + g_progressValue = value; + if (status.length > 0) g_progressStatus = [status copy]; + pthread_mutex_unlock(&g_progressLock); + + dispatch_async(dispatch_get_main_queue(), ^{ + if (g_progressVC != nil) [g_progressVC updateProgress:value status:status]; + }); +} + +static void sbx_progress_finish(void) { + pthread_mutex_lock(&g_progressLock); + if (!g_progressEnabled) { + pthread_mutex_unlock(&g_progressLock); + return; + } + g_progressFinished = YES; + g_progressValue = 1.0; + g_progressStatus = @"完成,正在进入 _sandbox…"; + pthread_mutex_unlock(&g_progressLock); + + dispatch_async(dispatch_get_main_queue(), ^{ + SBXProgressViewController *vc = g_progressVC; + if (vc == nil) { + sbx_open_sandbox_list(); + return; + } + [vc updateProgress:1.0 status:@"完成,正在进入 _sandbox…"]; + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.45 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + if (g_progressVC == nil) { + sbx_open_sandbox_list(); + return; + } + SBXProgressViewController *current = g_progressVC; + g_progressVC = nil; + [current dismissViewControllerAnimated:YES completion:^{ + sbx_open_sandbox_list(); + }]; + }); + }); +} + +static void sbx_open_command_url(NSString *command) { + if (command.length == 0) return; + NSCharacterSet *allowed = [NSCharacterSet characterSetWithCharactersInString: + @"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~"]; + NSString *encoded = [command stringByAddingPercentEncodingWithAllowedCharacters:allowed]; + NSURL *url = [NSURL URLWithString:[@"ashell:" stringByAppendingString:encoded ?: @""]]; + if (url == nil) return; + NSLog(@"[TerminalSBX] opening command URL: %@", url.absoluteString); + [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:^(BOOL success) { + if (!success) NSLog(@"[TerminalSBX] could not open command URL: %@", command); + }]; +} + +static void sbx_open_sandbox_list(void) { + // Run both commands through "source" in one URL. This keeps the cwd + // change in the current shell session, and avoids relying on semicolon + // or "&&" parsing in a-Shell's URL command path. + NSString *docs = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]; + NSString *scriptPath = [docs stringByAppendingPathComponent:@".sbx_start"]; + NSString *script = @"clear\ncd ~/Documents/_sandbox\nls\n"; + [script writeToFile:scriptPath atomically:YES encoding:NSUTF8StringEncoding error:NULL]; + sbx_open_command_url(@"source ~/Documents/.sbx_start"); +} + +// --------------------------------------------------------------------------- +// Global state +// --------------------------------------------------------------------------- + +static pthread_mutex_t g_lock = PTHREAD_MUTEX_INITIALIZER; // handles / group / state +static pthread_mutex_t g_query_lock = PTHREAD_MUTEX_INITIALIZER; // one containermanager query at a time +static pthread_mutex_t g_mount_lock = PTHREAD_MUTEX_INITIALIZER; // serialise automount + +static NSMutableArray *g_handles = nil; +static NSMutableSet *g_accessible_roots = nil; +static NSString *g_group = nil; +static BOOL g_mount_done = NO; +static BOOL g_mount_running = NO; +static int64_t g_mount_mounted = 0; +static int64_t g_mount_failed = 0; + +static void sbx_mark_root(NSString *root) { + pthread_mutex_lock(&g_lock); + if (g_accessible_roots == nil) g_accessible_roots = [NSMutableSet set]; + [g_accessible_roots addObject:root]; + pthread_mutex_unlock(&g_lock); +} + +static BOOL sbx_root_accessible(NSString *root) { + pthread_mutex_lock(&g_lock); + BOOL value = [g_accessible_roots containsObject:root]; + pthread_mutex_unlock(&g_lock); + return value; +} + +// --------------------------------------------------------------------------- +// Path helpers +// --------------------------------------------------------------------------- + +static NSString *sbx_canonical(NSString *raw) { + if (raw == nil) return @""; + NSString *path = [raw stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + if (path.length == 0) return @""; + if ([path hasPrefix:@"file://"]) { + NSURL *url = [NSURL URLWithString:path]; + if (url.path.length > 0) path = url.path; + } + if (![path hasPrefix:@"/"]) { + NSString *cwd = [[NSFileManager defaultManager] currentDirectoryPath]; + if (cwd.length == 0) cwd = NSHomeDirectory(); + path = [cwd stringByAppendingPathComponent:path]; + } + path = [path stringByStandardizingPath]; + if ([path isEqualToString:@"/var"] || [path hasPrefix:@"/var/"]) { + path = [@"/private" stringByAppendingString:path]; + } + while ([path hasPrefix:@"/private/private/"]) { + path = [@"/private" stringByAppendingString:[path substringFromIndex:@"/private".length]]; + } + return path; +} + +static NSString *sbx_display(NSString *raw) { + NSString *path = sbx_canonical(raw); + if ([path isEqualToString:@"/private/var"]) return @"/var"; + if ([path hasPrefix:@"/private/var/"]) { + return [@"/var" stringByAppendingString:[path substringFromIndex:@"/private/var".length]]; + } + return path; +} + +static BOOL sbx_is_own_path(NSString *path) { + NSString *home = sbx_canonical(NSHomeDirectory()); + if (path.length == 0 || home.length == 0) return NO; + if ([path isEqualToString:home]) return YES; + return [path hasPrefix:[home stringByAppendingString:@"/"]]; +} + +static NSString *sbx_mount_root(void) { + return [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/_sandbox"]; +} + +static BOOL sbx_path_exists(NSString *path) { + struct stat st; + return lstat(path.fileSystemRepresentation, &st) == 0; +} + +static BOOL sbx_path_is_dir(NSString *path) { + struct stat st; + if (lstat(path.fileSystemRepresentation, &st) != 0) return NO; + return S_ISDIR(st.st_mode) != 0; +} + +// --------------------------------------------------------------------------- +// App Group resolution +// --------------------------------------------------------------------------- + +static NSArray *sbx_groups_from_profile(void) { + NSString *profile = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"embedded.mobileprovision"]; + NSData *data = [NSData dataWithContentsOfFile:profile]; + if (data.length == 0) return @[]; + + NSData *startTag = [@"" dataUsingEncoding:NSUTF8StringEncoding]; + NSRange start = [data rangeOfData:startTag options:0 range:NSMakeRange(0, data.length)]; + if (start.location == NSNotFound) return @[]; + NSRange end = [data rangeOfData:endTag options:0 + range:NSMakeRange(start.location, data.length - start.location)]; + if (end.location == NSNotFound) return @[]; + NSRange full = NSMakeRange(start.location, NSMaxRange(end) - start.location); + NSData *plistData = [data subdataWithRange:full]; + + id plist = [NSPropertyListSerialization propertyListWithData:plistData + options:NSPropertyListImmutable + format:NULL + error:NULL]; + if (![plist isKindOfClass:[NSDictionary class]]) return @[]; + id ent = ((NSDictionary *)plist)[@"Entitlements"]; + if (![ent isKindOfClass:[NSDictionary class]]) return @[]; + id groups = ((NSDictionary *)ent)[@"com.apple.security.application-groups"]; + if (![groups isKindOfClass:[NSArray class]]) return @[]; + NSMutableArray *out = [NSMutableArray array]; + for (id g in (NSArray *)groups) { + if ([g isKindOfClass:[NSString class]]) [out addObject:g]; + } + return out; +} + +static NSArray *sbx_groups_from_entitlements(void) { + void *sec = dlopen("/System/Library/Frameworks/Security.framework/Security", RTLD_LAZY); + if (!sec) return @[]; + + typedef void *(*task_create_fn)(CFAllocatorRef); + typedef CFTypeRef (*task_copy_fn)(void *, CFStringRef, CFErrorRef *); + task_create_fn create = (task_create_fn)dlsym(sec, "SecTaskCreateFromSelf"); + task_copy_fn copy = (task_copy_fn)dlsym(sec, "SecTaskCopyValueForEntitlement"); + if (!create || !copy) return @[]; + + void *task = create(NULL); + if (!task) return @[]; + CFTypeRef value = copy(task, CFSTR("com.apple.security.application-groups"), NULL); + NSMutableArray *out = [NSMutableArray array]; + if (value) { + if (CFGetTypeID(value) == CFArrayGetTypeID()) { + NSArray *arr = (__bridge NSArray *)value; + for (id g in arr) { + if ([g isKindOfClass:[NSString class]]) [out addObject:g]; + } + } + CFRelease(value); + } + CFRelease(task); + return out; +} + +static void sbx_resolve_group(void) { + pthread_mutex_lock(&g_lock); + if (g_group != nil) { + pthread_mutex_unlock(&g_lock); + return; + } + pthread_mutex_unlock(&g_lock); + + NSMutableArray *candidates = [NSMutableArray array]; + void (^add)(id) = ^(id value) { + if ([value isKindOfClass:[NSString class]] && [(NSString *)value length] > 0 && + ![candidates containsObject:value]) { + [candidates addObject:value]; + } + }; + + add([[NSBundle mainBundle] objectForInfoDictionaryKey:@"AppGroupIdentifier"]); + for (NSString *g in sbx_groups_from_entitlements()) add(g); + for (NSString *g in sbx_groups_from_profile()) add(g); + + // Groups provisioned for the signing identity used by this workspace. + add(@"group.com.cert.account.t260930000125.01"); + add(@"group.com.cert.account.t260930000125.02"); + add(@"group.com.cert.account.t260930000125.03"); + add(@"group.com.cert.account.t260930000125.04"); + add(@"group.com.cert.account.t260930000125.05"); + add(@"group.AsheKube.a-Shell"); + + NSFileManager *fm = [NSFileManager defaultManager]; + // The group container is sometimes not visible during the first few + // hundred milliseconds of app launch. Retry briefly so commands issued + // immediately by a URL or .profile do not race the sandbox setup. + for (int attempt = 0; attempt < 15; attempt++) { + for (NSString *group in candidates) { + NSURL *url = [fm containerURLForSecurityApplicationGroupIdentifier:group]; + if (!url) continue; + NSURL *library = [url URLByAppendingPathComponent:@"Library" isDirectory:YES]; + [fm createDirectoryAtURL:library withIntermediateDirectories:YES attributes:nil error:NULL]; + pthread_mutex_lock(&g_lock); + g_group = [group copy]; + pthread_mutex_unlock(&g_lock); + NSLog(@"[TerminalSBX] app group: %@ at %@", group, url.path); + return; + } + usleep(100000); + } + + NSLog(@"[TerminalSBX] no accessible app group; falling back to class-13 primitive"); +} + +static NSString *sbx_group(void) { + pthread_mutex_lock(&g_lock); + NSString *group = g_group; + pthread_mutex_unlock(&g_lock); + if (group == nil) { + sbx_resolve_group(); + pthread_mutex_lock(&g_lock); + group = g_group; + pthread_mutex_unlock(&g_lock); + } + return group; +} + +// --------------------------------------------------------------------------- +// worse_query (forcequitOS, GPL-3.0) +// --------------------------------------------------------------------------- + +typedef void *(*container_query_create_fn)(void); +typedef void (*container_query_set_class_fn)(void *, uint64_t); +typedef void (*container_query_set_identifiers_fn)(void *, xpc_object_t); +typedef void (*container_query_set_flags_fn)(void *, uint64_t); +typedef void (*container_query_set_part_fn)(void *, uint64_t); +typedef void (*container_query_set_part_domain_fn)(void *, const char *); +typedef void *(*container_query_get_single_result_fn)(void *); +typedef void (*container_query_iterate_results_sync_fn)(void *, void (^)(void *)); +typedef void (*container_query_free_fn)(void *); +typedef char *(*container_copy_sandbox_token_fn)(void *); +typedef const char *(*container_object_get_path_fn)(void *); +typedef const char *(*container_object_get_identifier_fn)(void *); +typedef int64_t (*sandbox_extension_consume_fn)(const char *); +typedef int (*sandbox_extension_release_fn)(int64_t); + +static void sbx_clean_group_caches(NSString *group) { + if (group.length == 0) return; + NSFileManager *fm = [NSFileManager defaultManager]; + NSURL *root = [fm containerURLForSecurityApplicationGroupIdentifier:group]; + if (!root) return; + NSURL *caches = [root URLByAppendingPathComponent:@"Library/Caches" isDirectory:YES]; + [fm removeItemAtURL:caches error:NULL]; + [fm createDirectoryAtURL:caches withIntermediateDirectories:NO attributes:nil error:NULL]; +} + +static int64_t sbx_worse_query(NSString *target, bool alt_flags, bool create_dir) { + if (target.length == 0 || ![target hasPrefix:@"/"]) return -255; + if (!create_dir) { + struct stat st; + if (lstat(target.fileSystemRepresentation, &st) != 0) return -255; + } + + NSString *group = sbx_group(); + if (group.length == 0) return -1; + + NSFileManager *fm = [NSFileManager defaultManager]; + NSURL *groupRoot = [fm containerURLForSecurityApplicationGroupIdentifier:group]; + if (!groupRoot) return -1; + NSString *caches = [[groupRoot URLByAppendingPathComponent:@"Library/Caches"] path]; + + void *mgr = dlopen("/usr/lib/system/libsystem_containermanager.dylib", RTLD_NOW | RTLD_LOCAL); + if (!mgr) return -2; + + container_query_create_fn query_create = (container_query_create_fn)dlsym(mgr, "container_query_create"); + container_query_set_class_fn query_set_class = (container_query_set_class_fn)dlsym(mgr, "container_query_set_class"); + container_query_set_identifiers_fn query_set_group_identifiers = + (container_query_set_identifiers_fn)dlsym(mgr, "container_query_set_group_identifiers"); + container_query_set_flags_fn query_set_flags = + (container_query_set_flags_fn)dlsym(mgr, "container_query_operation_set_flags"); + container_query_set_part_fn query_set_part = + (container_query_set_part_fn)dlsym(mgr, "container_query_operation_set_part"); + container_query_get_single_result_fn query_get_single_result = + (container_query_get_single_result_fn)dlsym(mgr, "container_query_get_single_result"); + container_query_free_fn query_free = (container_query_free_fn)dlsym(mgr, "container_query_free"); + container_copy_sandbox_token_fn copy_sandbox_token = + (container_copy_sandbox_token_fn)dlsym(mgr, "container_copy_sandbox_token"); + sandbox_extension_consume_fn consume_extension = + (sandbox_extension_consume_fn)dlsym(RTLD_DEFAULT, "sandbox_extension_consume"); + + if (!query_create || !query_set_class || !query_set_group_identifiers || !query_set_flags || + !query_set_part || !query_get_single_result || !query_free || !copy_sandbox_token || + !consume_extension) { + dlclose(mgr); + return -2; + } + + void *query = query_create(); + if (!query) { + dlclose(mgr); + return -3; + } + + xpc_object_t identifier = xpc_string_create(group.UTF8String); + query_set_class(query, 7); // app group + query_set_group_identifiers(query, identifier); + query_set_part(query, 3); // Library/Caches + + if (alt_flags) { + query_set_flags(query, 0x0000000800000000ULL); + } else { + query_set_flags(query, 0x0000008000000000ULL); + } + + [fm removeItemAtPath:caches error:NULL]; + if (![fm createSymbolicLinkAtPath:caches withDestinationPath:target error:NULL]) { + query_free(query); + dlclose(mgr); + return -4; + } + + void *result = query_get_single_result(query); + if (!result) { + query_free(query); + dlclose(mgr); + sbx_clean_group_caches(group); + return -5; + } + + char *token = copy_sandbox_token(result); + if (!token) { + query_free(query); + dlclose(mgr); + sbx_clean_group_caches(group); + return -6; + } + + int64_t handle = consume_extension(token); + free(token); + query_free(query); + dlclose(mgr); + sbx_clean_group_caches(group); + return handle; +} + +static void sbx_release_handle(int64_t handle) { + if (handle <= 0) return; + sandbox_extension_release_fn release_extension = + (sandbox_extension_release_fn)dlsym(RTLD_DEFAULT, "sandbox_extension_release"); + if (release_extension) release_extension(handle); +} + +// --------------------------------------------------------------------------- +// Class-13 fallback (Veilpath / bad_query lineage) +// --------------------------------------------------------------------------- + +static int64_t sbx_fallback_query(NSString *target, bool alt_flags) { + if (target.length == 0 || ![target hasPrefix:@"/"]) return -255; + struct stat st; + if (lstat(target.fileSystemRepresentation, &st) != 0) return -255; + + void *mgr = dlopen("/usr/lib/system/libsystem_containermanager.dylib", RTLD_NOW | RTLD_LOCAL); + if (!mgr) return -1; + + container_query_create_fn query_create = (container_query_create_fn)dlsym(mgr, "container_query_create"); + container_query_set_class_fn query_set_class = (container_query_set_class_fn)dlsym(mgr, "container_query_set_class"); + container_query_set_identifiers_fn query_set_group_identifiers = + (container_query_set_identifiers_fn)dlsym(mgr, "container_query_set_group_identifiers"); + container_query_set_flags_fn query_set_flags = + (container_query_set_flags_fn)dlsym(mgr, "container_query_operation_set_flags"); + container_query_set_part_fn query_set_part = + (container_query_set_part_fn)dlsym(mgr, "container_query_operation_set_part"); + container_query_set_part_domain_fn query_set_part_domain = + (container_query_set_part_domain_fn)dlsym(mgr, "container_query_operation_set_part_domain"); + container_query_get_single_result_fn query_get_single_result = + (container_query_get_single_result_fn)dlsym(mgr, "container_query_get_single_result"); + container_query_free_fn query_free = (container_query_free_fn)dlsym(mgr, "container_query_free"); + container_copy_sandbox_token_fn copy_sandbox_token = + (container_copy_sandbox_token_fn)dlsym(mgr, "container_copy_sandbox_token"); + sandbox_extension_consume_fn consume_extension = + (sandbox_extension_consume_fn)dlsym(RTLD_DEFAULT, "sandbox_extension_consume"); + + if (!query_create || !query_set_class || !query_set_group_identifiers || !query_set_flags || + !query_set_part || !query_set_part_domain || !query_get_single_result || !query_free || + !copy_sandbox_token || !consume_extension) { + dlclose(mgr); + return -1; + } + + void *query = query_create(); + if (!query) { + dlclose(mgr); + return -3; + } + + xpc_object_t identifier = xpc_string_create("systemgroup.com.apple.mobilegestaltcache"); + query_set_class(query, 13); + query_set_group_identifiers(query, identifier); + query_set_part(query, 3); + + char *part = NULL; + if (asprintf(&part, "../../../../../../../..%s", target.fileSystemRepresentation) == -1) { + query_free(query); + dlclose(mgr); + return -5; + } + query_set_part_domain(query, part); + if (alt_flags) { + query_set_flags(query, 0x0000000800000000ULL); + } else { + query_set_flags(query, 0x0000008000000000ULL); + } + + void *result = query_get_single_result(query); + if (!result) { + free(part); + query_free(query); + dlclose(mgr); + return -5; + } + + char *token = copy_sandbox_token(result); + if (!token) { + free(part); + query_free(query); + dlclose(mgr); + return -6; + } + + int64_t handle = consume_extension(token); + free(token); + free(part); + query_free(query); + dlclose(mgr); + return handle; +} + +// --------------------------------------------------------------------------- +// Container enumeration (needed for the Application / daemon / plugin roots, +// whose parent directory cannot itself be granted on iOS 27) +// --------------------------------------------------------------------------- + +static NSArray *sbx_enumerate_class(uint64_t container_class) { + void *mgr = dlopen("/usr/lib/system/libsystem_containermanager.dylib", RTLD_NOW | RTLD_LOCAL); + if (!mgr) return nil; + + container_query_create_fn query_create = (container_query_create_fn)dlsym(mgr, "container_query_create"); + container_query_set_class_fn query_set_class = (container_query_set_class_fn)dlsym(mgr, "container_query_set_class"); + container_query_iterate_results_sync_fn iterate = + (container_query_iterate_results_sync_fn)dlsym(mgr, "container_query_iterate_results_sync"); + container_query_free_fn query_free = (container_query_free_fn)dlsym(mgr, "container_query_free"); + container_object_get_path_fn get_path = + (container_object_get_path_fn)dlsym(mgr, "container_object_get_path"); + container_object_get_identifier_fn get_identifier = + (container_object_get_identifier_fn)dlsym(mgr, "container_object_get_identifier"); + if (!get_identifier) get_identifier = (container_object_get_identifier_fn)dlsym(mgr, "container_result_get_identifier"); + + if (!query_create || !query_set_class || !iterate || !query_free || !get_path) { + dlclose(mgr); + return nil; + } + + void *query = query_create(); + if (!query) { dlclose(mgr); return nil; } + query_set_class(query, container_class); + + NSMutableArray *out = [NSMutableArray array]; + __block container_object_get_path_fn blk_get_path = get_path; + __block container_object_get_identifier_fn blk_get_id = get_identifier; + + iterate(query, ^(void *result) { + if (!result || !blk_get_path) return; + const char *path = blk_get_path(result); + const char *identifier = blk_get_id ? blk_get_id(result) : NULL; + if (!path || path[0] == '\0') return; + NSString *p = [NSString stringWithUTF8String:path]; + if (p.length == 0) return; + p = sbx_canonical(p); + NSString *i = (identifier && identifier[0]) ? [NSString stringWithUTF8String:identifier] : nil; + [out addObject:@{@"path": p, @"id": i ?: @""}]; + }); + + query_free(query); + dlclose(mgr); + return out; +} + +// --------------------------------------------------------------------------- +// Inode path enumeration (pathleak) +// +// fsgetpath() resolves a file-system object id to its absolute path without +// requiring directory-search permission. Scanning the inode range and +// keeping immediate children of a root enumerates containers when a +// containermanager query for the parent is refused. Derived from pathleak +// (forcequitOS, GPL-3.0). +// --------------------------------------------------------------------------- + +static double sbx_now(void) { + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return (double)ts.tv_sec + (double)ts.tv_nsec / 1000000000.0; +} + +static NSArray *sbx_pathleak(NSString *root, uint64_t max_inode, double seconds) { + if (root.length == 0 || max_inode < 1) return nil; + NSString *dir = sbx_canonical(root); + while (dir.length > 1 && [dir hasSuffix:@"/"]) dir = [dir substringToIndex:dir.length - 1]; + + struct statfs sfs; + if (statfs(dir.fileSystemRepresentation, &sfs) != 0) { + NSString *tmp = NSTemporaryDirectory(); + if (tmp.length == 0 || statfs(tmp.fileSystemRepresentation, &sfs) != 0) return nil; + } + fsid_t fsid = sfs.f_fsid; + + const char *prefix = dir.fileSystemRepresentation; + size_t prefix_len = strlen(prefix); + NSMutableArray *result = [NSMutableArray array]; + char buffer[PATH_MAX]; + double start = sbx_now(); + + for (uint64_t inode = 1; inode <= max_inode; inode++) { + if (seconds > 0 && (inode & 0xFFF) == 0 && (sbx_now() - start) > seconds) break; + ssize_t n = fsgetpath(buffer, sizeof(buffer), &fsid, inode); + if (n <= 0) continue; + if (strncmp(buffer, prefix, prefix_len) != 0) continue; + if (buffer[prefix_len] != '/') continue; + if (strchr(buffer + prefix_len + 1, '/') != NULL) continue; + NSString *path = [[NSFileManager defaultManager] stringWithFileSystemRepresentation:buffer length:strlen(buffer)]; + if (path.length > 0) [result addObject:path]; + } + [result sortUsingSelector:@selector(localizedStandardCompare:)]; + return result; +} + +// --------------------------------------------------------------------------- +// Handle cache +// --------------------------------------------------------------------------- + +static void sbx_store_handle(NSString *path, int64_t handle, NSString *engine) { + if (handle <= 0) return; + pthread_mutex_lock(&g_lock); + if (g_handles == nil) g_handles = [NSMutableArray array]; + [g_handles addObject:@{@"path": path, @"handle": @(handle), @"engine": engine ?: @"worse_query"}]; + pthread_mutex_unlock(&g_lock); +} + +static int64_t sbx_cached_handle_locked(NSString *path) { + if (g_handles == nil) return 0; + NSString *prefix = [path stringByAppendingString:@"/"]; + for (NSDictionary *entry in g_handles) { + NSString *p = entry[@"path"]; + if ([path isEqualToString:p] || [path hasPrefix:prefix] || [path hasPrefix:[p stringByAppendingString:@"/"]]) { + return [entry[@"handle"] longLongValue]; + } + } + return 0; +} + +static BOOL sbx_has_handle_for(NSString *path) { + pthread_mutex_lock(&g_lock); + int64_t h = sbx_cached_handle_locked(path); + pthread_mutex_unlock(&g_lock); + return h > 0; +} + +static BOOL sbx_uses_alt_flags(NSString *path) { + NSInteger major = [[NSProcessInfo processInfo] operatingSystemVersion].majorVersion; + return major == 26 && [path containsString:@"/var/mobile/Containers/Shared/AppGroup"]; +} + +// --------------------------------------------------------------------------- +// Grant +// --------------------------------------------------------------------------- + +static int64_t sbx_grant_path(NSString *raw, BOOL create, NSString **engineOut) { + NSString *path = sbx_canonical(raw); + if (path.length == 0 || ![path hasPrefix:@"/"]) return -255; + if (sbx_is_own_path(path)) { + if (engineOut) *engineOut = @"own-sandbox"; + return 0; + } + + pthread_mutex_lock(&g_lock); + int64_t cached = sbx_cached_handle_locked(path); + pthread_mutex_unlock(&g_lock); + if (cached > 0) { + if (engineOut) *engineOut = @"cached"; + return cached; + } + + NSString *group = sbx_group(); + bool alt = sbx_uses_alt_flags(path); + int64_t handle = 0; + NSString *engine = nil; + + pthread_mutex_lock(&g_query_lock); + if (group.length > 0) { + handle = sbx_worse_query(path, alt, create); + if (handle > 0) engine = @"worse_query"; + } + if (handle <= 0) { + int64_t fallback = sbx_fallback_query(path, alt); + if (fallback > 0) { + handle = fallback; + engine = @"fallback"; + } + } + pthread_mutex_unlock(&g_query_lock); + + if (handle > 0) { + sbx_store_handle(path, handle, engine); + if (engineOut) *engineOut = engine; + } else if (engineOut) { + *engineOut = nil; + } + return handle; +} + +static int64_t sbx_grant_mount(NSString *path) { + int64_t handle = sbx_grant_path(path, NO, NULL); + if (handle <= 0) handle = sbx_grant_path(path, YES, NULL); + return handle; +} + +static NSString *sbx_symlink_target(NSString *path) { + char buf[PATH_MAX]; + ssize_t n = readlink(path.fileSystemRepresentation, buf, sizeof(buf) - 1); + if (n <= 0) return nil; + buf[n] = '\0'; + NSString *target = [NSString stringWithUTF8String:buf]; + if (target.length == 0) return nil; + if (![target hasPrefix:@"/"]) { + target = [[path stringByDeletingLastPathComponent] stringByAppendingPathComponent:target]; + } + return sbx_canonical(target); +} + +static int64_t sbx_grant_item(NSString *raw) { + NSString *path = sbx_canonical(raw); + if (sbx_is_own_path(path)) return 0; + + struct stat st; + if (lstat(path.fileSystemRepresentation, &st) == 0) { + if (S_ISLNK(st.st_mode)) { + NSString *target = sbx_symlink_target(path); + if (target.length > 0) { + int64_t h = sbx_grant_path(target, NO, NULL); + if (h > 0) return h; + } + } + if (S_ISDIR(st.st_mode)) return sbx_grant_path(path, NO, NULL); + NSString *parent = [path stringByDeletingLastPathComponent]; + int64_t h = sbx_grant_path(parent, NO, NULL); + return h != 0 ? h : sbx_grant_path(path, NO, NULL); + } + + int64_t h = sbx_grant_path(path, NO, NULL); + if (h > 0) return h; + return sbx_grant_path([path stringByDeletingLastPathComponent], NO, NULL); +} + +static void sbx_release_all_internal(void) { + pthread_mutex_lock(&g_lock); + NSArray *handles = [g_handles copy]; + [g_handles removeAllObjects]; + pthread_mutex_unlock(&g_lock); + for (NSDictionary *entry in handles) { + sbx_release_handle([entry[@"handle"] longLongValue]); + } + sbx_printf("released %lu sandbox extension(s)\n", (unsigned long)handles.count); +} + +// --------------------------------------------------------------------------- +// Mount points +// --------------------------------------------------------------------------- + +static NSArray *sbx_mount_points(void) { + return @[ + @{@"name": @"system", @"root": @"/private/var/containers/Data/System", @"children": @NO, @"class": @0}, + @{@"name": @"systemgroups", @"root": @"/private/var/containers/Shared/SystemGroup", @"children": @YES, @"class": @11}, + @{@"name": @"apps", @"root": @"/private/var/mobile/Containers/Data/Application", @"children": @YES, @"class": @2}, + @{@"name": @"daemons", @"root": @"/private/var/mobile/Containers/Data/InternalDaemon", @"children": @YES, @"class": @10}, + @{@"name": @"plugins", @"root": @"/private/var/mobile/Containers/Data/PluginKitPlugin", @"children": @YES, @"class": @8}, + @{@"name": @"appgroups", @"root": @"/private/var/mobile/Containers/Shared/AppGroup", @"children": @YES, @"class": @5}, + @{@"name": @"appgroups27", @"root": @"/private/var/containers/Shared/AppGroup", @"children": @YES, @"class": @5} + ]; +} + +static NSArray *sbx_list_dir(NSString *path) { + const char *p = path.fileSystemRepresentation; + DIR *dir = opendir(p); + if (!dir) return nil; + NSMutableArray *entries = [NSMutableArray array]; + struct dirent *ent = NULL; + while ((ent = readdir(dir)) != NULL) { + if (strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0) continue; + NSString *name = [NSString stringWithUTF8String:ent->d_name]; + if (name.length > 0) [entries addObject:name]; + } + closedir(dir); + [entries sortUsingSelector:@selector(localizedStandardCompare:)]; + return entries; +} + +static NSString *sbx_bundle_id(NSString *containerPath) { + char buf[512]; + memset(buf, 0, sizeof(buf)); + ssize_t len = getxattr(containerPath.fileSystemRepresentation, + "com.apple.containermanager.identifier", buf, sizeof(buf) - 1, 0, 0); + if (len > 0) { + return [NSString stringWithUTF8String:buf]; + } + + NSString *meta = [containerPath stringByAppendingPathComponent:@".com.apple.mobile_container_manager.metadata.plist"]; + NSData *data = [NSData dataWithContentsOfFile:meta]; + if (data.length == 0) return nil; + id plist = [NSPropertyListSerialization propertyListWithData:data + options:NSPropertyListImmutable + format:NULL + error:NULL]; + if (![plist isKindOfClass:[NSDictionary class]]) return nil; + id ident = ((NSDictionary *)plist)[@"MCMMetadataIdentifier"]; + if ([ident isKindOfClass:[NSString class]] && [(NSString *)ident length] > 0) return ident; + return nil; +} + +static NSString *sbx_safe_name(NSString *name) { + NSMutableString *out = [NSMutableString stringWithString:name ?: @"unknown"]; + [out replaceOccurrencesOfString:@"/" withString:@"_" options:0 range:NSMakeRange(0, out.length)]; + [out replaceOccurrencesOfString:@":" withString:@"_" options:0 range:NSMakeRange(0, out.length)]; + return out; +} + +static BOOL sbx_symlink(NSString *target, NSString *link) { + NSFileManager *fm = [NSFileManager defaultManager]; + [fm removeItemAtPath:link error:NULL]; + return [fm createSymbolicLinkAtPath:link withDestinationPath:target error:NULL]; +} + +static void sbx_write_manifest(int64_t mounted, int64_t failed) { + NSMutableString *text = [NSMutableString string]; + [text appendString:@"Terminal sandbox escape manifest\n"]; + [text appendFormat:@"OS: %@\n", [[NSProcessInfo processInfo] operatingSystemVersionString]]; + pthread_mutex_lock(&g_lock); + NSString *group = g_group; + NSArray *handles = [g_handles copy]; + pthread_mutex_unlock(&g_lock); + [text appendFormat:@"App group: %@\n", group ?: @"(none)"]; + [text appendFormat:@"Mounted: %lld, failed: %lld\n", mounted, failed]; + [text appendFormat:@"Active handles: %lu\n\n", (unsigned long)handles.count]; + for (NSDictionary *entry in handles) { + [text appendFormat:@" handle %@: %@ (%@)\n", + entry[@"handle"], entry[@"path"], entry[@"engine"]]; + } + NSString *manifest = [sbx_mount_root() stringByAppendingPathComponent:@".mount_info"]; + [text writeToFile:manifest atomically:YES encoding:NSUTF8StringEncoding error:NULL]; +} + +static void sbx_automount(BOOL showUI) { + @autoreleasepool { + pthread_mutex_lock(&g_mount_lock); + + pthread_mutex_lock(&g_lock); + if (g_mount_running) { + pthread_mutex_unlock(&g_lock); + pthread_mutex_unlock(&g_mount_lock); + return; + } + g_mount_running = YES; + g_mount_done = NO; + pthread_mutex_unlock(&g_lock); + + NSFileManager *fm = [NSFileManager defaultManager]; + NSString *mountRoot = sbx_mount_root(); + [fm createDirectoryAtPath:mountRoot withIntermediateDirectories:YES attributes:nil error:NULL]; + + // Clear previous mounts, keeping the manifest until it is replaced. + NSArray *old = [fm contentsOfDirectoryAtPath:mountRoot error:NULL]; + for (NSString *item in old) { + if ([item isEqualToString:@".mount_info"]) continue; + [fm removeItemAtPath:[mountRoot stringByAppendingPathComponent:item] error:NULL]; + } + + if (sbx_group() == nil) { + NSLog(@"[TerminalSBX] warning: no app group available; using class-13 fallback only"); + } + + int64_t mounted = 0; + int64_t failed = 0; + + sbx_progress_set(0.06, @"正在准备挂载点…"); + NSArray *mountPoints = sbx_mount_points(); + NSUInteger mountPointCount = mountPoints.count; + NSUInteger mountPointIndex = 0; + for (NSDictionary *mp in mountPoints) { + NSString *name = mp[@"name"]; + double baseProgress = 0.06 + 0.84 * ((double)mountPointIndex / (double)MAX(mountPointCount, (NSUInteger)1)); + double spanProgress = 0.84 / (double)MAX(mountPointCount, (NSUInteger)1); + mountPointIndex++; + sbx_progress_set(baseProgress, [NSString stringWithFormat:@"正在处理 %@…", name]); + NSString *root = mp[@"root"]; + BOOL children = [mp[@"children"] boolValue]; + BOOL exists = sbx_path_exists(root); + + int64_t handle = sbx_grant_mount(root); + NSString *dest = [mountRoot stringByAppendingPathComponent:name]; + if (!children) { + if (handle <= 0) { + failed++; + NSLog(@"[TerminalSBX] cannot grant %@ (handle=%lld, exists=%d)", root, handle, exists); + continue; + } + if (sbx_symlink(root, dest)) { + mounted++; + sbx_mark_root(root); + NSLog(@"[TerminalSBX] mounted %@ -> %@", name, root); + } else { + failed++; + } + sbx_progress_set(baseProgress + spanProgress, [NSString stringWithFormat:@"完成 %@", name]); + continue; + } + + NSMutableArray *childItems = [NSMutableArray array]; + NSArray *entries = handle > 0 ? sbx_list_dir(root) : nil; + if (entries != nil) { + for (NSString *entry in entries) { + NSString *child = [root stringByAppendingPathComponent:entry]; + [childItems addObject:@{@"path": child, @"id": @""}]; + } + } else { + // iOS 27 refuses a token for the parent of Application, + // InternalDaemon, PluginKitPlugin and SystemGroup. Enumerate + // the individual containers with fsgetpath instead. + double seconds = [name isEqualToString:@"apps"] ? 12.0 : 6.0; + NSArray *leaked = sbx_pathleak(root, 2000000, seconds); + for (NSString *child in leaked ?: @[]) { + [childItems addObject:@{@"path": child, @"id": @""}]; + } + if (leaked.count > 0) { + NSLog(@"[TerminalSBX] fsgetpath found %lu container(s) under %@", + (unsigned long)leaked.count, root); + } + } + if (childItems.count == 0) { + failed++; + NSLog(@"[TerminalSBX] cannot enumerate %@", root); + sbx_progress_set(baseProgress + spanProgress, [NSString stringWithFormat:@"跳过 %@", name]); + continue; + } + sbx_mark_root(root); + sbx_progress_set(baseProgress + spanProgress * 0.25, + [NSString stringWithFormat:@"发现 %lu 个 %@ 容器", (unsigned long)childItems.count, name]); + + [fm createDirectoryAtPath:dest withIntermediateDirectories:YES attributes:nil error:NULL]; + int64_t childMounted = 0; + NSUInteger childIndex = 0; + NSUInteger childCount = childItems.count; + for (NSDictionary *childInfo in childItems) { + if ((childIndex & 0x1F) == 0) { + double p = baseProgress + spanProgress * (0.25 + 0.70 * ((double)childIndex / (double)MAX(childCount, (NSUInteger)1))); + sbx_progress_set(p, [NSString stringWithFormat:@"%@ %lu/%lu", name, + (unsigned long)childIndex, (unsigned long)childCount]); + } + childIndex++; + NSString *child = childInfo[@"path"]; + int64_t childHandle = sbx_grant_mount(child); + if (childHandle <= 0) { + failed++; + continue; + } + if (!sbx_path_is_dir(child)) continue; + + NSString *fallbackName = child.lastPathComponent; + NSString *bundleId = childInfo[@"id"]; + if (bundleId.length == 0) bundleId = sbx_bundle_id(child); + if (bundleId.length == 0) bundleId = fallbackName; + bundleId = sbx_safe_name(bundleId); + + NSString *childDest = [dest stringByAppendingPathComponent:bundleId]; + if ([fm fileExistsAtPath:childDest]) { + childDest = [dest stringByAppendingPathComponent: + [NSString stringWithFormat:@"%@_%@", bundleId, [fallbackName substringToIndex:MIN((NSUInteger)8, fallbackName.length)]]]; + } + [fm createDirectoryAtPath:childDest withIntermediateDirectories:YES attributes:nil error:NULL]; + + NSArray *subdirs = @[@"Documents", @"Library", @"tmp", @"SystemData", @"StoreKit"]; + for (NSString *sub in subdirs) { + NSString *target = [child stringByAppendingPathComponent:sub]; + if (!sbx_path_exists(target)) continue; + sbx_grant_mount(target); + sbx_symlink(target, [childDest stringByAppendingPathComponent:sub]); + } + sbx_symlink(child, [childDest stringByAppendingPathComponent:@"_data"]); + childMounted++; + } + mounted += childMounted; + NSLog(@"[TerminalSBX] mounted %lld container(s) under %@", childMounted, name); + sbx_progress_set(baseProgress + spanProgress, + [NSString stringWithFormat:@"完成 %@ (%lld)", name, childMounted]); + } + + sbx_progress_set(0.90, @"正在挂载便捷目录…"); + // Mount Terminal's own container by bundle ID as well. fsgetpath() + // does not always report the calling process's own container during + // the scan, but no extension is needed for it. + NSString *ownRoot = NSHomeDirectory(); + NSString *ownBid = [[NSBundle mainBundle] bundleIdentifier]; + if (ownBid.length == 0) ownBid = @"com.apple.Terminal"; + NSString *appsDest = [mountRoot stringByAppendingPathComponent:@"apps"]; + [fm createDirectoryAtPath:appsDest withIntermediateDirectories:YES attributes:nil error:NULL]; + NSString *ownDest = [appsDest stringByAppendingPathComponent:sbx_safe_name(ownBid)]; + if (![fm fileExistsAtPath:ownDest]) { + [fm createDirectoryAtPath:ownDest withIntermediateDirectories:YES attributes:nil error:NULL]; + NSArray *subdirs = @[@"Documents", @"Library", @"tmp", @"SystemData", @"StoreKit"]; + for (NSString *sub in subdirs) { + NSString *target = [ownRoot stringByAppendingPathComponent:sub]; + if (sbx_path_exists(target)) { + sbx_symlink(target, [ownDest stringByAppendingPathComponent:sub]); + } + } + sbx_symlink(ownRoot, [ownDest stringByAppendingPathComponent:@"_data"]); + mounted++; + } + + // Convenience mounts inside the system group tree. + NSString *gestalt = @"/private/var/containers/Shared/SystemGroup/systemgroup.com.apple.mobilegestaltcache/Library/Caches"; + if (sbx_path_exists(gestalt) && sbx_grant_mount(gestalt) > 0) { + if (sbx_symlink(gestalt, [mountRoot stringByAppendingPathComponent:@"gestalt"])) mounted++; + } + NSString *profiles = @"/private/var/containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles/Library/ConfigurationProfiles"; + if (sbx_path_exists(profiles) && sbx_grant_mount(profiles) > 0) { + if (sbx_symlink(profiles, [mountRoot stringByAppendingPathComponent:@"configprofiles"])) mounted++; + } + + sbx_progress_set(0.97, @"正在写入挂载清单…"); + sbx_write_manifest(mounted, failed); + + pthread_mutex_lock(&g_lock); + g_mount_mounted = mounted; + g_mount_failed = failed; + g_mount_done = YES; + g_mount_running = NO; + pthread_mutex_unlock(&g_lock); + + NSLog(@"[TerminalSBX] auto-mount complete: %lld mounted, %lld failed", mounted, failed); + sbx_progress_set(1.0, @"完成"); + if (showUI) sbx_progress_finish(); + pthread_mutex_unlock(&g_mount_lock); + } +} + +static void *sbx_automount_thread(void *arg) { + (void)arg; + sbx_show_progress(); + usleep(400000); + sbx_automount(YES); + return NULL; +} + +__attribute__((constructor)) +static void sbx_initialize(void) { + // Every launch starts with a fresh terminal and no restored command + // history. a-Shell checks keep_content before restoring terminal data, + // cwd and the history array. + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + [defaults setBool:NO forKey:@"keep_content"]; + [defaults synchronize]; + + // Do not touch Foundation before the app's run loop exists; mount on a + // detached thread shortly after launch. + pthread_t thread; + if (pthread_create(&thread, NULL, sbx_automount_thread, NULL) == 0) { + pthread_detach(thread); + } +} + +// --------------------------------------------------------------------------- +// Error descriptions +// --------------------------------------------------------------------------- + +static const char *sbx_error_text(int64_t code) { + switch (code) { + case -255: return "target does not exist (use -c to bypass the existence check)"; + case -254: return "not an absolute path"; + case -1: return "no usable App Group / container functions unavailable"; + case -2: return "failed to resolve containermanager functions"; + case -3: return "failed to create container query"; + case -4: return "failed to create the Library/Caches symlink"; + case -5: return "query rejected by containermanagerd"; + case -6: return "kernel refused to issue a sandbox extension"; + default: return "unknown error"; + } +} + +// --------------------------------------------------------------------------- +// Commands +// --------------------------------------------------------------------------- + +__attribute__((visibility("default"))) +int sbx_badshell(int argc, char **argv) { + (void)argc; (void)argv; + @autoreleasepool { + sbx_printf( +"Terminal — a-Shell 2.3.2 full + worse_query sandbox escape\n" +"\n" +"The launch-time mount runs in the background and takes ~40 seconds.\n" +"Use \"sbx_status\" to check progress.\n" +"\n" +"Auto-mounted at ~/Documents/_sandbox/ by the launch-time escape:\n" +" _sandbox/system/ /var/containers/Data/System\n" +" _sandbox/systemgroups/ /var/containers/Shared/SystemGroup/*\n" +" _sandbox/apps/ /var/mobile/Containers/Data/Application/*\n" +" _sandbox/daemons/ /var/mobile/Containers/Data/InternalDaemon/*\n" +" _sandbox/plugins/ /var/mobile/Containers/Data/PluginKitPlugin/*\n" +" _sandbox/appgroups/ /var/mobile/Containers/Shared/AppGroup/*\n" +" _sandbox/appgroups27/ /var/containers/Shared/AppGroup/* (iOS 27)\n" +" _sandbox/gestalt/ MobileGestalt cache\n" +" _sandbox/configprofiles/ ConfigurationProfiles\n" +"\n" +"Every app container is exposed by bundle ID:\n" +" _sandbox/apps/com.example.app/Documents/\n" +" _sandbox/apps/com.example.app/_data/ full container root\n" +"\n" +"Use standard commands (ls, cat, cp, grep, find, tar, python3...) on these\n" +"paths, or use the sbx_* commands for manual control:\n" +"\n" +" sbxhelp Show this help and mount overview\n" +" neofetch System information (actual device)\n" +" sbx_grant [-c] Consume a sandbox extension for a path\n" +" sbx_release Release sandbox extension(s)\n" +" sbx_status [-v] Show app group, mount state and active handles\n" +" sbx_remount Re-run the complete auto-mount\n" +" sbx_ls List a directory (or file metadata)\n" +" sbx_cat Print a file\n" +" sbx_cp Copy a file or directory\n" +" sbx_write [-a] Write/append text\n" +" sbx_rm [-r] Remove a file (or directory with -r)\n" +" sbx_hexdump [-n N] Hex dump\n" +" sbx_containers [root] List containers and bundle IDs\n" +" sbx_id Read a container's bundle ID\n" +" sbx_sysgroups [filter] List system group containers\n" +" sbx_probe Probe every supported escape path\n" +" sbx_paths Show the supported path table\n" +" bswelcome Banner + wait for the mount to finish\n" +"\n" +"Native plugin environment (installed in ~/Documents/.terminal):\n" +" termenv init Create the prefix and local repository\n" +" termenv selftest Test apt/dpkg with the hello package\n" +" apt update Refresh the package index\n" +" apt install Install a Terminal-compatible .deb\n" +" dpkg -i Install a .deb directly\n" +" dpkg -l List installed packages\n" +" mkdeb [arch]\n" +" bash