import cryptobox.plugins.base
from cryptobox.core.exceptions import *


class volume_chpasswd(cryptobox.plugins.base.CryptoBoxPlugin):

	pluginCapabilities = [ "volume" ]
	pluginVisibility = [ "properties" ]
	requestAuth = False
	rank = 70


	def doAction(self, store=None, old_pw=None, new_pw=None, new_pw2=None):
		self.container = self.cbox.getContainer(self.device)
		if not self.container:
			return None
		elif store == "change_pw":
			return self.__changePassword(old_pw, new_pw, new_pw2)
		elif not store:
			return "volume_chpasswd"
		else:
			self.cbox.log.info("plugin 'volume_chpasswd' - unknown action: %s" % store)
			return "volume_chpasswd"
	

	def getStatus(self):
		return "TODO"
	

	def __changePassword(self, old_pw, new_pw, new_pw2):
		if not old_pw:
			self.hdf["Data.Warning"] = "EmptyPassword"
		elif not new_pw:
			self.hdf["Data.Warning"] = "EmptyNewPassword"
		elif new_pw != new_pw2:
			self.hdf["Data.Warning"] = "DifferentPasswords"
		elif old_pw == new_pw:
			## do nothing
			pass
		else:
			try:
				self.container.changePassword(old_pw, new_pw)
			except CBInvalidType, errMsg:
				self.cbox.log.info("plugin 'volume_chpasswd' - cannot change passphrase for non-encrypted container (%s): %s" % (self.device, errMsg))
			except CBVolumeIsActive:
				self.hdf["Data.Warning"] = "VolumeMayNotBeMounted"
			except CBChangePasswordError, errMsg:
				self.cbox.log.warn("plugin 'volume_chpasswd' - cannot change password for device (%s): %s" % (self.device, errMsg))
				self.hdf["Data.Warning"] = "Plugins.volume_chpasswd.PasswordChange"
			else:
				self.hdf["Data.Success"] = "Plugins.volume_chpasswd.PasswordChange"
		return "volume_chpasswd"

