From c5daf892c64b7816c0d589bbf44380c2539ef8a8 Mon Sep 17 00:00:00 2001 From: Ross Scroggs Date: Mon, 25 Mar 2019 12:31:48 -0700 Subject: [PATCH 1/5] Make SKU aliases consistent, update docs for new group settings (#866) * Make SKU aliases consistent * Update documentation with new SKUs * Update for new group settings --- src/GamCommands.txt | 132 +++++++++++++++++++++++++++++--------------- src/var.py | 2 +- 2 files changed, 90 insertions(+), 44 deletions(-) diff --git a/src/GamCommands.txt b/src/GamCommands.txt index 0c9b8d50..302a2af4 100644 --- a/src/GamCommands.txt +++ b/src/GamCommands.txt @@ -85,8 +85,10 @@ If an item contains spaces, it should be surrounded by ". gau|unlimited|gsuitebusiness|Google-Apps-Unlimited| gae|enterprise|gsuiteenterprise|1010020020| gsefe|e4e|gsuiteenterpriseeducation|1010310002| + gsefes|e4es|gsuiteenterpriseeducationstudent|1010310003| chrome|cdm|googlechromedevicemanagement|Google-Chrome-Device-Management| coordinate|googlecoordinate|Google-Coordinate| + d4e|driveenterprise|drive4enterprise| drive20gb|20gb|googledrivestorage20gb|Google-Drive-storage-20GB| drive50gb|50gb|googledrivestorage50gb|Google-Drive-storage-50GB| drive200gb|200gb|googledrivestorage200gb|Google-Drive-storage-200GB| @@ -353,43 +355,58 @@ If an item contains spaces, it should be surrounded by ". allowgooglecommunication| allowwebposting| archiveonly| - collaborative| + customfootertext| customreplyto| + customrolesenabledforsettingstobemerged| defaultmessagedenynotificationtext| description| directmemberscount| email| + enablecollaborativeinbox|collaborative| favoriterepliesontop| id| + includecustomfooter| includeinglobaladdresslist|gal| isarchived| maxmessagebytes| memberscanpostasthegroup| messagedisplayfont| messagemoderationlevel| - name + name| primarylanguage| replyto| sendmessagedenynotification| showingroupdirectory| spammoderationlevel| - whocanadd| whocanaddreferences| + whocanadd| + whocanapprovemessages| whocanassigntopics| + whocanassistcontent| whocancontactowner| + whocandeleteanypost| + whocandeletetopics| + whocandiscovergroup| whocanenterfreeformtags| + whocanhideabuse| whocaninvite| whocanjoin| whocanleavegroup| + whocanlocktopics| + whocanmaketopicssticky| whocanmarkduplicate| whocanmarkfavoritereplyonanytopic| whocanmarkfavoritereplyonowntopic| whocanmarknoresponseneeded| + whocanmoderatecontent| whocanmodifytagsandcategories| + whocanmovetopicsin| + whocanmovetopicsout| + whocanpostannouncements| whocanpostmessage| whocantaketopics| whocanunassigntopic| - whocanunmarkfavoritereplyonanytopic + whocanunmarkfavoritereplyonanytopic| whocanviewgroup| whocanviewmembership @@ -661,49 +678,78 @@ Specify a collection of Users by directly specifying them or by specifiying item (noreminders|(reminder email|popup|sms))| (colorindex|colorid ) - ::= + ::= (allowexternalmembers )| - (allowgooglecommunication )| (allowwebposting )| (archiveonly )| - (collaborative (members|all_members)|(managers|owners_and_managers)|(managers_only)|(owners|owners_only)|none)| (customfootertext )| (customreplyto )| (defaultmessagedenynotificationtext )| (description )| - (favoriterepliesontop )| - (gal|includeInGlobalAddressList )| + (enablecollaborativeinbox|collaborative )| + (includeinglobaladdresslist|gal )| (includecustomfooter )| (isarchived )| - (maxmessagebytes )| (memberscanpostasthegroup )| - (messagedisplayfont DEFAULT_FONT|FIXED_WIDTH_FONT)| - (messagemoderationlevel MODERATE_ALL_MESSAGES|MODERATE_NON_MEMBERS|MODERATE_NEW_MEMBERS|MODERATE_NONE)| + (messagemoderationlevel moderate_all_messages|moderate_non_members|moderate_new_members|moderate_none)| (name )| (primarylanguage )| - (replyto REPLY_TO_CUSTOM|REPLY_TO_SENDER|REPLY_TO_LIST|REPLY_TO_OWNER|REPLY_TO_IGNORE|REPLY_TO_MANAGERS)| + (replyto reply_to_custom|reply_to_sender|reply_to_list|reply_to_owner|reply_to_ignore|reply_to_managers)| (sendmessagedenynotification )| - (showingroupdirectory )| - (spammoderationlevel ALLOW|MODERATE|SILENTLY_MODERATE|REJECT)| - (whocanadd ALL_MEMBERS_CAN_ADD|ALL_MANAGERS_CAN_ADD|NONE_CAN_ADD)| - (whocanaddreferences (members|all_members)|(managers|owners_and_managers)|(managers_only)|(owners|owners_only)|none)| - (whocanassigntopics (members|all_members)|(managers|owners_and_managers)|(managers_only)|(owners|owners_only)|none)| - (whocancontactowner ANYONE_CAN_CONTACT|ALL_IN_DOMAIN_CAN_CONTACT|ALL_MEMBERS_CAN_CONTACT|ALL_MANAGERS_CAN_CONTACT)| - (whocanenterfreeformtags (members|all_members)|(managers|owners_and_managers)|(managers_only)|(owners|owners_only)|none)| - (whocaninvite ALL_MEMBERS_CAN_INVITE|ALL_MANAGERS_CAN_INVITE|NONE_CAN_INVITE)| - (whocanjoin ANYONE_CAN_JOIN|ALL_IN_DOMAIN_CAN_JOIN|INVITED_CAN_JOIN|CAN_REQUEST_TO_JOIN)| - (whocanleavegroup ALL_MANAGERS_CAN_LEAVE|ALL_MEMBERS_CAN_LEAVE|NONE_CAN_LEAVE)| - (whocanmarkduplicate (members|all_members)|(managers|owners_and_managers)|(managers_only)|(owners|owners_only)|none)| - (whocanmarkfavoritereplyonanytopic (members|all_members)|(managers|owners_and_managers)|(managers_only)|(owners|owners_only)|none)| - (whocanmarkfavoritereplyonowntopic (members|all_members)|(managers|owners_and_managers)|(managers_only)|(owners|owners_only)|none)| - (whocanmarknoresponseneeded (members|all_members)|(managers|owners_and_managers)|(managers_only)|(owners|owners_only)|none)| - (whocanmodifytagsandcategories (members|all_members)|(managers|owners_and_managers)|(managers_only)|(owners|owners_only)|none)| - (whocanpostmessage NONE_CAN_POST|ALL_MANAGERS_CAN_POST|ALL_MEMBERS_CAN_POST|ALL_IN_DOMAIN_CAN_POST|ANYONE_CAN_POST)| - (whocantaketopics (members|all_members)|(managers|owners_and_managers)|(managers_only)|(owners|owners_only)|none)| - (whocanunassigntopic (members|all_members)|(managers|owners_and_managers)|(managers_only)|(owners|owners_only)|none)| - (whocanunmarkfavoritereplyonanytopic (members|all_members)|(managers|owners_and_managers)|(managers_only)|(owners|owners_only)|none)| - (whocanviewgroup ANYONE_CAN_VIEW|ALL_IN_DOMAIN_CAN_VIEW|ALL_MEMBERS_CAN_VIEW|ALL_MANAGERS_CAN_VIEW)| - (whocanviewmembership ALL_IN_DOMAIN_CAN_VIEW|ALL_MEMBERS_CAN_VIEW|ALL_MANAGERS_CAN_VIEW) + (spammoderationlevel allow|moderate|silently_moderate|reject)| + (whocanadd all_members_can_add|all_managers_can_add|none_can_add)| + (whocancontactowner anyone_can_contact|all_in_domain_can_contact|all_members_can_contact|all_managers_can_contact)| + (whocanjoin anyone_can_join|all_in_domain_can_join|invited_can_join|can_request_to_join)| + (whocanleavegroup all_managers_can_leave|all_members_can_leave|none_can_leave)| + (whocanpostmessage none_can_post|all_managers_can_post|all_members_can_post|all_in_domain_can_post|anyone_can_post)| + (whocanviewgroup anyone_can_view|all_in_domain_can_view|all_members_can_view|all_managers_can_view)| + (whocanviewmembership all_in_domain_can_view|all_members_can_view|all_managers_can_view) + ::= + (whocandiscovergroup allmemberscandiscover|allindomaincandiscover|anyonecandiscover)| + (showingroupdirectory ) + ::= + (whocanassistcontent (members|all_members)|owners_and_managers|managers_only|owners_only|none)| + (whocanassigntopics (members|all_members)|owners_and_managers|managers_only|owners_only|none)| + (whocanenterfreeformtags (members|all_members)|owners_and_managers|managers_only|owners_only|none)| + (whocanhideabuse (members|all_members)|owners_and_managers|managers_only|owners_only|none)| + (whocanmaketopicssticky (members|all_members)|owners_and_managers|managers_only|owners_only|none)| + (whocanmarkduplicate (members|all_members)|owners_and_managers|managers_only|owners_only|none)| + (whocanmarkfavoritereplyonanytopic (members|all_members)|owners_and_managers|managers_only|owners_only|none)| + (whocanmarknoresponseneeded (members|all_members)|owners_and_managers|managers_only|owners_only|none)| + (whocanmodifytagsandcategories (members|all_members)|owners_and_managers|managers_only|owners_only|none)| + (whocantaketopics (members|all_members)|owners_and_managers|managers_only|owners_only|none)| + (whocanunassigntopic (members|all_members)|owners_and_managers|managers_only|owners_only|none)| + (whocanunmarkfavoritereplyonanytopic (members|all_members)|owners_and_managers|managers_only|owners_only|none) + ::= + (whocanmoderatecontent (members|all_members)|owners_and_managers|owners_only|none)| + (whocanapprovemessages (members|all_members)|owners_and_managers|owners_only|none)| + (whocandeleteanypost (members|all_members)|owners_and_managers|owners_only|none)| + (whocandeletetopics (members|all_members)|owners_and_managers|owners_only|none)| + (whocanlocktopics (members|all_members)|owners_and_managers|owners_only|none)| + (whocanmovetopicsin (members|all_members)|owners_and_managers|owners_only|none)| + (whocanmovetopicsout (members|all_members)|owners_and_managers|owners_only|none)| + (whocanpostannouncements (members|all_members)|owners_and_managers|owners_only|none) + ::= + (whocanmoderatemembers (members|all_members)|owners_and_managers|owners_only|none)| + (whocanadd all_members_can_add|all_managers_can_add|none_can_add)| + (whocanapprovemembers all_members_can_approve|all_managers_can_approve|all_owners_can_approve|none_can_approve)| + (whocanbanusers (members|all_members)|owners_and_managers|owners_only|none)| + (whocaninvite all_members_can_invite|all_managers_can_invite|none_can_invite)| + (whocanmodifymembers (members|all_members)|owners_and_managers|owners_only|none) + ::= + (allowgooglecommunication )| + (favoriterepliesontop )| + (maxmessagebytes )| + (messagedisplayfont default_font|fixed_width_font)| + (whocanaddreferences (members|all_members)|owners_and_managers|managers_only|owners_only|none)| + (whocanmarkfavoritereplyonowntopic (members|all_members)|owners_and_managers|managers_only|owners_only|none) + ::= + | + | + | + | + | + ::= admin_remote_wipe|wipe|admin_account_wipe|accountwipe|wipeaccount|approve|block|cancel_remote_wipe_then_activate|cancel_remote_wipe_then_block @@ -877,9 +923,9 @@ gam update customer * gam info customer ::= - calendar| - googledrive|gdrive|drive|"drive and docs"| - gplus|googleplus|google+ + calendar| + googledrive|gdrive|drive|"drive and docs"| + gplus|googleplus|google+ ::= "(,)*" gam create datatransfer|transfer ( )* @@ -1236,7 +1282,7 @@ gam pop|pop3 [for allmail|newmail|mailfromnowon|fromn gam show pop|pop3 gam [create|add] sendas [signature|sig |(file [charset ]) (replace )*] [html] [replyto ] [default] [treatasalias ] - [smtpmsa.host smtpmsa.port 25|465|587 smtpmsa.username smtpmsa.password [smtpmsa.securitymode none|ssl|starttls]] + [smtpmsa.host smtpmsa.port 25|465|587 smtpmsa.username smtpmsa.password [smtpmsa.securitymode none|ssl|starttls]] gam update sendas [name ] [signature|sig |(file [charset ]) (replace )*] [html] [replyto ] [default] [treatasalias ] gam delete sendas gam show sendas [format] @@ -1253,15 +1299,15 @@ gam signature|sig |(file [charset ] gam show signature|sig [format] ::= - adminmanagedrestrictions| - copyrequireswriterpermission| - domainusersonly| - teammembersonly + adminmanagedrestrictions| + copyrequireswriterpermission| + domainusersonly| + teammembersonly gam create|add teamdrive gam update teamdrive [asadmin] [name ] [(theme|themeid ) | ([customtheme ] [color ])] - ( )* + ( )* gam delete teamdrive gam show teamdriveinfo [asadmin] gam show teamdrives [asadmin] diff --git a/src/var.py b/src/var.py index 57497e54..ae789869 100644 --- a/src/var.py +++ b/src/var.py @@ -52,7 +52,7 @@ SKUS = { u'1010310002': { u'product': u'101031', u'aliases': [u'gsefe', u'e4e', u'gsuiteenterpriseeducation'], u'displayName': u'G Suite Enterprise for Education'}, u'1010310003': { - u'product': u'101031', u'aliases': [u'gse4es', u'e4es', u'gsuiteenterpriseeducationstudent'], u'displayName': u'G Suite Enterprise for Education Student'}, + u'product': u'101031', u'aliases': [u'gsefes', u'e4es', u'gsuiteenterpriseeducationstudent'], u'displayName': u'G Suite Enterprise for Education Student'}, u'Google-Apps': { u'product': u'Google-Apps', u'aliases': [u'standard', u'free'], u'displayName': u'G Suite Free/Standard'}, u'Google-Apps-For-Business': { From ce0ad0a3eab2ae88d153afddda98f69050ec6bbc Mon Sep 17 00:00:00 2001 From: Jay Lee Date: Thu, 28 Mar 2019 14:29:49 +0000 Subject: [PATCH 2/5] Better error messages on group settings update for invalid values. --- src/gam.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/gam.py b/src/gam.py index ade97489..98d3cdef 100755 --- a/src/gam.py +++ b/src/gam.py @@ -8394,6 +8394,11 @@ def getGroupAttrValue(myarg, value, gs_object, gs_body, function): value = u'true' elif value.lower() in false_values: value = u'false' + # Another ugly hack because Groups Settings API doesn't have proper enumerator values set in discovery file. + if u'description' in params and params[u'description'].find(u'Possible values are: ') != -1: + possible_values = params[u'description'][params[u'description'].find(u'Possible values are: ')+21:].split(u' ') + if value not in possible_values: + systemErrorExit(2, u'value for %s must be one of %s. Got %s.' % (attrib, u', '.join(possible_values), value)) gs_body[attrib] = value return systemErrorExit(2, '%s is not a valid argument for "gam %s group"' % (myarg, function)) From 9f988bb464bb1d1667c8aa4cf081638c03c01be4 Mon Sep 17 00:00:00 2001 From: Jay Lee Date: Thu, 28 Mar 2019 19:06:03 +0000 Subject: [PATCH 3/5] make group settings get before update optional. --- src/gam.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/gam.py b/src/gam.py index 98d3cdef..b68f8bee 100755 --- a/src/gam.py +++ b/src/gam.py @@ -8827,6 +8827,7 @@ def doUpdateGroup(): users_email = [normalizeEmailAddressOrUID(sys.argv[i], checkForCustomerId=True)] return (role, users_email, delivery) + gs_get_before_update = False cd = buildGAPIObject(u'directory') group = sys.argv[3] myarg = sys.argv[4].lower() @@ -9025,6 +9026,9 @@ def doUpdateGroup(): use_cd_api = True cd_body[u'adminCreated'] = getBoolean(sys.argv[i+1], myarg) i += 2 + elif myarg == u'getbeforeupdate': + gs_get_before_update = True + i += 1 else: if not gs: gs = buildGAPIObject(u'groupssettings') @@ -9036,12 +9040,14 @@ def doUpdateGroup(): group = callGAPI(cd.groups(), u'update', groupKey=group, body=cd_body, fields=u'email')[u'email'] if gs: if not GroupIsAbuseOrPostmaster(group): - settings = callGAPI(gs.groups(), u'get', + if gs_get_before_update: + current_settings = callGAPI(gs.groups(), u'get', retry_reasons=[u'serviceLimit'], groupUniqueId=group, fields=u'*') - if settings is not None: - settings.update(gs_body) - callGAPI(gs.groups(), u'update', retry_reasons=[u'serviceLimit'], groupUniqueId=group, body=settings) + if current_settings is not None: + gs_body = dict(current_settings.items() + gs_body.items()) + if gs_body: + callGAPI(gs.groups(), u'update', retry_reasons=[u'serviceLimit'], groupUniqueId=group, body=gs_body) print u'updated group %s' % group def doUpdateAlias(): @@ -13618,9 +13624,9 @@ def ProcessGAMCommand(args): systemErrorExit(2, '%s is not a valid argument for "gam watch"' % watchWhat) else: systemErrorExit(2, '%s is not a valid argument for "gam"' % command) - except IndexError: - showUsage() - sys.exit(2) + #except IndexError: + # showUsage() + # sys.exit(2) except KeyboardInterrupt: sys.exit(50) except socket.error as e: From b3ad45f2cc91ff8468cfc9983fad0ab52ab1c9fa Mon Sep 17 00:00:00 2001 From: Ross Scroggs Date: Mon, 1 Apr 2019 07:38:49 -0700 Subject: [PATCH 4/5] Add gs_get_before_update to create group (#872) Appease pylint --- src/gam.py | 59 +++++++++++++++++++++++++++--------------------------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/src/gam.py b/src/gam.py index b68f8bee..25e9a8d3 100755 --- a/src/gam.py +++ b/src/gam.py @@ -963,14 +963,13 @@ def callGAPIpages(service, function, items=u'items', page_token = None total_items = 0 while True: - page = callGAPI( - service, - function, - soft_errors=soft_errors, - throw_reasons=throw_reasons, - retry_reasons=retry_reasons, - pageToken=page_token, - **kwargs) + page = callGAPI(service, + function, + soft_errors=soft_errors, + throw_reasons=throw_reasons, + retry_reasons=retry_reasons, + pageToken=page_token, + **kwargs) if page: page_token = page.get(u'nextPageToken') page_items = page.get(items, []) @@ -988,10 +987,8 @@ def callGAPIpages(service, function, items=u'items', if message_attribute: first_item = page_items[0] if num_page_items > 0 else {} last_item = page_items[-1] if num_page_items > 1 else first_item - show_message = show_message.replace( - u'%%first_item%%', str(first_item.get(message_attribute, u''))) - show_message = show_message.replace( - u'%%last_item%%', str(last_item.get(message_attribute, u''))) + show_message = show_message.replace(u'%%first_item%%', str(first_item.get(message_attribute, u''))) + show_message = show_message.replace(u'%%last_item%%', str(last_item.get(message_attribute, u''))) sys.stderr.write(u'\r') sys.stderr.flush() sys.stderr.write(show_message) @@ -1024,12 +1021,11 @@ def callGAPIitems(service, function, items=u'items', Returns: The list of items in the first page of a response. """ - results = callGAPI( - service, - function, - throw_reasons=throw_reasons, - retry_reasons=retry_reasons, - **kwargs) + results = callGAPI(service, + function, + throw_reasons=throw_reasons, + retry_reasons=retry_reasons, + **kwargs) if results: return results.get(items, []) return [] @@ -8406,7 +8402,7 @@ def getGroupAttrValue(myarg, value, gs_object, gs_body, function): def doCreateGroup(): cd = buildGAPIObject(u'directory') body = {u'email': normalizeEmailAddressOrUID(sys.argv[3], noUid=True)} - got_name = False + gs_get_before_update = got_name = False i = 4 gs_body = {} gs = None @@ -8430,6 +8426,9 @@ def doCreateGroup(): else: body[u'description'] = description i += 2 + elif myarg == u'getbeforeupdate': + gs_get_before_update = True + i += 1 else: if not gs: gs = buildGAPIObject(u'groupssettings') @@ -8441,12 +8440,14 @@ def doCreateGroup(): print u"Creating group %s" % body[u'email'] callGAPI(cd.groups(), u'insert', body=body, fields=u'email') if gs and not GroupIsAbuseOrPostmaster(body[u'email']): - settings = callGAPI(gs.groups(), u'get', - retry_reasons=[u'serviceLimit'], - groupUniqueId=body[u'email'], fields=u'*') - if settings is not None: - settings.update(gs_body) - callGAPI(gs.groups(), u'update', retry_reasons=[u'serviceLimit'], groupUniqueId=body[u'email'], body=settings) + if gs_get_before_update: + current_settings = callGAPI(gs.groups(), u'get', + retry_reasons=[u'serviceLimit'], + groupUniqueId=body[u'email'], fields=u'*') + if current_settings is not None: + gs_body = dict(current_settings.items() + gs_body.items()) + if gs_body: + callGAPI(gs.groups(), u'update', retry_reasons=[u'serviceLimit'], groupUniqueId=body[u'email'], body=gs_body) def doCreateAlias(): cd = buildGAPIObject(u'directory') @@ -9042,8 +9043,8 @@ def doUpdateGroup(): if not GroupIsAbuseOrPostmaster(group): if gs_get_before_update: current_settings = callGAPI(gs.groups(), u'get', - retry_reasons=[u'serviceLimit'], - groupUniqueId=group, fields=u'*') + retry_reasons=[u'serviceLimit'], + groupUniqueId=group, fields=u'*') if current_settings is not None: gs_body = dict(current_settings.items() + gs_body.items()) if gs_body: @@ -10918,7 +10919,7 @@ def doPrintShowAlerts(): titles.append(field) csv_rows.append(aj) writeCSVfile(csv_rows, titles, u'Alerts', False) - + def doPrintShowAlertFeedback(): _, ac = buildAlertCenterGAPIObject(_getValueFromOAuth(u'email')) feedback = callGAPIpages(ac.alerts().feedback(), u'list', u'feedback', alertId=u'-') @@ -10926,7 +10927,7 @@ def doPrintShowAlertFeedback(): print feedbac def _getValidAlertFeedbackTypes(ac): - return [type for type in ac._rootDesc[u'schemas'][u'AlertFeedback'][u'properties'][u'type'][u'enum'] if type != u'ALERT_FEEDBACK_TYPE_UNSPECIFIED'] + return [aftype for aftype in ac._rootDesc[u'schemas'][u'AlertFeedback'][u'properties'][u'type'][u'enum'] if aftype != u'ALERT_FEEDBACK_TYPE_UNSPECIFIED'] def doCreateAlertFeedback(): _, ac = buildAlertCenterGAPIObject(_getValueFromOAuth(u'email')) From a852c7e5ca06c2fbfc21a5e8921d8c705192aeb1 Mon Sep 17 00:00:00 2001 From: Ross Scroggs Date: Mon, 1 Apr 2019 12:12:12 -0700 Subject: [PATCH 5/5] Groups settings documentation cleanup (#873) --- src/GamCommands.txt | 62 ++++++++++++++++++++++----------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/src/GamCommands.txt b/src/GamCommands.txt index 302a2af4..67da7f97 100644 --- a/src/GamCommands.txt +++ b/src/GamCommands.txt @@ -697,52 +697,52 @@ Specify a collection of Users by directly specifying them or by specifiying item (replyto reply_to_custom|reply_to_sender|reply_to_list|reply_to_owner|reply_to_ignore|reply_to_managers)| (sendmessagedenynotification )| (spammoderationlevel allow|moderate|silently_moderate|reject)| - (whocanadd all_members_can_add|all_managers_can_add|none_can_add)| + (whocanadd all_members_can_add|all_managers_can_add|all_owners_can_add|none_can_add)| (whocancontactowner anyone_can_contact|all_in_domain_can_contact|all_members_can_contact|all_managers_can_contact)| (whocanjoin anyone_can_join|all_in_domain_can_join|invited_can_join|can_request_to_join)| - (whocanleavegroup all_managers_can_leave|all_members_can_leave|none_can_leave)| - (whocanpostmessage none_can_post|all_managers_can_post|all_members_can_post|all_in_domain_can_post|anyone_can_post)| - (whocanviewgroup anyone_can_view|all_in_domain_can_view|all_members_can_view|all_managers_can_view)| - (whocanviewmembership all_in_domain_can_view|all_members_can_view|all_managers_can_view) + (whocanleavegroup all_members_can_leave|all_managers_can_leave|all_owners_can_leave|none_can_leave)| + (whocanpostmessage none_can_post|all_managers_can_post|all_members_can_post|all_owners_can_post|all_in_domain_can_post|anyone_can_post)| + (whocanviewgroup anyone_can_view|all_in_domain_can_view|all_members_can_view|all_managers_can_view|all_owners_can_view)| + (whocanviewmembership all_in_domain_can_view|all_members_can_view|all_managers_can_view|all_owners_can_view) ::= (whocandiscovergroup allmemberscandiscover|allindomaincandiscover|anyonecandiscover)| (showingroupdirectory ) ::= - (whocanassistcontent (members|all_members)|owners_and_managers|managers_only|owners_only|none)| - (whocanassigntopics (members|all_members)|owners_and_managers|managers_only|owners_only|none)| - (whocanenterfreeformtags (members|all_members)|owners_and_managers|managers_only|owners_only|none)| - (whocanhideabuse (members|all_members)|owners_and_managers|managers_only|owners_only|none)| - (whocanmaketopicssticky (members|all_members)|owners_and_managers|managers_only|owners_only|none)| - (whocanmarkduplicate (members|all_members)|owners_and_managers|managers_only|owners_only|none)| - (whocanmarkfavoritereplyonanytopic (members|all_members)|owners_and_managers|managers_only|owners_only|none)| - (whocanmarknoresponseneeded (members|all_members)|owners_and_managers|managers_only|owners_only|none)| - (whocanmodifytagsandcategories (members|all_members)|owners_and_managers|managers_only|owners_only|none)| - (whocantaketopics (members|all_members)|owners_and_managers|managers_only|owners_only|none)| - (whocanunassigntopic (members|all_members)|owners_and_managers|managers_only|owners_only|none)| - (whocanunmarkfavoritereplyonanytopic (members|all_members)|owners_and_managers|managers_only|owners_only|none) + (whocanassistcontent all_members|owners_and_managers|managers_only|owners_only|none)| + (whocanassigntopics all_members|owners_and_managers|managers_only|owners_only|none)| + (whocanenterfreeformtags all_members|owners_and_managers|managers_only|owners_only|none)| + (whocanhideabuse all_members|owners_and_managers|managers_only|owners_only|none)| + (whocanmaketopicssticky all_members|owners_and_managers|managers_only|owners_only|none)| + (whocanmarkduplicate all_members|owners_and_managers|managers_only|owners_only|none)| + (whocanmarkfavoritereplyonanytopic all_members|owners_and_managers|managers_only|owners_only|none)| + (whocanmarknoresponseneeded all_members|owners_and_managers|managers_only|owners_only|none)| + (whocanmodifytagsandcategories all_members|owners_and_managers|managers_only|owners_only|none)| + (whocantaketopics all_members|owners_and_managers|managers_only|owners_only|none)| + (whocanunassigntopic all_members|owners_and_managers|managers_only|owners_only|none)| + (whocanunmarkfavoritereplyonanytopic all_members|owners_and_managers|managers_only|owners_only|none) ::= - (whocanmoderatecontent (members|all_members)|owners_and_managers|owners_only|none)| - (whocanapprovemessages (members|all_members)|owners_and_managers|owners_only|none)| - (whocandeleteanypost (members|all_members)|owners_and_managers|owners_only|none)| - (whocandeletetopics (members|all_members)|owners_and_managers|owners_only|none)| - (whocanlocktopics (members|all_members)|owners_and_managers|owners_only|none)| - (whocanmovetopicsin (members|all_members)|owners_and_managers|owners_only|none)| - (whocanmovetopicsout (members|all_members)|owners_and_managers|owners_only|none)| - (whocanpostannouncements (members|all_members)|owners_and_managers|owners_only|none) + (whocanmoderatecontent all_members|owners_and_managers|owners_only|none)| + (whocanapprovemessages all_members|owners_and_managers|owners_only|none)| + (whocandeleteanypost all_members|owners_and_managers|owners_only|none)| + (whocandeletetopics all_members|owners_and_managers|owners_only|none)| + (whocanlocktopics all_members|owners_and_managers|owners_only|none)| + (whocanmovetopicsin all_members|owners_and_managers|owners_only|none)| + (whocanmovetopicsout all_members|owners_and_managers|owners_only|none)| + (whocanpostannouncements all_members|owners_and_managers|owners_only|none) ::= - (whocanmoderatemembers (members|all_members)|owners_and_managers|owners_only|none)| + (whocanmoderatemembers all_members|owners_and_managers|owners_only|none)| (whocanadd all_members_can_add|all_managers_can_add|none_can_add)| (whocanapprovemembers all_members_can_approve|all_managers_can_approve|all_owners_can_approve|none_can_approve)| - (whocanbanusers (members|all_members)|owners_and_managers|owners_only|none)| - (whocaninvite all_members_can_invite|all_managers_can_invite|none_can_invite)| - (whocanmodifymembers (members|all_members)|owners_and_managers|owners_only|none) + (whocanbanusers all_members|owners_and_managers|owners_only|none)| + (whocaninvite all_members_can_invite|all_managers_can_invite|all_owners_can_invite|none_can_invite)| + (whocanmodifymembers all_members|owners_and_managers|owners_only|none) ::= (allowgooglecommunication )| (favoriterepliesontop )| (maxmessagebytes )| (messagedisplayfont default_font|fixed_width_font)| - (whocanaddreferences (members|all_members)|owners_and_managers|managers_only|owners_only|none)| - (whocanmarkfavoritereplyonowntopic (members|all_members)|owners_and_managers|managers_only|owners_only|none) + (whocanaddreferences all_members|owners_and_managers|managers_only|owners_only|none)| + (whocanmarkfavoritereplyonowntopic all_members|owners_and_managers|managers_only|owners_only|none) ::= | |