From ae6a9b4ca3082ec69ec79b92c859dafa51db23d1 Mon Sep 17 00:00:00 2001 From: lxnay Date: Mon, 21 Jul 2008 18:37:49 +0000 Subject: [PATCH] Entropy/DistributionUGCCommands: - add more commands (read write ones) git-svn-id: http://svn.sabayonlinux.org/projects/entropy/trunk@2283 cd1c1023-2f26-0410-ae45-c471fc1f0318 --- libraries/entropy.py | 163 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 159 insertions(+), 4 deletions(-) diff --git a/libraries/entropy.py b/libraries/entropy.py index 30c148e04..a73656481 100644 --- a/libraries/entropy.py +++ b/libraries/entropy.py @@ -16744,6 +16744,17 @@ class DistributionUGCInterface(RemoteDbSkelInterface): down_data[d_dict['key']] = downloads return down_data + def get_iddoc_userid(self, iddoc): + if not self.is_iddoc_available(iddoc): + return None + self.execute_query('SELECT `userid` FROM entropy_docs WHERE `iddoc` = %s', (iddoc,)) + data = self.fetchone() + if not data: + return None + elif not data.has_key('userid'): + return None + return data['userid'] + def handle_pkgkey(self, key): if not self.is_pkgkey_available(key): return self.insert_pkgkey(key, do_commit = True) @@ -17156,11 +17167,141 @@ class DistributionUGCCommands(SocketCommandsSkel): 'syntax': " ugc:do_vote app-foo/foo <0..5>", 'from': str(self), # from what class }, + 'ugc:do_download': { + 'auth': False, + 'built_in': False, + 'cb': self.docmd_do_download, + 'args': ["myargs"], + 'as_user': False, + 'desc': "inform the system of a downloaded application", + 'syntax': " ugc:do_download app-foo/foo", + 'from': str(self), # from what class + }, + 'ugc:add_comment': { + 'auth': True, + 'built_in': False, + 'cb': self.docmd_add_comment, + 'args': ["authenticator","myargs"], + 'as_user': False, + 'desc': "insert a comment related to a package key", + 'syntax': " ugc:add_comment app-foo/foo ", + 'from': str(self), # from what class + }, + 'ugc:remove_comment': { + 'auth': True, + 'built_in': False, + 'cb': self.docmd_remove_comment, + 'args': ["authenticator","myargs"], + 'as_user': False, + 'desc': "remove a comment related to a package key (you need its iddoc and mod/admin privs)", + 'syntax': " ugc:remove_comment ", + 'from': str(self), # from what class + }, + 'ugc:edit_comment': { + 'auth': True, + 'built_in': False, + 'cb': self.docmd_edit_comment, + 'args': ["authenticator","myargs"], + 'as_user': False, + 'desc': "edit a comment related to a package key (you need its iddoc, mod/admin privs or being the author)", + 'syntax': " ugc:edit_comment ", + 'from': str(self), # from what class + }, } def _load_ugc_interface(self): return DistributionUGCInterface(self.connection_data, self.store_path) + def _get_userid(self, authenticator): + session_data = self.HostInterface.sessions.get(authenticator.session) + if not session_data: + return False + elif not session_data.has_key('auth_uid'): + return False + return session_data['auth_uid'] + + def docmd_add_comment(self, authenticator, myargs): + + if len(myargs) < 2: + return None,'wrong arguments' + pkgkey = myargs[0] + comment = ' '.join(myargs[1:]) + + userid = self._get_userid(authenticator) + if userid == None: + return False,'no session userid available' + elif isinstance(userid,bool) and not userid: + return False,'no session data available' + + ugc = self._load_ugc_interface() + status, iddoc = ugc.insert_comment(pkgkey, userid, comment) + if not status: + return False,'unable to add comment' + return iddoc,'ok' + + def docmd_remove_comment(self, authenticator, myargs): + + if not myargs: + return None,'wrong arguments' + try: + iddoc = int(myargs[0]) + except (ValueError,): + return False,'not a valid iddoc' + + userid = self._get_userid(authenticator) + if userid == None: + return False,'no session userid available' + elif isinstance(userid,bool) and not userid: + return False,'no session data available' + + ugc = self._load_ugc_interface() + iddoc_userid = ugc.get_iddoc_userid(iddoc) + if iddoc_userid == None: + return False,'document not available' + + # check if admin/mod or author + if authenticator.is_user() and (userid != iddoc_userid): + return False,'permission denied' + + ugc = self._load_ugc_interface() + status, iddoc = ugc.remove_comment(iddoc) + if not status: + return False,'document not removed or not available' + + return iddoc,'ok' + + def docmd_edit_comment(self, authenticator, myargs): + + if len(myargs) < 2: + return None,'wrong arguments' + try: + iddoc = int(myargs[0]) + except (ValueError,): + return False,'not a valid iddoc' + + new_comment = ' '.join(myargs[1:]) + + userid = self._get_userid(authenticator) + if userid == None: + return False,'no session userid available' + elif isinstance(userid,bool) and not userid: + return False,'no session data available' + + ugc = self._load_ugc_interface() + iddoc_userid = ugc.get_iddoc_userid(iddoc) + if iddoc_userid == None: + return False,'document not available' + + # check if admin/mod or author + if authenticator.is_user() and (userid != iddoc_userid): + return False,'permission denied' + + status, iddoc = ugc.edit_comment(iddoc, new_comment) + if not status: + return False,'document not removed or not available' + + return iddoc,'ok' + def docmd_do_vote(self, authenticator, myargs): if len(myargs) < 2: @@ -17168,18 +17309,30 @@ class DistributionUGCCommands(SocketCommandsSkel): pkgkey = myargs[0] vote = myargs[1] - session_data = self.HostInterface.sessions.get(authenticator.session) - if not session_data: - return False,'no session data available' - userid = session_data['auth_uid'] + userid = self._get_userid(authenticator) if userid == None: return False,'no session userid available' + elif isinstance(userid,bool) and not userid: + return userid,'no session data available' + ugc = self._load_ugc_interface() voted = ugc.do_vote(pkgkey, userid, vote) if not voted: return voted,'already voted' return voted,'ok' + def docmd_do_download(self, myargs): + + if not myargs: + return None,'wrong arguments' + pkgkey = myargs[0] + + ugc = self._load_ugc_interface() + done = ugc.do_download(pkgkey) + if not done: + return done,'download not stored' + return done,'ok' + def _get_generic_doctypes(self, pkgkey, doctypes): ugc = self._load_ugc_interface() metadata = ugc.get_ugc_metadata_doctypes(pkgkey, doctypes) @@ -17522,6 +17675,8 @@ class phpBB3AuthInterface(DistributionAuthInterface,RemoteDbSkelInterface): return False elif self.is_administrator(): return False + elif self.is_developer(): + return False self.cursor.execute('SELECT user_type,user_id FROM '+self.TABLE_PREFIX+'users WHERE user_id = %s', (self.login_data['user_id'],)) data = self.cursor.fetchone()