diff --git a/src/GamUpdate.txt b/src/GamUpdate.txt index f64d7ef5..19924c22 100644 --- a/src/GamUpdate.txt +++ b/src/GamUpdate.txt @@ -1,3 +1,10 @@ +7.05.17 + +Updated commands that delete drive ACLs to handle the following error: +``` +ERROR: 403: cannotDeletePermission - The authenticated user does not have the required access to delete the permission. +``` + 7.05.16 Added option `transpose []` to `redirect csv` that causes diff --git a/src/gam/__init__.py b/src/gam/__init__.py index 9a489dce..a59f6723 100755 --- a/src/gam/__init__.py +++ b/src/gam/__init__.py @@ -25,7 +25,7 @@ https://github.com/taers232c/GAMADV-XTD3/wiki """ __author__ = 'Ross Scroggs ' -__version__ = '7.05.16' +__version__ = '7.05.17' __license__ = 'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)' #pylint: disable=wrong-import-position @@ -58745,7 +58745,7 @@ def _copyPermissions(drive, user, i, count, j, jcount, except (GAPI.notFound, GAPI.permissionNotFound, GAPI.fileNotFound, GAPI.forbidden, GAPI.internalError, GAPI.insufficientFilePermissions, GAPI.unknownError, GAPI.fileNeverWritable, GAPI.badRequest, GAPI.cannotRemoveOwner, GAPI.cannotModifyInheritedTeamDrivePermission, - GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded) as e: + GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded, GAPI.cannotDeletePermission) as e: entityActionFailedWarning(kvList, str(e), k, kcount) except (GAPI.serviceNotAvailable, GAPI.authError, GAPI.domainPolicy) as e: userDriveServiceNotEnabledWarning(user, str(e), i, count) @@ -59776,7 +59776,7 @@ def _updateMoveFilePermissions(drive, user, i, count, except (GAPI.notFound, GAPI.permissionNotFound, GAPI.fileNotFound, GAPI.forbidden, GAPI.internalError, GAPI.insufficientFilePermissions, GAPI.unknownError, GAPI.fileNeverWritable, GAPI.badRequest, GAPI.cannotRemoveOwner, GAPI.cannotModifyInheritedTeamDrivePermission, - GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded) as e: + GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded, GAPI.cannotDeletePermission) as e: entityActionFailedWarning(kvList, str(e), k, kcount) except (GAPI.serviceNotAvailable, GAPI.authError, GAPI.domainPolicy) as e: userDriveServiceNotEnabledWarning(user, str(e), i, count) @@ -61479,7 +61479,7 @@ def transferDrive(users): if showRetentionMessages: entityActionPerformed([Ent.USER, sourceUser, childFileType, childFileName, Ent.ROLE, ownerRetainRoleBody['role']], j, jcount) except (GAPI.fileNotFound, GAPI.forbidden, GAPI.internalError, GAPI.insufficientFilePermissions, GAPI.unknownError, - GAPI.badRequest, GAPI.sharingRateLimitExceeded, GAPI.cannotRemoveOwner) as e: + GAPI.badRequest, GAPI.sharingRateLimitExceeded, GAPI.cannotRemoveOwner, GAPI.cannotDeletePermission) as e: entityActionFailedWarning([Ent.USER, sourceUser, childFileType, childFileName], str(e), j, jcount) except GAPI.permissionNotFound: entityDoesNotHaveItemWarning([Ent.USER, sourceUser, childFileType, childFileName, Ent.PERMISSION_ID, sourcePermissionId], j, jcount) @@ -61532,7 +61532,7 @@ def transferDrive(users): if showRetentionMessages: entityActionPerformed([Ent.USER, sourceUser, childFileType, childFileName, Ent.ROLE, sourceUpdateRole['role']], j, jcount) except (GAPI.fileNotFound, GAPI.forbidden, GAPI.internalError, GAPI.insufficientFilePermissions, GAPI.unknownError, - GAPI.badRequest, GAPI.sharingRateLimitExceeded, GAPI.cannotRemoveOwner) as e: + GAPI.badRequest, GAPI.sharingRateLimitExceeded, GAPI.cannotRemoveOwner, GAPI.cannotDeletePermission) as e: entityActionFailedWarning([Ent.USER, ownerUser, childFileType, childFileName], str(e), j, jcount) except GAPI.permissionNotFound: entityDoesNotHaveItemWarning([Ent.USER, ownerUser, childFileType, childFileName, Ent.PERMISSION_ID, sourcePermissionId], j, jcount) @@ -61556,7 +61556,7 @@ def transferDrive(users): if showRetentionMessages: entityActionPerformed([Ent.USER, targetUser, childFileType, childFileName, Ent.ROLE, targetInsertBody['role']], j, jcount) except (GAPI.fileNotFound, GAPI.forbidden, GAPI.internalError, GAPI.insufficientFilePermissions, GAPI.unknownError, - GAPI.badRequest, GAPI.sharingRateLimitExceeded) as e: + GAPI.badRequest, GAPI.sharingRateLimitExceeded, GAPI.cannotDeletePermission) as e: entityActionFailedWarning([Ent.USER, ownerUser, childFileType, childFileName], str(e), j, jcount) except GAPI.invalidSharingRequest as e: entityActionFailedWarning([Ent.USER, ownerUser, childFileType, childFileName], Ent.TypeNameMessage(Ent.PERMISSION_ID, targetPermissionId, str(e)), j, jcount) @@ -62299,7 +62299,7 @@ def claimOwnership(users): entityActionPerformed([Ent.USER, oldOwner, entityType, fileDesc, Ent.ROLE, sourceRetainRoleBody['role']], l, lcount) except GAPI.permissionNotFound: entityDoesNotHaveItemWarning([Ent.USER, oldOwner, entityType, fileDesc, Ent.PERMISSION_ID, oldOwnerPermissionId], l, lcount) - except (GAPI.badRequest, GAPI.insufficientFilePermissions) as e: + except (GAPI.badRequest, GAPI.insufficientFilePermissions, GAPI.cannotDeletePermission) as e: entityActionFailedWarning([Ent.USER, oldOwner, entityType, fileDesc], str(e), l, lcount) except (GAPI.serviceNotAvailable, GAPI.authError, GAPI.domainPolicy) as e: userDriveServiceNotEnabledWarning(user, str(e), i, count) @@ -63471,7 +63471,7 @@ def deleteDriveFileACLs(users, useDomainAdminAccess=False): _updateSheetProtectedRangesACLchange(sheet, user, i, count, j, jcount, fileId, fileName, False, permission) except (GAPI.fileNotFound, GAPI.forbidden, GAPI.internalError, GAPI.insufficientFilePermissions, GAPI.unknownError, GAPI.fileNeverWritable, GAPI.badRequest, GAPI.cannotRemoveOwner, GAPI.cannotModifyInheritedTeamDrivePermission, - GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded) as e: + GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded, GAPI.cannotDeletePermission) as e: entityActionFailedWarning([Ent.USER, user, entityType, fileName], str(e), j, jcount) except GAPI.notFound as e: entityActionFailedWarning([Ent.USER, user, Ent.SHAREDDRIVE, fileName], str(e), j, jcount) @@ -63527,7 +63527,7 @@ def deletePermissions(users, useDomainAdminAccess=False): entityActionPerformed([Ent.DRIVE_FILE_OR_FOLDER_ID, ri[RI_ENTITY], Ent.PERMISSION_ID, ri[RI_ITEM]], int(ri[RI_J]), int(ri[RI_JCOUNT])) except (GAPI.fileNotFound, GAPI.forbidden, GAPI.internalError, GAPI.insufficientFilePermissions, GAPI.unknownError, GAPI.badRequest, GAPI.cannotRemoveOwner, GAPI.cannotModifyInheritedTeamDrivePermission, - GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded, GAPI.permissionNotFound, + GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded, GAPI.permissionNotFound, GAPI.cannotDeletePermission, GAPI.serviceNotAvailable, GAPI.authError, GAPI.domainPolicy) as e: entityActionFailedWarning([Ent.DRIVE_FILE_OR_FOLDER_ID, ri[RI_ENTITY], Ent.PERMISSION_ID, ri[RI_ITEM]], str(e), int(ri[RI_J]), int(ri[RI_JCOUNT])) if int(ri[RI_J]) == int(ri[RI_JCOUNT]): diff --git a/src/gam/gamlib/glgapi.py b/src/gam/gamlib/glgapi.py index 7a806369..1a1a4edd 100644 --- a/src/gam/gamlib/glgapi.py +++ b/src/gam/gamlib/glgapi.py @@ -37,6 +37,7 @@ CANNOT_CHANGE_OWNER_ACL = 'cannotChangeOwnerAcl' CANNOT_CHANGE_OWN_PRIMARY_SUBSCRIPTION = 'cannotChangeOwnPrimarySubscription' CANNOT_COPY_FILE = 'cannotCopyFile' CANNOT_DELETE_ONLY_REVISION = 'cannotDeleteOnlyRevision' +CANNOT_DELETE_PERMISSION = 'cannotDeletePermission' CANNOT_DELETE_PRIMARY_CALENDAR = 'cannotDeletePrimaryCalendar' CANNOT_DELETE_PRIMARY_SENDAS = 'cannotDeletePrimarySendAs' CANNOT_DELETE_RESOURCE_WITH_CHILDREN = 'cannotDeleteResourceWithChildren' @@ -246,7 +247,7 @@ DRIVE3_UPDATE_ACL_THROW_REASONS = [BAD_REQUEST, INVALID_OWNERSHIP_TRANSFER, CANN DRIVE3_DELETE_ACL_THROW_REASONS = [BAD_REQUEST, CANNOT_REMOVE_OWNER, CANNOT_MODIFY_INHERITED_TEAMDRIVE_PERMISSION, INSUFFICIENT_ADMINISTRATOR_PRIVILEGES, SHARING_RATE_LIMIT_EXCEEDED, - NOT_FOUND, PERMISSION_NOT_FOUND] + NOT_FOUND, PERMISSION_NOT_FOUND, CANNOT_DELETE_PERMISSION] DRIVE3_MODIFY_LABEL_THROW_REASONS = DRIVE_USER_THROW_REASONS+[FILE_NOT_FOUND, NOT_FOUND, FORBIDDEN, INTERNAL_ERROR, FILE_NEVER_WRITABLE, APPLY_LABEL_FORBIDDEN, INSUFFICIENT_ADMINISTRATOR_PRIVILEGES, INSUFFICIENT_FILE_PERMISSIONS, @@ -382,6 +383,8 @@ class cannotCopyFile(Exception): pass class cannotDeleteOnlyRevision(Exception): pass +class cannotDeletePermission(Exception): + pass class cannotDeletePrimaryCalendar(Exception): pass class cannotDeletePrimarySendAs(Exception): @@ -676,6 +679,7 @@ REASON_EXCEPTION_MAP = { CANNOT_CHANGE_OWN_PRIMARY_SUBSCRIPTION: cannotChangeOwnPrimarySubscription, CANNOT_COPY_FILE: cannotCopyFile, CANNOT_DELETE_ONLY_REVISION: cannotDeleteOnlyRevision, + CANNOT_DELETE_PERMISSION: cannotDeletePermission, CANNOT_DELETE_PRIMARY_CALENDAR: cannotDeletePrimaryCalendar, CANNOT_DELETE_PRIMARY_SENDAS: cannotDeletePrimarySendAs, CANNOT_DELETE_RESOURCE_WITH_CHILDREN: cannotDeleteResourceWithChildren,