mirror of
https://github.com/GAM-team/GAM.git
synced 2025-07-08 21:53:36 +00:00
Initial S/MIME support (requires Enterprise SKU)
This commit is contained in:
176
src/gam.py
176
src/gam.py
@ -4588,6 +4588,132 @@ def deleteSendAs(users):
|
|||||||
soft_errors=True,
|
soft_errors=True,
|
||||||
userId=u'me', sendAsEmail=emailAddress)
|
userId=u'me', sendAsEmail=emailAddress)
|
||||||
|
|
||||||
|
def updateSmime(users):
|
||||||
|
smimeId = None
|
||||||
|
sendAsEmail = None
|
||||||
|
make_default = False
|
||||||
|
i = 5
|
||||||
|
while i < len(sys.argv):
|
||||||
|
myarg = sys.argv[i].lower()
|
||||||
|
if myarg == u'id':
|
||||||
|
smimeId = sys.argv[i+1]
|
||||||
|
i += 2
|
||||||
|
elif myarg in [u'sendas', u'sendasemail']:
|
||||||
|
sendAsEmail = sys.argv[i+1]
|
||||||
|
i += 2
|
||||||
|
elif myarg in [u'default']:
|
||||||
|
make_default = True
|
||||||
|
i += 1
|
||||||
|
else:
|
||||||
|
print u'ERROR: %s is not a valid argument to "gam <users> update smime"' % myarg
|
||||||
|
sys.exit(3)
|
||||||
|
if not make_default:
|
||||||
|
print u'Nothing to update for smime.'
|
||||||
|
sys.exit(0)
|
||||||
|
for user in users:
|
||||||
|
user, gmail = buildGmailGAPIObject(user)
|
||||||
|
if not gmail:
|
||||||
|
continue
|
||||||
|
if not sendAsEmail:
|
||||||
|
sendAsEmail = user
|
||||||
|
if not smimeId:
|
||||||
|
result = callGAPI(gmail.users().settings().sendAs().smimeInfo(), u'list', userId=u'me', sendAsEmail=sendAsEmail, fields=u'smimeInfo(id)')
|
||||||
|
smimes = result.get(u'smimeInfo', [])
|
||||||
|
if len(smimes) == 0:
|
||||||
|
print u'ERROR: %s has no S/MIME certificates for sendas address %s' % (user, sendAsEmail)
|
||||||
|
sys.exit(3)
|
||||||
|
elif len(smimes) > 1:
|
||||||
|
print u'ERROR: %s has more than one S/MIME certificate. Please specify a cert to update:'
|
||||||
|
for smime in smimes:
|
||||||
|
print u' %s' % smime[u'id']
|
||||||
|
sys.exit(3)
|
||||||
|
smimeId = smimes[0][u'id']
|
||||||
|
print u'Setting smime id %s as default for user %s and sendas %s' % (smimeId, user, sendAsEmail)
|
||||||
|
callGAPI(gmail.users().settings().sendAs().smimeInfo(), u'setDefault', userId=u'me', sendAsEmail=sendAsEmail, id=smimeId)
|
||||||
|
|
||||||
|
def deleteSmime(users):
|
||||||
|
smimeId = None
|
||||||
|
sendAsEmail = None
|
||||||
|
i = 5
|
||||||
|
while i < len(sys.argv):
|
||||||
|
myarg = sys.argv[i].lower()
|
||||||
|
if myarg == u'id':
|
||||||
|
smimeId = sys.argv[i+1]
|
||||||
|
i += 2
|
||||||
|
elif myarg in [u'sendas', u'sendasemail']:
|
||||||
|
sendAsEmail = sys.argv[i+1]
|
||||||
|
i += 2
|
||||||
|
else:
|
||||||
|
print u'ERROR: %s is not a valid argument to "gam <users> delete smime"' % myarg
|
||||||
|
sys.exit(3)
|
||||||
|
for user in users:
|
||||||
|
user, gmail = buildGmailGAPIObject(user)
|
||||||
|
if not sendAsEmail:
|
||||||
|
sendAsEmail = user
|
||||||
|
if not smimeId:
|
||||||
|
result = callGAPI(gmail.users().settings().sendAs().smimeInfo(), u'list', userId=u'me', sendAsEmail=sendAsEmail, fields=u'smimeInfo(id)')
|
||||||
|
smimes = result.get(u'smimeInfo', [])
|
||||||
|
if len(smimes) == 0:
|
||||||
|
print u'ERROR: %s has no S/MIME certificates for sendas address %s' % (user, sendAsEmail)
|
||||||
|
sys.exit(3)
|
||||||
|
elif len(smimes) > 1:
|
||||||
|
print u'ERROR: %s has more than one S/MIME certificate. Please specify a cert to delete:'
|
||||||
|
for smime in smimes:
|
||||||
|
print u' %s' % smime[u'id']
|
||||||
|
sys.exit(3)
|
||||||
|
smimeId = smimes[0][u'id']
|
||||||
|
callGAPI(gmail.users().settings().sendAs().smimeInfo(), u'delete', userId=u'me', sendAsEmail=sendAsEmail, id=smimeId)
|
||||||
|
|
||||||
|
def printShowSmime(users, csvFormat):
|
||||||
|
if csvFormat:
|
||||||
|
todrive = False
|
||||||
|
titles = [u'User']
|
||||||
|
csvRows = []
|
||||||
|
primaryonly = False
|
||||||
|
i = 5
|
||||||
|
while i < len(sys.argv):
|
||||||
|
myarg = sys.argv[i].lower()
|
||||||
|
if csvFormat and myarg == u'todrive':
|
||||||
|
todrive = True
|
||||||
|
i += 1
|
||||||
|
elif myarg == u'primaryonly':
|
||||||
|
primaryonly = True
|
||||||
|
i += 1
|
||||||
|
else:
|
||||||
|
print u'ERROR: %s is not a valid argumetn for "gam <users> %s smime"' % (myarg, [u'show', u'print'][csvFormat])
|
||||||
|
sys.exit(3)
|
||||||
|
i = 0
|
||||||
|
count = len(users)
|
||||||
|
for user in users:
|
||||||
|
i += 1
|
||||||
|
user, gmail = buildGmailGAPIObject(user)
|
||||||
|
if not gmail:
|
||||||
|
continue
|
||||||
|
if primaryonly:
|
||||||
|
sendAsEmails = [user]
|
||||||
|
else:
|
||||||
|
result = callGAPI(gmail.users().settings().sendAs(), u'list', userId=u'me', fields=u'sendAs(sendAsEmail)')
|
||||||
|
sendAsEmails = []
|
||||||
|
for sendAs in result[u'sendAs']:
|
||||||
|
sendAsEmails.append(sendAs[u'sendAsEmail'])
|
||||||
|
for sendAsEmail in sendAsEmails:
|
||||||
|
result = callGAPI(gmail.users().settings().sendAs().smimeInfo(), u'list', sendAsEmail=sendAsEmail, userId=u'me')
|
||||||
|
smimes = result.get(u'smimeInfo', [])
|
||||||
|
for i, _ in enumerate(smimes):
|
||||||
|
smimes[i][u'expiration'] = datetime.datetime.fromtimestamp(int(smimes[i][u'expiration'])/1000).strftime('%Y-%m-%d %H:%M:%S')
|
||||||
|
if csvFormat:
|
||||||
|
for smime in smimes:
|
||||||
|
row = {u'User': user}
|
||||||
|
for item in smime:
|
||||||
|
if item not in titles:
|
||||||
|
titles.append(item)
|
||||||
|
row[item] = smime[item]
|
||||||
|
csvRows.append(row)
|
||||||
|
else:
|
||||||
|
print_json(None, smimes)
|
||||||
|
if csvFormat:
|
||||||
|
writeCSVfile(csvRows, titles, u'S/MIME', todrive)
|
||||||
|
|
||||||
def printShowSendAs(users, csvFormat):
|
def printShowSendAs(users, csvFormat):
|
||||||
if csvFormat:
|
if csvFormat:
|
||||||
todrive = False
|
todrive = False
|
||||||
@ -4666,6 +4792,46 @@ def infoSendAs(users):
|
|||||||
if result:
|
if result:
|
||||||
_showSendAs(result, i, count, formatSig)
|
_showSendAs(result, i, count, formatSig)
|
||||||
|
|
||||||
|
def addSmime(users):
|
||||||
|
sendAsEmail = None
|
||||||
|
smimefile = None
|
||||||
|
body = {u'isDefault': False}
|
||||||
|
i = 5
|
||||||
|
while i < len(sys.argv):
|
||||||
|
myarg = sys.argv[i].lower()
|
||||||
|
if myarg == u'file':
|
||||||
|
smimefile = sys.argv[i+1]
|
||||||
|
i += 2
|
||||||
|
elif myarg == u'password':
|
||||||
|
body[u'encryptedKeyPassword'] = sys.argv[i+1]
|
||||||
|
i += 2
|
||||||
|
elif myarg == u'default':
|
||||||
|
body[u'isDefault'] = True
|
||||||
|
i += 1
|
||||||
|
elif myarg in [u'sendas', u'sendasemail']:
|
||||||
|
sendAsEmail = sys.argv[i+1]
|
||||||
|
i += 2
|
||||||
|
else:
|
||||||
|
print u'ERROR: %s is not a valid argument for smime' % myarg
|
||||||
|
sys.exit(3)
|
||||||
|
if not smimefile:
|
||||||
|
print u'ERROR: you must specify a file to upload'
|
||||||
|
sys.exit(3)
|
||||||
|
smime_data = readFile(smimefile)
|
||||||
|
smime_data = base64.urlsafe_b64encode(smime_data)
|
||||||
|
body[u'pkcs12'] = smime_data
|
||||||
|
i = 0
|
||||||
|
count = len(users)
|
||||||
|
for user in users:
|
||||||
|
i += 1
|
||||||
|
user, gmail = buildGmailGAPIObject(user)
|
||||||
|
if not sendAsEmail:
|
||||||
|
sendAsEmail = user
|
||||||
|
if not gmail:
|
||||||
|
continue
|
||||||
|
result = callGAPI(gmail.users().settings().sendAs().smimeInfo(), u'insert', userId=u'me', sendAsEmail=sendAsEmail, body=body)
|
||||||
|
print u'Added S/MIME certificate for user %s sendas %s issued by %s' % (user, sendAsEmail, result[u'issuerCn'])
|
||||||
|
|
||||||
def doLabel(users, i):
|
def doLabel(users, i):
|
||||||
label = sys.argv[i]
|
label = sys.argv[i]
|
||||||
i += 1
|
i += 1
|
||||||
@ -10318,6 +10484,8 @@ def ProcessGAMCommand(args):
|
|||||||
showDriveFileRevisions(users)
|
showDriveFileRevisions(users)
|
||||||
elif showWhat == u'sendas':
|
elif showWhat == u'sendas':
|
||||||
printShowSendAs(users, False)
|
printShowSendAs(users, False)
|
||||||
|
elif showWhat == u'smime':
|
||||||
|
printShowSmime(users, False)
|
||||||
elif showWhat == u'gmailprofile':
|
elif showWhat == u'gmailprofile':
|
||||||
showGmailProfile(users)
|
showGmailProfile(users)
|
||||||
elif showWhat == u'gplusprofile':
|
elif showWhat == u'gplusprofile':
|
||||||
@ -10369,6 +10537,8 @@ def ProcessGAMCommand(args):
|
|||||||
printShowForwardingAddresses(users, True)
|
printShowForwardingAddresses(users, True)
|
||||||
elif printWhat == u'sendas':
|
elif printWhat == u'sendas':
|
||||||
printShowSendAs(users, True)
|
printShowSendAs(users, True)
|
||||||
|
elif printWhat == u'smime':
|
||||||
|
printShowSmime(users, True)
|
||||||
elif printWhat in [u'token', u'tokens', u'oauth', u'3lo']:
|
elif printWhat in [u'token', u'tokens', u'oauth', u'3lo']:
|
||||||
printShowTokens(5, u'users', users, True)
|
printShowTokens(5, u'users', users, True)
|
||||||
else:
|
else:
|
||||||
@ -10439,6 +10609,8 @@ def ProcessGAMCommand(args):
|
|||||||
deleteForwardingAddresses(users)
|
deleteForwardingAddresses(users)
|
||||||
elif delWhat == u'sendas':
|
elif delWhat == u'sendas':
|
||||||
deleteSendAs(users)
|
deleteSendAs(users)
|
||||||
|
elif delWhat == u'smime':
|
||||||
|
deleteSmime(users)
|
||||||
else:
|
else:
|
||||||
print u'ERROR: %s is not a valid argument for "gam <users> delete"' % delWhat
|
print u'ERROR: %s is not a valid argument for "gam <users> delete"' % delWhat
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
@ -10462,6 +10634,8 @@ def ProcessGAMCommand(args):
|
|||||||
addForwardingAddresses(users)
|
addForwardingAddresses(users)
|
||||||
elif addWhat == u'sendas':
|
elif addWhat == u'sendas':
|
||||||
addUpdateSendAs(users, 5, True)
|
addUpdateSendAs(users, 5, True)
|
||||||
|
elif addWhat == u'smime':
|
||||||
|
addSmime(users)
|
||||||
else:
|
else:
|
||||||
print u'ERROR: %s is not a valid argument for "gam <users> add"' % addWhat
|
print u'ERROR: %s is not a valid argument for "gam <users> add"' % addWhat
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
@ -10489,6 +10663,8 @@ def ProcessGAMCommand(args):
|
|||||||
updateLabels(users)
|
updateLabels(users)
|
||||||
elif updateWhat == u'sendas':
|
elif updateWhat == u'sendas':
|
||||||
addUpdateSendAs(users, 5, False)
|
addUpdateSendAs(users, 5, False)
|
||||||
|
elif updateWhat == u'smime':
|
||||||
|
updateSmime(users)
|
||||||
else:
|
else:
|
||||||
print u'ERROR: %s is not a valid argument for "gam <users> update"' % updateWhat
|
print u'ERROR: %s is not a valid argument for "gam <users> update"' % updateWhat
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
|
Reference in New Issue
Block a user