From fe17e1d50770ce48baf33378e35be03ca380f56a Mon Sep 17 00:00:00 2001 From: "LINUXexpert.org" <51408202+LINUXexpert-org@users.noreply.github.com> Date: Sat, 18 Oct 2025 23:11:15 -0700 Subject: [PATCH] Initial upload --- Dockerfile | 16 + LICENSE | 682 +--------------------- Makefile | 13 + README.md | 60 ++ app/__init__.py | 0 app/config.py | 9 + app/dav.py | 41 ++ app/jmap.py | 31 + app/main.py | 34 ++ app/routes/__init__.py | 0 app/routes/auth.py | 45 ++ app/routes/calendar.py | 39 ++ app/routes/contacts.py | 35 ++ app/routes/mail.py | 316 ++++++++++ app/routes/webdav.py | 21 + app/static/css/style.css | 30 + app/static/img/logo.png | Bin 0 -> 190308 bytes app/templates/base.html | 37 ++ app/templates/calendar.html | 15 + app/templates/compose.html | 11 + app/templates/contacts.html | 19 + app/templates/login.html | 24 + app/templates/mail.html | 26 + app/templates/message.html | 25 + app/templates/webdav.html | 15 + app/utils.py | 19 + charts/ihasmail/Chart.yaml | 6 + charts/ihasmail/templates/NOTES.txt | 7 + charts/ihasmail/templates/_helpers.tpl | 20 + charts/ihasmail/templates/deployment.yaml | 60 ++ charts/ihasmail/templates/ingress.yaml | 30 + charts/ihasmail/templates/service.yaml | 15 + charts/ihasmail/values.yaml | 32 + docker-compose.yml | 11 + pyproject.toml | 30 + tests/test_smoke.py | 7 + 36 files changed, 1111 insertions(+), 670 deletions(-) create mode 100644 Dockerfile create mode 100644 Makefile create mode 100644 README.md create mode 100644 app/__init__.py create mode 100644 app/config.py create mode 100644 app/dav.py create mode 100644 app/jmap.py create mode 100644 app/main.py create mode 100644 app/routes/__init__.py create mode 100644 app/routes/auth.py create mode 100644 app/routes/calendar.py create mode 100644 app/routes/contacts.py create mode 100644 app/routes/mail.py create mode 100644 app/routes/webdav.py create mode 100644 app/static/css/style.css create mode 100644 app/static/img/logo.png create mode 100644 app/templates/base.html create mode 100644 app/templates/calendar.html create mode 100644 app/templates/compose.html create mode 100644 app/templates/contacts.html create mode 100644 app/templates/login.html create mode 100644 app/templates/mail.html create mode 100644 app/templates/message.html create mode 100644 app/templates/webdav.html create mode 100644 app/utils.py create mode 100644 charts/ihasmail/Chart.yaml create mode 100644 charts/ihasmail/templates/NOTES.txt create mode 100644 charts/ihasmail/templates/_helpers.tpl create mode 100644 charts/ihasmail/templates/deployment.yaml create mode 100644 charts/ihasmail/templates/ingress.yaml create mode 100644 charts/ihasmail/templates/service.yaml create mode 100644 charts/ihasmail/values.yaml create mode 100644 docker-compose.yml create mode 100644 pyproject.toml create mode 100644 tests/test_smoke.py diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..695ec9e --- /dev/null +++ b/Dockerfile @@ -0,0 +1,16 @@ +FROM python:3.12-slim + +ENV PYTHONDONTWRITEBYTECODE=1 PYTHONUNBUFFERED=1 + +RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates && rm -rf /var/lib/apt/lists/* +WORKDIR /app + +COPY pyproject.toml README.md /app/ +RUN pip install --no-cache-dir -e . + +COPY app /app/app +COPY .env.example /app/.env.example + +ENV PORT=8000 +EXPOSE 8000 +CMD ["uvicorn", "app.main:app", "--host=0.0.0.0", "--port=8000"] diff --git a/LICENSE b/LICENSE index f288702..dc885bb 100644 --- a/LICENSE +++ b/LICENSE @@ -1,674 +1,16 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 +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. +Copyright (C) 2025 John Coffey - Preamble +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, version 3 of the License. - The GNU General Public License is a free, copyleft license for -software and other kinds of works. +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. - 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 -. +You should have received a copy of the GNU General Public License +along with this program. If not, see . diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..40d8ae6 --- /dev/null +++ b/Makefile @@ -0,0 +1,13 @@ +.PHONY: run dev test build + +run: + uvicorn app.main:app --host 0.0.0.0 --port 8000 + +dev: + uvicorn app.main:app --reload + +test: + pytest + +build: + docker compose build diff --git a/README.md b/README.md new file mode 100644 index 0000000..d3699b7 --- /dev/null +++ b/README.md @@ -0,0 +1,60 @@ +# ihasmail + +![ihasmail logo](app/static/img/logo.png) + +A polished, FastAPI + HTMX/Jinja webmail for Stalwart, with JMAP mail/contacts/calendar, Sieve UI, DAV browsing, and reverse-proxy friendly deploy. + +A production-leaning, **FastAPI** + **HTMX/Jinja** webmail for [Stalwart Mail Server](https://stalw.art/), using **JMAP** for mail, contacts, and calendar, plus simple **WebDAV/CalDAV** helpers. Authenticates with the user's Stalwart mailbox (like Roundcube). Designed to run behind a reverse proxy. + +## Features +- Login with Stalwart mailbox (HTTP Basic against JMAP session or bearer token if provided) +- Inbox listing, read messages (plain text), compose & send via JMAP (`Email`, `EmailSubmission`) +- Contacts/Directory via JMAP `Contact` +- Calendar view via JMAP `CalendarEvent` +- WebDAV browser (read-only sample) and CalDAV endpoints (external DAV clients) +- CSRF on POST, signed session cookie, proxy-friendly +- Dockerfile + docker-compose for easy deploy + +> HTML rendering and attachment streaming are stubbed—extend using the JMAP `downloadUrl` and sanitize HTML before display. + +## Quick Start (Docker) + +```bash +# 1) Configure environment +cp .env.example .env +# Edit JMAP_BASE, CALDAV_BASE, WEBDAV_BASE, APP_SECRET + +# 2) Build & run +docker compose up --build -d + +# 3) Reverse proxy (Nginx/Caddy) to http://127.0.0.1:8080 +``` + +## Environment Variables +- `APP_SECRET` – random string for signing cookies (required) +- `JMAP_BASE` – e.g., `https://mail.example.com/jmap` +- `CALDAV_BASE` – e.g., `https://mail.example.com/caldav/` +- `WEBDAV_BASE` – e.g., `https://mail.example.com/webdav/` +- `COOKIE_NAME` – cookie name (default: `stalwart_webmail`) +- `TRUST_PROXY` – `1` to honor `X-Forwarded-*` (default: `1`) +- `UPSTREAM_TIMEOUT` – seconds for upstream HTTP (default: `15`) + +## Dev +```bash +python -m venv .venv && source .venv/bin/activate +pip install -e ".[dev]" +uvicorn app.main:app --reload +pytest +``` + +## Security & Hardening +- Prefer **bearer tokens** if Stalwart issues them; update `jmap_session()` to store `accessToken` +- Set explicit `accountId` from the JMAP session `primaryAccounts` +- Add mailbox/folder navigation via `Mailbox/query` + `Mailbox/get` +- Sanitize HTML bodies (e.g., `bleach`) before rendering +- Add Sieve UI via `urn:ietf:params:jmap:sieve` +- Consider rate limiting and security headers in the reverse proxy +- Serve static assets via proxy/CDN + +## License +GPL-3.0-or-later diff --git a/app/__init__.py b/app/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/config.py b/app/config.py new file mode 100644 index 0000000..74abbb2 --- /dev/null +++ b/app/config.py @@ -0,0 +1,9 @@ +import os, secrets + +APP_SECRET = os.getenv("APP_SECRET") or secrets.token_urlsafe(32) +COOKIE_NAME = os.getenv("COOKIE_NAME", "stalwart_webmail") +JMAP_BASE = os.getenv("JMAP_BASE", "https://mail.example.com/jmap") +CALDAV_BASE = os.getenv("CALDAV_BASE", "https://mail.example.com/caldav/") +WEBDAV_BASE = os.getenv("WEBDAV_BASE", "https://mail.example.com/webdav/") +TRUST_PROXY = os.getenv("TRUST_PROXY", "1") == "1" +UPSTREAM_TIMEOUT = float(os.getenv("UPSTREAM_TIMEOUT", "15")) diff --git a/app/dav.py b/app/dav.py new file mode 100644 index 0000000..1d315ab --- /dev/null +++ b/app/dav.py @@ -0,0 +1,41 @@ +from typing import List, Dict, Any, Tuple, Optional +import httpx +from urllib.parse import urljoin +from . import config + +DAV_PROPFIND = """ + + + + + + +""" + +async def propfind(ac: httpx.AsyncClient, base: str, path: Optional[str], auth: Tuple[str,str]) -> List[Dict[str, Any]]: + href = urljoin(base, path or "/") + r = await ac.request("PROPFIND", href, content=DAV_PROPFIND, headers={"Depth": "1"}, auth=auth) + if r.status_code not in (207, 200): + raise RuntimeError(f"WebDAV error {r.status_code}") + import xml.etree.ElementTree as ET + tree = ET.fromstring(r.text) + ns = {"d":"DAV:"} + items: List[Dict[str, Any]] = [] + for resp in tree.findall("d:response", ns): + href_el = resp.find("d:href", ns) + prop = resp.find("d:propstat/d:prop", ns) + if href_el is None or prop is None: + continue + name = prop.find("d:displayname", ns) + cl = prop.find("d:getcontentlength", ns) + rtype = prop.find("d:resourcetype", ns) + is_collection = rtype is not None and rtype.find("d:collection", ns) is not None + items.append({ + "href": href_el.text, + "name": (name.text if name is not None and name.text else href_el.text.rstrip("/").split("/")[-1] or "/"), + "type": "directory" if is_collection else "file", + "size": int(cl.text) if (cl is not None and cl.text and cl.text.isdigit()) else None + }) + if items: + items = items[1:] + return items diff --git a/app/jmap.py b/app/jmap.py new file mode 100644 index 0000000..975a79d --- /dev/null +++ b/app/jmap.py @@ -0,0 +1,31 @@ +from typing import Any, Dict, List, Tuple +import httpx +from . import config + +def client() -> httpx.AsyncClient: + limits = httpx.Limits(max_connections=20, max_keepalive_connections=10) + return httpx.AsyncClient(timeout=config.UPSTREAM_TIMEOUT, limits=limits, trust_env=True) + +async def get_session(ac: httpx.AsyncClient, base: str, username: str, password: str) -> Dict[str, Any]: + r = await ac.get(base, auth=(username, password)) + if r.status_code == 401: + raise PermissionError("Invalid credentials") + r.raise_for_status() + return r.json() + +async def call(ac: httpx.AsyncClient, api_url: str, auth: Tuple[str,str] | None, method_calls: List[list]) -> Dict[str, Any]: + payload = { + "using": [ + "urn:ietf:params:jmap:core", + "urn:ietf:params:jmap:mail", + "urn:ietf:params:jmap:contacts", + "urn:ietf:params:jmap:calendars" + ], + "methodCalls": method_calls + } + kwargs: Dict[str, Any] = {"json": payload} + if auth: + kwargs["auth"] = auth + r = await ac.post(api_url, **kwargs) + r.raise_for_status() + return r.json() diff --git a/app/main.py b/app/main.py new file mode 100644 index 0000000..a9d13e4 --- /dev/null +++ b/app/main.py @@ -0,0 +1,34 @@ +import bleach +from fastapi import FastAPI, Request +from fastapi.staticfiles import StaticFiles +from starlette.middleware.sessions import SessionMiddleware +from starlette.middleware.proxy_headers import ProxyHeadersMiddleware +from . import config +from .routes import auth, mail, contacts, calendar, webdav, sieve + +app = FastAPI(title="Stalwart Webmail (Python)") + +if config.TRUST_PROXY: + app.add_middleware(ProxyHeadersMiddleware, trusted_hosts="*") + +app.add_middleware(SessionMiddleware, secret_key=config.APP_SECRET, session_cookie=config.COOKIE_NAME, same_site="lax", https_only=True) + +app.mount("/static", StaticFiles(directory="app/static"), name="static") + +@app.get("/", include_in_schema=False) +async def root(request: Request): + from fastapi.responses import RedirectResponse + return RedirectResponse("/mail" if request.session.get("user") else "/login") + +# Routers +app.include_router(auth.router) +app.include_router(mail.router) +app.include_router(contacts.router) +app.include_router(calendar.router) +app.include_router(webdav.router) +app.include_router(sieve.router) + + +@app.get("/healthz", include_in_schema=False) +async def healthz(): + return {"ok": True} diff --git a/app/routes/__init__.py b/app/routes/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/routes/auth.py b/app/routes/auth.py new file mode 100644 index 0000000..7989108 --- /dev/null +++ b/app/routes/auth.py @@ -0,0 +1,45 @@ +from fastapi import APIRouter, Request, Form, HTTPException +from fastapi.responses import RedirectResponse, HTMLResponse +from starlette.middleware.sessions import SessionMiddleware +from starlette.responses import PlainTextResponse +from .. import config, jmap +from fastapi.templating import Jinja2Templates +from jinja2 import FileSystemLoader, Environment, select_autoescape +import pathlib, base64, os + +router = APIRouter() + +templates = Jinja2Templates(directory=str(pathlib.Path(__file__).resolve().parent.parent / "templates")) + +def make_csrf(session: dict) -> str: + token = base64.urlsafe_b64encode(os.urandom(24)).decode() + session["csrf"] = token + return token + +def check_csrf(session: dict, token: str): + if not token or token != session.get("csrf"): + raise HTTPException(status_code=400, detail="CSRF token invalid") + +@router.get("/login", response_class=HTMLResponse) +async def login_form(request: Request): + csrf = make_csrf(request.session) + return templates.TemplateResponse("login.html", {"request": request, "csrf": csrf, "jmap_base": config.JMAP_BASE}) + +@router.post("/login") +async def login_submit(request: Request, username: str = Form(...), password: str = Form(...), jmap_base: str = Form(...), csrf: str = Form(...)): + check_csrf(request.session, csrf) + async with jmap.client() as ac: + try: + session = await jmap.get_session(ac, jmap_base, username, password) + except PermissionError: + raise HTTPException(status_code=401, detail="Invalid credentials") + api_url = session.get("apiUrl") or jmap_base + download_url = session.get("downloadUrl") or "" + primary = session.get("primaryAccounts") or {} + request.session["user"] = {"username": username, "jmap_base": jmap_base, "api_url": api_url, "auth": (username, password), "download_url": download_url, "primary": primary, "session": session} + return RedirectResponse("/mail", status_code=303) + +@router.get("/logout") +async def logout(request: Request): + request.session.clear() + return RedirectResponse("/login", status_code=303) diff --git a/app/routes/calendar.py b/app/routes/calendar.py new file mode 100644 index 0000000..115855c --- /dev/null +++ b/app/routes/calendar.py @@ -0,0 +1,39 @@ +from fastapi import APIRouter, Request, Depends, HTTPException +from fastapi.responses import HTMLResponse +from fastapi.templating import Jinja2Templates +import pathlib, datetime +from .. import jmap +from ..utils import fmt_when + +router = APIRouter() +templates = Jinja2Templates(directory=str(pathlib.Path(__file__).resolve().parent.parent / "templates")) + +def require_user(request: Request): + user = request.session.get("user") + if not user: + raise HTTPException(status_code=401) + return user + +@router.get("/calendar", response_class=HTMLResponse) +async def calendar(request: Request, user=Depends(require_user)): + async with jmap.client() as ac: + api = user["api_url"] + account_id = None + now = datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc) + until = now + datetime.timedelta(days=30) + res = await jmap.call(ac, api, tuple(user["auth"]), [ + ["CalendarEvent/query", {"accountId": account_id, "limit": 200, "sort":[{"property":"start","isAscending": True}]}, "q1"], + ["CalendarEvent/get", {"accountId": account_id, "#ids": {"resultOf":"q1","name":"CalendarEvent/query","path":"ids"}, "properties":["id","title","start","end","location"]}, "g1"] + ]) + events = [] + for name, data, _ in res.get("methodResponses", []): + if name == "CalendarEvent/get": + for e in data.get("list", []): + try: + s = datetime.datetime.fromisoformat((e.get("start") or "").replace("Z","+00:00")) + if s < now - datetime.timedelta(days=1) or s > until: + continue + except Exception: + pass + events.append({"title": e.get("title") or "(no title)", "start": fmt_when(e.get("start")), "end": fmt_when(e.get("end")), "loc": e.get("location")}) + return templates.TemplateResponse("calendar.html", {"request": request, "events": events, "user": user}) diff --git a/app/routes/contacts.py b/app/routes/contacts.py new file mode 100644 index 0000000..222aa7b --- /dev/null +++ b/app/routes/contacts.py @@ -0,0 +1,35 @@ +from typing import Optional +from fastapi import APIRouter, Request, Depends, HTTPException +from fastapi.responses import HTMLResponse +from fastapi.templating import Jinja2Templates +import pathlib +from .. import jmap + +router = APIRouter() +templates = Jinja2Templates(directory=str(pathlib.Path(__file__).resolve().parent.parent / "templates")) + +def require_user(request: Request): + user = request.session.get("user") + if not user: + raise HTTPException(status_code=401) + return user + +@router.get("/contacts", response_class=HTMLResponse) +async def contacts(request: Request, q: Optional[str] = None, user=Depends(require_user)): + async with jmap.client() as ac: + api = user["api_url"] + account_id = None + filter_cond = {"text": q} if q else {} + res = await jmap.call(ac, api, tuple(user["auth"]), [ + ["Contact/query", {"accountId": account_id, "filter": filter_cond, "limit": 100}, "c1"], + ["Contact/get", {"accountId": account_id, "#ids": {"resultOf":"c1","name":"Contact/query","path":"ids"}, "properties":["id","firstName","lastName","emails","company"]}, "c2"] + ]) + contacts = [] + for name, data, _ in res.get("methodResponses", []): + if name == "Contact/get": + for c in data.get("list", []): + emails = [e.get("email","") for e in (c.get("emails") or [])] + contacts.append({"name": f"{c.get('firstName','')} {c.get('lastName','')}".strip() or (emails[0] if emails else ""), + "email": ", ".join(emails), + "org": c.get("company")}) + return templates.TemplateResponse("contacts.html", {"request": request, "contacts": contacts, "q": q, "user": user}) diff --git a/app/routes/mail.py b/app/routes/mail.py new file mode 100644 index 0000000..8e076c7 --- /dev/null +++ b/app/routes/mail.py @@ -0,0 +1,316 @@ +import json +import io +import bleach +from typing import Optional +from fastapi import APIRouter, Request, Depends, HTTPException, Form, UploadFile, File +from fastapi.responses import HTMLResponse, RedirectResponse, StreamingResponse, JSONResponse +from fastapi.templating import Jinja2Templates +import pathlib +from .. import jmap +from ..utils import human_size, fmt_when + +router = APIRouter() +templates = Jinja2Templates(directory=str(pathlib.Path(__file__).resolve().parent.parent / "templates")) + +def require_user(request: Request): + user = request.session.get("user") + if not user: + raise HTTPException(status_code=401) + return user + +def make_csrf(session: dict) -> str: + import os, base64 + token = base64.urlsafe_b64encode(os.urandom(24)).decode() + session["csrf"] = token + return token + +def check_csrf(session: dict, token: str): + if not token or token != session.get("csrf"): + raise HTTPException(status_code=400, detail="CSRF token invalid") + +@router.get("/mail", response_class=HTMLResponse) +async def inbox(request: Request, q: Optional[str] = None, mailbox: Optional[str] = None, user=Depends(require_user)): + async with jmap.client() as ac: + api = user["api_url"] + primary = user.get("primary", {}) + account_id = primary.get("urn:ietf:params:jmap:mail") + boxes, inbox_id = await get_mailboxes(ac, api, tuple(user["auth"]), account_id) + box_id = mailbox or inbox_id + filt = {"text": q} if q else ({"inMailbox": box_id} if box_id else {}) + res = await jmap.call(ac, api, tuple(user["auth"]), [ + ["Email/query", {"accountId": account_id, "filter": filt, "sort": [{"property":"receivedAt","isAscending": False}], "limit": 50}, "c1"], + ["Email/get", {"accountId": account_id, "#ids": {"resultOf":"c1","name":"Email/query","path":"ids"}, "properties": ["id","subject","from","size","receivedAt"]}, "c2"] + ]) + emails = [] + + for name, data, _ in res.get("methodResponses", []): + if name == "Email/get": + for e in data.get("list", []): + from_str = ", ".join([a.get("name") or a.get("email","") for a in (e.get("from") or [])]) + emails.append({"id": e["id"], "subject": e.get("subject") or "(no subject)", "from": from_str, "when": fmt_when(e.get("receivedAt")), "size": human_size(e.get("size"))}) + return templates.TemplateResponse("mail.html", {"request": request, "messages": emails, "q": q, "user": user, "mailboxes": boxes, "selected": box_id}) + +@router.get("/mail/{email_id}", response_class=HTMLResponse) +async def read_message(request: Request, email_id: str, user=Depends(require_user)): + async with jmap.client() as ac: + api = user["api_url"] + res = await jmap.call(ac, api, tuple(user["auth"]), [ + ["Email/get", {"ids": [email_id], "properties": ["id","subject","from","to","receivedAt","size","keywords","preview","bodyStructure","htmlBody","textBody"]}, "c1"] + ]) + msg = {"id": email_id, "subject":"", "from":"", "to":[], "when":"", "textBody":"", "htmlBody":"", "attachments":[]} + bstruct = None + cid_map = {} + for name, data, _ in res.get("methodResponses", []): + if name == "Email/get": + lst = data.get("list", []) + if lst: + e = lst[0] + msg["subject"] = e.get("subject") or msg["subject"] + msg["from"] = ", ".join([a.get("name") or a.get("email","") for a in (e.get("from") or [])]) or msg["from"] + msg["to"] = [a.get("email","") for a in (e.get("to") or [])] or msg["to"] + msg["when"] = fmt_when(e.get("receivedAt")) or msg["when"] + if "textBody" in e: + msg["textBody"] = e.get("textBody") or msg["textBody"] + if "htmlBody" in e: + raw_html = e.get("htmlBody") + if raw_html: + msg["htmlBody"] = bleach.clean(raw_html, tags=bleach.sanitizer.ALLOWED_TAGS.union({"p","span","div","br","hr","pre","code","blockquote","ul","ol","li","table","thead","tbody","tr","th","td","img","a","b","i","strong","em"}), attributes={"a":["href","title"],"img":["src","alt","title","width","height"]}, strip=True) + bstruct = bstruct or e.get("bodyStructure") + def walk_cid(bs): + if not isinstance(bs, dict): return + cid = bs.get("cid") + if cid and bs.get("blobId"): + cid_map[cid.strip("<>")] = {"blobId": bs["blobId"], "name": bs.get("name") or "inline"} + for p in bs.get("subParts", []) or []: + walk_cid(p) + if bstruct: + walk_cid(bstruct) + + def walk_bs(bs, out): + if not isinstance(bs, dict): return + if bs.get("disposition") == "attachment": + out.append({"name": bs.get("name") or "attachment", "type": bs.get("type") or "application/octet-stream", "size": bs.get("size"), "blobId": bs.get("blobId")}) + for p in bs.get("subParts", []) or []: + walk_bs(p, out) + att = [] + walk_bs(bstruct, att) + msg["attachments"] = att + # Inline CID images via internal route + if msg.get("htmlBody") and cid_map: + import re as _re + def _repl(m): + cid = m.group(1) + return f'src="/mail/{email_id}/cid/{cid}"' + msg["htmlBody"] = _re.sub(r'src=\"cid:([^\"]+)\"', _repl, msg["htmlBody"]) # cid_rewrite + return templates.TemplateResponse("message.html", {"request": request, "msg": msg, "user": user}) + +@router.get("/compose", response_class=HTMLResponse) +async def compose_form(request: Request, user=Depends(require_user)): + csrf = make_csrf(request.session) + return templates.TemplateResponse("compose.html", {"request": request, "csrf": csrf, "user": user}) + +@router.post("/compose") +async def compose_send(request: Request, to: str = Form(...), subject: str = Form(""), body: str = Form(""), csrf: str = Form(...), action: str = Form("send"), files: list[UploadFile] = File(default=[]), user=Depends(require_user)): + check_csrf(request.session, csrf) + async with jmap.client() as ac: + api = user["api_url"] + primary = user.get("primary", {}) + account_id = primary.get("urn:ietf:params:jmap:mail") + # Upload attachments if any + upload_url = user.get("upload_url") + blobs = [] + form = await request.form() + for k, v in form.multi_items(): + if k == 'preblob': + try: + b = json.loads(v) + if b.get('blobId'): blobs.append(b) + except Exception: + pass + if files: + for f in files: + data = await f.read() + if upload_url: + url = upload_url.replace("{accountId}", account_id or "") + ru = await ac.post(url, content=data, headers={"Content-Type": f.content_type or "application/octet-stream"}, auth=tuple(user["auth"])) + ru.raise_for_status() + up = ru.json() + blobs.append({"blobId": up.get("blobId"), "type": f.content_type or "application/octet-stream", "name": f.filename, "size": len(data)}) + email_creation_id = "k1" + submission_creation_id = "k2" + create_email = { + "accountId": account_id, + "create": { + email_creation_id: { + "mailboxIds": {}, + "from": [{"email": user["username"]}], + "to": [{"email": x.strip()} for x in to.split(",") if x.strip()], + "subject": subject, + "textBody": body, + "attachments": [{"blobId": b["blobId"], "type": b["type"], "name": b["name"]} for b in blobs] + } + } + } + # Move to Drafts if requested, else submit and move to Sent + special = await get_special_mailboxes(ac, api, tuple(user["auth"]), account_id) + sent_id = special.get("sent") + drafts_id = special.get("drafts") + calls = [] + calls.append(["Email/set", create_email, "s1"]) + if action == "draft": + if drafts_id: + calls.append(["Email/set", {"accountId": account_id, "onSuccessUpdateEmail": {"#kEmail": {"mailboxIds": {drafts_id: True}}}}, "sdraft"]) + else: + calls.append(["EmailSubmission/set", {"accountId": account_id, "create": {submission_creation_id: {"emailId": {"resultOf":"s1","name":"Email/set","path": f"created/{email_creation_id}/id"}}}}, "s2"]) + if sent_id: + calls.append(["Email/set", {"accountId": account_id, "onSuccessUpdateEmail": {"#kEmail": {"mailboxIds": {sent_id: True}}}}, "ssent"]) + await jmap.call(ac, api, tuple(user["auth"]), calls) + return RedirectResponse("/mail", status_code=303) + +async def get_mailboxes(ac, api, auth, account_id): + res = await jmap.call(ac, api, auth, [ + ["Mailbox/query", {"accountId": account_id, "sort":[{"property":"sortOrder","isAscending": True},{"property":"name","isAscending": True}], "limit": 200}, "q1"], + ["Mailbox/get", {"accountId": account_id, "#ids": {"resultOf":"q1","name":"Mailbox/query","path":"ids"}, "properties":["id","name","role","totalEmails","unreadEmails"]}, "g1"] + ]) + boxes = [] + inbox_id = None + for name, data, _ in res.get("methodResponses", []): + if name == "Mailbox/get": + for b in data.get("list", []): + boxes.append({"id": b["id"], "name": b.get("name",""), "role": b.get("role"), "total": b.get("totalEmails",0), "unread": b.get("unreadEmails",0)}) + if b.get("role") == "inbox": + inbox_id = b["id"] + return boxes, inbox_id or (boxes[0]["id"] if boxes else None) + +@router.get("/mail/{email_id}/attach/{index}") +async def download_attachment(request: Request, email_id: str, index: int, user=Depends(require_user)): + atts = request.query_params.get("atts") + # Re-fetch message to resolve bodyStructure (simple approach; could cache) + async with jmap.client() as ac: + api = user["api_url"] + res = await jmap.call(ac, api, tuple(user["auth"]), [ + ["Email/get", {"ids": [email_id], "properties": ["bodyStructure"]}, "c1"] + ]) + bstruct = None + cid_map = {} + for name, data, _ in res.get("methodResponses", []): + if name == "Email/get": + lst = data.get("list", []) + if lst: + bstruct = lst[0].get("bodyStructure") + parts = [] + def walk(bs, out): + if not isinstance(bs, dict): return + if bs.get("disposition") == "attachment": + out.append(bs) + for p in bs.get("subParts", []) or []: + walk(p, out) + walk(bstruct, parts) + if index < 0 or index >= len(parts): + raise HTTPException(status_code=404, detail="Attachment not found") + p = parts[index] + blob = p.get("blobId") + name = p.get("name") or "attachment" + ctype = p.get("type") or "application/octet-stream" + + # Build download URL from session template + tmpl = user.get("download_url") or "" + primary = user.get("primary", {}) + account_id = primary.get("urn:ietf:params:jmap:mail") + url = tmpl + if "{accountId}" in url: + url = url.replace("{accountId}", account_id or "") + if "{blobId}" in url: + url = url.replace("{blobId}", blob or "") + if "{name}" in url: + from urllib.parse import quote + url = url.replace("{name}", quote(name)) + # Fallback naive pattern if template missing + if not url or "{" in url: + from urllib.parse import urljoin, quote + base = user.get("jmap_base") + url = urljoin(base, f"/download/{quote(account_id or '')}/{quote(blob or '')}/{quote(name)}") + + async with jmap.client() as ac: + r = await ac.get(url, auth=tuple(user["auth"])) + r.raise_for_status() + return StreamingResponse(io.BytesIO(r.content), media_type=ctype, headers={"Content-Disposition": f'attachment; filename="{name}"'}) + + +async def get_special_mailboxes(ac, api, auth, account_id): + res = await jmap.call(ac, api, auth, [ + ["Mailbox/query", {"accountId": account_id, "limit": 200}, "q1"], + ["Mailbox/get", {"accountId": account_id, "#ids": {"resultOf":"q1","name":"Mailbox/query","path":"ids"}, "properties":["id","role","name"]}, "g1"] + ]) + sent_id = drafts_id = inbox_id = None + boxes = {} + for name, data, _ in res.get("methodResponses", []): + if name == "Mailbox/get": + for b in data.get("list", []): + boxes[b["id"]] = b + role = b.get("role") + if role == "sent": sent_id = b["id"] + if role == "drafts": drafts_id = b["id"] + if role == "inbox": inbox_id = b["id"] + return {"sent": sent_id, "drafts": drafts_id, "inbox": inbox_id, "all": boxes} + + +@router.get("/mail/{email_id}/cid/{cid}") +async def fetch_cid(request: Request, email_id: str, cid: str, user=Depends(require_user)): + # Walk bodyStructure to find matching cid, then download via downloadUrl + async with jmap.client() as ac: + api = user["api_url"] + res = await jmap.call(ac, api, tuple(user["auth"]), [ + ["Email/get", {"ids": [email_id], "properties": ["bodyStructure"]}, "c1"] + ]) + bstruct = None + for name, data, _ in res.get("methodResponses", []): + if name == "Email/get": + lst = data.get("list", []) + if lst: + bstruct = lst[0].get("bodyStructure") + target = None + def walk(bs): + nonlocal target + if not isinstance(bs, dict) or target is not None: return + if bs.get("cid") and bs.get("cid").strip("<>") == cid: + target = bs + return + for p in bs.get("subParts", []) or []: + walk(p) + walk(bstruct) + if not target: + raise HTTPException(status_code=404, detail="Inline part not found") + blob = target.get("blobId") + ctype = target.get("type") or "application/octet-stream" + name = target.get("name") or "inline" + tmpl = user.get("download_url") or "" + primary = user.get("primary", {}) + account_id = primary.get("urn:ietf:params:jmap:mail") + from urllib.parse import quote, urljoin + if tmpl and "{accountId}" in tmpl and "{blobId}" in tmpl: + url = tmpl.replace("{accountId}", account_id or "").replace("{blobId}", blob or "") + if "{name}" in url: + url = url.replace("{name}", quote(name)) + else: + url = urljoin(user.get("jmap_base"), f"/download/{quote(account_id or '')}/{quote(blob or '')}/{quote(name)}") + async with jmap.client() as ac: + r = await ac.get(url, auth=tuple(user["auth"])) + r.raise_for_status() + return StreamingResponse(io.BytesIO(r.content), media_type=ctype) + + +@router.post("/upload") +async def upload_file(request: Request, file: UploadFile = File(...), user=Depends(require_user)): + async with jmap.client() as ac: + primary = user.get("primary", {}) + account_id = user.get("active_account") or primary.get("urn:ietf:params:jmap:mail") + upload_url = user.get("upload_url") + if not upload_url or not account_id: + raise HTTPException(status_code=400, detail="Upload not available") + url = upload_url.replace("{accountId}", account_id) + data = await file.read() + r = await ac.post(url, content=data, headers={"Content-Type": file.content_type or "application/octet-stream"}, auth=tuple(user["auth"])) + r.raise_for_status() + up = r.json() + return JSONResponse({"blobId": up.get("blobId"), "type": file.content_type or "application/octet-stream", "name": file.filename, "size": len(data)}) diff --git a/app/routes/webdav.py b/app/routes/webdav.py new file mode 100644 index 0000000..807554e --- /dev/null +++ b/app/routes/webdav.py @@ -0,0 +1,21 @@ +from typing import Optional +from fastapi import APIRouter, Request, Depends, HTTPException +from fastapi.responses import HTMLResponse +from fastapi.templating import Jinja2Templates +import pathlib +from .. import dav, jmap, config + +router = APIRouter() +templates = Jinja2Templates(directory=str(pathlib.Path(__file__).resolve().parent.parent / "templates")) + +def require_user(request: Request): + user = request.session.get("user") + if not user: + raise HTTPException(status_code=401) + return user + +@router.get("/webdav", response_class=HTMLResponse) +async def webdav_browse(request: Request, path: Optional[str]=None, user=Depends(require_user)): + async with jmap.client() as ac: + items = await dav.propfind(ac, config.WEBDAV_BASE, path, tuple(user["auth"])) + return templates.TemplateResponse("webdav.html", {"request": request, "items": items, "base": config.WEBDAV_BASE, "user": user}) diff --git a/app/static/css/style.css b/app/static/css/style.css new file mode 100644 index 0000000..7c3c50b --- /dev/null +++ b/app/static/css/style.css @@ -0,0 +1,30 @@ +:root { color-scheme: light dark; --header-bg: #f6f7f9; --header-fg: #111; --card-bg: #fff; } +@media (prefers-color-scheme: dark) { :root { --header-bg: #0f172a; --header-fg: #e5e7eb; --card-bg: #0b1222; } } +body { margin:0; font: 14px/1.45 system-ui, -apple-system, Segoe UI, Roboto, sans-serif; } +header, footer { padding: 10px 14px; border-bottom: 1px solid #4443; background: var(--header-bg); color: var(--header-fg); } +main { padding: 14px; max-width: 1100px; margin: 0 auto; } +nav a { margin-right: 12px; } +.btn { display:inline-block; padding:6px 10px; border:1px solid #6665; border-radius:8px; text-decoration:none; } +table { border-collapse: collapse; width: 100%; } +th, td { padding: 8px; border-bottom: 1px solid #6662; text-align: left; vertical-align: top; } +.muted { color: #888; } +input, textarea, select { padding:6px 8px; width:100%; box-sizing: border-box; } +form .row { display:grid; grid-template-columns: 160px 1fr; gap: 8px; align-items: center; margin-bottom:10px; } +.msg { cursor:pointer; } +.pill { display:inline-block; font-size:12px; padding:2px 6px; border:1px solid #6663; border-radius:999px; margin-right:6px;} +.nowrap { white-space: nowrap; } +.right { text-align:right; } +.toolbar { display:flex; gap:8px; align-items:center; margin:8px 0; } +.panel { border:1px solid #6663;padding:10px;border-radius:8px;margin:10px 0;white-space:pre-wrap } + +#dropzone{padding:16px;border:2px dashed #6665;border-radius:8px;text-align:center;margin:10px 0} + +.brand { display:flex; align-items:center; gap:10px; } +.brand .logo { height:28px; vertical-align:middle; } +.brand-link { text-decoration:none; color:inherit; } +header nav { margin-top:6px; } +.badge { display:inline-block; padding:0 6px; border-radius:10px; font-size:12px; background:#6662; margin-left:6px; } + +.card{background:var(--card-bg); border:1px solid #6663; border-radius:12px; padding:18px; box-shadow:0 2px 6px #0001;} +.center{display:grid; place-items:center; min-height:60vh;} +.logo-lg{height:64px;} diff --git a/app/static/img/logo.png b/app/static/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..105c55903aa9049ca13bd61a4c729cafbdcf5e5e GIT binary patch literal 190308 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

_qTf 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�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
%HMl247}8aEg%NUq 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 BIm`e6 literal 0 HcmV?d00001 diff --git a/app/templates/base.html b/app/templates/base.html new file mode 100644 index 0000000..4b203e0 --- /dev/null +++ b/app/templates/base.html @@ -0,0 +1,37 @@ + + + + + {{ title or "ihasmail" }} + + + + + + + + +

+
+ {% block content %}{% endblock %} +
+
ihasmail • JMAP • Sieve • DAV • FastAPI • reverse-proxy ready
+ + diff --git a/app/templates/calendar.html b/app/templates/calendar.html new file mode 100644 index 0000000..25c71f1 --- /dev/null +++ b/app/templates/calendar.html @@ -0,0 +1,15 @@ +{% extends "base.html" %} +{% block content %} +

Calendar (JMAP & CalDAV)

+

Listing upcoming events via JMAP. CalDAV endpoints available for DAV clients.

+ + + {% for e in events %} + + + + + + {% endfor %} +
WhenSummaryWhere
{{ e.start }} – {{ e.end }}{{ e.title }}{{ e.loc or "" }}
+{% endblock %} diff --git a/app/templates/compose.html b/app/templates/compose.html new file mode 100644 index 0000000..151c8bd --- /dev/null +++ b/app/templates/compose.html @@ -0,0 +1,11 @@ +{% extends "base.html" %} +{% block content %} +

Compose

+
+ +
+
+
+ +
+{% endblock %} diff --git a/app/templates/contacts.html b/app/templates/contacts.html new file mode 100644 index 0000000..cf2806e --- /dev/null +++ b/app/templates/contacts.html @@ -0,0 +1,19 @@ +{% extends "base.html" %} +{% block content %} +

Contacts (Directory via JMAP)

+
+
+ +
+
+ + + {% for c in contacts %} + + + + + + {% endfor %} +
NameEmailOrg
{{ c.name }}{{ c.email }}{{ c.org or "" }}
+{% endblock %} diff --git a/app/templates/login.html b/app/templates/login.html new file mode 100644 index 0000000..c5d84d6 --- /dev/null +++ b/app/templates/login.html @@ -0,0 +1,24 @@ +{% extends "base.html" %} +{% block content %} +
+
ihasmail
+

Sign in

+
+ +
+ + +
+
+ + +
+
+ + +
+ +
+
+

Credentials are sent to your JMAP server to obtain a session/auth token; they are not stored on the server.

+{% endblock %} diff --git a/app/templates/mail.html b/app/templates/mail.html new file mode 100644 index 0000000..3de29e6 --- /dev/null +++ b/app/templates/mail.html @@ -0,0 +1,26 @@ +{% extends "base.html" %} +{% block content %} +

Inbox

+
+
+ + +
+ Compose +
+ + + {% for m in messages %} + + + + + + + {% endfor %} +
WhenFromSubjectSize
{{ m.when }}{{ m.from }}{{ m.subject }}{{ m.size }}
+{% endblock %} diff --git a/app/templates/message.html b/app/templates/message.html new file mode 100644 index 0000000..6556c2c --- /dev/null +++ b/app/templates/message.html @@ -0,0 +1,25 @@ +{% extends "base.html" %} +{% block content %} +

{{ msg.subject or "(no subject)" }}

+

From {{ msg.from }} To {{ msg.to|join(", ") }}

+

{{ msg.when }}

+{% if msg.htmlBody %} +
{{ (msg.htmlBody | safe) }}
+{% elif msg.textBody %} +
{{ msg.textBody }}
+{% else %} +
(no body)
+{% endif %} +
+ Reply + Forward +
+{% if msg.attachments %} +

Attachments

+
    +{% for a in msg.attachments %} +
  • {{ a.name }} ({{ a.type }}, {{ a.size }} bytes)
  • +{% endfor %} +
+{% endif %} +{% endblock %} diff --git a/app/templates/webdav.html b/app/templates/webdav.html new file mode 100644 index 0000000..d2ed6d4 --- /dev/null +++ b/app/templates/webdav.html @@ -0,0 +1,15 @@ +{% extends "base.html" %} +{% block content %} +

WebDAV

+

Browsing {{ base }}

+ + + {% for i in items %} + + + + + + {% endfor %} +
NameTypeSize
{{ i.name }}{{ i.type }}{% if i.size is not none %}{{ i.size }}{% endif %}
+{% endblock %} diff --git a/app/utils.py b/app/utils.py new file mode 100644 index 0000000..f97bf2e --- /dev/null +++ b/app/utils.py @@ -0,0 +1,19 @@ +import datetime + +def human_size(n: int | None) -> str: + if n is None: return "" + units = ["B","KB","MB","GB","TB","PB"] + i = 0 + x = float(n) + while x >= 1024 and i < len(units)-1: + x /= 1024.0 + i += 1 + return f"{x:.0f} {units[i]}" + +def fmt_when(iso: str | None) -> str: + if not iso: return "" + try: + dt = datetime.datetime.fromisoformat(iso.replace("Z","+00:00")).astimezone() + return dt.strftime("%Y-%m-%d %H:%M") + except Exception: + return iso or "" diff --git a/charts/ihasmail/Chart.yaml b/charts/ihasmail/Chart.yaml new file mode 100644 index 0000000..9c39854 --- /dev/null +++ b/charts/ihasmail/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: ihasmail +description: ihasmail — JMAP webmail for Stalwart (FastAPI) +type: application +version: 0.1.0 +appVersion: "0.2.0" diff --git a/charts/ihasmail/templates/NOTES.txt b/charts/ihasmail/templates/NOTES.txt new file mode 100644 index 0000000..7bea5f9 --- /dev/null +++ b/charts/ihasmail/templates/NOTES.txt @@ -0,0 +1,7 @@ +Thanks for installing ihasmail! + +Get the service URL by running these commands: + export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "ihasmail.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}') + echo http://$SERVICE_IP:{{ .Values.service.port }}/ + +If using Ingress and DNS, browse to the configured host (e.g., https://ihasmail.example.com). diff --git a/charts/ihasmail/templates/_helpers.tpl b/charts/ihasmail/templates/_helpers.tpl new file mode 100644 index 0000000..a8643fe --- /dev/null +++ b/charts/ihasmail/templates/_helpers.tpl @@ -0,0 +1,20 @@ +{{- define "ihasmail.name" -}} +{{- .Chart.Name -}} +{{- end -}} + +{{- define "ihasmail.fullname" -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- define "ihasmail.labels" -}} +helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} +app.kubernetes.io/name: {{ include "ihasmail.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +app.kubernetes.io/version: {{ .Chart.AppVersion }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end -}} + +{{- define "ihasmail.selectorLabels" -}} +app.kubernetes.io/name: {{ include "ihasmail.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end -}} diff --git a/charts/ihasmail/templates/deployment.yaml b/charts/ihasmail/templates/deployment.yaml new file mode 100644 index 0000000..dcf21ff --- /dev/null +++ b/charts/ihasmail/templates/deployment.yaml @@ -0,0 +1,60 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "ihasmail.fullname" . }} + labels: + {{- include "ihasmail.labels" . | nindent 4 }} +spec: + replicas: 1 + selector: + matchLabels: + {{- include "ihasmail.selectorLabels" . | nindent 6 }} + template: + metadata: + labels: + {{- include "ihasmail.selectorLabels" . | nindent 8 }} + spec: + containers: + - name: app + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + env: + - name: APP_SECRET + valueFrom: + secretKeyRef: + name: {{ include "ihasmail.fullname" . }}-secret + key: APP_SECRET + - name: JMAP_BASE + value: {{ .Values.env.JMAP_BASE | quote }} + - name: CALDAV_BASE + value: {{ .Values.env.CALDAV_BASE | quote }} + - name: WEBDAV_BASE + value: {{ .Values.env.WEBDAV_BASE | quote }} + - name: COOKIE_NAME + value: {{ .Values.env.COOKIE_NAME | quote }} + - name: TRUST_PROXY + value: {{ .Values.env.TRUST_PROXY | quote }} + - name: UPSTREAM_TIMEOUT + value: {{ .Values.env.UPSTREAM_TIMEOUT | quote }} + ports: + - containerPort: 8000 + readinessProbe: + httpGet: + path: /healthz + port: 8000 + initialDelaySeconds: 5 + periodSeconds: 10 + livenessProbe: + httpGet: + path: /healthz + port: 8000 + initialDelaySeconds: 10 + periodSeconds: 20 +--- +apiVersion: v1 +kind: Secret +metadata: + name: {{ include "ihasmail.fullname" . }}-secret +type: Opaque +stringData: + APP_SECRET: {{ .Values.env.APP_SECRET | quote }} diff --git a/charts/ihasmail/templates/ingress.yaml b/charts/ihasmail/templates/ingress.yaml new file mode 100644 index 0000000..f3f99ba --- /dev/null +++ b/charts/ihasmail/templates/ingress.yaml @@ -0,0 +1,30 @@ +{{- if .Values.ingress.enabled }} +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: {{ include "ihasmail.fullname" . }} + {{- if .Values.ingress.className }} + annotations: + kubernetes.io/ingress.class: {{ .Values.ingress.className }} + {{- end }} +spec: + rules: + {{- range .Values.ingress.hosts }} + - host: {{ .host }} + http: + paths: + {{- range .paths }} + - path: {{ .path }} + pathType: {{ .pathType }} + backend: + service: + name: {{ include "ihasmail.fullname" $ }} + port: + number: {{ $.Values.service.port }} + {{- end }} + {{- end }} + {{- if .Values.ingress.tls }} + tls: + {{- toYaml .Values.ingress.tls | nindent 4 }} + {{- end }} +{{- end }} diff --git a/charts/ihasmail/templates/service.yaml b/charts/ihasmail/templates/service.yaml new file mode 100644 index 0000000..3c300bf --- /dev/null +++ b/charts/ihasmail/templates/service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "ihasmail.fullname" . }} + labels: + {{- include "ihasmail.labels" . | nindent 4 }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + targetPort: 8000 + protocol: TCP + name: http + selector: + {{- include "ihasmail.selectorLabels" . | nindent 4 }} diff --git a/charts/ihasmail/values.yaml b/charts/ihasmail/values.yaml new file mode 100644 index 0000000..3e37d9c --- /dev/null +++ b/charts/ihasmail/values.yaml @@ -0,0 +1,32 @@ +image: + repository: ghcr.io/your-org/ihasmail + tag: latest + pullPolicy: IfNotPresent + +service: + type: ClusterIP + port: 8000 + +ingress: + enabled: false + className: "" + hosts: + - host: ihasmail.example.com + paths: + - path: / + pathType: Prefix + tls: [] + +env: + APP_SECRET: "CHANGE_ME" + JMAP_BASE: "https://mail.example.com/jmap" + CALDAV_BASE: "https://mail.example.com/caldav/" + WEBDAV_BASE: "https://mail.example.com/webdav/" + COOKIE_NAME: "ihasmail" + TRUST_PROXY: "1" + UPSTREAM_TIMEOUT: "15" + +resources: {} +nodeSelector: {} +tolerations: [] +affinity: {} diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..bd3e870 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,11 @@ +services: + ihasmail: + build: . + image: ihasmail:latest + env_file: .env + restart: unless-stopped + networks: [edge] + ports: + - "127.0.0.1:8080:8000" +networks: + edge: {} diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..d4f37b1 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,30 @@ +[build-system] +requires = ["setuptools>=61.0"] +build-backend = "setuptools.build_meta" + +[project] +name = "ihasmail" +version = "0.2.0" +description = "ihasmail — JMAP webmail for Stalwart (FastAPI, HTMX/Jinja)" +authors = [{name = "John Coffey", email = "john@example.com"}] +readme = "README.md" +requires-python = ">=3.10" +license = {text = "GPL-3.0-or-later"} +dependencies = [ + "fastapi>=0.111", + "uvicorn[standard]>=0.30", + "httpx>=0.27", + "jinja2>=3.1", + "bleach>=6.1", + "python-multipart>=0.0.9", +] + +[project.optional-dependencies] +dev = [ + "pytest>=8.2", + "anyio>=4.4", + "httpx>=0.27", +] + +[tool.pytest.ini_options] +addopts = "-q" diff --git a/tests/test_smoke.py b/tests/test_smoke.py new file mode 100644 index 0000000..c7b9b08 --- /dev/null +++ b/tests/test_smoke.py @@ -0,0 +1,7 @@ +from fastapi.testclient import TestClient +from app.main import app + +def test_root_redirect(): + client = TestClient(app) + r = client.get("/", allow_redirects=False) + assert r.status_code in (302, 303)
+ + +