147 lines
2.7 KiB
Go
147 lines
2.7 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/xml"
|
|
"fmt"
|
|
"io"
|
|
"log"
|
|
"net/http"
|
|
"strings"
|
|
)
|
|
|
|
// simple test XML
|
|
const neededXML string = `
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<d:propfind xmlns:d="DAV:">
|
|
<d:prop>
|
|
<d:displayname/>
|
|
<d:resourcetype/>
|
|
</d:prop>
|
|
</d:propfind>
|
|
`
|
|
|
|
var client *http.Client
|
|
|
|
func init_dav_client() {
|
|
client = &http.Client{}
|
|
}
|
|
|
|
type Event struct {
|
|
CalData string
|
|
}
|
|
|
|
type Calandar struct {
|
|
DisplayName string
|
|
Link string
|
|
Events []Event
|
|
}
|
|
|
|
type SimpleCalDavData struct {
|
|
DisplayName string
|
|
Calandars []Calandar
|
|
}
|
|
|
|
// this makes stalwart assumptions
|
|
func get_caldav_data(username string, password string) SimpleCalDavData {
|
|
req, _ := http.NewRequest(
|
|
"PROPFIND",
|
|
serverConfig.URL+"/dav/cal/"+convert_username_into_url(username),
|
|
strings.NewReader(neededXML),
|
|
)
|
|
|
|
req.SetBasicAuth(username, password)
|
|
req.Header.Set("Depth", "1")
|
|
req.Header.Set("Content-Type", "application/xml")
|
|
|
|
resp, err := client.Do(req)
|
|
if err != nil {
|
|
fmt.Print(err.Error())
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
body, err := io.ReadAll(resp.Body)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
var davResp MultiStatus
|
|
err = xml.Unmarshal(body, &davResp)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
calandars := []Calandar{}
|
|
for i := range len(davResp.Responses) {
|
|
if davResp.Responses[i].PropStat[0].Prop.Type.Calendar == nil {
|
|
continue
|
|
}
|
|
|
|
var new_cal Calandar = Calandar{
|
|
DisplayName: davResp.Responses[i].PropStat[0].Prop.DisplayName,
|
|
Link: serverConfig.URL + davResp.Responses[i].Href,
|
|
}
|
|
|
|
calandars = append(calandars, new_cal)
|
|
}
|
|
|
|
return SimpleCalDavData{
|
|
DisplayName: davResp.Responses[0].PropStat[0].Prop.DisplayName,
|
|
Calandars: calandars,
|
|
}
|
|
}
|
|
|
|
const XML_cal string = `
|
|
<C:calendar-query xmlns:D="DAV:"
|
|
xmlns:C="urn:ietf:params:xml:ns:caldav">
|
|
<D:prop>
|
|
<D:getetag/>
|
|
<C:calendar-data/>
|
|
</D:prop>
|
|
|
|
<C:filter>
|
|
<C:comp-filter name="VCALENDAR">
|
|
<C:comp-filter name="VEVENT"/>
|
|
</C:comp-filter>
|
|
</C:filter>
|
|
|
|
</C:calendar-query>
|
|
`
|
|
|
|
func get_calandar_data(cal Calandar, username string, password string) Calandar {
|
|
req, _ := http.NewRequest(
|
|
"REPORT",
|
|
cal.Link,
|
|
strings.NewReader(XML_cal),
|
|
)
|
|
|
|
req.SetBasicAuth(username, password)
|
|
req.Header.Set("Depth", "1")
|
|
req.Header.Set("Content-Type", "application/xml")
|
|
|
|
resp, err := client.Do(req)
|
|
if err != nil {
|
|
fmt.Print(err.Error())
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
body, err := io.ReadAll(resp.Body)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
var davResp MultiStatus
|
|
err = xml.Unmarshal(body, &davResp)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
for i := range len(davResp.Responses) {
|
|
newEvent := Event{
|
|
CalData: davResp.Responses[i].PropStat[0].Prop.CalendarData,
|
|
}
|
|
cal.Events = append(cal.Events, newEvent)
|
|
}
|
|
|
|
return cal
|
|
}
|