Pages

Wednesday, January 17, 2018

Ratio Calculator

Калькулятор пропорций


W:H = w:h
W:
H:
w:
h:
w:h
Result

Tuesday, March 14, 2017

Antispam

Эта статья является дополнением к Как бороться со спамом на домашнем вэб-сервере и модернизированными инструкциями для Как послать Емайл с домашнего веб-сайта.
Коды и скачать
Мы также создаем две страницы Contact и Response, только в этот раз в каждую из страниц кладем по iframe со ссылкой на экзекьютабл источник.

Contact

Response

\

Питонные файлы кладем в /cgi-bin, а все остальные в /mail [1].
Описание файлов
Папка Файл Permissions Описание
/mail
a+rwx

alfphabet.ttf a+r Шрифт для кэпчи

blocks.txt a+r Заблокированные отправители

captcha.css a+r

compose.css a+r

compose.html a+r

index.html a+r Редирект на страницу Contact

refresh1.png a+r Кнопка на кэпче

refresh2.png a+r Кнопка на кэпче hover

response.css a+r

response.html a+r Автоматически генерируемый файл на основе template.txt

settings.txt a+r Всевозможные опции для программы

template.txt a+r Шаблон для response.html. Вы можете свою template придумать.

tokens.txt a+rw Куда кэпча записывает коды для хранения
/cgi-bin



captcha.py a+rx Кэпча

compose.py a+rx Загружает HTML форму

mail_f.py a+r Программные функции

send.py a+rx Посылает письмо

settings.txt

SYNTAX
Variable = value
 
В settings.txt можно менять значения переменных: путь, URL, цвет кэпчи, фонт кода и тд.
Описание Settings

File Variable Value Значение
compose.py mail_form_width 400 Ширина майл формы

url_compose_css /mail/compose.css
captcha.py code_bg_color (253, 0, 211, 255) Цвет фона кодовой картинки

code_dots_color (0, 0, 0, 255) Цвет точек кодовой картинки

code_dots_n 3000 Количество хаотичных точек на кодовой картинке

code_text_color (255, 255, 255, 255) Цвет букв кодовой картинки

path_font /var/www/html/mail/alfphabet.ttf Шрифт для кодовой картинки

path_mail_dir /var/www/html/mail/

path_tokens /var/www/html/mail/tokens.txt

url_captcha_css /mail/captcha.css

url_mail_dir /mail/ Слаш в конце на всех url_ необходим
send.py N_tokens 50 Количество кодов для хранения в tokens.txt

email_to vasqpupkin@mail.ru Получатель письма из майл формы

path_blocks /var/www/html/mail/blocks.txt

path_response /var/www/html/mail/response.html

path_template /var/www/html/mail/template.txt

sender_name Мой секси сайт Это то, что появится в письме в заголовке “От кого” при получении.

smtp_login moisexisite@gmail.com Логин на Гугле

smtp_password z63T Пароль на Гугле

smtp_port 587 SMTP порт

smtp_security_type TLS Секьюрити: TLS или SSL

smtp_server smtp.gmail.com Имя SMTP сервера

url_open /wordpress/index.php/response URL страницы Response

blocklist.txt

SYNTAX
Header = value
Когда вы получаете письмо со своего сайта, заголовки REMOTE_ADDR, HTTP_USER_AGENT, HTTP_REFERER прикрепляются к концу письма, и, если вы хотите кого-нибудь блокировать, то просто скопируйте строчку с одним или несколькими заголовками и поместите ее в blocklist.txt [2].
[1] Примечания
Path_
Файлы с флагом path_ не обязательно хранить в папке /mail и даже желательно класть их за пределы /var/www/html, чтоб никто через порт 80 не смог их прочитать.

Баян. Найди аккорд по составляющим нотам




По звукам

Включая У   По порядку



Ноты обозначаются в американской традиции от C до B.



http://rockwoodwindowcleaning.com

Friday, January 15, 2016

Как сделать фавикон в ВордПрессе

katy_favicon1

1. Сделай картинку размером 16x16 пикселей и сохрани ее в формате ICO под именем favicon.ico.
katy_favicon2

2. Помести favicon.ico в папку /var/www/html/wordpress.  

3. Пойди в папку со своей активной темой: /var/www/html/wordpress_katy/wp-content/themes/purplequest

4. Открой файл header.php

5. Скопируй в него следующее:


<link rel="icon" href="<?php bloginfo('siteurl'); ?>/favicon.ico" type="image/x-icon" />
<link rel="shortcut icon" href="<?php bloginfo('siteurl'); ?>/favicon.ico" type="image/x-icon" />

katy_favicon4

6. Сохрани.

7. Перезагрузи браузер.

 katy_favicon3

Wednesday, January 13, 2016

Коды к Емайл форме 2

Это коды к статье Емайл формa, кэпча и антиспам.

Download: mail2.tar.gz

captcha.css


body {
margin: 0;
padding: 0;
display:inline-block;
}

body:after{
 display:none;
 content: url(/mail/refresh1.png) url(/mail/refresh2.png);
}

table {
margin: 0;
padding: 0;
height: 40px;
border: 0;
}

td {
margin: 0;
padding: 0;
height: 40px;
border: 0;
outline: 0;
}

img {
display:inline-block;
vertical-align:top;
}

input {
    background:url(/mail/refresh1.png) no-repeat;
    cursor:pointer;
    width: 40px;
    height: 40px;
    border:0 none !important;
}

input:hover {
    background:url(/mail/refresh2.png) no-repeat;
}

input:focus {
    border:none !important;
    outline: 0 !important;
    }

input::-moz-focus-inner {border:0;}


compose.css


body {
background-color: none;
color: white;
font-family: Verdana;
font-size: 14px;
margin: 0;
padding: 0;
}

h1 {
font-family: Tahoma;
font-size: 20px;
}

input {
display:inline-block;
vertical-align:top;
}

table {
margin: 0;
padding: 0;
border: 0;
}

td {
  padding-top: 0;
  padding-bottom: 0;
  display:table-cell;
}

iframe {
margin: 0;
padding: 0;
border: 0;
}


compose.html


<!doctype html>

<html lang="en">
<head>
  <meta charset="utf-8">

  <title>Compose</title>

</head>
<body>

<!-- === Копируй отсюда  === -->
<iframe src="/cgi-bin/compose.py" width="500" height="300" frameBorder="1"></iframe> 
<!-- === и досюда  ========= -->

</body>
</html>


index.html


<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta http-equiv="refresh" content="0;url=/mail/compose.html">
  <link rel="canonical" href="/mail/compose.html"/>
  <title>Home</title>
</head>
<body>

<a href="/mail/compose.html">Home</a>

</body>
</html>


response.css


body {
background-color: darkmagenta  ;
color: white;
font-family: Verdana;
font-size: 14px;
}

h1 {
font-family: Tahoma;
font-size: 20px;
}


response.html


<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <base target="_parent" />
<link rel="stylesheet" type="text/css" href="response.css">

<title>Спасибо</title>

</head>
<body>

<h1>Thank you</h1>Name: aaa<br>Email: a@gmail.com<br>Subject: done<br><br>done

</body>
</html>


settings.txt


path_blocks = /var/www/html/mail/blocks.txt
path_font = /var/www/html/mail/alfphabet.ttf
path_mail_dir = /var/www/html/mail/
path_response = /var/www/html/mail/response.html
path_template = /var/www/html/mail/template.txt
path_tokens = /var/www/html/mail/tokens.txt

N_tokens = 50

url_captcha_css = /mail/captcha.css
url_compose_css =/mail/compose.css
url_mail_dir = /mail/
url_open = /wordpress/index.php/response

code_bg_color = (253, 0, 211, 255)
code_dots_color = (0, 0, 0, 255)
code_dots_n = 3000
code_text_color = (255, 255, 255, 255)

email_to = vasqpupkin@mail.ru
sender_name = Мой секси сайт
smtp_login = moisexisite@gmail.com
smtp_password = T&ldkwtE4P
smtp_port = 587
smtp_security_type = TLS
smtp_server = smtp.gmail.com

mail_form_width = 400


template.txt


<!doctype html>

<html lang="en">
<head>
  <meta charset="utf-8">
  <base target="_parent" />
<link rel="stylesheet" type="text/css" href="response.css">

<title>Спасибо</title>

</head>
<body>

[msg]

</body>
</html>


captcha.py


#!/usr/bin/python
#-*-coding:utf-8-*-

path_settings='/var/www/html/mail/settings.txt'


import cgitb
cgitb.enable()

import cgi, os, base64, ast
import mail_f

path_mail_dir, url_mail_dir, path_tokens, url_captcha_css, code_text_color, code_bg_color, code_dots_color, code_dots_n, path_font = '','','','','','','','',''

if os.path.exists(path_settings):
 f=open(path_settings)
 s=f.read()
 f.close()
 
 L=s.split('\n')
 
 for item in L:
  if '=' in item:
   l=item.split('=')
   var=l[0].strip()
   val=l[1].strip()
   
   if var=='path_mail_dir':
    path_mail_dir = val
   elif var=='url_mail_dir':
    url_mail_dir = val
   elif var=='path_tokens':
    path_tokens = val
   elif var=='url_captcha_css':
    url_captcha_css = val
   elif var=='code_text_color':
    code_text_color  = ast.literal_eval(val)
   elif var=='code_bg_color':
    code_bg_color  = ast.literal_eval(val)
   elif var=='code_dots_color':
    code_dots_color  = ast.literal_eval(val)
   elif var=='code_dots_n':
    code_dots_n  = int(val) 
   elif var=='path_font':
    path_font = val
   
else:
 print 'Content-type: text/html\n\n'
 print '<!doctype html>'
 print 'Not found: settings.txt'
 sys.exit()
 

T = mail_f.Code(path_mail_dir, url_mail_dir, code_text_color, code_bg_color, code_dots_color, code_dots_n, path_font)

path_out=T[0]
code_txt=T[1]


with open(path_out, "rb") as image_file:
    s = base64.b64encode(image_file.read())

with open(path_tokens, "a") as f:
    f.write(code_txt+'\n')

if os.path.exists(path_out):
 os.remove(path_out)

img='<img src="data:image/png;base64,'+s+'" height="40" width="120" alt="" title="Enter code">'


print 'Content-type: text/html\n\n'
print '<!doctype html>'

print '<html lang="en">'
print '<head>'
print '<meta charset="utf-8">'
print '<link rel="stylesheet" type="text/css" href="'+url_captcha_css+'">'
print '<title>Captcha</title>'
print '</head>'
print '<body>'
 
print '<form action="/cgi-bin/captcha.py" method="post">'
print '<table>'
print '<tr><td>'
print img
print '</td><td>'
print '<input type="submit" name="" value="">'
print '</td></tr></table>'
print '</form>'

print '</body>'
print '</html>'


compose.py


#!/usr/bin/python
#-*-coding:utf-8-*-

path_settings='/var/www/html/mail/settings.txt'


import cgitb
cgitb.enable()

import cgi, os, sys

from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont

import mail_f

url_compose_css, mail_form_width = '',''


if os.path.exists(path_settings):
 f=open(path_settings)
 s=f.read()
 f.close()
 
 L=s.split('\n')
 
 for item in L:
  if '=' in item:
   l=item.split('=')
   var=l[0].strip()
   val=l[1].strip()
   
   if var=='url_compose_css':
    url_compose_css = val
   elif var=='mail_form_width':
    mail_form_width  = int(val) 
   
else:
 print 'Content-type: text/html\n\n'
 print '<!doctype html>'
 print 'Not found: settings.txt'
 sys.exit()
 

################################


print 'Content-type: text/html\n\n'

print '<!doctype html>'

print '<html lang="en">'
print '<head>'
print '<meta charset="utf-8">'
print '<link rel="stylesheet" type="text/css" href="'+url_compose_css+'">'
print "<base target='_parent' />"
print '<title>Compose</title>'
print '</head>'
print '<body>'
 

T=mail_f.mail_form_fields()

print '<form style="width: '+str(mail_form_width)+'px;" '+T[6]+'>'
print 'Name:<br>'
print '<input '+T[0]+' style="width: 100%;" type="text"><br><br>'
print 'Email:<br>'
print '<input '+T[1]+' style="width: 100%;" type="text" pattern="[^@]+@[^@]+\.[^@]+"><br><br>'
print 'Subject:<br>'
print '<input '+T[2]+' style="width: 100%;" type="text"><br><br>'
print 'Message:<br>'
print '<textarea '+T[3]+' style="width: 100%; height: '+str(mail_form_width/2.0)+'px;"></textarea><br>'

print '<table width="100%">'
print '<tr valign="middle">'
print '<td align="right">'
print 'Enter&nbsp;code:&nbsp;'
print '</td>'
print '<td>'
print '<input '+T[4]+' maxlength="6" size="7" type="text" pattern="[A-Z]{6}">'
print '&nbsp;</td>'
print '<td align="right">'
print '     <table>'
print '     <tr>'
print '     <td>'
print '     <iframe '+T[5]+' marginwidth="0" marginheight="0" hspace="0"  vspace="0" frameborder="0" scrolling="no" height="45" width="160"></iframe>'
print '     </td>'
print '     </tr>'
print '     </table>'
print '</td>'
print '</tr>'
print '<tr>'
print '<td></td>'
print '<td></td>'
print '<td align="right"><input value="Submit" type="submit"></td>'
print '</tr>'
print '</table>'
print '</form>'
print '</body>'
print '</html>'


mail_f.py


#!/usr/bin/python
#-*-coding:utf-8-*-

""" Функции для Мэил"""

from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont

import random, string


def mail_form_fields():
 return ('name="name"', 'name="from"', 'name="subject"', 'name="message"', 'name="code"', 'src="/cgi-bin/captcha.py"', 'action="/cgi-bin/send.py" method="post"')


def Code(path_mail_dir, url_mail_dir, code_text_color, code_bg_color, code_dots_color, code_dots_n, path_font):
 """Random Code Generator"""
 size=6
 chars=string.ascii_uppercase
 code_txt=''.join(random.choice(chars) for _ in range(size))

 # Random string -----------------------

 img_width=120
 img_height=40
 img_font_size = 20
 img_padding=20


 path_out=path_mail_dir+code_txt+'.png'

 # Code Text  -------------------------

 img = Image.new("RGBA", (img_width, img_height), code_bg_color)
 draw = ImageDraw.Draw(img)


 i=0
 while i< code_dots_n:
  draw.point((random.randrange(5, img_width-5) , random.randrange(5, img_height-5) ), code_dots_color)
  i=i+1

 font = ImageFont.truetype(path_font, img_font_size)
 w, h = draw.textsize(code_txt, font)
 img_padding_hor=(img_width-w)/2.0
 img_padding_vert=(img_height-h)/2.0

 draw.text((img_padding_hor, img_padding_vert), code_txt, fill=code_text_color, font=font)

 img.save(path_out)
 
 return(path_out, code_txt)


send.py


#!/usr/bin/python
#-*-coding:utf-8-*-

path_settings='/var/www/html/mail/settings.txt'


import cgitb
cgitb.enable()

import cgi
import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
import os, time, re, sys

sender_name, email_to , smtp_security_type, smtp_server , smtp_port, smtp_login , smtp_password, path_template, path_response, path_blocks, url_compose_css, url_open , path_tokens, N_tokens = '','','','','','','','','','','','','',''


form = cgi.FieldStorage()
Errors=[]

Name, From, Subject, Message, Code = '','','','', ''
a, b, c, d = '','','',''
http_user_agent, remote_addr, http_referer = '', '', ''

if os.path.exists(path_settings):
 f=open(path_settings)
 s=f.read()
 f.close()
 
 L=s.split('\n')
 
 for item in L:
  if '=' in item:
   l=item.split('=')
   var=l[0].strip()
   val=l[1].strip()
   
   if var=='sender_name':
    sender_name = val
   elif var=='email_to':
    email_to = val
   elif var=='smtp_security_type':
    smtp_security_type = val
   elif var=='smtp_server':
    smtp_server = val
   elif var=='smtp_port':
    smtp_port = int(val) 
   elif var=='smtp_login':
    smtp_login = val
   elif var=='smtp_password':
    smtp_password = val
   elif var=='path_template':
    path_template = val
   elif var=='path_response':
    path_response = val
   elif var=='path_blocks':
    path_blocks = val
   elif var=='url_compose_css':
    url_compose_css = val
   elif var=='url_open':
    url_open = val
   elif var=='path_tokens':
    path_tokens = val
   elif var=='N_tokens':
    N_tokens = int(val)

else:
 print 'Content-type: text/html\n\n'
 print '<!doctype html>'
 print 'Not found: settings.txt'
 sys.exit()


try:
 http_user_agent=cgi.escape(os.environ["HTTP_USER_AGENT"])
except:
 http_user_agent='none'
try:
 remote_addr=cgi.escape(os.environ["REMOTE_ADDR"])
except:
 remote_addr='none'
try:
 http_referer=cgi.escape(os.environ["HTTP_REFERER"])
except:
 http_referer='none'
 
 
 

try:
 Name=form['name'].value.strip()
 Name=re.sub(r'<[^>]*?>', '', Name)
 a='Name: '+ Name
 if len(Name)==0:
  Errors.append('Name: none')
except:
 Errors.append('Name: none')
try:
 From = form['from'].value.strip()
 From = re.sub(r'<[^>]*?>', '', From)
 b='Email: '+ From
except:
 Errors.append('Email: none')
try:
 Subject=form['subject'].value.strip()
 Subject=re.sub(r'<[^>]*?>', '', Subject)
 c='Subject: '+ Subject
except:
 Errors.append('Subject: none')
try:
 Message = form['message'].value.strip()
 #Message = re.sub(r'<[^>]*?>', '', Message)
 
 d= Message.strip()
 

except:
 Errors.append('Message: none')

try:
 Code = form['code'].value.strip()
except:
 Errors.append('Error: code mismatch')


if len(Errors) == 0:
 EMAIL_REGEX = re.compile(r"[^@]+@[^@]+\.[^@]+")
 if not EMAIL_REGEX.match(From):
  Errors.append('Email is invalid: '+From)

if len(Errors) == 0:
 if os.path.exists(path_tokens)==False:
  Errors.append('Error: code mismatch')
 else:
  f=open(path_tokens, 'r')
  s=f.read()
  f.close()
  
  L=s.split()
  
  if Code not in L:
   Errors.append('Error: code mismatch')
  L.reverse()
  i=0
  l=[]
  OUT=[]
  for line in L:
   if i < N_tokens:
    if len(line)>0:
     OUT.append(line)
     i=i+1
  OUT.reverse()
  if len(OUT) >0:
   f=open(path_tokens, 'w')
   for line in OUT:
    f.write(line+'\n')
   f.close()



html='<h1>Thank you</h1>'+a+'<br>'+b+'<br>'+c+'<br>'*2+d.replace('\n', '<br>')

if len(Errors) == 0:
 try:
  msg = MIMEMultipart()
  msg['From'] = sender_name+' <'+smtp_login+'>'
  msg['Reply-To'] = Name+' <'+From+'>'
  msg['To'] = email_to
  msg['Subject'] = Subject
  msg['Date'] = time.strftime("%c")
  
  Message= \
Message+'\n\n'\
+'HTTP_USER_AGENT = '+http_user_agent+'\n'\
+'REMOTE_ADDR = '+remote_addr+'\n'\
+'HTTP_REFERER = '+http_referer+'\n\n'\
  
  msg.attach(MIMEText(Message, 'plain'))

  # Опции для SMTP сервера ---------
  
  if smtp_security_type =='TLS':
   server = smtplib.SMTP(smtp_server, smtp_port)
   server.starttls()
  
  if smtp_security_type =='SSL':
   server = smtplib.SMTP_SSL(smtp_server, smtp_port)
   
  server.ehlo()
  server.login(smtp_login, smtp_password)
  text = msg.as_string()
  
  # Checking blocks.txt ----------
  block='no'
  if os.path.exists(path_blocks):
   f=open(path_blocks, 'r')
   s=f.read()
   f.close()
   
   H=[http_user_agent, remote_addr, http_referer] # Headers
   L=s.split('\n')
   
   for item in L:
    h=''
    v=''
    if '=' in item:
     l=item.split('=')
     h=l[0].strip()
     v=l[1].strip()
     if v in H:
      block='yes'
      break
      
  if block=='no':
   server.sendmail(From, email_to, text)
   
  server.close()
  
  #----------------------------------
  
 except Exception as e:
  
  i=0
  for item in e:
   
   item=str(item)
   if i==0:
    item='Error: '+item
   
   item=item.replace('<', '&lt;')
   item=item.replace('>', '&gt;')
   
   Errors.append(item)
   i=1+1

if len(Errors)>0:
 html='<h1>Please correct</h1>'
 for item in Errors:
  html=html+item+'<br>'
 html=html+'<br>Email delivery failed.'

f=open(path_template, 'r')
s=f.read()
f.close()

s=s.replace('[msg]', html)

f=open(path_response, 'w')
f.write(s)
f.close()

print 'Content-type: text/html\n\n'
print '<meta http-equiv="refresh" content="0;url='+url_open+'">'
print '<link rel="canonical" href="'+url_open+'"/>'


iframe.html


<html>
<head>
<meta content="text/html; charset=UTF-8" http-equiv="content-type">
<title>Response</title>
</head>
<body>
 
<!-- === Копируй отсюда  === -->
<iframe src="/mail/response.html" width="500" height="300" frameBorder="0"></iframe> 
<!-- === и досюда  ========= -->

</body>
</html>