Отключение Apache авторизации в поддиректории

Если в какой-то директории лежит .htaccess, в котором указаны Auth  директивы Apache, то при переходе по ссылке на любую из вложенных директорий также будут запрашиваться логин и пароль.

Если для каких-то директорий надо сделать исключение, то в них надо положить .htaccess примерного такого вида:

Allow From All

Satisfy Any
Рубрика: UNIX-like | Добавить комментарий

tinymce в richFaces и google maps

Столкнулся с проблемкой, решение найти несложно, но готовый рецепт все же лучше. Если мы используем  rich:editor  для редактирования страниц и пытаемся вставить  html код  ifram’а (например, google maps), то столкнемся с тем, что cleaner  редактора его вычистит как незнакомый тег. Добавляем в конфигурацию редактора строку:

<f:param name="extended_valid_elements" value="iframe[src|width|height|name|align|frameborder|scrolling|marginheight|marginwidth]" />

и все работает :)

Рубрика: Programming | Добавить комментарий

Подпись пакетов DotDeb в Ubuntu

В один прекрасный день при апдейте системы получил следующее:

Reading package lists… Done
W: GPG error: http://packages.dotdeb.org lenny Release: The following signatures couldn’t be verified because the public key is not available: NO_PUBKEY E9C74FEEA2098A6E
W: You may want to run apt-get update to correct these problems

Оказывается, отныне и впредь надо установить у себя в систему ключ:

gpg --keyserver keys.gnupg.net --recv-key 89DF5277
gpg -a --export 89DF5277 | sudo apt-key add -
Рубрика: UNIX-like | Добавить комментарий

Транслитерация на Java

Простейший вариант транслитератора с русского языка на латинские буквы на Java. Все символы, не относящиеся к русскому алфавиту оставляет как есть. Любым комментариям  буду благодарен :)

public class Transliterator {

    private static final Map<Character, String> charMap = new HashMap<Character, String>();

    static {
        charMap.put('А', "A");
        charMap.put('Б', "B");
        charMap.put('В', "V");
        charMap.put('Г', "G");
        charMap.put('Д', "D");
        charMap.put('Е', "E");
        charMap.put('Ё', "E");
        charMap.put('Ж', "Zh");
        charMap.put('З', "Z");
        charMap.put('И', "I");
        charMap.put('Й', "I");
        charMap.put('К', "K");
        charMap.put('Л', "L");
        charMap.put('М', "M");
        charMap.put('Н', "N");
        charMap.put('О', "O");
        charMap.put('П', "P");
        charMap.put('Р', "R");
        charMap.put('С', "S");
        charMap.put('Т', "T");
        charMap.put('У', "U");
        charMap.put('Ф', "F");
        charMap.put('Х', "H");
        charMap.put('Ц', "C");
        charMap.put('Ч', "Ch");
        charMap.put('Ш', "Sh");
        charMap.put('Щ', "Sh");
        charMap.put('Ъ', "'");
        charMap.put('Ы', "Y");
        charMap.put('Ь', "'");
        charMap.put('Э', "E");
        charMap.put('Ю', "U");
        charMap.put('Я', "Ya");
        charMap.put('а', "a");
        charMap.put('б', "b");
        charMap.put('в', "v");
        charMap.put('г', "g");
        charMap.put('д', "d");
        charMap.put('е', "e");
        charMap.put('ё', "e");
        charMap.put('ж', "zh");
        charMap.put('з', "z");
        charMap.put('и', "i");
        charMap.put('й', "i");
        charMap.put('к', "k");
        charMap.put('л', "l");
        charMap.put('м', "m");
        charMap.put('н', "n");
        charMap.put('о', "o");
        charMap.put('п', "p");
        charMap.put('р', "r");
        charMap.put('с', "s");
        charMap.put('т', "t");
        charMap.put('у', "u");
        charMap.put('ф', "f");
        charMap.put('х', "h");
        charMap.put('ц', "c");
        charMap.put('ч', "ch");
        charMap.put('ш', "sh");
        charMap.put('щ', "sh");
        charMap.put('ъ', "'");
        charMap.put('ы', "y");
        charMap.put('ь', "'");
        charMap.put('э', "e");
        charMap.put('ю', "u");
        charMap.put('я', "ya");

    }

    public String transliterate(String string) {
        StringBuilder transliteratedString = new StringBuilder();
        for (int i = 0; i < string.length(); i++) {
            Character ch = string.charAt(i);
            String charFromMap = charMap.get(ch);
            if (charFromMap == null) {
                transliteratedString.append(ch);
            } else {
                transliteratedString.append(charFromMap);
            }
        }
        return transliteratedString.toString();
    }
}
Рубрика: Programming | Добавить комментарий

Java Mail и Gmail

Встала задача – из программы на Java отправлять почту, используя учетную запись на Google mail. Раньше использовался SMTP на локалхосте и все прекрасно работало примерно так:

try {
String emailTo = "vasya@pupkin.ru";
String emailCopyTo = "another_vasya@pupkin.ru"

send("from_vasya@pupkin.ru", emailTo, "Happy letter from vasya!", "Вася любит Вас!");
send("from_vasya@pupkin.ru", emailCopyTo, "Happy letter from vasya!", "Вася любит Вас!");

} catch (Exception exp) {
exp.printStackTrace(System.out);
}

Сама send:

public void send(String from, String to, String subject,
String content) throws AddressException, MessagingException {

java.util.Properties props = System.getProperties();
javax.mail.Session session = javax.mail.Session.getDefaultInstance(props, null);

Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(from));
msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
msg.setSubject(subject);
msg.setText(content);
msg.setHeader("Content-type", "text/html; charset=UTF-8");

Transport tr = session.getTransport("smtp");
tr.connect("localhost", 25);
msg.saveChanges();

tr.sendMessage(msg, msg.getAllRecipients());
tr.close();
}

Однако, стоило вместо локалхоста прописать гугловские настройки, стал вываливаться страшный-страшный экспепшн:

An error has occured during email sending
com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first. d8sm15873369fga.1
at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1515)
at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:1054)
at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:634)
at softshorewar.PageBillItem.send(PageBillItem.java:400)
at softshorewar.PageBillItem.buttonNextStage_action(PageBillItem.java:363)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.sun.el.parser.AstValue.invoke(AstValue.java:187)
at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
at com.sun.rave.web.ui.appbase.faces.ActionListenerImpl.processAction(ActionListenerImpl.java:91)
at javax.faces.component.UICommand.broadcast(UICommand.java:387)
at com.sun.webui.jsf.component.WebuiCommand.broadcast(WebuiCommand.java:160)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:475)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:756)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at com.sun.faces.extensions.avatar.lifecycle.PartialTraversalLifecycle.execute(PartialTraversalLifecycle.java:94)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:265)
at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:427)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:333)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
at com.sun.webui.jsf.util.UploadFilter.doFilter(UploadFilter.java:267)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:246)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:313)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:287)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:218)
...

Дело оказалось в том, что  Gmail у нас использует  TLS, и это надо включить строкой:

props.put("mail.smtp.starttls.enable", "true");

Финальный вид send с гугловскими настройками:

public void send(String from, String to, String subject,
String content) throws AddressException, MessagingException {

java.util.Properties props = System.getProperties();
props.put("mail.smtp.starttls.enable", "true");
javax.mail.Session session = javax.mail.Session.getDefaultInstance(props, null);

Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(from));
msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
msg.setSubject(subject);
msg.setText(content);
msg.setHeader("Content-type", "text/html; charset=UTF-8");

Transport tr = session.getTransport("smtp");
tr.connect("smtp.gmail.com", 587, "your_login", "your_pass");
msg.saveChanges();      // don't forget this
tr.sendMessage(msg, msg.getAllRecipients());
tr.close();
}
Рубрика: Programming | Добавить комментарий