Alex "AdUser" Z
10 years ago
commit
761496af2a
17 changed files with 662 additions and 0 deletions
@ -0,0 +1,24 @@
|
||||
{ |
||||
secret => undef, |
||||
|
||||
server => '127.0.0.1', |
||||
binddn => undef, |
||||
bindpass => undef, |
||||
|
||||
userbase => undef, |
||||
defattrs => [ |
||||
'displayname', 'mail', 'cn', 'sn', |
||||
'givenname', 'userpassword', 'uid', |
||||
], |
||||
defclasses => ['inetOrgPerson'], |
||||
|
||||
hypnotoad => { |
||||
accepts => 100, |
||||
listen => [ 'http://127.0.0.1:3000' ], |
||||
heartbeat_interval => 5, |
||||
heartbeat_timeout => 20, |
||||
upgrade_timeout => 60, |
||||
proxy => 1, |
||||
workers => 2, |
||||
} |
||||
} |
@ -0,0 +1,32 @@
|
||||
package LDV; |
||||
|
||||
use strict; |
||||
use warnings; |
||||
use utf8; |
||||
|
||||
use Mojo::Base 'Mojolicious'; |
||||
|
||||
sub startup { |
||||
my ($self) = @_; |
||||
|
||||
$self->plugin(I18N => {default => 'ru'}); |
||||
$self->plugin(Config => {file => $self->app->home->rel_file('conf/ldv.conf')}); |
||||
|
||||
$self->app->mode('production'); |
||||
$self->app->secret($self->app->config->{secret}); |
||||
|
||||
my $r = $self->routes; |
||||
|
||||
# /user |
||||
$r->get('/user/login')->to('user#login'); |
||||
$r->get('/user/create')->to('user#create'); |
||||
$r->get('/user/update')->to('user#update'); |
||||
|
||||
$r->post('/user/create')->to('actions#create'); |
||||
|
||||
# /zerobin |
||||
$r->get('/zerobin2')->to('zerobin#view'); |
||||
$r->get('/zerobin2/create')->to('zerobin#create'); |
||||
} |
||||
|
||||
1; |
@ -0,0 +1,75 @@
|
||||
package LDV::Actions; |
||||
|
||||
use strict; |
||||
use warnings; |
||||
use utf8; |
||||
|
||||
use Mojo::Base 'Mojolicious::Controller'; |
||||
use Net::LDAP; |
||||
use Net::LDAP::Util qw(ldap_error_name); |
||||
use Crypt::SaltedHash; |
||||
|
||||
sub create |
||||
{ |
||||
my ($self) = @_; |
||||
my ($result); |
||||
|
||||
$result = "Created"; |
||||
eval { |
||||
my ($ldap, $mesg); |
||||
$ldap = Net::LDAP->new($self->app->config->{server}) |
||||
or die("$@"); |
||||
$mesg = $ldap->bind($self->app->config->{binddn}, |
||||
password => $self->app->config->{bindpass}); |
||||
if ($mesg->code) { |
||||
$self->app->log->error($mesg->error); |
||||
die("Can't connect to server\n"); |
||||
} |
||||
|
||||
my $base = $self->app->config->{userbase}; |
||||
my $login = $self->req->param('login'); |
||||
die ("Empty username\n") |
||||
unless ($login); |
||||
die ("Forbidden characters in username\n") |
||||
unless ($login =~ m|^[a-z]{2,36}$|oi); |
||||
$mesg = $ldap->search(base => $base, scope => 'one', deref => 'never', |
||||
filter => '(&(uid=$login)(class=InetOrgPerson))'); |
||||
die("This user already exists\n") |
||||
if ($mesg->count); |
||||
|
||||
my $attrs = {}; |
||||
$attrs->{objectclass} = [ "top", @{$self->app->config->{defclasses}} ]; |
||||
$attrs->{mail} = $self->req->param('mail'); |
||||
$attrs->{displayname} = $self->req->param('displayname') || ''; |
||||
if ($attrs->{displayname} =~ m|^(\S+)\s+(?:.*\s+)?(\S+)$|oi) { |
||||
$attrs->{cn} = $1; |
||||
$attrs->{sn} = $2; |
||||
} else { |
||||
$attrs->{cn} = '!not set!'; |
||||
$attrs->{sn} = '!not set!'; |
||||
} |
||||
|
||||
$attrs->{uid} = $login; |
||||
my $csh = Crypt::SaltedHash->new(algorithm => 'SHA-1'); |
||||
$csh->add($self->req->param('pass')); |
||||
$attrs->{userpassword} = $csh->generate(); |
||||
|
||||
$mesg = $ldap->add("uid=$login,$base", attrs => [ %$attrs ]); |
||||
if ($mesg->code) { |
||||
$self->app->log->error($mesg->error); |
||||
die("Can't add user\n"); |
||||
} |
||||
|
||||
$ldap->unbind(); 1; |
||||
} or do { |
||||
$self->app->log->error($@); |
||||
$result = "Error: $@"; |
||||
}; |
||||
|
||||
$self->flash({result => $result}); |
||||
$self->redirect_to('/user/create'); |
||||
$self->rendered(); |
||||
return 1; |
||||
} |
||||
|
||||
1; |
@ -0,0 +1,40 @@
|
||||
package LDV::I18N::ru; |
||||
use Mojo::Base 'LDV::I18N'; |
||||
|
||||
use strict; |
||||
use warnings; |
||||
use utf8; |
||||
|
||||
our %Lexicon = |
||||
( |
||||
_AUTO => 1, # enable fallback |
||||
|
||||
'Create new user' => 'Создать нового юзера', |
||||
'Update user' => 'Обновить пользователя', |
||||
'Login' => 'Логин', |
||||
'Log in' => 'Войти', |
||||
'Password' => 'Пароль', |
||||
'Current password' => 'Текущий пароль', |
||||
'Display name' => 'Отображаемое имя', |
||||
'Email' => 'Эл. почта', |
||||
'Create' => 'Создать', |
||||
'John Doe' => 'Иван Петров', |
||||
'Organization' => 'Организация', |
||||
'Mobile' => 'Сотовый', |
||||
'Avatar' => 'Аватар', |
||||
'Update' => 'Обновить', |
||||
'Auth required' => 'Требуется авторизация', |
||||
|
||||
'Keep for' => 'Хранить', |
||||
'Save' => 'Сохранить', |
||||
'Syntax highlight' => 'Подсветка синтаксиса', |
||||
|
||||
'day' => 'день', |
||||
'week' => '7 дней', |
||||
'month' => 'месяц', |
||||
'quarter' => '3 месяца', |
||||
'year' => 'год', |
||||
'forever' => 'всегда', |
||||
); |
||||
|
||||
1; |
@ -0,0 +1,118 @@
|
||||
package LDV::LDAP; |
||||
|
||||
use strict; |
||||
use warnings; |
||||
use utf8; |
||||
|
||||
use Net::LDAP; |
||||
use Net::LDAP::Util qw(ldap_error_name); |
||||
|
||||
sub new { |
||||
my ($class, $opts) = @_; |
||||
my $self = { |
||||
server => undef, |
||||
binddn => undef, |
||||
bindpass => undef, |
||||
userbase => undef, |
||||
userfilter => "(class=InetOrgPerson)", |
||||
%$opts, |
||||
}; |
||||
|
||||
return bless($self, $class); |
||||
} |
||||
|
||||
sub _connect { |
||||
my ($self) = @_; |
||||
my $conn = Net::LDAP->new($self->{server}, onerror => 'die'); |
||||
$conn->bind($self->{binddn}, password => $self->{bindpass}); |
||||
|
||||
return $conn; |
||||
} |
||||
|
||||
sub _escape { |
||||
my ($self, $str) = @_; |
||||
$str =~ s|\\|\\\\|go; |
||||
$str =~ s|\(|\\\(|go; |
||||
$str =~ s|\)|\\\)|go; |
||||
return $str; |
||||
} |
||||
|
||||
sub _filter_username { |
||||
my ($self, $uid) = @_; |
||||
return bless({and => |
||||
[{equalityMatch => {attributeDesc => 'objectClass', |
||||
assertionValue => 'inetOrgPerson'}}, |
||||
{equalityMatch => {attributeDesc => 'uid', |
||||
assertionValue => $uid}} |
||||
]}, 'Net::LDAP::Filter'); |
||||
}; |
||||
|
||||
sub create { |
||||
my ($self, $uid) = @_; |
||||
my $conn = $self->_connect(); |
||||
$uid = $self->_escape($uid); |
||||
my $data = $self->get($uid); |
||||
return "User already exists" |
||||
if ($data); |
||||
|
||||
my $dn = sprintf "uid=%s,%s", $uid, $self->{userbase}; |
||||
my $result = $conn->add($dn, attr => [ |
||||
objectClass => ['inetOrgPerson'], |
||||
uid => $uid, |
||||
sn => 'just', |
||||
cn => 'created', |
||||
]); |
||||
return $result->error if ($result->code); |
||||
$conn->unbind; |
||||
return; |
||||
} |
||||
|
||||
sub update { |
||||
my ($self, $uid, $attrs) = @_; |
||||
return "Attrs isn't HASH" |
||||
if (ref($attrs) ne 'HASH'); |
||||
|
||||
my $conn = $self->_connect(); |
||||
$uid = $self->_escape($uid); |
||||
|
||||
my $data = $self->get($uid); |
||||
return "No such user" |
||||
unless ($data); |
||||
|
||||
my $dn = sprintf "uid=%s,%s", $uid, $self->{userbase}; |
||||
foreach my $key (keys($attrs)) { |
||||
... |
||||
} |
||||
|
||||
return; |
||||
} |
||||
|
||||
sub delete { |
||||
my ($self, $uid) = @_; |
||||
my $conn = $self->_connect(); |
||||
$uid = $self->_escape($uid); |
||||
my $dn = sprintf "uid=%s,%s", $uid, $self->{userbase}; |
||||
my $result = $conn->delete($dn); |
||||
$conn->unbind; |
||||
return; |
||||
} |
||||
|
||||
sub get { |
||||
my ($self, $uid) = @_; |
||||
my $conn = $self->_connect(); |
||||
my $filter = $self->_filter_username($uid); |
||||
my $mesg = $conn->search(base => $self->{userbase}, scope => 'one', |
||||
deref => 'never', filter => $filter); |
||||
$conn->unbind; |
||||
return unless $mesg->count; |
||||
my $entry = $mesg->pop_entry(); |
||||
my $data = {}; |
||||
foreach my $attr ($entry->attributes) { |
||||
$data->{$attr} = $entry->get_value($attr); |
||||
} |
||||
|
||||
delete $data->{userPassword}; |
||||
return $data; |
||||
} |
||||
|
||||
1; |
@ -0,0 +1,58 @@
|
||||
package LDV::User; |
||||
|
||||
use strict; |
||||
use warnings; |
||||
use utf8; |
||||
|
||||
use Mojo::Base 'Mojolicious::Controller'; |
||||
|
||||
use Net::LDAP; |
||||
use Net::LDAP::Util qw(ldap_error_name); |
||||
|
||||
sub create { my ($self) = @_; $self->render(); } |
||||
sub login { my ($self) = @_; $self->render(); } |
||||
|
||||
sub logout { |
||||
my ($self) = @_; |
||||
|
||||
$self->session({useruid => undef}); |
||||
$self->redirect_to('/user/login'); |
||||
$self->rendered(); |
||||
} |
||||
|
||||
sub update { |
||||
my ($self) = @_; |
||||
my ($data, $login); |
||||
|
||||
unless ($login = $self->session('useruid')) { |
||||
$self->redirect_to('/user/login'); |
||||
return; |
||||
} |
||||
|
||||
eval { |
||||
my ($ldap, $mesg); |
||||
$ldap = Net::LDAP->new($self->app->config->{server}) |
||||
or die("$@"); |
||||
$mesg = $ldap->bind($self->app->config->{binddn}, |
||||
password => $self->app->config->{bindpass}); |
||||
if ($mesg->code) { |
||||
$self->app->log->error($mesg->error); |
||||
die("Can't connect to server\n"); |
||||
} |
||||
my $base = $self->app->config->{userbase}; |
||||
my $attrs = [ @{$self->app->config->{defattrs}} ]; |
||||
$mesg = $ldap->search(base => $base, scope => 'one', deref => 'never', |
||||
filter => '(&(uid=$login)(class=InetOrgPerson))', |
||||
attrs => $attrs); |
||||
die("User not found\n") |
||||
unless ($mesg->count); |
||||
my $entry = $mesg->pop_entry(); |
||||
1; |
||||
} or do { |
||||
}; |
||||
|
||||
$self->stash({user_data => $data}); |
||||
$self->render(); |
||||
} |
||||
|
||||
1; |
@ -0,0 +1,12 @@
|
||||
package LDV::Zerobin; |
||||
|
||||
use strict; |
||||
use warnings; |
||||
use utf8; |
||||
|
||||
use Mojo::Base 'Mojolicious::Controller'; |
||||
|
||||
sub view { my ($self) = @_; $self->render(); } |
||||
sub create { my ($self) = @_; $self->render(); } |
||||
|
||||
1; |
@ -0,0 +1,14 @@
|
||||
#!/usr/bin/env perl |
||||
use Mojo::Base -strict; |
||||
|
||||
use File::Basename 'dirname'; |
||||
use File::Spec::Functions qw(catdir splitdir); |
||||
|
||||
# Source directory has precedence |
||||
my @base = (splitdir(dirname(__FILE__)), '..'); |
||||
my $lib = join('/', @base, 'lib'); |
||||
-e catdir(@base, 't') ? unshift(@INC, $lib) : push(@INC, $lib); |
||||
|
||||
# Start commands for application |
||||
require Mojolicious::Commands; |
||||
Mojolicious::Commands->start_app('LDV'); |
@ -0,0 +1,24 @@
|
||||
#!/usr/bin/perl |
||||
|
||||
use strict; |
||||
use warnings; |
||||
use utf8; |
||||
|
||||
use Test; |
||||
use LDV::LDAP; |
||||
use Data::Dumper; |
||||
|
||||
BEGIN { plan test => 2 }; |
||||
|
||||
my $ldap = LDV::LDAP->new({ |
||||
server => '127.0.0.1', |
||||
binddn => undef, |
||||
bindpass => undef, |
||||
userbase => undef, |
||||
}); |
||||
|
||||
print Dumper $ldap->get("ad_user"); |
||||
#print Dumper $ldap->create("test20"); |
||||
#print Dumper $ldap->get("test20"); |
||||
#print Dumper $ldap->delete("test20"); |
||||
print Dumper $ldap->get("test20"); |
@ -0,0 +1,7 @@
|
||||
use Mojo::Base -strict; |
||||
|
||||
use Test::More tests => 3; |
||||
use Test::Mojo; |
||||
|
||||
my $t = Test::Mojo->new('LDV'); |
||||
$t->get_ok('/')->status_is(200)->content_like(qr/Mojolicious/i); |
@ -0,0 +1,19 @@
|
||||
<!--[if lte IE 8]> |
||||
<link rel="stylesheet" media="all" type="text/css" href="/wiki/lib/tpl/monobook/static/css/screen_iehacks.css" /> |
||||
<![endif]--> |
||||
<!--[if lt IE 5.5000]> |
||||
<link rel="stylesheet" media="all" type="text/css" href="/wiki/lib/tpl/monobook/static/3rd/monobook/IE50Fixes.css" /> |
||||
<![endif]--> |
||||
<!--[if IE 5.5000]> |
||||
<link rel="stylesheet" media="all" type="text/css" href="/wiki/lib/tpl/monobook/static/3rd/monobook/IE55Fixes.css" /> |
||||
<![endif]--> |
||||
<!--[if IE 6]> |
||||
<link rel="stylesheet" media="all" type="text/css" href="/wiki/lib/tpl/monobook/static/3rd/monobook/IE60Fixes.css" /> |
||||
<![endif]--> |
||||
<!--[if IE 7]> |
||||
<link rel="stylesheet" media="all" type="text/css" href="/wiki/lib/tpl/monobook/static/3rd/monobook/IE70Fixes.css" /> |
||||
<![endif]--> |
||||
<!--[if lt IE 7]> |
||||
<script type="text/javascript" charset="utf-8" src="/wiki/lib/tpl/monobook/static/3rd/wikipedia/IEFixes.js"></script> |
||||
<meta http-equiv="imagetoolbar" content="no" /> |
||||
<![endif]--> |
@ -0,0 +1,79 @@
|
||||
<!DOCTYPE html> |
||||
<html> |
||||
<head> |
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> |
||||
<title><%= title %> - Linux во Владивостоке</title> |
||||
<meta name="generator" content="mojolicious"/> |
||||
<meta name="robots" content="noindex,nofollow"/> |
||||
<link rel="stylesheet" type="text/css" href="/wiki/lib/exe/css.php?t=monobook"/> |
||||
%= include 'includes/ie-hacks', format => 'html'; |
||||
% foreach my $style (split /\s+/, stash('styles')) { |
||||
<%= stylesheet "/css/$style.css" %> |
||||
% } |
||||
% foreach my $script (split /\s+/, stash('scripts')) { |
||||
<%= javascript "/js/$script.js" %> |
||||
% } |
||||
</head> |
||||
<body class="mediawiki ns-0 ltr"> |
||||
<div id="globalWrapper"> |
||||
|
||||
<div id="column-content"> |
||||
<div id="content"> |
||||
<a name="top" id="top"></a> |
||||
<a name="dokuwiki__top" id="dokuwiki__top"></a> |
||||
<div id="bodyContent"> |
||||
<div class="dokuwiki"> |
||||
<!-- start main content area --> |
||||
<%= content %> |
||||
<!-- end main content area --> |
||||
<div class="visualClear"></div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
|
||||
<div id="column-one" class="noprint"> |
||||
<div class="portlet" id="p-logo"> |
||||
<a href="/wiki/index" style="background-image:url(/wiki/lib/tpl/monobook/user/logo.png);" accesskey="h" title="[ALT+H]"></a> |
||||
</div> |
||||
|
||||
<div id="p-personal" class="portlet"> |
||||
<div class="pBody"> |
||||
<ul> |
||||
<li id="pt-login"><a href="/wiki/index?do=login" rel="nofollow">Войти</a></li> |
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
<div class="portlet" id="p-x-navigation"> |
||||
<h5>Навигация</h5> |
||||
<div class="pBody"> |
||||
<div class="dokuwiki"> |
||||
<ul> |
||||
<li class="level1"><div class="li"> <span class="curid"><a href="/wiki/index" class="wikilink1" title="index">Главная</a></span></div> </li> |
||||
<li class="level1"><div class="li"> <a href="/wiki/articles/index" class="wikilink1" title="articles:index">Статьи</a></div> </li> |
||||
<li class="level1"><div class="li"> <a href="/wiki/projects/index" class="wikilink1" title="projects:index">Проекты</a></div> </li> |
||||
<li class="level1"><div class="li"> <a href="/wiki/events/index" class="wikilink1" title="events:index">События</a></div> </li> |
||||
<li class="level1"><div class="li"> <a href="/wiki/links" class="wikilink1" title="links">Ссылки</a></div> </li> |
||||
<li class="level1"><div class="li"> <a href="/wiki/wiki/index" class="wikilink1" title="wiki:index">Служебные</a></div> </li> |
||||
<li class="level1"><div class="li"> <a href="/forum/" class="wikilink1" title="/forum/">Форум</a></div> </li> |
||||
</ul> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> <!-- end of the left (by default at least) column --> |
||||
|
||||
<div class="visualClear"></div> |
||||
|
||||
<div id="footer" class="noprint"> |
||||
<div id="footer-buttons"> |
||||
</div> |
||||
<ul id="f-list"> |
||||
<li id="usermod"> |
||||
<br /> |
||||
</li> |
||||
</ul> |
||||
</div> |
||||
|
||||
</div> <!-- end of global wrap --> |
||||
</html> |
@ -0,0 +1,41 @@
|
||||
% layout 'default'; |
||||
% title l('Create new user'); |
||||
<h2><%= l('Create new user') %></h2> |
||||
% my @attrs = (method => 'POST'); |
||||
%= form_for "/user/create" => (@attrs) => begin |
||||
<table> |
||||
<tr> |
||||
<td><%= l('Login') %></td> |
||||
<td><%= text_field 'login', required => 1, placeholder => 'petrov' %></td> |
||||
</tr> |
||||
<tr> |
||||
<td><%= l('Password') %></td> |
||||
<td><%= password_field 'pass', required => 1, placeholder => '******' %></td> |
||||
</tr> |
||||
<tr> |
||||
<td colspan='2'><hr/></td> |
||||
</tr> |
||||
<tr> |
||||
<td><%= l('Display name') %></td> |
||||
<td><%= text_field 'displayname', placeholder => l('John Doe') %></td> |
||||
</tr> |
||||
<tr> |
||||
<td><%= l('Email') %></td> |
||||
<td><%= text_field 'mail', type => 'email', placeholder => 'petrov@example.com' %></td> |
||||
</tr> |
||||
<tr> |
||||
<td colspan='2'><hr/></td> |
||||
</tr> |
||||
<tr> |
||||
<td colspan='2'><%= submit_button l('Create') %></td> |
||||
</tr> |
||||
</table> |
||||
% end |
||||
% my $result = (flash 'result') || ''; |
||||
% if ($result) { |
||||
%= tag 'p' => $result; |
||||
% } else { |
||||
<p>Эта учётная запись будет действовать для всех сервисов *.linuxdv.org</p> |
||||
<p>Восстановления пароля пока не предусмотрено.</p> |
||||
<p>Обязательными являются только логин и пароль.</p> |
||||
% } |
@ -0,0 +1,21 @@
|
||||
% layout 'default'; |
||||
% title l('Auth required'); |
||||
<h2><%= l('Auth required') %></h2> |
||||
% my @attrs = (method => 'POST'); |
||||
%= form_for "/user/update" => (@attrs) => begin |
||||
<table> |
||||
<tr> |
||||
<td><%= l('Login') %></td> |
||||
<td><%= text_field 'login', required => 1, placeholder => 'username' %></td> |
||||
</tr> |
||||
<tr> |
||||
<td><%= l('Password') %></td> |
||||
<td><%= password_field 'pass', required => 1, placeholder => '******' %></td> |
||||
</tr> |
||||
<tr><td colspan='2'><hr/></td></tr> |
||||
<tr> |
||||
<td colspan='2'><%= submit_button l('Log in') %></td> |
||||
</tr> |
||||
</table> |
||||
% end |
||||
<p>Чтобы поменять свои данные, необходимо представиться системе.</p> |
@ -0,0 +1,41 @@
|
||||
% layout 'default'; |
||||
% title l('Update user'); |
||||
<h2><%= l('Update user') %></h2> |
||||
% my @attrs = (method => 'POST', enctype => 'multipart/form-data'); |
||||
%= form_for "/user/update" => (@attrs) => begin |
||||
<table> |
||||
<tr> |
||||
<td><%= l('Display name') %></td> |
||||
<td><%= text_field 'displayname', placeholder => l('John Doe') %></td> |
||||
</tr> |
||||
<tr> |
||||
<td><%= l('Email') %></td> |
||||
<td><%= text_field 'mail', type => 'email', placeholder => 'petrov@example.com' %></td> |
||||
</tr> |
||||
<tr> |
||||
<td><%= l('Organization') %></td> |
||||
<td><%= text_field 'org' %></td> |
||||
</tr> |
||||
<tr> |
||||
<td><%= l('Mobile') %></td> |
||||
<td><%= text_field 'mobile' %></td> |
||||
</tr> |
||||
<tr> |
||||
<td><%= l('Avatar') %></td> |
||||
<td><%= file_field 'photo' %></td> |
||||
</tr> |
||||
<tr><td colspan='2'><hr/></td></tr> |
||||
<tr> |
||||
<td><%= l('Current password') %></td> |
||||
<td><%= password_field 'pass', required => 1, placeholder => '******' %></td> |
||||
</tr> |
||||
<tr><td colspan='2'><hr/></td></tr> |
||||
<tr> |
||||
<td colspan='2'><%= submit_button l('Update') %></td> |
||||
</tr> |
||||
</table> |
||||
% end |
||||
% my $result = (flash 'result') || ''; |
||||
% if ($result) { |
||||
%= tag 'p' => $result; |
||||
% } |
@ -0,0 +1,28 @@
|
||||
% layout 'default'; |
||||
% title 'Zerobin -- View'; |
||||
% my %times = (day => 1, week => 7, month => 30, quarter => 90, year => 395); |
||||
% my @times = map { [l($_) => $times{$_}] } sort { $times{$a} <=> $times{$b} } keys(%times); |
||||
% stash 'styles' => 'zerobin'; |
||||
% stash 'expire' => 30; |
||||
<h1>Создать запись</h1> |
||||
<div> |
||||
<div> |
||||
<%= form_for "/zerobin2/create" => (method => 'POST') => begin %> |
||||
<span class="zerobin cblock"> |
||||
<%= submit_button l('Save') %> |
||||
</span> |
||||
<span class="zerobin cblock"> |
||||
<%= tag 'label' => (for => 'expire') => l('Keep for') %>: |
||||
<%= select_field 'expire' => \@times %> |
||||
</span> |
||||
<span class="zerobin cblock"> |
||||
<%= check_box 'syntax' => 0 %> |
||||
<%= tag 'label' => (for => 'syntax') => l('Syntax highlight') %> |
||||
</span> |
||||
<% end %> |
||||
</div> |
||||
<hr style="width: 50%"/> |
||||
<div> |
||||
<%= tag 'textarea' => (id => "paste", placeholder => l('Paste your text here')) => '' %> |
||||
</div> |
||||
</div> |
@ -0,0 +1,29 @@
|
||||
% layout 'default'; |
||||
% title 'Zerobin -- View'; |
||||
% stash 'styles' => 'hljs zerobin'; |
||||
% stash 'scripts' => 'jquery highlight zerobin'; |
||||
<h1><%= l('View paste') %></h1> |
||||
<div> |
||||
<div> |
||||
<span class="zerobin cblock"> |
||||
<%= link_to l('Create new') => "/zerobin2/create" %> |
||||
</span> |
||||
</div> |
||||
<br/> |
||||
<div> |
||||
<pre><code> |
||||
package LDV::Zerobin; |
||||
|
||||
use strict; |
||||
use warnings; |
||||
use utf8; |
||||
|
||||
use Mojo::Base 'Mojolicious::Controller'; |
||||
|
||||
sub view { my ($self) = @_; $self->render(); } |
||||
sub create { my ($self) = @_; $self->render(); } |
||||
|
||||
1; |
||||
</code></pre> |
||||
</div> |
||||
</div> |
Loading…
Reference in new issue