class AccessManager(object): def __init__(self, face, groupManagerName, dataType, dKeyDatabaseFilePath): # Set up face self.face = face #self.loop = eventLoop # Set up the keyChain. identityStorage = MemoryIdentityStorage() privateKeyStorage = MemoryPrivateKeyStorage() self.keyChain = KeyChain( IdentityManager(identityStorage, privateKeyStorage), NoVerifyPolicyManager()) self.certificateName = self.keyChain.createIdentityAndCertificate( groupManagerName) self.dKeyDatabaseFilePath = dKeyDatabaseFilePath self.manager = GroupManager( groupManagerName, dataType, Sqlite3GroupManagerDb(self.dKeyDatabaseFilePath), 2048, 1, self.keyChain) self.memoryContentCache = MemoryContentCache(self.face) self.memoryContentCache.registerPrefix(groupManagerName, self.onRegisterFailed, self.onDataNotFound) self.needToPublishGroupKeys = False return def onRepoData(self, interest, data): #print "received repo data: " + interest.getName().toUri() return def onRepoTimeout(self, interest): #print "repo command times out: " + interest.getName().getPrefix(-1).toUri() return def addSchedule(self, scheduleName, managerStartDate, managerEndDate, managerStartHour, managerEndHour): schedule = Schedule() interval = RepetitiveInterval(Schedule.fromIsoString(managerStartDate), Schedule.fromIsoString(managerEndDate), managerStartHour, managerEndHour, 1, RepetitiveInterval.RepeatUnit.DAY) schedule.addWhiteInterval(interval) self.manager.addSchedule(scheduleName, schedule) def onMemberCertificateData(self, interest, data, accessInterest): print "Member certificate with name retrieved: " + data.getName( ).toUri() + "; member added to group!" self.manager.addMember("schedule1", data) self.needToPublishGroupKeys = True accessResponse = Data(accessInterest.getName()) accessResponse.setContent("granted") self.face.putData(accessResponse) def onMemberCertificateTimeout(self, interest, accessInterest): print "Member certificate interest times out: " + interest.getName( ).toUri() newInterest = Interest(interest) newInterest.refreshNonce() self.face.expressInterest( newInterest, lambda memberInterest, memberData: self.onMemberCertificateData( memberInterest, memberData, accessInterest), lambda memberInterest: self.onMemberCertificateTimeout( memberInterest, accessInterest)) return def publishGroupKeys(self, timeStr): timePoint = Schedule.fromIsoString(timeStr) print timeStr result = self.manager.getGroupKey(timePoint) # The first is group public key, E-key # The rest are group private keys encrypted with each member's public key, D-key for i in range(0, len(result)): self.memoryContentCache.add(result[i]) self.initiateContentStoreInsertion( "/ndn/edu/ucla/remap/ndnfit/repo", result[i]) print "Publish key name: " + str( i) + " " + result[i].getName().toUri() print "key content: " + str(result[i].getContent().toBytes()) self.needToPublishGroupKeys = False def onDataNotFound(self, prefix, interest, face, interestFilterId, filter): print "Data not found for interest: " + interest.getName().toUri() if interest.getExclude(): print "Interest has exclude: " + interest.getExclude().toUri() return def onRegisterFailed(self, prefix): print "Prefix registration failed" return def initiateContentStoreInsertion(self, repoCommandPrefix, data): fetchName = data.getName() parameter = repo_command_parameter_pb2.RepoCommandParameterMessage() # Add the Name. for i in range(fetchName.size()): parameter.repo_command_parameter.name.component.append( fetchName[i].getValue().toBytes()) # Create the command interest. interest = Interest( Name(repoCommandPrefix).append("insert").append( Name.Component(ProtobufTlv.encode(parameter)))) self.face.makeCommandInterest(interest) self.face.expressInterest(interest, self.onRepoData, self.onRepoTimeout)
class TestGroupManager(object): def __init__(self, face, groupManagerName, dataType, readAccessName, dKeyDatabaseFilePath): # Set up face self.face = face #self.loop = eventLoop # Set up the keyChain. identityStorage = MemoryIdentityStorage() privateKeyStorage = MemoryPrivateKeyStorage() self.keyChain = KeyChain( IdentityManager(identityStorage, privateKeyStorage), NoVerifyPolicyManager()) self.certificateName = self.keyChain.createIdentityAndCertificate( groupManagerName) self.face.setCommandSigningInfo(self.keyChain, self.certificateName) self.dKeyDatabaseFilePath = dKeyDatabaseFilePath try: os.remove(self.dKeyDatabaseFilePath) except OSError: # no such file pass self.manager = GroupManager( groupManagerName, dataType, Sqlite3GroupManagerDb(self.dKeyDatabaseFilePath), 2048, 1, self.keyChain) self.memoryContentCache = MemoryContentCache(self.face) self.memoryContentCache.registerPrefix( Name(groupManagerName).append("READ"), self.onRegisterFailed, self.onDataNotFound) self.face.registerPrefix(readAccessName, self.onAccessInterest, self.onAccessTimeout) self.updateGroupKeys = False return def onAccessInterest(self, prefix, interest, face, interestFilterId, filter): print "On Access request interest: " + interest.getName().toUri() certInterest = Interest(interest.getName().getSubName(4)) certInterest.setName(certInterest.getName().getPrefix(-1)) certInterest.setInterestLifetimeMilliseconds(2000) self.face.expressInterest( certInterest, lambda memberInterest, memberData: self.onMemberCertificateData( memberInterest, memberData, interest), lambda memberInterest: self.onMemberCertificateTimeout( memberInterest, interest)) print "Retrieving member certificate: " + certInterest.getName().toUri( ) return def onAccessTimeout(self, prefix): print "Prefix registration failed: " + prefix.toUri() return def onRepoData(self, interest, data): #print "received repo data: " + interest.getName().toUri() return def onRepoTimeout(self, interest): #print "repo command times out: " + interest.getName().getPrefix(-1).toUri() return def setManager(self): schedule1 = Schedule() interval11 = RepetitiveInterval( Schedule.fromIsoString("20161001T000000"), Schedule.fromIsoString("20161031T000000"), 0, 24, 1, RepetitiveInterval.RepeatUnit.DAY) schedule1.addWhiteInterval(interval11) self.manager.addSchedule("schedule1", schedule1) def onMemberCertificateData(self, interest, data, accessInterest): print "Member certificate with name retrieved: " + data.getName( ).toUri() + "; member added to group!" self.manager.addMember("schedule1", data) self.updateGroupKeys = True accessResponse = Data(accessInterest.getName()) accessResponse.setContent("granted") self.face.putData(accessResponse) def onMemberCertificateTimeout(self, interest, accessInterest): print "Member certificate interest times out: " + interest.getName( ).toUri() newInterest = Interest(interest) newInterest.refreshNonce() self.face.expressInterest( newInterest, lambda memberInterest, memberData: self.onMemberCertificateData( memberInterest, memberData, accessInterest), lambda memberInterest: self.onMemberCertificateTimeout( memberInterest, accessInterest)) return def publishGroupKeys(self): timePoint1 = Schedule.fromIsoString("20161024T083000") result = self.manager.getGroupKey(timePoint1) # The first is group public key, E-key # The rest are group private keys encrypted with each member's public key, D-key for i in range(0, len(result)): self.memoryContentCache.add(result[i]) self.initiateContentStoreInsertion( "/ndn/edu/ucla/remap/ndnfit/repo", result[i]) print "Publish key name: " + str( i) + " " + result[i].getName().toUri() self.updateGroupKeys = False def onDataNotFound(self, prefix, interest, face, interestFilterId, filter): print "Data not found for interest: " + interest.getName().toUri() if interest.getExclude(): print "Interest has exclude: " + interest.getExclude().toUri() return def onRegisterFailed(self, prefix): print "Prefix registration failed" return def initiateContentStoreInsertion(self, repoCommandPrefix, data): fetchName = data.getName() parameter = repo_command_parameter_pb2.RepoCommandParameterMessage() # Add the Name. for i in range(fetchName.size()): parameter.repo_command_parameter.name.component.append( fetchName[i].getValue().toBytes()) # Create the command interest. interest = Interest( Name(repoCommandPrefix).append("insert").append( Name.Component(ProtobufTlv.encode(parameter)))) self.face.makeCommandInterest(interest) self.face.expressInterest(interest, self.onRepoData, self.onRepoTimeout)