def delete_context(self, context_gus): """ This DELETE operation, its permanent, and remove all the reference a Context has within the system (Tip, File, submission...) """ store = self.getStore() # Get context description, just to verify that context_gus is valid context_iface = Context(store) context_desc = context_iface.get_single(context_gus) # Collect tip by context and iter on the list receivertip_iface = ReceiverTip(store) tips_related_blocks = receivertip_iface.get_tips_by_context(context_gus) internaltip_iface = InternalTip(store) whistlebtip_iface = WhistleblowerTip(store) file_iface = File(store) comment_iface = Comment(store) # For every InternalTip, delete comment, wTip, rTip and Files for tip_block in tips_related_blocks: internaltip_id = tip_block.get('internaltip')['internaltip_id'] whistlebtip_iface.delete_access_by_itip(internaltip_id) receivertip_iface.massive_delete(internaltip_id) comment_iface.delete_comment_by_itip(internaltip_id) file_iface.delete_file_by_itip(internaltip_id) # and finally, delete the InternalTip internaltip_iface.tip_delete(internaltip_id) # (Just a consistency check - need to be removed) receiver_iface = Receiver(store) receivers_associated = receiver_iface.get_receivers_by_context(context_gus) print "receiver associated by context POV:", len(receivers_associated),\ "receiver associated by context DB-field:", len(context_desc['receivers']) # Align all the receiver associated to the context, that the context cease to exist receiver_iface.align_context_delete(context_desc['receivers'], context_gus) # Get the profile list related to context_gus and delete all of them profile_iface = PluginProfiles(store) profile_list = profile_iface.get_profiles_by_contexts([ context_gus ]) for prof in profile_list: profile_iface.delete_profile(prof['profile_gus']) # Get the submission list under the context, and delete all of them submission_iface = Submission(store) submission_list = submission_iface.get_all() for single_sub in submission_list: submission_iface.submission_delete(single_sub['submission_gus'], wb_request=False) # Finally, delete the context context_iface.delete_context(context_gus) self.returnData(context_desc) self.returnCode(200) return self.prepareRetVals()
def delete(self, context_gus, *uriargs): """ Request: adminContextDesc Response: None Errors: InvalidInputFormat, ContextGusNotFound """ context_iface = Context() receivertip_iface = ReceiverTip() internaltip_iface = InternalTip() whistlebtip_iface = WhistleblowerTip() comment_iface = Comment() receiver_iface = Receiver() file_iface = File() # This DELETE operation, its permanent, and remove all the reference # a Context has within the system (in example: remove associated Tip, # remove try: context_desc = yield context_iface.get_single(context_gus) tips_related_blocks = yield receivertip_iface.get_tips_by_context(context_gus) print "Tip that need to be deleted, associated with the context",\ context_gus, ":", len(tips_related_blocks) for tip_block in tips_related_blocks: internaltip_id = tip_block.get('internaltip')['internaltip_id'] yield whistlebtip_iface.delete_access_by_itip(internaltip_id) yield receivertip_iface.massive_delete(internaltip_id) yield comment_iface.delete_comment_by_itip(internaltip_id) yield file_iface.delete_file_by_itip(internaltip_id) # and finally, delete the InternalTip yield internaltip_iface.tip_delete(internaltip_id) # (Just consistency check) receivers_associated = yield receiver_iface.get_receivers_by_context(context_gus) print "receiver associated by context POV:", len(receivers_associated),\ "receiver associated by context DB-field:", len(context_desc['receivers']) # Align all the receiver associated to the context, that the context cease to exist yield receiver_iface.align_context_delete(context_desc['receivers'], context_gus) # TODO delete stats associated with context ? # TODO delete profile associated with the context # Finally, delete the context yield context_iface.delete_context(context_gus) self.set_status(200) except ContextGusNotFound, e: self.set_status(e.http_status) self.write({'error_message': e.error_message, 'error_code' : e.error_code})
def get_tip_by_wb(self, receipt): requested_t = WhistleblowerTip(self.getStore()) tip_description = requested_t.get_single(receipt) self.returnData(tip_description) self.returnCode(200) return self.prepareRetVals()
def post(self, *uriargs): """ Request: wbSubmissionDesc Response: wbSubmissionDesc Errors: ContextGusNotFound, InvalidInputFormat, SubmissionFailFields This creates an empty submission for the requested context, and returns submissionStatus with empty fields and a Submission Unique String, This is the unique token used during the submission procedure. sessionGUS is used as authentication secret for the next interaction. expire after the time set by Admin (Context dependent setting) """ context_iface = Context() try: request = validateMessage(self.request.body, requests.wbSubmissionDesc) # XXX DUMMY PATCH CLIENT USAGE -- open tiket in GLClient print "Before", request if not request.has_key('wb_fields'): request.update({'wb_fields' : ''}) if not request.has_key('receivers'): request.update({'receivers' : []}) if not request.has_key('files'): request.update({'files' : []}) if not request.has_key('finalize'): request.update({'finalize' : False }) print "After ", request # XXX DUMMY PATCH CLIENT USAGE -- open tiket in GLClient context_desc = yield context_iface.get_single(request['context_gus']) submission_iface = Submission() submission_desc = yield submission_iface.new(request) if not context_desc['selectable_receiver']: submission_iface.receivers = context_iface.receivers if submission_desc['finalize']: internaltip_iface = InternalTip() wb_iface = WhistleblowerTip() internaltip_desc = yield internaltip_iface.new(submission_desc) wbtip_desc = yield wb_iface.new(internaltip_desc) submission_desc.update({'receipt' : wbtip_desc['receipt']}) else: submission_desc.update({'receipt' : ''}) self.set_status(201) # Created # TODO - output processing self.write(submission_desc) except ContextGusNotFound, e: self.set_status(e.http_status) self.write({'error_message': e.error_message, 'error_code' : e.error_code})
def get(self, what, *uriargs): """ Parameters: None Response: Unknown Errors: None /admin/overview GET should return up to all the tables of GLBackend """ from globaleaks.models.externaltip import ReceiverTip, WhistleblowerTip, Comment from globaleaks.models.options import PluginProfiles, ReceiverConfs from globaleaks.models.internaltip import InternalTip from globaleaks.models.receiver import Receiver expected = [ 'itip', 'wtip', 'rtip', 'receivers', 'comment', 'profiles', 'rcfg', 'all' ] if what == 'receivers' or what == 'all': receiver_iface = Receiver() receiver_list = yield receiver_iface.admin_get_all() self.write({ 'elements' : len(receiver_list), 'receivers' : receiver_list}) if what == 'itip' or what == 'all': itip_iface = InternalTip() itip_list = yield itip_iface.admin_get_all() self.write({ 'elements' : len(itip_list), 'internaltips' : itip_list }) if what == 'rtip' or what == 'all': rtip_iface = ReceiverTip() rtip_list = yield rtip_iface.admin_get_all() self.write({ 'elements' : len(rtip_list), 'receivers_tips' : rtip_list }) if what == 'wtip' or what == 'all': wtip_iface = WhistleblowerTip() wtip_list = yield wtip_iface.admin_get_all() self.write({ 'elements' : len(wtip_list), 'whistleblower_tips' : wtip_list }) if what == 'comment' or what == 'all': comment_iface = Comment() comment_list = yield comment_iface.admin_get_all() self.write({ 'elements' : len(comment_list), 'comments' : comment_list }) if what == 'profiles' or what == 'all': profile_iface = PluginProfiles() profile_list = yield profile_iface.admin_get_all() self.write({ 'elements' : len(profile_list), 'profiles' : profile_list }) if what == 'rcfg' or what == 'all': rconf_iface = ReceiverConfs() rconf_list = yield rconf_iface.admin_get_all() self.write({ 'elements' : len(rconf_list), 'settings' : rconf_list }) if not what in expected: self.set_status(405) else: self.set_status(200) self.finish()
def get_comment_list_by_wb(self, receipt): store = self.getStore() requested_t = WhistleblowerTip(store) tip_description = requested_t.get_single(receipt) comment_iface = Comment(store) comment_list = comment_iface.get_comment_by_itip(tip_description['internaltip_id']) self.returnData(comment_list) self.returnCode(200) return self.prepareRetVals()
def new_comment_by_wb(self, receipt, request): store = self.getStore() requested_t = WhistleblowerTip(store) tip_description = requested_t.get_single(receipt) comment_iface = Comment(store) comment_stored = comment_iface.new(tip_description['internaltip_id'], request['content'], u"whistleblower") self.returnData(comment_stored) self.returnCode(201) return self.prepareRetVals()
def put(self, submission_gus, *uriargs): """ Parameter: submission_gus Request: wbSubmissionDesc Response: wbSubmissionDesc Errors: ContextGusNotFound, InvalidInputFormat, SubmissionFailFields, SubmissionGusNotFound, SubmissionConcluded PUT update the submission and finalize if requested. """ context_iface = Context() try: request = validateMessage(self.request.body, requests.wbSubmissionDesc) context_desc = yield context_iface.get_single(request['context_gus']) submission_iface = Submission() submission_desc = yield submission_iface.update(submission_gus, request) if not context_desc['selectable_receiver']: submission_iface.receivers = context_iface.receivers if submission_desc['finalize']: internaltip_iface = InternalTip() wb_iface = WhistleblowerTip() internaltip_desc = yield internaltip_iface.new(submission_desc) wbtip_desc = yield wb_iface.new(internaltip_desc) submission_desc.update({'receipt' : wbtip_desc['receipt']}) else: submission_desc.update({'receipt' : ''}) self.set_status(202) # Updated # TODO - output processing self.write(submission_desc) except ContextGusNotFound, e: self.set_status(e.http_status) self.write({'error_message': e.error_message, 'error_code' : e.error_code})
def get_receiver_list_by_wb(self, receipt): store = self.getStore() requested_t = WhistleblowerTip(store) tip_description = requested_t.get_single(receipt) receiver_iface = Receiver(store) itip_iface = InternalTip(store) # inforet = itip_iface.get_receivers_by_itip(tip_description['internaltip_id']) # the wb, instead get the list of active receiver, is getting the list of receiver # configured in the context: receivers_selected = itip_iface.get_single(tip_description['internaltip_id'])['receivers'] inforet = [] for receiver_gus in receivers_selected: inforet.append(receiver_iface.get_single(receiver_gus)) self.returnData(inforet) self.returnCode(200) return self.prepareRetVals()
def get(self, what, *uriargs): """ Parameters: None Response: Unknown Errors: None /dump/overview GET should return up to all the tables of GLBackend """ expected = [ 'itip', 'wtip', 'rtip', 'receivers', 'comment', 'profiles', 'rcfg', 'file', 'submission', 'contexts', 'plugins', 'all', 'count' ] outputDict = {} if what == 'receivers' or what == 'all' or what == 'count': receiver_iface = Receiver() receiver_list = yield receiver_iface.get_all() if what != 'count': outputDict.update({ 'receivers_elements' : len(receiver_list), 'receivers' : receiver_list}) else: outputDict.update({ 'receivers_elements' : len(receiver_list)}) if what == 'itip' or what == 'all' or what == 'count': itip_iface = InternalTip() itip_list = yield itip_iface.get_all() if what != 'count': outputDict.update({ 'internaltips_elements' : len(itip_list), 'internaltips' : itip_list }) else: outputDict.update({ 'internaltips_elements' : len(itip_list)}) if what == 'rtip' or what == 'all' or what == 'count': rtip_iface = ReceiverTip() rtip_list = yield rtip_iface.get_all() if what != 'count': outputDict.update({ 'rtip_elements' : len(rtip_list), 'receivers_tips' : rtip_list }) else: outputDict.update({ 'rtip_elements' : len(rtip_list)}) if what == 'wtip' or what == 'all' or what == 'count': wtip_iface = WhistleblowerTip() wtip_list = yield wtip_iface.get_all() if what != 'count': outputDict.update({ 'wtip_elements' : len(wtip_list), 'whistleblower_tips' : wtip_list }) else: outputDict.update({ 'wtip_elements' : len(wtip_list)}) if what == 'comment' or what == 'all' or what == 'count': comment_iface = Comment() comment_list = yield comment_iface.get_all() if what != 'count': outputDict.update({ 'comment_elements' : len(comment_list), 'comments' : comment_list }) else: outputDict.update({ 'comment_elements' : len(comment_list)}) if what == 'profiles' or what == 'all' or what == 'count': profile_iface = PluginProfiles() profile_list = yield profile_iface.get_all() if what != 'count': outputDict.update({ 'profiles_elements' : len(profile_list), 'profiles' : profile_list }) else: outputDict.update({ 'profiles_elements' : len(profile_list)}) if what == 'plugins' or what == 'all' or what == 'count': plugin_list = yield PluginManager.get_all() if what != 'count': outputDict.update({ 'plugins_elements' : len(plugin_list), 'plugins' : plugin_list }) else: outputDict.update({ 'plugins_elements' : len(plugin_list) }) if what == 'rcfg' or what == 'all' or what == 'count': rconf_iface = ReceiverConfs() rconf_list = yield rconf_iface.get_all() if what != 'count': outputDict.update({ 'rcfg_elements' : len(rconf_list), 'settings' : rconf_list }) else: outputDict.update({ 'rcfg_elements' : len(rconf_list)}) if what == 'submission' or what == 'all' or what == 'count': submission_iface = Submission() submission_list = yield submission_iface.get_all() if what != 'count': outputDict.update({ 'submission_elements' : len(submission_list), 'submissions' : submission_list }) else: outputDict.update({ 'submission_elements' : len(submission_list)}) if what == 'file' or what == 'all' or what == 'count': file_iface = File() file_list = yield file_iface.get_all() if what != 'count': outputDict.update({ 'file_elements' : len(file_list), 'files' : file_list }) else: outputDict.update({ 'file_elements' : len(file_list)}) if what == 'contexts' or what == 'all' or what == 'count': context_iface = Context() context_list = yield context_iface.get_all() if what != 'count': outputDict.update({ 'contexts_elements' : len(context_list), 'contexts' : context_list }) else: outputDict.update({ 'contexts_elements' : len(context_list)}) if not what in expected: self.set_status(405) else: self.set_status(200) self.write(outputDict) self.finish()
def complete_submission(self, submission_gus): """ need a best-safe receipt feat """ store = self.getStore('complete_submission') try: requested_s = store.find(Submission, Submission.submission_gus==submission_gus).one() except NotOneError: store.close() raise SubmissionGusNotFound if requested_s is None: store.close() raise SubmissionGusNotFound log.debug("Creating internal tip in", requested_s.context_gus, "from", requested_s.submission_gus, "with", requested_s.files) if not requested_s.fields: raise SubmissionFailFields internal_tip = InternalTip() # Initialize all the Storm fields inherit by Submission and Context internal_tip.initialize(requested_s) # here is created the table with receiver selected (an information stored only in the submission) # and the threshold escalation. Is not possible have a both threshold and receiver # selection in this moment (other complications can derived from use them both) for single_r in requested_s.receivers: # this is an hack that need to be fixed short as possible. # receiver_map is an outdated concept if type(single_r) == type({}): receiver_gus = single_r.get('receiver_gus') else: receiver_gus = single_r try: selected_r = store.find(Receiver, Receiver.receiver_gus == unicode(receiver_gus)).one() except NotOneError: store.close() raise ReceiverGusNotFound if not selected_r: store.close() raise ReceiverGusNotFound internal_tip.associate_receiver(selected_r) store.add(internal_tip) log.debug("Created internal tip %s" % internal_tip.context_gus) log.debug("Creating tip for whistleblower") whistleblower_tip = WhistleblowerTip() whistleblower_tip.internaltip_id = internal_tip.id whistleblower_tip.internaltip = internal_tip if not requested_s.receipt: requested_s.receipt = requested_s._receipt_evaluation() statusDict = requested_s._description_dict() # remind: receipt is the UNICODE PRIMARY KEY of WhistleblowerTip whistleblower_tip.receipt = unicode(requested_s.receipt) # TODO whistleblower_tip.authoptions would be filled here store.add(whistleblower_tip) log.debug("Created tip with address %s, Internal Tip and Submission removed" % whistleblower_tip.receipt) # store.remove(requested_s) store.commit() store.close() return statusDict