permissionpolicy.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package permissionpolicy
  2. import (
  3. "fmt"
  4. "net/http"
  5. "strings"
  6. )
  7. /*
  8. Permisson Policy
  9. This is a permission policy header modifier that changes
  10. the request permission related policy fields
  11. */
  12. type PermissionsPolicy struct {
  13. Accelerometer []string `json:"accelerometer"`
  14. AmbientLightSensor []string `json:"ambient_light_sensor"`
  15. Autoplay []string `json:"autoplay"`
  16. Battery []string `json:"battery"`
  17. Camera []string `json:"camera"`
  18. CrossOriginIsolated []string `json:"cross_origin_isolated"`
  19. DisplayCapture []string `json:"display_capture"`
  20. DocumentDomain []string `json:"document_domain"`
  21. EncryptedMedia []string `json:"encrypted_media"`
  22. ExecutionWhileNotRendered []string `json:"execution_while_not_rendered"`
  23. ExecutionWhileOutOfView []string `json:"execution_while_out_of_viewport"`
  24. Fullscreen []string `json:"fullscreen"`
  25. Geolocation []string `json:"geolocation"`
  26. Gyroscope []string `json:"gyroscope"`
  27. KeyboardMap []string `json:"keyboard_map"`
  28. Magnetometer []string `json:"magnetometer"`
  29. Microphone []string `json:"microphone"`
  30. Midi []string `json:"midi"`
  31. NavigationOverride []string `json:"navigation_override"`
  32. Payment []string `json:"payment"`
  33. PictureInPicture []string `json:"picture_in_picture"`
  34. PublicKeyCredentialsGet []string `json:"publickey_credentials_get"`
  35. ScreenWakeLock []string `json:"screen_wake_lock"`
  36. SyncXHR []string `json:"sync_xhr"`
  37. USB []string `json:"usb"`
  38. WebShare []string `json:"web_share"`
  39. XRSpatialTracking []string `json:"xr_spatial_tracking"`
  40. ClipboardRead []string `json:"clipboard_read"`
  41. ClipboardWrite []string `json:"clipboard_write"`
  42. Gamepad []string `json:"gamepad"`
  43. SpeakerSelection []string `json:"speaker_selection"`
  44. ConversionMeasurement []string `json:"conversion_measurement"`
  45. FocusWithoutUserActivation []string `json:"focus_without_user_activation"`
  46. HID []string `json:"hid"`
  47. IdleDetection []string `json:"idle_detection"`
  48. InterestCohort []string `json:"interest_cohort"`
  49. Serial []string `json:"serial"`
  50. SyncScript []string `json:"sync_script"`
  51. TrustTokenRedemption []string `json:"trust_token_redemption"`
  52. Unload []string `json:"unload"`
  53. WindowPlacement []string `json:"window_placement"`
  54. VerticalScroll []string `json:"vertical_scroll"`
  55. }
  56. // InjectPermissionPolicyHeader inject the permission policy into headers
  57. func InjectPermissionPolicyHeader(w http.ResponseWriter, policy *PermissionsPolicy) {
  58. //Keep the original Permission Policy if exists, or there are no policy given
  59. if policy == nil || w.Header().Get("Permissions-Policy") != "" {
  60. return
  61. }
  62. policyHeader := []string{}
  63. // Helper function to add policy directives
  64. addDirective := func(name string, sources []string) {
  65. if len(sources) > 0 {
  66. if sources[0] == "*" {
  67. policyHeader = append(policyHeader, fmt.Sprintf("%s=%s", name, "*"))
  68. } else {
  69. policyHeader = append(policyHeader, fmt.Sprintf("%s=(%s)", name, strings.Join(sources, ", ")))
  70. }
  71. }
  72. }
  73. // Add each policy directive to the header
  74. addDirective("accelerometer", policy.Accelerometer)
  75. addDirective("ambient-light-sensor", policy.AmbientLightSensor)
  76. addDirective("autoplay", policy.Autoplay)
  77. addDirective("battery", policy.Battery)
  78. addDirective("camera", policy.Camera)
  79. addDirective("cross-origin-isolated", policy.CrossOriginIsolated)
  80. addDirective("display-capture", policy.DisplayCapture)
  81. addDirective("document-domain", policy.DocumentDomain)
  82. addDirective("encrypted-media", policy.EncryptedMedia)
  83. addDirective("execution-while-not-rendered", policy.ExecutionWhileNotRendered)
  84. addDirective("execution-while-out-of-viewport", policy.ExecutionWhileOutOfView)
  85. addDirective("fullscreen", policy.Fullscreen)
  86. addDirective("geolocation", policy.Geolocation)
  87. addDirective("gyroscope", policy.Gyroscope)
  88. addDirective("keyboard-map", policy.KeyboardMap)
  89. addDirective("magnetometer", policy.Magnetometer)
  90. addDirective("microphone", policy.Microphone)
  91. addDirective("midi", policy.Midi)
  92. addDirective("navigation-override", policy.NavigationOverride)
  93. addDirective("payment", policy.Payment)
  94. addDirective("picture-in-picture", policy.PictureInPicture)
  95. addDirective("publickey-credentials-get", policy.PublicKeyCredentialsGet)
  96. addDirective("screen-wake-lock", policy.ScreenWakeLock)
  97. addDirective("sync-xhr", policy.SyncXHR)
  98. addDirective("usb", policy.USB)
  99. addDirective("web-share", policy.WebShare)
  100. addDirective("xr-spatial-tracking", policy.XRSpatialTracking)
  101. addDirective("clipboard-read", policy.ClipboardRead)
  102. addDirective("clipboard-write", policy.ClipboardWrite)
  103. addDirective("gamepad", policy.Gamepad)
  104. addDirective("speaker-selection", policy.SpeakerSelection)
  105. addDirective("conversion-measurement", policy.ConversionMeasurement)
  106. addDirective("focus-without-user-activation", policy.FocusWithoutUserActivation)
  107. addDirective("hid", policy.HID)
  108. addDirective("idle-detection", policy.IdleDetection)
  109. addDirective("interest-cohort", policy.InterestCohort)
  110. addDirective("serial", policy.Serial)
  111. addDirective("sync-script", policy.SyncScript)
  112. addDirective("trust-token-redemption", policy.TrustTokenRedemption)
  113. addDirective("unload", policy.Unload)
  114. addDirective("window-placement", policy.WindowPlacement)
  115. addDirective("vertical-scroll", policy.VerticalScroll)
  116. // Join the directives and set the header
  117. policyHeaderValue := strings.Join(policyHeader, ", ")
  118. //Inject the new policy into the header
  119. w.Header().Set("Permissions-Policy", policyHeaderValue)
  120. }