@ -1,3 +1,4 @@
from flask.helpers import send_from_directory
import ldap as l
import ldap as l
from ldap3 import Server , Connection
from ldap3 import Server , Connection
from ldap3.core.exceptions import LDAPBindError
from ldap3.core.exceptions import LDAPBindError
@ -9,6 +10,7 @@ from flask_wtf import FlaskForm
from flask_cache_buster import CacheBuster
from flask_cache_buster import CacheBuster
from wtforms import StringField , PasswordField , BooleanField , SubmitField
from wtforms import StringField , PasswordField , BooleanField , SubmitField
from wtforms.validators import DataRequired
from wtforms.validators import DataRequired
from werkzeug.utils import secure_filename
from flask_bootstrap import Bootstrap
from flask_bootstrap import Bootstrap
import short_url
import short_url
import os
import os
@ -30,6 +32,9 @@ app.config['LDAP_BASE_DN'] = os.environ.get('LDAP_BASE_DN')
app . config [ ' LDAP_USERNAME ' ] = os . environ . get ( ' LDAP_USERNAME ' )
app . config [ ' LDAP_USERNAME ' ] = os . environ . get ( ' LDAP_USERNAME ' )
app . config [ ' LDAP_PASSWORD ' ] = os . environ . get ( ' LDAP_PASSWORD ' )
app . config [ ' LDAP_PASSWORD ' ] = os . environ . get ( ' LDAP_PASSWORD ' )
# Uploads
app . config [ ' UPLOAD_FOLDER ' ] = ' links/images '
# OpenLDAP
# OpenLDAP
app . config [ ' LDAP_OBJECTS_DN ' ] = ' dn '
app . config [ ' LDAP_OBJECTS_DN ' ] = ' dn '
app . config [ ' LDAP_OPENLDAP ' ] = True
app . config [ ' LDAP_OPENLDAP ' ] = True
@ -40,6 +45,7 @@ app.config['LDAP_USER_OBJECT_FILTER'] = '(&(objectclass=posixAccount)(uid=%s))'
#app.config['REMEMBER_COOKIE_DOMAIN'] = os.environ.get('COOKIE_DOMAIN')
#app.config['REMEMBER_COOKIE_DOMAIN'] = os.environ.get('COOKIE_DOMAIN')
short_domain = os . environ . get ( ' SHORT_DOMAIN ' )
short_domain = os . environ . get ( ' SHORT_DOMAIN ' )
ALLOWED_EXTENSIONS = { ' png ' , ' jpg ' , ' jpeg ' , ' gif ' }
db = SQLAlchemy ( app )
db = SQLAlchemy ( app )
@ -132,7 +138,8 @@ def get_current_user():
def index ( ) :
def index ( ) :
pastes = get_pastes_for_user ( )
pastes = get_pastes_for_user ( )
links = get_links_for_user ( )
links = get_links_for_user ( )
return render_template ( ' profile.j2 ' , user = current_user . get_user_dict ( ) , short_domain = short_domain , links = links , pastes = pastes , images = [ ] )
images = get_images_for_user ( )
return render_template ( ' profile.j2 ' , user = current_user . get_user_dict ( ) , short_domain = short_domain , links = links , pastes = pastes , images = images )
@app.route ( ' /link ' )
@app.route ( ' /link ' )
@ -147,6 +154,37 @@ def text():
return render_template ( ' paste.j2 ' , user = current_user . get_user_dict ( ) )
return render_template ( ' paste.j2 ' , user = current_user . get_user_dict ( ) )
@app.route ( ' /image ' , methods = [ ' GET ' , ' POST ' ] )
@login_required
def image ( ) :
if request . method == ' POST ' :
print ( request . files )
# check if the post request has the file part
if ' file ' not in request . files :
return render_template ( ' image.j2 ' , user = current_user . get_user_dict ( ) , short_domain = short_domain , error_msg = " No file part. " )
file = request . files [ ' file ' ]
# if user does not select file, browser also
# submit an empty part without filename
if file . filename == ' ' :
return render_template ( ' image.j2 ' , user = current_user . get_user_dict ( ) , short_domain = short_domain , error_msg = " No selected file. " )
if file and allowed_file ( file . filename ) :
conn = sqlite3 . connect ( ' links/links.db ' )
c = conn . cursor ( )
filename = secure_filename ( file . filename )
file . save ( os . path . join ( app . config [ ' UPLOAD_FOLDER ' ] , filename ) )
c . execute ( " INSERT INTO images (filename, user_id) VALUES (?, ?) " , ( filename , current_user . get_user_dict ( ) [ ' dn ' ] ) )
c . execute ( " SELECT * FROM images WHERE filename=? " , ( filename , ) )
row = c . fetchone ( )
print ( row [ 0 ] )
conn . commit ( )
conn . close ( )
url_fragment = short_url . encode_url ( row [ 0 ] )
return render_template ( ' image.j2 ' , user = current_user . get_user_dict ( ) , short_domain = short_domain , success_msg = " Your image link is <a target= ' _blank ' href= ' {}/i/{} ' >{}/i/{}</a> " . format ( short_domain , url_fragment , short_domain , url_fragment ) )
return render_template ( ' image.j2 ' , user = current_user . get_user_dict ( ) , short_domain = short_domain )
@app.route ( ' /login ' , methods = [ ' GET ' , ' POST ' ] )
@app.route ( ' /login ' , methods = [ ' GET ' , ' POST ' ] )
def login ( ) :
def login ( ) :
if current_user . is_authenticated :
if current_user . is_authenticated :
@ -207,7 +245,7 @@ def shorten_url():
conn . commit ( )
conn . commit ( )
conn . close ( )
conn . close ( )
url_fragment = short_url . encode_url ( row [ 0 ] )
url_fragment = short_url . encode_url ( row [ 0 ] )
return " Your shortened link is <a href= ' {}/l/{} ' >{}/l/{}</a> " . format ( short_domain , url_fragment , short_domain , url_fragment )
return " Your shortened link is <a target= ' _blank ' href= ' {}/l/{} ' >{}/l/{}</a> " . format ( short_domain , url_fragment , short_domain , url_fragment )
conn . commit ( )
conn . commit ( )
conn . close ( )
conn . close ( )
return ' Error '
return ' Error '
@ -230,21 +268,46 @@ def save_paste():
conn . commit ( )
conn . commit ( )
conn . close ( )
conn . close ( )
url_fragment = short_url . encode_url ( row [ 0 ] )
url_fragment = short_url . encode_url ( row [ 0 ] )
return { " success " : True , " msg " : " Your paste link is <a href= ' {}/p/{} ' >{}/p/{}</a> " . format ( short_domain , url_fragment , short_domain , url_fragment ) }
return { " success " : True , " msg " : " Your paste link is <a target= ' _blank ' href= ' {}/p/{} ' >{}/p/{}</a> " . format ( short_domain , url_fragment , short_domain , url_fragment ) }
conn . commit ( )
conn . commit ( )
conn . close ( )
conn . close ( )
return { ' success ' : False }
return { ' success ' : False }
@app.route ( ' /delete ' , methods = [ ' POST ' ] )
@login_required
def delete ( ) :
if request . method == ' POST ' :
data = request . json
table = data [ ' table ' ]
conn = sqlite3 . connect ( ' links/links.db ' )
c = conn . cursor ( )
if table == ' links ' :
c . execute ( " DELETE FROM links WHERE id=? AND user_id=? " , ( data [ ' id ' ] , current_user . get_user_dict ( ) [ ' dn ' ] ) )
elif table == ' pastes ' :
c . execute ( " DELETE FROM pastes WHERE id=? AND user_id=? " , ( data [ ' id ' ] , current_user . get_user_dict ( ) [ ' dn ' ] ) )
elif table == ' images ' :
c . execute ( " DELETE FROM images WHERE id=? AND user_id=? " , ( data [ ' id ' ] , current_user . get_user_dict ( ) [ ' dn ' ] ) )
else :
return { ' success ' : False , ' msg ' : ' This table doesn \' t exist! ' }
conn . commit ( )
conn . close ( )
return { ' success ' : True , ' msg ' : ' Deleted successfully! ' }
return { ' success ' : False , ' msg ' : ' An error occurred. ' }
@app.route ( ' /l/<url> ' )
@app.route ( ' /l/<url> ' )
def expand_url ( url ) :
def expand_url ( url ) :
idx = short_url . decode_url ( url )
idx = short_url . decode_url ( url )
conn = sqlite3 . connect ( ' links/links.db ' )
conn = sqlite3 . connect ( ' links/links.db ' )
c = conn . cursor ( )
c = conn . cursor ( )
c . execute ( " SELECT * FROM links WHERE id=? " , ( idx , ) )
c . execute ( " SELECT * FROM links WHERE id=? " , ( idx , ) )
out_link = c . fetchone ( ) [ 1 ]
return redirect ( out_link )
out = c . fetchone ( )
if out != None :
out_link = out [ 1 ]
return redirect ( out_link )
return render_template ( ' 404.j2 ' )
@app.route ( ' /p/<url> ' )
@app.route ( ' /p/<url> ' )
@ -253,10 +316,26 @@ def show_paste(url):
conn = sqlite3 . connect ( ' links/links.db ' )
conn = sqlite3 . connect ( ' links/links.db ' )
c = conn . cursor ( )
c = conn . cursor ( )
c . execute ( " SELECT * FROM pastes WHERE id=? " , ( idx , ) )
c . execute ( " SELECT * FROM pastes WHERE id=? " , ( idx , ) )
out_paste = str ( c . fetchone ( ) [ 1 ] , ' utf-8 ' )
out = c . fetchone ( )
if out != None :
out_paste = str ( out [ 1 ] , ' utf-8 ' )
return render_template ( ' public_paste.j2 ' , paste = out_paste )
return render_template ( ' 404.j2 ' )
return render_template ( ' public_paste.j2 ' , paste = out_paste )
@app.route ( ' /i/<url> ' )
def show_image ( url ) :
idx = short_url . decode_url ( url )
conn = sqlite3 . connect ( ' links/links.db ' )
c = conn . cursor ( )
c . execute ( " SELECT * FROM images WHERE id=? " , ( idx , ) )
out = c . fetchone ( )
if out != None :
filename = out [ 1 ]
return send_from_directory ( app . config [ ' UPLOAD_FOLDER ' ] , filename = filename , as_attachment = False )
return render_template ( ' 404.j2 ' )
def get_pastes_for_user ( ) :
def get_pastes_for_user ( ) :
conn = sqlite3 . connect ( ' links/links.db ' )
conn = sqlite3 . connect ( ' links/links.db ' )
@ -265,8 +344,9 @@ def get_pastes_for_user():
out = [ ]
out = [ ]
for row in c . fetchall ( ) :
for row in c . fetchall ( ) :
a = " {}/p/{} " . format ( short_domain , short_url . encode_url ( row [ 0 ] ) )
out . append ( ( row [ 0 ] , a ) )
a = " {}/p/{}<span class= ' faded ' > - {}</span> " . format ( short_domain , short_url . encode_url ( row [ 0 ] ) , str ( row [ 1 ] , ' utf-8 ' ) [ : 80 ] )
b = " {}/p/{} " . format ( short_domain , short_url . encode_url ( row [ 0 ] ) )
out . append ( ( row [ 0 ] , a , b ) )
return out
return out
@ -278,13 +358,31 @@ def get_links_for_user():
out = [ ]
out = [ ]
for row in c . fetchall ( ) :
for row in c . fetchall ( ) :
print ( row )
a = " {}/l/{} " . format ( short_domain , short_url . encode_url ( row [ 0 ] ) )
out . append ( ( row [ 0 ] , a ) )
a = " {}/l/{}<span class= ' faded ' > - {}</span> " . format ( short_domain , short_url . encode_url ( row [ 0 ] ) , row [ 1 ] )
b = " {}/l/{} " . format ( short_domain , short_url . encode_url ( row [ 0 ] ) )
out . append ( ( row [ 0 ] , a , b ) )
return out
def get_images_for_user ( ) :
conn = sqlite3 . connect ( ' links/links.db ' )
c = conn . cursor ( )
c . execute ( " SELECT * FROM images WHERE user_id=? " , ( current_user . get_user_dict ( ) [ " dn " ] , ) )
out = [ ]
for row in c . fetchall ( ) :
a = " {}/i/{} " . format ( short_domain , short_url . encode_url ( row [ 0 ] ) )
out . append ( ( row [ 0 ] , a , a ) )
return out
return out
def allowed_file ( filename ) :
return ' . ' in filename and \
filename . rsplit ( ' . ' , 1 ) [ 1 ] . lower ( ) in ALLOWED_EXTENSIONS
@app.route ( ' /logout ' )
@app.route ( ' /logout ' )
@login_required
@login_required
def logout ( ) :
def logout ( ) :