From 38f143959b315bbd0e01e06719ce99f2bc237716 Mon Sep 17 00:00:00 2001 From: b Date: Sat, 2 Jan 2016 22:23:43 +0000 Subject: [PATCH] AGPL license oldlogs accepts arguments git-svn-id: svn://botcastle1b/yplom/proxy@16 05ce6ebb-7522-4a6e-a768-0026ae12be9f --- access.1.c | 16 + access.1.pl | 1 + agpl.txt | 661 ++++++++++++++++ cleararch.1.pl | 150 ++-- configure.pl | 18 + oldlogs.1.pl | 196 +++-- proxy.1.c | 16 + proxy.1.pl | 17 + proxy_lib.1.pm | 1951 ++++++++++++++++++++++++------------------------ rewrite.1.pl | 16 + 10 files changed, 1930 insertions(+), 1112 deletions(-) create mode 100644 agpl.txt diff --git a/access.1.c b/access.1.c index 442b827..af60145 100644 --- a/access.1.c +++ b/access.1.c @@ -1,9 +1,25 @@ // access.c is generated from access.1.c +// 02.01.2016 // // This is the wrapper for access.pl. // It's run with SETUID to have accesss to some files where the www server // should not. That's why it has a C wrapper. In modern systems running scripts // directly with SETUID is considered unsafe and not allowed. +// +// Copyright (C) 2015-2016 Balthasar Szczepański +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero 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 Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . #include #include diff --git a/access.1.pl b/access.1.pl index 6bbaa1d..c961ceb 100644 --- a/access.1.pl +++ b/access.1.pl @@ -1,6 +1,7 @@ ###PERL; # access.pl is generated from access.1.pl +# 02.01.2016 # # This is the Squid helper program used for access control, it detects if the # proxy is unlocked for the user and tells Squid if it can open the tunnel or diff --git a/agpl.txt b/agpl.txt new file mode 100644 index 0000000..70eec1e --- /dev/null +++ b/agpl.txt @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 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 Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are 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. + + 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. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + 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 Affero 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. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + 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 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 work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero 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 Affero 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 Affero 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 Affero 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 Affero 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 Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + 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 AGPL, see +. diff --git a/cleararch.1.pl b/cleararch.1.pl index 25dae8c..739ec6d 100644 --- a/cleararch.1.pl +++ b/cleararch.1.pl @@ -1,67 +1,83 @@ -###PERL; - -# cleararch is generated from cleararch.1.pl. -# -# This script recursively clears the archive from old files. Otherwise it would -# grow forever. - -use POSIX qw(strftime); - -###ARCH_PATH; -###TIMEOUT_ARCH; - -$time = time(); -print strftime('%d.%m.%Y %H:%M:%S', gmtime($time))."\n"; -cleardir(ARCH_PATH); - -sub cleardir { - (my $dirpath) = @_; - my $dir; - my $returnvalue = 1; - my $subpath; - my $subpathfull; - my @stat; - unless ( opendir ($dir, $dirpath)) { - print "Failed to open: $dirpath\/\n"; - return 0; - } - while (defined($subpath = readdir $dir)) { - $subpathfull=$dirpath.$subpath; - if ($subpath =~ /^\.\.?$/) { - next; - } - if (-f $subpathfull) { - unless (@stat = stat $subpathfull) { - print "Stat fail: $subpathfull\n"; - $returnvalue = 0; - next; - } - if (abs($time - $stat[9]) > TIMEOUT_ARCH) { - unless (unlink $subpathfull) { - print "Failed to remove: $subpathfull\n"; - $returnvalue = 0; - next; - } - print "Removed: $subpathfull\n"; - } - else { - $returnvalue = 0; - } - } - elsif (-d $subpathfull) { - unless (cleardir($subpathfull.'/')) { - $returnvalue = 0; - next; - } - unless (rmdir($subpathfull.'/')) { - print "Failed to remove: $subpathfull\/\n"; - $returnvalue = 0; - next; - } - print "Removed: $subpathfull\/\n"; - } - } - closedir($dir); - return $returnvalue; -} -print "\n"; +###PERL; + +# cleararch is generated from cleararch.1.pl. +# 02.01.2016 +# +# This script recursively clears the archive from old files. Otherwise it would +# grow forever. +# +# Copyright (C) 2015-2016 Balthasar Szczepański +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero 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 Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +use POSIX qw(strftime); + +###ARCH_PATH; +###TIMEOUT_ARCH; + +$time = time(); +print strftime('%d.%m.%Y %H:%M:%S', gmtime($time))."\n"; +cleardir(ARCH_PATH); + +sub cleardir { + (my $dirpath) = @_; + my $dir; + my $returnvalue = 1; + my $subpath; + my $subpathfull; + my @stat; + unless ( opendir ($dir, $dirpath)) { + print "Failed to open: $dirpath\/\n"; + return 0; + } + while (defined($subpath = readdir $dir)) { + $subpathfull=$dirpath.$subpath; + if ($subpath =~ /^\.\.?$/) { + next; + } + if (-f $subpathfull) { + unless (@stat = stat $subpathfull) { + print "Stat fail: $subpathfull\n"; + $returnvalue = 0; + next; + } + if (abs($time - $stat[9]) > TIMEOUT_ARCH) { + unless (unlink $subpathfull) { + print "Failed to remove: $subpathfull\n"; + $returnvalue = 0; + next; + } + print "Removed: $subpathfull\n"; + } + else { + $returnvalue = 0; + } + } + elsif (-d $subpathfull) { + unless (cleardir($subpathfull.'/')) { + $returnvalue = 0; + next; + } + unless (rmdir($subpathfull.'/')) { + print "Failed to remove: $subpathfull\/\n"; + $returnvalue = 0; + next; + } + print "Removed: $subpathfull\/\n"; + } + } + closedir($dir); + return $returnvalue; +} +print "\n"; diff --git a/configure.pl b/configure.pl index 1c9545d..19b0dcf 100755 --- a/configure.pl +++ b/configure.pl @@ -1,11 +1,29 @@ #!/usr/bin/perl +# configure.pl +# 02.01.2016 +# # The proxy software, when run on a server, will use different directories, # host names, tcp ports, etc. than the server on which this software was # originally written. # These things are defined in the file 'settings'. # This script is called from the makefile. It reads the settings file and # inserts the information in the source files. +# +# Copyright (C) 2015-2016 Balthasar Szczepański +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero 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 Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . unless ($ARGV[0]) { print STDERR "Configfile missing.\n"; diff --git a/oldlogs.1.pl b/oldlogs.1.pl index 65e9497..67fca65 100644 --- a/oldlogs.1.pl +++ b/oldlogs.1.pl @@ -1,77 +1,119 @@ -###PERL; - -# oldlogs is generated from oldlogs.1.pl. -# -# This script renames log files if they are big enough. -# Compresses or removes older log files. - -###LOG_PATH; -###GZIP_PATH; -###LOG_SIZE_LIMIT; -###LOGS_TOTAL; -###LOGS_UNCOMPRESSED; - -if ( opendir ($dir, LOG_PATH)) { - while ($subpath = readdir $dir) { - if ($subpath !~ /\.log$/) { - next; - } - $fullpath=LOG_PATH.$subpath; - unless (-f $fullpath) { - next; - } - unless (@stat = stat($fullpath)) { - next; - } - if ($stat[7] > LOG_SIZE_LIMIT) { - movelog($fullpath,0,0); - } - - } - closedir($dir); -} - -sub movelog { - (my $path, my $number, my $gz) = @_; - my $nextgz = 0; - my $thispath; - my $nextpath; - my $nextnumber=$number+1; - my @gzip_arg = (GZIP_PATH, '-q', '-9','-f'); - - $thispath = $path.(($number != 0)?'.'.$number.($gz?'.gz':''):''); - if ($number == LOGS_TOTAL) { - if (unlink $thispath) { - return 1; - } - else { - return 0; - } - } - if ($number == LOGS_UNCOMPRESSED) { - $nextgz=1; - $nextpath = $path.'.'.$nextnumber.'.gz'; - } - else { - $nextpath = $path.'.'.$nextnumber.($gz?'.gz':''); - } - - if (-e $nextpath) { - unless (movelog($path,$nextnumber,($nextgz or $gz)?1:0)) { - return 0; - } - } - - if ($nextgz) { - push @gzip_arg, $thispath; - unless (! system (@gzip_arg)) { - return 0; - } - $thispath .= '.gz'; - } - - unless (rename ($thispath, $nextpath)) { - return 0; - } - return 1; -} +###PERL; + +# oldlogs is generated from oldlogs.1.pl. +# 02.01.2016 +# +# This script renames log files if they are big enough. +# Compresses or removes older log files. +# +# Copyright (C) 2015-2016 Balthasar Szczepański +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero 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 Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + + +###GZIP_PATH; +###LOG_PATH; +###LOG_SIZE_LIMIT; +###LOGS_TOTAL; +###LOGS_UNCOMPRESSED; + +if ($ARGV[0] ne '') { + $log_path = $ARGV[0]; +} +else { + $log_path = LOG_PATH; +} +if ($ARGV[1] =~ /^([0-9]+)$/) { + $log_size_limit = $1; +} +else { + $log_size_limit = LOG_SIZE_LIMIT; +} +if ($ARGV[2] =~ /^([0-9]+)$/) { + $logs_total = $1; +} +else { + $logs_total = LOGS_TOTAL; +} +if ($ARGV[3] =~ /^([0-9]+)$/) { + $logs_uncompressed = $1; +} +else { + $logs_uncompressed = LOGS_UNCOMPRESSED; +} + +if ( opendir ($dir, $log_path)) { + while ($subpath = readdir $dir) { + if ($subpath !~ /\.log$/) { + next; + } + $fullpath=$log_path.$subpath; + unless (-f $fullpath) { + next; + } + unless (@stat = stat($fullpath)) { + next; + } + if ($stat[7] > $log_size_limit) { + movelog($fullpath,0,0); + } + + } + closedir($dir); +} + +sub movelog { + (my $path, my $number, my $gz) = @_; + my $nextgz = 0; + my $thispath; + my $nextpath; + my $nextnumber=$number+1; + my @gzip_arg = (GZIP_PATH, '-q', '-9','-f'); + + $thispath = $path.(($number != 0)?'.'.$number.($gz?'.gz':''):''); + if ($number == $logs_total) { + if (unlink $thispath) { + return 1; + } + else { + return 0; + } + } + if ($number == $logs_uncompressed) { + $nextgz=1; + $nextpath = $path.'.'.$nextnumber.'.gz'; + } + else { + $nextpath = $path.'.'.$nextnumber.($gz?'.gz':''); + } + + if (-e $nextpath) { + unless (movelog($path,$nextnumber,($nextgz or $gz)?1:0)) { + return 0; + } + } + + if ($nextgz) { + push @gzip_arg, $thispath; + unless (! system (@gzip_arg)) { + return 0; + } + $thispath .= '.gz'; + } + + unless (rename ($thispath, $nextpath)) { + return 0; + } + return 1; +} diff --git a/proxy.1.c b/proxy.1.c index 85fa4aa..ecb8132 100644 --- a/proxy.1.c +++ b/proxy.1.c @@ -1,9 +1,25 @@ // proxy.c is generated from proxy.1.c +// 02.01.2016 // // This is the wrapper for proxy.pl. // It's run with SETUID to have accesss to some files where the www server // should not. That's why it has a C wrapper. In modern systems running scripts // directly with SETUID is considered unsafe and not allowed. +// +// Copyright (C) 2015-2016 Balthasar Szczepański +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero 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 Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . #include #include diff --git a/proxy.1.pl b/proxy.1.pl index a035766..ee23981 100755 --- a/proxy.1.pl +++ b/proxy.1.pl @@ -1,6 +1,7 @@ ###PERL; # proxy.pl is generated from proxy.1.pl +# 02.01.2016 # # This is the proxy software. It's launched as a CGI program by the http server. # @@ -31,6 +32,22 @@ # https://tools.ietf.org/html/rfc2616 # https://tools.ietf.org/html/rfc3875 # https://tools.ietf.org/html/rfc2396 +# +# Copyright (C) 2015-2016 Balthasar Szczepański +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero 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 Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + use strict; #use warnings; diff --git a/proxy_lib.1.pm b/proxy_lib.1.pm index 2671a30..43ae7b6 100644 --- a/proxy_lib.1.pm +++ b/proxy_lib.1.pm @@ -1,968 +1,983 @@ -# proxy_lib.pm is generated from proxy_lib.1.pm -# -# Some of the functions would be used by multiple bots for different platforms -# using the proxy archive. - -package proxy_lib; - -use strict; -#use warnings -use Exporter; -use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); - -use constant entitycode => { - 'amp' => '&', - 'gt' => '>', - 'lt' => '<', - 'quot' => '"', - 'acute' => '´', - 'cedil' => '¸', - 'circ' => 'ˆ', - 'macr' => '¯', - 'middot' => '·', - 'tilde' => '˜', - 'uml' => '¨', - 'Aacute' => 'Á', - 'aacute' => 'á', - 'Acirc' => 'Â', - 'acirc' => 'â', - 'AElig' => 'Æ', - 'aelig' => 'æ', - 'Agrave' => 'À', - 'agrave' => 'à', - 'Aring' => 'Å', - 'aring' => 'å', - 'Atilde' => 'Ã', - 'atilde' => 'ã', - 'Auml' => 'Ä', - 'auml' => 'ä', - 'Ccedil' => 'Ç', - 'ccedil' => 'ç', - 'Eacute' => 'É', - 'eacute' => 'é', - 'Ecirc' => 'Ê', - 'ecirc' => 'ê', - 'Egrave' => 'È', - 'egrave' => 'è', - 'ETH' => 'Ð', - 'eth' => 'ð', - 'Euml' => 'Ë', - 'euml' => 'ë', - 'Iacute' => 'Í', - 'iacute' => 'í', - 'Icirc' => 'Î', - 'icirc' => 'î', - 'Igrave' => 'Ì', - 'igrave' => 'ì', - 'Iuml' => 'Ï', - 'iuml' => 'ï', - 'Ntilde' => 'Ñ', - 'ntilde' => 'ñ', - 'Oacute' => 'Ó', - 'oacute' => 'ó', - 'Ocirc' => 'Ô', - 'ocirc' => 'ô', - 'OElig' => 'Œ', - 'oelig' => 'œ', - 'Ograve' => 'Ò', - 'ograve' => 'ò', - 'Oslash' => 'Ø', - 'oslash' => 'ø', - 'Otilde' => 'Õ', - 'otilde' => 'õ', - 'Ouml' => 'Ö', - 'ouml' => 'ö', - 'Scaron' => 'Š', - 'scaron' => 'š', - 'szlig' => 'ß', - 'THORN' => 'Þ', - 'thorn' => 'þ', - 'Uacute' => 'Ú', - 'uacute' => 'ú', - 'Ucirc' => 'Û', - 'ucirc' => 'û', - 'Ugrave' => 'Ù', - 'ugrave' => 'ù', - 'Uuml' => 'Ü', - 'uuml' => 'ü', - 'Yacute' => 'Ý', - 'yacute' => 'ý', - 'yuml' => 'ÿ', - 'Yuml' => 'Ÿ', - 'cent' => '¢', - 'curren' => '¤', - 'euro' => '€', - 'pound' => '£', - 'yen' => '¥', - 'brvbar' => '¦', - 'bull' => '•', - 'copy' => '©', - 'dagger' => '†', - 'Dagger' => '‡', - 'frasl' => '⁄', - 'hellip' => '…', - 'iexcl' => '¡', - 'image' => 'ℑ', - 'iquest' => '¿', - 'lrm' => '‎', - 'mdash' => '—', - 'ndash' => '–', - 'not' => '¬', - 'oline' => '‾', - 'ordf' => 'ª', - 'ordm' => 'º', - 'para' => '¶', - 'permil' => '‰', - 'prime' => '′', - 'Prime' => '″', - 'real' => 'ℜ', - 'reg' => '®', - 'rlm' => '‏', - 'sect' => '§', - 'shy' => '­', - 'sup1' => '¹', - 'trade' => '™', - 'weierp' => '℘', - 'bdquo' => '„', - 'laquo' => '«', - 'ldquo' => '“', - 'lsaquo' => '‹', - 'lsquo' => '‘', - 'raquo' => '»', - 'rdquo' => '”', - 'rsaquo' => '›', - 'rsquo' => '’', - 'sbquo' => '‚', - 'emsp' => ' ', - 'ensp' => ' ', - 'nbsp' => ' ', - 'thinsp' => ' ', - 'zwj' => '‍', - 'zwnj' => '‌', - 'deg' => '°', - 'divide' => '÷', - 'frac12' => '½', - 'frac14' => '¼', - 'frac34' => '¾', - 'ge' => '≥', - 'le' => '≤', - 'minus' => '−', - 'sup2' => '²', - 'sup3' => '³', - 'times' => '×', - 'alefsym' => 'ℵ', - 'and' => '∧', - 'ang' => '∠', - 'asymp' => '≈', - 'cap' => '∩', - 'cong' => '≅', - 'cup' => '∪', - 'empty' => '∅', - 'equiv' => '≡', - 'exist' => '∃', - 'fnof' => 'ƒ', - 'forall' => '∀', - 'infin' => '∞', - 'int' => '∫', - 'isin' => '∈', - 'lang' => '⟨', - 'lceil' => '⌈', - 'lfloor' => '⌊', - 'lowast' => '∗', - 'micro' => 'µ', - 'nabla' => '∇', - 'ne' => '≠', - 'ni' => '∋', - 'notin' => '∉', - 'nsub' => '⊄', - 'oplus' => '⊕', - 'or' => '∨', - 'otimes' => '⊗', - 'part' => '∂', - 'perp' => '⊥', - 'plusmn' => '±', - 'prod' => '∏', - 'prop' => '∝', - 'radic' => '√', - 'rang' => '⟩', - 'rceil' => '⌉', - 'rfloor' => '⌋', - 'sdot' => '⋅', - 'sim' => '∼', - 'sub' => '⊂', - 'sube' => '⊆', - 'sum' => '∑', - 'sup' => '⊃', - 'supe' => '⊇', - 'there4' => '∴', - 'Alpha' => 'Α', - 'alpha' => 'α', - 'Beta' => 'Β', - 'beta' => 'β', - 'Chi' => 'Χ', - 'chi' => 'χ', - 'Delta' => 'Δ', - 'delta' => 'δ', - 'Epsilon' => 'Ε', - 'epsilon' => 'ε', - 'Eta' => 'Η', - 'eta' => 'η', - 'Gamma' => 'Γ', - 'gamma' => 'γ', - 'Iota' => 'Ι', - 'iota' => 'ι', - 'Kappa' => 'Κ', - 'kappa' => 'κ', - 'Lambda' => 'Λ', - 'lambda' => 'λ', - 'Mu' => 'Μ', - 'mu' => 'μ', - 'Nu' => 'Ν', - 'nu' => 'ν', - 'Omega' => 'Ω', - 'omega' => 'ω', - 'Omicron' => 'Ο', - 'omicron' => 'ο', - 'Phi' => 'Φ', - 'phi' => 'φ', - 'Pi' => 'Π', - 'pi' => 'π', - 'piv' => 'ϖ', - 'Psi' => 'Ψ', - 'psi' => 'ψ', - 'Rho' => 'Ρ', - 'rho' => 'ρ', - 'Sigma' => 'Σ', - 'sigma' => 'σ', - 'sigmaf' => 'ς', - 'Tau' => 'Τ', - 'tau' => 'τ', - 'Theta' => 'Θ', - 'theta' => 'θ', - 'thetasym' => 'ϑ', - 'upsih' => 'ϒ', - 'Upsilon' => 'Υ', - 'upsilon' => 'υ', - 'Xi' => 'Ξ', - 'xi' => 'ξ', - 'Zeta' => 'Ζ', - 'zeta' => 'ζ', - 'crarr' => '↵', - 'darr' => '↓', - 'dArr' => '⇓', - 'harr' => '↔', - 'hArr' => '⇔', - 'larr' => '←', - 'lArr' => '⇐', - 'rarr' => '→', - 'rArr' => '⇒', - 'uarr' => '↑', - 'uArr' => '⇑', - 'clubs' => '♣', - 'diams' => '♦', - 'hearts' => '♥', - 'spades' => '♠', - 'loz' => '◊', -}; - -###ARCH_PATH; -###ACCESS_PATH; -###TIMEOUT_UNLOCK; -###TIMEOUT_INACT; -###UNLOCK_PROXY_HOST; - -$VERSION = 0.000004; -@ISA = qw(Exporter); -@EXPORT = (); -@EXPORT_OK = qw(access divideurl entitydecode entityencode formatheader getcgi joinurl path2url url2path path2urldiv readconfigfile readheaderfile urlencode urldecode urldiv2path); -%EXPORT_TAGS = (); - -# This function checks if the user has unlocked the proxy. Nonzero means yes. -sub access { - (my $time, my $ip, my $host) = @_; - my $timeout_unlock = TIMEOUT_UNLOCK*60; - my $timeout_inact = TIMEOUT_INACT*60; - my $accesspath=''; - my $accessfile; - my $lasttime; - my $unlocktime; - - if($host =~ UNLOCK_PROXY_HOST){ - return 1; - } - - # Check if IP - if ($ip =~ /^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)$/) { - $ip = $1; - - # 127.0.0.1 is always allowed. All https requests are tunnelled through - # 127.0.0.1. - if ($ip eq '127.0.0.1') { - return 1; - } - - # If access file doesn't exist the proxy is not unlocked for this IP. - $accesspath=ACCESS_PATH.$ip; - if (! (-e $accesspath)) { - return 0; - } - - elsif (open ($accessfile,"+<",$accesspath)) { - # The access file has to be locked otherwise one process may read it while - # another one updates it. - unless (flock ($accessfile, 2)) { - close ($accessfile); - return 0; - } - # First line is the timestamp of proxy unlocking. Second line is the - # timestamp of last access. - $unlocktime=<$accessfile>; - $lasttime=<$accessfile>; - - $unlocktime =~ s/[\r\n]//g; - $lasttime =~ s/[\r\n]//g; - - # The timestamps must be numbers. - if ($unlocktime =~ /^([0-9]+)$/) { - $unlocktime=int($1); - } - else { - close ($accessfile); - return 0; - } - - if ($lasttime =~ /^([0-9]+)$/) { - $lasttime=int($1); - } - else { - close ($accessfile); - return 0; - } - - if ((abs($time-$unlocktime)>$timeout_unlock) or (abs($time-$lasttime)>$timeout_inact)){ - # If too much time passed proxy is not unlocked any more. Also the - # access file is now useless and will be removed. - close ($accessfile); - unlink $accesspath; - return 0; - } - else { - # the proxy is unlocked. The access file will now be updated. - if (seek($accessfile, 0, 0)) { - print $accessfile "$unlocktime\n$time\n"; - truncate ($accessfile , tell($accessfile)); - } - close ($accessfile); - return 1; - } - } - else { - return 0; - } - } - else { - return 0; - } -} - - -# Function to check URL and divide in parts: protocol, hostname, port number, -# path, query string. -sub divideurl { - my $url = $_[0]; - my $prot; - my $hostportpathquery; - my $hostportpath; - my $query; - my $hostport; - my $path; - my $part; - my $host; - my $port; - - if ($url =~ /^([A-Za-z]+):\/\/(.*)/) { - $prot = $1; - $hostportpathquery = $2; - } - else { - return (); - } - - if ($prot !~ /^https?$/) { - return (); - } - - if ($hostportpathquery eq ''){ - return (); - } - - if ($hostportpathquery =~ /^([^?]+)\?(.*)$/) { - $hostportpath = $1; - $query = $2; - - if ($query !~ /^((%[0-9A-Fa-f][0-9A-Fa-f])|([A-Za-z0-9;\/\?:@&=\+\$\,\-_\.~\*'\(\)]))*$/) { - return (); - } - } - else { - $hostportpath = $hostportpathquery; - $query = ''; - } - - if($hostportpath =~ /^([^\/]+)(\/.*)$/){ - $hostport = $1; - $path = $2; - - if ($path !~ /^((%[0-9A-Fa-f][0-9A-Fa-f])|([A-Za-z0-9:;@&=\+\$\,-_\.~\*'\(\)]))*$/) { - return (); - } - $path=urldecode($path); - } - else { - $hostport = $hostportpath; - $path = ''; - } - - if ($hostport =~ /^(.*):([0-9]+)$/) { - $host = $1; - $port = $2; - } - else { - $host=$hostport; - $port=''; - } - - if ($host !~ /^[A-Za-z0-9\-\.]+$/) { - return (); - } - - return ($prot, $host, $port, $path, $query); -} - -# Function for decoding URL-encoded text -sub urldecode { - my $t = $_[0]; - $t =~ s/\+/ /g; - $t =~ s/%([a-fA-F0-9]{2})/chr(hex($1))/eg; - return $t; -} - -# Function for decoding html entities; by number decimal, haeadecimal or by name -sub entitydecode { - my $t = $_[0]; - $t =~ s/&(#?[a-zA-Z0-9]+);/entitydecode1ch($1)/eg; - return $t; -} - -# function to encode entities, decimal, -sub entityencode { - (my $t, my $all) = @_; - if ($all) { - $t =~ s/(.)/sprintf('\&#%02hu;',ord($1))/eg; - } - else { - $t =~ s/([\"=><\&])/sprintf('&#%02hu;',ord($1))/eg; - } - return $t; -} - -sub urlencode { - (my $t, my $all) = @_; - if ($all) { - $t =~ s/(.)/sprintf('%%%02hX',ord($1))/eg; - } - else { - $t =~ s/([^0-9A-Za-z.~\-_])/sprintf('%%%02hX',ord($1))/eg; - } - return $t; -} - -# Function for decoding one html entity, called from entitydecode(). -sub entitydecode1ch { - my $t = $_[0]; - # decode decimal number - if ($t =~ /^#([0-9]+)$/) { - return chr($1); - } - # decode hexadecimal number - elsif ($t =~ /^#x([0-9A-Fa-f]+)$/) { - return chr(hex($1)); - } - # decode entity name - elsif ($t =~ /^([A-Za-z0-9]+)$/) { - return entitycode->{$1}; - } - else { - return ''; - } -} - -# The function to get CGI parameters from string. -# Format is: name=url_encoded_value&name=url_encoded_value& ... &name=url_encoded_value -sub getcgi { - my $arg; - my $val; - my %cgi; - my $i = $_[0]; - $i =~ s/[\r\n]//g; - my @s = split('&',$i); - foreach my $l ( @s) { - ($arg,$val)=split('=',$l); - $cgi{$arg}=urldecode($val); - } - return %cgi; -} - -# Function for formatting header field names. -# The Environment variable name is like this: HTTP_HEADER_NAME or HEADER_NAME. -# But should be Header-Name. -# Actually the names are case-insensitive but in practise they often look like -# this. (Otherwise suspicious?) -sub formatheader { - my $t = $_[0]; - $t =~ s/^HTTP_//; - $t = lc($t); - $t =~ s/^([a-z])/uc($1)/e; - $t =~ s/_([a-z])/'-'.uc($1)/eg; - return $t; -} - -# Function to convert URL (divided) to archive path. Also creates required -# directories if $mkdir true. -# Returns the path on success and undef on fail. -# Inspired by the MIRA browser. -sub urldiv2path { - (my $prot, my $host, my $port, my $path, my $query, my $mkdir) = @_; - - my $archpath = ARCH_PATH; - - # First subdir: protocol @p port_number - if ($prot =~ /^(https?)$/) { - $archpath .= $1; - } - else { - return undef; - } - - unless ($port){ - $port=($prot eq 'https')?'443':'80'; - } - if ($port =~ /^([0-9]+)$/) { - $archpath .= "\@p$1"; - } - else { - return undef; - } - - if ($mkdir and !(-d $archpath)) - { - unless (mkdir $archpath) { - return undef; - } - } - - # Host name: each segment between dots is a subdir, revedrsed order, last part - # ends with @n. - # For example www.example.com becomes - # ... /com/example/www@/ ... - - # When segment is longer than 120 characters it's divided into 64 character - # parts ending with '-' until the last one is not longer than 120. - # For example - # www.aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjjkkkkkkkkkkllllllllllmmmmmmmmmmnnnnnnnnnnoooooooooopppppppppprrrrrrrrrrssssssssssttttttttttuuuuuuuuuuwwwwwwwwwwyyyyyyyyyyzzzzzzzzzz.com - # becomes - # ... /com/aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggg-/gggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjjkkkkkkkkkkllllllllllmmmmmmmm-/mmnnnnnnnnnnoooooooooopppppppppprrrrrrrrrrssssssssssttttttttttuuuuuuuuuuwwwwwwwwwwyyyyyyyyyyzzzzzzzzzz/www@n/ ... - - if($host =~ /^([A-Za-z0-9\-\.]+)$/) { - $host = $1; - } - else { - return undef; - } - - while ((my $ind = rindex ($host, '.'))>=0) { - my $part= substr $host, $ind+1; - $host = substr $host, 0, $ind; - - while (length ($part) > 120) { - $archpath .= '/'.substr($part,0,64).'-'; - $part = substr($part,64); - if ($mkdir and !(-d $archpath)) - { - unless (mkdir $archpath) { - return undef; - } - } - } - $archpath .= '/'.$part; - if ($mkdir and !(-d $archpath)) - { - unless (mkdir $archpath) { - return undef; - } - } - } - while (length ($host) > 120) { - $archpath .= '/'.substr($host,0,64).'-'; - $host = substr($host,64); - if ($mkdir and !(-d $archpath)) - { - unless (mkdir $archpath) { - return undef; - } - } - } - $archpath .= '/'.$host.'@n'; - if ($mkdir and !(-d $archpath)) - { - unless (mkdir $archpath) { - return undef; - } - } - - # Path: each segment between '/' is subdir. The segment after the last '/' is - # not a subdir - it is part of the file name. And it will be appended with - # some characters outside of this function: @g, @h, @u or @v. - # Exception: when there is a query string the last segment is a subdir too and - # ends with q. - # Characters that are not letters or numbers or '_' or '.' are encoded. Like - # in URL-encoding but with '@' instead of '%'. - # When segment is longer than 120 characters it's divided into 64 character - # parts ending with '-' until the last one is not longer than 120. - - # For example: - # /some/path/?a=1 becomes ... /some/path@q/ ... - # /some/other-path becomes ... /some/other@2Dpath - # /path/aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjjkkkkkkkkkkllllllllllmmmmmmmmmmnnnnnnnnnnoooooooooopppppppppprrrrrrrrrrssssssssssttttttttttuuuuuuuuuuwwwwwwwwwwyyyyyyyyyyzzzzzzzzzz/yyy - # becomes - # ... /path/aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggg-/gggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjjkkkkkkkkkkllllllllllmmmmmmmm-/mmnnnnnnnnnnoooooooooopppppppppprrrrrrrrrrssssssssssttttttttttuuuuuuuuuuwwwwwwwwwwyyyyyyyyyyzzzzzzzzzz/yyy - - $path =~ s/^\///; - - while ((my $ind = index ($path, '/'))>=0) { - my $part = substr $path, 0, $ind; - $path= substr $path, $ind+1; - - $part =~ s/([^A-Za-z0-9_\.])/sprintf ("@%02X",ord($1))/eg; - - while (length ($part) > 120) { - $archpath .= '/'.substr($part,0,64).'-'; - $part = substr($part,64); - if ($mkdir and !(-d $archpath)) - { - unless (mkdir $archpath) { - return undef; - } - } - } - $archpath .= '/'.$part; - if ($mkdir and !(-d $archpath)) - { - unless (mkdir $archpath) { - return undef; - } - } - } - $path =~ s/([^A-Za-z0-9_\.])/sprintf ("@%02X",ord($1))/eg; - while (length ($path) > 120) { - $archpath .= '/'.substr($path,0,64).'-'; - $path = substr($path,64); - if ($mkdir and !(-d $archpath)) - { - unless (mkdir $archpath) { - return undef; - } - } - } - - if ($query) { - # query string: The last part is not a subdir - it is part of the file name. - # And it will be appended with some characters outside of this function: @g, - # @h, @u or @v. - # When Query string is longer than 240 characters it's divided into 128 - # character parts ending with '-' until the last one is not longer than 240. - # Characters that are not letters or numbers or '_' or '.' are encoded. Like - # in URL-encoding but with '@' instead of '%'. - # The '?' at the beginning is not part of the query string. - # For example: - # ?a=1&b=%25%5E%26 becomes ... /a@3D1@26b@3D@2525@255E@2526 - # ?a=aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjjkkkkkkkkkkllllllllllmmmmmmmmmmnnnnnnnnnnoooooooooopppppppppprrrrrrrrrrssssssssssttttttttttuuuuuuuuuuwwwwwwwwwwyyyyyyyyyyzzzzzzzzzz&b=aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjjkkkkkkkkkkllllllllllmmmmmmmmmmnnnnnnnnnnoooooooooopppppppppprrrrrrrrrrssssssssssttttttttttuuuuuuuuuuwwwwwwwwwwyyyyyyyyyyzzzzzzzzzz - # becomes - # ... /a@3Daaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjjkkkkkkkkkkllllllllllmmmm-/mmmmmmnnnnnnnnnnoooooooooopppppppppprrrrrrrrrrssssssssssttttttttttuuuuuuuuuuwwwwwwwwwwyyyyyyyyyyzzzzzzzzzz@26@b@3Daaaaaaaaaabbbb-/bbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjjkkkkkkkkkkllllllllllmmmmmmmmmmnnnnnnnnnnoooooooooopppppppppprrrrrrrrrrssssssssssttttttttttuuuuuuuuuuwwwwwwwwwwyyyyyyyyyyzzzzzzzzzz - $query =~ s/([^A-Za-z0-9_\.])/sprintf ("@%02X",ord($1))/eg; - - $archpath .= '/'.$path.'@q'; - - $path = $query; - if ($mkdir and !(-d $archpath)) - { - unless (mkdir $archpath) { - return undef; - } - } - - while (length ($path) > 240) { - $archpath .= '/'.substr($path,0,128).'-'; - $path = substr($path,128); - if ($mkdir and !(-d $archpath)) - { - unless (mkdir $archpath) { - return undef; - } - } - } - } - $archpath .= '/'.$path; - return $archpath; -} - -# Function to convert URL (one string) to archive path -sub url2path { - return urldiv2path(divideurl($_[0])); -} - -# Function to convert archive path to URL (divided) -sub path2urldiv { - my $archpath = $_[0]; - my $prot; - my $host; - my $port; - my $path; - my $query; - - if (index($archpath, ARCH_PATH) != 0) { - return (); - } - $archpath = substr ($archpath, length(ARCH_PATH)); - - $archpath =~ s/-\///g; - - if ($archpath =~/^((https?)\@p([0-9]+)\/)/) { - $archpath = substr($archpath, length($1)); - $prot = $2; - $port = $3; - } - else { - return (); - } - - if ($archpath =~ /^(([A-Za-z0-9\-\/]+)\@n)\//) { - $archpath = substr($archpath, length($1)); - my $host2 = $2; - - while ((my $ind = rindex ($host2, '/'))>=0) { - $host .= (substr $host2, $ind+1).'.'; - $host2 = substr $host2, 0, $ind; - } - $host .= $host2; - } - else { - return (); - } - - $archpath =~ s/@[a-z]$//; - - if ((my $ind = rindex ($archpath, '@q/'))>=0) { - $query = substr ($archpath, $ind+3); - $archpath = substr $archpath, 0, $ind; - if ($query =~ /^(([A-Za-z0-9_\.]|(@[0-9A-F][0-9A-F]))*)$/) { - $query=$1; - } - else { - return (); - } - $query =~ s/@([A-F0-9]{2})/chr(hex($1))/eg; - } - else { - $query = ''; - } - - if ($archpath =~ /^(([A-Za-z0-9_\.\/]|(@[0-9A-F][0-9A-F]))*)$/) { - $path=$1; - } - else { - return (); - } - $path =~ s/@([A-F0-9]{2})/chr(hex($1))/eg; - return ($prot, $host, $port, $path, $query); -} - -# Function to join parts of URL to one string -sub joinurl { - (my $prot, my $host, my $port, my $path, my $query) = @_; - my $url; - if ($prot =~ /^(https?)$/) { - $url=$1.'://'; - } - else { - return undef; - } - - if($host =~ /^([A-Za-z0-9\-\.]+)$/) { - $url.=$1; - } - else { - return undef; - } - - if ($port =~ /^([0-9]*)$/) { - $port = $1; - } - else { - return undef; - } - if (($port == 80 and $prot eq 'http') or ($port == 443 and $prot eq 'https')) { - $port=''; - } - if ($port) { - $url.=':'.$port; - } - - if ($path =~ /^(\/((%[0-9A-Fa-f][0-9A-Fa-f])|([A-Za-z0-9:;@&=\+\$\,-_\.~\*'\(\)\/]))*)$/) { - $url.=$1; - } - else { - return undef; - } - - if ($query) { - if ($query =~ /^(((%[0-9A-Fa-f][0-9A-Fa-f])|([A-Za-z0-9;\/\?:@&=\+\$\,\-_\.~\*'\(\)]))+)$/) { - $url.='?'.$1; - } - else { - return undef; - } - } - return $url; -} - -# Function to convert archive path to URL (one string) -sub path2url { - return joinurl(path2urldiv($_[0])); -} - -# Function to read http headers. It reads data from a file containing a http -# header (see: https://tools.ietf.org/html/rfc2616#section-4.2). One exception: -# the status line is not special. Instead the status is just another header -# field with the name 'Status' (like in a CGI header) -# -# Returns a hash containing the values. -# Names are case sensitive and are converted to lowercase -# -# Argument can be a path or a file handle. In case of a file handle it will just -# read the file. In case of path it opens the file before reading and closes -# after. On failure (file not open) returns empty hash. -# -sub readheaderfile { - (my $headerpath) = @_; - my $headerfile; - my %header; - - # check if $headerpath is actually a path or maybe a filehandle - # filehandles are references. - if(ref($headerpath)) { - $headerfile=$headerpath; - } - else { - unless (open ($headerfile, "<", $headerpath)) { - return %header; - } - } - - # The name of header field in previous line. Required for header fields that - # occupy multiple lines. - my $lastname=''; - - while (defined(my $line = <$headerfile>)) { - $line =~ s/[\r\n]$//g; - my $headname=''; - my $headval=''; - - # Line starts with whitespace. It's a continuation of the previous line. - # Concatenate the field value. - if($line =~ /^[ \t]+([^ \t](.*[^ \t])?)[ \t]*$/){ - if($lastname ne '') { - $header{$lastname}.=$1; - } - } - # Line starts with a name followed by colon. - elsif ($line =~ /^([^:]+):[ \t]*([^ \t](.*[^ \t])?)[ \t]*$/) { - $headname = lc($1); - $headval = $2; - # If there already was a header field with the same name then the value - # is concantenated, separated by comma. - if ($header{$headname} ne '') { - $header{$headname}.=', '.$headval; - } - # otherwise just save the value - else { - $header{$headname}=$headval; - } - $lastname = $headname; - } - } - - # If argument was a path the file must be closed. - unless (ref($headerpath)) { - close ($headerfile); - } - - return %header; -} - -# Function to read configuration files. -# In each line the '#' and everything after it is treated as a comment and -# ignored. -# The format is: -# name = value -# There can be whitespaces (space, tab) before after or between the name, value -# and '='. Leading and trailing whitespaces are not part of the value or name. -# Name can be made of letters, numbers, '_', '-', and '.'. Names are case -# sensitive. -# -# In some cases it may not possible to save the required data in this -# format. There may be a need to change this format in the future. -# -# Returns a hash containing the values. -# -# Argument can be a path or a file handle. In case of a file handle it will just -# read the file. In case of path it opens the file before reading and closes -# after. On failure (file not open) returns empty hash. -# -# This function is duplicated in configure.pl. configure.pl can't use a function -# from a file that it generates. That would create a dependency loop. -# -sub readconfigfile { - (my $configpath) = @_; - my $configfile; - my %config; - - # check if $configpath is actually a path or maybe a filehandle - # filehandles are references. - if(ref($configpath)) { - $configfile=$configpath; - } - else { - unless (open ($configfile, "<", $configpath)) { - return %config; - } - } - - while (defined(my $line = <$configfile>)) { - $line =~ s/[\r\n]//g; - $line =~ s/#.*$//; #comment - if ($line =~ /^[ \t]*([a-zA-Z0-9_\-\.]+)[ \t]*=[ \t]*([^ \t](.*[^ \t])?)[ \t]*$/){ - my $name=$1; - my $value=$2; - $config{$name}=$value; - } - } - - # If argument was a path the file must be closed. - unless (ref($configpath)) { - close ($configfile); - } - return %config; -} - -1; +# proxy_lib.pm is generated from proxy_lib.1.pm +# 02.01.2016 +# +# Some of the functions would be used by multiple bots for different platforms +# using the proxy archive. +# Copyright (C) 2015-2016 Balthasar Szczepański +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero 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 Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +package proxy_lib; + +use strict; +#use warnings +use Exporter; +use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); + +use constant entitycode => { + 'amp' => '&', + 'gt' => '>', + 'lt' => '<', + 'quot' => '"', + 'acute' => '´', + 'cedil' => '¸', + 'circ' => 'ˆ', + 'macr' => '¯', + 'middot' => '·', + 'tilde' => '˜', + 'uml' => '¨', + 'Aacute' => 'Á', + 'aacute' => 'á', + 'Acirc' => 'Â', + 'acirc' => 'â', + 'AElig' => 'Æ', + 'aelig' => 'æ', + 'Agrave' => 'À', + 'agrave' => 'à', + 'Aring' => 'Å', + 'aring' => 'å', + 'Atilde' => 'Ã', + 'atilde' => 'ã', + 'Auml' => 'Ä', + 'auml' => 'ä', + 'Ccedil' => 'Ç', + 'ccedil' => 'ç', + 'Eacute' => 'É', + 'eacute' => 'é', + 'Ecirc' => 'Ê', + 'ecirc' => 'ê', + 'Egrave' => 'È', + 'egrave' => 'è', + 'ETH' => 'Ð', + 'eth' => 'ð', + 'Euml' => 'Ë', + 'euml' => 'ë', + 'Iacute' => 'Í', + 'iacute' => 'í', + 'Icirc' => 'Î', + 'icirc' => 'î', + 'Igrave' => 'Ì', + 'igrave' => 'ì', + 'Iuml' => 'Ï', + 'iuml' => 'ï', + 'Ntilde' => 'Ñ', + 'ntilde' => 'ñ', + 'Oacute' => 'Ó', + 'oacute' => 'ó', + 'Ocirc' => 'Ô', + 'ocirc' => 'ô', + 'OElig' => 'Œ', + 'oelig' => 'œ', + 'Ograve' => 'Ò', + 'ograve' => 'ò', + 'Oslash' => 'Ø', + 'oslash' => 'ø', + 'Otilde' => 'Õ', + 'otilde' => 'õ', + 'Ouml' => 'Ö', + 'ouml' => 'ö', + 'Scaron' => 'Š', + 'scaron' => 'š', + 'szlig' => 'ß', + 'THORN' => 'Þ', + 'thorn' => 'þ', + 'Uacute' => 'Ú', + 'uacute' => 'ú', + 'Ucirc' => 'Û', + 'ucirc' => 'û', + 'Ugrave' => 'Ù', + 'ugrave' => 'ù', + 'Uuml' => 'Ü', + 'uuml' => 'ü', + 'Yacute' => 'Ý', + 'yacute' => 'ý', + 'yuml' => 'ÿ', + 'Yuml' => 'Ÿ', + 'cent' => '¢', + 'curren' => '¤', + 'euro' => '€', + 'pound' => '£', + 'yen' => '¥', + 'brvbar' => '¦', + 'bull' => '•', + 'copy' => '©', + 'dagger' => '†', + 'Dagger' => '‡', + 'frasl' => '⁄', + 'hellip' => '…', + 'iexcl' => '¡', + 'image' => 'ℑ', + 'iquest' => '¿', + 'lrm' => '‎', + 'mdash' => '—', + 'ndash' => '–', + 'not' => '¬', + 'oline' => '‾', + 'ordf' => 'ª', + 'ordm' => 'º', + 'para' => '¶', + 'permil' => '‰', + 'prime' => '′', + 'Prime' => '″', + 'real' => 'ℜ', + 'reg' => '®', + 'rlm' => '‏', + 'sect' => '§', + 'shy' => '­', + 'sup1' => '¹', + 'trade' => '™', + 'weierp' => '℘', + 'bdquo' => '„', + 'laquo' => '«', + 'ldquo' => '“', + 'lsaquo' => '‹', + 'lsquo' => '‘', + 'raquo' => '»', + 'rdquo' => '”', + 'rsaquo' => '›', + 'rsquo' => '’', + 'sbquo' => '‚', + 'emsp' => ' ', + 'ensp' => ' ', + 'nbsp' => ' ', + 'thinsp' => ' ', + 'zwj' => '‍', + 'zwnj' => '‌', + 'deg' => '°', + 'divide' => '÷', + 'frac12' => '½', + 'frac14' => '¼', + 'frac34' => '¾', + 'ge' => '≥', + 'le' => '≤', + 'minus' => '−', + 'sup2' => '²', + 'sup3' => '³', + 'times' => '×', + 'alefsym' => 'ℵ', + 'and' => '∧', + 'ang' => '∠', + 'asymp' => '≈', + 'cap' => '∩', + 'cong' => '≅', + 'cup' => '∪', + 'empty' => '∅', + 'equiv' => '≡', + 'exist' => '∃', + 'fnof' => 'ƒ', + 'forall' => '∀', + 'infin' => '∞', + 'int' => '∫', + 'isin' => '∈', + 'lang' => '⟨', + 'lceil' => '⌈', + 'lfloor' => '⌊', + 'lowast' => '∗', + 'micro' => 'µ', + 'nabla' => '∇', + 'ne' => '≠', + 'ni' => '∋', + 'notin' => '∉', + 'nsub' => '⊄', + 'oplus' => '⊕', + 'or' => '∨', + 'otimes' => '⊗', + 'part' => '∂', + 'perp' => '⊥', + 'plusmn' => '±', + 'prod' => '∏', + 'prop' => '∝', + 'radic' => '√', + 'rang' => '⟩', + 'rceil' => '⌉', + 'rfloor' => '⌋', + 'sdot' => '⋅', + 'sim' => '∼', + 'sub' => '⊂', + 'sube' => '⊆', + 'sum' => '∑', + 'sup' => '⊃', + 'supe' => '⊇', + 'there4' => '∴', + 'Alpha' => 'Α', + 'alpha' => 'α', + 'Beta' => 'Β', + 'beta' => 'β', + 'Chi' => 'Χ', + 'chi' => 'χ', + 'Delta' => 'Δ', + 'delta' => 'δ', + 'Epsilon' => 'Ε', + 'epsilon' => 'ε', + 'Eta' => 'Η', + 'eta' => 'η', + 'Gamma' => 'Γ', + 'gamma' => 'γ', + 'Iota' => 'Ι', + 'iota' => 'ι', + 'Kappa' => 'Κ', + 'kappa' => 'κ', + 'Lambda' => 'Λ', + 'lambda' => 'λ', + 'Mu' => 'Μ', + 'mu' => 'μ', + 'Nu' => 'Ν', + 'nu' => 'ν', + 'Omega' => 'Ω', + 'omega' => 'ω', + 'Omicron' => 'Ο', + 'omicron' => 'ο', + 'Phi' => 'Φ', + 'phi' => 'φ', + 'Pi' => 'Π', + 'pi' => 'π', + 'piv' => 'ϖ', + 'Psi' => 'Ψ', + 'psi' => 'ψ', + 'Rho' => 'Ρ', + 'rho' => 'ρ', + 'Sigma' => 'Σ', + 'sigma' => 'σ', + 'sigmaf' => 'ς', + 'Tau' => 'Τ', + 'tau' => 'τ', + 'Theta' => 'Θ', + 'theta' => 'θ', + 'thetasym' => 'ϑ', + 'upsih' => 'ϒ', + 'Upsilon' => 'Υ', + 'upsilon' => 'υ', + 'Xi' => 'Ξ', + 'xi' => 'ξ', + 'Zeta' => 'Ζ', + 'zeta' => 'ζ', + 'crarr' => '↵', + 'darr' => '↓', + 'dArr' => '⇓', + 'harr' => '↔', + 'hArr' => '⇔', + 'larr' => '←', + 'lArr' => '⇐', + 'rarr' => '→', + 'rArr' => '⇒', + 'uarr' => '↑', + 'uArr' => '⇑', + 'clubs' => '♣', + 'diams' => '♦', + 'hearts' => '♥', + 'spades' => '♠', + 'loz' => '◊', +}; + +###ARCH_PATH; +###ACCESS_PATH; +###TIMEOUT_UNLOCK; +###TIMEOUT_INACT; +###UNLOCK_PROXY_HOST; + +$VERSION = 0.000004; +@ISA = qw(Exporter); +@EXPORT = (); +@EXPORT_OK = qw(access divideurl entitydecode entityencode formatheader getcgi joinurl path2url url2path path2urldiv readconfigfile readheaderfile urlencode urldecode urldiv2path); +%EXPORT_TAGS = (); + +# This function checks if the user has unlocked the proxy. Nonzero means yes. +sub access { + (my $time, my $ip, my $host) = @_; + my $timeout_unlock = TIMEOUT_UNLOCK*60; + my $timeout_inact = TIMEOUT_INACT*60; + my $accesspath=''; + my $accessfile; + my $lasttime; + my $unlocktime; + + if($host =~ UNLOCK_PROXY_HOST){ + return 1; + } + + # Check if IP + if ($ip =~ /^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)$/) { + $ip = $1; + + # 127.0.0.1 is always allowed. All https requests are tunnelled through + # 127.0.0.1. + if ($ip eq '127.0.0.1') { + return 1; + } + + # If access file doesn't exist the proxy is not unlocked for this IP. + $accesspath=ACCESS_PATH.$ip; + if (! (-e $accesspath)) { + return 0; + } + + elsif (open ($accessfile,"+<",$accesspath)) { + # The access file has to be locked otherwise one process may read it while + # another one updates it. + unless (flock ($accessfile, 2)) { + close ($accessfile); + return 0; + } + # First line is the timestamp of proxy unlocking. Second line is the + # timestamp of last access. + $unlocktime=<$accessfile>; + $lasttime=<$accessfile>; + + $unlocktime =~ s/[\r\n]//g; + $lasttime =~ s/[\r\n]//g; + + # The timestamps must be numbers. + if ($unlocktime =~ /^([0-9]+)$/) { + $unlocktime=int($1); + } + else { + close ($accessfile); + return 0; + } + + if ($lasttime =~ /^([0-9]+)$/) { + $lasttime=int($1); + } + else { + close ($accessfile); + return 0; + } + + if ((abs($time-$unlocktime)>$timeout_unlock) or (abs($time-$lasttime)>$timeout_inact)){ + # If too much time passed proxy is not unlocked any more. Also the + # access file is now useless and will be removed. + close ($accessfile); + unlink $accesspath; + return 0; + } + else { + # the proxy is unlocked. The access file will now be updated. + if (seek($accessfile, 0, 0)) { + print $accessfile "$unlocktime\n$time\n"; + truncate ($accessfile , tell($accessfile)); + } + close ($accessfile); + return 1; + } + } + else { + return 0; + } + } + else { + return 0; + } +} + + +# Function to check URL and divide in parts: protocol, hostname, port number, +# path, query string. +sub divideurl { + my $url = $_[0]; + my $prot; + my $hostportpathquery; + my $hostportpath; + my $query; + my $hostport; + my $path; + my $part; + my $host; + my $port; + + if ($url =~ /^([A-Za-z]+):\/\/(.*)/) { + $prot = $1; + $hostportpathquery = $2; + } + else { + return (); + } + + if ($prot !~ /^https?$/) { + return (); + } + + if ($hostportpathquery eq ''){ + return (); + } + + if ($hostportpathquery =~ /^([^?]+)\?(.*)$/) { + $hostportpath = $1; + $query = $2; + + if ($query !~ /^((%[0-9A-Fa-f][0-9A-Fa-f])|([A-Za-z0-9;\/\?:@&=\+\$\,\-_\.~\*'\(\)]))*$/) { + return (); + } + } + else { + $hostportpath = $hostportpathquery; + $query = ''; + } + + if($hostportpath =~ /^([^\/]+)(\/.*)$/){ + $hostport = $1; + $path = $2; + + if ($path !~ /^((%[0-9A-Fa-f][0-9A-Fa-f])|([A-Za-z0-9:;@&=\+\$\,-_\.~\*'\(\)]))*$/) { + return (); + } + $path=urldecode($path); + } + else { + $hostport = $hostportpath; + $path = ''; + } + + if ($hostport =~ /^(.*):([0-9]+)$/) { + $host = $1; + $port = $2; + } + else { + $host=$hostport; + $port=''; + } + + if ($host !~ /^[A-Za-z0-9\-\.]+$/) { + return (); + } + + return ($prot, $host, $port, $path, $query); +} + +# Function for decoding URL-encoded text +sub urldecode { + my $t = $_[0]; + $t =~ s/\+/ /g; + $t =~ s/%([a-fA-F0-9]{2})/chr(hex($1))/eg; + return $t; +} + +# Function for decoding html entities; by number decimal, haeadecimal or by name +sub entitydecode { + my $t = $_[0]; + $t =~ s/&(#?[a-zA-Z0-9]+);/entitydecode1ch($1)/eg; + return $t; +} + +# function to encode entities, decimal, +sub entityencode { + (my $t, my $all) = @_; + if ($all) { + $t =~ s/(.)/sprintf('\&#%02hu;',ord($1))/eg; + } + else { + $t =~ s/([\"=><\&])/sprintf('&#%02hu;',ord($1))/eg; + } + return $t; +} + +sub urlencode { + (my $t, my $all) = @_; + if ($all) { + $t =~ s/(.)/sprintf('%%%02hX',ord($1))/eg; + } + else { + $t =~ s/([^0-9A-Za-z.~\-_])/sprintf('%%%02hX',ord($1))/eg; + } + return $t; +} + +# Function for decoding one html entity, called from entitydecode(). +sub entitydecode1ch { + my $t = $_[0]; + # decode decimal number + if ($t =~ /^#([0-9]+)$/) { + return chr($1); + } + # decode hexadecimal number + elsif ($t =~ /^#x([0-9A-Fa-f]+)$/) { + return chr(hex($1)); + } + # decode entity name + elsif ($t =~ /^([A-Za-z0-9]+)$/) { + return entitycode->{$1}; + } + else { + return ''; + } +} + +# The function to get CGI parameters from string. +# Format is: name=url_encoded_value&name=url_encoded_value& ... &name=url_encoded_value +sub getcgi { + my $arg; + my $val; + my %cgi; + my $i = $_[0]; + $i =~ s/[\r\n]//g; + my @s = split('&',$i); + foreach my $l ( @s) { + ($arg,$val)=split('=',$l); + $cgi{$arg}=urldecode($val); + } + return %cgi; +} + +# Function for formatting header field names. +# The Environment variable name is like this: HTTP_HEADER_NAME or HEADER_NAME. +# But should be Header-Name. +# Actually the names are case-insensitive but in practise they often look like +# this. (Otherwise suspicious?) +sub formatheader { + my $t = $_[0]; + $t =~ s/^HTTP_//; + $t = lc($t); + $t =~ s/^([a-z])/uc($1)/e; + $t =~ s/_([a-z])/'-'.uc($1)/eg; + return $t; +} + +# Function to convert URL (divided) to archive path. Also creates required +# directories if $mkdir true. +# Returns the path on success and undef on fail. +# Inspired by the MIRA browser. +sub urldiv2path { + (my $prot, my $host, my $port, my $path, my $query, my $mkdir) = @_; + + my $archpath = ARCH_PATH; + + # First subdir: protocol @p port_number + if ($prot =~ /^(https?)$/) { + $archpath .= $1; + } + else { + return undef; + } + + unless ($port){ + $port=($prot eq 'https')?'443':'80'; + } + if ($port =~ /^([0-9]+)$/) { + $archpath .= "\@p$1"; + } + else { + return undef; + } + + if ($mkdir and !(-d $archpath)) + { + unless (mkdir $archpath) { + return undef; + } + } + + # Host name: each segment between dots is a subdir, revedrsed order, last part + # ends with @n. + # For example www.example.com becomes + # ... /com/example/www@/ ... + + # When segment is longer than 120 characters it's divided into 64 character + # parts ending with '-' until the last one is not longer than 120. + # For example + # www.aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjjkkkkkkkkkkllllllllllmmmmmmmmmmnnnnnnnnnnoooooooooopppppppppprrrrrrrrrrssssssssssttttttttttuuuuuuuuuuwwwwwwwwwwyyyyyyyyyyzzzzzzzzzz.com + # becomes + # ... /com/aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggg-/gggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjjkkkkkkkkkkllllllllllmmmmmmmm-/mmnnnnnnnnnnoooooooooopppppppppprrrrrrrrrrssssssssssttttttttttuuuuuuuuuuwwwwwwwwwwyyyyyyyyyyzzzzzzzzzz/www@n/ ... + + if($host =~ /^([A-Za-z0-9\-\.]+)$/) { + $host = $1; + } + else { + return undef; + } + + while ((my $ind = rindex ($host, '.'))>=0) { + my $part= substr $host, $ind+1; + $host = substr $host, 0, $ind; + + while (length ($part) > 120) { + $archpath .= '/'.substr($part,0,64).'-'; + $part = substr($part,64); + if ($mkdir and !(-d $archpath)) + { + unless (mkdir $archpath) { + return undef; + } + } + } + $archpath .= '/'.$part; + if ($mkdir and !(-d $archpath)) + { + unless (mkdir $archpath) { + return undef; + } + } + } + while (length ($host) > 120) { + $archpath .= '/'.substr($host,0,64).'-'; + $host = substr($host,64); + if ($mkdir and !(-d $archpath)) + { + unless (mkdir $archpath) { + return undef; + } + } + } + $archpath .= '/'.$host.'@n'; + if ($mkdir and !(-d $archpath)) + { + unless (mkdir $archpath) { + return undef; + } + } + + # Path: each segment between '/' is subdir. The segment after the last '/' is + # not a subdir - it is part of the file name. And it will be appended with + # some characters outside of this function: @g, @h, @u or @v. + # Exception: when there is a query string the last segment is a subdir too and + # ends with q. + # Characters that are not letters or numbers or '_' or '.' are encoded. Like + # in URL-encoding but with '@' instead of '%'. + # When segment is longer than 120 characters it's divided into 64 character + # parts ending with '-' until the last one is not longer than 120. + + # For example: + # /some/path/?a=1 becomes ... /some/path@q/ ... + # /some/other-path becomes ... /some/other@2Dpath + # /path/aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjjkkkkkkkkkkllllllllllmmmmmmmmmmnnnnnnnnnnoooooooooopppppppppprrrrrrrrrrssssssssssttttttttttuuuuuuuuuuwwwwwwwwwwyyyyyyyyyyzzzzzzzzzz/yyy + # becomes + # ... /path/aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggg-/gggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjjkkkkkkkkkkllllllllllmmmmmmmm-/mmnnnnnnnnnnoooooooooopppppppppprrrrrrrrrrssssssssssttttttttttuuuuuuuuuuwwwwwwwwwwyyyyyyyyyyzzzzzzzzzz/yyy + + $path =~ s/^\///; + + while ((my $ind = index ($path, '/'))>=0) { + my $part = substr $path, 0, $ind; + $path= substr $path, $ind+1; + + $part =~ s/([^A-Za-z0-9_\.])/sprintf ("@%02X",ord($1))/eg; + + while (length ($part) > 120) { + $archpath .= '/'.substr($part,0,64).'-'; + $part = substr($part,64); + if ($mkdir and !(-d $archpath)) + { + unless (mkdir $archpath) { + return undef; + } + } + } + $archpath .= '/'.$part; + if ($mkdir and !(-d $archpath)) + { + unless (mkdir $archpath) { + return undef; + } + } + } + $path =~ s/([^A-Za-z0-9_\.])/sprintf ("@%02X",ord($1))/eg; + while (length ($path) > 120) { + $archpath .= '/'.substr($path,0,64).'-'; + $path = substr($path,64); + if ($mkdir and !(-d $archpath)) + { + unless (mkdir $archpath) { + return undef; + } + } + } + + if ($query) { + # query string: The last part is not a subdir - it is part of the file name. + # And it will be appended with some characters outside of this function: @g, + # @h, @u or @v. + # When Query string is longer than 240 characters it's divided into 128 + # character parts ending with '-' until the last one is not longer than 240. + # Characters that are not letters or numbers or '_' or '.' are encoded. Like + # in URL-encoding but with '@' instead of '%'. + # The '?' at the beginning is not part of the query string. + # For example: + # ?a=1&b=%25%5E%26 becomes ... /a@3D1@26b@3D@2525@255E@2526 + # ?a=aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjjkkkkkkkkkkllllllllllmmmmmmmmmmnnnnnnnnnnoooooooooopppppppppprrrrrrrrrrssssssssssttttttttttuuuuuuuuuuwwwwwwwwwwyyyyyyyyyyzzzzzzzzzz&b=aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjjkkkkkkkkkkllllllllllmmmmmmmmmmnnnnnnnnnnoooooooooopppppppppprrrrrrrrrrssssssssssttttttttttuuuuuuuuuuwwwwwwwwwwyyyyyyyyyyzzzzzzzzzz + # becomes + # ... /a@3Daaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjjkkkkkkkkkkllllllllllmmmm-/mmmmmmnnnnnnnnnnoooooooooopppppppppprrrrrrrrrrssssssssssttttttttttuuuuuuuuuuwwwwwwwwwwyyyyyyyyyyzzzzzzzzzz@26@b@3Daaaaaaaaaabbbb-/bbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjjkkkkkkkkkkllllllllllmmmmmmmmmmnnnnnnnnnnoooooooooopppppppppprrrrrrrrrrssssssssssttttttttttuuuuuuuuuuwwwwwwwwwwyyyyyyyyyyzzzzzzzzzz + $query =~ s/([^A-Za-z0-9_\.])/sprintf ("@%02X",ord($1))/eg; + + $archpath .= '/'.$path.'@q'; + + $path = $query; + if ($mkdir and !(-d $archpath)) + { + unless (mkdir $archpath) { + return undef; + } + } + + while (length ($path) > 240) { + $archpath .= '/'.substr($path,0,128).'-'; + $path = substr($path,128); + if ($mkdir and !(-d $archpath)) + { + unless (mkdir $archpath) { + return undef; + } + } + } + } + $archpath .= '/'.$path; + return $archpath; +} + +# Function to convert URL (one string) to archive path +sub url2path { + return urldiv2path(divideurl($_[0])); +} + +# Function to convert archive path to URL (divided) +sub path2urldiv { + my $archpath = $_[0]; + my $prot; + my $host; + my $port; + my $path; + my $query; + + if (index($archpath, ARCH_PATH) != 0) { + return (); + } + $archpath = substr ($archpath, length(ARCH_PATH)); + + $archpath =~ s/-\///g; + + if ($archpath =~/^((https?)\@p([0-9]+)\/)/) { + $archpath = substr($archpath, length($1)); + $prot = $2; + $port = $3; + } + else { + return (); + } + + if ($archpath =~ /^(([A-Za-z0-9\-\/]+)\@n)\//) { + $archpath = substr($archpath, length($1)); + my $host2 = $2; + + while ((my $ind = rindex ($host2, '/'))>=0) { + $host .= (substr $host2, $ind+1).'.'; + $host2 = substr $host2, 0, $ind; + } + $host .= $host2; + } + else { + return (); + } + + $archpath =~ s/@[a-z]$//; + + if ((my $ind = rindex ($archpath, '@q/'))>=0) { + $query = substr ($archpath, $ind+3); + $archpath = substr $archpath, 0, $ind; + if ($query =~ /^(([A-Za-z0-9_\.]|(@[0-9A-F][0-9A-F]))*)$/) { + $query=$1; + } + else { + return (); + } + $query =~ s/@([A-F0-9]{2})/chr(hex($1))/eg; + } + else { + $query = ''; + } + + if ($archpath =~ /^(([A-Za-z0-9_\.\/]|(@[0-9A-F][0-9A-F]))*)$/) { + $path=$1; + } + else { + return (); + } + $path =~ s/@([A-F0-9]{2})/chr(hex($1))/eg; + return ($prot, $host, $port, $path, $query); +} + +# Function to join parts of URL to one string +sub joinurl { + (my $prot, my $host, my $port, my $path, my $query) = @_; + my $url; + if ($prot =~ /^(https?)$/) { + $url=$1.'://'; + } + else { + return undef; + } + + if($host =~ /^([A-Za-z0-9\-\.]+)$/) { + $url.=$1; + } + else { + return undef; + } + + if ($port =~ /^([0-9]*)$/) { + $port = $1; + } + else { + return undef; + } + if (($port == 80 and $prot eq 'http') or ($port == 443 and $prot eq 'https')) { + $port=''; + } + if ($port) { + $url.=':'.$port; + } + + if ($path =~ /^(\/((%[0-9A-Fa-f][0-9A-Fa-f])|([A-Za-z0-9:;@&=\+\$\,-_\.~\*'\(\)\/]))*)$/) { + $url.=$1; + } + else { + return undef; + } + + if ($query) { + if ($query =~ /^(((%[0-9A-Fa-f][0-9A-Fa-f])|([A-Za-z0-9;\/\?:@&=\+\$\,\-_\.~\*'\(\)]))+)$/) { + $url.='?'.$1; + } + else { + return undef; + } + } + return $url; +} + +# Function to convert archive path to URL (one string) +sub path2url { + return joinurl(path2urldiv($_[0])); +} + +# Function to read http headers. It reads data from a file containing a http +# header (see: https://tools.ietf.org/html/rfc2616#section-4.2). One exception: +# the status line is not special. Instead the status is just another header +# field with the name 'Status' (like in a CGI header) +# +# Returns a hash containing the values. +# Names are case sensitive and are converted to lowercase +# +# Argument can be a path or a file handle. In case of a file handle it will just +# read the file. In case of path it opens the file before reading and closes +# after. On failure (file not open) returns empty hash. +# +sub readheaderfile { + (my $headerpath) = @_; + my $headerfile; + my %header; + + # check if $headerpath is actually a path or maybe a filehandle + # filehandles are references. + if(ref($headerpath)) { + $headerfile=$headerpath; + } + else { + unless (open ($headerfile, "<", $headerpath)) { + return %header; + } + } + + # The name of header field in previous line. Required for header fields that + # occupy multiple lines. + my $lastname=''; + + while (defined(my $line = <$headerfile>)) { + $line =~ s/[\r\n]$//g; + my $headname=''; + my $headval=''; + + # Line starts with whitespace. It's a continuation of the previous line. + # Concatenate the field value. + if($line =~ /^[ \t]+([^ \t](.*[^ \t])?)[ \t]*$/){ + if($lastname ne '') { + $header{$lastname}.=$1; + } + } + # Line starts with a name followed by colon. + elsif ($line =~ /^([^:]+):[ \t]*([^ \t](.*[^ \t])?)[ \t]*$/) { + $headname = lc($1); + $headval = $2; + # If there already was a header field with the same name then the value + # is concantenated, separated by comma. + if ($header{$headname} ne '') { + $header{$headname}.=', '.$headval; + } + # otherwise just save the value + else { + $header{$headname}=$headval; + } + $lastname = $headname; + } + } + + # If argument was a path the file must be closed. + unless (ref($headerpath)) { + close ($headerfile); + } + + return %header; +} + +# Function to read configuration files. +# In each line the '#' and everything after it is treated as a comment and +# ignored. +# The format is: +# name = value +# There can be whitespaces (space, tab) before after or between the name, value +# and '='. Leading and trailing whitespaces are not part of the value or name. +# Name can be made of letters, numbers, '_', '-', and '.'. Names are case +# sensitive. +# +# In some cases it may not possible to save the required data in this +# format. There may be a need to change this format in the future. +# +# Returns a hash containing the values. +# +# Argument can be a path or a file handle. In case of a file handle it will just +# read the file. In case of path it opens the file before reading and closes +# after. On failure (file not open) returns empty hash. +# +# This function is duplicated in configure.pl. configure.pl can't use a function +# from a file that it generates. That would create a dependency loop. +# +sub readconfigfile { + (my $configpath) = @_; + my $configfile; + my %config; + + # check if $configpath is actually a path or maybe a filehandle + # filehandles are references. + if(ref($configpath)) { + $configfile=$configpath; + } + else { + unless (open ($configfile, "<", $configpath)) { + return %config; + } + } + + while (defined(my $line = <$configfile>)) { + $line =~ s/[\r\n]//g; + $line =~ s/#.*$//; #comment + if ($line =~ /^[ \t]*([a-zA-Z0-9_\-\.]+)[ \t]*=[ \t]*([^ \t](.*[^ \t])?)[ \t]*$/){ + my $name=$1; + my $value=$2; + $config{$name}=$value; + } + } + + # If argument was a path the file must be closed. + unless (ref($configpath)) { + close ($configfile); + } + return %config; +} + +1; diff --git a/rewrite.1.pl b/rewrite.1.pl index f612736..2f48d2f 100755 --- a/rewrite.1.pl +++ b/rewrite.1.pl @@ -1,12 +1,28 @@ ###PERL; # rewrite is generated from rewrite.1.pl +# 02.01.2016 # # This is the Squid helper program used for redirection. It always redirects to # the https proxy. # # see also: # http://wiki.squid-cache.org/Features/AddonHelpers#URL_Re-Writing_.28Mangling.29 +# +# Copyright (C) 2015-2016 Balthasar Szczepański +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero 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 Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . ###REWRITE_URL; -- 2.30.2