Changeset 0a49bd7 for fedd/federation/dragon_access.py
- Timestamp:
- Jan 15, 2011 5:52:15 PM (14 years ago)
- Branches:
- axis_example, compt_changes, info-ops, master
- Children:
- aaf7f41
- Parents:
- ac15159 (diff), 944b746 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - git-author:
- Ted Faber <faber@…> (01/15/11 17:51:40)
- git-committer:
- Ted Faber <faber@…> (01/15/11 17:52:15)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
fedd/federation/dragon_access.py
rac15159 r0a49bd7 122 122 else: raise self.parse_error("Repo should be in parens"); 123 123 124 def RequestAccess(self, req, fid): 125 """ 126 Handle the access request. 127 128 Parse out the fields and make the allocations or rejections if for us, 129 otherwise, assuming we're willing to proxy, proxy the request out. 130 """ 131 132 # The dance to get into the request body 133 if req.has_key('RequestAccessRequestBody'): 134 req = req['RequestAccessRequestBody'] 135 else: 136 raise service_error(service_error.req, "No request!?") 137 138 if req.has_key('destinationTestbed'): 139 dt = unpack_id(req['destinationTestbed']) 140 141 # Request for this fedd 142 found, match, owners = self.lookup_access(req, fid) 143 # keep track of what's been added 144 allocID, alloc_cert = generate_fedid(subj="alloc", log=self.log) 145 aid = unicode(allocID) 146 147 self.state_lock.acquire() 148 self.state[aid] = { } 149 self.state[aid]['user'] = found 150 self.state[aid]['owners'] = owners 151 self.write_state() 152 self.state_lock.release() 153 self.auth.set_attribute(fid, allocID) 154 self.auth.set_attribute(allocID, allocID) 155 self.auth.save() 156 157 try: 158 f = open("%s/%s.pem" % (self.certdir, aid), "w") 159 print >>f, alloc_cert 160 f.close() 161 except EnvironmentError, e: 162 raise service_error(service_error.internal, 163 "Can't open %s/%s : %s" % (self.certdir, aid, e)) 164 return { 'allocID': { 'fedid': allocID } } 165 166 def ReleaseAccess(self, req, fid): 167 # The dance to get into the request body 168 if req.has_key('ReleaseAccessRequestBody'): 169 req = req['ReleaseAccessRequestBody'] 170 else: 171 raise service_error(service_error.req, "No request!?") 172 173 try: 174 if req['allocID'].has_key('localname'): 175 auth_attr = aid = req['allocID']['localname'] 176 elif req['allocID'].has_key('fedid'): 177 aid = unicode(req['allocID']['fedid']) 178 auth_attr = req['allocID']['fedid'] 179 else: 180 raise service_error(service_error.req, 181 "Only localnames and fedids are understood") 182 except KeyError: 183 raise service_error(service_error.req, "Badly formed request") 184 185 self.log.debug("[access] deallocation requested for %s", aid) 186 if not self.auth.check_attribute(fid, auth_attr): 187 self.log.debug("[access] deallocation denied for %s", aid) 188 raise service_error(service_error.access, "Access Denied") 189 190 self.state_lock.acquire() 191 if self.state.has_key(aid): 192 self.log.debug("Found allocation for %s" %aid) 193 del self.state[aid] 194 self.write_state() 195 self.state_lock.release() 196 # And remove the access cert 197 cf = "%s/%s.pem" % (self.certdir, aid) 198 self.log.debug("Removing %s" % cf) 199 os.remove(cf) 200 return { 'allocID': req['allocID'] } 201 else: 202 self.state_lock.release() 203 raise service_error(service_error.req, "No such allocation") 124 # RequestAccess and ReleaseAccess come from the base class 204 125 205 126 def extract_parameters(self, top): … … 497 418 return (repo, alloc_log) 498 419 499 def finalize_experiment(self, topo, vlan_no, gri, aid, alloc_id ):420 def finalize_experiment(self, topo, vlan_no, gri, aid, alloc_id, proof): 500 421 """ 501 422 Place the relevant information in the global state block, and prepare … … 521 442 'topdldescription': rtopo.to_dict() 522 443 }, 444 'proof': proof.to_dict(), 523 445 } 524 446 retval = copy.deepcopy(self.state[aid]['started']) … … 541 463 aid = "%s" % auth_attr 542 464 attrs = req.get('fedAttr', []) 543 if not self.auth.check_attribute(fid, auth_attr): 465 access_ok, proof = self.auth.check_attribute(fid, auth_attr, 466 with_proof=True) 467 if not access_ok: 544 468 raise service_error(service_error.access, "Access denied") 545 469 else: … … 587 511 if gri: 588 512 return self.finalize_experiment(topo, vlan_no, gri, aid, 589 req['allocID'] )513 req['allocID'], proof) 590 514 elif err: 591 515 raise service_error(service_error.federant, … … 605 529 self.log.debug("Terminate request for %s" %aid) 606 530 attrs = req.get('fedAttr', []) 607 if not self.auth.check_attribute(fid, auth_attr): 531 access_ok, proof = self.auth.check_attribute(fid, auth_attr, 532 with_proof=True) 533 if not access_ok: 608 534 raise service_error(service_error.access, "Access denied") 609 535 … … 628 554 self.log.debug("Stop segment for GRI: %s" %gri) 629 555 self.stop_segment(user, gri) 630 return { 'allocID': req['allocID'] }556 return { 'allocID': req['allocID'], 'proof': proof.to_dict() }
Note: See TracChangeset
for help on using the changeset viewer.