def get_item(name, paid): if (paid): token = 'paid_item_%s' % name else: token = 'item_%s' % name cacheditem = memcache.get(token) if cacheditem is None: if (paid): itemlookup = FreebieItem.gql("WHERE freebie_name = :1", name).get() else: itemlookup = FreebieItem.gql("WHERE freebie_name = :1 and cost = 0", name).get() if itemlookup is None: #could not find item to look up its deliverer. return an error return None else: item = { "name":name, "version":itemlookup.freebie_version, "giver":itemlookup.freebie_giver, "givers":itemlookup.givers, "designer_key":itemlookup.designer_key, "designer_cut":itemlookup.designer_cut, "baseprice":itemlookup.baseprice } memcache.set(token, yaml.safe_dump(item)) else: #pull the item's details out of the yaml'd dict item = yaml.safe_load(cacheditem) return item
def get_item(name, paid): if (paid): token = 'paid_item_%s' % name else: token = 'item_%s' % name cacheditem = memcache.get(token) if cacheditem is None: if (paid): itemlookup = FreebieItem.gql("WHERE freebie_name = :1", name).get() else: itemlookup = FreebieItem.gql( "WHERE freebie_name = :1 and cost = 0", name).get() if itemlookup is None: #could not find item to look up its deliverer. return an error return None else: item = { "name": name, "version": itemlookup.freebie_version, "giver": itemlookup.freebie_giver, "givers": itemlookup.givers, "designer_key": itemlookup.designer_key, "designer_cut": itemlookup.designer_cut, "baseprice": itemlookup.baseprice } memcache.set(token, yaml.safe_dump(item)) else: #pull the item's details out of the yaml'd dict item = yaml.safe_load(cacheditem) return item
def get(self): message = '''<h1>List of Freebie items</h1> <p>This lists all item currently in the distribution system as of %s.</p> <table class="sortable" border=\"1\">''' % datetime.datetime.utcnow().isoformat(' ') message += '<tr><th>Row</th><th>Owner</th><th>Giver ID</th><th>Name</th><th>Version</th><th>Update Date</th><th>Distributor Location</th><th>Texture Key</th><th>Texture Server</th><th>Texture Updatetime</th></tr><br />\n' query = FreebieItem.gql("") content =[] for record in query: owner = record.freebie_owner if (owner == None): owner = '***Not assigned***' if (record.freebie_texture_update == None): i = -1 else: i = record.freebie_texture_update content += ['<td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%d</td>\n' % (owner, record.freebie_giver, record.freebie_name, record.freebie_version, record.freebie_timedate, record.freebie_location, record.freebie_texture_key, record.freebie_texture_serverkey, i)] content = sorted(content) for i in range(0,len(content)): message += '<tr><td>%d</td>%s' % (i+1, content[i]) message += "</table>" self.response.out.write((head % 'Freebie Items List') + message + end)
def post(self): if lindenip.inrange(os.environ["REMOTE_ADDR"]) != "Production": self.error(403) elif self.request.headers["X-SecondLife-Shard"] != "Production": logging.warning("Attempt while on beta grid %s" % (self.request.headers["X-SecondLife-Shard"])) self.response.set_status(305) elif not self.request.headers["X-SecondLife-Owner-Key"] in model.adminkeys: self.error(403) else: done_str = self.request.get("done") serverkey = self.request.headers["X-SecondLife-Object-Key"] logging.info("Finalizing texture update from texture server %s" % (serverkey)) if not done_str: logging.info("Done not confirmed, something is seriously wrong") self.error(402) else: starttime = int(done_str) t = int(time.time()) ts = "%d" % t logging.info("Cleaning all textures for server %s with timestamp below %d" % (serverkey, starttime)) query = FreebieItem.gql("WHERE freebie_texture_serverkey = :1", serverkey) for record in query: if record.freebie_texture_update < starttime: logging.info("Cleaned info for %s" % record.freebie_name) record.freebie_texture_serverkey = "" record.freebie_texture_update = -1 record.freebie_texture_key = "" record.put() logging.info("Version info stored: %s" % ts) model.GenericStorage_Store("TextureTime", ts) self.response.out.write("Version updated: %s" % ts)
def get(self): message = '''<h1>List of Freebie items</h1> <p>This lists all item currently in the distribution system as of %s.</p> <table class="sortable" border=\"1\">''' % datetime.datetime.utcnow( ).isoformat(' ') message += '<tr><th>Row</th><th>Owner</th><th>Giver ID</th><th>Name</th><th>Version</th><th>Update Date</th><th>Distributor Location</th><th>Texture Key</th><th>Texture Server</th><th>Texture Updatetime</th></tr><br />\n' query = FreebieItem.gql("") content = [] for record in query: owner = record.freebie_owner if (owner == None): owner = '***Not assigned***' if (record.freebie_texture_update == None): i = -1 else: i = record.freebie_texture_update content += [ '<td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%d</td>\n' % (owner, record.freebie_giver, record.freebie_name, record.freebie_version, record.freebie_timedate, record.freebie_location, record.freebie_texture_key, record.freebie_texture_serverkey, i) ] content = sorted(content) for i in range(0, len(content)): message += '<tr><td>%d</td>%s' % (i + 1, content[i]) message += "</table>" self.response.out.write((head % 'Freebie Items List') + message + end)
def post(self): if lindenip.inrange(os.environ['REMOTE_ADDR']) != 'Production': self.error(403) elif self.request.headers['X-SecondLife-Shard'] != 'Production': logging.warning("Attempt while on beta grid %s" % (self.request.headers['X-SecondLife-Shard'])) self.response.set_status(305) elif not self.request.headers['X-SecondLife-Owner-Key'] in model.adminkeys: self.error(403) else: done_str = self.request.get('done') serverkey= self.request.headers['X-SecondLife-Object-Key'] logging.info('Finalizing texture update from texture server %s' % (serverkey)) if not done_str: logging.info ('Done not confirmed, something is seriously wrong') self.error(402) else: starttime=int(done_str) t=int(time.time()) ts="%d" % t logging.info ('Cleaning all textures for server %s with timestamp below %d' % (serverkey, starttime)) query = FreebieItem.gql("WHERE freebie_texture_serverkey = :1", serverkey) for record in query: if record.freebie_texture_update < starttime: logging.info ('Cleaned info for %s' % record.freebie_name) record.freebie_texture_serverkey = '' record.freebie_texture_update = -1 record.freebie_texture_key = '' record.put() logging.info ('Version info stored: %s' % ts) model.GenericStorage_Store('TextureTime', ts) self.response.out.write('Version updated: %s' % ts)
def get(self): if lindenip.inrange(os.environ['REMOTE_ADDR']) != 'Production': self.error(403) elif self.request.headers['X-SecondLife-Shard'] != 'Production': logging.warning("Attempt while on beta grid %s" % (self.request.headers['X-SecondLife-Shard'])) self.response.set_status(305) elif not distributors.Contributor_authorized( self.request.headers['X-SecondLife-Owner-Key']): logging.warning( "Illegal attempt to check for item from %s, box %s located in %s at %s" % (self.request.headers['X-SecondLife-Owner-Name'], self.request.headers['X-SecondLife-Object-Name'], self.request.headers['X-SecondLife-Region'], self.request.headers['X-SecondLife-Local-Position'])) self.error(403) else: # get the deliveries where giverkey = key provided (this way we can # still have multiple givers) giverkey = self.request.headers['X-SecondLife-Object-Key'] givername = self.request.headers['X-SecondLife-Object-Name'] # true or false. if true, then remove items from db on returning them pop = cgi.escape(self.request.get('pop')) avname = self.request.headers['X-SecondLife-Owner-Name'] logging.info('%s (%s) from %s checked' % (givername, giverkey, avname)) # to enable/disable the update routine fast, only need to update old records if (False): timestring = datetime.datetime.utcnow() location = '%s @ %s' % ( self.request.headers['X-SecondLife-Region'], self.request.headers['X-SecondLife-Local-Position']) query = FreebieItem.gql("WHERE freebie_giver = :1", giverkey) for record in query: record.freebie_owner = avname record.freebie_timedate = timestring record.freebie_location = location record.put() logging.info('Updated %s from %s' % (record.freebie_name, avname)) #deliveries = FreebieDelivery.gql("WHERE giverkey = :1", giverkey) token = "deliveries_%s" % giverkey deliveries = memcache.get(token) if deliveries is not None: response = "" #take the list of lists and format it #write each out in form <objname>|receiverkey, one per line out = '\n'.join(['|'.join(x) for x in deliveries]) self.response.out.write(out) logging.info('%s got delivery string\n%s' % (givername, out)) memcache.delete(token) else: self.response.out.write('')
def get(self): logging.info('CRON UpdateCount') query = FreebieItem.all().fetch(1000) for record in query: count_token = 'item_count_%s' % record.freebie_name count = memcache.get(count_token) if count is not None: if int(count) > 1: db.run_in_transaction(UpdateRecord, record.key(), count_token) logging.info('CRON: Count info for %s updated with %s new requests' % (record.freebie_name, count)) logging.info('CRON UpdateCount: Finished')
def get(self): logging.info('CRON UpdateCount') query = FreebieItem.all().fetch(1000) for record in query: count_token = 'item_count_%s' % record.freebie_name count = memcache.get(count_token) if count is not None: if int(count) > 1: db.run_in_transaction(UpdateRecord, record.key(), count_token) logging.info( 'CRON: Count info for %s updated with %s new requests' % (record.freebie_name, count)) logging.info('CRON UpdateCount: Finished')
def post(self): if lindenip.inrange(os.environ['REMOTE_ADDR']) != 'Production': self.error(403) elif self.request.headers['X-SecondLife-Shard'] != 'Production': logging.warning("Attempt while on beta grid %s" % (self.request.headers['X-SecondLife-Shard'])) self.response.set_status(305) elif not self.request.headers['X-SecondLife-Owner-Key'] in model.adminkeys: self.error(403) else: self.response.headers['Content-Type'] = 'text/plain' name = self.request.headers['X-SecondLife-Owner-Name'] serverkey =self.request.headers['X-SecondLife-Object-Key'] logging.info('Receiving price info from texture server %s' % (serverkey)) lines = self.request.body.split('\n') for line in lines: params = {} if line != "": item = line.split('~')[0] t=int(time.time()) ts="%d" % t record = FreebieItem.gql('WHERE freebie_name = :1', item).get() if record is None: logging.info("Item %s not in freebielist, skipping price info %s" % (item ,line)) else: numParms = line.count('~') if numParms > 0: baseprice = line.split('~')[1] record.baseprice = int(baseprice) if numParms > 2: designer = line.split('~')[2] designer_cut = line.split('~')[3] record.designer_key = designer record.designer_cut = int(designer_cut) record.freebie_texture_update= t record.put() logging.info("Price updated for %s with %s form server %s at %d" % (item,line,serverkey,t)) token = 'item_%s' % record.freebie_name token2 = 'paid_item_%s' % record.freebie_name memcache.delete(token) memcache.set(token2, yaml.safe_dump({"name":record.freebie_name, "version":record.freebie_version, "giver":record.freebie_giver, "givers":record.givers, "designer_key":record.designer_key, "designer_cut":record.designer_cut, "baseprice":record.baseprice})) else: logging.info("No info for item %s skipping" % (item)) # model.GenericStorage_Store('TextureTime', ts) self.response.out.write('saved')
def get(self): if lindenip.inrange(os.environ['REMOTE_ADDR']) != 'Production': self.error(403) elif self.request.headers['X-SecondLife-Shard'] != 'Production': logging.warning("Attempt while on beta grid %s" % (self.request.headers['X-SecondLife-Shard'])) self.response.set_status(305) elif not distributors.Contributor_authorized(self.request.headers['X-SecondLife-Owner-Key']): logging.warning("Illegal attempt to check for item from %s, box %s located in %s at %s" % (self.request.headers['X-SecondLife-Owner-Name'], self.request.headers['X-SecondLife-Object-Name'], self.request.headers['X-SecondLife-Region'], self.request.headers['X-SecondLife-Local-Position'])) self.error(403) else: # get the deliveries where giverkey = key provided (this way we can # still have multiple givers) giverkey = self.request.headers['X-SecondLife-Object-Key'] givername = self.request.headers['X-SecondLife-Object-Name'] # true or false. if true, then remove items from db on returning them pop = cgi.escape(self.request.get('pop')) avname = self.request.headers['X-SecondLife-Owner-Name'] logging.info('%s (%s) from %s checked' % (givername, giverkey, avname)) # to enable/disable the update routine fast, only need to update old records if (False): timestring = datetime.datetime.utcnow() location = '%s @ %s' % (self.request.headers['X-SecondLife-Region'], self.request.headers['X-SecondLife-Local-Position']) query = FreebieItem.gql("WHERE freebie_giver = :1", giverkey) for record in query: record.freebie_owner = avname record.freebie_timedate = timestring record.freebie_location = location record.put() logging.info('Updated %s from %s' % (record.freebie_name, avname)) #deliveries = FreebieDelivery.gql("WHERE giverkey = :1", giverkey) token = "deliveries_%s" % giverkey deliveries = memcache.get(token) if deliveries is not None: response = "" #take the list of lists and format it #write each out in form <objname>|receiverkey, one per line out = '\n'.join(['|'.join(x) for x in deliveries]) self.response.out.write(out) logging.info('%s got delivery string\n%s' % (givername, out)) memcache.delete(token) else: self.response.out.write('')
def post(self): if lindenip.inrange(os.environ["REMOTE_ADDR"]) != "Production": self.error(403) elif self.request.headers["X-SecondLife-Shard"] != "Production": logging.warning("Attempt while on beta grid %s" % (self.request.headers["X-SecondLife-Shard"])) self.response.set_status(305) elif not self.request.headers["X-SecondLife-Owner-Key"] in model.adminkeys: self.error(403) else: self.response.headers["Content-Type"] = "text/plain" name = self.request.headers["X-SecondLife-Owner-Name"] serverkey = self.request.headers["X-SecondLife-Object-Key"] logging.info("Receiving textures from texture server %s" % (serverkey)) lines = unicode(self.request.body).split("\n") for line in lines: params = {} if line != "": params["item"] = line.split("=")[0] params["texture"] = line.split("=")[1] item = params["item"].split("~")[0] texture = params["texture"] if params["item"].find("~") != -1: tags = params["item"].split("~", 1)[1].split("~") else: tags = list() t = int(time.time()) ts = "%d" % t record = FreebieItem.gql("WHERE freebie_name = :1", item).get() if record is None: logging.info("Item %s not in freebielist, skipping texture %s" % (item, texture)) else: record.freebie_texture_key = texture record.freebie_texture_serverkey = serverkey record.freebie_texture_update = t record.tags = tags record.put() logging.info( "Texture updated for %s with %s form server %s at %d" % (item, texture, serverkey, t) ) # model.GenericStorage_Store('TextureTime', ts) self.response.out.write("saved")
def post(self): if lindenip.inrange(os.environ['REMOTE_ADDR']) != 'Production': self.error(403) elif self.request.headers['X-SecondLife-Shard'] != 'Production': logging.warning("Attempt while on beta grid %s" % (self.request.headers['X-SecondLife-Shard'])) self.response.set_status(305) elif not self.request.headers['X-SecondLife-Owner-Key'] in model.adminkeys: self.error(403) else: self.response.headers['Content-Type'] = 'text/plain' name = self.request.headers['X-SecondLife-Owner-Name'] serverkey = self.request.headers['X-SecondLife-Object-Key'] logging.info('Receiving textures from texture server %s' % (serverkey)) lines = unicode(self.request.body).split('\n') for line in lines: params = {} if line != "": params['item'] = line.split('=')[0] params['texture'] = line.split('=')[1] item = params['item'].split('~')[0] texture = params['texture'] if params['item'].find('~')!= -1: tags = params['item'].split('~',1)[1].split('~') else: tags = list() t=int(time.time()) ts="%d" % t record = FreebieItem.gql('WHERE freebie_name = :1', item).get() if record is None: logging.info("Item %s not in freebielist, skipping texture %s" % (item ,texture)) else: record.freebie_texture_key = texture record.freebie_texture_serverkey = serverkey record.freebie_texture_update= t record.tags = tags record.put() logging.info("Texture updated for %s with %s form server %s at %d" % (item,texture,serverkey,t)) # model.GenericStorage_Store('TextureTime', ts) self.response.out.write('saved')
def remove_item_url(name, deliver): item = FreebieItem.gql("WHERE freebie_name = :1", name).get() if item is None: #could not find item to look up its deliverer. return an error logging.info("Removing %s deliver from %s but item is not found." % (deliver, name)) #return None else: logging.info("Removing %s deliver from %s" % (deliver, name)) item.givers.remove(deliver) item.put() token = 'item_%s' % name token2 = 'paid_item_%s' % name data = yaml.safe_dump({ "name":name, "version":item.freebie_version, "giver":item.freebie_giver, "givers":item.givers, "designer_key":item.designer_key, "designer_cut":item.designer_cut, "baseprice":item.baseprice }) if item.baseprice == 0: memcache.set(token, data) memcache.set(token2, data)
def remove_item_url(name, deliver): item = FreebieItem.gql("WHERE freebie_name = :1", name).get() if item is None: #could not find item to look up its deliverer. return an error logging.info("Removing %s deliver from %s but item is not found." % (deliver, name)) #return None else: logging.info("Removing %s deliver from %s" % (deliver, name)) item.givers.remove(deliver) item.put() token = 'item_%s' % name token2 = 'paid_item_%s' % name data = yaml.safe_dump({ "name": name, "version": item.freebie_version, "giver": item.freebie_giver, "givers": item.givers, "designer_key": item.designer_key, "designer_cut": item.designer_cut, "baseprice": item.baseprice }) if item.baseprice == 0: memcache.set(token, data) memcache.set(token2, data)
def post(self): if lindenip.inrange(os.environ["REMOTE_ADDR"]) != "Production": self.error(403) elif self.request.headers["X-SecondLife-Shard"] != "Production": logging.warning("Attempt while on beta grid %s" % (self.request.headers["X-SecondLife-Shard"])) self.response.set_status(305) elif not self.request.headers["X-SecondLife-Owner-Key"] in model.adminkeys: self.error(403) else: self.response.headers["Content-Type"] = "text/plain" name = self.request.headers["X-SecondLife-Owner-Name"] serverkey = self.request.headers["X-SecondLife-Object-Key"] logging.info("Receiving price info from texture server %s" % (serverkey)) lines = self.request.body.split("\n") for line in lines: params = {} if line != "": item = line.split("~")[0] t = int(time.time()) ts = "%d" % t record = FreebieItem.gql("WHERE freebie_name = :1", item).get() if record is None: logging.info("Item %s not in freebielist, skipping price info %s" % (item, line)) else: numParms = line.count("~") if numParms > 0: baseprice = line.split("~")[1] record.baseprice = int(baseprice) if numParms > 2: designer = line.split("~")[2] designer_cut = line.split("~")[3] record.designer_key = designer record.designer_cut = int(designer_cut) record.freebie_texture_update = t record.put() logging.info( "Price updated for %s with %s form server %s at %d" % (item, line, serverkey, t) ) token = "item_%s" % record.freebie_name token2 = "paid_item_%s" % record.freebie_name memcache.delete(token) memcache.set( token2, yaml.safe_dump( { "name": record.freebie_name, "version": record.freebie_version, "giver": record.freebie_giver, "givers": record.givers, "designer_key": record.designer_key, "designer_cut": record.designer_cut, "baseprice": record.baseprice, } ), ) else: logging.info("No info for item %s skipping" % (item)) # model.GenericStorage_Store('TextureTime', ts) self.response.out.write("saved")
def post(self): if lindenip.inrange(os.environ['REMOTE_ADDR']) != 'Production': self.error(403) elif self.request.headers['X-SecondLife-Shard'] != 'Production': logging.warning("Attempt while on beta grid %s" % (self.request.headers['X-SecondLife-Shard'])) self.response.set_status(305) else: av=self.request.headers['X-SecondLife-Owner-Key'] # if not distributors.Distributor_authorized(av): #Really needs to be changed??? function needs to be changed to distributors.authorized_designer as soon as the database for that is fully functioning # self.error(402) # else: objectkey=self.request.headers['X-SecondLife-Object-Key'] sim_id = self.request.headers['X-SecondLife-Region'] logging.info('Gift Texture request from %s in sim %s' % (objectkey, sim_id)) body = self.request.body # Use a query parameter to keep track of the last key of the last # batch, to know where to start the next batch. last_key_str = self.request.get('start') last_version_str = self.request.get('last_version') last_version = int(last_version_str) current_version = int(model.GenericStorage_GetOrPutDefault('TextureTime', '0')) if current_version < 0: # system updating at the moment logging.info ('System in update mode, inform the client') self.response.out.write('Updating') else: # normal work mode, lets do check and send texture result ='' if not last_version_str: # no last time given so we can use the stored time last_version_str = '0' last_version = 0 logging.info ('no last_version, send update') else: last_version = int(last_version_str) logging.info ('last_version (%s)' % last_version_str) if current_version == last_version: logging.info ('Versions are identic, no action needed') self.response.out.write('CURRENT') else: logging.info ('Versions different (DB:%s,Vendor:%s) Starting to send update...' % (current_version, last_version_str)) if not last_key_str: last_key = 0 result ='version\n%s\n' % current_version logging.info ('no last_key, send from start') else: last_key=int(last_key_str) result ='continue\n%s\n' % current_version logging.info ('last_key was: %s' % last_key_str) query = FreebieItem.all() query.filter('freebie_texture_update >', 0) entities = query.fetch(21,last_key) count = 0 more = False for texture in entities: count = count + 1 if count < 21: logging.info('%s:%d' % (texture.freebie_name,texture.freebie_texture_update)) result=result + texture.freebie_name +"\n"+texture.freebie_texture_key+"\n" result=result + "%s\n" % texture.baseprice else: last_key=last_key+20 result=result + ("startwith\n%d" % (last_key)) more = True logging.info ('More texture availabe, request next time from %d' % (last_key)) if more == False: logging.info ('Sending finished now') result = result + "end\n" self.response.out.write(result)
def post(self): if lindenip.inrange(os.environ["REMOTE_ADDR"]) != "Production": self.error(403) elif self.request.headers["X-SecondLife-Shard"] != "Production": logging.warning("Attempt while on beta grid %s" % (self.request.headers["X-SecondLife-Shard"])) self.response.set_status(305) else: av = self.request.headers["X-SecondLife-Owner-Key"] # if not distributors.Distributor_authorized(av): #Really needs to be changed??? function needs to be changed to distributors.authorized_designer as soon as the database for that is fully functioning # self.error(402) # else: objectkey = self.request.headers["X-SecondLife-Object-Key"] sim_id = self.request.headers["X-SecondLife-Region"] logging.info("Gift Texture request from %s in sim %s" % (objectkey, sim_id)) body = self.request.body # Use a query parameter to keep track of the last key of the last # batch, to know where to start the next batch. last_key_str = self.request.get("start") last_version_str = self.request.get("last_version") last_version = int(last_version_str) current_version = int(model.GenericStorage_GetOrPutDefault("TextureTime", "0")) if current_version < 0: # system updating at the moment logging.info("System in update mode, inform the client") self.response.out.write("Updating") else: # normal work mode, lets do check and send texture result = "" if not last_version_str: # no last time given so we can use the stored time last_version_str = "0" last_version = 0 logging.info("no last_version, send update") else: last_version = int(last_version_str) logging.info("last_version (%s)" % last_version_str) if current_version == last_version: logging.info("Versions are identic, no action needed") self.response.out.write("CURRENT") else: logging.info( "Versions different (DB:%s,Vendor:%s) Starting to send update..." % (current_version, last_version_str) ) if not last_key_str: last_key = 0 result = "version\n%s\n" % current_version logging.info("no last_key, send from start") else: last_key = int(last_key_str) result = "continue\n%s\n" % current_version logging.info("last_key was: %s" % last_key_str) query = FreebieItem.all() query.filter("freebie_texture_update >", 0) entities = query.fetch(21, last_key) count = 0 more = False for texture in entities: count = count + 1 if count < 21: logging.info("%s:%d" % (texture.freebie_name, texture.freebie_texture_update)) result = result + texture.freebie_name + "\n" + texture.freebie_texture_key + "\n" result = result + "%s\n" % texture.baseprice else: last_key = last_key + 20 result = result + ("startwith\n%d" % (last_key)) more = True logging.info("More texture availabe, request next time from %d" % (last_key)) if more == False: logging.info("Sending finished now") result = result + "end\n" self.response.out.write(result)
def get(self): if lindenip.inrange(os.environ['REMOTE_ADDR']) != 'Production': self.error(403) elif self.request.headers['X-SecondLife-Shard'] != 'Production': logging.warning("Attempt while on beta grid %s" % (self.request.headers['X-SecondLife-Shard'])) self.response.set_status(305) elif not distributors.Contributor_authorized( self.request.headers['X-SecondLife-Owner-Key']): logging.warning( "Illegal attempt to update item from %s, box %s located in %s at %s" % (self.request.headers['X-SecondLife-Owner-Name'], self.request.headers['X-SecondLife-Object-Name'], self.request.headers['X-SecondLife-Region'], self.request.headers['X-SecondLife-Local-Position'])) self.error(403) else: self.response.headers['Content-Type'] = 'text/plain' name = cgi.escape(self.request.get('object')) version = cgi.escape(self.request.get('version')) giverkey = self.request.headers['X-SecondLife-Object-Key'] avname = self.request.headers['X-SecondLife-Owner-Name'] location = '%s @ %s' % ( self.request.headers['X-SecondLife-Region'], self.request.headers['X-SecondLife-Local-Position']) timestring = datetime.datetime.utcnow() url = cgi.escape(self.request.get('url', default_value='None')) if url == 'None': giverurl = [] else: giverurl = [unicode(giverkey)] deliv_box = Deliver.get_or_insert("Deliv:%s" % giverkey, timedate=0, url='None') update_dist = False if url != deliv_box.url: update_dist = True elif timestring - deliv_box.timedate > datetime.timedelta( 0, 60): update_dist = True if update_dist: deliv_box.url = url deliv_box.timedate = timestring deliv_box.owner = avname deliv_box.location = location deliv_box.put() # If no version provided, set a default version = version or 'NOVERSION' #look for an existing item with that name items = FreebieItem.gql("WHERE freebie_name = :1", name) item = items.get() if (item == None): newitem = FreebieItem(freebie_name=name, freebie_version=version, freebie_giver=giverkey, givers=giverurl, freebie_owner=avname, freebie_timedate=timestring, freebie_location=location) newitem.put() item = newitem # Version check removed because 3.7x and onwards does not include # version numbers in object names. So this means that it's # possible to downgrade and switch to delivering an older version. -Nan # TODO: Instead of having items identified only by name and # version, allow them to be identified by name and UUID. This will # allow us to have unversioned items that are still delivered by # multiple dist boxes, because we can tell if a box is out of sync # by the item's UUID. else: item.givers = [] logging.info("Clearing box list for item %s" % name) # will be 'NOVERSION' for 3.7x collars item.freebie_version = version item.freebie_giver = giverkey if giverurl != []: if giverkey in item.givers: #item.givers[item.givers.index(giverkey)+1] = url logging.info("Box in list") else: item.givers[:0] = giverurl logging.info("Adding box") elif giverkey in item.givers: index = item.givers.index(giverkey) item.givers[index:index] = [] logging.warning("Removing box") item.freebie_owner = avname item.freebie_timedate = timestring item.freebie_location = location item.put() #update item in memcache token = 'item_%s' % name token2 = 'paid_item_%s' % name data = yaml.safe_dump({ "name": name, "version": item.freebie_version, "giver": item.freebie_giver, "givers": item.givers, "designer_key": item.designer_key, "designer_cut": item.designer_cut, "baseprice": item.baseprice }) if item.baseprice == 0: memcache.set(token, data) memcache.set(token2, data) self.response.out.write('saved') logging.info('saved item %s version %s by %s with urls %s' % (name, item.freebie_version, avname, item.givers))
def get(self): if lindenip.inrange(os.environ['REMOTE_ADDR']) != 'Production': self.error(403) elif self.request.headers['X-SecondLife-Shard'] != 'Production': logging.warning("Attempt while on beta grid %s" % (self.request.headers['X-SecondLife-Shard'])) self.response.set_status(305) elif not distributors.Contributor_authorized(self.request.headers['X-SecondLife-Owner-Key']): logging.warning("Illegal attempt to update item from %s, box %s located in %s at %s" % (self.request.headers['X-SecondLife-Owner-Name'], self.request.headers['X-SecondLife-Object-Name'], self.request.headers['X-SecondLife-Region'], self.request.headers['X-SecondLife-Local-Position'])) self.error(403) else: self.response.headers['Content-Type'] = 'text/plain' name = cgi.escape(self.request.get('object')) version = cgi.escape(self.request.get('version')) giverkey = self.request.headers['X-SecondLife-Object-Key'] avname = self.request.headers['X-SecondLife-Owner-Name'] location = '%s @ %s' % (self.request.headers['X-SecondLife-Region'], self.request.headers['X-SecondLife-Local-Position']) timestring = datetime.datetime.utcnow() url = cgi.escape(self.request.get('url', default_value='None')) if url == 'None': giverurl = [] else: giverurl = [unicode(giverkey)] deliv_box = Deliver.get_or_insert("Deliv:%s" % giverkey, timedate=0, url='None') update_dist = False if url != deliv_box.url: update_dist = True elif timestring - deliv_box.timedate > datetime.timedelta(0, 60): update_dist = True if update_dist: deliv_box.url = url deliv_box.timedate = timestring deliv_box.owner = avname deliv_box.location = location deliv_box.put() # If no version provided, set a default version = version or 'NOVERSION' #look for an existing item with that name items = FreebieItem.gql("WHERE freebie_name = :1", name) item = items.get() if (item == None): newitem = FreebieItem(freebie_name = name, freebie_version = version, freebie_giver = giverkey, givers = giverurl, freebie_owner = avname, freebie_timedate = timestring, freebie_location = location) newitem.put() item = newitem # Version check removed because 3.7x and onwards does not include # version numbers in object names. So this means that it's # possible to downgrade and switch to delivering an older version. -Nan # TODO: Instead of having items identified only by name and # version, allow them to be identified by name and UUID. This will # allow us to have unversioned items that are still delivered by # multiple dist boxes, because we can tell if a box is out of sync # by the item's UUID. else: item.givers = [] logging.info("Clearing box list for item %s" % name) # will be 'NOVERSION' for 3.7x collars item.freebie_version = version item.freebie_giver = giverkey if giverurl != []: if giverkey in item.givers: #item.givers[item.givers.index(giverkey)+1] = url logging.info("Box in list") else: item.givers[:0] = giverurl logging.info("Adding box") elif giverkey in item.givers: index = item.givers.index(giverkey) item.givers[index:index] = [] logging.warning("Removing box") item.freebie_owner = avname item.freebie_timedate = timestring item.freebie_location = location item.put() #update item in memcache token = 'item_%s' % name token2 = 'paid_item_%s' % name data = yaml.safe_dump({ "name":name, "version":item.freebie_version, "giver":item.freebie_giver, "givers":item.givers, "designer_key":item.designer_key, "designer_cut":item.designer_cut, "baseprice":item.baseprice }) if item.baseprice == 0: memcache.set(token, data) memcache.set(token2, data) self.response.out.write('saved') logging.info('saved item %s version %s by %s with urls %s' % (name, item.freebie_version, avname, item.givers))