diff --git a/Changes b/Changes index caa14a8..64b4860 100644 --- a/Changes +++ b/Changes @@ -1,6 +1,8 @@ Revision history for Lutim 0.3 2014- + - Add a delete link to images (#28) + - Concatenated css and js with Mojolicious::Plugin::AssetPack - Antiflood protection for the "Download by URL" feature (#29) - Stats page improved - Self-documented configuration template diff --git a/README.md b/README.md index 6513e84..79eb9c9 100644 --- a/README.md +++ b/README.md @@ -59,19 +59,20 @@ vi lutim.conf The `lutim.conf.template` is self-documented but here is the options that you can set: * hypnotoad: address and port to listen to, user and group which runs hypnotoad (if you run Lutim with a different user from what is defined here, be sure that the user which launchs hypnotoad is able to setuid/setgid to the defined user/group, otherwise it will not work and you'll have 100% CPU consumption. Launch hypnotoad with the root user or with the user which is defined here); -* contact: write something which make people able to contact you (contact form URL, email address, whatever) ; +* contact: write something which make people able to contact you (contact form URL, email address, whatever); * secrets: an array of random string. Used by Mojolicious for encrypting session cookies. -* piwik_img: the Piwik image provides you records of visits without javascript (better privacy than js and cookies) ; -* length: length of the random string part of image's URL (default is 8) ; -* provis_step: Lutim provisions random strings for image's URL per pack of `provis_step` (default is 5) ; -* provisioning: number of random strings to provision (default is 100) ; -* hosted_by: if someone hosts your Lutim instance, you can add some HTML (a logo for example) to make it appear on index page ; -* tweet_card_via: a Twitter account which will appear on Twitter cards ; -* max_file_size: well, this is explicit (default is 10Mio = 10485760 octets) ; -* https: 1 if you want to provide secure images URLs (default is 0) DEPRECATED, PASS A `X-Forwarded-Proto` HEADER TO LUTIM FROM YOUR REVERSE PROXY INSTEAD ; -* stats_day_num: when you generate statistics with `script/lutim cron stats`, you will have stats for the last `stats_day_num` days (default is 365) ; -* keep_ip_during: when you delete IP addresses of image's senders with `script/lutim cron cleanbdd`, the IP addresses of images older than `keep_ip_during` days will be deleted (default is 365) ; -* broadcast_message: put some string (not HTML) here and this message will be displayed on all Lutim pages (not in JSON responses) ; +* piwik_img: the Piwik image provides you records of visits without javascript (better privacy than js and cookies); +* length: length of the random string part of image's URL (default is 8); +* provis_step: Lutim provisions random strings for image's URL per pack of `provis_step` (default is 5); +* provisioning: number of random strings to provision (default is 100); +* hosted_by: if someone hosts your Lutim instance, you can add some HTML (a logo for example) to make it appear on index page; +* tweet_card_via: a Twitter account which will appear on Twitter cards; +* max_file_size: well, this is explicit (default is 10Mio = 10485760 octets); +* https: 1 if you want to provide secure images URLs (default is 0) DEPRECATED, PASS A `X-Forwarded-Proto` HEADER TO LUTIM FROM YOUR REVERSE PROXY INSTEAD; +* token_length: length of the secret token used to allow people to delete their images when they want; +* stats_day_num: when you generate statistics with `script/lutim cron stats`, you will have stats for the last `stats_day_num` days (default is 365); +* keep_ip_during: when you delete IP addresses of image's senders with `script/lutim cron cleanbdd`, the IP addresses of images older than `keep_ip_during` days will be deleted (default is 365); +* broadcast_message: put some string (not HTML) here and this message will be displayed on all Lutim pages (not in JSON responses); * allowed_domains: array of authorized domains for API calls. Example: `['http://1.example.com', 'http://2.example.com']`. If you want to authorize everyone to use the API: `['\*']`. * default_delay: what is the default time limit for files? Valid values are 0, 1, 7, 30 and 365; * max_delay: if defined, the images will be deleted after that delay (in days), even if they were uploaded with "no delay" (or value superior to max_delay) option and a warning message will be displayed on homepage; diff --git a/fontello-config.json b/fontello-config.json new file mode 100644 index 0000000..d2a7a2b --- /dev/null +++ b/fontello-config.json @@ -0,0 +1,58 @@ +{ + "name": "", + "css_prefix_text": "icon-", + "css_use_suffix": false, + "hinting": true, + "units_per_em": 1000, + "ascent": 850, + "glyphs": [ + { + "uid": "c5fd349cbd3d23e4ade333789c29c729", + "css": "eye", + "code": 59399, + "src": "fontawesome" + }, + { + "uid": "9a76bc135eac17d2c8b8ad4a5774fc87", + "css": "download", + "code": 59397, + "src": "fontawesome" + }, + { + "uid": "f48ae54adfb27d8ada53d0fd9e34ee10", + "css": "trash", + "code": 59396, + "src": "fontawesome" + }, + { + "uid": "2cb15eb2b295ee3c33fab1530e18a924", + "css": "bitcoin", + "code": 59395, + "src": "fontawesome" + }, + { + "uid": "0f6a2573a7b6df911ed199bb63717e27", + "css": "github-circled", + "code": 59393, + "src": "fontawesome" + }, + { + "uid": "627abcdb627cb1789e009c08e2678ef9", + "css": "twitter", + "code": 59392, + "src": "fontawesome" + }, + { + "uid": "fccd3ea0efb711b849045bee686b1ceb", + "css": "spinner", + "code": 59398, + "src": "mfglabs" + }, + { + "uid": "c71d7db10ede1349b3a8ae0293b1dbf8", + "css": "flattr", + "code": 59394, + "src": "zocial" + } + ] +} \ No newline at end of file diff --git a/lib/Lutim.pm b/lib/Lutim.pm index 0c91ce4..305b830 100644 --- a/lib/Lutim.pm +++ b/lib/Lutim.pm @@ -27,6 +27,7 @@ sub startup { https => 0, default_delay => 0, max_delay => 0, + token_length => 24, } }); @@ -117,7 +118,8 @@ sub startup { counter => 0, enabled => 1, delete_at_first_view => 0, - delete_at_day => 0 + delete_at_day => 0, + mod_token => $c->shortener($c->config->{token_length}) ); LutimModel->commit; } @@ -243,6 +245,15 @@ sub startup { } ); + $self->helper( + delete_image => sub { + my $c = shift; + my $image = shift; + unlink $image->path(); + $image->update(enabled => 0); + } + ); + $self->hook( before_dispatch => sub { my $c = shift; @@ -280,9 +291,9 @@ sub startup { } ); - $self->asset('index.css' => 'css/bootstrap.min.css', 'css/fontello.css', 'css/animation.css', 'css/uploader.css', 'css/hennypenny.css', 'css/lutim.css'); - $self->asset('stats.css' => 'css/bootstrap.min.css', 'css/fontello.css', 'css/animation.css', 'css/morris-0.4.3.min.css', 'css/hennypenny.css', 'css/lutim.css'); - $self->asset('about.css' => 'css/bootstrap.min.css', 'css/fontello.css', 'css/animation.css', 'css/hennypenny.css', 'css/lutim.css'); + $self->asset('index.css' => 'css/bootstrap.min.css', 'css/fontello-embedded.css', 'css/animation.css', 'css/uploader.css', 'css/hennypenny.css', 'css/lutim.css'); + $self->asset('stats.css' => 'css/bootstrap.min.css', 'css/fontello-embedded.css', 'css/animation.css', 'css/morris-0.4.3.min.css', 'css/hennypenny.css', 'css/lutim.css'); + $self->asset('about.css' => 'css/bootstrap.min.css', 'css/fontello-embedded.css', 'css/animation.css', 'css/hennypenny.css', 'css/lutim.css'); $self->asset('index.js' => 'js/jquery-2.1.0.min.js', 'js/bootstrap.min.js', 'js/lutim.js', 'js/dmuploader.min.js'); $self->asset('stats.js' => 'js/jquery-2.1.0.min.js', 'js/bootstrap.min.js', 'js/lutim.js', 'js/raphael-min.js', 'js/morris-0.4.3.min.js', 'js/stats.js'); @@ -316,6 +327,10 @@ sub startup { to('Controller#add')-> name('add'); + $r->get('/d/:short/:token')-> + to('Controller#delete')-> + name('delete'); + $r->get('/:short')-> to('Controller#short')-> name('short'); diff --git a/lib/Lutim/Controller.pm b/lib/Lutim/Controller.pm index d7ea94d..d49050e 100644 --- a/lib/Lutim/Controller.pm +++ b/lib/Lutim/Controller.pm @@ -46,6 +46,41 @@ sub stats { ); } +sub delete { + my $c = shift; + my $short = $c->param('short'); + my $token = $c->param('token'); + + my @images = LutimModel::Lutim->select('WHERE short = ? AND path IS NOT NULL', $short); + if (scalar(@images)) { + my $image = $images[0]; + my $msg; + if ($image->mod_token() ne $token) { + $msg = $c->l('invalid_token'); + } elsif ($image->enabled() == 0) { + $msg = $c->l('already_deleted', $image->filename); + } else { + $c->app->log->info('[DELETION] someone made '.$image->filename.' removed with token method (path: '.$image->path.')'); + + $c->delete_image($image); + $c->flash( + success => $c->l('image_deleted', $image->filename) + ); + return $c->redirect_to('/'); + } + + $c->flash( + msg => $msg + ); + return $c->redirect_to('/'); + } else { + $c->app->log->info('[UNSUCCESSFUL] someone tried to delete '.$short.' but it does\'nt exist.'); + + # Image never existed + $c->render_not_found; + } +} + sub add { my $c = shift; my $upload = $c->param('file'); @@ -133,7 +168,7 @@ sub add { my $ip = $c->ip; - my ($msg, $short, $thumb); + my ($msg, $short, $real_short, $token, $thumb); # Check file type if (index($mediatype, 'image/') >= 0) { # Create directory if needed @@ -190,8 +225,10 @@ sub add { $c->app->log->info('[CREATION] '.$ip.' pushed '.$filename.' (path: '.$path.')'); # Give url to user - $short = $records[0]->short; - $short .= '/'.$key if (defined($key)); + $short = $records[0]->short; + $real_short = $short; + $token = $records[0]->mod_token; + $short .= '/'.$key if (defined($key)); } else { # Houston, we have a problem $msg = $c->l('no_more_short', $c->config->{contact}); @@ -205,9 +242,11 @@ sub add { if (defined($c->param('format')) && $c->param('format') eq 'json') { if (defined($short)) { $msg = { - filename => $upload->filename, - short => $short, - thumb => $thumb + filename => $upload->filename, + short => $short, + real_short => $real_short, + token => $token, + thumb => $thumb }; } else { $msg = { @@ -227,9 +266,11 @@ sub add { $c->flash(filename => $upload->filename); return $c->redirect_to('/'); } else { - $c->stash(short => $short) if (defined($short)); - $c->stash(thumb => $thumb); - $c->stash(filename => $upload->filename); + $c->stash(short => $short) if (defined($short)); + $c->stash(real_short => $real_short); + $c->stash(token => $token); + $c->stash(thumb => $thumb); + $c->stash(filename => $upload->filename); return $c->render( template => 'index', max_file_size => $c->req->max_message_size @@ -270,8 +311,7 @@ sub short { $c->app->log->info('[DELETION] someone tried to view '.$images[0]->filename.' but it has been removed by expiration (path: '.$images[0]->path.')'); # Delete image - unlink $images[0]->path(); - $images[0]->update(enabled => 0); + $c->delete_image($images[0]); # Warn user $c->flash( @@ -318,8 +358,7 @@ sub short { $c->app->log->info('[DELETION] someone made '.$images[0]->filename.' removed (path: '.$images[0]->path.')'); # Delete image - unlink $images[0]->path(); - $images[0]->update(enabled => 0); + $c->delete_image($images[0]); } }); } diff --git a/lib/Lutim/I18N/en.pm b/lib/Lutim/I18N/en.pm index 8df56f4..571c101 100644 --- a/lib/Lutim/I18N/en.pm +++ b/lib/Lutim/I18N/en.pm @@ -43,6 +43,7 @@ our %Lexicon = ( 'view-link' => 'View link', 'download-link' => 'Download link', 'twitter-link' => 'Link for put in a tweet', + 'delete-link' => 'Deletion link', 'some-bad' => 'Something bad happened', 'delete-first' => 'Delete at first view?', 'delete-day' => 'Delete after 24 hours?', @@ -52,7 +53,7 @@ our %Lexicon = ( 'drag-n-drop' => 'Drag & drop images here', 'or' => '-or-', 'file-browser' => 'Click to open the file browser', - 'image_not_found' => 'Unable to find the image', + 'image_not_found' => 'Unable to find the image: it has been deleted.', 'no_more_short' => 'There is no more available URL. Retry or contact the administrator. [_1]', 'no_valid_file' => 'The file [_1] is not an image.', 'file_too_big' => 'The file exceed the size limit ([_1])', @@ -77,6 +78,9 @@ our %Lexicon = ( 'max_delay' => 'Warning! The maximum time limit for an image is [_1] day(s), even if you choose "no time limit".', 'crypt_image' => 'Encrypt the image (Lutim does not keep the key).', 'always_encrypt' => 'The images are encrypted on the server (Lutim does not keep the key).', + 'image_deleted' => 'The image [_1] has been successfully deleted', + 'invalid_token' => 'The delete token is invalid.', + 'already_deleted' => 'The image [_1] has already been deleted.', ); 1; diff --git a/lib/Lutim/I18N/fr.pm b/lib/Lutim/I18N/fr.pm index 38d2255..75edc05 100644 --- a/lib/Lutim/I18N/fr.pm +++ b/lib/Lutim/I18N/fr.pm @@ -43,6 +43,7 @@ our %Lexicon = ( 'view-link' => 'Lien d\'affichage', 'download-link' => 'Lien de téléchargement', 'twitter-link' => 'Lien pour mettre dans un tweet', + 'delete-link' => 'Lien de suppression', 'some-bad' => 'Un problème est survenu', 'delete-first' => 'Supprimer au premier accès ?', 'delete-day' => 'Supprimer après 24 heures ?', @@ -52,7 +53,7 @@ our %Lexicon = ( 'drag-n-drop' => 'Déposez vos images ici', 'or' => '-ou-', 'file-browser' => 'Cliquez pour utiliser le navigateur de fichier', - 'image_not_found' => 'Impossible de trouver l\'image', + 'image_not_found' => 'Impossible de trouver l\'image : elle a été supprimée.', 'no_more_short' => 'Il n\'y a plus d\'URL disponible. Veuillez réessayer ou contactez l\'administrateur. [_1].', 'no_valid_file' => 'Le fichier [_1] n\'est pas une image.', 'file_too_big' => 'Le fichier dépasse la limite de taille ([_1])', @@ -77,6 +78,9 @@ our %Lexicon = ( 'max_delay' => 'Attention ! Le délai maximal de rétention d\'une image est de [_1] jour(s), même si vous choisissez « pas de limitation de durée ».', 'crypt_image' => 'Chiffrer l\'image (Lutim ne stocke pas la clé).', 'always_encrypt' => 'Les images sont chiffrées sur le serveur (Lutim ne stocke pas la clé).', + 'image_deleted' => 'L\'image [_1] a été supprimée avec succès.', + 'invalid_token' => 'Le jeton de suppression est invalide.', + 'already_deleted' => 'L\'image [_1] a déjà été supprimée.', ); 1; diff --git a/lib/LutimModel.pm b/lib/LutimModel.pm index de13662..2af27e4 100644 --- a/lib/LutimModel.pm +++ b/lib/LutimModel.pm @@ -20,7 +20,7 @@ use ORLite { created_at INTEGER, created_by TEXT, last_access_at INTEGER, - last_access_by INTEGER)' + mod_token TEXT)' ); return 1; } diff --git a/lib/Mojolicious/Command/cron/cleanfiles.pm b/lib/Mojolicious/Command/cron/cleanfiles.pm index 1190cf1..defebf0 100644 --- a/lib/Mojolicious/Command/cron/cleanfiles.pm +++ b/lib/Mojolicious/Command/cron/cleanfiles.pm @@ -13,8 +13,7 @@ sub run { my @images = LutimModel::Lutim->select('WHERE enabled = 1 AND (delete_at_day * 86400) < (? - created_at) AND delete_at_day != 0', $time); for my $image (@images) { - $image->update(enabled => 0); - unlink $image->path(); + $c->app->delete_image($image); } my $config = $c->app->plugin('Config'); @@ -24,8 +23,7 @@ sub run { @images = LutimModel::Lutim->select('WHERE enabled = 1 AND last_access_at < ?', $time); for my $image (@images) { - $image->update(enabled => 0); - unlink $image->path(); + $c->app->delete_image($image); } } } diff --git a/lutim.conf.template b/lutim.conf.template index cfc3dcf..0860055 100644 --- a/lutim.conf.template +++ b/lutim.conf.template @@ -96,6 +96,10 @@ # optional, default is 0 #always_encrypt => 0, + # length of the image's delete token + # optional, default is 24 + #token_length => 24, + ########################## # Lutim cron jobs settings ########################## diff --git a/public/css/fontello-codes.css b/public/css/fontello-codes.css index 2ba8222..6af589a 100644 --- a/public/css/fontello-codes.css +++ b/public/css/fontello-codes.css @@ -1,8 +1,9 @@ -.icon-eye:before { content: '\e806'; } /* '' */ -.icon-download:before { content: '\e804'; } /* '' */ -.icon-bitcoin:before { content: '\e802'; } /* '' */ -.icon-spinner:before { content: '\e805'; } /* '' */ -.icon-github-circled:before { content: '\e800'; } /* '' */ -.icon-touiteur:before { content: '\e801'; } /* '' */ -.icon-flattr:before { content: '\e803'; } /* '' */ \ No newline at end of file +.icon-twitter:before { content: '\e800'; } /* '' */ +.icon-github-circled:before { content: '\e801'; } /* '' */ +.icon-flattr:before { content: '\e802'; } /* '' */ +.icon-bitcoin:before { content: '\e803'; } /* '' */ +.icon-trash:before { content: '\e804'; } /* '' */ +.icon-download:before { content: '\e805'; } /* '' */ +.icon-spinner:before { content: '\e806'; } /* '' */ +.icon-eye:before { content: '\e807'; } /* '' */ \ No newline at end of file diff --git a/public/css/fontello-embedded.css b/public/css/fontello-embedded.css index 5793455..4242dff 100644 --- a/public/css/fontello-embedded.css +++ b/public/css/fontello-embedded.css @@ -1,15 +1,15 @@ @font-face { font-family: 'fontello'; - src: url('../font/fontello.eot?56781'); - src: url('../font/fontello.eot?56781#iefix') format('embedded-opentype'), - url('../font/fontello.svg?56781#fontello') format('svg'); + src: url('../font/fontello.eot?1320532'); + src: url('../font/fontello.eot?1320532#iefix') format('embedded-opentype'), + url('../font/fontello.svg?1320532#fontello') format('svg'); font-weight: normal; font-style: normal; } @font-face { font-family: 'fontello'; - src: url('data:application/octet-stream;base64,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') format('woff'), - url('data:application/octet-stream;base64,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') format('truetype'); + src: url('data:application/octet-stream;base64,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') format('woff'), + url('data:application/octet-stream;base64,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BEOwgGJgILAAKyCKimEgsAJDYGQjsANDYWRQWLACQ2EbsANDYFmwAyWwgGJhIyAgsAQmI0ZhOBsjsAhDRrACJbAIQ0cjRyNhYCCwBEOwgGJgIyCwACsjsARDYLAAK7AFJWGwBSWwgGKwBCZhILAEJWBkI7ADJWBkUFghGyMhWSMgILAEJiNGYThZLbAyLLAAFiAgILAFJiAuRyNHI2EjPDgtsDMssAAWILAII0IgICBGI0ewACsjYTgtsDQssAAWsAMlsAIlRyNHI2GwAFRYLiA8IyEbsAIlsAIlRyNHI2EgsAUlsAQlRyNHI2GwBiWwBSVJsAIlYbABRWMjIFhiGyFZY7ABRWJgIy4jICA8ijgjIVktsDUssAAWILAIQyAuRyNHI2EgYLAgYGawgGIjICA8ijgtsDYsIyAuRrACJUZSWCA8WS6xJgEUKy2wNywjIC5GsAIlRlBYIDxZLrEmARQrLbA4LCMgLkawAiVGUlggPFkjIC5GsAIlRlBYIDxZLrEmARQrLbA5LLAwKyMgLkawAiVGUlggPFkusSYBFCstsDossDEriiAgPLAEI0KKOCMgLkawAiVGUlggPFkusSYBFCuwBEMusCYrLbA7LLAAFrAEJbAEJiAuRyNHI2GwBkUrIyA8IC4jOLEmARQrLbA8LLEIBCVCsAAWsAQlsAQlIC5HI0cjYSCwBCNCsAZFKyCwYFBYILBAUVizAiADIBuzAiYDGllCQiMgR7AEQ7CAYmAgsAArIIqKYSCwAkNgZCOwA0NhZFBYsAJDYRuwA0NgWbADJbCAYmGwAiVGYTgjIDwjOBshICBGI0ewACsjYTghWbEmARQrLbA9LLAwKy6xJgEUKy2wPiywMSshIyAgPLAEI0IjOLEmARQrsARDLrAmKy2wPyywABUgR7AAI0KyAAEBFRQTLrAsKi2wQCywABUgR7AAI0KyAAEBFRQTLrAsKi2wQSyxAAEUE7AtKi2wQiywLyotsEMssAAWRSMgLiBGiiNhOLEmARQrLbBELLAII0KwQystsEUssgAAPCstsEYssgABPCstsEcssgEAPCstsEgssgEBPCstsEkssgAAPSstsEossgABPSstsEsssgEAPSstsEwssgEBPSstsE0ssgAAOSstsE4ssgABOSstsE8ssgEAOSstsFAssgEBOSstsFEssgAAOystsFIssgABOystsFMssgEAOystsFQssgEBOystsFUssgAAPistsFYssgABPistsFcssgEAPistsFgssgEBPistsFkssgAAOistsFossgABOistsFsssgEAOistsFwssgEBOistsF0ssDIrLrEmARQrLbBeLLAyK7A2Ky2wXyywMiuwNystsGAssAAWsDIrsDgrLbBhLLAzKy6xJgEUKy2wYiywMyuwNistsGMssDMrsDcrLbBkLLAzK7A4Ky2wZSywNCsusSYBFCstsGYssDQrsDYrLbBnLLA0K7A3Ky2waCywNCuwOCstsGkssDUrLrEmARQrLbBqLLA1K7A2Ky2wayywNSuwNystsGwssDUrsDgrLbBtLCuwCGWwAyRQeLABFTAtAAAAS7gAyFJYsQEBjlm5CAAIAGMgsAEjRLADI3CyBCgJRVJEsgoCByqxBgFEsSQBiFFYsECIWLEGA0SxJgGIUVi4BACIWLEGAURZWVlZuAH/hbAEjbEFAEQAAA==') format('truetype'); } /* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ /* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ @@ -17,7 +17,7 @@ @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'fontello'; - src: url('../font/fontello.svg?56781#fontello') format('svg'); + src: url('../font/fontello.svg?1320532#fontello') format('svg'); } } */ @@ -52,10 +52,11 @@ /* Uncomment for 3D effect */ /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ } -.icon-eye:before { content: '\e806'; } /* '' */ -.icon-download:before { content: '\e804'; } /* '' */ -.icon-bitcoin:before { content: '\e802'; } /* '' */ -.icon-spinner:before { content: '\e805'; } /* '' */ -.icon-github-circled:before { content: '\e800'; } /* '' */ -.icon-touiteur:before { content: '\e801'; } /* '' */ -.icon-flattr:before { content: '\e803'; } /* '' */ \ No newline at end of file +.icon-twitter:before { content: '\e800'; } /* '' */ +.icon-github-circled:before { content: '\e801'; } /* '' */ +.icon-flattr:before { content: '\e802'; } /* '' */ +.icon-bitcoin:before { content: '\e803'; } /* '' */ +.icon-trash:before { content: '\e804'; } /* '' */ +.icon-download:before { content: '\e805'; } /* '' */ +.icon-spinner:before { content: '\e806'; } /* '' */ +.icon-eye:before { content: '\e807'; } /* '' */ \ No newline at end of file diff --git a/public/css/fontello-ie7-codes.css b/public/css/fontello-ie7-codes.css index fdd3ca0..d9822a1 100644 --- a/public/css/fontello-ie7-codes.css +++ b/public/css/fontello-ie7-codes.css @@ -1,8 +1,9 @@ -.icon-eye { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-download { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-bitcoin { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-spinner { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-github-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-touiteur { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-flattr { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } \ No newline at end of file +.icon-twitter { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-github-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-flattr { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-bitcoin { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-trash { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-download { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-spinner { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-eye { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } \ No newline at end of file diff --git a/public/css/fontello-ie7.css b/public/css/fontello-ie7.css index 5da3237..dcb157e 100644 --- a/public/css/fontello-ie7.css +++ b/public/css/fontello-ie7.css @@ -10,10 +10,11 @@ /* font-size: 120%; */ } -.icon-eye { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-download { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-bitcoin { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-spinner { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-github-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-touiteur { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-flattr { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } \ No newline at end of file +.icon-twitter { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-github-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-flattr { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-bitcoin { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-trash { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-download { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-spinner { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-eye { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } \ No newline at end of file diff --git a/public/css/fontello.css b/public/css/fontello.css index fc7f93c..2842004 100644 --- a/public/css/fontello.css +++ b/public/css/fontello.css @@ -1,10 +1,10 @@ @font-face { font-family: 'fontello'; - src: url('../font/fontello.eot?69050751'); - src: url('../font/fontello.eot?69050751#iefix') format('embedded-opentype'), - url('../font/fontello.woff?69050751') format('woff'), - url('../font/fontello.ttf?69050751') format('truetype'), - url('../font/fontello.svg?69050751#fontello') format('svg'); + src: url('../font/fontello.eot?47445522'); + src: url('../font/fontello.eot?47445522#iefix') format('embedded-opentype'), + url('../font/fontello.woff?47445522') format('woff'), + url('../font/fontello.ttf?47445522') format('truetype'), + url('../font/fontello.svg?47445522#fontello') format('svg'); font-weight: normal; font-style: normal; } @@ -14,7 +14,7 @@ @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'fontello'; - src: url('../font/fontello.svg?69050751#fontello') format('svg'); + src: url('../font/fontello.svg?47445522#fontello') format('svg'); } } */ @@ -50,10 +50,11 @@ /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ } -.icon-eye:before { content: '\e806'; } /* '' */ -.icon-download:before { content: '\e804'; } /* '' */ -.icon-bitcoin:before { content: '\e802'; } /* '' */ -.icon-spinner:before { content: '\e805'; } /* '' */ -.icon-github-circled:before { content: '\e800'; } /* '' */ -.icon-touiteur:before { content: '\e801'; } /* '' */ -.icon-flattr:before { content: '\e803'; } /* '' */ \ No newline at end of file +.icon-twitter:before { content: '\e800'; } /* '' */ +.icon-github-circled:before { content: '\e801'; } /* '' */ +.icon-flattr:before { content: '\e802'; } /* '' */ +.icon-bitcoin:before { content: '\e803'; } /* '' */ +.icon-trash:before { content: '\e804'; } /* '' */ +.icon-download:before { content: '\e805'; } /* '' */ +.icon-spinner:before { content: '\e806'; } /* '' */ +.icon-eye:before { content: '\e807'; } /* '' */ \ No newline at end of file diff --git a/public/font/fontello.eot b/public/font/fontello.eot index c1b4faa..995b74d 100644 Binary files a/public/font/fontello.eot and b/public/font/fontello.eot differ diff --git a/public/font/fontello.svg b/public/font/fontello.svg index 7efa36b..3b57dbd 100644 --- a/public/font/fontello.svg +++ b/public/font/fontello.svg @@ -6,13 +6,14 @@ - - - - - - - + + + + + + + + \ No newline at end of file diff --git a/public/font/fontello.ttf b/public/font/fontello.ttf index f60df13..e2f3b69 100644 Binary files a/public/font/fontello.ttf and b/public/font/fontello.ttf differ diff --git a/public/font/fontello.woff b/public/font/fontello.woff index 55f8697..57a3a91 100644 Binary files a/public/font/fontello.woff and b/public/font/fontello.woff differ diff --git a/templates/index.html.ep b/templates/index.html.ep index 18c62b0..59ab1b0 100644 --- a/templates/index.html.ep +++ b/templates/index.html.ep @@ -11,15 +11,25 @@
<%= stash('filename') %>
% } +% if (defined(flash('success'))) { +
+ + <%= flash('success') %> +
+% } % if (defined(flash('msg'))) {
+ <%=l 'some-bad' %>
<%= flash('filename') %> <%= flash('msg') %>
@@ -129,8 +139,10 @@ %= javascript begin - function link(url, dl) { - if (dl !== '') { + function link(url, dl, token) { + if (token !== undefined) { + url = 'd/'+url+'/'+token; + } else if (dl !== '') { url = url+'?'+dl; } return '<%== url_for('index')->to_abs() %>'+url+''; @@ -145,10 +157,12 @@ +'' +''; } else { return '
<%=l 'some-bad' %>
'