in groups/service.go [433:508]
func (gs *groupService) UpdateGroupSettings(group GoogleGroup) error {
if *verbose {
log.Printf("groupService.UpdateGroupSettings %s", group.EmailId)
}
g2, err := gs.client.Get(group.EmailId)
if err != nil {
if gs.checkForAPIErr404(err) {
log.Printf("skipping updating group settings as group %q has not yet been created\n", group.EmailId)
return nil
}
return fmt.Errorf("unable to retrieve group info for group %q: %w", group.EmailId, err)
}
var (
haveSettings groupssettings.Groups
wantSettings groupssettings.Groups
)
// We copy the settings we get from the API into haveSettings, and then copy
// it again into wantSettings so we have a version we can manipulate.
deepCopySettings(&g2, &haveSettings)
deepCopySettings(&haveSettings, &wantSettings)
// This sets safe/sane defaults
wantSettings.AllowExternalMembers = "true"
wantSettings.WhoCanJoin = "INVITED_CAN_JOIN"
wantSettings.WhoCanViewMembership = "ALL_MANAGERS_CAN_VIEW"
wantSettings.WhoCanViewGroup = "ALL_MEMBERS_CAN_VIEW"
wantSettings.WhoCanDiscoverGroup = "ALL_IN_DOMAIN_CAN_DISCOVER"
wantSettings.WhoCanModerateMembers = "OWNERS_AND_MANAGERS"
wantSettings.WhoCanModerateContent = "OWNERS_AND_MANAGERS"
wantSettings.WhoCanPostMessage = "ALL_MEMBERS_CAN_POST"
wantSettings.MessageModerationLevel = "MODERATE_NONE"
wantSettings.MembersCanPostAsTheGroup = "false"
for key, value := range group.Settings {
switch key {
case "AllowExternalMembers":
wantSettings.AllowExternalMembers = value
case "AllowWebPosting":
wantSettings.AllowWebPosting = value
case "WhoCanJoin":
wantSettings.WhoCanJoin = value
case "WhoCanViewMembership":
wantSettings.WhoCanViewMembership = value
case "WhoCanViewGroup":
wantSettings.WhoCanViewGroup = value
case "WhoCanDiscoverGroup":
wantSettings.WhoCanDiscoverGroup = value
case "WhoCanModerateMembers":
wantSettings.WhoCanModerateMembers = value
case "WhoCanPostMessage":
wantSettings.WhoCanPostMessage = value
case "MessageModerationLevel":
wantSettings.MessageModerationLevel = value
case "MembersCanPostAsTheGroup":
wantSettings.MembersCanPostAsTheGroup = value
}
}
if !reflect.DeepEqual(&haveSettings, &wantSettings) {
if config.ConfirmChanges {
_, err := gs.client.Patch(group.EmailId, &wantSettings)
if err != nil {
return fmt.Errorf("unable to update group info for group %q: %w", group.EmailId, err)
}
log.Printf("> Successfully updated group settings for %q to allow external members and other security settings\n", group.EmailId)
} else {
log.Printf("dry-run: would update group settings for %q\n", group.EmailId)
log.Printf("dry-run: current settings %+q", haveSettings)
log.Printf("dry-run: desired settings %+q", wantSettings)
}
}
return nil
}