//
// aegis - project change supervisor
// Copyright (C) 2007, 2008 Peter Miller
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see
// .
//
#include
#include
#include
#include
#include
/**
* The clean_up function is used to clean up a user's full name
* into an rfc822-acceptable string, suitable for use within an
* email address.
*
* @param s
* The string to be cleaned up
* @returns
* the cleaned up string
*/
static nstring
clean_up(const nstring &s)
{
nstring_accumulator buf;
unsigned char prev = ' ';
for (const char *cp = s.c_str(); *cp; ++cp)
{
unsigned char c = *cp;
if (isspace(c) || strchr("@,<>()[]{}'\"", c) || !isprint(c))
c = ' ';
if (c != ' ' || prev != ' ')
buf.push_back(c);
prev = c;
}
while (buf.size() > 0 && buf[buf.size() - 1] == ' ')
buf.pop_back();
return buf.mkstr();
}
string_ty *
user_email_address(user_ty::pointer up)
{
static nstring result;
result = up->get_email_address();
return result.get_ref();
}
nstring
user_ty::get_email_address()
{
uconf_ty *ucp = uconf_get();
if (!ucp->email_address || !ucp->email_address->str_length)
{
//
// Look for the domain name to go on the right hand side of the @ sign.
//
nstring domain = os_domain_name();
//
// Construct the email address.
//
nstring fnm = clean_up(full_name());
ucp->email_address =
str_format
(
"%s <%s@%s>",
fnm.c_str(),
login_name.c_str(),
domain.c_str()
);
}
else
{
//
// Even if the user has given us a string, we have to make sure
// that it has all the right bits...
//
const char *s = ucp->email_address->str_text;
const char *lt = strchr(s, '<');
const char *at = strchr(s, '@');
const char *gt = strchr(s, '>');
if (lt && at && gt)
{
// this is what we need, do nothing
if (lt == s)
{
// Add their full name.
nstring temp(ucp->email_address);
nstring fnm = clean_up(full_name());
ucp->email_address =
str_format("%s %s", fnm.c_str(), temp.c_str());
}
}
else if (at)
{
// Add their full name.
nstring temp(ucp->email_address);
nstring fnm = clean_up(full_name());
ucp->email_address =
str_format("%s <%s>", fnm.c_str(), temp.c_str());
}
else
{
//
// Look for the domain name to go on the right hand side of
// the @ sign.
//
nstring domain = os_domain_name();
//
// Construct the email address.
//
nstring fnm = clean_up(full_name());
nstring temp(ucp->email_address);
ucp->email_address =
str_format
(
"%s <%s@%s>",
fnm.c_str(),
temp.c_str(),
domain.c_str()
);
}
}
return nstring(ucp->email_address);
}