diff options
Diffstat (limited to 'pyload/manager/AccountManager.py')
-rw-r--r-- | pyload/manager/AccountManager.py | 100 |
1 files changed, 58 insertions, 42 deletions
diff --git a/pyload/manager/AccountManager.py b/pyload/manager/AccountManager.py index ec092d740..3de656376 100644 --- a/pyload/manager/AccountManager.py +++ b/pyload/manager/AccountManager.py @@ -14,7 +14,7 @@ ACC_VERSION = 1 class AccountManager: """manages all accounts""" - #-------------------------------------------------------------------------- + #---------------------------------------------------------------------- def __init__(self, core): """Constructor""" @@ -24,6 +24,7 @@ class AccountManager: self.initPlugins() self.saveAccounts() # save to add categories to conf + def initPlugins(self): self.accounts = {} # key = ( plugin ) self.plugins = {} @@ -31,19 +32,25 @@ class AccountManager: self.initAccountPlugins() self.loadAccounts() + def getAccountPlugin(self, plugin): """get account instance for plugin or None if anonymous""" - if plugin in self.accounts: - if plugin not in self.plugins: - try: - self.plugins[plugin] = self.core.pluginManager.loadClass("account", plugin)(self, self.accounts[plugin]) - except TypeError: # The account class no longer exists (blacklisted plugin). Skipping the account to avoid crash - return None - - return self.plugins[plugin] - else: + try: + if plugin in self.accounts: + if plugin not in self.plugins: + klass = self.core.pluginManager.loadClass("accounts", plugin) + if klass: + self.plugins[plugin] = klass(self, self.accounts[plugin]) + else: #@NOTE: The account class no longer exists (blacklisted plugin). Skipping the account to avoid crash + raise + + return self.plugins[plugin] + else: + raise + except: return None + def getAccountPlugins(self): """ get all account instances""" @@ -53,26 +60,26 @@ class AccountManager: return plugins - #-------------------------------------------------------------------------- + + #---------------------------------------------------------------------- def loadAccounts(self): """loads all accounts available""" - if not exists("accounts.conf"): - f = open("accounts.conf", "wb") - f.write("version: " + str(ACC_VERSION)) - f.close() - - f = open("accounts.conf", "rb") - content = f.readlines() - version = content[0].split(":")[1].strip() if content else "" - f.close() - - if not version or int(version) < ACC_VERSION: - copy("accounts.conf", "accounts.backup") - f = open("accounts.conf", "wb") - f.write("version: " + str(ACC_VERSION)) - f.close() - self.core.log.warning(_("Account settings deleted, due to new config format.")) + try: + with open("accounts.conf", "a+") as f: + content = f.readlines() + version = content[0].split(":")[1].strip() if content else "" + + if not version or int(version) < ACC_VERSION: + copy("accounts.conf", "accounts.backup") + f.seek(0) + f.write("version: " + str(ACC_VERSION)) + + self.core.log.warning(_("Account settings deleted, due to new config format")) + return + + except IOError, e: + self.logError(e) return plugin = "" @@ -100,32 +107,38 @@ class AccountManager: name, sep, pw = line.partition(":") self.accounts[plugin][name] = {"password": pw, "options": {}, "valid": True} - #-------------------------------------------------------------------------- + + #---------------------------------------------------------------------- def saveAccounts(self): """save all account information""" - f = open("accounts.conf", "wb") - f.write("version: " + str(ACC_VERSION) + "\n") + try: + with open("accounts.conf", "wb") as f: + f.write("version: " + str(ACC_VERSION) + "\n") + + for plugin, accounts in self.accounts.iteritems(): + f.write("\n") + f.write(plugin + ":\n") + + for name,data in accounts.iteritems(): + f.write("\n\t%s:%s\n" % (name,data['password']) ) + if data['options']: + for option, values in data['options'].iteritems(): + f.write("\t@%s %s\n" % (option, " ".join(values))) - for plugin, accounts in self.accounts.iteritems(): - f.write("\n") - f.write(plugin+":\n") + chmod(f.name, 0600) - for name,data in accounts.iteritems(): - f.write("\n\t%s:%s\n" % (name,data['password']) ) - if data['options']: - for option, values in data['options'].iteritems(): - f.write("\t@%s %s\n" % (option, " ".join(values))) + except Exception, e: + self.logError(e) - f.close() - chmod(f.name, 0600) - #-------------------------------------------------------------------------- + #---------------------------------------------------------------------- def initAccountPlugins(self): """init names""" for name in self.core.pluginManager.getAccountPlugins(): self.accounts[name] = {} + @lock def updateAccount(self, plugin , user, password=None, options={}): """add or update account""" @@ -137,6 +150,7 @@ class AccountManager: self.saveAccounts() if updated: p.scheduleRefresh(user, force=False) + @lock def removeAccount(self, plugin, user): """remove account""" @@ -147,6 +161,7 @@ class AccountManager: self.saveAccounts() + @lock def getAccountInfos(self, force=True, refresh=False): data = {} @@ -160,7 +175,7 @@ class AccountManager: p = self.getAccountPlugin(p) if p: data[p.__name__] = p.getAllAccounts(force) - else: # When an account has been skipped, p is None + else: #@NOTE: When an account has been skipped, p is None data[p] = [] else: data[p] = [] @@ -168,6 +183,7 @@ class AccountManager: self.core.pullManager.addEvent(e) return data + def sendChange(self): e = AccountUpdateEvent() self.core.pullManager.addEvent(e) |