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))