- Added configuration options for Stalwart hosted mail in .env.example. - Updated Docker Compose to include Stalwart service with health checks. - Introduced new API endpoints for managing mail domains and migration projects. - Enhanced Authentik blueprints for user enrollment and post-migration security. - Updated OAuth handling for Google and Microsoft migration processes. - Improved error handling and response structures in the mail API. - Added integration tests for email claiming and migration workflows.
88 lines
2.5 KiB
Go
88 lines
2.5 KiB
Go
package migration
|
|
|
|
import "strings"
|
|
|
|
// googleWorkspaceExport maps Google native mime types to export targets.
|
|
func googleWorkspaceExport(mimeType string) (exportMime, ext string, ok bool) {
|
|
switch mimeType {
|
|
case "application/vnd.google-apps.document":
|
|
return "application/vnd.openxmlformats-officedocument.wordprocessingml.document", ".docx", true
|
|
case "application/vnd.google-apps.spreadsheet":
|
|
return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", ".xlsx", true
|
|
case "application/vnd.google-apps.presentation":
|
|
return "application/vnd.openxmlformats-officedocument.presentationml.presentation", ".pptx", true
|
|
case "application/vnd.google-apps.drawing":
|
|
return "application/pdf", ".pdf", true
|
|
case "application/vnd.google-apps.script":
|
|
return "application/vnd.google-apps.script+json", ".json", true
|
|
case "application/vnd.google-apps.site":
|
|
return "text/plain", ".txt", true
|
|
default:
|
|
return "", "", false
|
|
}
|
|
}
|
|
|
|
// googleSlidesPDFExport returns PDF export for Google Slides (companion copy).
|
|
func googleSlidesPDFExport(mimeType string) (exportMime, ext string, ok bool) {
|
|
if mimeType == "application/vnd.google-apps.presentation" {
|
|
return "application/pdf", ".pdf", true
|
|
}
|
|
return "", "", false
|
|
}
|
|
|
|
func driveExportFileName(name, ext string) string {
|
|
name = strings.TrimSpace(name)
|
|
if name == "" {
|
|
name = "untitled"
|
|
}
|
|
if ext != "" && !strings.HasSuffix(strings.ToLower(name), strings.ToLower(ext)) {
|
|
return name + ext
|
|
}
|
|
return name
|
|
}
|
|
|
|
type driveFolderRef struct {
|
|
ID string
|
|
Path string
|
|
}
|
|
|
|
func readDriveFolderQueue(cursor map[string]any, provider string) []driveFolderRef {
|
|
raw, _ := cursor["folderQueue"].([]any)
|
|
out := make([]driveFolderRef, 0, len(raw))
|
|
for _, item := range raw {
|
|
m, _ := item.(map[string]any)
|
|
if m == nil {
|
|
continue
|
|
}
|
|
id, _ := m["id"].(string)
|
|
p, _ := m["path"].(string)
|
|
if id != "" {
|
|
out = append(out, driveFolderRef{ID: id, Path: p})
|
|
}
|
|
}
|
|
if len(out) == 0 {
|
|
if provider == "google" {
|
|
return []driveFolderRef{{ID: "root", Path: ""}}
|
|
}
|
|
return []driveFolderRef{{ID: "root", Path: ""}}
|
|
}
|
|
return out
|
|
}
|
|
|
|
func writeDriveFolderQueue(cursor map[string]any, queue []driveFolderRef) {
|
|
raw := make([]any, 0, len(queue))
|
|
for _, f := range queue {
|
|
raw = append(raw, map[string]any{"id": f.ID, "path": f.Path})
|
|
}
|
|
cursor["folderQueue"] = raw
|
|
}
|
|
|
|
func enqueueDriveFolder(queue []driveFolderRef, folder driveFolderRef) []driveFolderRef {
|
|
for _, existing := range queue {
|
|
if existing.ID == folder.ID {
|
|
return queue
|
|
}
|
|
}
|
|
return append(queue, folder)
|
|
}
|