File: AliasHandler.php

package info (click to toggle)
postfixadmin 2.3.5-2%2Bdeb7u1
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 6,200 kB
  • sloc: php: 25,767; xml: 14,485; perl: 964; sh: 664; python: 169; makefile: 84
file content (189 lines) | stat: -rw-r--r-- 6,644 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
<?php

/** 
 * Handlers User level alias actions - e.g. add alias, get aliases, update etc.
 */
class AliasHandler {

    private $username = null;

    /**
     * @param string $username
     */
    public function __construct($username) {
        $this->username = $username;
    }

    /**
     * @return array - list of email addresses the user's mail is forwarded to.
     * (may be an empty list, especially if $CONF['alias_control'] is turned off...
     * @param boolean - by default we don't return special addresses (e.g. vacation and mailbox alias); pass in true here if you wish to.
     */
    public function get($all=false) {
        $username = escape_string($this->username);
        $table_alias = table_by_key('alias');

        $sql = "SELECT * FROM $table_alias WHERE address='$username'";
        $result = db_query($sql);
        if($result['rows'] == 1) {
            $row = db_array ($result['result']);
            // At the moment Postfixadmin stores aliases in it's database in a comma seperated list; this may change one day.
            $list = explode(',', $row['goto']);
            if($all) {
                return $list;
            }

            $new_list = array();
            /* if !$all, remove vacation & mailbox aliases */
            foreach($list as $address) {
                if($address != '' ) {
                    if($this->is_vacation_address($address) || $this->is_mailbox_alias($address)) {
                    }
                    else {
                        $new_list[] = $address;
                    }
                }
            }
            $list = $new_list;
            return $list;
        }
        return array();
    }

   /** 
    * @param string $address
    * @param string $username
    * @return boolean true if the username is an alias for the mailbox AND we have alias_control turned off.
    */
    public function is_mailbox_alias($address) {
        global $CONF;
        $username = $this->username;
        if($address == $username) {
            return true;
        }
        return false;
    }

    /**
     * @param string $address
     * @return boolean true if the address contains the vacation domain
     */
    public function is_vacation_address($address) {
        global $CONF;
        if($CONF['vacation'] == 'YES') {
            if(stripos($address, '@' . $CONF['vacation_domain'])) {
                return true;
            }
        }
        return false;
    }
    /**
     * @return boolean true on success
     * @param string $username
     * @param array $addresses - list of aliases to set for the user.
     * @param string flags - forward_and_store or remote_only or ''
     * @param boolean $vacation_persist - set to false to stop the vacation address persisting across updates
     * Set the user's aliases to those provided. If $addresses ends up being empty the alias record is removed.
     */
    public function update($addresses, $flags = '', $vacation_persist=true) {
        // find out if the user is on vacation or not; if they are, 
        // then the vacation alias needs adding to the db (as we strip it out in the get method) 
        // likewise with the alias_control address.

        $valid_flags = array('', 'forward_and_store', 'remote_only');
        if(!in_array($flags, $valid_flags)) {
            die("Invalid flag passed into update()... : $flag - valid options are :" . implode(',', $valid_flags));
        } 
        $addresses = array_unique($addresses);

        $original = $this->get(true);
        $tmp = preg_split('/@/', $this->username);
        $domain = $tmp[1];

        foreach($original as $address) {
            if($vacation_persist) {
                if($this->is_vacation_address($address)) {
                    $addresses[] = $address;
                }
            }
            if($flags != 'remote_only') {
                if($this->is_mailbox_alias($address)) {
                    $addresses[] = $address;
                }
            }
        }
        $addresses = array_unique($addresses);

        $new_list = array();
        if($flags == 'remote_only') {
            foreach($addresses as $address) {
                // strip out our username... if it's in the list given.
                if($address != $this->username) {
                    $new_list[] = $address;            
                }
            }
            $addresses = $new_list;
        }
        
        if($flags == 'forward_and_store') {
            if(!in_array($this->username, $addresses)) {
                $addresses[] = $this->username;
            }
        }
        $new_list = array();
        foreach($addresses as $address) {
            if($address != '') {
                $new_list[] = $address;
            }
        } 
        $addresses = array_unique($new_list);
        $username = escape_string($this->username);
        $goto = escape_string(implode(',', $addresses));
        $table_alias = table_by_key('alias');
        if(sizeof($addresses) == 0) {
            $sql = "DELETE FROM $table_alias WHERE address = '$username'";
        }
        if($this->hasAliasRecord() == false) {
            $true = db_get_boolean(True);
            $sql = "INSERT INTO $table_alias (address, goto, domain, created, modified, active) VALUES ('$username', '$goto', '$domain', NOW(), NOW(), '$true')";
        }
        else {
            $sql = "UPDATE $table_alias SET goto = '$goto', modified = NOW() WHERE address = '$username'";
        }
        $result = db_query($sql);
        if($result['rows'] != 1) {
            return false;
        }
        db_log($username, $domain, 'edit_alias', "$username -> $goto");
        return true;
    }

    /** 
     * Determine whether a local delivery address is present. This is 
     * stores as an alias with the same name as the mailbox name (username)
     * @return boolean true if local delivery is enabled
     */
    public function hasStoreAndForward() {
        $aliases = $this->get(true);
        if(in_array($this->username, $aliases)) {
            return true;
        }
        return false;
    }

    /**
     * @return boolean true if the user has an alias record (i.e row in alias table); else false.
     */
    public function hasAliasRecord() {
        $username = escape_string($this->username);
        $table_alias = table_by_key('alias');
        $sql = "SELECT * FROM $table_alias WHERE address = '$username'";
        $result = db_query($sql);
        if($result['rows'] == 1) {
            return true;
        }
        return false;
    }
}

/* vim: set expandtab softtabstop=4 tabstop=4 shiftwidth=4: */