X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=postlicyd%2Fquery.h;h=eda9320b4a4a147fed42dc16de203f1dfea97902;hb=380e4e0ee92811b2edd87f06ad7f0d13e92882d4;hp=b11991c552b0cdf77279f42b7d71ae8adfa3cf70;hpb=9b993811fe1fd208afd954e86c0bfc81a78af04f;p=apps%2Fpfixtools.git diff --git a/postlicyd/query.h b/postlicyd/query.h index b11991c..eda9320 100644 --- a/postlicyd/query.h +++ b/postlicyd/query.h @@ -16,17 +16,20 @@ /* products derived from this software without specific prior written */ /* permission. */ /* */ -/* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND */ -/* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE */ -/* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ -/* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS */ -/* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR */ -/* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF */ -/* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS */ -/* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN */ -/* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) */ -/* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF */ -/* THE POSSIBILITY OF SUCH DAMAGE. */ +/* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ANY EXPRESS */ +/* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE */ +/* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY */ +/* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL */ +/* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS */ +/* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) */ +/* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, */ +/* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN */ +/* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE */ +/* POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/* Copyright (c) 2006-2008 the Authors */ +/* see AUTHORS and source files for details */ /******************************************************************************/ /* @@ -38,9 +41,11 @@ #define PFIXTOOLS_QUERY_H #include "mem.h" +#include "common.h" +#include "buffer.h" +#include "policy_tokens.h" enum smtp_state { - SMTP_UNKNOWN, SMTP_CONNECT, SMTP_EHLO, SMTP_HELO = SMTP_EHLO, @@ -50,54 +55,84 @@ enum smtp_state { SMTP_END_OF_MESSAGE, SMTP_VRFY, SMTP_ETRN, + SMTP_count, + SMTP_UNKNOWN, }; +extern const static_str_t smtp_state_names[SMTP_count]; + /* \see http://www.postfix.org/SMTPD_POLICY_README.html */ typedef struct query_t { unsigned state : 4; unsigned esmtp : 1; - const char *helo_name; - const char *queue_id; - const char *sender; - const char *recipient; - const char *recipient_count; - const char *client_address; - const char *client_name; - const char *reverse_client_name; - const char *instance; + static_str_t helo_name; + static_str_t queue_id; + static_str_t sender; + static_str_t recipient; + static_str_t recipient_count; + static_str_t client_address; + static_str_t client_name; + static_str_t reverse_client_name; + static_str_t instance; + + /* useful data extracted from previous ones */ + static_str_t sender_domain; + static_str_t recipient_domain; /* postfix 2.2+ */ - const char *sasl_method; - const char *sasl_username; - const char *sasl_sender; - const char *size; - const char *ccert_subject; - const char *ccert_issuer; - const char *ccert_fingerprint; + static_str_t sasl_method; + static_str_t sasl_username; + static_str_t sasl_sender; + static_str_t size; + static_str_t ccert_subject; + static_str_t ccert_issuer; + static_str_t ccert_fingerprint; /* postfix 2.3+ */ - const char *encryption_protocol; - const char *encryption_cipher; - const char *encryption_keysize; - const char *etrn_domain; + static_str_t encryption_protocol; + static_str_t encryption_cipher; + static_str_t encryption_keysize; + static_str_t etrn_domain; /* postfix 2.5+ */ - const char *stress; + static_str_t stress; const char *eoq; } query_t; -static inline query_t *query_new(void) -{ - return p_new(query_t, 1); -} - -static inline void query_delete(query_t **query) -{ - if (*query) { - p_delete(query); - } -} +/** Parse the content of the text to fill the query. + * The text pointed by \p p is segmented (and modified to add + * a \0 at the end of each segment) and used to fill the query + * object. + */ +__attribute__((nonnull(1,2))) +bool query_parse(query_t *query, char *p); + +/** Return the value of the field with the given name. + */ +__attribute__((nonnull(1,2))) +const static_str_t *query_field_for_name(const query_t *query, const char *name); + +/** Returns the value of the field with the given id. + */ +__attribute__((nonnull)) +const static_str_t *query_field_for_id(const query_t *query, postlicyd_token id); + +/** Formats the given string by replacing ${field_name} with the content + * of the query. + * Unknown and empty fields are filled with (null). + */ +__attribute__((nonnull(3))) +ssize_t query_format(char *dest, size_t len, const char* fmt, const query_t *query); + +/** Writes a query-formated string in a buffer. + */ +__attribute__((nonnull(1,2))) +bool query_format_buffer(buffer_t *buf, const char *fmt, const query_t *query); + +/** Check the query-format string. + */ +#define query_format_check(fmt) (query_format(NULL, 0, fmt, NULL) >= 0) #endif