Advertisement
Guest User

Untitled

a guest
May 22nd, 2016
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 19.68 KB | None | 0 0
  1. # *-* coding:utf-8*-*
  2.  
  3. # Laddar in alla ramverk.
  4. from modules.flask import Flask, render_template, redirect, url_for, request, flash
  5. from modules.flask_mail import Mail, Message
  6. from modules.passlib.hash import sha256_crypt
  7. from modules.functools import wraps
  8. from beaker.middleware import SessionMiddleware
  9. from werkzeug import secure_filename
  10. import os
  11.  
  12. # Egna moduler
  13. from modules.database import *
  14. from modules.functions import *
  15.  
  16.  
  17. # Alternativ för cookies.
  18. session_opts = {
  19.     'session.type': 'file',
  20.     'session.cookie_expires': 3000,
  21.     'session.data_dir': './data',
  22.     'session.auto': True
  23. }
  24.  
  25. # Konfigurerar applikationen (VIKTIGT- SE TILL SÅ ATT SECREY_KEY ÄR RANDOM VID LAUNCH)
  26. app = Flask(__name__)
  27. app.secret_key = "thisisaveryprotectedkeythatabsolutlywontchangelater"
  28. app.config['MAIL_SERVER']='smtp.gmail.com'
  29. app.config['MAIL_PORT'] = 465
  30. app.config['MAIL_USERNAME'] = 'oscara961337@gmail.com'
  31. app.config['MAIL_PASSWORD'] = 'Password123a'
  32. app.config['MAIL_USE_TLS'] = False
  33. app.config['MAIL_USE_SSL'] = True
  34. mail = Mail(app)
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42. # UPPLADDNING AV BILD -------------------------------------------------------------------------------------------------------------------------------
  43.  
  44. ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg', 'gif'])
  45.  
  46. def allowed_file(filename):
  47.     return '.' in filename and \
  48.            filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS
  49.  
  50.  
  51. @app.route('/upload/<mode>', methods=['POST'])
  52. def upload_file(mode):
  53.     user = get_user()
  54.     userID = user["id"]
  55.     userfolder = 'static/uploaded/' + str(userID)
  56.     wallpaperfolder = 'static/uploaded/' + str(userID) + '/wallpaper'
  57.     profilepicturefolder = 'static/uploaded/' + str(userID) + '/profilepicture'
  58.     indexpicturesfolder = 'static/uploaded/startpictures'
  59.     if not os.path.exists(userfolder):
  60.         os.makedirs(userfolder)
  61.         os.makedirs(wallpaperfolder)
  62.         os.makedirs(profilepicturefolder)
  63.     if request.method == 'POST':
  64.         file = request.files['file']
  65.         name, ext = os.path.splitext(file.filename)
  66.         if file and allowed_file(file.filename):
  67.             filename = secure_filename(file.filename)
  68.         else:
  69.             # Bilder har en EJ tillåten fil ändelse
  70.             return "Haha, den filen får du inte ladda upp!"
  71.  
  72.         if mode == "artistpicture":
  73.             # Om användaren laddar upp en bild som ska synas på deras profil
  74.             file.save(os.path.join(userfolder + "/", filename))
  75.             return "Bilden är uppladdad"
  76.  
  77.         elif mode == "profilepicture":
  78.             # Om användaren laddar upp en profilbild
  79.             if os.listdir(profilepicturefolder):
  80.                 filelist = os.listdir(profilepicturefolder)
  81.                 os.remove(os.path.join(profilepicturefolder, filelist[0]))
  82.             file.save(os.path.join(profilepicturefolder, "profilepicture" + ext))
  83.             return "Bilden är uppladdad"
  84.  
  85.         elif mode == "startpicture":
  86.             # Om användaren laddar upp en bild som ska synas på startsidan
  87.             filelist = os.listdir(indexpicturesfolder)
  88.             for file_ in filelist:
  89.                 if file_[:1] == str(userID):
  90.                     os.remove(os.path.join(indexpicturesfolder, file_))
  91.             file.save(os.path.join("static/uploaded/startpictures/", str(userID) + ext))
  92.             return "Bilden är uppladdad"
  93.  
  94.         elif mode == "backgroundpicture":
  95.             # Om användaren laddar upp en backgroundbild till deras profil sida
  96.             if os.listdir(wallpaperfolder):
  97.                 filelist = os.listdir(wallpaperfolder)
  98.                 os.remove(os.path.join(wallpaperfolder, filelist[0]))
  99.             file.save(os.path.join(wallpaperfolder, "wallpaper" + ext))
  100.             return "Bilden är uppladdad"
  101.  
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110. # ---------------------------------------------------------------------------------------------------------------------------------------------------
  111. def get_user():
  112.     """
  113.    Hämtar email & userID från sessionen.
  114.    """
  115.     try:
  116.         user = {}
  117.         session = request.environ.get("beaker.session")
  118.         user["email"] = session["email"]
  119.         user["id"] = session["id"]
  120.         return user
  121.     except:
  122.         return None
  123.  
  124. @app.route('/index.html')
  125. @app.route('/index')
  126. @app.route('/')
  127. def home():
  128.     # Returnerar startsidan
  129.     pictures = os.listdir("static/uploaded/startpictures/")
  130.     links = []
  131.     for picture in pictures:
  132.         links.append("uploaded/startpictures/" + picture)
  133.     print links
  134.     return render_template("index.html", user=get_user(), pictures = links)
  135.  
  136. @app.route('/home')
  137. def popup():
  138.     # Returnerar startsidan fast visar en "toast" med information som skickas med som ett argument i länken
  139.     message = request.args['message']
  140.     return render_template("index.html", user=get_user(), complete = message)
  141.  
  142.  
  143.  
  144. @app.route('/artists')
  145. def artists():
  146.     # Returnerar en sida med en lista på artisterna
  147.     connection = opendatabase()
  148.     cursor = connection.cursor()
  149.     query = ("SELECT name, profileID FROM af5482.profiles WHERE showprofile = 1")
  150.     cursor.execute(query)
  151.     stored = cursor.fetchall()
  152.     cursor.close()
  153.     connection.close()
  154.     return render_template("artists.html", users = stored, user=get_user())
  155.  
  156. @app.route('/artist/<uID>')
  157. def anartist(uID):
  158.     userfolder = 'static/uploaded/' + str(uID)
  159.     wallpaperfolder = 'static/uploaded/' + str(uID) + '/wallpaper'
  160.     profilepicturefolder = 'static/uploaded/' + str(uID) + '/profilepicture'
  161.     indexpicturesfolder = 'static/uploaded/startpictures'
  162.     if not os.path.exists(userfolder):
  163.         os.makedirs(userfolder)
  164.         os.makedirs(wallpaperfolder)
  165.         os.makedirs(profilepicturefolder)
  166.     # Hämtar användare ID från /uID
  167.     connection = opendatabase()
  168.     cursor = connection.cursor()
  169.     query = ("SELECT showprofile FROM af5482.profiles WHERE profileID = '%s'" % (uID))
  170.     cursor.execute(query, (uID))
  171.     stored = cursor.fetchone()
  172.     cursor.close()
  173.     connection.close()
  174.     # Kollar så att användaren inte är "blockerad" av admin
  175.     if stored[0] == 1:
  176.         # Om användaren inte är blockerad hämtas profil informationen
  177.         connection = opendatabase()
  178.         cursor = connection.cursor()
  179.         query = ("SELECT backgroundpicture, profilepicture, name, yrke, abouttext, profileID FROM af5482.profiles WHERE profileID = '%s'" % (uID))
  180.         cursor.execute(query, (uID))
  181.         stored = cursor.fetchone()
  182.         name = stored[2]
  183.         cursor.close()
  184.         connection.close()
  185.  
  186.         # GET ARTISTS PICTURES
  187.  
  188.         # GETS PROFILEPICTURE
  189.         profilepicture = os.listdir("static/uploaded/" + str(uID) + "/profilepicture")
  190.         if profilepicture != []:
  191.             profilepiclink = "uploaded/" + str(uID) + "/profilepicture/" + profilepicture[0]
  192.         else:
  193.             profilepiclink = "bilder/example_profilepic.png"
  194.  
  195.         # GETS WALLPAPER
  196.         wallpaper = os.listdir("static/uploaded/" + str(uID) + "/wallpaper")
  197.         if wallpaper != []:
  198.             wallpaperlink = "uploaded/" + str(uID) + "/wallpaper/" + wallpaper[0]
  199.         else:
  200.             wallpaperlink = "bilder/wallpaper_example.jpg"
  201.  
  202.  
  203.         # GETS ALL THE ARTIST PICTURES TO THEIR PROFILE
  204.         pictures = os.listdir("static/uploaded/" + str(uID) + "/")
  205.         links = []
  206.         for picture in pictures:
  207.             if picture[-4:] == (".jpg" or ".gif" or "jpeg" or ".png"):
  208.                 links.append(uID + "/" + picture)
  209.  
  210.  
  211.  
  212.  
  213.  
  214.  
  215.         # ADDS THE USERID TO THE PICTURE LINK
  216.  
  217.         return render_template("artistprofile.html", user=get_user(), name = name, stored = stored, pictures=links, wallpaper = wallpaperlink, profilepicture = profilepiclink)
  218.     else:
  219.         # Användaren blockerad, skickas till startsidan med ett popup message
  220.         return redirect(url_for("popup", message = "The profile you tried to reach has been blocked."))
  221.  
  222.  
  223.  
  224. @app.route('/about')
  225. def about():
  226.     # Hämtar about informationen och returnerar about sidan.
  227.     connection = opendatabase()
  228.     cursor = connection.cursor()
  229.     query = ("SELECT aboutfrank FROM af5482.about")
  230.     cursor.execute(query)
  231.     stored = cursor.fetchone()
  232.     cursor.close()
  233.     connection.close()
  234.     return render_template("about.html", user=get_user(), about = stored[0])
  235.  
  236. @app.route('/contact')
  237. def contact():
  238.     return render_template("contact.html", user=get_user())
  239.  
  240. @app.route('/events')
  241. def events():
  242.     return render_template("events.html", user=get_user())
  243.  
  244. @app.route('/register')
  245. def reg():
  246.     return render_template("register.html", user=get_user())
  247.  
  248. @app.route("/login")
  249. def login():
  250.     return render_template("login.html")
  251.  
  252. @app.route('/change-password')
  253. def changepassword():
  254.     return render_template("change-password.html", user=get_user())
  255.  
  256. @app.route("/logout")
  257. def logout():
  258.     session = request.environ.get("beaker.session")
  259.     session.delete()
  260.     return redirect(url_for("popup", message = "You've been logged out"))
  261.  
  262. @app.route("/admin")
  263. def admin():
  264.     user = get_user()
  265.     if user == None:
  266.         return redirect(url_for("login"))
  267.     else:
  268.         if user["id"] == 1:
  269.             # Mary / ADMINISTRATOR LÄGET
  270.             connection = opendatabase()
  271.             cursor = connection.cursor()
  272.             query = ("SELECT name, profileID, showprofile FROM af5482.profiles")
  273.             cursor.execute(query)
  274.             stored = cursor.fetchall()
  275.  
  276.             query = ("SELECT aboutfrank FROM af5482.about")
  277.             cursor.execute(query)
  278.             about = cursor.fetchone()
  279.             cursor.close()
  280.             connection.close()
  281.             return render_template("admin.html", user=get_user(), stored = stored, about = about[0])
  282.         else:
  283.             # PROFIL LÄGET DÄR DEM REDIGERAR
  284.             connection = opendatabase()
  285.             cursor = connection.cursor()
  286.             query = ("SELECT abouttext, name, yrke FROM af5482.profiles WHERE profileid = '%s'" % (user["id"]))
  287.             cursor.execute(query, (user["id"]))
  288.             stored = cursor.fetchone()
  289.             cursor.close()
  290.             connection.close()
  291.             if stored == None:
  292.                 # Finns inget profilID, skickas till skapa profil sidan
  293.                 # Visar ett formulär där användaren kan fylla i sina uppgifter
  294.                 return render_template("profilredigering.html", user=get_user(), userexist = False)
  295.             else:
  296.                 # Finns profilID och skickas till redigera sidan
  297.                 # Hämtar informationen från databasen och "prefyller" formuläret med informationen som redan finns
  298.                 return render_template("profilredigering.html",name = stored[1], about = stored[0], yrke = stored[2], user=get_user(), userexist = True)
  299.  
  300.  
  301.  
  302. @app.route('/forgot', methods=["GET", "POST"])
  303. def forgot():
  304.     if request.method == "POST":
  305.         email = request.form["email"]
  306.         connection = opendatabase()
  307.         cursor = connection.cursor()
  308.         query = ("SELECT email FROM af5482.users WHERE email = '%s'" % (email))
  309.         cursor.execute(query, (email))
  310.         stored = cursor.fetchone()
  311.         cursor.close()
  312.         connection.close()
  313.         if stored != None:
  314.             # ANVÄNDAREN FANNS I DATABASEN OCH FÅR ETT NYTT LÖSENORD PÅ SIN EMAIL
  315.             randompassword = generatepassword()
  316.             thepassword = sha256_crypt.encrypt(randompassword)
  317.             email = request.form["email"]
  318.             connection = opendatabase()
  319.             cursor = connection.cursor()
  320.             query = ("UPDATE af5482.users SET pwd = %s WHERE email = %s")
  321.             cursor.execute(query, (thepassword, email))
  322.             connection.commit()
  323.             cursor.close()
  324.             connection.close()
  325.             msg = Message('FrankArt - Your new password', sender = 'FrankArt', recipients = [email])
  326.             msg.body = "Ditt nya lösenord är: " + randompassword
  327.             mail.send(msg)
  328.             return redirect(url_for("popup", message = "Your new password has been sent!"))
  329.         else:
  330.             # EMAILEN FANNS INTE I DATABASEN
  331.             return redirect(url_for("popup", message = "Your new password has been sent!"))
  332.     return render_template("forgot.html", user=get_user())
  333.  
  334.  
  335.  
  336.  
  337.  
  338.  
  339.  
  340. # POST METHODS
  341. # -----------------------------------------------------------------------------------------------------------------------------------------------------------
  342.  
  343. @app.route('/contact-frank', methods=["POST"])
  344. def contactfrank():
  345.     name = request.form["name"]
  346.     email = request.form["email"]
  347.     text = request.form["text"]
  348.     msg = Message('FrankArt - Someone has contacted you', sender = 'FrankArt', recipients = ['oscarandersson1337@gmail.com'])
  349.     msg.html = "<h1>Someone has contacted you from FrankArt!</h1> <h4>Their name: </h4> " + name + " <h4>Their message: </h4><p>" + text + "</p><p> You can reply too them by using this email: " + email
  350.     mail.send(msg)
  351.  
  352. @app.route('/saveaboutfrank', methods=["POST"])
  353. def savefranktext():
  354.     value = 1
  355.     about = request.form["about"]
  356.     connection = opendatabase()
  357.     cursor = connection.cursor()
  358.     query = ("UPDATE af5482.about SET aboutfrank = %s WHERE id = %s")
  359.     cursor.execute(query, (about, value))
  360.     connection.commit()
  361.     cursor.close()
  362.     connection.close()
  363.     return redirect(url_for("admin"))
  364.  
  365.  
  366.  
  367.  
  368. @app.route('/updateshowedprofiles', methods=['POST'])
  369. def updateshowedprofiles():
  370.     values = request.form.getlist('check')
  371.     connection = opendatabase()
  372.     cursor = connection.cursor()
  373.     query = ("UPDATE af5482.profiles SET showprofile = 1")
  374.     cursor.execute(query)
  375.     connection.commit()
  376.     cursor.close()
  377.     connection.close()
  378.     if values == []:
  379.         return redirect(url_for("admin"))
  380.     else:
  381.         for value in values:
  382.             digit = 0
  383.             connection = opendatabase()
  384.             cursor = connection.cursor()
  385.             query = ("UPDATE af5482.profiles SET showprofile = %s WHERE profileID = %s")
  386.             cursor.execute(query, (digit, value))
  387.             connection.commit()
  388.             cursor.close()
  389.             connection.close()
  390.             return redirect(url_for("admin"))
  391.  
  392.  
  393.  
  394. @app.route('/changemypassword', methods=["POST"])
  395. def changethepassword():
  396.     currentpassword = request.form["current-password"]
  397.     newpassword = request.form["new-password"]
  398.     repassword = request.form["re-password"]
  399.     connection = opendatabase()
  400.     cursor = connection.cursor()
  401.     user = get_user()
  402.     userid = user["id"]
  403.     query = ("SELECT pwd FROM af5482.users WHERE userID = '%s'" % (userid))
  404.     cursor.execute(query, (userid))
  405.     stored = cursor.fetchone()
  406.     cursor.close()
  407.     connection.close()
  408.     if sha256_crypt.verify(currentpassword, stored[0]) == True:
  409.         if newpassword == repassword:
  410.             encryptedpassword = sha256_crypt.encrypt(newpassword)
  411.             user = get_user()
  412.             userid = user["id"]
  413.             connection = opendatabase()
  414.             cursor = connection.cursor()
  415.             query = ("UPDATE af5482.users SET pwd = %s WHERE userid = %s")
  416.             cursor.execute(query, (encryptedpassword, userid))
  417.             connection.commit()
  418.             cursor.close()
  419.             connection.close()
  420.             return redirect(url_for("popup", message = "Your password has been changed!"))
  421.         else:
  422.             error = "Your new password doesn't match"
  423.             return render_template("change-password.html", user=get_user(), error = error)
  424.     else:
  425.         error = "Your current password doesn't match!"
  426.         return render_template("change-password.html", user=get_user(), error = error)
  427.  
  428.  
  429. @app.route('/saveedit', methods=["POST"])
  430. def saveedit():
  431.     user = get_user()
  432.     userid = user["id"]
  433.     connection = opendatabase()
  434.     cursor = connection.cursor()
  435.     query = ("SELECT profileID FROM af5482.profiles WHERE profileID = '%s'" % (userid))
  436.     cursor.execute(query, (userid))
  437.     stored = cursor.fetchone()
  438.     cursor.close()
  439.     connection.close()
  440.     name = request.form["name"]
  441.     yrke = request.form["yrke"]
  442.     about = request.form["about"]
  443.     if stored == None:
  444.         connection = opendatabase()
  445.         cursor = connection.cursor()
  446.         showprofile = 1
  447.         cursor.execute("""INSERT INTO af5482.profiles (name, yrke, abouttext, profileid, showprofile) VALUES (%s, %s, %s, %s, %s)""" , (name, yrke, about, user["id"], showprofile))
  448.         connection.commit()
  449.         cursor.close()
  450.         connection.close()
  451.         return redirect(url_for("popup", message = "Your profile has been created!"))
  452.     else:
  453.         connection = opendatabase()
  454.         cursor = connection.cursor()
  455.         query = ("UPDATE af5482.profiles SET name = %s, yrke = %s, abouttext = %s WHERE profileid = %s")
  456.         cursor.execute(query, (name, yrke, about, user["id"]))
  457.         connection.commit()
  458.         cursor.close()
  459.         connection.close()
  460.         return redirect(url_for("popup", message = "Your changes has been saved!"))
  461.  
  462.  
  463. @app.route('/login_user', methods=["POST"])
  464. def login_user():
  465.     connection = opendatabase()
  466.     cursor = connection.cursor()
  467.     email = request.form["email"]
  468.     guesspassword = request.form["password"]
  469.     query = ("SELECT pwd, userID, email FROM af5482.users WHERE email = '%s'" % (email))
  470.     cursor.execute(query, (email))
  471.     stored = cursor.fetchone()
  472.     cursor.close()
  473.     connection.close()
  474.     if stored != None:
  475.         if sha256_crypt.verify(guesspassword, stored[0]) == True:
  476.             session = request.environ.get("beaker.session")
  477.             session["id"] = stored[1]
  478.             session["email"] = stored[2]
  479.             session.save()
  480.             return redirect(url_for("admin"))
  481.         else:
  482.             return render_template("login.html", error= 'Invalid Credentials. Please try again.', user=get_user())
  483.     else:
  484.         return render_template("login.html", error= 'Invalid Credentials. Please try again.', user=get_user())
  485.  
  486. @app.route('/registeruser', methods=["POST"])
  487. def registeruser():
  488.     # Öppnar databasen och väljer databasen logi
  489.     email = request.form["email"]
  490.     connection = opendatabase()
  491.     cursor = connection.cursor()
  492.     query = ("SELECT email FROM af5482.users")
  493.     cursor.execute(query)
  494.     emails = cursor.fetchall()
  495.     error = False
  496.     if error == False:
  497.         for epost in emails:
  498.             if email == epost[0]:
  499.                 error = True
  500.     if error == False:
  501.         # Hashar lösenordet
  502.         password = generatepassword()
  503.         thepassword = sha256_crypt.encrypt(password)
  504.         # Lägger till emailadressen och lösenordet i databasen
  505.         cursor.execute("""
  506.        INSERT INTO af5482.users (email, pwd) VALUES (%s, %s)""" , (email, thepassword))
  507.         connection.commit()
  508.         cursor.close()
  509.         connection.close()
  510.         msg = Message('FrankArt - Registration Email', sender = 'FrankArt', recipients = [email])
  511.         msg.body = "Hello!, You've been registered on FrankArt.se. Your credentials are the following: Email: " + email + " Password: " + password
  512.         mail.send(msg)
  513.         return redirect(url_for("popup", message= "The user has been registered"))
  514.     else:
  515.         return render_template("register.html", error = "Emailen finns redan i systemet", user=get_user())
  516.         #Error = True
  517.         #Alltså emailen finns i databasen
  518.         #Return till registrering och blir error
  519.  
  520.  
  521.  
  522. # -------------------------------------------------------------------------------------------------------------------------------------------------------------
  523.  
  524. # start the server with the 'run()' method
  525. if __name__ == '__main__':
  526.     app.wsgi_app = SessionMiddleware(app.wsgi_app, session_opts)
  527.     app.run(port = 8082, debug=True, threaded = True)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement