blob: c57c48857a04b638631a8206afd224dce0bc43f8 [file] [log] [blame]
Matthias Andreas Benkard4edeb9f2021-01-02 15:32:21 +01001<?php
2require_once 'inc/prerequisites.inc.php';
3
4if (empty($mailcow_hostname)) {
5 exit();
6}
7if (!isset($_SESSION['mailcow_cc_role']) || $_SESSION['mailcow_cc_role'] != 'user') {
8 session_destroy();
9 // probably better than appending the whole current http query string
10 $append_get = (isset($_GET['only_email'])) ? '&only_email' : '';
Matthias Andreas Benkardb4b5cc12021-12-28 18:02:04 +010011 $append_get .= (isset($_GET['app_password'])) ? '&app_password' : '';
Matthias Andreas Benkard4edeb9f2021-01-02 15:32:21 +010012 header('Location: index.php?mobileconfig' . $append_get);
13 die();
14}
15
16error_reporting(0);
17
18header('Content-Type: application/x-apple-aspen-config');
19header('Content-Disposition: attachment; filename="'.$UI_TEXTS['main_name'].'.mobileconfig"');
20
21$email = $_SESSION['mailcow_cc_username'];
22$domain = explode('@', $_SESSION['mailcow_cc_username'])[1];
23$identifier = implode('.', array_reverse(preg_split( '/(@|\.)/', $email))) . '.appleprofile.'.preg_replace('/[^a-zA-Z0-9]+/', '', $UI_TEXTS['main_name']);
24
25try {
26 $stmt = $pdo->prepare("SELECT `name` FROM `mailbox` WHERE `username`= :username");
27 $stmt->execute(array(':username' => $email));
28 $MailboxData = $stmt->fetch(PDO::FETCH_ASSOC);
29 $displayname = htmlspecialchars(empty($MailboxData['name']) ? $email : $MailboxData['name'], ENT_NOQUOTES);
30}
31catch(PDOException $e) {
32 $displayname = $email;
33}
34
35if (isset($_GET['only_email'])) {
36 $onlyEmailAccount = true;
Matthias Andreas Benkard97f12022026-10-23 08:46:40 +020037 $description = 'IMAP';
Matthias Andreas Benkard4edeb9f2021-01-02 15:32:21 +010038} else {
39 $onlyEmailAccount = false;
Matthias Andreas Benkard97f12022026-10-23 08:46:40 +020040 $description = 'IMAP, CalDAV, CardDAV';
Matthias Andreas Benkard4edeb9f2021-01-02 15:32:21 +010041}
Matthias Andreas Benkardb4b5cc12021-12-28 18:02:04 +010042if (isset($_GET['app_password'])) {
43 $app_password = true;
44 $description .= ' with application password';
Matthias Andreas Benkard97f12022026-10-23 08:46:40 +020045
Matthias Andreas Benkardb4b5cc12021-12-28 18:02:04 +010046 if (strpos($_SERVER['HTTP_USER_AGENT'], 'iPad') !== FALSE)
47 $platform = 'iPad';
48 elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'iPhone') !== FALSE)
49 $platform = 'iPhone';
50 elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'Macintosh') !== FALSE)
51 $platform = 'Mac';
52 else
53 $platform = $_SERVER['HTTP_USER_AGENT'];
Matthias Andreas Benkard97f12022026-10-23 08:46:40 +020054
55 $password = password_generate();
56
Matthias Andreas Benkardb4b5cc12021-12-28 18:02:04 +010057 $attr = array(
58 'app_name' => $platform,
59 'app_passwd' => $password,
60 'app_passwd2' => $password,
61 'active' => 1,
62 'protocols' => array('imap_access', 'smtp_access'),
63 );
64 if (!$onlyEmailAccount) {
65 $attr['protocols'][] = 'dav_access';
66 }
67 app_passwd("add", $attr);
Matthias Andreas Benkard97f12022026-10-23 08:46:40 +020068 $password = htmlspecialchars($password, ENT_NOQUOTES);
Matthias Andreas Benkardb4b5cc12021-12-28 18:02:04 +010069} else {
70 $app_password = false;
71}
Matthias Andreas Benkard4edeb9f2021-01-02 15:32:21 +010072
73echo '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
74?>
75<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
76<plist version="1.0">
77 <dict>
78 <key>PayloadContent</key>
79 <array>
80 <dict>
81 <key>EmailAccountDescription</key>
82 <string><?=$email?></string>
83 <key>EmailAccountType</key>
84 <string>EmailTypeIMAP</string>
85 <key>EmailAccountName</key>
86 <string><?=$displayname?></string>
87 <key>EmailAddress</key>
88 <string><?=$email?></string>
89 <key>IncomingMailServerAuthentication</key>
90 <string>EmailAuthPassword</string>
91 <key>IncomingMailServerHostName</key>
92 <string><?=$autodiscover_config['imap']['server']?></string>
93 <key>IncomingMailServerPortNumber</key>
94 <integer><?=$autodiscover_config['imap']['port']?></integer>
95 <key>IncomingMailServerUseSSL</key>
96 <true/>
97 <key>IncomingMailServerUsername</key>
98 <string><?=$email?></string>
Matthias Andreas Benkardb4b5cc12021-12-28 18:02:04 +010099 <?php if($app_password === true): ?>
100 <key>IncomingPassword</key>
101 <string><?=$password?></string>
102 <?php endif; ?>
Matthias Andreas Benkard4edeb9f2021-01-02 15:32:21 +0100103 <key>OutgoingMailServerAuthentication</key>
104 <string>EmailAuthPassword</string>
105 <key>OutgoingMailServerHostName</key>
106 <string><?=$autodiscover_config['smtp']['server']?></string>
107 <key>OutgoingMailServerPortNumber</key>
108 <integer><?=$autodiscover_config['smtp']['port']?></integer>
109 <key>OutgoingMailServerUseSSL</key>
110 <true/>
111 <key>OutgoingMailServerUsername</key>
112 <string><?=$email?></string>
113 <key>OutgoingPasswordSameAsIncomingPassword</key>
114 <true/>
115 <key>PayloadDescription</key>
116 <string>Configures email account.</string>
117 <key>PayloadDisplayName</key>
118 <string>IMAP Account (<?=$email?>)</string>
119 <key>PayloadIdentifier</key>
120 <string><?=$identifier?>.email</string>
121 <key>PayloadOrganization</key>
122 <string></string>
123 <key>PayloadType</key>
124 <string>com.apple.mail.managed</string>
125 <key>PayloadUUID</key>
126 <string><?=getGUID()?></string>
127 <key>PayloadVersion</key>
128 <integer>1</integer>
129 <key>PreventAppSheet</key>
130 <false/>
131 <key>PreventMove</key>
132 <false/>
133 <key>SMIMESigningUserOverrideable</key>
134 <true/>
135 <key>SMIMESigningCertificateUUIDUserOverrideable</key>
136 <true/>
137 <key>SMIMEEncryptByDefaultUserOverrideable</key>
138 <true/>
139 <key>SMIMEEncryptionCertificateUUIDUserOverrideable</key>
140 <true/>
141 <key>SMIMEEnableEncryptionPerMessageSwitch</key>
142 <true/>
143 </dict>
144 <?php if($onlyEmailAccount === false): ?>
145 <dict>
146 <key>CalDAVAccountDescription</key>
147 <string><?=$email?></string>
148 <key>CalDAVHostName</key>
149 <string><?=$autodiscover_config['caldav']['server']?></string>
150 <key>CalDAVPort</key>
151 <real><?=$autodiscover_config['caldav']['port']?></real>
152 <key>CalDAVPrincipalURL</key>
153 <string>/SOGo/dav/<?=$email?></string>
154 <key>CalDAVUseSSL</key>
155 <true/>
156 <key>CalDAVUsername</key>
157 <string><?=$email?></string>
Matthias Andreas Benkardb4b5cc12021-12-28 18:02:04 +0100158 <?php if($app_password === true): ?>
159 <key>CalDAVPassword</key>
160 <string><?=$password?></string>
161 <?php endif; ?>
Matthias Andreas Benkard4edeb9f2021-01-02 15:32:21 +0100162 <key>PayloadDescription</key>
163 <string>Configures CalDAV account.</string>
164 <key>PayloadDisplayName</key>
165 <string>CalDAV (<?=$email?>)</string>
166 <key>PayloadIdentifier</key>
167 <string><?=$identifier?>.CalDAV</string>
168 <key>PayloadOrganization</key>
169 <string></string>
170 <key>PayloadType</key>
171 <string>com.apple.caldav.account</string>
172 <key>PayloadUUID</key>
173 <string><?=getGUID()?></string>
174 <key>PayloadVersion</key>
175 <integer>1</integer>
176 </dict>
177 <dict>
178 <key>CardDAVAccountDescription</key>
179 <string><?=$email?></string>
180 <key>CardDAVHostName</key>
181 <string><?=$autodiscover_config['carddav']['server']?></string>
182 <key>CardDAVPort</key>
183 <integer><?=$autodiscover_config['carddav']['port']?></integer>
184 <key>CardDAVPrincipalURL</key>
185 <string>/SOGo/dav/<?=$email?></string>
186 <key>CardDAVUseSSL</key>
187 <true/>
188 <key>CardDAVUsername</key>
189 <string><?=$email?></string>
Matthias Andreas Benkardb4b5cc12021-12-28 18:02:04 +0100190 <?php if($app_password === true): ?>
191 <key>CardDAVPassword</key>
192 <string><?=$password?></string>
193 <?php endif; ?>
Matthias Andreas Benkard4edeb9f2021-01-02 15:32:21 +0100194 <key>PayloadDescription</key>
195 <string>Configures CardDAV accounts</string>
196 <key>PayloadDisplayName</key>
197 <string>CardDAV (<?=$email?>)</string>
198 <key>PayloadIdentifier</key>
199 <string><?=$identifier?>.carddav</string>
200 <key>PayloadOrganization</key>
201 <string></string>
202 <key>PayloadType</key>
203 <string>com.apple.carddav.account</string>
204 <key>PayloadUUID</key>
205 <string><?=getGUID()?></string>
206 <key>PayloadVersion</key>
207 <integer>1</integer>
208 </dict>
209 <?php endif; ?>
210 </array>
211 <key>PayloadDescription</key>
212 <string><?=$description?></string>
213 <key>PayloadDisplayName</key>
214 <string><?=$email?></string>
215 <key>PayloadIdentifier</key>
216 <string><?=$identifier?></string>
217 <key>PayloadOrganization</key>
218 <string><?=$UI_TEXTS['main_name']?></string>
219 <key>PayloadRemovalDisallowed</key>
220 <false/>
221 <key>PayloadType</key>
222 <string>Configuration</string>
223 <key>PayloadUUID</key>
224 <string><?=getGUID()?></string>
225 <key>PayloadVersion</key>
226 <integer>1</integer>
227 </dict>
228</plist>