| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 | 
							- /* PostSRSd - Sender Rewriting Scheme daemon for Postfix
 -  * Copyright (c) 2012 Timo Röhling <timo.roehling@gmx.de>
 -  *
 -  * This program is free software: you can redistribute it and/or modify
 -  * it under the terms of the GNU General Public License as published by
 -  * the Free Software Foundation, either version 2 of the License, or
 -  * (at your option) any later version.
 -  *
 -  * This program is distributed in the hope that it will be useful,
 -  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 -  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 -  * GNU General Public License for more details.
 -  *
 -  * You should have received a copy of the GNU General Public License
 -  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 -  */
 - 
 - /* This program uses the libsrs2 library. The relevant source
 -  * files have been added to this distribution. */
 - #include "srs2.h"
 - #include <string.h>
 - 
 - static int run_srs(srs_t* srs, const char* address, const char* domain)
 - {
 -   int result, i;
 -   char buf1[1024];
 -   char buf2[1024];
 - 
 -   printf("srs_forward(\"%s\", \"%s\") = ", address, domain);
 -   result = srs_forward(srs, buf1, sizeof(buf1), address, domain);
 -   printf ("%d\n", result);
 -   if (result != SRS_SUCCESS) return 0;
 -   printf("srs_reverse(\"%s\") = ", buf1);
 -   result = srs_reverse(srs, buf2, sizeof(buf2), buf1);
 -   printf("%d\n", result);
 -   if (result != SRS_SUCCESS) return 0;
 -   if (strcasecmp(address, buf2))
 -   {
 -     printf("SRS not idempotent: \"%s\" != \"%s\"\n", address, buf2);
 -     return 0;
 -   }
 - 
 -   i = strchr(buf1, '@') - buf1;
 -   while (i > 0)
 -   {
 -     --i;
 -     if (buf1[i] == '=' || buf1[i] == '-' || buf1[i] == '+') continue;
 -     buf1[i]++;
 -     printf("srs_reverse(\"%s\") = ", buf1);
 -     result = srs_reverse(srs, buf2, sizeof(buf2), buf1);
 -     printf("%d\n", result);
 -     if (result == SRS_SUCCESS) return 0;
 -     buf1[i]--;
 -   }
 -   return 1;
 - }
 - 
 - static void generate_random_address(char* buf, size_t len1, size_t len2)
 - {
 -   static const char chars[] = "abcdefghijklmnopqrstuvwxyz0123456789-+=";
 -   size_t i = 0, l1 = len1, l2 = len2;
 -   while (l1 > 0)
 -   {
 -     buf[i++] = chars[random() % 39];
 -     if (l1 < len1 && l1 > 1 && buf[i - 1] != '.' && (random() % 16 == 0)) buf[i - 1] = '.';
 -     --l1;
 -   }
 -   buf[i++] = '@';
 -   while (l2 > 0)
 -   {
 -     buf[i++] = 'a' + random() % 26;
 -     if (l2 < len2 && l2 > 1 && buf[i - 1] != '.' && (random() % 16 == 0)) buf[i - 1] = '.';
 -     --l2;
 -   }
 -   buf[i++] = 0;
 - }
 - 
 - #define ASSERT_SRS_OK(...) if (!run_srs(srs, __VA_ARGS__)) return EXIT_FAILURE
 - 
 - int main (int argc, char** argv)
 - {
 -   srs_t* srs;
 -   size_t l1, l2;
 -   char addr[128];
 - 
 -   srs = srs_new();
 -   srs_add_secret (srs, "t0ps3cr3t");
 - 
 -   for (l1 = 1; l1 <= 63; ++l1)
 -   {
 -     for (l2 = 1; l2 <= 63; ++l2)
 -     {
 -       generate_random_address(addr, l1, l2);
 -       ASSERT_SRS_OK(addr, "example.com");
 -     }
 -   }
 -   return EXIT_SUCCESS;
 - }
 
 
  |