django-tables2 and django-filters with Class-Based Views in Django

Today i tried to combien django-tables2 and django-filters. It worked just fine. All you need is to override get_queryset() and get_context_data()

class TicketListView(SingleTableView):
    model = Ticket
    table_class = TicketTable
    template_name = 'index.html'
    table_pagination = {'per_page': 25}

    def get_queryset(self):
        qs = super(TicketListView, self).get_queryset()
        self.filter = TicketFilter(self.request.GET, queryset=qs)
        return self.filter.qs

    def get_context_data(self, **kwargs):
        cd = super(TicketListView, self).get_context_data(**kwargs)
        cd['filter'] = self.filter
        return cd

PyKCS11 and M2Crypto conflict

When using both PyKCS11 module and M2Crypto it may happen that user already logged in after using engine.

        Engine.load_dynamic()
        e = Engine.Engine('dynamic')
        e.ctrl_cmd_string('SO_PATH', PKCS11_ENGINE_PATH)
        #e.ctrl_cmd_string('ID', 'aladdin')
        e.ctrl_cmd_string('LIST_ADD', '1')
        e.ctrl_cmd_string('LOAD', None)
        e.ctrl_cmd_string('MODULE_PATH', PKCS11_LIBRARY_PATH)
        a = Engine.Engine('pkcs11')
        a.init()
        # Hex-encoded key id should be provided to that function
        k = a.load_private_key(hexlify(keyid), pin=user_pin)
        req = X509.Request()

# .... some work

        a.finish()
        e.finish()
        return reqpem

 

I tried to resolve it these ways:

Code above gave me segfault. It was due to python’s garbage collector tried to free key that is not in use. So i tried to insert del k before a.finish()

That gave me again the same problem (already logged in). Finally i found solution: I removed a.finish(), e.finish(), del k code parts and just made a call of Engine.cleanup() function.

That’s it.

PyKCS11 key pair generation

It’s not written in documentation the way how to generate key pair on security device.  Session class has generateKeyPair() function that has 2 arguments — templatePub and templatePriv. Template is simply a sequence of key-value pairs.

Let’s make a higher level wrapper for easier key generation:

    import PyKCS11
    
    KEY_LEN = 1024
    EXPONENT = (1,0,1)
    SLOT = 0

    def generate_keypair(self, session, length, exponent):
        tPub = ( # Public key template
            (PyKCS11.LowLevel.CKA_CLASS, PyKCS11.LowLevel.CKO_PUBLIC_KEY),
            (PyKCS11.LowLevel.CKA_TOKEN, True),
            (PyKCS11.LowLevel.CKA_ENCRYPT, True),
            (PyKCS11.LowLevel.CKA_VERIFY, True),
            (PyKCS11.LowLevel.CKA_WRAP, True),
            (PyKCS11.LowLevel.CKA_MODULUS_BITS, length),
            (PyKCS11.LowLevel.CKA_PUBLIC_EXPONENT, exponent))
        tPriv = ( # Private key template
            (PyKCS11.LowLevel.CKA_CLASS, PyKCS11.LowLevel.CKO_PRIVATE_KEY),
            (PyKCS11.LowLevel.CKA_TOKEN, True),
            (PyKCS11.LowLevel.CKA_PRIVATE, True),
            (PyKCS11.LowLevel.CKA_SENSITIVE, True),
            (PyKCS11.LowLevel.CKA_DECRYPT, True),
            (PyKCS11.LowLevel.CKA_SIGN, True),
            (PyKCS11.LowLevel.CKA_UNWRAP, True))
        session.generateKeyPair(tPub, tPriv)

   
    lib = PyKCS11.PyKCS11Lib()
    lib.load('/usr/lib/libeTPkcs11.so')
    s = lib.openSession(SLOT, PyKCS11.CKF_RW_SESSION) # !!! We need read/write session to generate key pair
    s.login() # user privileges are enough
    generate_key_pair(s, KEY_LEN, EXPONENT)
    s.closeSession()

 
Hope this will be helpful ;)

Where are you Heikki Toivonen?

Some parts of M2Crypto are not working properly. I tried to write Heikki Toivonen (developer and maintainer of M2Crypto) but didn’t get answer from him. At the same time M2Crypto is a very nice project so i believe that it needs better documentation. So recently I’m going to send emails to people who did forks of M2Crypto packages on GitHub and other development sites to make main fork of M2Crypto.

Говнокод #1

Недавно переделывал одну программку, наткнулся на такой вот кусок кода.

function Temission_form.ConvertTimeCNT(s: string): string;
var
  i: integer;
begin
  for i:=0 to Length(s) do
  begin
     if s[i] = ':' then
     begin
       delete(s, i, 1);
       if i = 2 then
         s:='0'+s;
     end;
  end;
  delete(s, 5, 2);
  Result:=s;
end;

Суть заключается в том, что таким способом удаляются двоеточия из представления времени и добавляется ноль в начало, если значение часов состоит из одной цифры!

Полиция внутри. Воспоминания

2001 год, общежитие Туркестанского КТЛ, 11 класс. Здание лицея состояло из трёх двухэтажных корпусов, два этажа первого состояли полностью из общежития, во втором на первом этаже была столовая, кабинет директора, зама, приёмная, буфет и учебные классы. Наше общежитие располагалось в третьем корпусе, на первом этаже которого располагались также учебные классы и лаборатории. На втором этаже жили мы с «ашниками» и была столовая где трапезничали воспитатели и учителя (большинство последних, впрочем, снимали квартиры). Ученики туда не заходили, но как-то раз там побывать довелось. У «ашников» был воспитатель по имени Cengiz Ayten (Дженгиз Айтен, при этом «дж» читается как звонкое «ч», а «е» после «т» твёрже, чем в русском). Столовая состояла из кухни, где готовила еду женщина лет эдак пятидесяти по имени Гульжан, ну и помещения, где воспитатели принимали пищу. Я обратил внимание на небольшую картонную коробочку с небольшой прорезью в крышке и спросил:

- Для чего эта коробочка?

На что Дженгиз-аби (у турок так принято называть старших по возрасту, с турецкого «аби» переводится как «старший брат»):

- Туда мы складываем талоны на еду. Не все питаются по три раза в день, некоторые — по два, если не успевают, поэтому, мы покупаем талоны, и кладём в эту коробочку.

- Так оттуда же можно вытащить талон и снова им воспользоваться.

- Ну, не все так просто: есть же полиция.

- Какая полиция? Здесь нет никакой полиции, да и никто не вызовет её.

- Нет, — улыбнулся Дженгиз-аби, — я говорю о полиции внутри человека.

Золотые слова. Побольше бы таких людей.

Расшифровка 1cv7.dba на Python

Python вызывает умиление, когда я вижу длинные куски кода, написанные на других языках. Итак, файл, указанный в топике используется в 1C версии 7 для хранения настроек подключения к серверу базы данных. Файл не шифруется, а всего лишь выполняется операция XOR над строкой подключения и строкой-ключом. Соответственно, для расшифровки применяется повторная операция XOR с той же строкой-ключом. Строка эта известная: «19465912879oiuxc ensdfaiuo3i73798kjl».

Вот скрипт для Python 3, выполняющий декодирование строки подключения:

from itertools import cycle

key = b"19465912879oiuxc ensdfaiuo3i73798kjl"
d = open('1Cv7.DBA', 'rb').read()
r = bytes([a^b for a, b in zip(d, cycle(key))])

print(r)

В модуле itertools есть генератор cycle, который выдает по одному значению из последовательности, а когда она заканчивается — начинает выдавать их сначала. Благодаря этому можно наложить нужное количество раз ключ на зашифрованный текст, после чего, выполняя операцию XOR над очередными символами ключа и зашифрованного текста получаем строку подключения, где можно найти забытый нами пароль. Python лаконичен, не правда ли?

Разминка с Прологом

На днях был свидетелем того, как одна моя приятельница играет в игру «Тайны старого замка». В игре встречается такая головоломка:

Круг с четырьмя отверстиями, в каждом отверстии отображена одна из букв N, S, W, E. Имеются две ручки управления кругом: первая вращает круг по часовой стрелке, вторая переключает  все буквы круга кроме первой по следующей системе N — E — S — W — N — E — … В результате, при помощи манипуляций необходимо выстроить их как в компасе — сверху N, снизу S, слева W, справа E.

Читать далее

Скрытые файлы после вируса

Зловредное ПО, распространяющееся через съёмные диски порой любит скрывать папки и файлы, вставляя одноимённые ярлыки или копии себя. После очистки съёмного диска эти подставные удаляются, а файлы остаются скрытыми. Притом, средствами проводника снять атрибут «скрытый» нельзя, ибо флажок неактивен. Для их снятия можно воспользоваться какими-нибудь файловыми менеджерами вроде Far Manager или Total Commander. Если же под рукой этого нет, то можно сделать так:

1) Открываем блокнот

2) Пишем туда одну строчкy:

attrib -h -s /s /d

3) Сохраняем файл с расширением bat

4) Копируем его на флешку

5) Запускаем с флешки

Сей способ я придумал, для одного очень неопытного пользователя. Оставил у него на рабочем столе, и рекомендовал употреблять в вышеописанных случаях.