/
provision.go
75 lines (63 loc) · 3.14 KB
/
provision.go
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
/*
* Omega is an advanced email service that supports Microsoft ActiveSync.
*
* Copyright (C) 2016, 2017 Kitae Kim <superkkt@gmail.com>
*
* 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
* 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, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package eas25
import (
"encoding/xml"
"fmt"
"github.com/superkkt/omega/activesync"
"github.com/superkkt/logger"
)
// Initial provision response that does not require any security policy
var initResponse = `<Provision xmlns="Provision:"><Policies><Policy><PolicyType>MS-WAP-Provisioning-XML</PolicyType><Status>1</Status><Data><wap-provisioningdoc><characteristic type="SecurityPolicy"><parm name="4131" value="1"/></characteristic><characteristic type="Registry"><characteristic type="HKLM\Comm\Security\Policy\LASSD\AE\{50C13377-C66D-400C-889E-C316FC4AB374}"><parm name="AEFrequencyType" value="0"/><parm name="AEFrequencyValue" value="0"/></characteristic><characteristic type="HKLM\Comm\Security\Policy\LASSD"><parm name="DeviceWipeThreshold" value="16"/><parm name="CodewordFrequency" value="-1"/></characteristic><characteristic type="HKLM\Comm\Security\Policy\LASSD\LAP\lap_pw"><parm name="MinimumPasswordLength" value="1"/><parm name="PasswordComplexity" value="2"/></characteristic></characteristic></wap-provisioningdoc></Data><PolicyKey>1</PolicyKey></Policy></Policies></Provision>`
// Second provision response that always succeed
var secondResponse = `<Provision xmlns="Provision:"><Status>1</Status><Policies><Policy><PolicyType>MS-WAP-Provisioning-XML</PolicyType><Status>1</Status><PolicyKey>2</PolicyKey></Policy></Policies></Provision>`
func (r *handler) handleProvision() error {
// Provision response is given in WBXML encoding.
r.resp.SetWBXML(true)
reqBody := struct {
XMLName xml.Name `xml:"Provision"`
Policies struct {
Policy struct {
PolicyType string
PolicyKey string
Status int
}
}
}{}
if err := activesync.ParseWBXMLRequest(r.req, &reqBody); err != nil {
r.badRequest = true
return fmt.Errorf("ParseWBXMLRequest: %v", err)
}
logger.Debug(fmt.Sprintf("Provision request: %+v", reqBody))
// Validation
if reqBody.Policies.Policy.PolicyType != "MS-WAP-Provisioning-XML" {
r.badRequest = true
return fmt.Errorf("invalid Provision PolicyType: %v", reqBody.Policies.Policy.PolicyType)
}
var xml string
// Initial request?
if reqBody.Policies.Policy.PolicyKey == "" {
xml = initResponse
} else {
xml = secondResponse
}
r.resp.Write([]byte(xml))
return nil
}