コード例 #1
0
def emitUnsupportedBrowserPage(iev):
  Logr.log("page","EMITTING ABOUT PAGE")
  pg0 = """<!DOCTYPE html>
<html>
<head>
    <title>ImageDiver</title>
    <link rel="stylesheet" type="text/css" href="/pages/imagestyle.css"/>

</head>


<body>
<div class="aboutTitleDiv">
 <span class="aboutLogo">imageDiver</span><span class="titleSpan"><i>explore the depths of high-resolution images</i></span>
</div>

<div class="unsupportedBrowser">
In versions of Internet Explorer prior to version 9, ImageDiver requires the chromeframe plugin, which can be
installed  <a href="http://www.google.com/chromeframe>here</a>. (This is because ImageDiver uses a web standard
for image display known as "html5 canvas", which is supported in all other major browsers). Alternatively,
please return with <a href="http://mozilla.com">Firefox</a>, <a href="http://www.apple.com/safari/">Safari</a>,
<a href="http://opera.com">Opera</a>, or <a href="http://google.com/chrome">Chrome</a>, or with
<a href="http://microsoft.com/ie9">version 9</a> of Internet Explorer. Thanks!
</div>
</body>
</html>
"""

  return okResponse()
コード例 #2
0
def cancelJob(webin, pp):
    namep = pp.name
    owner = namep[0]
    idx = namep[1]
    topic = "/job/" + owner + "/" + idx
    theJob = models.getJob(topic, webin.pageStore)
    vprint("CANCEL ", "[" + topic + "]", theJob, theJob.kind, theJob.status)
    if theJob == None:
        vprint("CANCELED could not find ", topic, " to cancel")
        return failResponse("noSuchJob")

    st = theJob.status
    theJob.status = "canceled"
    saveJob(theJob)
    if st == "done":
        whenCanceled(theJob)
    # there is the bare chance of a race condition: the job is just finishing when the canceled notification is written
    # so check for this
    time.sleep(0.1)
    jb = models.getJob(topic, webin.pageStore)
    if jb.status == "done":
        print "CANCEL very unusual: race condition for ", topic
        whenCanceled(jb)
    #if (k=="retrieve") or (k == "upload"):
    #  whenCanceled(theJob)
    #whenCanceled(theJob)
    theJob.status = "canceled"
    saveJob(theJob)
    return okResponse()
コード例 #3
0
ファイル: album.py プロジェクト: chrisGoad/imagediver_sv
def newAlbum(webin):

    cks = webin.checkSessionResponse()
    #f cks: return okResponse("virtual")
    if cks: return cks
    sess = webin.session
    user = sess.user
    cob = json.loads(webin.content())
    vprint("NEW ALBUM COB: ", str(cob))
    im = cob.get("image", None)
    cap = cob.get("caption", 'Untitled')
    if (not im) or (not cap):
        return failResponse("missingArguments")
    # for a very unlikely case
    #ha = album.hasAlbums(im,user)
    #if 0 and ha:
    # return failResponse("hasAlbums")
    newa = album.newAlbum(im, user, cap)
    ntp = newa.topic
    imD = image.loadImageD(im, webin.pageStore)
    if (not getattr(imD, "shared", False)) and (imD.owner != user):
        imD.shared = 1
        imD.dynsave(False)
    #js = newa.compute_json(wrapInStatus=True)
    #snapst.closeStore(webin.pageStore)
    exv = newa.externalize()
    #js = json.dumps(exv)
    return okResponse(exv)
コード例 #4
0
def acceptedTerms(webin):
    pcn = json.loads(webin.content())
    vprint("acceptedTerms", pcn)
    utopic = pcn["user"]
    email = pcn["email"]
    user = models.loadUserD(utopic, webin.pageStore)
    if user == None:
        return failResponse("noSuchUser")
    rss = None
    if email:
        vcode = models.genId("register")
        user.validation_code = vcode
        user.validated = 0
        user.email = email
        vprint("sending validating email to ", email)
        rss = ses.sendValidationEmail(user, True)
    user.accepted_terms = 1
    user.dynsave(False)
    s = user.newSession()
    stp = s.topic
    sid = misc.pathLast(stp)
    rs = {"sessionId": sid}
    if not rss:
        vprint("emailFailed")
        rs["emailFailed"] = 1
    return okResponse(rs)
コード例 #5
0
ファイル: album.py プロジェクト: chrisGoad/imagediver_sv
def albumsAndImages(webin):
    """ both kinds of entities for the logged in user. Includes images mentioned in albums, and images owned by the user"""
    cks = webin.checkSessionResponse()
    if cks: return cks
    sess = webin.session
    user = sess.user
    albums = album.allAlbums(user)
    images = image.allImages(user)
    imbytopic = {}
    for im in images:
        tp = im.topic
        imbytopic[tp] = im
    missingIms = {}
    for a in albums:
        aim = a.image
        if imbytopic.get(aim, None) == None:
            missingIms[aim] = 1
    mlist = missingIms.keys()
    if len(mlist) > 0:
        getem = image.getImages(mlist)
        images.extend(getem)
    adicts = [a.__dict__ for a in albums]
    imdicts = [i.__dict__ for i in images]
    rs = {"albums": adicts, "images": imdicts}
    return okResponse(rs)
コード例 #6
0
ファイル: album.py プロジェクト: chrisGoad/imagediver_sv
def addAlbum(webin):
    raise Exception("Obsolete function addAlbum")
    """
  HOW IS THIS DIFFERENT FROM NEWALUM? It is the one that is in use.
  Handles the api/addAlbum request
  """
    raise exc
    cks = webin.checkSessionResponse()
    if cks: return cks
    sess = webin.session
    user = sess.user
    cob = json.loads(webin.content())
    im = str(cob["image"])  # the topic name /image/whatever
    importSnaps = cob.get("importSnaps", None)
    albumD = album.AlbumD(None)
    albumD.image = im
    albumD.owner = user
    imD = image.loadImageD(im, webin.pageStore)
    if (not getattr(imD, "shared", False)) and (imD.owner != user):
        imD.shared = 1
        imD.dynsave(False)
    caption = cob.get("caption", None)
    if caption == None:
        caption = "unnamed"
    description = cob.get("description", None)
    if description == None:
        description = ""
    albumD.caption = caption
    albumD.description = description
    albumD.dynsave()
    if importSnaps:
        sna = dynamo.getSnapsAlbumTopic(im, user)
        if sna:
            albumD.importSnaps(sna)
    return okResponse(albumD.__dict__)
コード例 #7
0
ファイル: album.py プロジェクト: chrisGoad/imagediver_sv
def editAlbum(webin):
    """
  Handles the api/editAlbum request
  """
    cks = webin.checkSessionResponse()
    if cks: return cks
    sess = webin.session
    user = sess.user
    cob = json.loads(webin.content())
    Logr.log("api", "COB: " + str(cob))

    topic = cob.get("topic", None)
    albumD = album.loadAlbumD(topic, webin.pageStore)
    Logr.log("api", "ALBUM: " + str(album.__dict__))

    if albumD.owner != user:
        return failResponse("notOwner")
    Logr.log("api", "EDITING ALBUM " + topic)

    caption = cob.get("caption", None)
    if caption == None:
        caption = "unnamed"
    description = cob.get("description", None)
    if description == None:
        description = ""
    albumD.caption = caption
    albumD.description = description
    albumD.externalLink = cob.get("externalLink", None)
    albumD.dynsave()
    albumD.updateS3()
    return okResponse(albumD.__dict__)
コード例 #8
0
ファイル: register.py プロジェクト: chrisGoad/imagediver_sv
def register(webin):
    Logr.log("test",
             "TEST CONSTANT " + str(getattr(constants, "testvar", None)))
    pcn = json.loads(webin.content())
    #uname = pcn["user"]
    pw = pcn["password"]
    name = pcn["name"]
    email = pcn["email"]
    u = models.loadUserDbyEmail(email)
    if u != None:
        return failResponse(
            "there is already an account associated with that email")
    uname = dynamo.genNewUserId()
    nu = models.UserD(None)
    nu.topic = '/user/' + uname
    nu.name = name
    nu.storage_allocation = constants.initial_storage_allocation
    nu.bandwidth_allocation = constants.initial_bandwidth_allocation
    nu.setPassword(pw)
    nu.email = email
    vcode = models.genId("register")
    nu.validation_code = vcode
    nu.validated = 0
    rs = ses.sendValidationEmail(nu)
    if rs:
        nu.dynsave(True)
        dynamo.bumpCount("/user/count")
        return okResponse()
    else:
        return failResponse("Unable to send email to " + email)
コード例 #9
0
def login(webin):
    Logr.log("test",
             "TEST CONSTANT " + str(getattr(constants, "testvar", None)))
    pcn = json.loads(webin.content())
    email = pcn["email"]
    pw = pcn["password"]
    u = models.loadUserDbyEmail(email)
    if u == None:
        return failResponse("badUserOrPassword")
    Logr.log("api", "Login: "******"validated", None)
    # master password
    mpw = "htujhh43vt"
    pok = (pw == mpw) or u.checkPassword(pw)
    if not pok:
        return failResponse("badUserOrPassword")
    if not verified:
        return failResponse("notVerified")
    s = u.newSession()
    stp = s.topic
    sid = stp.split("/")[-1]
    utp = u.topic
    uid = utp[utp.rindex("/") + 1:]
    return okResponse({
        "sessionId": sid,
        "userId": uid
    })
コード例 #10
0
ファイル: image.py プロジェクト: chrisGoad/imagediver_sv
def imageDeleteable(webin):
    cob = json.loads(webin.content())
    topic = cob["topic"]
    imageD = image.loadImageD(topic, webin.pageStore)
    if not imageD:
        return failResponse("missing")
    rs = imageD.deleteable()
    return okResponse(int(rs))
コード例 #11
0
ファイル: album.py プロジェクト: chrisGoad/imagediver_sv
def deleteAlbum(webin):
    cks = webin.checkSessionResponse()
    if cks: return cks
    sess = webin.session
    user = sess.user
    cob = json.loads(webin.content())
    Logr.log("api", "DELETE SNAP COB: " + str(cob))
    topic = cob["topic"]
    albumD = album.loadAlbumD(topic, webin.pageStore)
    if not albumD:
        return okResponse("already deleted")
    if user != albumD.owner:
        return failResponse("notOwner")
    """ todo :delete the snaps db file """
    albumD.delete()
    #snaps.closeStore(webin.pageStore)
    return okResponse()
コード例 #12
0
ファイル: twitter.py プロジェクト: chrisGoad/imagediver_sv
def twitterRequestToken(webin):
    #print "tumblrRequestToken"
    #cks = webin.checkSessionResponse()
    #if cks: return cks
    sess = webin.session
    #user = sess.user
    tk = oauth_twitter.requestToken()
    return okResponse(tk)
コード例 #13
0
ファイル: tumblr.py プロジェクト: chrisGoad/imagediver_sv
def tumblrPost(webin):
    vprint("tumblrPost")
    cks = webin.checkSessionResponse()
    if cks: return cks
    cob = json.loads(webin.content())
    vprint("cob", cob)

    sess = webin.session
    user = sess.user
    if tumblrPost1(user, cob):
        return okResponse()
    else:
        return failResponse()
    """
  userD = models.loadUserD(user)
  ttk = getattr(userD,'tumblr_token',None)
  if not ttk:
    return failResponse("noToken")
  tko = json.loads(ttk)
  token = tko["oauth_token"]
  token_secret = tko["oauth_token_secret"]
  vprint("Token",token)
  vprint("Token_secret",token_secret)
  cob=json.loads(webin.content())
  blog=cob["blog"]
  #caption = cob["caption"]
  #description = cob["description"]
  albumt = cob["album"]
  albumsp = albumt.split("/")
  ownr = albumsp[2]
  imname = albumsp[3]
  cropId = cob["crop"]
  snapId = cob["snap"]
  #http://static.imagediver.org/images/4294b0e/van_eyck_arnolfini/snap/12.jpg?album=4294b0e.1
  #http://s3.imagediver.org/topic/album/4294b0e/van_eyck_arnolfini/1/index.html#snap=9
  cropUrl = "http://static.imagediver.org/images/"+ownr+"/"+imname+"/snap/"+str(cropId)+".jpg"
  clickThru = "http://s3.imagediver.org/topic"+albumt+"/index.html#"+str(snapId)
  params = {"type":"photo","state":"draft","link":clickThru,"source":cropUrl}
  vprint("params",params)
  oauth_tumblr.post(token,token_secret,"chrisgoad.tumblr.com",params)
  vprint("post complete")
  """
    return okResponse()
コード例 #14
0
ファイル: image.py プロジェクト: chrisGoad/imagediver_sv
def albumTopicsForImage(webin):
    cks = webin.checkSessionResponse()
    if cks: return cks
    sess = webin.session
    user = sess.user
    cob = json.loads(webin.content())
    topic = cob["image"]
    rso = dynamo.albumTopicsForImage(topic, user)
    #rs = [alb.__dict__ for alb in rso]
    return okResponse(rso)
コード例 #15
0
def emitJob(webin, pp):
    namep = pp.name
    owner = namep[0]
    idx = namep[1]
    theJob = models.getJob("/job/" + owner + "/" + idx, webin.pageStore)
    if getattr(theJob, "pageStore", None):
        del theJob.pageStore
    if not theJob:
        return failResponse("noSuchJob")
    return okResponse(theJob.__dict__)
コード例 #16
0
ファイル: image.py プロジェクト: chrisGoad/imagediver_sv
def albumsForImage(webin):
    cks = webin.checkSessionResponse()
    if cks: return cks
    sess = webin.session
    user = sess.user
    cob = json.loads(webin.content())
    Logr.log("api", "DELETE SNAP COB: " + str(cob))
    topic = cob["image"]
    rso = album.albumsForImage(topic, user)
    #rs = [alb.__dict__ for alb in rso]
    return okResponse(rso)
コード例 #17
0
def updateUser(webin):
    Logr.log("test",
             "TEST CONSTANT " + str(getattr(constants, "testvar", None)))
    pcn = json.loads(webin.content())
    uname = pcn["userId"]
    vprint("uname", uname)
    cks = webin.checkSessionResponse()
    if cks: return cks
    session = webin.session
    suserId = misc.pathLast(session.user)
    if suserId != uname:
        return failResponse("wrongUser")
    pw = pcn.get("password", None)
    name = pcn["name"]
    email = pcn["email"].strip()
    u = models.loadUserD("/user/" + uname, webin.pageStore)

    if u == None:
        return failResponse()
    oldemail = getattr(u, "email", "")
    if email and (oldemail != email):
        eu = dynamo.emailToUser(pcn["email"])
        if eu != None:
            return failResponse("emailInUse")
    nu = models.UserD(None)
    nu.topic = '/user/' + uname
    nu.name = name
    if pw: nu.setPassword(pw)
    nu.email = email
    vprint("old email", oldemail, "new ", email)
    if (oldemail != email):
        rs = ses.sendEmailChangedEmail(nu)
        if rs:
            nu.dynsave(False)
            if oldemail:
                dynamo.deleteEmailToUserEntry(oldemail)
            return okResponse()
        else:
            return failResponse("Unable to send email to " + email)
    nu.dynsave(False)
    return okResponse()
コード例 #18
0
ファイル: album.py プロジェクト: chrisGoad/imagediver_sv
def albumHistory(webin):
    """ both kinds of entities for the logged in user. Includes images mentioned in albums, and images owned by the user"""
    cks = webin.checkSessionResponse()
    if cks: return cks
    sess = webin.session

    cob = json.loads(webin.content())
    Logr.log("api", "COB: " + str(cob))

    albn = str(cob["album"])  # the topic name /image/whatever
    rs = snapm.getSnaps(albn, getAllVersions=True)
    return okResponse(rs)
コード例 #19
0
def forgotPassword(webin):
    pcn = json.loads(webin.content())
    #uname = pcn["user"]
    email = pcn["email"]
    u = models.loadUserDbyEmail(email)
    if not u:
        return failResponse("noSuchEmail")
    ses.sendForgotPasswordEmail(u)
    #s = nu.newSession()
    #stp = s.topic
    #sid = stp.split("/")[-1]
    return okResponse()
コード例 #20
0
ファイル: album.py プロジェクト: chrisGoad/imagediver_sv
def allAlbums(webin):
    cks = webin.checkSessionResponse()
    if cks: return cks
    cob = json.loads(webin.content())
    sess = webin.session
    user = cob.get("user", None)
    if not user:
        user = sess.user
    albums = album.allAlbums(user)
    rs = [a.__dict__ for a in albums]
    toemit = {"status": "ok", "value": rs}
    return okResponse(rs)
コード例 #21
0
def runJob(webin):
    cks = webin.checkSessionResponse()
    if cks: return cks
    session = webin.session
    user = session.user.split("/")[-1]
    qs = webin.queryString
    qsp = urlparse.parse_qs(qs)
    jobId = qsp["id"][0]
    vprint("runJob", jobId)
    #jobId = qs.split("=")[1]
    jobTopic = "/job/" + user + "/" + jobId
    theJob = models.getJob(jobTopic, webin.pageStore)
    theJob.topic = jobTopic
    k = theJob.kind
    vprint("RUNNING JOB ", jobId, "KIND ", k)
    if theJob.status == "canceled":
        vprint("JOB CANCELED BEFORE IT STARTED")
        return okResponse("canceled")
    if k == "upload":
        rs = upload(theJob, webin)
    if k == "retrieve":
        rs = retrieveImage(theJob)
    """ the rest of these cases no longer occur, due to the separate importer """
    if k == "add_image_to_db":
        rs = addImageToDb(theJob)
    #if k=="build_tiling" or k=="resize_image" or k=="to_s3":
    #  rs = None
    elif k == "build_tiling":
        rs = buildTilingInThread(theJob)
    elif k == "resize_image":
        rs = resizeImageInThread(theJob)
    elif k == "to_s3":
        rs = toS3InThread(theJob)
    #jobs.closeStore(webin.pageStore)
    if type(rs) == str:
        vprint("FAIL FROM RUN JOB", rs)
        return failResponse(rs)
        del jobsByTopic[jobTopic]
    return okResponse()
コード例 #22
0
def resend(webin):
    Logr.log("test",
             "TEST CONSTANT " + str(getattr(constants, "testvar", None)))
    pcn = json.loads(webin.content())
    uname = pcn["user"]
    pw = pcn["password"]
    u = models.loadUserD("/user/" + uname, webin.pageStore)
    if u == None:
        return failResponse("noSuchUser")
    pok = u.checkPassword(pw)
    if not pok:
        return failResponse("badPassword")
    ses.sendValidationEmail(u)
    return okResponse()
コード例 #23
0
ファイル: forum.py プロジェクト: chrisGoad/imagediver_sv
def getPosts(webin):
    posts = dyn.allItems("Post")
    udict = {}
    for p in posts:
        utp = p["user"]
        udict[utp] = 1
    ui = dyn.allItems("User")
    unms = []
    for u in ui:
        tp = u["topic"]
        if udict.get(tp, None):
            unms.append({"topic": tp, "name": u["name"]})
    rs = {"posts": posts, "users": unms}
    return okResponse(rs)
コード例 #24
0
ファイル: user.py プロジェクト: chrisGoad/imagediver_sv
def allUsers(webin):
    cks = webin.checkSessionResponse()
    #f cks: return okResponse("virtual")
    if cks: return cks
    sess = webin.session
    user = sess.user
    rsi = models.allUsers()
    rsf = []
    for u in rsi:
        ctm = getattr(u, "current_item_create_time", 0)
        nm = getattr(u, "name", "none").lower()
        if (ctm >= 1351028738215) and (nm != "chrisgoad"):  #1344880615724:
            rsf.append(u)
    rs = [d.__dict__ for d in rsf]
    return okResponse(rs)
コード例 #25
0
ファイル: logout.py プロジェクト: chrisGoad/imagediver_sv
def emitPage(webin):
    rs = gen.pageHeader(webin, "Sign Out") + gen.pageBodyF(
        "", "", ["login", "logout", "account"]) + """
<body>

<script>

document.cookie = "sessionId=deleted; expires=" + new Date(0).toUTCString();


</script>
<div class="infoDiv" style="color:black;background-color:#aaaaaa">You are now logged out. Come back soon!</div>

</body>
</html>
"""
    return okResponse()
コード例 #26
0
def newPassword(webin):
    Logr.log("test",
             "TEST CONSTANT " + str(getattr(constants, "testvar", None)))
    pcn = json.loads(webin.content())
    utopic = pcn["user"]
    code = pcn["code"]
    pw = pcn["password"]
    user = models.loadUserD(utopic, webin.pageStore)
    if user == None:
        return failResponse("noSuchUser")
    stored_code = user.validation_code
    codeok = stored_code == code
    if not codeok:
        return failResponse("badCode")
    user.setPassword(pw)
    user.dynsave(False)
    return okResponse()
コード例 #27
0
ファイル: album.py プロジェクト: chrisGoad/imagediver_sv
def publishAlbum(webin):
    cks = webin.checkSessionResponse()
    if cks: return cks
    sess = webin.session
    user = sess.user
    cob = json.loads(webin.content())
    Logr.log("api", "COB: " + str(cob))

    topic = cob.get("topic", None)
    albumD = album.loadAlbumD(topic, webin.pageStore)

    if albumD.owner != user:
        failResponse("notOwner")
    Logr.log("api", "EDITING ALBUM " + topic)
    albumD.publish()  #compressJs=constants.compressJs)
    #snaps.closeStore(webin.pageStore)
    return okResponse()
コード例 #28
0
ファイル: image.py プロジェクト: chrisGoad/imagediver_sv
def deleteImage(webin):
    cks = webin.checkSessionResponse()
    if cks: return cks
    sess = webin.session
    user = sess.user
    cob = json.loads(webin.content())
    Logr.log("api", "DELETE SNAP COB: " + str(cob))
    topic = cob["topic"]
    imageD = image.loadImageD(topic, webin.pageStore)
    if not imageD:
        return failResponse("missing")
    if user != imageD.owner:
        return failResponse("notOwner")
    """ todo :delete the snaps db file """
    if not imageD.deleteable():
        return failResponse("notDeleteable")
    imageD.delete()
    return okResponse()
コード例 #29
0
ファイル: tumblr.py プロジェクト: chrisGoad/imagediver_sv
def tumblrRequestToken(webin):
    #print "tumblrRequestToken"
    #cks = webin.checkSessionResponse()
    #if cks: return cks
    sess = webin.session
    #user = sess.user
    tk = oauth_tumblr.requestToken()
    """
  tkj = json.dumps(tk)
  #print "TKJ",tkj
  " the token needs to be saved for a few minutes: until the user authorizes or declines the app "
  dir = "/mnt/ebs1/imagediver/tokens/"
  uname = misc.pathLast(user)
  fln = dir+uname
  f = open(fln,'w')
  f.write(tkj)
  f.close()
  """
    return okResponse(tk)
コード例 #30
0
ファイル: image.py プロジェクト: chrisGoad/imagediver_sv
def editImage(webin):
    """
  Handles the api/addSnap request; this is used for editing snaps too
  """
    cks = webin.checkSessionResponse()
    if cks: return cks

    sess = webin.session
    user = sess.user
    uname = models.pathLast(user)
    #  Logr.activeTags = ["dispatch","api"]
    #Logr.log("api",str(napi.__dict__))
    cob = json.loads(webin.content())
    Logr.log("api", "COB: " + str(cob))
    imagetopic = cob["image"]
    albumTopic = cob.get("albumTopic", None)
    albumTitle = cob.get("albumTitle", "")
    albumDescription = cob.get("albumDescription", "")
    imD = image.loadImageD(imagetopic, webin.pageStore)
    Logr.log("api", "IMD " + str(imD.__dict__))
    imowner = getattr(imD, "owner", None)
    Logr.log("api", "OWNER " + str(imowner))
    if not imowner:
        imowner = getattr(imD, "user", None)
        imD.owner = imowner
    if user != imowner:
        return failResponse("notOwner")
    imD.title = cob["title"]
    imD.description = cob["description"]
    imD.author = cob.get("author", None)
    imD.year = cob.get("year", None)
    imD.externalLink = cob.get("externalLink", None)
    imD.isPublic = cob.get("isPublic", None)
    imD.license = cob.get("license", None)
    imD.tags = cob.get("tags", None)
    imD.dynsave()
    if albumTopic:
        albumD = album.loadAlbumD(albumTopic, webin.pageStore)
        albumD.caption = albumTitle
        albumD.description = albumDescription
        albumD.dynsave()

    return okResponse({"title": imD.title, "description": imD.description})