Есть вопрос?
Зайди на форум

Поиск на сайте: Advanced

Denix - новый дистрибутив Linux. Русификация Ubuntu и установка кодеков

dkws.org.ua
Форум сайта dkws.org.ua
 
Главная    ТемыТемы    АльбомАльбом    РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Драма с SSL, или XUL спасает невысыпающегося программиста!

 
Начать новую тему Ответить на тему    Список форумов dkws.org.ua -> Программирование/C/C++
 
Автор Сообщение
Anderson

Завсегдатай


Зарегистрирован: 08.07.2006
Сообщения: 642
Откуда: localhost

СообщениеДобавлено: Сб Июн 26, 2010 10:13 pm    Заголовок сообщения: Драма с SSL, или XUL спасает невысыпающегося программиста!
Ответить с цитатой

Итак, поступил мне заказ. Есть SSL-страница под логином и паролем с отчетами, которые скачиваются тоже по SSL. Линки засунуты в onClick в *быдляцкую* функцию отдавания файла. Нужно одним кликом скачивать все файлы.

Задание довольно простое, не так ли?

Но не тут-то было... Четыре дня почти день и ночь парился. Итак:

1) Решил файлы зиповать. Вырезал линки через свой скрипт в JS-закладке и отправлял на свой фришный хостинг на byethost, чтобы там зазиповать и скачать.
Неудача: Оттуда файлы хрен заберешь, т.к. скрипт на хостинге не почему-то не может залогинится по HTTPS, плюс с айпой в куках, сессиями и сотнями редиректов геморой. Сколько не пробовал - только баги в PHP повсплывали. А если б и получилось, траффик вдвойне тратится.

2) Нарыл библу для зипования файлов прямо в памяти с помощью JS (!). Зипованные отдавал как "location.href='application/zip;base64,'+zip1.generate();". Почти рабочий метод, только ексепшены по нехватке памяти.

Начал нервничать. Начало казатся, что это невозможно. Ставить левые плагины нельзя. И тут... Наконец-то правильно погуглил.

http://www.captain.at/programming/xul/

Оказывается, при правильной настройке привилегий мозилка умеет писать в файлы и папки, а также читать из них. Я прозрел.

Вот, кажется, и все. Готовый исходник, который будет в закладке, привожу ниже.

Код:
javascript:

function save(fname, content) {
   try {
      netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
   } catch (e) {
      alert("Permission to save file was denied.");
   }
   var file = Components.classes["@mozilla.org/file/local;1"]
      .createInstance(Components.interfaces.nsILocalFile);
   file.initWithPath( fname );
   if ( file.exists() == false ) {
      file.create( Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 420 );
   }
   var outputStream = Components.classes["@mozilla.org/network/file-output-stream;1"]
      .createInstance( Components.interfaces.nsIFileOutputStream );
   outputStream.init( file, 0x04 | 0x08 | 0x20, 420, 0 );
   var result = outputStream.write( content, content.length );
   outputStream.close();

}

var dir=prompt('Please enter directory where to put downloaded files: ', 'C:\\invoices');

var total='';

var k=0;
var t='';
var newlinks = new Array();
links=document.getElementsByTagName('a'); for(i=0;i<links.length;i++) {
if(links[i].href.indexOf('viewbill/invoices#')>0) { var ev=''+links[i].onclick; var start=ev.indexOf('Popup("')+7; var end=ev.indexOf('", "pdf');
t=''+ev.substr(start,end-start); if(t!='') { newlinks[k]=t; k++; } } }

/*alert('Links: '+k+'\n'+newlinks.join(';'));*/

netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead UniversalBrowserWrite");

var i=0;

document.write("<html><body style='background-color: #e0e0e0'><h1>Downloading "+k+" files into "+dir+" ...</h1></body></html>");

function req()
{
   if (window.XMLHttpRequest) var xmlhttp=new XMLHttpRequest();
   else var xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");

   document.write('<b style="color: green">Downloading '+(i+1)+' of '+k+' ...');

   xmlhttp.open("GET",'https://filexfer.ups.com/billinghostapp?FileIdentifier='+newlinks[i],false);
   xmlhttp.overrideMimeType('text/plain; charset=x-user-defined');
   xmlhttp.send();

   document.write('Done! </b><br />\n');

   var r=xmlhttp.responseText;
   disposition=xmlhttp.getResponseHeader("Content-Disposition");
   fname=disposition.substr(disposition.indexOf('filename=')+9);
   save(dir+'\\'+fname, r);
}

for(i=0;i<k;i++) req();


Функция save решает.
ВАЖНО: Для работы мезанизма установки привилегий в конфигах необходимо поставить в "about:config" значение "signed.applets.codebase_principal_support" равным "true".

Детали: http://www.mozilla.org/projects/security/components/signed-scripts.html

В очередной раз убедился в превосходстве Мозиллы. Поклонялся им и далее буду поклонятся. Молодцы они!
_________________
ArchLinux + Enlightenment 17 (E17)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение anderson.dunai@gmail.com Моб. телефон ICQ Number
Anton99

Neo


Зарегистрирован: 26.11.2006
Сообщения: 1676

СообщениеДобавлено: Вс Июн 27, 2010 3:56 am    Заголовок сообщения:
Ответить с цитатой

Я ничего не понял, но код красивый. :3
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
олег алексеевич

Тысячник


Зарегистрирован: 18.01.2009
Сообщения: 1365
Откуда: ua Кропивницкий

СообщениеДобавлено: Вс Июн 27, 2010 6:24 am    Заголовок сообщения:
Ответить с цитатой

на хостинге,где мой сайт,нужно платить за SSL сертификаты.
Цитата:

Неудача: Оттуда файлы хрен заберешь, т.к. скрипт на хостинге не почему-то не может залогинится по HTTPS, плюс с айпой в куках, сессиями и сотнями редиректов геморой. Сколько не пробовал - только баги в PHP повсплывали.

_________________
помощь в личку платно.Удалю вирус,шелл с сайта Джумла, Битрикс .
Создам плагин , модуль под заказ для VirtueMart , JoomShopping
Вернуться к началу
Посмотреть профиль Отправить личное сообщение ICQ Number
lem

Участник тусовки


Зарегистрирован: 21.09.2009
Сообщения: 118
Откуда: ua Днепропетровск

СообщениеДобавлено: Вс Июн 27, 2010 3:07 pm    Заголовок сообщения: Re: Драма с SSL, или XUL спасает невысыпающегося программист
Ответить с цитатой

В закладки Smile
Код:
try {
   netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
}
catch (e) {
      alert("Permission to save file was denied.");
}

Решение привязано только к мозилле?
Anderson писал(а):

В очередной раз убедился в превосходстве Мозиллы. Поклонялся им и далее буду поклонятся. Молодцы они!

А еще + такие аддоны как - firebug, web developer, greasemonkey, и куча других - превосходный инструмент...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Показать сообщения:   
Начать новую тему Ответить на тему    Список форумов dkws.org.ua -> Программирование/C/C++ Часовой пояс: GMT
Страница 1 из 1
 Главная страница сайта
 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
© Колисниченко Денис