From d0c2759c41c4d1e605ac1bfd75418122bd4815fc Mon Sep 17 00:00:00 2001 From: coffeedogs Date: Thu, 28 Jun 2018 12:42:05 +0100 Subject: [PATCH 01/18] Fix issue #1288 --- src/bitmessagecli.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/bitmessagecli.py b/src/bitmessagecli.py index 69d24841..02fed7e9 100644 --- a/src/bitmessagecli.py +++ b/src/bitmessagecli.py @@ -572,7 +572,7 @@ def listAdd(): if len(label) > 19: label = label[:16] + '...' - print ''.join( + print ''.join([ ' |', str(addNum).ljust(3), '|', @@ -584,13 +584,13 @@ def listAdd(): '|', enabled.ljust(7), '|', - ) + ]) - print ''.join( + print ''.join([ ' ', 74 * '-', '\n', - ) + ]) def genAdd(lbl, deterministic, passphrase, numOfAdd, addVNum, streamNum, ripe): @@ -675,11 +675,11 @@ def attachment(): round(invSize, 2) # Rounds to two decimal places if invSize > 500.0: # If over 500KB - print ''.join( + print ''.join([ '\n WARNING:The file that you are trying to attach is ', invSize, 'KB and will take considerable time to send.\n' - ) + ]) uInput = userInput('Are you sure you still want to attach it, (Y)es or (N)o?').lower() if uInput != "y": @@ -931,11 +931,11 @@ def inbox(unreadOnly=False): print ' To:', getLabelForAddress(message['toAddress']) # Get the to address print ' From:', getLabelForAddress(message['fromAddress']) # Get the from address print ' Subject:', message['subject'].decode('base64') # Get the subject - print ''.join( + print ''.join([ ' Received:', datetime.datetime.fromtimestamp( float(message['receivedTime'])).strftime('%Y-%m-%d %H:%M:%S'), - ) + ]) messagesPrinted += 1 if not message['read']: messagesUnread += 1 @@ -970,11 +970,11 @@ def outbox(): print ' Subject:', outboxMessages['sentMessages'][msgNum]['subject'].decode('base64') # Get the subject print ' Status:', outboxMessages['sentMessages'][msgNum]['status'] # Get the subject - print ''.join( + print ''.join([ ' Last Action Time:', datetime.datetime.fromtimestamp( float(outboxMessages['sentMessages'][msgNum]['lastActionTime'])).strftime('%Y-%m-%d %H:%M:%S'), - ) + ]) if msgNum % 20 == 0 and msgNum != 0: userInput('(Press Enter to continue or type (Exit) to return to the main menu.)').lower() # uInput = @@ -1040,11 +1040,11 @@ def readSentMsg(msgNum): print ' From:', getLabelForAddress(outboxMessages['sentMessages'][msgNum]['fromAddress']) print ' Subject:', outboxMessages['sentMessages'][msgNum]['subject'].decode('base64') # Get the subject print ' Status:', outboxMessages['sentMessages'][msgNum]['status'] # Get the subject - print ''.join( + print ''.join([ ' Last Action Time:', datetime.datetime.fromtimestamp( float(outboxMessages['sentMessages'][msgNum]['lastActionTime'])).strftime('%Y-%m-%d %H:%M:%S'), - ) + ]) print ' Message:\n' print message # inboxMessages['inboxMessages'][msgNum]['message'].decode('base64') print ' ' @@ -1101,10 +1101,10 @@ def readMsg(msgNum): # Get the from address print ' From:', getLabelForAddress(inboxMessages['inboxMessages'][msgNum]['fromAddress']) print ' Subject:', inboxMessages['inboxMessages'][msgNum]['subject'].decode('base64') # Get the subject - print ''.join( + print ''.join([ ' Received:', datetime.datetime.fromtimestamp( float(inboxMessages['inboxMessages'][msgNum]['receivedTime'])).strftime('%Y-%m-%d %H:%M:%S'), - ) + ]) print ' Message:\n' print message # inboxMessages['inboxMessages'][msgNum]['message'].decode('base64') print ' ' From da3e72186d48da35313b2e406dd8fafbfc38eb30 Mon Sep 17 00:00:00 2001 From: PyBitmessage Translations Date: Thu, 28 Jun 2018 14:21:11 +0200 Subject: [PATCH 02/18] Auto-updated language ru from transifex --- src/translations/bitmessage_ru.qm | Bin 92911 -> 86534 bytes src/translations/bitmessage_ru.ts | 603 +++++++++++++++--------------- 2 files changed, 294 insertions(+), 309 deletions(-) diff --git a/src/translations/bitmessage_ru.qm b/src/translations/bitmessage_ru.qm index 53d58f012d8e96cf2653679d120850ea71268188..8c0269b9e18ecc2f219729d227bb411c4f72f23e 100644 GIT binary patch delta 4158 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 Az5oCK delta 9281 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 L+c#r4W4HeSKbPkQ diff --git a/src/translations/bitmessage_ru.ts b/src/translations/bitmessage_ru.ts index ffb2eac9..4a80f62e 100644 --- a/src/translations/bitmessage_ru.ts +++ b/src/translations/bitmessage_ru.ts @@ -112,7 +112,7 @@ Please type the desired email address (including @mailchuck.com) below: Mailchuck - + # You can use this to configure your email gateway account # Uncomment the setting you want to use # Here are the options: @@ -153,166 +153,172 @@ Please type the desired email address (including @mailchuck.com) below: # the money directly. To turn it off again, set "feeamount" to 0. Requires # subscription. - # Эти параметры можно использовать для настройки аккаунта email-шлюза -# Раскомментируйте (уберите символ #) те параметры, которые хотите использовать -# Параметры: -# + + + + + # You can use this to configure your email gateway account +# Uncomment the setting you want to use +# Here are the options: +# # pgp: server -# Email-шлюз будет создавать и управлять PGP-ключами за вас, а также подписывать, проверять, -# шифровать и дешифровать от вашего имени. Используйте это, если вы желаете использовать PGP, но очень ленивы. -# Этот настройка требует подписки. +# The email gateway will create and maintain PGP keys for you and sign, verify, +# encrypt and decrypt on your behalf. When you want to use PGP but are lazy, +# use this. Requires subscription. # # pgp: local -# Шлюз электронной почты не будет проводить операции PGP от вашего имени. -# Вы можете не использовать PGP, или использовать его локально. +# The email gateway will not conduct PGP operations on your behalf. You can +# either not use PGP at all, or use it locally. # # attachments: yes -# Вложения во входящий email-сообщениях будут загружены на MEGA.nz, -# вы сможете скачать из оттуда по ссылке. Требуется подписка. +# Incoming attachments in the email will be uploaded to MEGA.nz, and you can +# download them from there by following the link. Requires a subscription. # # attachments: no -# Вложения будут проигнорированы. -# +# Attachments will be ignored. +# # archive: yes -# Входящие email-сообщения будут заархивированы на сервере. Используйте эту настройку -# в целях отладки, или если вам нужно подтверждение email третьей стороной. -# Конечно, это означает, что оператор сервиса будет иметь возможность читать ваши email -# даже после доставки их вам. +# Your incoming emails will be archived on the server. Use this if you need +# help with debugging problems or you need a third party proof of emails. This +# however means that the operator of the service will be able to read your +# emails even after they have been delivered to you. # # archive: no -# Входящие email-сообщения будут удалены с сервера после доставки их вам. +# Incoming emails will be deleted from the server as soon as they are relayed +# to you. # -# masterpubkey_btc: BIP44 xpub key или electrum v1 public seed -# offset_btc: целое число (по умолчанию 0) -# feeamount: число, содержащее до 8 десятичных цифр -# feecurrency: BTC, XBT, USD, EUR или GBP -# Используйте эту настроку, если хотите чтобы отправитель уплатил вознаграждение за отправку email вам. -# Если настройка включена, и неизвестный отправитель посылает вам email, -# то отправителю будет предложено уплатить указанное вознаграждение. -# Схема использует детерминистические открытые ключи, вы получите деньги напрямую. -# Чтобы выключить уплату вознаграждения, установите "feeamount" равным 0. -# Требует подписки. +# masterpubkey_btc: BIP44 xpub key or electrum v1 public seed +# offset_btc: integer (defaults to 0) +# feeamount: number with up to 8 decimal places +# feecurrency: BTC, XBT, USD, EUR or GBP +# Use these if you want to charge people who send you emails. If this is on and +# an unknown person sends you an email, they will be requested to pay the fee +# specified. As this scheme uses deterministic public keys, you will receive +# the money directly. To turn it off again, set "feeamount" to 0. Requires +# subscription. + + MainWindow - + Reply to sender Ответить отправителю - + Reply to channel Ответить в канал - + Add sender to your Address Book Добавить отправителя в адресную книгу - + Add sender to your Blacklist Добавить отправителя в чёрный список - + Move to Trash Поместить в корзину - + Undelete Отменить удаление - + View HTML code as formatted text Просмотреть HTML код как отформатированный текст - + Save message as... Сохранить сообщение как ... - + Mark Unread Отметить как непрочитанное - + New Новый адрес - + Enable Включить - + Disable Выключить - + Set avatar... Установить аватар... - + Copy address to clipboard Скопировать адрес в буфер обмена - + Special address behavior... Особое поведение адресов... - + Email gateway Email-шлюз - + Delete Удалить - + Send message to this address Отправить сообщение на этот адрес - + Subscribe to this address Подписаться на рассылку с этого адреса - + Add New Address Добавить новый адрес - + Copy destination address to clipboard Скопировать адрес отправки в буфер обмена - + Force send Форсировать отправку - + One of your addresses, %1, is an old version 1 address. Version 1 addresses are no longer supported. May we delete it now? Один из Ваших адресов, %1, является устаревшим адресом версии 1. Адреса версии 1 больше не поддерживаются. Хотите ли Вы удалить его сейчас? - + Waiting for their encryption key. Will request it again soon. Ожидаем ключ шифрования от Вашего собеседника. Запрос будет повторен через некоторое время. @@ -322,17 +328,17 @@ Please type the desired email address (including @mailchuck.com) below: - + Queued. В очереди. - + Message sent. Waiting for acknowledgement. Sent at %1 Сообщение отправлено. Ожидаем подтверждения. Отправлено в %1 - + Message sent. Sent at %1 Сообщение отправлено в %1 @@ -342,47 +348,47 @@ Please type the desired email address (including @mailchuck.com) below: - + Acknowledgement of the message received %1 Доставлено в %1 - + Broadcast queued. Рассылка ожидает очереди. - + Broadcast on %1 Рассылка на %1 - + Problem: The work demanded by the recipient is more difficult than you are willing to do. %1 Проблема: Ваш получатель требует более сложных вычислений, чем максимум, указанный в Ваших настройках. %1 - + Problem: The recipient's encryption key is no good. Could not encrypt message. %1 Проблема: ключ получателя неправильный. Невозможно зашифровать сообщение. %1 - + Forced difficulty override. Send should start soon. Форсирована смена сложности. Отправляем через некоторое время. - + Unknown status: %1 %2 Неизвестный статус: %1 %2 - + Not Connected Не соединено - + Show Bitmessage Показать Bitmessage @@ -392,12 +398,12 @@ Please type the desired email address (including @mailchuck.com) below: Отправить - + Subscribe Подписки - + Channel Канал @@ -407,13 +413,13 @@ Please type the desired email address (including @mailchuck.com) below: Выйти - + You may manage your keys by editing the keys.dat file stored in the same directory as this program. It is important that you back up this file. Вы можете управлять Вашими ключами, редактируя файл keys.dat, находящийся в той же папке, что и эта программа. Создайте резервную копию этого файла перед тем как будете его редактировать. - + You may manage your keys by editing the keys.dat file stored in %1 It is important that you back up this file. @@ -422,59 +428,56 @@ It is important that you back up this file. Создайте резервную копию этого файла перед тем как будете его редактировать. - + Open keys.dat? Открыть файл keys.dat? - + You may manage your keys by editing the keys.dat file stored in the same directory as this program. It is important that you back up this file. Would you like to open the file now? (Be sure to close Bitmessage before making any changes.) - Вы можете управлять Вашими ключами, редактируя файл keys.dat, находящийся в той же папке, что и эта программа. -Создайте резервную копию этого файла перед тем как будете его редактировать. Хотели бы Вы открыть этот файл сейчас? -(пожалуйста, закройте Bitmessage до того как Вы внесёте в этот файл какие-либо изменения.) + Вы можете управлять вашими ключами, редактируя файл keys.dat, находящийся в той же папке, что и эта программа. +Создайте резервную копию этого файла перед тем как будете его редактировать. Хотите открыть этот файл сейчас? +(пожалуйста, закройте Bitmessage перед тем, как вносить в него какие-либо изменения.) - + You may manage your keys by editing the keys.dat file stored in %1 It is important that you back up this file. Would you like to open the file now? (Be sure to close Bitmessage before making any changes.) - Вы можете управлять Вашими ключами, редактируя файл keys.dat, находящийся в - %1 -Создайте резервную копию этого файла перед тем как будете его редактировать. Хотели бы Вы открыть этот файл сейчас? -(пожалуйста, закройте Bitmessage до того как Вы внесёте в этот файл какие-либо изменения.) + - + Delete trash? Очистить корзину? - + Are you sure you want to delete all trashed messages? Вы уверены что хотите очистить корзину? - + bad passphrase Неподходящая секретная фраза - + You must type your passphrase. If you don't have one then this is not the form for you. Вы должны ввести секретную фразу. Если Вы не хотите этого делать, то Вы выбрали неправильную опцию. - + Bad address version number Неверный номер версии адреса - + Your address version number must be a number: either 3 or 4. Адрес номера версии должен быть числом: либо 3, либо 4. - + Your address version number must be either 3 or 4. Адрес номера версии должен быть либо 3, либо 4. @@ -544,22 +547,22 @@ It is important that you back up this file. Would you like to open the file now? - + Connection lost Соединение потеряно - + Connected Соединено - + Message trashed Сообщение удалено - + The TTL, or Time-To-Live is the length of time that the network will hold the message. The recipient must get it during this time. If your Bitmessage client does not hear an acknowledgement, it will resend the message automatically. The longer the Time-To-Live, the @@ -570,17 +573,17 @@ It is important that you back up this file. Would you like to open the file now? сообщение. Часто разумным вариантом будет установка TTL на 4 или 5 дней. - + Message too long Сообщение слишком длинное - + The message that you are trying to send is too long by %1 bytes. (The maximum is 261644 bytes). Please cut it down before sending. Сообщение, которое вы пытаетесь отправить, длиннее максимально допустимого на %1 байт. (Максимально допустимое значение 261644 байта). Пожалуйста, сократите сообщение перед отправкой. - + Error: Your account wasn't registered at an email gateway. Sending registration now as %1, please wait for the registration to be processed before retrying sending. Ошибка: ваш аккаунт не зарегистрирован на Email-шлюзе. Отправка регистрации %1, пожалуйста, подождите пока процесс регистрации не завершится, прежде чем попытаться отправить сообщение заново. @@ -625,57 +628,57 @@ It is important that you back up this file. Would you like to open the file now? - + Error: You must specify a From address. If you don't have one, go to the 'Your Identities' tab. Вы должны указать адрес в поле "От кого". Вы можете найти Ваш адрес во вкладке "Ваши Адреса". - + Address version number Версия адреса - + Concerning the address %1, Bitmessage cannot understand address version numbers of %2. Perhaps upgrade Bitmessage to the latest version. - По поводу адреса %1: Bitmessage не поддерживаем адреса версии %2. Возможно, Вам нужно обновить клиент Bitmessage. + По поводу адреса %1: Bitmessage не поддерживает адреса версии %2. Возможно вам нужно обновить клиент Bitmessage. - + Stream number Номер потока - + Concerning the address %1, Bitmessage cannot handle stream numbers of %2. Perhaps upgrade Bitmessage to the latest version. - По поводу адреса %1: Bitmessage не поддерживаем стрим номер %2. Возможно, Вам нужно обновить клиент Bitmessage. + По поводу адреса %1: Bitmessage не поддерживает поток номер %2. Возможно вам нужно обновить клиент Bitmessage. - + Warning: You are currently not connected. Bitmessage will do the work necessary to send the message but it won't send until you connect. - Внимание: Вы не подключены к сети. Bitmessage выполнит работу, требуемую для отправки сообщения, но не отправит его до тех пор, пока Вы не подключитесь. + Внимание: вы не подключены к сети. Bitmessage выполнит работу, требуемую для отправки сообщения, но не отправит его до тех пор, пока вы не подключитесь. - + Message queued. Сообщение в очереди. - + Your 'To' field is empty. Вы не заполнили поле 'Кому'. - + Right click one or more entries in your address book and select 'Send message to this address'. Нажмите правую кнопку мыши на каком-либо адресе и выберите "Отправить сообщение на этот адрес". - + Fetched address from namecoin identity. Получить адрес через Namecoin. - + New Message Новое сообщение @@ -690,57 +693,57 @@ It is important that you back up this file. Would you like to open the file now? - + Address is valid. Адрес введен правильно. - + The address you entered was invalid. Ignoring it. Вы ввели неправильный адрес. Это адрес проигнорирован. - + Error: You cannot add the same address to your address book twice. Try renaming the existing one if you want. Ошибка: Вы не можете добавлять один и тот же адрес в Адресную Книгу несколько раз. Попробуйте переименовать существующий адрес. - + Error: You cannot add the same address to your subscriptions twice. Perhaps rename the existing one if you want. Ошибка: вы не можете добавить один и тот же адрес в ваши подписки дважды. Пожалуйста, переименуйте имеющийся адрес, если хотите. - + Restart Перезапустить - + You must restart Bitmessage for the port number change to take effect. Вы должны перезапустить Bitmessage, чтобы смена номера порта имела эффект. - + Bitmessage will use your proxy from now on but you may want to manually restart Bitmessage now to close existing connections (if any). - Bitmessage будет использовать Ваш прокси, начиная прямо сейчас. Тем не менее Вам имеет смысл перезапустить Bitmessage, чтобы закрыть уже существующие соединения. + Bitmessage будет использовать ваш прокси, начиная с этого момента. Тем не менее, имеет смысл перезапустить Bitmessage, чтобы закрыть уже существующие соединения. - + Number needed Требуется число - + Your maximum download and upload rate must be numbers. Ignoring what you typed. Скорости загрузки и выгрузки должны быть числами. Игнорирую то, что вы набрали. - + Will not resend ever Не пересылать никогда - + Note that the time limit you entered is less than the amount of time Bitmessage waits for the first resend attempt therefore your messages will never be resent. Обратите внимание, что лимит времени, который вы ввели, меньше чем время, которое Bitmessage ждет перед первой попыткой переотправки сообщения, поэтому ваши сообщения никогда не будут переотправлены. @@ -775,24 +778,24 @@ It is important that you back up this file. Would you like to open the file now? Вы действительно должны ввести секретную фразу. - + Address is gone Адрес утерян - + Bitmessage cannot find your address %1. Perhaps you removed it? Bitmessage не может найти Ваш адрес %1. Возможно Вы удалили его? - + Address disabled Адрес выключен - + Error: The address from which you are trying to send is disabled. You'll have to enable it on the 'Your Identities' tab before using it. - Ошибка: адрес, с которого Вы пытаетесь отправить, выключен. Вам нужно будет включить этот адрес во вкладке "Ваши адреса". + Ошибка: адрес, с которого вы пытаетесь отправить, выключен. Вам нужно включить этот адрес во вкладке "Ваши адреса" перед использованием. @@ -800,42 +803,42 @@ It is important that you back up this file. Would you like to open the file now? - + Entry added to the blacklist. Edit the label to your liking. Запись добавлена в чёрный список. Измените название по своему вкусу. - + Error: You cannot add the same address to your blacklist twice. Try renaming the existing one if you want. Ошибка: вы не можете добавить один и тот же адрес в чёрный список дважды. Попробуйте переименовать существующий адрес. - + Moved items to trash. Удалено в корзину. - + Undeleted item. Элемент восстановлен. - + Save As... Сохранить как ... - + Write error. Ошибка записи. - + No addresses selected. Вы не выбрали адрес. - + If you delete the subscription, messages that you already received will become inaccessible. Maybe you can consider disabling the subscription instead. Disabled subscriptions will not receive new messages, but you can still view messages you already received. Are you sure you want to delete the subscription? @@ -844,7 +847,7 @@ Are you sure you want to delete the subscription? Вы уверены, что хотите отменить подписку? - + If you delete the channel, messages that you already received will become inaccessible. Maybe you can consider disabling the channel instead. Disabled channels will not receive new messages, but you can still view messages you already received. Are you sure you want to delete the channel? @@ -853,32 +856,32 @@ Are you sure you want to delete the channel? Вы уверены, что хотите удалить канал? - + Do you really want to remove this avatar? Вы уверены, что хотите удалить этот аватар? - + You have already set an avatar for this address. Do you really want to overwrite it? У вас уже есть аватар для этого адреса. Вы уверены, что хотите перезаписать аватар? - + Start-on-login not yet supported on your OS. Запуск программы при входе в систему ещё не поддерживается в вашей операционной системе. - + Minimize-to-tray not yet supported on your OS. Сворачивание в трей ещё не поддерживается в вашей операционной системе. - + Tray notifications not yet supported on your OS. Уведомления в трее ещё не поддерживаеются в вашей операционной системе. - + Testing... Проверяем... @@ -1128,7 +1131,7 @@ Are you sure you want to delete the channel? Подключить или создать чан - + All accounts Все аккаунты @@ -1138,12 +1141,12 @@ Are you sure you want to delete the channel? Увеличение %1% - + Error: You cannot add the same address to your list twice. Perhaps rename the existing one if you want. Ошибка: вы не можете добавить один и тот же адрес в ваш лист дважды. Попробуйте переименовать существующий адрес. - + Add new entry Добавить новую запись @@ -1153,42 +1156,42 @@ Are you sure you want to delete the channel? - + New version of PyBitmessage is available: %1. Download it from https://github.com/Bitmessage/PyBitmessage/releases/latest Доступна новая версия PyBitmessage: %1. Загрузите её: https://github.com/Bitmessage/PyBitmessage/releases/latest - + Waiting for PoW to finish... %1% Ожидание окончания PoW... %1% - + Shutting down Pybitmessage... %1% Завершение PyBitmessage... %1% - + Waiting for objects to be sent... %1% Ожидание отправки объектов... %1% - + Saving settings... %1% Сохранение настроек... %1% - + Shutting down core... %1% Завершение работы ядра... %1% - + Stopping notifications... %1% Остановка сервиса уведомлений... %1% - + Shutdown imminent... %1% Завершение вот-вот произойдет... %1% @@ -1198,42 +1201,42 @@ Are you sure you want to delete the channel? %n час%n часа%n часов%n час(а/ов) - + %n day(s) %n день%n дня%n дней%n дней - + Shutting down PyBitmessage... %1% Завершение PyBitmessage... %1% - + Sent Отправлено - + Generating one new address Создание одного нового адреса - + Done generating address. Doing work necessary to broadcast it... Создание адреса завершено. Выполнение работы, требуемой для его рассылки... - + Generating %1 new addresses. Создание %1 новых адресов. - + %1 is already in 'Your Identities'. Not adding it again. %1 уже имеется в ваших адресах. Не добавляю его снова. - + Done generating address Создание адресов завершено. @@ -1243,96 +1246,96 @@ Are you sure you want to delete the channel? - + Disk full Диск переполнен - + Alert: Your disk or data storage volume is full. Bitmessage will now exit. Внимание: свободное место на диске закончилось. Bitmessage завершит свою работу. - + Error! Could not find sender address (your address) in the keys.dat file. Ошибка: невозможно найти адрес отправителя (ваш адрес) в файле ключей keys.dat - + Doing work necessary to send broadcast... Выполнение работы, требуемой для рассылки... - + Broadcast sent on %1 Рассылка отправлена на %1 - + Encryption key was requested earlier. Ключ шифрования запрошен ранее. - + Sending a request for the recipient's encryption key. Отправка запроса ключа шифрования получателя. - + Looking up the receiver's public key Поиск открытого ключа получателя - + Problem: Destination is a mobile device who requests that the destination be included in the message but this is disallowed in your settings. %1 Проблема: адресат является мобильным устройством, которое требует, чтобы адрес назначения был включен в сообщение, однако, это запрещено в ваших настройках. %1 - + Doing work necessary to send message. There is no required difficulty for version 2 addresses like this. Выполнение работы, требуемой для отправки сообщения. Для адреса версии 2 (как этот), не требуется указание сложности. - + Doing work necessary to send message. Receiver's required difficulty: %1 and %2 Выполнение работы, требуемой для отправки сообщения. Получатель запросил сложность: %1 и %2 - + Problem: The work demanded by the recipient (%1 and %2) is more difficult than you are willing to do. %3 Проблема: сложность, затребованная получателем (%1 и %2) гораздо больше, чем вы готовы сделать. %3 - + Problem: You are trying to send a message to yourself or a chan but your encryption key could not be found in the keys.dat file. Could not encrypt message. %1 Проблема: вы пытаетесь отправить сообщение самому себе или в чан, но ваш ключ шифрования не найден в файле ключей keys.dat. Невозможно зашифровать сообщение. %1 - + Doing work necessary to send message. Выполнение работы, требуемой для отправки сообщения. - + Message sent. Waiting for acknowledgement. Sent on %1 Отправлено. Ожидаем подтверждения. Отправлено в %1 - + Doing work necessary to request encryption key. Выполнение работы, требуемой для запроса ключа шифрования. - + Broadcasting the public key request. This program will auto-retry if they are offline. Рассылка запросов открытого ключа шифрования. Программа будет повторять попытки, если они оффлайн. - + Sending public key request. Waiting for reply. Requested at %1 Отправка запроса открытого ключа шифрования. Ожидание ответа. Запрошено в %1 @@ -1347,107 +1350,97 @@ Receiver's required difficulty: %1 and %2 Распределение портов UPnP отменено - + Mark all messages as read Отметить все сообщения как прочтенные - + Are you sure you would like to mark all messages read? Вы уверены, что хотите отметить все сообщения как прочтенные? - + Doing work necessary to send broadcast. Выполнение работы, требуемой для отправки рассылки. - + Proof of work pending Ожидается доказательство работы - + %n object(s) pending proof of work %n объект в ожидании доказательства работы%n объекта в ожидании доказательства работы%n объектов в ожидании доказательства работы%n объектов в ожидании доказательства работы - + %n object(s) waiting to be distributed %n объект ожидает раздачи%n объекта ожидают раздачи%n объектов ожидают раздачи%n объектов ожидают раздачи - + Wait until these tasks finish? Подождать завершения этих задач? - - Problem communicating with proxy: %1. Please check your network settings. - Проблема коммуникации с прокси: %1. Пожалуйста, проверьте ваши сетевые настройки. - - - - SOCKS5 Authentication problem: %1. Please check your SOCKS5 settings. - Проблема аутентификации SOCKS5: %1. Пожалуйста, проверьте настройки SOCKS5. - - - - The time on your computer, %1, may be wrong. Please verify your settings. - Время на компьютере, %1, возможно неправильное. Пожалуйста, проверьте ваши настройки. - - - + The name %1 was not found. Имя %1 не найдено. - + The namecoin query failed (%1) Запрос к namecoin не удался (%1). - + The namecoin query failed. Запрос к namecoin не удался. - + The name %1 has no valid JSON data. Имя %1 не содержит корректных данных JSON. - + The name %1 has no associated Bitmessage address. Имя %1 не имеет связанного адреса Bitmessage. - + Success! Namecoind version %1 running. Успех! Namecoind версии %1 работает. - + Success! NMControll is up and running. Успех! NMControl запущен и работает. - + Couldn't understand NMControl. Не удалось разобрать ответ NMControl. + + + The connection to namecoin failed. + Не удалось соединиться с namecoin. + Your GPU(s) did not calculate correctly, disabling OpenCL. Please report to the developers. Ваша видеокарта вычислила неправильно, отключаем OpenCL. Пожалуйста, сообщите разработчикам. - + Set notification sound... Установить звук уведомления... - + Welcome to easy and secure Bitmessage * send messages to other people @@ -1461,119 +1454,119 @@ Receiver's required difficulty: %1 and %2 * участвуйте в обсуждениях в чанах - + not recommended for chans не рекомендовано для чанов - + Quiet Mode Тихий режим - + Problems connecting? Try enabling UPnP in the Network Settings Проблемы подключения? Попробуйте включить UPnP в сетевых настройках. - + You are trying to send an email instead of a bitmessage. This requires registering with a gateway. Attempt to register? Вы пытаетесь отправить email вместо bitmessage. Для этого нужно зарегистрироваться на шлюзе. Попробовать зарегистрироваться? - + Error: Bitmessage addresses start with BM- Please check the recipient address %1 Ошибка: адреса Bitmessage начинаются с "BM-". Пожалуйста, проверьте адрес получателя %1. - + Error: The recipient address %1 is not typed or copied correctly. Please check it. Ошибка: адрес получателя %1 набран или скопирован неправильно. Пожалуйста, проверьте его. - + Error: The recipient address %1 contains invalid characters. Please check it. Ошибка: адрес получателя %1 содержит недопустимые символы. Пожалуйста, проверьте его. - + Error: The version of the recipient address %1 is too high. Either you need to upgrade your Bitmessage software or your acquaintance is being clever. Ошибка: версия адреса получателя %1 слишком высокая. Либо вам нужно обновить программу Bitmessage, либо ваш знакомый - умник. - + Error: Some data encoded in the recipient address %1 is too short. There might be something wrong with the software of your acquaintance. Ошибка: часть данных, закодированных в адресе получателя %1 слишком короткая. Видимо, что-то не так с программой, используемой вашим знакомым. - + Error: Some data encoded in the recipient address %1 is too long. There might be something wrong with the software of your acquaintance. Ошибка: часть данных, закодированных в адресе получателя %1 слишком длинная. Видимо, что-то не так с программой, используемой вашим знакомым. - + Error: Some data encoded in the recipient address %1 is malformed. There might be something wrong with the software of your acquaintance. Ошибка: часть данных, закодированных в адресе получателя %1 сформирована неправильно. Видимо, что-то не так с программой, используемой вашим знакомым. - + Error: Something is wrong with the recipient address %1. Ошибка: что-то не так с адресом получателя %1. - + Error: %1 Ошибка: %1 - + From %1 От %1 - + Synchronisation pending Ожидается синхронизация - + Bitmessage hasn't synchronised with the network, %n object(s) to be downloaded. If you quit now, it may cause delivery delays. Wait until the synchronisation finishes? Bitmessage не синхронизирован с сетью, незагруженных объектов: %n. Выход сейчас может привести к задержкам доставки. Подождать завершения синхронизации?Bitmessage не синхронизирован с сетью, незагруженных объектов: %n. Выход сейчас может привести к задержкам доставки. Подождать завершения синхронизации?Bitmessage не синхронизирован с сетью, незагруженных объектов: %n. Выход сейчас может привести к задержкам доставки. Подождать завершения синхронизации?Bitmessage не синхронизирован с сетью, незагруженных объектов: %n. Выход сейчас может привести к задержкам доставки. Подождать завершения синхронизации? - + Not connected Не подключено - + Bitmessage isn't connected to the network. If you quit now, it may cause delivery delays. Wait until connected and the synchronisation finishes? Bitmessage не подключен к сети. Выход сейчас может привести к задержкам доставки. Подождать подключения и завершения синхронизации? - + Waiting for network connection... Ожидание сетевого подключения... - + Waiting for finishing synchronisation... Ожидание окончания синхронизации... - + You have already set a notification sound for this address book entry. Do you really want to overwrite it? У вас уже есть звук уведомления для этого адресата. Вы уверены, что хотите перезаписать звук уведомления? - + Error occurred: could not load message from disk. Произошла ошибка: не удалось загрузить сообщение с диска. Display the %n recent broadcast(s) from this address. - + Показать %1 прошлую рассылку с этого адреса.Показать %1 прошлых рассылки с этого адреса.Показать %1 прошлых рассылок с этого адреса.Показать %1 прошлых рассылок с этого адреса. @@ -1591,24 +1584,24 @@ Receiver's required difficulty: %1 and %2 Очистить - + inbox входящие - + new новые - + sent отправленные - + trash - + корзина @@ -1637,14 +1630,14 @@ Receiver's required difficulty: %1 and %2 MsgDecode - + The message has an unknown encoding. Perhaps you should upgrade Bitmessage. Сообщение в неизвестной кодировке. Возможно, вам следует обновить Bitmessage. - + Unknown encoding Неизвестная кодировка @@ -1870,12 +1863,12 @@ The 'Random Number' option is selected by default but deterministic ad Адрес - + Blacklist Чёрный список - + Whitelist Белый список @@ -2226,14 +2219,6 @@ The 'Random Number' option is selected by default but deterministic ad Модуль C для PoW недоступен. Пожалуйста, соберите его. - - qrcodeDialog - - - QR-code - QR-код - - regenerateAddressesDialog @@ -2290,218 +2275,218 @@ The 'Random Number' option is selected by default but deterministic ad settingsDialog - + Settings Настройки - + Start Bitmessage on user login Запускать Bitmessage при входе в систему - + Tray Трей - + Start Bitmessage in the tray (don't show main window) Запускать Bitmessage в свернутом виде (не показывать главное окно) - + Minimize to tray Сворачивать в трей - + Close to tray Закрывать в трей - + Show notification when message received Показывать уведомления при получении новых сообщений - + Run in Portable Mode Запустить в переносном режиме - + In Portable Mode, messages and config files are stored in the same directory as the program rather than the normal application-data folder. This makes it convenient to run Bitmessage from a USB thumb drive. В переносном режиме, все сообщения и конфигурационные файлы сохраняются в той же самой папке что и сама программа. Это делает более удобным использование Bitmessage с USB-флэшки. - + Willingly include unencrypted destination address when sending to a mobile device Специально прикреплять незашифрованный адрес получателя, когда посылаем на мобильное устройство - + Use Identicons Включить иконки адресов - + Reply below Quote Отвечать после цитаты - + Interface Language Язык интерфейса - + System Settings system Язык по умолчанию - + User Interface Пользовательские - + Listening port Порт прослушивания - + Listen for connections on port: Прослушивать соединения на порту: - + UPnP: UPnP: - + Bandwidth limit Ограничение пропускной способности - + Maximum download rate (kB/s): [0: unlimited] Максимальная скорость загрузки (кБ/с): [0: не ограничено] - + Maximum upload rate (kB/s): [0: unlimited] Максимальная скорость отдачи (кБ/с): [0: не ограничено] - + Proxy server / Tor Прокси сервер / Tor - + Type: Тип: - + Server hostname: Адрес сервера: - + Port: Порт: - + Authentication Авторизация - + Username: Имя пользователя: - + Pass: Пароль: - + Listen for incoming connections when using proxy Прослушивать входящие соединения если используется прокси - + none отсутствует - + SOCKS4a SOCKS4a - + SOCKS5 SOCKS5 - + Network Settings Сетевые настройки - + Total difficulty: Общая сложность: - + The 'Total difficulty' affects the absolute amount of work the sender must complete. Doubling this value doubles the amount of work. "Общая сложность" влияет на абсолютное количество вычислений, которые отправитель должен провести, чтобы отправить сообщение. Увеличив это число в два раза, вы увеличите в два раза объем требуемых вычислений. - + Small message difficulty: Сложность для маленьких сообщений: - + When someone sends you a message, their computer must first complete some work. The difficulty of this work, by default, is 1. You may raise this default for new addresses you create by changing the values here. Any new addresses you create will require senders to meet the higher difficulty. There is one exception: if you add a friend or acquaintance to your address book, Bitmessage will automatically notify them when you next send a message that they need only complete the minimum amount of work: difficulty 1. Когда кто-либо отправляет Вам сообщение, его компьютер должен сперва решить определённую вычислительную задачу. Сложность этой задачи по умолчанию равна 1. Вы можете повысить эту сложность для новых адресов, которые Вы создадите, здесь. Таким образом, любые новые адреса, которые Вы создадите, могут требовать от отправителей сложность большую чем 1. Однако, есть одно исключение: если Вы специально добавите Вашего собеседника в адресную книгу, то Bitmessage автоматически уведомит его о том, что для него минимальная сложность будет составлять всегда всего лишь 1. - + The 'Small message difficulty' mostly only affects the difficulty of sending small messages. Doubling this value makes it almost twice as difficult to send a small message but doesn't really affect large messages. "Сложность для маленьких сообщений" влияет исключительно на небольшие сообщения. Увеличив это число в два раза, вы сделаете отправку маленьких сообщений в два раза сложнее, в то время как сложность отправки больших сообщений не изменится. - + Demanded difficulty Требуемая сложность - + Here you may set the maximum amount of work you are willing to do to send a message to another person. Setting these values to 0 means that any value is acceptable. Здесь Вы можете установить максимальную вычислительную работу, которую Вы согласны проделать, чтобы отправить сообщение другому пользователю. Ноль означает, что любое значение допустимо. - + Maximum acceptable total difficulty: Максимально допустимая общая сложность: - + Maximum acceptable small message difficulty: Максимально допустимая сложность для маленький сообщений: - + Max acceptable difficulty Макс допустимая сложность @@ -2511,87 +2496,87 @@ The 'Random Number' option is selected by default but deterministic ad - + <html><head/><body><p>Bitmessage can utilize a different Bitcoin-based program called Namecoin to make addresses human-friendly. For example, instead of having to tell your friend your long Bitmessage address, you can simply tell him to send a message to <span style=" font-style:italic;">test. </span></p><p>(Getting your own Bitmessage address into Namecoin is still rather difficult).</p><p>Bitmessage can use either namecoind directly or a running nmcontrol instance.</p></body></html> <html><head/><body><p>Bitmessage умеет пользоваться программой Namecoin для того, чтобы сделать адреса более дружественными для пользователей. Например, вместо того, чтобы диктовать Вашему другу длинный и нудный адрес Bitmessage, Вы можете попросить его отправить сообщение на адрес вида <span style=" font-style:italic;">test. </span></p><p>(Перенести Ваш Bitmessage адрес в Namecoin по-прежнему пока довольно сложно).</p><p>Bitmessage может использовать либо прямо namecoind, либо уже запущенную программу nmcontrol.</p></body></html> - + Host: Адрес: - + Password: Пароль: - + Test Проверить - + Connect to: - Подсоединиться к: + Соединиться с: - + Namecoind Namecoind - + NMControl NMControl - + Namecoin integration Интеграция с Namecoin - + <html><head/><body><p>By default, if you send a message to someone and he is offline for more than two days, Bitmessage will send the message again after an additional two days. This will be continued with exponential backoff forever; messages will be resent after 5, 10, 20 days ect. until the receiver acknowledges them. Here you may change that behavior by having Bitmessage give up after a certain number of days or months.</p><p>Leave these input fields blank for the default behavior. </p></body></html> <html><head/><body><p>По умолчанию, когда вы отправляете сообщение кому-либо, и адресат находится оффлайн несколько дней, ваш Bitmessage перепосылает сообщение. Это будет продолжаться с увеличивающимся по экспоненте интервалом; сообщение будет переотправляться, например, через 5, 10, 20 дней, пока адресат их запрашивает. Здесь вы можете изменить это поведение, заставив Bitmessage прекращать переотправку по прошествии указанного количества дней или месяцев.</p><p>Оставьте поля пустыми, чтобы вернуться к поведению по умолчанию.</p></body></html> - + Give up after Прекратить через - + and и - + days дней - + months. месяцев. - + Resends Expire Окончание попыток отправки - + Hide connection notifications Спрятать уведомления о подключениях - + Maximum outbound connections: [0: none] Максимальное число исходящих подключений: [0: неограничено] - + Hardware GPU acceleration (OpenCL): Аппаратное ускорение GPU From 795b855c65c515b7a795d784416f3b960c0c6c26 Mon Sep 17 00:00:00 2001 From: Dmitri Bogomolov <4glitch@gmail.com> Date: Wed, 27 Jun 2018 11:24:09 +0300 Subject: [PATCH 03/18] Returned logger setting to debug though slightly deduplicated --- src/debug.py | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/src/debug.py b/src/debug.py index 746f0fcd..e851bd02 100644 --- a/src/debug.py +++ b/src/debug.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """ Logging and debuging facility ============================= @@ -11,7 +10,7 @@ Levels: Confirmation that things are working as expected. WARNING An indication that something unexpected happened, or indicative of some problem in the - near future (e.g. ‘disk space low’). The software is still working as expected. + near future (e.g. 'disk space low'). The software is still working as expected. ERROR Due to a more serious problem, the software has not been able to perform some function. CRITICAL @@ -113,10 +112,10 @@ def configureLogging(): return True -if __name__ == "__main__": +# TODO (xj9): Get from a config file. +# logger = logging.getLogger('console_only') - # TODO (xj9): Get from a config file. - #logger = logging.getLogger('console_only') +def initLogging(): if configureLogging(): if '-c' in sys.argv: logger = logging.getLogger('file_only') @@ -124,8 +123,8 @@ if __name__ == "__main__": logger = logging.getLogger('both') else: logger = logging.getLogger('default') -else: - logger = logging.getLogger('default') + return logger + def restartLoggingInUpdatedAppdataLocation(): global logger @@ -133,11 +132,8 @@ def restartLoggingInUpdatedAppdataLocation(): logger.removeHandler(i) i.flush() i.close() - if configureLogging(): - if '-c' in sys.argv: - logger = logging.getLogger('file_only') - else: - logger = logging.getLogger('both') - else: - logger = logging.getLogger('default') + logger = initLogging() + +# ! +logger = initLogging() From c7d3784b808834a556ac41f92d0891395926ac1a Mon Sep 17 00:00:00 2001 From: Dmitri Bogomolov <4glitch@gmail.com> Date: Thu, 28 Jun 2018 00:54:49 +0300 Subject: [PATCH 04/18] No need to import namecoin early because it's really used only in Qt UI --- src/bitmessageqt/__init__.py | 5 +++-- src/helper_startup.py | 4 +--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/bitmessageqt/__init__.py b/src/bitmessageqt/__init__.py index 208923fc..621c87b1 100644 --- a/src/bitmessageqt/__init__.py +++ b/src/bitmessageqt/__init__.py @@ -23,7 +23,7 @@ import shared from bitmessageui import Ui_MainWindow from bmconfigparser import BMConfigParser import defaults -from namecoin import namecoinConnection +import namecoin from messageview import MessageView from migrationwizard import Ui_MigrationWizard from foldertree import ( @@ -797,7 +797,8 @@ class MyForm(settingsmixin.SMainWindow): self.initSettings() - self.namecoin = namecoinConnection() + namecoin.ensureNamecoinOptions() + self.namecoin = namecoin.namecoinConnection() # Check to see whether we can connect to namecoin. # Hide the 'Fetch Namecoin ID' button if we can't. diff --git a/src/helper_startup.py b/src/helper_startup.py index 87a78e14..b7772a30 100644 --- a/src/helper_startup.py +++ b/src/helper_startup.py @@ -8,7 +8,6 @@ import os import platform from distutils.version import StrictVersion -from namecoin import ensureNamecoinOptions import paths import state import helper_random @@ -129,8 +128,6 @@ def loadConfig(): # existing users. To do that, search the class_sqlThread.py file for the # text: "right above this line!" - ensureNamecoinOptions() - if StoreConfigFilesInSameDirectoryAsProgramByDefault: # Just use the same directory as the program and forget about # the appdata folder @@ -146,6 +143,7 @@ def loadConfig(): _loadTrustedPeer() + def isOurOperatingSystemLimitedToHavingVeryFewHalfOpenConnections(): try: if sys.platform[0:3] == "win": From 2504c80da648dd750d4b7763ef3ee06970fe0be5 Mon Sep 17 00:00:00 2001 From: Dmitri Bogomolov <4glitch@gmail.com> Date: Sun, 1 Jul 2018 01:16:32 +0300 Subject: [PATCH 05/18] Fix an issue from #1153 for setup without plugins package --- src/bitmessageqt/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/bitmessageqt/__init__.py b/src/bitmessageqt/__init__.py index 621c87b1..5e4c18fd 100644 --- a/src/bitmessageqt/__init__.py +++ b/src/bitmessageqt/__init__.py @@ -255,6 +255,8 @@ class MyForm(settingsmixin.SMainWindow): # load all gui.menu plugins with prefix 'address' self.menu_plugins = {'address': []} + if not get_plugins: + return for plugin in get_plugins('gui.menu', 'address'): try: handler, title = plugin(self) From ba5caf3fdad5e996bcef5d1077fb69608bdaa0c8 Mon Sep 17 00:00:00 2001 From: Dmitri Bogomolov <4glitch@gmail.com> Date: Sat, 3 Mar 2018 17:31:49 +0200 Subject: [PATCH 06/18] Sorted out configuration loading/updating a bit: - used BMConfigParser.safeGet.. methods instead of try .. except - moved all config checks from class_sqlThread into helper_startup - commented out initialization of settings which are then rewritten by updateConfig() --- src/bitmessageqt/account.py | 4 +- src/bitmessageqt/languagebox.py | 10 +- src/bitmessageqt/support.py | 17 +- src/bitmessageqt/utils.py | 30 ++-- src/class_sqlThread.py | 203 +++++++----------------- src/helper_startup.py | 271 +++++++++++++++++++++++++++----- 6 files changed, 315 insertions(+), 220 deletions(-) diff --git a/src/bitmessageqt/account.py b/src/bitmessageqt/account.py index cf3373db..50ea3548 100644 --- a/src/bitmessageqt/account.py +++ b/src/bitmessageqt/account.py @@ -150,9 +150,7 @@ class BMAccount(object): """Get a label for this bitmessage account""" if address is None: address = self.address - label = address - if BMConfigParser().has_section(address): - label = BMConfigParser().get(address, 'label') + label = BMConfigParser().safeGet(address, 'label', address) queryreturn = sqlQuery( '''select label from addressbook where address=?''', address) if queryreturn != []: diff --git a/src/bitmessageqt/languagebox.py b/src/bitmessageqt/languagebox.py index 552e0350..9032cc42 100644 --- a/src/bitmessageqt/languagebox.py +++ b/src/bitmessageqt/languagebox.py @@ -12,26 +12,24 @@ class LanguageBox(QtGui.QComboBox): self.populate() def populate(self): - self.languages = [] self.clear() localesPath = os.path.join (paths.codePath(), 'translations') - configuredLocale = "system" - try: - configuredLocale = BMConfigParser().get('bitmessagesettings', 'userlocale', "system") - except: - pass self.addItem(QtGui.QApplication.translate("settingsDialog", "System Settings", "system"), "system") self.setCurrentIndex(0) self.setInsertPolicy(QtGui.QComboBox.InsertAlphabetically) for translationFile in sorted(glob.glob(os.path.join(localesPath, "bitmessage_*.qm"))): localeShort = os.path.split(translationFile)[1].split("_", 1)[1][:-3] locale = QtCore.QLocale(QtCore.QString(localeShort)) + if localeShort in LanguageBox.languageName: self.addItem(LanguageBox.languageName[localeShort], localeShort) elif locale.nativeLanguageName() == "": self.addItem(localeShort, localeShort) else: self.addItem(locale.nativeLanguageName(), localeShort) + + configuredLocale = BMConfigParser().safeGet( + 'bitmessagesettings', 'userlocale', "system") for i in range(self.count()): if self.itemData(i) == configuredLocale: self.setCurrentIndex(i) diff --git a/src/bitmessageqt/support.py b/src/bitmessageqt/support.py index 25c6113d..2a1ddb18 100644 --- a/src/bitmessageqt/support.py +++ b/src/bitmessageqt/support.py @@ -114,18 +114,13 @@ def createSupportMessage(myapp): frozen = paths.frozen portablemode = "True" if state.appdata == paths.lookupExeFolder() else "False" cpow = "True" if proofofwork.bmpow else "False" - #cpow = QtGui.QApplication.translate("Support", cpow) - openclpow = str(BMConfigParser().safeGet('bitmessagesettings', 'opencl')) if openclEnabled() else "None" - #openclpow = QtGui.QApplication.translate("Support", openclpow) + openclpow = str( + BMConfigParser().safeGet('bitmessagesettings', 'opencl') + ) if openclEnabled() else "None" locale = getTranslationLanguage() - try: - socks = BMConfigParser().get('bitmessagesettings', 'socksproxytype') - except: - socks = "N/A" - try: - upnp = BMConfigParser().get('bitmessagesettings', 'upnp') - except: - upnp = "N/A" + socks = BMConfigParser().safeGet( + 'bitmessagesettings', 'socksproxytype', "N/A") + upnp = BMConfigParser().safeGet('bitmessagesettings', 'upnp', "N/A") connectedhosts = len(network.stats.connectedHostsList()) myapp.ui.textEditMessage.setText(str(QtGui.QApplication.translate("Support", SUPPORT_MESSAGE)).format(version, os, architecture, pythonversion, opensslversion, frozen, portablemode, cpow, openclpow, locale, socks, upnp, connectedhosts)) diff --git a/src/bitmessageqt/utils.py b/src/bitmessageqt/utils.py index 369d05ef..564dbc8b 100644 --- a/src/bitmessageqt/utils.py +++ b/src/bitmessageqt/utils.py @@ -10,26 +10,24 @@ str_chan = '[chan]' def identiconize(address): size = 48 - - # If you include another identicon library, please generate an + + if not BMConfigParser().getboolean('bitmessagesettings', 'useidenticons'): + return QtGui.QIcon() + + # If you include another identicon library, please generate an # example identicon with the following md5 hash: # 3fd4bf901b9d4ea1394f0fb358725b28 - - try: - identicon_lib = BMConfigParser().get('bitmessagesettings', 'identiconlib') - except: - # default to qidenticon_two_x - identicon_lib = 'qidenticon_two_x' - # As an 'identiconsuffix' you could put "@bitmessge.ch" or "@bm.addr" to make it compatible with other identicon generators. (Note however, that E-Mail programs might convert the BM-address to lowercase first.) - # It can be used as a pseudo-password to salt the generation of the identicons to decrease the risk - # of attacks where someone creates an address to mimic someone else's identicon. + identicon_lib = BMConfigParser().safeGet( + 'bitmessagesettings', 'identiconlib', 'qidenticon_two_x') + + # As an 'identiconsuffix' you could put "@bitmessge.ch" or "@bm.addr" + # to make it compatible with other identicon generators. (Note however, + # that E-Mail programs might convert the BM-address to lowercase first.) + # It can be used as a pseudo-password to salt the generation of + # the identicons to decrease the risk of attacks where someone creates + # an address to mimic someone else's identicon. identiconsuffix = BMConfigParser().get('bitmessagesettings', 'identiconsuffix') - - if not BMConfigParser().getboolean('bitmessagesettings', 'useidenticons'): - idcon = QtGui.QIcon() - return idcon - if (identicon_lib[:len('qidenticon')] == 'qidenticon'): # print identicon_lib # originally by: diff --git a/src/class_sqlThread.py b/src/class_sqlThread.py index 45c4d8c0..a45571e0 100644 --- a/src/class_sqlThread.py +++ b/src/class_sqlThread.py @@ -6,14 +6,13 @@ import shutil # used for moving the messages.dat file import sys import os from debug import logger -import defaults import helper_sql -from namecoin import ensureNamecoinOptions +import helper_startup import paths import queues import state -import tr#anslate -import helper_random +import tr + # This thread exists because SQLITE3 is so un-threadsafe that we must # submit queries to it and it puts results back in a different queue. They # won't let us just use locks. @@ -68,35 +67,26 @@ class sqlThread(threading.Thread): 'ERROR trying to create database file (message.dat). Error message: %s\n' % str(err)) os._exit(0) - if BMConfigParser().getint('bitmessagesettings', 'settingsversion') == 1: - BMConfigParser().set('bitmessagesettings', 'settingsversion', '2') - # If the settings version is equal to 2 or 3 then the - # sqlThread will modify the pubkeys table and change - # the settings version to 4. - BMConfigParser().set('bitmessagesettings', 'socksproxytype', 'none') - BMConfigParser().set('bitmessagesettings', 'sockshostname', 'localhost') - BMConfigParser().set('bitmessagesettings', 'socksport', '9050') - BMConfigParser().set('bitmessagesettings', 'socksauthentication', 'false') - BMConfigParser().set('bitmessagesettings', 'socksusername', '') - BMConfigParser().set('bitmessagesettings', 'sockspassword', '') - BMConfigParser().set('bitmessagesettings', 'sockslisten', 'false') - BMConfigParser().set('bitmessagesettings', 'keysencrypted', 'false') - BMConfigParser().set('bitmessagesettings', 'messagesencrypted', 'false') + # If the settings version is equal to 2 or 3 then the + # sqlThread will modify the pubkeys table and change + # the settings version to 4. + settingsversion = BMConfigParser().getint( + 'bitmessagesettings', 'settingsversion') # People running earlier versions of PyBitmessage do not have the # usedpersonally field in their pubkeys table. Let's add it. - if BMConfigParser().getint('bitmessagesettings', 'settingsversion') == 2: + if settingsversion == 2: item = '''ALTER TABLE pubkeys ADD usedpersonally text DEFAULT 'no' ''' parameters = '' self.cur.execute(item, parameters) self.conn.commit() - BMConfigParser().set('bitmessagesettings', 'settingsversion', '3') + settingsversion = 3 # People running earlier versions of PyBitmessage do not have the # encodingtype field in their inbox and sent tables or the read field # in the inbox table. Let's add them. - if BMConfigParser().getint('bitmessagesettings', 'settingsversion') == 3: + if settingsversion == 3: item = '''ALTER TABLE inbox ADD encodingtype int DEFAULT '2' ''' parameters = '' self.cur.execute(item, parameters) @@ -110,21 +100,13 @@ class sqlThread(threading.Thread): self.cur.execute(item, parameters) self.conn.commit() - BMConfigParser().set('bitmessagesettings', 'settingsversion', '4') + settingsversion = 4 - if BMConfigParser().getint('bitmessagesettings', 'settingsversion') == 4: - BMConfigParser().set('bitmessagesettings', 'defaultnoncetrialsperbyte', str( - defaults.networkDefaultProofOfWorkNonceTrialsPerByte)) - BMConfigParser().set('bitmessagesettings', 'defaultpayloadlengthextrabytes', str( - defaults.networkDefaultPayloadLengthExtraBytes)) - BMConfigParser().set('bitmessagesettings', 'settingsversion', '5') + BMConfigParser().set( + 'bitmessagesettings', 'settingsversion', str(settingsversion)) + BMConfigParser().save() - if BMConfigParser().getint('bitmessagesettings', 'settingsversion') == 5: - BMConfigParser().set( - 'bitmessagesettings', 'maxacceptablenoncetrialsperbyte', '0') - BMConfigParser().set( - 'bitmessagesettings', 'maxacceptablepayloadlengthextrabytes', '0') - BMConfigParser().set('bitmessagesettings', 'settingsversion', '6') + helper_startup.updateConfig() # From now on, let us keep a 'version' embedded in the messages.dat # file so that when we make changes to the database, the database @@ -135,7 +117,8 @@ class sqlThread(threading.Thread): self.cur.execute(item, parameters) if self.cur.fetchall() == []: # The settings table doesn't exist. We need to make it. - logger.debug('In messages.dat database, creating new \'settings\' table.') + logger.debug( + "In messages.dat database, creating new 'settings' table.") self.cur.execute( '''CREATE TABLE settings (key text, value blob, UNIQUE(key) ON CONFLICT REPLACE)''' ) self.cur.execute( '''INSERT INTO settings VALUES('version','1')''') @@ -177,17 +160,15 @@ class sqlThread(threading.Thread): '''update sent set status='broadcastqueued' where status='broadcastpending' ''') self.conn.commit() - if not BMConfigParser().has_option('bitmessagesettings', 'sockslisten'): - BMConfigParser().set('bitmessagesettings', 'sockslisten', 'false') - - ensureNamecoinOptions() - - # Let's get rid of the first20bytesofencryptedmessage field in the inventory table. + # Let's get rid of the first20bytesofencryptedmessage field in + # the inventory table. item = '''SELECT value FROM settings WHERE key='version';''' parameters = '' self.cur.execute(item, parameters) if int(self.cur.fetchall()[0][0]) == 2: - logger.debug('In messages.dat database, removing an obsolete field from the inventory table.') + logger.debug( + 'In messages.dat database, removing an obsolete field from' + ' the inventory table.') self.cur.execute( '''CREATE TEMPORARY TABLE inventory_backup(hash blob, objecttype text, streamnumber int, payload blob, receivedtime integer, UNIQUE(hash) ON CONFLICT REPLACE);''') self.cur.execute( @@ -208,7 +189,9 @@ class sqlThread(threading.Thread): self.cur.execute(item, parameters) currentVersion = int(self.cur.fetchall()[0][0]) if currentVersion == 1 or currentVersion == 3: - logger.debug('In messages.dat database, adding tag field to the inventory table.') + logger.debug( + 'In messages.dat database, adding tag field to' + ' the inventory table.') item = '''ALTER TABLE inventory ADD tag blob DEFAULT '' ''' parameters = '' self.cur.execute(item, parameters) @@ -216,16 +199,6 @@ class sqlThread(threading.Thread): parameters = (4,) self.cur.execute(item, parameters) - if not BMConfigParser().has_option('bitmessagesettings', 'userlocale'): - BMConfigParser().set('bitmessagesettings', 'userlocale', 'system') - if not BMConfigParser().has_option('bitmessagesettings', 'sendoutgoingconnections'): - BMConfigParser().set('bitmessagesettings', 'sendoutgoingconnections', 'True') - - # Raise the default required difficulty from 1 to 2 - # With the change to protocol v3, this is obsolete. - if BMConfigParser().getint('bitmessagesettings', 'settingsversion') == 6: - BMConfigParser().set('bitmessagesettings', 'settingsversion', '7') - # Add a new column to the pubkeys table to store the address version. # We're going to trash all of our pubkeys and let them be redownloaded. item = '''SELECT value FROM settings WHERE key='version';''' @@ -233,28 +206,15 @@ class sqlThread(threading.Thread): self.cur.execute(item, parameters) currentVersion = int(self.cur.fetchall()[0][0]) if currentVersion == 4: - self.cur.execute( '''DROP TABLE pubkeys''') + self.cur.execute('''DROP TABLE pubkeys''') self.cur.execute( - '''CREATE TABLE pubkeys (hash blob, addressversion int, transmitdata blob, time int, usedpersonally text, UNIQUE(hash, addressversion) ON CONFLICT REPLACE)''' ) + '''CREATE TABLE pubkeys (hash blob, addressversion int, transmitdata blob, time int, usedpersonally text, UNIQUE(hash, addressversion) ON CONFLICT REPLACE)''') self.cur.execute( '''delete from inventory where objecttype = 'pubkey';''') item = '''update settings set value=? WHERE key='version';''' parameters = (5,) self.cur.execute(item, parameters) - if not BMConfigParser().has_option('bitmessagesettings', 'useidenticons'): - BMConfigParser().set('bitmessagesettings', 'useidenticons', 'True') - if not BMConfigParser().has_option('bitmessagesettings', 'identiconsuffix'): # acts as a salt - BMConfigParser().set('bitmessagesettings', 'identiconsuffix', ''.join(helper_random.randomchoice("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz") for x in range(12)))# a twelve character pseudo-password to salt the identicons - - #Add settings to support no longer resending messages after a certain period of time even if we never get an ack - if BMConfigParser().getint('bitmessagesettings', 'settingsversion') == 7: - BMConfigParser().set( - 'bitmessagesettings', 'stopresendingafterxdays', '') - BMConfigParser().set( - 'bitmessagesettings', 'stopresendingafterxmonths', '') - BMConfigParser().set('bitmessagesettings', 'settingsversion', '8') - # Add a new table: objectprocessorqueue with which to hold objects # that have yet to be processed if the user shuts down Bitmessage. item = '''SELECT value FROM settings WHERE key='version';''' @@ -262,21 +222,24 @@ class sqlThread(threading.Thread): self.cur.execute(item, parameters) currentVersion = int(self.cur.fetchall()[0][0]) if currentVersion == 5: - self.cur.execute( '''DROP TABLE knownnodes''') + self.cur.execute('''DROP TABLE knownnodes''') self.cur.execute( - '''CREATE TABLE objectprocessorqueue (objecttype text, data blob, UNIQUE(objecttype, data) ON CONFLICT REPLACE)''' ) + '''CREATE TABLE objectprocessorqueue (objecttype text, data blob, UNIQUE(objecttype, data) ON CONFLICT REPLACE)''') item = '''update settings set value=? WHERE key='version';''' parameters = (6,) self.cur.execute(item, parameters) # changes related to protocol v3 - # In table inventory and objectprocessorqueue, objecttype is now an integer (it was a human-friendly string previously) + # In table inventory and objectprocessorqueue, objecttype is now + # an integer (it was a human-friendly string previously) item = '''SELECT value FROM settings WHERE key='version';''' parameters = '' self.cur.execute(item, parameters) currentVersion = int(self.cur.fetchall()[0][0]) if currentVersion == 6: - logger.debug('In messages.dat database, dropping and recreating the inventory table.') + logger.debug( + 'In messages.dat database, dropping and recreating' + ' the inventory table.') self.cur.execute( '''DROP TABLE inventory''') self.cur.execute( '''CREATE TABLE inventory (hash blob, objecttype int, streamnumber int, payload blob, expirestime integer, tag blob, UNIQUE(hash) ON CONFLICT REPLACE)''' ) self.cur.execute( '''DROP TABLE objectprocessorqueue''') @@ -284,57 +247,26 @@ class sqlThread(threading.Thread): item = '''update settings set value=? WHERE key='version';''' parameters = (7,) self.cur.execute(item, parameters) - logger.debug('Finished dropping and recreating the inventory table.') - - # With the change to protocol version 3, reset the user-settable difficulties to 1 - if BMConfigParser().getint('bitmessagesettings', 'settingsversion') == 8: - BMConfigParser().set('bitmessagesettings','defaultnoncetrialsperbyte', str(defaults.networkDefaultProofOfWorkNonceTrialsPerByte)) - BMConfigParser().set('bitmessagesettings','defaultpayloadlengthextrabytes', str(defaults.networkDefaultPayloadLengthExtraBytes)) - previousTotalDifficulty = int(BMConfigParser().getint('bitmessagesettings', 'maxacceptablenoncetrialsperbyte')) / 320 - previousSmallMessageDifficulty = int(BMConfigParser().getint('bitmessagesettings', 'maxacceptablepayloadlengthextrabytes')) / 14000 - BMConfigParser().set('bitmessagesettings','maxacceptablenoncetrialsperbyte', str(previousTotalDifficulty * 1000)) - BMConfigParser().set('bitmessagesettings','maxacceptablepayloadlengthextrabytes', str(previousSmallMessageDifficulty * 1000)) - BMConfigParser().set('bitmessagesettings', 'settingsversion', '9') - - # Adjust the required POW values for each of this user's addresses to conform to protocol v3 norms. - if BMConfigParser().getint('bitmessagesettings', 'settingsversion') == 9: - for addressInKeysFile in BMConfigParser().addressses(): - try: - previousTotalDifficulty = float(BMConfigParser().getint(addressInKeysFile, 'noncetrialsperbyte')) / 320 - previousSmallMessageDifficulty = float(BMConfigParser().getint(addressInKeysFile, 'payloadlengthextrabytes')) / 14000 - if previousTotalDifficulty <= 2: - previousTotalDifficulty = 1 - if previousSmallMessageDifficulty < 1: - previousSmallMessageDifficulty = 1 - BMConfigParser().set(addressInKeysFile,'noncetrialsperbyte', str(int(previousTotalDifficulty * 1000))) - BMConfigParser().set(addressInKeysFile,'payloadlengthextrabytes', str(int(previousSmallMessageDifficulty * 1000))) - except: - continue - BMConfigParser().set('bitmessagesettings', 'maxdownloadrate', '0') - BMConfigParser().set('bitmessagesettings', 'maxuploadrate', '0') - BMConfigParser().set('bitmessagesettings', 'settingsversion', '10') - BMConfigParser().save() - - # sanity check - if BMConfigParser().getint('bitmessagesettings', 'maxacceptablenoncetrialsperbyte') == 0: - BMConfigParser().set('bitmessagesettings','maxacceptablenoncetrialsperbyte', str(defaults.ridiculousDifficulty * defaults.networkDefaultProofOfWorkNonceTrialsPerByte)) - if BMConfigParser().getint('bitmessagesettings', 'maxacceptablepayloadlengthextrabytes') == 0: - BMConfigParser().set('bitmessagesettings','maxacceptablepayloadlengthextrabytes', str(defaults.ridiculousDifficulty * defaults.networkDefaultPayloadLengthExtraBytes)) + logger.debug( + 'Finished dropping and recreating the inventory table.') # The format of data stored in the pubkeys table has changed. Let's - # clear it, and the pubkeys from inventory, so that they'll be re-downloaded. + # clear it, and the pubkeys from inventory, so that they'll + # be re-downloaded. item = '''SELECT value FROM settings WHERE key='version';''' parameters = '' self.cur.execute(item, parameters) currentVersion = int(self.cur.fetchall()[0][0]) if currentVersion == 7: - logger.debug('In messages.dat database, clearing pubkeys table because the data format has been updated.') + logger.debug( + 'In messages.dat database, clearing pubkeys table' + ' because the data format has been updated.') self.cur.execute( '''delete from inventory where objecttype = 1;''') self.cur.execute( '''delete from pubkeys;''') - # Any sending messages for which we *thought* that we had the pubkey must - # be rechecked. + # Any sending messages for which we *thought* that we had + # the pubkey must be rechecked. self.cur.execute( '''UPDATE sent SET status='msgqueued' WHERE status='doingmsgpow' or status='badkey';''') query = '''update settings set value=? WHERE key='version';''' @@ -342,14 +274,17 @@ class sqlThread(threading.Thread): self.cur.execute(query, parameters) logger.debug('Finished clearing currently held pubkeys.') - # Add a new column to the inbox table to store the hash of the message signature. - # We'll use this as temporary message UUID in order to detect duplicates. + # Add a new column to the inbox table to store the hash of + # the message signature. We'll use this as temporary message UUID + # in order to detect duplicates. item = '''SELECT value FROM settings WHERE key='version';''' parameters = '' self.cur.execute(item, parameters) currentVersion = int(self.cur.fetchall()[0][0]) if currentVersion == 8: - logger.debug('In messages.dat database, adding sighash field to the inbox table.') + logger.debug( + 'In messages.dat database, adding sighash field to' + ' the inbox table.') item = '''ALTER TABLE inbox ADD sighash blob DEFAULT '' ''' parameters = '' self.cur.execute(item, parameters) @@ -357,17 +292,18 @@ class sqlThread(threading.Thread): parameters = (9,) self.cur.execute(item, parameters) - # TTL is now user-specifiable. Let's add an option to save whatever the user selects. - if not BMConfigParser().has_option('bitmessagesettings', 'ttl'): - BMConfigParser().set('bitmessagesettings', 'ttl', '367200') - # We'll also need a `sleeptill` field and a `ttl` field. Also we can combine - # the pubkeyretrynumber and msgretrynumber into one. + # We'll also need a `sleeptill` field and a `ttl` field. Also we + # can combine the pubkeyretrynumber and msgretrynumber into one. item = '''SELECT value FROM settings WHERE key='version';''' parameters = '' self.cur.execute(item, parameters) currentVersion = int(self.cur.fetchall()[0][0]) if currentVersion == 9: - logger.info('In messages.dat database, making TTL-related changes: combining the pubkeyretrynumber and msgretrynumber fields into the retrynumber field and adding the sleeptill and ttl fields...') + logger.info( + 'In messages.dat database, making TTL-related changes:' + ' combining the pubkeyretrynumber and msgretrynumber' + ' fields into the retrynumber field and adding the' + ' sleeptill and ttl fields...') self.cur.execute( '''CREATE TEMPORARY TABLE sent_backup (msgid blob, toaddress text, toripe blob, fromaddress text, subject text, message text, ackdata blob, lastactiontime integer, status text, retrynumber integer, folder text, encodingtype int)''' ) self.cur.execute( @@ -406,30 +342,9 @@ class sqlThread(threading.Thread): logger.debug('In messages.dat database, done adding address field to the pubkeys table and removing the hash field.') self.cur.execute('''update settings set value=10 WHERE key='version';''') - if not BMConfigParser().has_option('bitmessagesettings', 'onionhostname'): - BMConfigParser().set('bitmessagesettings', 'onionhostname', '') - if not BMConfigParser().has_option('bitmessagesettings', 'onionport'): - BMConfigParser().set('bitmessagesettings', 'onionport', '8444') - if not BMConfigParser().has_option('bitmessagesettings', 'onionbindip'): - BMConfigParser().set('bitmessagesettings', 'onionbindip', '127.0.0.1') - if not BMConfigParser().has_option('bitmessagesettings', 'smtpdeliver'): - BMConfigParser().set('bitmessagesettings', 'smtpdeliver', '') - if not BMConfigParser().has_option('bitmessagesettings', 'hidetrayconnectionnotifications'): - BMConfigParser().set('bitmessagesettings', 'hidetrayconnectionnotifications', 'false') - if BMConfigParser().has_option('bitmessagesettings', 'maxoutboundconnections'): - try: - if BMConfigParser().getint('bitmessagesettings', 'maxoutboundconnections') < 1: raise ValueError - except ValueError as err: - BMConfigParser().remove_option('bitmessagesettings', 'maxoutboundconnections') - logger.error('Your maximum outbound connections must be a number.') - if not BMConfigParser().has_option('bitmessagesettings', 'maxoutboundconnections'): - logger.info('Setting maximum outbound connections to 8.') - BMConfigParser().set('bitmessagesettings', 'maxoutboundconnections', '8') - - BMConfigParser().save() - # Are you hoping to add a new option to the keys.dat file of existing - # Bitmessage users or modify the SQLite database? Add it right above this line! + # Bitmessage users or modify the SQLite database? Add it right + # above this line! try: testpayload = '\x00\x00' diff --git a/src/helper_startup.py b/src/helper_startup.py index b7772a30..93a37658 100644 --- a/src/helper_startup.py +++ b/src/helper_startup.py @@ -12,9 +12,9 @@ import paths import state import helper_random +# The user may de-select Portable Mode in the settings if they want +# the config files to stay in the application data folder. StoreConfigFilesInSameDirectoryAsProgramByDefault = False -# The user may de-select Portable Mode in the settings if they want the config -# files to stay in the application data folder. def _loadTrustedPeer(): @@ -33,13 +33,12 @@ def loadConfig(): if state.appdata: BMConfigParser().read(state.appdata + 'keys.dat') # state.appdata must have been specified as a startup option. - try: - BMConfigParser().get('bitmessagesettings', 'settingsversion') - print 'Loading config files from directory specified on startup: ' + state.appdata - needToCreateKeysFile = False - except Exception: - needToCreateKeysFile = True - + needToCreateKeysFile = BMConfigParser().safeGet( + 'bitmessagesettings', 'settingsversion') is None + if not needToCreateKeysFile: + print( + 'Loading config files from directory specified' + ' on startup: %s' % state.appdata) else: BMConfigParser().read(paths.lookupExeFolder() + 'keys.dat') try: @@ -47,19 +46,18 @@ def loadConfig(): print 'Loading config files from same directory as program.' needToCreateKeysFile = False state.appdata = paths.lookupExeFolder() - except Exception: + except: # Could not load the keys.dat file in the program directory. # Perhaps it is in the appdata directory. state.appdata = paths.lookupAppdataFolder() BMConfigParser().read(state.appdata + 'keys.dat') - try: - BMConfigParser().get('bitmessagesettings', 'settingsversion') + needToCreateKeysFile = BMConfigParser().safeGet( + 'bitmessagesettings', 'settingsversion') is None + if not needToCreateKeysFile: print 'Loading existing config files from', state.appdata - needToCreateKeysFile = False - except Exception: - needToCreateKeysFile = True if needToCreateKeysFile: + # This appears to be the first time running the program; there is # no config file (or it cannot be accessed). Create config file. BMConfigParser().add_section('bitmessagesettings') @@ -72,9 +70,9 @@ def loadConfig(): if 'linux' in sys.platform: BMConfigParser().set( 'bitmessagesettings', 'minimizetotray', 'false') - # This isn't implimented yet and when True on - # Ubuntu causes Bitmessage to disappear while - # running when minimized. + # This isn't implimented yet and when True on + # Ubuntu causes Bitmessage to disappear while + # running when minimized. else: BMConfigParser().set( 'bitmessagesettings', 'minimizetotray', 'true') @@ -87,46 +85,54 @@ def loadConfig(): BMConfigParser().set('bitmessagesettings', 'socksport', '9050') BMConfigParser().set( 'bitmessagesettings', 'socksauthentication', 'false') - BMConfigParser().set( - 'bitmessagesettings', 'sockslisten', 'false') + # BMConfigParser().set( + # 'bitmessagesettings', 'sockslisten', 'false') BMConfigParser().set('bitmessagesettings', 'socksusername', '') BMConfigParser().set('bitmessagesettings', 'sockspassword', '') BMConfigParser().set('bitmessagesettings', 'keysencrypted', 'false') BMConfigParser().set( 'bitmessagesettings', 'messagesencrypted', 'false') - BMConfigParser().set('bitmessagesettings', 'defaultnoncetrialsperbyte', str( - defaults.networkDefaultProofOfWorkNonceTrialsPerByte)) - BMConfigParser().set('bitmessagesettings', 'defaultpayloadlengthextrabytes', str( - defaults.networkDefaultPayloadLengthExtraBytes)) + BMConfigParser().set( + 'bitmessagesettings', 'defaultnoncetrialsperbyte', + str(defaults.networkDefaultProofOfWorkNonceTrialsPerByte)) + BMConfigParser().set( + 'bitmessagesettings', 'defaultpayloadlengthextrabytes', + str(defaults.networkDefaultPayloadLengthExtraBytes)) BMConfigParser().set('bitmessagesettings', 'minimizeonclose', 'false') - BMConfigParser().set( - 'bitmessagesettings', 'maxacceptablenoncetrialsperbyte', '0') - BMConfigParser().set( - 'bitmessagesettings', 'maxacceptablepayloadlengthextrabytes', '0') + # BMConfigParser().set( + # 'bitmessagesettings', 'maxacceptablenoncetrialsperbyte', '0') + # BMConfigParser().set( + # 'bitmessagesettings', 'maxacceptablepayloadlengthextrabytes', + # '0') BMConfigParser().set('bitmessagesettings', 'dontconnect', 'true') - BMConfigParser().set('bitmessagesettings', 'userlocale', 'system') - BMConfigParser().set('bitmessagesettings', 'useidenticons', 'True') - BMConfigParser().set('bitmessagesettings', 'identiconsuffix', ''.join(helper_random.randomchoice("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz") for x in range(12)))# a twelve character pseudo-password to salt the identicons + # BMConfigParser().set('bitmessagesettings', 'userlocale', 'system') + # BMConfigParser().set('bitmessagesettings', 'useidenticons', 'True') + # BMConfigParser().set( + # 'bitmessagesettings', 'identiconsuffix', + # ''.join(helper_random.randomchoice( + # "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" + # ) for x in range(12) + # )) # a twelve character pseudo-password to salt the identicons BMConfigParser().set('bitmessagesettings', 'replybelow', 'False') BMConfigParser().set('bitmessagesettings', 'maxdownloadrate', '0') BMConfigParser().set('bitmessagesettings', 'maxuploadrate', '0') - BMConfigParser().set('bitmessagesettings', 'maxoutboundconnections', '8') - BMConfigParser().set('bitmessagesettings', 'ttl', '367200') + # BMConfigParser().set( + # 'bitmessagesettings', 'maxoutboundconnections', '8') + # BMConfigParser().set('bitmessagesettings', 'ttl', '367200') - #start:UI setting to stop trying to send messages after X days/months + # UI setting to stop trying to send messages after X days/months BMConfigParser().set( 'bitmessagesettings', 'stopresendingafterxdays', '') BMConfigParser().set( 'bitmessagesettings', 'stopresendingafterxmonths', '') - #BMConfigParser().set( + # BMConfigParser().set( # 'bitmessagesettings', 'timeperiod', '-1') - #end # Are you hoping to add a new option to the keys.dat file? You're in # the right place for adding it to users who install the software for # the first time. But you must also add it to the keys.dat file of - # existing users. To do that, search the class_sqlThread.py file for the - # text: "right above this line!" + # existing users. To do that, search the class_sqlThread.py file + # for the text: "right above this line!" if StoreConfigFilesInSameDirectoryAsProgramByDefault: # Just use the same directory as the program and forget about @@ -140,15 +146,200 @@ def loadConfig(): if not sys.platform.startswith('win'): os.umask(0o077) BMConfigParser().save() + else: + updateConfig() _loadTrustedPeer() +def updateConfig(): + settingsversion = BMConfigParser().getint( + 'bitmessagesettings', 'settingsversion') + if settingsversion == 1: + BMConfigParser().set('bitmessagesettings', 'socksproxytype', 'none') + BMConfigParser().set( + 'bitmessagesettings', 'sockshostname', 'localhost') + BMConfigParser().set('bitmessagesettings', 'socksport', '9050') + BMConfigParser().set( + 'bitmessagesettings', 'socksauthentication', 'false') + BMConfigParser().set('bitmessagesettings', 'socksusername', '') + BMConfigParser().set('bitmessagesettings', 'sockspassword', '') + BMConfigParser().set('bitmessagesettings', 'sockslisten', 'false') + BMConfigParser().set('bitmessagesettings', 'keysencrypted', 'false') + BMConfigParser().set( + 'bitmessagesettings', 'messagesencrypted', 'false') + settingsversion = 2 + # let class_sqlThread update SQL and continue + elif settingsversion == 4: + BMConfigParser().set( + 'bitmessagesettings', 'defaultnoncetrialsperbyte', + str(defaults.networkDefaultProofOfWorkNonceTrialsPerByte)) + BMConfigParser().set( + 'bitmessagesettings', 'defaultpayloadlengthextrabytes', + str(defaults.networkDefaultPayloadLengthExtraBytes)) + settingsversion = 5 + + if settingsversion == 5: + BMConfigParser().set( + 'bitmessagesettings', 'maxacceptablenoncetrialsperbyte', '0') + BMConfigParser().set( + 'bitmessagesettings', 'maxacceptablepayloadlengthextrabytes', '0') + settingsversion = 7 + + # Raise the default required difficulty from 1 to 2 + # With the change to protocol v3, this is obsolete. + # if settingsversion == 6: + # if int(shared.config.get( + # 'bitmessagesettings', 'defaultnoncetrialsperbyte' + # )) == defaults.networkDefaultProofOfWorkNonceTrialsPerByte: + # shared.config.set( + # 'bitmessagesettings', 'defaultnoncetrialsperbyte', + # str( + # defaults.networkDefaultProofOfWorkNonceTrialsPerByte + # * 2) + # ) + # settingsversion = 7 + + if not BMConfigParser().has_option('bitmessagesettings', 'sockslisten'): + BMConfigParser().set('bitmessagesettings', 'sockslisten', 'false') + + if not BMConfigParser().has_option('bitmessagesettings', 'userlocale'): + BMConfigParser().set('bitmessagesettings', 'userlocale', 'system') + + if not BMConfigParser().has_option( + 'bitmessagesettings', 'sendoutgoingconnections'): + BMConfigParser().set( + 'bitmessagesettings', 'sendoutgoingconnections', 'True') + + if not BMConfigParser().has_option( + 'bitmessagesettings', 'useidenticons'): + BMConfigParser().set('bitmessagesettings', 'useidenticons', 'True') + if not BMConfigParser().has_option( + 'bitmessagesettings', 'identiconsuffix'): + # acts as a salt + BMConfigParser().set( + 'bitmessagesettings', 'identiconsuffix', + ''.join(helper_random.randomchoice( + "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" + ) for x in range(12) + )) # a twelve character pseudo-password to salt the identicons + + # Add settings to support no longer resending messages after + # a certain period of time even if we never get an ack + if settingsversion == 7: + BMConfigParser().set( + 'bitmessagesettings', 'stopresendingafterxdays', '') + BMConfigParser().set( + 'bitmessagesettings', 'stopresendingafterxmonths', '') + settingsversion = 8 + + # With the change to protocol version 3, reset the user-settable + # difficulties to 1 + if settingsversion == 8: + BMConfigParser().set( + 'bitmessagesettings', 'defaultnoncetrialsperbyte', + str(defaults.networkDefaultProofOfWorkNonceTrialsPerByte)) + BMConfigParser().set( + 'bitmessagesettings', 'defaultpayloadlengthextrabytes', + str(defaults.networkDefaultPayloadLengthExtraBytes)) + previousTotalDifficulty = int( + BMConfigParser().getint( + 'bitmessagesettings', 'maxacceptablenoncetrialsperbyte') + ) / 320 + previousSmallMessageDifficulty = int( + BMConfigParser().getint( + 'bitmessagesettings', 'maxacceptablepayloadlengthextrabytes') + ) / 14000 + BMConfigParser().set( + 'bitmessagesettings', 'maxacceptablenoncetrialsperbyte', + str(previousTotalDifficulty * 1000)) + BMConfigParser().set( + 'bitmessagesettings', 'maxacceptablepayloadlengthextrabytes', + str(previousSmallMessageDifficulty * 1000)) + settingsversion = 9 + + # Adjust the required POW values for each of this user's addresses + # to conform to protocol v3 norms. + if settingsversion == 9: + for addressInKeysFile in BMConfigParser().addresses(): + try: + previousTotalDifficulty = float( + BMConfigParser().getint( + addressInKeysFile, 'noncetrialsperbyte')) / 320 + previousSmallMessageDifficulty = float( + BMConfigParser().getint( + addressInKeysFile, 'payloadlengthextrabytes')) / 14000 + if previousTotalDifficulty <= 2: + previousTotalDifficulty = 1 + if previousSmallMessageDifficulty < 1: + previousSmallMessageDifficulty = 1 + BMConfigParser().set( + addressInKeysFile, 'noncetrialsperbyte', + str(int(previousTotalDifficulty * 1000))) + BMConfigParser().set( + addressInKeysFile, 'payloadlengthextrabytes', + str(int(previousSmallMessageDifficulty * 1000))) + except Exception: + continue + BMConfigParser().set('bitmessagesettings', 'maxdownloadrate', '0') + BMConfigParser().set('bitmessagesettings', 'maxuploadrate', '0') + settingsversion = 10 + + # sanity check + if BMConfigParser().safeGetInt( + 'bitmessagesettings', 'maxacceptablenoncetrialsperbyte') == 0: + BMConfigParser().set( + 'bitmessagesettings', 'maxacceptablenoncetrialsperbyte', + str( + defaults.ridiculousDifficulty + * defaults.networkDefaultProofOfWorkNonceTrialsPerByte) + ) + if BMConfigParser().safeGetInt( + 'bitmessagesettings', 'maxacceptablepayloadlengthextrabytes' + ) == 0: + BMConfigParser().set( + 'bitmessagesettings', 'maxacceptablepayloadlengthextrabytes', + str( + defaults.ridiculousDifficulty + * defaults.networkDefaultPayloadLengthExtraBytes) + ) + + if not BMConfigParser().has_option('bitmessagesettings', 'onionhostname'): + BMConfigParser().set('bitmessagesettings', 'onionhostname', '') + if not BMConfigParser().has_option('bitmessagesettings', 'onionport'): + BMConfigParser().set('bitmessagesettings', 'onionport', '8444') + if not BMConfigParser().has_option('bitmessagesettings', 'onionbindip'): + BMConfigParser().set('bitmessagesettings', 'onionbindip', '127.0.0.1') + if not BMConfigParser().has_option('bitmessagesettings', 'smtpdeliver'): + BMConfigParser().set('bitmessagesettings', 'smtpdeliver', '') + if not BMConfigParser().has_option( + 'bitmessagesettings', 'hidetrayconnectionnotifications'): + BMConfigParser().set( + 'bitmessagesettings', 'hidetrayconnectionnotifications', 'false') + if BMConfigParser().safeGetInt( + 'bitmessagesettings', 'maxoutboundconnections') < 1: + BMConfigParser().set( + 'bitmessagesettings', 'maxoutboundconnections', '8') + print('WARNING: your maximum outbound connections must be a number.') + + # TTL is now user-specifiable. Let's add an option to save + # whatever the user selects. + if not BMConfigParser().has_option('bitmessagesettings', 'ttl'): + BMConfigParser().set('bitmessagesettings', 'ttl', '367200') + + BMConfigParser().set( + 'bitmessagesettings', 'settingsversion', str(settingsversion)) + BMConfigParser().save() + + def isOurOperatingSystemLimitedToHavingVeryFewHalfOpenConnections(): try: if sys.platform[0:3] == "win": VER_THIS = StrictVersion(platform.version()) - return StrictVersion("5.1.2600")<=VER_THIS and StrictVersion("6.0.6000")>=VER_THIS + return ( + StrictVersion("5.1.2600") <= VER_THIS and + StrictVersion("6.0.6000") >= VER_THIS + ) return False except Exception: - return False + pass From 529559d06a3cd1c89838482acaf0fd16a018a057 Mon Sep 17 00:00:00 2001 From: Dmitri Bogomolov <4glitch@gmail.com> Date: Sat, 3 Mar 2018 17:59:53 +0200 Subject: [PATCH 07/18] Reduced BMConfigParser in the sake of readability --- src/helper_startup.py | 243 +++++++++++++++++++----------------------- 1 file changed, 109 insertions(+), 134 deletions(-) diff --git a/src/helper_startup.py b/src/helper_startup.py index 93a37658..9bca8db6 100644 --- a/src/helper_startup.py +++ b/src/helper_startup.py @@ -30,19 +30,20 @@ def _loadTrustedPeer(): def loadConfig(): + config = BMConfigParser() if state.appdata: - BMConfigParser().read(state.appdata + 'keys.dat') + config.read(state.appdata + 'keys.dat') # state.appdata must have been specified as a startup option. - needToCreateKeysFile = BMConfigParser().safeGet( + needToCreateKeysFile = config.safeGet( 'bitmessagesettings', 'settingsversion') is None if not needToCreateKeysFile: print( 'Loading config files from directory specified' ' on startup: %s' % state.appdata) else: - BMConfigParser().read(paths.lookupExeFolder() + 'keys.dat') + config.read(paths.lookupExeFolder() + 'keys.dat') try: - BMConfigParser().get('bitmessagesettings', 'settingsversion') + config.get('bitmessagesettings', 'settingsversion') print 'Loading config files from same directory as program.' needToCreateKeysFile = False state.appdata = paths.lookupExeFolder() @@ -50,8 +51,8 @@ def loadConfig(): # Could not load the keys.dat file in the program directory. # Perhaps it is in the appdata directory. state.appdata = paths.lookupAppdataFolder() - BMConfigParser().read(state.appdata + 'keys.dat') - needToCreateKeysFile = BMConfigParser().safeGet( + config.read(state.appdata + 'keys.dat') + needToCreateKeysFile = config.safeGet( 'bitmessagesettings', 'settingsversion') is None if not needToCreateKeysFile: print 'Loading existing config files from', state.appdata @@ -60,73 +61,61 @@ def loadConfig(): # This appears to be the first time running the program; there is # no config file (or it cannot be accessed). Create config file. - BMConfigParser().add_section('bitmessagesettings') - BMConfigParser().set('bitmessagesettings', 'settingsversion', '10') - BMConfigParser().set('bitmessagesettings', 'port', '8444') - BMConfigParser().set( - 'bitmessagesettings', 'timeformat', '%%c') - BMConfigParser().set('bitmessagesettings', 'blackwhitelist', 'black') - BMConfigParser().set('bitmessagesettings', 'startonlogon', 'false') + config.add_section('bitmessagesettings') + config.set('bitmessagesettings', 'settingsversion', '10') + config.set('bitmessagesettings', 'port', '8444') + config.set('bitmessagesettings', 'timeformat', '%%c') + config.set('bitmessagesettings', 'blackwhitelist', 'black') + config.set('bitmessagesettings', 'startonlogon', 'false') if 'linux' in sys.platform: - BMConfigParser().set( - 'bitmessagesettings', 'minimizetotray', 'false') + config.set('bitmessagesettings', 'minimizetotray', 'false') # This isn't implimented yet and when True on # Ubuntu causes Bitmessage to disappear while # running when minimized. else: - BMConfigParser().set( - 'bitmessagesettings', 'minimizetotray', 'true') - BMConfigParser().set( - 'bitmessagesettings', 'showtraynotifications', 'true') - BMConfigParser().set('bitmessagesettings', 'startintray', 'false') - BMConfigParser().set('bitmessagesettings', 'socksproxytype', 'none') - BMConfigParser().set( - 'bitmessagesettings', 'sockshostname', 'localhost') - BMConfigParser().set('bitmessagesettings', 'socksport', '9050') - BMConfigParser().set( - 'bitmessagesettings', 'socksauthentication', 'false') - # BMConfigParser().set( - # 'bitmessagesettings', 'sockslisten', 'false') - BMConfigParser().set('bitmessagesettings', 'socksusername', '') - BMConfigParser().set('bitmessagesettings', 'sockspassword', '') - BMConfigParser().set('bitmessagesettings', 'keysencrypted', 'false') - BMConfigParser().set( - 'bitmessagesettings', 'messagesencrypted', 'false') - BMConfigParser().set( + config.set('bitmessagesettings', 'minimizetotray', 'true') + config.set('bitmessagesettings', 'showtraynotifications', 'true') + config.set('bitmessagesettings', 'startintray', 'false') + config.set('bitmessagesettings', 'socksproxytype', 'none') + config.set('bitmessagesettings', 'sockshostname', 'localhost') + config.set('bitmessagesettings', 'socksport', '9050') + config.set('bitmessagesettings', 'socksauthentication', 'false') + # config.set('bitmessagesettings', 'sockslisten', 'false') + config.set('bitmessagesettings', 'socksusername', '') + config.set('bitmessagesettings', 'sockspassword', '') + config.set('bitmessagesettings', 'keysencrypted', 'false') + config.set('bitmessagesettings', 'messagesencrypted', 'false') + config.set( 'bitmessagesettings', 'defaultnoncetrialsperbyte', str(defaults.networkDefaultProofOfWorkNonceTrialsPerByte)) - BMConfigParser().set( + config.set( 'bitmessagesettings', 'defaultpayloadlengthextrabytes', str(defaults.networkDefaultPayloadLengthExtraBytes)) - BMConfigParser().set('bitmessagesettings', 'minimizeonclose', 'false') - # BMConfigParser().set( + config.set('bitmessagesettings', 'minimizeonclose', 'false') + # config.set( # 'bitmessagesettings', 'maxacceptablenoncetrialsperbyte', '0') - # BMConfigParser().set( + # config.set( # 'bitmessagesettings', 'maxacceptablepayloadlengthextrabytes', # '0') - BMConfigParser().set('bitmessagesettings', 'dontconnect', 'true') - # BMConfigParser().set('bitmessagesettings', 'userlocale', 'system') - # BMConfigParser().set('bitmessagesettings', 'useidenticons', 'True') - # BMConfigParser().set( + config.set('bitmessagesettings', 'dontconnect', 'true') + # config.set('bitmessagesettings', 'userlocale', 'system') + # config.set('bitmessagesettings', 'useidenticons', 'True') + # config.set( # 'bitmessagesettings', 'identiconsuffix', # ''.join(helper_random.randomchoice( # "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" # ) for x in range(12) # )) # a twelve character pseudo-password to salt the identicons - BMConfigParser().set('bitmessagesettings', 'replybelow', 'False') - BMConfigParser().set('bitmessagesettings', 'maxdownloadrate', '0') - BMConfigParser().set('bitmessagesettings', 'maxuploadrate', '0') - # BMConfigParser().set( - # 'bitmessagesettings', 'maxoutboundconnections', '8') - # BMConfigParser().set('bitmessagesettings', 'ttl', '367200') + config.set('bitmessagesettings', 'replybelow', 'False') + config.set('bitmessagesettings', 'maxdownloadrate', '0') + config.set('bitmessagesettings', 'maxuploadrate', '0') + # config.set('bitmessagesettings', 'maxoutboundconnections', '8') + # config.set('bitmessagesettings', 'ttl', '367200') # UI setting to stop trying to send messages after X days/months - BMConfigParser().set( - 'bitmessagesettings', 'stopresendingafterxdays', '') - BMConfigParser().set( - 'bitmessagesettings', 'stopresendingafterxmonths', '') - # BMConfigParser().set( - # 'bitmessagesettings', 'timeperiod', '-1') + config.set('bitmessagesettings', 'stopresendingafterxdays', '') + config.set('bitmessagesettings', 'stopresendingafterxmonths', '') + # config.set('bitmessagesettings', 'timeperiod', '-1') # Are you hoping to add a new option to the keys.dat file? You're in # the right place for adding it to users who install the software for @@ -145,7 +134,7 @@ def loadConfig(): os.makedirs(state.appdata) if not sys.platform.startswith('win'): os.umask(0o077) - BMConfigParser().save() + config.save() else: updateConfig() @@ -153,36 +142,33 @@ def loadConfig(): def updateConfig(): - settingsversion = BMConfigParser().getint( - 'bitmessagesettings', 'settingsversion') + config = BMConfigParser() + settingsversion = config.getint('bitmessagesettings', 'settingsversion') if settingsversion == 1: - BMConfigParser().set('bitmessagesettings', 'socksproxytype', 'none') - BMConfigParser().set( - 'bitmessagesettings', 'sockshostname', 'localhost') - BMConfigParser().set('bitmessagesettings', 'socksport', '9050') - BMConfigParser().set( - 'bitmessagesettings', 'socksauthentication', 'false') - BMConfigParser().set('bitmessagesettings', 'socksusername', '') - BMConfigParser().set('bitmessagesettings', 'sockspassword', '') - BMConfigParser().set('bitmessagesettings', 'sockslisten', 'false') - BMConfigParser().set('bitmessagesettings', 'keysencrypted', 'false') - BMConfigParser().set( - 'bitmessagesettings', 'messagesencrypted', 'false') + config.set('bitmessagesettings', 'socksproxytype', 'none') + config.set('bitmessagesettings', 'sockshostname', 'localhost') + config.set('bitmessagesettings', 'socksport', '9050') + config.set('bitmessagesettings', 'socksauthentication', 'false') + config.set('bitmessagesettings', 'socksusername', '') + config.set('bitmessagesettings', 'sockspassword', '') + config.set('bitmessagesettings', 'sockslisten', 'false') + config.set('bitmessagesettings', 'keysencrypted', 'false') + config.set('bitmessagesettings', 'messagesencrypted', 'false') settingsversion = 2 # let class_sqlThread update SQL and continue elif settingsversion == 4: - BMConfigParser().set( + config.set( 'bitmessagesettings', 'defaultnoncetrialsperbyte', str(defaults.networkDefaultProofOfWorkNonceTrialsPerByte)) - BMConfigParser().set( + config.set( 'bitmessagesettings', 'defaultpayloadlengthextrabytes', str(defaults.networkDefaultPayloadLengthExtraBytes)) settingsversion = 5 if settingsversion == 5: - BMConfigParser().set( + config.set( 'bitmessagesettings', 'maxacceptablenoncetrialsperbyte', '0') - BMConfigParser().set( + config.set( 'bitmessagesettings', 'maxacceptablepayloadlengthextrabytes', '0') settingsversion = 7 @@ -200,60 +186,54 @@ def updateConfig(): # ) # settingsversion = 7 - if not BMConfigParser().has_option('bitmessagesettings', 'sockslisten'): - BMConfigParser().set('bitmessagesettings', 'sockslisten', 'false') + if not config.has_option('bitmessagesettings', 'sockslisten'): + config.set('bitmessagesettings', 'sockslisten', 'false') - if not BMConfigParser().has_option('bitmessagesettings', 'userlocale'): - BMConfigParser().set('bitmessagesettings', 'userlocale', 'system') + if not config.has_option('bitmessagesettings', 'userlocale'): + config.set('bitmessagesettings', 'userlocale', 'system') - if not BMConfigParser().has_option( - 'bitmessagesettings', 'sendoutgoingconnections'): - BMConfigParser().set( - 'bitmessagesettings', 'sendoutgoingconnections', 'True') + if not config.has_option('bitmessagesettings', 'sendoutgoingconnections'): + config.set('bitmessagesettings', 'sendoutgoingconnections', 'True') - if not BMConfigParser().has_option( - 'bitmessagesettings', 'useidenticons'): - BMConfigParser().set('bitmessagesettings', 'useidenticons', 'True') - if not BMConfigParser().has_option( - 'bitmessagesettings', 'identiconsuffix'): + if not config.has_option('bitmessagesettings', 'useidenticons'): + config.set('bitmessagesettings', 'useidenticons', 'True') + if not config.has_option('bitmessagesettings', 'identiconsuffix'): # acts as a salt - BMConfigParser().set( + config.set( 'bitmessagesettings', 'identiconsuffix', ''.join(helper_random.randomchoice( "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" - ) for x in range(12) + ) for x in range(12) )) # a twelve character pseudo-password to salt the identicons # Add settings to support no longer resending messages after # a certain period of time even if we never get an ack if settingsversion == 7: - BMConfigParser().set( - 'bitmessagesettings', 'stopresendingafterxdays', '') - BMConfigParser().set( - 'bitmessagesettings', 'stopresendingafterxmonths', '') + config.set('bitmessagesettings', 'stopresendingafterxdays', '') + config.set('bitmessagesettings', 'stopresendingafterxmonths', '') settingsversion = 8 # With the change to protocol version 3, reset the user-settable # difficulties to 1 if settingsversion == 8: - BMConfigParser().set( + config.set( 'bitmessagesettings', 'defaultnoncetrialsperbyte', str(defaults.networkDefaultProofOfWorkNonceTrialsPerByte)) - BMConfigParser().set( + config.set( 'bitmessagesettings', 'defaultpayloadlengthextrabytes', str(defaults.networkDefaultPayloadLengthExtraBytes)) previousTotalDifficulty = int( - BMConfigParser().getint( + config.getint( 'bitmessagesettings', 'maxacceptablenoncetrialsperbyte') ) / 320 previousSmallMessageDifficulty = int( - BMConfigParser().getint( + config.getint( 'bitmessagesettings', 'maxacceptablepayloadlengthextrabytes') ) / 14000 - BMConfigParser().set( + config.set( 'bitmessagesettings', 'maxacceptablenoncetrialsperbyte', str(previousTotalDifficulty * 1000)) - BMConfigParser().set( + config.set( 'bitmessagesettings', 'maxacceptablepayloadlengthextrabytes', str(previousSmallMessageDifficulty * 1000)) settingsversion = 9 @@ -261,75 +241,70 @@ def updateConfig(): # Adjust the required POW values for each of this user's addresses # to conform to protocol v3 norms. if settingsversion == 9: - for addressInKeysFile in BMConfigParser().addresses(): + for addressInKeysFile in config.addresses(): try: previousTotalDifficulty = float( - BMConfigParser().getint( + config.getint( addressInKeysFile, 'noncetrialsperbyte')) / 320 previousSmallMessageDifficulty = float( - BMConfigParser().getint( + config.getint( addressInKeysFile, 'payloadlengthextrabytes')) / 14000 if previousTotalDifficulty <= 2: previousTotalDifficulty = 1 if previousSmallMessageDifficulty < 1: previousSmallMessageDifficulty = 1 - BMConfigParser().set( + config.set( addressInKeysFile, 'noncetrialsperbyte', str(int(previousTotalDifficulty * 1000))) - BMConfigParser().set( + config.set( addressInKeysFile, 'payloadlengthextrabytes', str(int(previousSmallMessageDifficulty * 1000))) except Exception: continue - BMConfigParser().set('bitmessagesettings', 'maxdownloadrate', '0') - BMConfigParser().set('bitmessagesettings', 'maxuploadrate', '0') + config.set('bitmessagesettings', 'maxdownloadrate', '0') + config.set('bitmessagesettings', 'maxuploadrate', '0') settingsversion = 10 # sanity check - if BMConfigParser().safeGetInt( + if config.safeGetInt( 'bitmessagesettings', 'maxacceptablenoncetrialsperbyte') == 0: - BMConfigParser().set( + config.set( 'bitmessagesettings', 'maxacceptablenoncetrialsperbyte', - str( - defaults.ridiculousDifficulty - * defaults.networkDefaultProofOfWorkNonceTrialsPerByte) + str(defaults.ridiculousDifficulty * + defaults.networkDefaultProofOfWorkNonceTrialsPerByte) ) - if BMConfigParser().safeGetInt( + if config.safeGetInt( 'bitmessagesettings', 'maxacceptablepayloadlengthextrabytes' ) == 0: - BMConfigParser().set( + config.set( 'bitmessagesettings', 'maxacceptablepayloadlengthextrabytes', - str( - defaults.ridiculousDifficulty - * defaults.networkDefaultPayloadLengthExtraBytes) + str(defaults.ridiculousDifficulty * + defaults.networkDefaultPayloadLengthExtraBytes) ) - if not BMConfigParser().has_option('bitmessagesettings', 'onionhostname'): - BMConfigParser().set('bitmessagesettings', 'onionhostname', '') - if not BMConfigParser().has_option('bitmessagesettings', 'onionport'): - BMConfigParser().set('bitmessagesettings', 'onionport', '8444') - if not BMConfigParser().has_option('bitmessagesettings', 'onionbindip'): - BMConfigParser().set('bitmessagesettings', 'onionbindip', '127.0.0.1') - if not BMConfigParser().has_option('bitmessagesettings', 'smtpdeliver'): - BMConfigParser().set('bitmessagesettings', 'smtpdeliver', '') - if not BMConfigParser().has_option( + if not config.has_option('bitmessagesettings', 'onionhostname'): + config.set('bitmessagesettings', 'onionhostname', '') + if not config.has_option('bitmessagesettings', 'onionport'): + config.set('bitmessagesettings', 'onionport', '8444') + if not config.has_option('bitmessagesettings', 'onionbindip'): + config.set('bitmessagesettings', 'onionbindip', '127.0.0.1') + if not config.has_option('bitmessagesettings', 'smtpdeliver'): + config.set('bitmessagesettings', 'smtpdeliver', '') + if not config.has_option( 'bitmessagesettings', 'hidetrayconnectionnotifications'): - BMConfigParser().set( + config.set( 'bitmessagesettings', 'hidetrayconnectionnotifications', 'false') - if BMConfigParser().safeGetInt( - 'bitmessagesettings', 'maxoutboundconnections') < 1: - BMConfigParser().set( - 'bitmessagesettings', 'maxoutboundconnections', '8') + if config.safeGetInt('bitmessagesettings', 'maxoutboundconnections') < 1: + config.set('bitmessagesettings', 'maxoutboundconnections', '8') print('WARNING: your maximum outbound connections must be a number.') # TTL is now user-specifiable. Let's add an option to save # whatever the user selects. - if not BMConfigParser().has_option('bitmessagesettings', 'ttl'): - BMConfigParser().set('bitmessagesettings', 'ttl', '367200') + if not config.has_option('bitmessagesettings', 'ttl'): + config.set('bitmessagesettings', 'ttl', '367200') - BMConfigParser().set( - 'bitmessagesettings', 'settingsversion', str(settingsversion)) - BMConfigParser().save() + config.set('bitmessagesettings', 'settingsversion', str(settingsversion)) + config.save() def isOurOperatingSystemLimitedToHavingVeryFewHalfOpenConnections(): From c1868456dffbb65c544d4a6ef57cfcc787254ead Mon Sep 17 00:00:00 2001 From: surbhi Date: Tue, 3 Jul 2018 14:38:02 +0530 Subject: [PATCH 08/18] Added kivy basic architecture for support mobile client PyBitmessage --- src/main.kv | 16 ++++++++ src/main.py | 4 ++ src/mpybit.py | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 132 insertions(+) create mode 100644 src/main.kv create mode 100644 src/main.py create mode 100644 src/mpybit.py diff --git a/src/main.kv b/src/main.kv new file mode 100644 index 00000000..9125608e --- /dev/null +++ b/src/main.kv @@ -0,0 +1,16 @@ +: + BoxLayout: + AnchorLayout: + TextInput: + id: user_input + + BoxLayout: + Button: + id: sendmessage + text: 'SendMessage' + on_press: root.send() + + Button: + id: btnExit + text: "Exit" + on_press: root.say_exit() diff --git a/src/main.py b/src/main.py new file mode 100644 index 00000000..6fb9beda --- /dev/null +++ b/src/main.py @@ -0,0 +1,4 @@ +from bitmessagemain import main + +if __name__ == '__main__': + main() diff --git a/src/mpybit.py b/src/mpybit.py new file mode 100644 index 00000000..a6457b49 --- /dev/null +++ b/src/mpybit.py @@ -0,0 +1,112 @@ +from kivy.app import App +from kivy.uix.boxlayout import BoxLayout +from kivy.core.window import Window +from os import environ + +# environ['BITMESSAGE_HOME'] = '~/home/cis/Desktop/pybit' +# environ['HOME'] = '~/home/cis/Desktop/pybit' + +from bmconfigparser import BMConfigParser +from helper_ackPayload import genAckPayload +from addresses import decodeAddress, addBMIfNotPresent +from class_sqlThread import sqlThread +from helper_sql import sqlQuery, sqlExecute, sqlExecuteChunked, sqlStoredProcedure +import time +import queues +import state +import threading +import shutdown +from inventory import Inventory +statusIconColor = 'red' + + +class Login_Screen(BoxLayout): + + + def send(self): + # print(len(Inventory()), "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF") + # print(len(Inventory().unexpired_hashes_by_stream(1)), "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDdd") + queues.apiAddressGeneratorReturnQueue.queue.clear() + streamNumberForAddress = 1 + label = "CisDevelper" + eighteenByteRipe = False + nonceTrialsPerByte = 1000 + payloadLengthExtraBytes = 1000 + print("BREAK POINT STARTING @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@") + queues.addressGeneratorQueue.put( ( + 'createRandomAddress', 4, streamNumberForAddress, label, 1, "", eighteenByteRipe, nonceTrialsPerByte, payloadLengthExtraBytes ) + ) + print(BMConfigParser().sections(), "BMConfigParser().sections()") + fromAddress = queues.apiAddressGeneratorReturnQueue.get() + print("BREAK POINT ENDING //////////////////////////////////////////////////////////////////") + # toAddress = "BM-NBqmcWH5XJMmXCVxD4HVTNPe3naGgHgE" + toAddress = "BM-2cWyUfBdY2FbgyuCb7abFZ49JYxSzUhNFe" + message = self.ids.user_input.text + subject = 'Test' + encoding = 3 + print("message: ", self.ids.user_input.text) + sendMessageToPeople = True + if sendMessageToPeople: + if toAddress != '': + status, addressVersionNumber, streamNumber, ripe = decodeAddress(toAddress) + if status == 'success': + toAddress = addBMIfNotPresent(toAddress) + + if addressVersionNumber > 4 or addressVersionNumber <= 1: + print("addressVersionNumber > 4 or addressVersionNumber <= 1") + if streamNumber > 1 or streamNumber == 0: + print("streamNumber > 1 or streamNumber == 0") + if statusIconColor == 'red': + print("shared.statusIconColor == 'red'") + stealthLevel = BMConfigParser().safeGetInt( + 'bitmessagesettings', 'ackstealthlevel') + ackdata = genAckPayload(streamNumber, stealthLevel) + t = () + sqlExecute( + '''INSERT INTO sent VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)''', + '', + toAddress, + ripe, + fromAddress, + subject, + message, + ackdata, + int(time.time()), + int(time.time()), + 0, + 'msgqueued', + 0, + 'sent', + encoding, + BMConfigParser().getint('bitmessagesettings', 'ttl')) + toLabel = '' + # queryreturn = sqlQuery('''select status from sent''') + # if queryreturn != []: + # for row in queryreturn: + # print(row, "YZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZZYZYZYZYZYZYZYZYZY") + # toLabel, = row + queues.workerQueue.put(('sendmessage', toAddress)) + print("sqlExecute successfully ##### ##################") + + # App.get_running_app().stop() + # Window.close() + # shutdown.doCleanShutdown() + for i in threading.enumerate(): + print (i.name) + # from threading import Timer + # t = Timer(300.0, connectedHostsList()) + # t.start() + # print(connectedHostsList()) + print("calling connectios") + return None + + def say_exit(self): + print ("**************************EXITING FROM APPLICATION*****************************") + shutdown.doCleanShutdown() + Window.close() + +class MainApp(App): + + + def build(self): + return Login_Screen() From b4a0d8ad37879ce7df5c765c659e7447087d12ff Mon Sep 17 00:00:00 2001 From: surbhi Date: Tue, 3 Jul 2018 15:36:20 +0530 Subject: [PATCH 09/18] fix codacy coding standards issue --- src/main.kv | 4 +-- src/main.py | 3 +- src/mpybit.py | 81 +++++++++++++++++++++++---------------------------- 3 files changed, 40 insertions(+), 48 deletions(-) diff --git a/src/main.kv b/src/main.kv index 9125608e..8ea56c6b 100644 --- a/src/main.kv +++ b/src/main.kv @@ -1,4 +1,4 @@ -: +: BoxLayout: AnchorLayout: TextInput: @@ -13,4 +13,4 @@ Button: id: btnExit text: "Exit" - on_press: root.say_exit() + on_press: root.sayexit() diff --git a/src/main.py b/src/main.py index 6fb9beda..673b1307 100644 --- a/src/main.py +++ b/src/main.py @@ -1,4 +1,5 @@ -from bitmessagemain import main +from bitmessagemain import main # import main method to run first for thread start if __name__ == '__main__': + """python main will call for bitmessage main to start threads.""" main() diff --git a/src/mpybit.py b/src/mpybit.py index a6457b49..050e3013 100644 --- a/src/mpybit.py +++ b/src/mpybit.py @@ -1,45 +1,51 @@ -from kivy.app import App -from kivy.uix.boxlayout import BoxLayout -from kivy.core.window import Window -from os import environ +import threading -# environ['BITMESSAGE_HOME'] = '~/home/cis/Desktop/pybit' -# environ['HOME'] = '~/home/cis/Desktop/pybit' +import time + + +from addresses import addBMIfNotPresent, decodeAddress from bmconfigparser import BMConfigParser + from helper_ackPayload import genAckPayload -from addresses import decodeAddress, addBMIfNotPresent -from class_sqlThread import sqlThread -from helper_sql import sqlQuery, sqlExecute, sqlExecuteChunked, sqlStoredProcedure -import time + + +from helper_sql import sqlExecute + + +from kivy.app import App +from kivy.core.window import Window +from kivy.uix.boxlayout import BoxLayout + import queues -import state -import threading + import shutdown -from inventory import Inventory statusIconColor = 'red' -class Login_Screen(BoxLayout): - +class LoginScreen(BoxLayout): + """This will use for sending message to recipents from mobile client.""" def send(self): - # print(len(Inventory()), "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF") - # print(len(Inventory().unexpired_hashes_by_stream(1)), "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDdd") + """Send used for sending message with title and body.""" queues.apiAddressGeneratorReturnQueue.queue.clear() streamNumberForAddress = 1 label = "CisDevelper" eighteenByteRipe = False nonceTrialsPerByte = 1000 payloadLengthExtraBytes = 1000 - print("BREAK POINT STARTING @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@") - queues.addressGeneratorQueue.put( ( - 'createRandomAddress', 4, streamNumberForAddress, label, 1, "", eighteenByteRipe, nonceTrialsPerByte, payloadLengthExtraBytes ) + print("BREAK POINT STARTING") + queues.addressGeneratorQueue.put( + ( + 'createRandomAddress', 4, + streamNumberForAddress, label, 1, + "", eighteenByteRipe, nonceTrialsPerByte, + payloadLengthExtraBytes + ) ) print(BMConfigParser().sections(), "BMConfigParser().sections()") fromAddress = queues.apiAddressGeneratorReturnQueue.get() - print("BREAK POINT ENDING //////////////////////////////////////////////////////////////////") - # toAddress = "BM-NBqmcWH5XJMmXCVxD4HVTNPe3naGgHgE" + print("BREAK POINT ENDING") toAddress = "BM-2cWyUfBdY2FbgyuCb7abFZ49JYxSzUhNFe" message = self.ids.user_input.text subject = 'Test' @@ -48,7 +54,8 @@ class Login_Screen(BoxLayout): sendMessageToPeople = True if sendMessageToPeople: if toAddress != '': - status, addressVersionNumber, streamNumber, ripe = decodeAddress(toAddress) + status, addressVersionNumber, streamNumber, ripe = decodeAddress( + toAddress) if status == 'success': toAddress = addBMIfNotPresent(toAddress) @@ -61,7 +68,6 @@ class Login_Screen(BoxLayout): stealthLevel = BMConfigParser().safeGetInt( 'bitmessagesettings', 'ackstealthlevel') ackdata = genAckPayload(streamNumber, stealthLevel) - t = () sqlExecute( '''INSERT INTO sent VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)''', '', @@ -79,34 +85,19 @@ class Login_Screen(BoxLayout): 'sent', encoding, BMConfigParser().getint('bitmessagesettings', 'ttl')) - toLabel = '' - # queryreturn = sqlQuery('''select status from sent''') - # if queryreturn != []: - # for row in queryreturn: - # print(row, "YZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZZYZYZYZYZYZYZYZYZY") - # toLabel, = row queues.workerQueue.put(('sendmessage', toAddress)) print("sqlExecute successfully ##### ##################") - - # App.get_running_app().stop() - # Window.close() - # shutdown.doCleanShutdown() - for i in threading.enumerate(): - print (i.name) - # from threading import Timer - # t = Timer(300.0, connectedHostsList()) - # t.start() - # print(connectedHostsList()) - print("calling connectios") + for i in threading.enumerate(): + print(i.name) return None - def say_exit(self): - print ("**************************EXITING FROM APPLICATION*****************************") + def sayexit(self): + print("**************************EXITING FROM APPLICATION*****************************") shutdown.doCleanShutdown() Window.close() + class MainApp(App): - def build(self): - return Login_Screen() + return LoginScreen() From d7efd746f2fb2bb644996f29eaab943cefc461e6 Mon Sep 17 00:00:00 2001 From: surbhi Date: Tue, 3 Jul 2018 15:45:42 +0530 Subject: [PATCH 10/18] fix Missing module docstring issue with other pep8 --- src/main.py | 4 ++-- src/mpybit.py | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main.py b/src/main.py index 673b1307..a5bd9400 100644 --- a/src/main.py +++ b/src/main.py @@ -1,5 +1,5 @@ -from bitmessagemain import main # import main method to run first for thread start +from bitmessagemain import main +# import main method to run first for thread start. if __name__ == '__main__': - """python main will call for bitmessage main to start threads.""" main() diff --git a/src/mpybit.py b/src/mpybit.py index 050e3013..5d2afeec 100644 --- a/src/mpybit.py +++ b/src/mpybit.py @@ -92,12 +92,16 @@ class LoginScreen(BoxLayout): return None def sayexit(self): + """This method will exit the application screen.""" print("**************************EXITING FROM APPLICATION*****************************") shutdown.doCleanShutdown() Window.close() class MainApp(App): - + """The App class is the base for creating Kivy applications + Think of it as your main entry point into the Kivy run loop.""" def build(self): + """To initialize an app with a widget tree, we need to override the build() + method in our app class and return the widget tree which we have constructed..""" return LoginScreen() From 6b2f82a7cdfa43c1a8424dc0507142b88c8e403d Mon Sep 17 00:00:00 2001 From: surbhi Date: Tue, 3 Jul 2018 19:30:19 +0530 Subject: [PATCH 11/18] Added suggested review changes for PR 1297 --- src/main.py | 2 +- src/mpybit.py | 27 +++++++-------------------- 2 files changed, 8 insertions(+), 21 deletions(-) diff --git a/src/main.py b/src/main.py index a5bd9400..fbaab682 100644 --- a/src/main.py +++ b/src/main.py @@ -1,5 +1,5 @@ +"""This module is for thread start.""" from bitmessagemain import main -# import main method to run first for thread start. if __name__ == '__main__': main() diff --git a/src/mpybit.py b/src/mpybit.py index 5d2afeec..f2e422dc 100644 --- a/src/mpybit.py +++ b/src/mpybit.py @@ -1,18 +1,13 @@ -import threading - import time - from addresses import addBMIfNotPresent, decodeAddress from bmconfigparser import BMConfigParser from helper_ackPayload import genAckPayload - from helper_sql import sqlExecute - from kivy.app import App from kivy.core.window import Window from kivy.uix.boxlayout import BoxLayout @@ -27,25 +22,21 @@ class LoginScreen(BoxLayout): """This will use for sending message to recipents from mobile client.""" def send(self): - """Send used for sending message with title and body.""" + """This used for sending message with subject and body.""" queues.apiAddressGeneratorReturnQueue.queue.clear() streamNumberForAddress = 1 label = "CisDevelper" eighteenByteRipe = False nonceTrialsPerByte = 1000 payloadLengthExtraBytes = 1000 - print("BREAK POINT STARTING") - queues.addressGeneratorQueue.put( - ( - 'createRandomAddress', 4, - streamNumberForAddress, label, 1, - "", eighteenByteRipe, nonceTrialsPerByte, - payloadLengthExtraBytes - ) - ) + queues.addressGeneratorQueue.put(( + 'createRandomAddress', 4, + streamNumberForAddress, label, 1, + "", eighteenByteRipe, nonceTrialsPerByte, + payloadLengthExtraBytes + )) print(BMConfigParser().sections(), "BMConfigParser().sections()") fromAddress = queues.apiAddressGeneratorReturnQueue.get() - print("BREAK POINT ENDING") toAddress = "BM-2cWyUfBdY2FbgyuCb7abFZ49JYxSzUhNFe" message = self.ids.user_input.text subject = 'Test' @@ -86,14 +77,10 @@ class LoginScreen(BoxLayout): encoding, BMConfigParser().getint('bitmessagesettings', 'ttl')) queues.workerQueue.put(('sendmessage', toAddress)) - print("sqlExecute successfully ##### ##################") - for i in threading.enumerate(): - print(i.name) return None def sayexit(self): """This method will exit the application screen.""" - print("**************************EXITING FROM APPLICATION*****************************") shutdown.doCleanShutdown() Window.close() From 4770790597123d5b2cfbbdd42a71851718de9df0 Mon Sep 17 00:00:00 2001 From: surbhi Date: Thu, 5 Jul 2018 19:07:16 +0530 Subject: [PATCH 12/18] Added kivy for making it run on Desktop and Mobile Clients --- src/bitmessagemain.py | 11 +++++++---- src/main.py | 3 +++ src/state.py | 2 ++ 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/bitmessagemain.py b/src/bitmessagemain.py index 31a475dd..0a1d835b 100755 --- a/src/bitmessagemain.py +++ b/src/bitmessagemain.py @@ -69,7 +69,6 @@ import helper_bootstrap import helper_generic import helper_threading - def connectToStream(streamNumber): state.streamsInWhichIAmParticipating.append(streamNumber) selfInitiatedConnections[streamNumber] = {} @@ -390,18 +389,22 @@ class Main: # Populate with hardcoded value (same as connectToStream above) state.streamsInWhichIAmParticipating.append(1) - if not state.enableGUI: - BMConfigParser().remove_option('bitmessagesettings', 'dontconnect') - elif daemon is False: + if daemon is False and state.enableGUI: if state.curses: if not depends.check_curses(): sys.exit() print('Running with curses') import bitmessagecurses bitmessagecurses.runwrapper() + elif state.kivy: + BMConfigParser().remove_option('bitmessagesettings', 'dontconnect') + from mpybit import MainApp + MainApp().run() else: import bitmessageqt bitmessageqt.run() + else: + BMConfigParser().remove_option('bitmessagesettings', 'dontconnect') if daemon: if state.testmode: diff --git a/src/main.py b/src/main.py index fbaab682..969dbe56 100644 --- a/src/main.py +++ b/src/main.py @@ -1,5 +1,8 @@ """This module is for thread start.""" from bitmessagemain import main +import state if __name__ == '__main__': + state.kivy = True + print("Kivy Loading......") main() diff --git a/src/state.py b/src/state.py index d0433059..834b60be 100644 --- a/src/state.py +++ b/src/state.py @@ -68,3 +68,5 @@ resetNetworkProtocolAvailability() dandelion = 0 testmode = False + +kivy = False From 7aac991c4fb35180b276c308121ec41d924bd054 Mon Sep 17 00:00:00 2001 From: surbhi Date: Thu, 5 Jul 2018 19:15:18 +0530 Subject: [PATCH 13/18] Changes made on UI for Desktop and Mobile Clients --- src/main.kv | 11 +++++++++++ src/mpybit.py | 5 +++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main.kv b/src/main.kv index 8ea56c6b..f3228fdf 100644 --- a/src/main.kv +++ b/src/main.kv @@ -1,16 +1,27 @@ +: + font_size: 26 : + padding: 200 + spacing: 10 + rows:2 + BoxLayout: AnchorLayout: TextInput: id: user_input + font_size: 65 + hint_text: "enter text" BoxLayout: + spacing: 10 Button: + background_color: (1.0, 2.0, 8.0, 1.0) id: sendmessage text: 'SendMessage' on_press: root.send() Button: + background_color: (1.0, 2.0, 8.0, 1.0) id: btnExit text: "Exit" on_press: root.sayexit() diff --git a/src/mpybit.py b/src/mpybit.py index f2e422dc..b40c7cee 100644 --- a/src/mpybit.py +++ b/src/mpybit.py @@ -10,7 +10,8 @@ from helper_sql import sqlExecute from kivy.app import App from kivy.core.window import Window -from kivy.uix.boxlayout import BoxLayout +# from kivy.uix.boxlayout import BoxLayout +from kivy.uix.gridlayout import GridLayout import queues @@ -18,7 +19,7 @@ import shutdown statusIconColor = 'red' -class LoginScreen(BoxLayout): +class LoginScreen(GridLayout): """This will use for sending message to recipents from mobile client.""" def send(self): From c22fd4e8a7a58ad715d9fa0e49c58c88e17a4e77 Mon Sep 17 00:00:00 2001 From: surbhi Date: Sat, 7 Jul 2018 17:41:58 +0530 Subject: [PATCH 14/18] Changes made on UI for Desktop and Mobile Clients with suggested review changes --- src/buildozer.spec | 275 +++++++++++++++++++++++++++++++++++++++++++++ src/main.kv | 182 ++++++++++++++++++++++++++---- src/mpybit.py | 20 ++-- 3 files changed, 447 insertions(+), 30 deletions(-) create mode 100644 src/buildozer.spec diff --git a/src/buildozer.spec b/src/buildozer.spec new file mode 100644 index 00000000..07f9e6b2 --- /dev/null +++ b/src/buildozer.spec @@ -0,0 +1,275 @@ +[app] + +# (str) Title of your application +title = PyBitmessage + +# (str) Package name +package.name = PyBitmessage + +# (str) Package domain (needed for android/ios packaging) +package.domain = org.test + +# (str) Source code where the main.py live +source.dir = . + +# (list) Source files to include (let empty to include all the files) +source.include_exts = py,png,jpg,kv,atlas + +# (list) List of inclusions using pattern matching +#source.include_patterns = assets/*,images/*.png + +# (list) Source files to exclude (let empty to not exclude anything) +#source.exclude_exts = spec + +# (list) List of directory to exclude (let empty to not exclude anything) +#source.exclude_dirs = tests, bin + +# (list) List of exclusions using pattern matching +#source.exclude_patterns = license,images/*/*.jpg + +# (str) Application versioning (method 1) +version = 0.1 + +# (str) Application versioning (method 2) +# version.regex = __version__ = ['"](.*)['"] +# version.filename = %(source.dir)s/main.py + +# (list) Application requirements +# comma seperated e.g. requirements = sqlite3,kivy +requirements = python2, sqlite3, kivy, openssl + +# (str) Custom source folders for requirements +# Sets custom source for any requirements with recipes +# requirements.source.kivy = ../../kivy +#requirements.source.sqlite3 = + +# (list) Garden requirements +#garden_requirements = + +# (str) Presplash of the application +#presplash.filename = %(source.dir)s/data/presplash.png + +# (str) Icon of the application +#icon.filename = %(source.dir)s/data/icon.png + +# (str) Supported orientation (one of landscape, portrait or all) +orientation = portrait + +# (list) List of service to declare +#services = NAME:ENTRYPOINT_TO_PY,NAME2:ENTRYPOINT2_TO_PY + +# +# OSX Specific +# + +# +# author = © Copyright Info + +# change the major version of python used by the app +#osx.python_version = 2 + + +# Kivy version to use +osx.kivy_version = 1.9.1 + +# +# Android specific +# + +# (bool) Indicate if the application should be fullscreen or not +fullscreen = 0 + +# (string) Presplash background color (for new android toolchain) +# Supported formats are: #RRGGBB #AARRGGBB or one of the following names: +# red, blue, green, black, white, gray, cyan, magenta, yellow, lightgray, +# darkgray, grey, lightgrey, darkgrey, aqua, fuchsia, lime, maroon, navy, +# olive, purple, silver, teal. +#android.presplash_color = #FFFFFF + +# (list) Permissions +android.permissions = INTERNET + +# (int) Android API to use +#android.api = 19 + +# (int) Minimum API required +#android.minapi = 9 + +# (int) Android SDK version to use +#android.sdk = 20 + +# (str) Android NDK version to use +#android.ndk = 9c + +# (bool) Use --private data storage (True) or --dir public storage (False) +#android.private_storage = True + +# (str) Android NDK directory (if empty, it will be automatically downloaded.) +#android.ndk_path = + +# (str) Android SDK directory (if empty, it will be automatically downloaded.) +#android.sdk_path = + +# (str) ANT directory (if empty, it will be automatically downloaded.) +#android.ant_path = + +# (bool) If True, then skip trying to update the Android sdk +# This can be useful to avoid excess Internet downloads or save time +# when an update is due and you just want to test/build your package +# android.skip_update = False + +# (str) Android entry point, default is ok for Kivy-based app +#android.entrypoint = org.renpy.android.PythonActivity + +# (list) Pattern to whitelist for the whole project +#android.whitelist = + +android.whitelist = /usr/lib/komodo-edit/python/lib/python2.7/lib-dynload/_sqlite3.so + + +# (str) Path to a custom whitelist file +#android.whitelist_src = + +# (str) Path to a custom blacklist file +#android.blacklist_src = + +# (list) List of Java .jar files to add to the libs so that pyjnius can access +# their classes. Don't add jars that you do not need, since extra jars can slow +# down the build process. Allows wildcards matching, for example: +# OUYA-ODK/libs/*.jar +#android.add_jars = foo.jar,bar.jar,path/to/more/*.jar + +# (list) List of Java files to add to the android project (can be java or a +# directory containing the files) +#android.add_src = + +# (list) Android AAR archives to add (currently works only with sdl2_gradle +# bootstrap) +#android.add_aars = + +# (list) Gradle dependencies to add (currently works only with sdl2_gradle +# bootstrap) +#android.gradle_dependencies = +, /home/cis/Downloads/libssl1.0.2_1.0.2l-2+deb9u2_amd64 +# (str) python-for-android branch to use, defaults to stable +#p4a.branch = stable + +# (str) OUYA Console category. Should be one of GAME or APP +# If you leave this blank, OUYA support will not be enabled +#android.ouya.category = GAME + +# (str) Filename of OUYA Console icon. It must be a 732x412 png image. +#android.ouya.icon.filename = %(source.dir)s/data/ouya_icon.png + +# (str) XML file to include as an intent filters in tag +#android.manifest.intent_filters = + +# (list) Android additionnal libraries to copy into libs/armeabi +#android.add_libs_armeabi = libs/android/*.so +#android.add_libs_armeabi_v7a = libs/android-v7/*.so +#android.add_libs_x86 = libs/android-x86/*.so +#android.add_libs_mips = libs/android-mips/*.so + +# (bool) Indicate whether the screen should stay on +# Don't forget to add the WAKE_LOCK permission if you set this to True +#android.wakelock = False + +# (list) Android application meta-data to set (key=value format) +#android.meta_data = + +# (list) Android library project to add (will be added in the +# project.properties automatically.) +#android.library_references = + +# (str) Android logcat filters to use +#android.logcat_filters = *:S python:D + +# (bool) Copy library instead of making a libpymodules.so +#android.copy_libs = 1 + +# (str) The Android arch to build for, choices: armeabi-v7a, arm64-v8a, x86 +android.arch = armeabi-v7a + +# +# Python for android (p4a) specific +# + +# (str) python-for-android git clone directory (if empty, it will be automatically cloned from github) +#p4a.source_dir = + +# (str) The directory in which python-for-android should look for your own build recipes (if any) +#p4a.local_recipes = + +# (str) Filename to the hook for p4a +#p4a.hook = + +# (str) Bootstrap to use for android builds +# p4a.bootstrap = sdl2 + + +# +# iOS specific +# + +# (str) Path to a custom kivy-ios folder +#ios.kivy_ios_dir = ../kivy-ios + +# (str) Name of the certificate to use for signing the debug version +# Get a list of available identities: buildozer ios list_identities +#ios.codesign.debug = "iPhone Developer: ()" + +# (str) Name of the certificate to use for signing the release version +#ios.codesign.release = %(ios.codesign.debug)s + + +[buildozer] + +# (int) Log level (0 = error only, 1 = info, 2 = debug (with command output)) +log_level = 2 + +# (int) Display warning if buildozer is run as root (0 = False, 1 = True) +warn_on_root = 1 + +# (str) Path to build artifact storage, absolute or relative to spec file +# build_dir = ./.buildozer + +# (str) Path to build output (i.e. .apk, .ipa) storage +# bin_dir = ./bin + +# ----------------------------------------------------------------------------- +# List as sections +# +# You can define all the "list" as [section:key]. +# Each line will be considered as a option to the list. +# Let's take [app] / source.exclude_patterns. +# Instead of doing: +# +#[app] +#source.exclude_patterns = license,data/audio/*.wav,data/images/original/* +# +# This can be translated into: +# +#[app:source.exclude_patterns] +#license +#data/audio/*.wav +#data/images/original/* +# + + +# ----------------------------------------------------------------------------- +# Profiles +# +# You can extend section / key with a profile +# For example, you want to deploy a demo version of your application without +# HD content. You could first change the title to add "(demo)" in the name +# and extend the excluded directories to remove the HD content. +# +#[app@demo] +#title = My Application (demo) +# +#[app:source.exclude_patterns@demo] +#images/hd/* +# +# Then, invoke the command line with the "demo" profile: +# +#buildozer --profile demo android debug diff --git a/src/main.kv b/src/main.kv index f3228fdf..9cfc0352 100644 --- a/src/main.kv +++ b/src/main.kv @@ -1,27 +1,167 @@ -: - font_size: 26 -: - padding: 200 - spacing: 10 - rows:2 +#:import FadeTransition kivy.uix.screenmanager.FadeTransition +: BoxLayout: - AnchorLayout: + orientation: "vertical" + BoxLayout: + size_hint: 1, None + height: '48dp' + Button: + text: 'messages' + on_release: sm.current = 'screen_one' + background_color: (0,0,0,0) + color: 0,0,0,1 + Button: + text: 'send' + on_release: sm.current = 'screen_two' + background_color: (0,0,0,0) + color: 0,0,0,1 + Button: + text: 'subscription' + on_release: sm.current = 'screen_three' + background_color: (0,0,0,0) + color: 0,0,0,1 + Button: + text: 'four' + on_release: sm.current = 'screen_four' + background_color: (0,0,0,0) + color: 0,0,0,1 + + Button: + text: 'chans' + on_release: sm.current = 'screen_five' + background_color: (0,0,0,0) + color: 0,0,0,1 + Button: + text: 'blacklist' + on_release: sm.current = 'screen_six' + background_color: (0,0,0,0) + color: 0,0,0,1 + + ScreenManager: + id: sm + transition: FadeTransition() + Screen_One: + Screen_Two: + Screen_three: + Screen_four: + Screen_five: + Screen_six: + EmailScreen: + +: + name: 'screen_one' + BoxLayout: + padding: 10,10,10,300 + orientation: "vertical" + Button: + text: "create" + size_hint_y: 0.3 + size_hint_x: 0.1 + color: 0,0,0,1 + background_color: (0,0,0,0) + Button: + text: "inbox" + background_color: (0,0,0,0) + size_hint_y: 0.3 + size_hint_x: 0.1 + color: 0,0,0,1 + Button: + text: "new" + background_color: (0,0,0,0) + size_hint_y: 0.3 + size_hint_x: 0.1 + color: 0,0,0,1 + on_press: + root.manager.current = 'email' + Button: + text: "sent" + background_color: (0,0,0,0) + size_hint_y: 0.3 + size_hint_x: 0.1 + color: 0,0,0,1 + +: + name: 'screen_two' + Label: + text: "Two" + +: + name: 'screen_three' + Label: + text: "Three" + +: + name: 'screen_four' + Label: + text: "four" + +: + name: 'screen_five' + Label: + text: "Two" + +: + name: 'screen_six' + Label: + text: "Two" + +: + name: 'email' + BoxLayout: + padding: 100,10,100,100 + id: login_layout + orientation: "vertical" + GridLayout: + rows: 2 + orientation: 'vertical' + spacing: 10 + Label: + text: 'From: ' + background_color: (0,0,0,0) + color: 0,0,0,1 + font_size: 18 + pos_hint: {"x":.15,"y":1} + text_size: root.width-20, 20 + TextInput: - id: user_input - font_size: 65 - hint_text: "enter text" + multiline:False + size_hint: 1,.4 - BoxLayout: - spacing: 10 - Button: - background_color: (1.0, 2.0, 8.0, 1.0) - id: sendmessage - text: 'SendMessage' - on_press: root.send() + GridLayout: + rows: 2 + orientation: 'vertical' + Label: + text: 'To: ' + background_color: (0,0,0,0) + color: 0,0,0,1 + font_size: 18 + pos_hint: {"x":.15,"y":.5} + text_size: root.width-20, 20 + + TextInput: + multiline:False + size_hint: 1,.4 + pos_hint: {"x":.2,"y":.5} + + GridLayout: + rows: 2 + orientation: 'vertical' + Label: + text: 'Message' + background_color: (0,0,0,0) + color: 0,0,0,1 + pos_hint: {"x":.15,"y":.5} + font_size: 18 + text_size: root.width-20, 20 + + TextInput: + id: msg + multiline:True + size_hint: 1,2 Button: - background_color: (1.0, 2.0, 8.0, 1.0) - id: btnExit - text: "Exit" - on_press: root.sayexit() + text: "SEND" + size_hint_y: 0.1 + size_hint_x: 0.2 + pos_hint: {"x":.15,"y":1} \ No newline at end of file diff --git a/src/mpybit.py b/src/mpybit.py index b40c7cee..1b89ec9a 100644 --- a/src/mpybit.py +++ b/src/mpybit.py @@ -1,5 +1,7 @@ import time +from debug import logger + from addresses import addBMIfNotPresent, decodeAddress from bmconfigparser import BMConfigParser @@ -23,7 +25,7 @@ class LoginScreen(GridLayout): """This will use for sending message to recipents from mobile client.""" def send(self): - """This used for sending message with subject and body.""" + """It is used for sending message with subject and body.""" queues.apiAddressGeneratorReturnQueue.queue.clear() streamNumberForAddress = 1 label = "CisDevelper" @@ -36,13 +38,11 @@ class LoginScreen(GridLayout): "", eighteenByteRipe, nonceTrialsPerByte, payloadLengthExtraBytes )) - print(BMConfigParser().sections(), "BMConfigParser().sections()") fromAddress = queues.apiAddressGeneratorReturnQueue.get() toAddress = "BM-2cWyUfBdY2FbgyuCb7abFZ49JYxSzUhNFe" message = self.ids.user_input.text subject = 'Test' encoding = 3 - print("message: ", self.ids.user_input.text) sendMessageToPeople = True if sendMessageToPeople: if toAddress != '': @@ -52,11 +52,11 @@ class LoginScreen(GridLayout): toAddress = addBMIfNotPresent(toAddress) if addressVersionNumber > 4 or addressVersionNumber <= 1: - print("addressVersionNumber > 4 or addressVersionNumber <= 1") + logger.info("addressVersionNumber > 4 or addressVersionNumber <= 1") if streamNumber > 1 or streamNumber == 0: - print("streamNumber > 1 or streamNumber == 0") + logger.info("streamNumber > 1 or streamNumber == 0") if statusIconColor == 'red': - print("shared.statusIconColor == 'red'") + logger.info("shared.statusIconColor == 'red'") stealthLevel = BMConfigParser().safeGetInt( 'bitmessagesettings', 'ackstealthlevel') ackdata = genAckPayload(streamNumber, stealthLevel) @@ -81,7 +81,7 @@ class LoginScreen(GridLayout): return None def sayexit(self): - """This method will exit the application screen.""" + """Method will exit the application screen.""" shutdown.doCleanShutdown() Window.close() @@ -89,7 +89,9 @@ class LoginScreen(GridLayout): class MainApp(App): """The App class is the base for creating Kivy applications Think of it as your main entry point into the Kivy run loop.""" + def build(self): - """To initialize an app with a widget tree, we need to override the build() - method in our app class and return the widget tree which we have constructed..""" + """To initialize an app with a widget tree, we need to override the build(). + method in our app class and return the widget tree which we have constructed.. + """ return LoginScreen() From a859dd78e79bf04561c3590d1a543d4132d87066 Mon Sep 17 00:00:00 2001 From: surbhi Date: Mon, 9 Jul 2018 16:47:59 +0530 Subject: [PATCH 15/18] moving a kivy module to a separate folder having Ui too --- src/bitmessagekivy/__init__.py | 0 src/{ => bitmessagekivy}/main.kv | 2 +- src/{ => bitmessagekivy}/mpybit.py | 12 ++++++------ 3 files changed, 7 insertions(+), 7 deletions(-) create mode 100644 src/bitmessagekivy/__init__.py rename src/{ => bitmessagekivy}/main.kv (98%) rename src/{ => bitmessagekivy}/mpybit.py (97%) diff --git a/src/bitmessagekivy/__init__.py b/src/bitmessagekivy/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/main.kv b/src/bitmessagekivy/main.kv similarity index 98% rename from src/main.kv rename to src/bitmessagekivy/main.kv index 9cfc0352..3c73080a 100644 --- a/src/main.kv +++ b/src/bitmessagekivy/main.kv @@ -75,7 +75,7 @@ on_press: root.manager.current = 'email' Button: - text: "sent" + text: "sents" background_color: (0,0,0,0) size_hint_y: 0.3 size_hint_x: 0.1 diff --git a/src/mpybit.py b/src/bitmessagekivy/mpybit.py similarity index 97% rename from src/mpybit.py rename to src/bitmessagekivy/mpybit.py index 1b89ec9a..8a6e6265 100644 --- a/src/mpybit.py +++ b/src/bitmessagekivy/mpybit.py @@ -1,5 +1,10 @@ import time +from kivy.app import App +from kivy.core.window import Window +from kivy.uix.boxlayout import BoxLayout +from kivy.uix.gridlayout import GridLayout + from debug import logger from addresses import addBMIfNotPresent, decodeAddress @@ -10,18 +15,13 @@ from helper_ackPayload import genAckPayload from helper_sql import sqlExecute -from kivy.app import App -from kivy.core.window import Window -# from kivy.uix.boxlayout import BoxLayout -from kivy.uix.gridlayout import GridLayout - import queues import shutdown statusIconColor = 'red' -class LoginScreen(GridLayout): +class LoginScreen(BoxLayout): """This will use for sending message to recipents from mobile client.""" def send(self): From 956f689eeb45a62b7a9bd97481538f8a2ddcd07a Mon Sep 17 00:00:00 2001 From: surbhi Date: Mon, 9 Jul 2018 17:16:41 +0530 Subject: [PATCH 16/18] Fixes some issue of kivy running --- src/bitmessagekivy/mpybit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bitmessagekivy/mpybit.py b/src/bitmessagekivy/mpybit.py index 8a6e6265..88ffb83a 100644 --- a/src/bitmessagekivy/mpybit.py +++ b/src/bitmessagekivy/mpybit.py @@ -3,7 +3,7 @@ import time from kivy.app import App from kivy.core.window import Window from kivy.uix.boxlayout import BoxLayout -from kivy.uix.gridlayout import GridLayout +# from kivy.uix.gridlayout import GridLayout from debug import logger From 13d41c7647c5f9da34cf180a812b6bdcfec59ba1 Mon Sep 17 00:00:00 2001 From: surbhi Date: Mon, 9 Jul 2018 17:36:28 +0530 Subject: [PATCH 17/18] added imports for wrapper main file kivy running --- src/bitmessagemain.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bitmessagemain.py b/src/bitmessagemain.py index 0a1d835b..0848b0e4 100755 --- a/src/bitmessagemain.py +++ b/src/bitmessagemain.py @@ -389,7 +389,7 @@ class Main: # Populate with hardcoded value (same as connectToStream above) state.streamsInWhichIAmParticipating.append(1) - if daemon is False and state.enableGUI: + if not daemon and state.enableGUI: if state.curses: if not depends.check_curses(): sys.exit() @@ -398,7 +398,7 @@ class Main: bitmessagecurses.runwrapper() elif state.kivy: BMConfigParser().remove_option('bitmessagesettings', 'dontconnect') - from mpybit import MainApp + from bitmessagekivy.mpybit import MainApp MainApp().run() else: import bitmessageqt From 8537fbb2ccd8569c24441c15e1a6f91e32f0b10b Mon Sep 17 00:00:00 2001 From: PyBitmessage Translations Date: Sun, 8 Jul 2018 08:01:27 +0200 Subject: [PATCH 18/18] Auto-updated language fr from transifex --- src/translations/bitmessage_fr.qm | Bin 98100 -> 92333 bytes src/translations/bitmessage_fr.ts | 577 ++++++++++++++---------------- 2 files changed, 278 insertions(+), 299 deletions(-) diff --git a/src/translations/bitmessage_fr.qm b/src/translations/bitmessage_fr.qm index e544a1c38c79134e9c3ad1438030b11e66ef1622..53e3fd978685f909b9a828f592755eca8ecfd4d3 100644 GIT binary patch delta 4048 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 Og-rqR$2`r96aNhYSC}~f delta 9071 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 Mailchuck - + # You can use this to configure your email gateway account # Uncomment the setting you want to use # Here are the options: @@ -153,101 +153,102 @@ Please type the desired email address (including @mailchuck.com) below: # the money directly. To turn it off again, set "feeamount" to 0. Requires # subscription. - # Vous pouvez utiliser ceci pour configurer votre compte de passerelle de -# messagerie. -# Décommentez les paramètres que vous souhaitez utiliser. -# Les options se trouvent ci-dessous : -# + + + + + # You can use this to configure your email gateway account +# Uncomment the setting you want to use +# Here are the options: +# # pgp: server -# La passerelle de messagerie va créer et conserver pour vous les clefs PGP, -# et va signer, vérifier, chiffrer et déchiffrer en votre nom. Choisissez cela si -# vous voulez utilisez PGP mais que vous êtes paresseux. Exige une inscription. +# The email gateway will create and maintain PGP keys for you and sign, verify, +# encrypt and decrypt on your behalf. When you want to use PGP but are lazy, +# use this. Requires subscription. # # pgp: local -# La passerelle de messagerie ne va pas exécuter les commandes PGP en -# votre nom. Vous pouvez soit ne pas utiliser PGP du tout, soit l’utiliser -# localement. +# The email gateway will not conduct PGP operations on your behalf. You can +# either not use PGP at all, or use it locally. # # attachments: yes -# Les pièces-jointes reçues dans le courriel seront téléversées sur MEGA.nz, -# d’où vous pourrez les télécharger en cliquant sur le lien. Exige une -# inscription. +# Incoming attachments in the email will be uploaded to MEGA.nz, and you can +# download them from there by following the link. Requires a subscription. # # attachments: no -# Les pièces jointes seront ignorées. -# +# Attachments will be ignored. +# # archive: yes -# Les courriels que vous recevrez seront archivés sur le serveur. Utilisez -# ceci si vous avez besoin d’aide pour des problèmes de déboguage ou -# si vous avez besoin d’une preuve par un tiers des courriels. Cela signifie -# cependant que le fournisseur du service pourra lire vos courriels même -# après leur réception. +# Your incoming emails will be archived on the server. Use this if you need +# help with debugging problems or you need a third party proof of emails. This +# however means that the operator of the service will be able to read your +# emails even after they have been delivered to you. # # archive: no -# Les courriels reçus seront supprimés du serveur dès qu’ils vous auront été -# transmis. +# Incoming emails will be deleted from the server as soon as they are relayed +# to you. # -# masterpubkey_btc: clef xpub BIP44 ou graine publique electrum v1 -# offset_btc: entier (par défaut à 0) -# feeamount: nombre avec jusqu’à 8 décimales -# feecurrency: BTC, XBT, USD, EUR ou GBP -# Utilisez ceci si vous voulez faire payer ceux qui vous envoient des courriels. -# Si ceci est activé et qu’une personne inconnue vous envoie un courriel, il -# devra payer le tarif indiqué. Comme ce mécanisme emploie des clefs -# publiques déterministes, vous recevrez l’argent directement. Pour désactiver -# à nouveau ceci, réglez "feeamount" à 0. Exige une inscription. - +# masterpubkey_btc: BIP44 xpub key or electrum v1 public seed +# offset_btc: integer (defaults to 0) +# feeamount: number with up to 8 decimal places +# feecurrency: BTC, XBT, USD, EUR or GBP +# Use these if you want to charge people who send you emails. If this is on and +# an unknown person sends you an email, they will be requested to pay the fee +# specified. As this scheme uses deterministic public keys, you will receive +# the money directly. To turn it off again, set "feeamount" to 0. Requires +# subscription. + + MainWindow - + Reply to sender Répondre à l’expéditeur - + Reply to channel Répondre au canal - + Add sender to your Address Book Ajouter l’expéditeur au carnet d’adresses - + Add sender to your Blacklist Ajouter l’expéditeur à votre liste noire - + Move to Trash Envoyer à la Corbeille - + Undelete Restaurer - + View HTML code as formatted text Voir le code HTML comme du texte formaté - + Save message as... Enregistrer le message sous… - + Mark Unread Marquer comme non-lu - + New Nouvelle @@ -272,12 +273,12 @@ Please type the desired email address (including @mailchuck.com) below: Copier l’adresse dans le presse-papier - + Special address behavior... Comportement spécial de l’adresse… - + Email gateway Passerelle de courriel @@ -287,37 +288,37 @@ Please type the desired email address (including @mailchuck.com) below: Effacer - + Send message to this address Envoyer un message à cette adresse - + Subscribe to this address S’abonner à cette adresse - + Add New Address Ajouter une nouvelle adresse - + Copy destination address to clipboard Copier l’adresse de destination dans le presse-papier - + Force send Forcer l’envoi - + One of your addresses, %1, is an old version 1 address. Version 1 addresses are no longer supported. May we delete it now? Une de vos adresses, %1, est une vieille adresse de la version 1. Les adresses de la version 1 ne sont plus supportées. Nous pourrions la supprimer maintenant? - + Waiting for their encryption key. Will request it again soon. En attente de la clé de chiffrement. Une nouvelle requête sera bientôt lancée. @@ -327,17 +328,17 @@ Please type the desired email address (including @mailchuck.com) below: - + Queued. En attente. - + Message sent. Waiting for acknowledgement. Sent at %1 Message envoyé. En attente de l’accusé de réception. Envoyé %1 - + Message sent. Sent at %1 Message envoyé. Envoyé %1 @@ -347,47 +348,47 @@ Please type the desired email address (including @mailchuck.com) below: - + Acknowledgement of the message received %1 Accusé de réception reçu %1 - + Broadcast queued. Message de diffusion en attente. - + Broadcast on %1 Message de diffusion du %1 - + Problem: The work demanded by the recipient is more difficult than you are willing to do. %1 Problème : Le travail demandé par le destinataire est plus difficile que ce que vous avez paramétré. %1 - + Problem: The recipient's encryption key is no good. Could not encrypt message. %1 Problème : la clé de chiffrement du destinataire n’est pas bonne. Il n’a pas été possible de chiffrer le message. %1 - + Forced difficulty override. Send should start soon. Neutralisation forcée de la difficulté. L’envoi devrait bientôt commencer. - + Unknown status: %1 %2 Statut inconnu : %1 %2 - + Not Connected Déconnecté - + Show Bitmessage Afficher Bitmessage @@ -397,12 +398,12 @@ Please type the desired email address (including @mailchuck.com) below: Envoyer - + Subscribe S’abonner - + Channel Canal @@ -412,12 +413,12 @@ Please type the desired email address (including @mailchuck.com) below: Quitter - + You may manage your keys by editing the keys.dat file stored in the same directory as this program. It is important that you back up this file. Vous pouvez éditer vos clés en éditant le fichier keys.dat stocké dans le même répertoire que ce programme. Il est important de faire des sauvegardes de ce fichier. - + You may manage your keys by editing the keys.dat file stored in %1 It is important that you back up this file. @@ -425,54 +426,54 @@ It is important that you back up this file. Il est important de faire des sauvegardes de ce fichier. - + Open keys.dat? Ouvrir keys.dat ? - + You may manage your keys by editing the keys.dat file stored in the same directory as this program. It is important that you back up this file. Would you like to open the file now? (Be sure to close Bitmessage before making any changes.) Vous pouvez éditer vos clés en éditant le fichier keys.dat stocké dans le même répertoire que ce programme. Il est important de faire des sauvegardes de ce fichier. Souhaitez-vous l’ouvrir maintenant ? (Assurez-vous de fermer Bitmessage avant d’effectuer des changements.) - + You may manage your keys by editing the keys.dat file stored in %1 It is important that you back up this file. Would you like to open the file now? (Be sure to close Bitmessage before making any changes.) Vous pouvez éditer vos clés en éditant le fichier keys.dat stocké dans le répertoire %1. Il est important de faire des sauvegardes de ce fichier. Souhaitez-vous l’ouvrir maintenant? (Assurez-vous de fermer Bitmessage avant d’effectuer des changements.) - + Delete trash? Supprimer la corbeille ? - + Are you sure you want to delete all trashed messages? Êtes-vous sûr de vouloir supprimer tous les messages dans la corbeille ? - + bad passphrase Mauvaise phrase secrète - + You must type your passphrase. If you don't have one then this is not the form for you. Vous devez taper votre phrase secrète. Si vous n’en avez pas, ce formulaire n’est pas pour vous. - + Bad address version number Mauvais numéro de version d’adresse - + Your address version number must be a number: either 3 or 4. Votre numéro de version d’adresse doit être un nombre : soit 3 soit 4. - + Your address version number must be either 3 or 4. Votre numéro de version d’adresse doit être soit 3 soit 4. @@ -542,22 +543,22 @@ It is important that you back up this file. Would you like to open the file now? - + Connection lost Connexion perdue - + Connected Connecté - + Message trashed Message envoyé à la corbeille - + The TTL, or Time-To-Live is the length of time that the network will hold the message. The recipient must get it during this time. If your Bitmessage client does not hear an acknowledgement, it will resend the message automatically. The longer the Time-To-Live, the @@ -566,17 +567,17 @@ It is important that you back up this file. Would you like to open the file now? Le destinataire doit l’obtenir avant ce temps. Si votre client Bitmessage ne reçoit pas de confirmation de réception, il va le ré-envoyer automatiquement. Plus le Time-To-Live est long, plus grand est le travail que votre ordinateur doit effectuer pour envoyer le message. Un Time-To-Live de quatre ou cinq jours est souvent approprié. - + Message too long Message trop long - + The message that you are trying to send is too long by %1 bytes. (The maximum is 261644 bytes). Please cut it down before sending. Le message que vous essayez d’envoyer est trop long de %1 octets (le maximum est 261644 octets). Veuillez le réduire avant de l’envoyer. - + Error: Your account wasn't registered at an email gateway. Sending registration now as %1, please wait for the registration to be processed before retrying sending. Erreur : votre compte n’a pas été inscrit à une passerelle de courrier électronique. Envoi de l’inscription maintenant en tant que %1, veuillez patienter tandis que l’inscription est en cours de traitement, avant de retenter l’envoi. @@ -621,57 +622,57 @@ Le destinataire doit l’obtenir avant ce temps. Si votre client Bitmessage ne r - + Error: You must specify a From address. If you don't have one, go to the 'Your Identities' tab. - Erreur : Vous devez spécifier une adresse d’expéditeur. Si vous n’en avez pas, rendez-vous dans l’onglet 'Vos identités'. + Erreur : Vous devez spécifier une adresse d’expéditeur. Si vous n’en avez pas, rendez-vous dans l’onglet "Vos identités". - + Address version number Numéro de version de l’adresse - + Concerning the address %1, Bitmessage cannot understand address version numbers of %2. Perhaps upgrade Bitmessage to the latest version. Concernant l’adresse %1, Bitmessage ne peut pas comprendre les numéros de version de %2. Essayez de mettre à jour Bitmessage vers la dernière version. - + Stream number Numéro de flux - + Concerning the address %1, Bitmessage cannot handle stream numbers of %2. Perhaps upgrade Bitmessage to the latest version. Concernant l’adresse %1, Bitmessage ne peut pas supporter les nombres de flux de %2. Essayez de mettre à jour Bitmessage vers la dernière version. - + Warning: You are currently not connected. Bitmessage will do the work necessary to send the message but it won't send until you connect. Avertissement : Vous êtes actuellement déconnecté. Bitmessage fera le travail nécessaire pour envoyer le message mais il ne sera pas envoyé tant que vous ne vous connecterez pas. - + Message queued. Message mis en file d’attente. - + Your 'To' field is empty. - Votre champ 'Vers' est vide. + Votre champ "Vers" est vide. - + Right click one or more entries in your address book and select 'Send message to this address'. - Cliquez droit sur une ou plusieurs entrées dans votre carnet d’adresses et sélectionnez 'Envoyer un message à ces adresses'. + Cliquez droit sur une ou plusieurs entrées dans votre carnet d’adresses puis sélectionnez "Envoyer un message à ces adresses". - + Fetched address from namecoin identity. Récupération avec succès de l’adresse de l’identité Namecoin. - + New Message Nouveau message @@ -696,47 +697,47 @@ Le destinataire doit l’obtenir avant ce temps. Si votre client Bitmessage ne r L’adresse que vous avez entrée est invalide. Adresse ignorée. - + Error: You cannot add the same address to your address book twice. Try renaming the existing one if you want. Erreur : Vous ne pouvez pas ajouter une adresse déjà présente dans votre carnet d’adresses. Essayez de renommer l’adresse existante. - + Error: You cannot add the same address to your subscriptions twice. Perhaps rename the existing one if you want. Erreur : vous ne pouvez pas ajouter la même adresse deux fois à vos abonnements. Peut-être que vous pouvez renommer celle qui existe si vous le souhaitez. - + Restart Redémarrer - + You must restart Bitmessage for the port number change to take effect. Vous devez redémarrer Bitmessage pour que le changement de port prenne effet. - + Bitmessage will use your proxy from now on but you may want to manually restart Bitmessage now to close existing connections (if any). Bitmessage utilisera votre proxy dorénavant, mais vous pouvez redémarrer manuellement Bitmessage maintenant afin de fermer des connexions existantes (si il y en existe). - + Number needed Nombre requis - + Your maximum download and upload rate must be numbers. Ignoring what you typed. Vos taux maximum de téléchargement et de téléversement doivent être des nombres. Ce que vous avez tapé est ignoré. - + Will not resend ever Ne renverra jamais - + Note that the time limit you entered is less than the amount of time Bitmessage waits for the first resend attempt therefore your messages will never be resent. Notez que la limite de temps que vous avez entrée est plus courte que le temps d’attente respecté par Bitmessage avant le premier essai de renvoi, par conséquent votre message ne sera jamais renvoyé. @@ -771,24 +772,24 @@ Le destinataire doit l’obtenir avant ce temps. Si votre client Bitmessage ne r Vous devez vraiment utiliser une phrase secrète. - + Address is gone L’adresse a disparu - + Bitmessage cannot find your address %1. Perhaps you removed it? Bitmessage ne peut pas trouver votre adresse %1. Peut-être l’avez-vous supprimée? - + Address disabled Adresse désactivée - + Error: The address from which you are trying to send is disabled. You'll have to enable it on the 'Your Identities' tab before using it. - Erreur : L’adresse avec laquelle vous essayez de communiquer est désactivée. Vous devez d’abord l’activer dans l’onglet 'Vos identités' avant de l’utiliser. + Erreur : L’adresse avec laquelle vous essayez de communiquer est désactivée. Vous devez d’abord l’activer dans l’onglet "Vos identités" avant de l’utiliser. @@ -796,42 +797,42 @@ Le destinataire doit l’obtenir avant ce temps. Si votre client Bitmessage ne r - + Entry added to the blacklist. Edit the label to your liking. Entrée ajoutée à la liste noire. Éditez l’étiquette à votre convenance. - + Error: You cannot add the same address to your blacklist twice. Try renaming the existing one if you want. Erreur : vous ne pouvez pas ajouter la même adresse deux fois à votre liste noire. Essayez de renommer celle qui existe si vous le souhaitez. - + Moved items to trash. Messages déplacés dans la corbeille. - + Undeleted item. Articles restaurés. - + Save As... Enregistrer sous… - + Write error. Erreur d’écriture. - + No addresses selected. Aucune adresse sélectionnée. - + If you delete the subscription, messages that you already received will become inaccessible. Maybe you can consider disabling the subscription instead. Disabled subscriptions will not receive new messages, but you can still view messages you already received. Are you sure you want to delete the subscription? @@ -840,7 +841,7 @@ Are you sure you want to delete the subscription? Êtes-vous sur de vouloir supprimer cet abonnement ? - + If you delete the channel, messages that you already received will become inaccessible. Maybe you can consider disabling the channel instead. Disabled channels will not receive new messages, but you can still view messages you already received. Are you sure you want to delete the channel? @@ -849,32 +850,32 @@ Are you sure you want to delete the channel? Êtes-vous sûr de vouloir supprimer ce canal ? - + Do you really want to remove this avatar? Voulez-vous vraiment enlever cet avatar ? - + You have already set an avatar for this address. Do you really want to overwrite it? Vous avez déjà mis un avatar pour cette adresse. Voulez-vous vraiment l’écraser ? - + Start-on-login not yet supported on your OS. Le démarrage dès l’ouverture de session n’est pas encore supporté sur votre OS. - + Minimize-to-tray not yet supported on your OS. La minimisation en zone système n’est pas encore supportée sur votre OS. - + Tray notifications not yet supported on your OS. Les notifications en zone système ne sont pas encore supportées sur votre OS. - + Testing... Tester… @@ -1124,7 +1125,7 @@ Are you sure you want to delete the channel? Rejoindre / créer un canal - + All accounts Tous les comptes @@ -1149,42 +1150,42 @@ Are you sure you want to delete the channel? - + New version of PyBitmessage is available: %1. Download it from https://github.com/Bitmessage/PyBitmessage/releases/latest Une nouvelle version de PyBitmessage est disponible : %1. Veuillez la télécharger depuis https://github.com/Bitmessage/PyBitmessage/releases/latest - + Waiting for PoW to finish... %1% En attente de la fin de la PoW… %1% - + Shutting down Pybitmessage... %1% Pybitmessage en cours d’arrêt… %1% - + Waiting for objects to be sent... %1% En attente de l’envoi des objets… %1% - + Saving settings... %1% Enregistrement des paramètres… %1% - + Shutting down core... %1% Cœur en cours d’arrêt… %1% - + Stopping notifications... %1% Arrêt des notifications… %1% - + Shutdown imminent... %1% Arrêt imminent… %1% @@ -1194,42 +1195,42 @@ Are you sure you want to delete the channel? %n heure%n heures - + %n day(s) %n jour%n jours - + Shutting down PyBitmessage... %1% PyBitmessage en cours d’arrêt… %1% - + Sent Envoyé - + Generating one new address Production d’une nouvelle adresse - + Done generating address. Doing work necessary to broadcast it... La production de l’adresse a été effectuée. Travail en cours afin de l’émettre… - + Generating %1 new addresses. Production de %1 nouvelles adresses. - + %1 is already in 'Your Identities'. Not adding it again. %1 est déjà dans "Vos identités". Il ne sera pas ajouté de nouveau. - + Done generating address La production d’une adresse a été effectuée @@ -1239,96 +1240,96 @@ Are you sure you want to delete the channel? - + Disk full Disque plein - + Alert: Your disk or data storage volume is full. Bitmessage will now exit. Alerte : votre disque ou le volume de stockage de données est plein. Bitmessage va maintenant se fermer. - + Error! Could not find sender address (your address) in the keys.dat file. Erreur ! Il n’a pas été possible de trouver l’adresse d’expéditeur (votre adresse) dans le fichier keys.dat. - + Doing work necessary to send broadcast... Travail en cours afin d’envoyer le message de diffusion… - + Broadcast sent on %1 Message de diffusion envoyé %1 - + Encryption key was requested earlier. La clé de chiffrement a été demandée plus tôt. - + Sending a request for the recipient's encryption key. Envoi d’une demande de la clé de chiffrement du destinataire. - + Looking up the receiver's public key Recherche de la clé publique du récepteur - + Problem: Destination is a mobile device who requests that the destination be included in the message but this is disallowed in your settings. %1 Problème : la destination est un dispositif mobile qui nécessite que la destination soit incluse dans le message mais ceci n’est pas autorisé dans vos paramètres. %1 - + Doing work necessary to send message. There is no required difficulty for version 2 addresses like this. Travail en cours afin d’envoyer le message. Il n’y a pas de difficulté requise pour les adresses version 2 comme celle-ci. - + Doing work necessary to send message. Receiver's required difficulty: %1 and %2 Travail en cours afin d’envoyer le message. Difficulté requise du destinataire : %1 et %2 - + Problem: The work demanded by the recipient (%1 and %2) is more difficult than you are willing to do. %3 Problème : Le travail demandé par le destinataire (%1 and %2) est plus difficile que ce que vous avez paramétré. %3 - + Problem: You are trying to send a message to yourself or a chan but your encryption key could not be found in the keys.dat file. Could not encrypt message. %1 Problème : Vous essayez d’envoyer un message à un canal ou à vous-même mais votre clef de chiffrement n’a pas été trouvée dans le fichier keys.dat. Le message ne peut pas être chiffré. %1 - + Doing work necessary to send message. Travail en cours afin d’envoyer le message. - + Message sent. Waiting for acknowledgement. Sent on %1 Message envoyé. En attente de l’accusé de réception. Envoyé %1 - + Doing work necessary to request encryption key. Travail en cours afin d’obtenir la clé de chiffrement. - + Broadcasting the public key request. This program will auto-retry if they are offline. Diffusion de la demande de clef publique. Ce programme réessaiera automatiquement si ils sont déconnectés. - + Sending public key request. Waiting for reply. Requested at %1 Envoi d’une demande de clef publique. En attente d’une réponse. Demandée à %1 @@ -1343,97 +1344,82 @@ Difficulté requise du destinataire : %1 et %2 Transfert de port UPnP retiré - + Mark all messages as read Marquer tous les messages comme lus - + Are you sure you would like to mark all messages read? Êtes-vous sûr(e) de vouloir marquer tous les messages comme lus ? - + Doing work necessary to send broadcast. Travail en cours afin d’envoyer la diffusion. - + Proof of work pending En attente de preuve de fonctionnement - + %n object(s) pending proof of work %n objet en attente de preuve de fonctionnement%n objet(s) en attente de preuve de fonctionnement - + %n object(s) waiting to be distributed %n objet en attente d'être distribué%n objet(s) en attente d'être distribués - + Wait until these tasks finish? Attendre jusqu'à ce que ces tâches se terminent ? - - Problem communicating with proxy: %1. Please check your network settings. - Problème de communication avec le proxy : %1. Veuillez vérifier vos réglages réseau. - - - - SOCKS5 Authentication problem: %1. Please check your SOCKS5 settings. - Problème d’authentification SOCKS5 : %1. Veuillez vérifier vos réglages SOCKS5. - - - - The time on your computer, %1, may be wrong. Please verify your settings. - L'heure sur votre ordinateur, %1, pourrait être faussse. Veuillez vérifier vos paramètres. - - - + The name %1 was not found. Le nom %1 n'a pas été trouvé. - + The namecoin query failed (%1) La requête Namecoin a échouée (%1) - + The namecoin query failed. La requête Namecoin a échouée. - + The name %1 has no valid JSON data. Le nom %1 n'a aucune donnée JSON valide. - + The name %1 has no associated Bitmessage address. Le nom %1 n'a aucune adresse Bitmessage d'associée. - + Success! Namecoind version %1 running. Succès ! Namecoind version %1 en cours d'exécution. - + Success! NMControll is up and running. Succès ! NMControll est debout et en cours d'exécution. - + Couldn't understand NMControl. Ne pouvait pas comprendre NMControl. - + The connection to namecoin failed. La connexion à Namecoin a échouée. @@ -1443,12 +1429,12 @@ Difficulté requise du destinataire : %1 et %2 Votre GPU(s) n'a pas calculé correctement, mettant OpenCL hors service. Veuillez remonter ceci aux développeurs s'il vous plaît. - + Set notification sound... Mettre un son de notification ... - + Welcome to easy and secure Bitmessage * send messages to other people @@ -1460,122 +1446,122 @@ Bienvenue dans le facile et sécurisé Bitmessage * envoyer des messages à d'autres personnes * envoyer des messages par diffusion (broadcast) à la manière de Twitter ou * discuter dans des canaux (channels) avec d'autres personnes - + - + not recommended for chans pas recommandé pour les canaux - + Quiet Mode Mode tranquille - + Problems connecting? Try enabling UPnP in the Network Settings Des difficultés à se connecter ? Essayez de permettre UPnP dans les "Paramètres réseau" - + You are trying to send an email instead of a bitmessage. This requires registering with a gateway. Attempt to register? Vous essayez d'envoyer un courrier électronique au lieu d'un bitmessage. Ceci exige votre inscription à une passerelle. Essayer de vous inscrire ? - + Error: Bitmessage addresses start with BM- Please check the recipient address %1 Erreur : Les adresses Bitmessage commencent par BM- Veuillez vérifier l'adresse du destinataire %1 - + Error: The recipient address %1 is not typed or copied correctly. Please check it. Erreur : L’adresse du destinataire %1 n’est pas correctement tapée ou recopiée. Veuillez la vérifier. - + Error: The recipient address %1 contains invalid characters. Please check it. Erreur : L’adresse du destinataire %1 contient des caractères invalides. Veuillez la vérifier. - + Error: The version of the recipient address %1 is too high. Either you need to upgrade your Bitmessage software or your acquaintance is being clever. Erreur : la version de l’adresse destinataire %1 est trop élevée. Vous devez mettre à niveau votre logiciel Bitmessage ou alors celui de votre connaissance est plus intelligent. - + Error: Some data encoded in the recipient address %1 is too short. There might be something wrong with the software of your acquaintance. Erreur : quelques données codées dans l’adresse destinataire %1 sont trop courtes. Il pourrait y avoir un soucis avec le logiciel de votre connaissance. - + Error: Some data encoded in the recipient address %1 is too long. There might be something wrong with the software of your acquaintance. Erreur : quelques données codées dans l’adresse destinataire %1 sont trop longues. Il pourrait y avoir un soucis avec le logiciel de votre connaissance. - + Error: Some data encoded in the recipient address %1 is malformed. There might be something wrong with the software of your acquaintance. Erreur : quelques données codées dans l’adresse destinataire %1 sont mal formées. Il pourrait y avoir un soucis avec le logiciel de votre connaissance. - + Error: Something is wrong with the recipient address %1. Erreur : quelque chose ne va pas avec l'adresse de destinataire %1. - + Error: %1 Erreur : %1 - + From %1 De %1 - + Synchronisation pending En attente de synchronisation - + Bitmessage hasn't synchronised with the network, %n object(s) to be downloaded. If you quit now, it may cause delivery delays. Wait until the synchronisation finishes? Bitmessage ne s'est pas synchronisé avec le réseau, %n objet(s) à télécharger. Si vous quittez maintenant, cela pourrait causer des retards de livraison. Attendre jusqu'à ce que la synchronisation aboutisse ?Bitmessage ne s'est pas synchronisé avec le réseau, %n objet(s) à télécharger. Si vous quittez maintenant, cela pourrait causer des retards de livraison. Attendre jusqu'à ce que la synchronisation aboutisse ? - + Not connected Non connecté - + Bitmessage isn't connected to the network. If you quit now, it may cause delivery delays. Wait until connected and the synchronisation finishes? Bitmessage n'est pas connecté au réseau. Si vous quittez maintenant, cela pourrait causer des retards de livraison. Attendre jusqu'à ce qu'il soit connecté et que la synchronisation se termine ? - + Waiting for network connection... En attente de connexion réseau... - + Waiting for finishing synchronisation... En attente d'achèvement de la synchronisation... - + You have already set a notification sound for this address book entry. Do you really want to overwrite it? Vous avez déjà mis un son de notification pour cette adresse. Voulez-vous vraiment l’écraser ? - + Error occurred: could not load message from disk. Une erreur a eu lieu : ne peut pas charger de message depuis le disque. Display the %n recent broadcast(s) from this address. - + Afficher le messages de diffusion le plus récent originaire de cette adresse.Afficher les %n messages de diffusion les plus récents originaires de cette adresse. @@ -1593,22 +1579,22 @@ Bienvenue dans le facile et sécurisé Bitmessage Vider - + inbox entrant - + new nouveau - + sent envoyé - + trash corbeille @@ -1639,14 +1625,14 @@ Bienvenue dans le facile et sécurisé Bitmessage MsgDecode - + The message has an unknown encoding. Perhaps you should upgrade Bitmessage. Le message est codé de façon inconnue. Peut-être que vous devriez mettre à niveau Bitmessage. - + Unknown encoding Encodage inconnu @@ -1662,7 +1648,8 @@ Peut-être que vous devriez mettre à niveau Bitmessage. Here you may generate as many addresses as you like. Indeed, creating and abandoning addresses is encouraged. You may generate addresses by using either random numbers or by using a passphrase. If you use a passphrase, the address is called a "deterministic" address. The 'Random Number' option is selected by default but deterministic addresses have several pros and cons: - Vous pouvez générer autant d’adresses que vous le souhaitez. En effet, nous vous encourageons à créer et à délaisser vos adresses. Vous pouvez générer des adresses en utilisant des nombres aléatoires ou en utilisant une phrase secrète. Si vous utilisez une phrase secrète, l’adresse sera une adresse "déterministe". L’option 'Nombre Aléatoire' est sélectionnée par défaut mais les adresses déterministes ont certains avantages et inconvénients : + Vous pouvez générer autant d’adresses que vous le souhaitez. En effet, nous vous encourageons à créer et à délaisser vos adresses. Vous pouvez générer des adresses en utilisant des nombres aléatoires ou en utilisant une phrase secrète. Si vous utilisez une phrase secrète, l’adresse sera une adresse "déterministe". +L’option "Nombre Aléatoire" est sélectionnée par défaut mais les adresses déterministes ont certains avantages et inconvénients : @@ -2174,7 +2161,7 @@ The 'Random Number' option is selected by default but deterministic ad Chan passphrase/name: - + Phrase passe ou nom : @@ -2228,14 +2215,6 @@ The 'Random Number' option is selected by default but deterministic ad Module PoW C non disponible. Veuillez le construire. - - qrcodeDialog - - - QR-code - QR-code - - regenerateAddressesDialog @@ -2292,218 +2271,218 @@ The 'Random Number' option is selected by default but deterministic ad settingsDialog - + Settings Paramètres - + Start Bitmessage on user login Démarrer Bitmessage à la connexion de l’utilisateur - + Tray Zone de notification - + Start Bitmessage in the tray (don't show main window) Démarrer Bitmessage dans la barre des tâches (ne pas montrer la fenêtre principale) - + Minimize to tray Minimiser dans la barre des tâches - + Close to tray Fermer vers la zone de notification - + Show notification when message received Montrer une notification lorsqu’un message est reçu - + Run in Portable Mode Lancer en Mode Portable - + In Portable Mode, messages and config files are stored in the same directory as the program rather than the normal application-data folder. This makes it convenient to run Bitmessage from a USB thumb drive. En Mode Portable, les messages et les fichiers de configuration sont stockés dans le même dossier que le programme plutôt que le dossier de l’application. Cela rend l’utilisation de Bitmessage plus facile depuis une clé USB. - + Willingly include unencrypted destination address when sending to a mobile device Inclure volontairement l’adresse de destination non chiffrée lors de l’envoi vers un dispositif mobile - + Use Identicons Utilise des Identicônes. - + Reply below Quote Réponse en dessous de la citation - + Interface Language Langue de l’interface - + System Settings system Paramètres système - + User Interface Interface utilisateur - + Listening port Port d’écoute - + Listen for connections on port: Écouter les connexions sur le port : - + UPnP: UPnP : - + Bandwidth limit Limite de bande passante - + Maximum download rate (kB/s): [0: unlimited] Taux de téléchargement maximal (kO/s) : [0 : illimité] - + Maximum upload rate (kB/s): [0: unlimited] Taux de téléversement maximal (kO/s) : [0 : illimité] - + Proxy server / Tor Serveur proxy / Tor - + Type: Type : - + Server hostname: Nom du serveur: - + Port: Port : - + Authentication Authentification - + Username: Utilisateur : - + Pass: Mot de passe : - + Listen for incoming connections when using proxy Écoute les connexions entrantes lors de l’utilisation du proxy - + none aucun - + SOCKS4a SOCKS4a - + SOCKS5 SOCKS5 - + Network Settings Paramètres réseau - + Total difficulty: Difficulté totale : - + The 'Total difficulty' affects the absolute amount of work the sender must complete. Doubling this value doubles the amount of work. - La 'difficulté totale' affecte le montant total de travail que l’envoyeur devra compléter. Doubler cette valeur double la charge de travail. + La "difficulté totale" affecte le montant total de travail que l’envoyeur devra accomplir. Doubler cette valeur double la charge de travail. - + Small message difficulty: Difficulté d’un message court : - + When someone sends you a message, their computer must first complete some work. The difficulty of this work, by default, is 1. You may raise this default for new addresses you create by changing the values here. Any new addresses you create will require senders to meet the higher difficulty. There is one exception: if you add a friend or acquaintance to your address book, Bitmessage will automatically notify them when you next send a message that they need only complete the minimum amount of work: difficulty 1. Lorsque quelqu’un vous envoie un message, son ordinateur doit d’abord effectuer un travail. La difficulté de ce travail, par défaut, est de 1. Vous pouvez augmenter cette valeur pour les adresses que vous créez en changeant la valeur ici. Chaque nouvelle adresse que vous créez requerra à l’envoyeur de faire face à une difficulté supérieure. Il existe une exception : si vous ajoutez un ami ou une connaissance à votre carnet d’adresses, Bitmessage les notifiera automatiquement lors du prochain message que vous leur envoyez qu’ils ne doivent compléter que la charge de travail minimale : difficulté 1. - + The 'Small message difficulty' mostly only affects the difficulty of sending small messages. Doubling this value makes it almost twice as difficult to send a small message but doesn't really affect large messages. - La 'difficulté d’un message court' affecte principalement la difficulté d’envoyer des messages courts. Doubler cette valeur rend la difficulté à envoyer un court message presque double, tandis qu’un message plus long ne sera pas réellement affecté. + La "difficulté d’un message court" affecte principalement la difficulté d’envoyer des messages courts. Doubler cette valeur rend la difficulté à envoyer un court message presque double, tandis qu’un message plus long ne sera pas réellement affecté. - + Demanded difficulty Difficulté exigée - + Here you may set the maximum amount of work you are willing to do to send a message to another person. Setting these values to 0 means that any value is acceptable. Vous pouvez préciser quelle charge de travail vous êtes prêt à effectuer afin d’envoyer un message à une personne. Placer cette valeur à 0 signifie que n’importe quelle valeur est acceptée. - + Maximum acceptable total difficulty: Difficulté maximale acceptée : - + Maximum acceptable small message difficulty: Difficulté maximale acceptée pour les messages courts : - + Max acceptable difficulty Difficulté maximale acceptée @@ -2513,87 +2492,87 @@ The 'Random Number' option is selected by default but deterministic ad - + <html><head/><body><p>Bitmessage can utilize a different Bitcoin-based program called Namecoin to make addresses human-friendly. For example, instead of having to tell your friend your long Bitmessage address, you can simply tell him to send a message to <span style=" font-style:italic;">test. </span></p><p>(Getting your own Bitmessage address into Namecoin is still rather difficult).</p><p>Bitmessage can use either namecoind directly or a running nmcontrol instance.</p></body></html> <html><head/><body><p>Bitmessage peut utiliser Namecoin, un autre programme basé sur Bitcoin, pour avoir des adresses plus parlantes. Par exemple, plutôt que de donner à votre ami votre longue adresse Bitmessage, vous pouvez simplement lui dire d’envoyer un message à <span style=" font-style:italic;">test. </span></p><p>(Obtenir votre propre adresse Bitmessage au sein de Namecoin est encore assez difficile).</p><p>Bitmessage peut soit utiliser directement namecoind soit exécuter une instance de nmcontrol.</p></body></html> - + Host: Hôte : - + Password: Mot de passe : - + Test Test - + Connect to: Connexion à : - + Namecoind Namecoind - + NMControl NMControl - + Namecoin integration Intégration avec Namecoin - + <html><head/><body><p>By default, if you send a message to someone and he is offline for more than two days, Bitmessage will send the message again after an additional two days. This will be continued with exponential backoff forever; messages will be resent after 5, 10, 20 days ect. until the receiver acknowledges them. Here you may change that behavior by having Bitmessage give up after a certain number of days or months.</p><p>Leave these input fields blank for the default behavior. </p></body></html> <html><head/><body><p>Par défaut, si vous envoyez un message à quelqu’un et que cette personne est hors connexion pendant plus de deux jours, Bitmessage enverra le message de nouveau après des deux jours supplémentaires. Ceci sera continué avec reculement (backoff) exponentiel pour toujours; les messages seront réenvoyés après 5, 10, 20 jours etc. jusqu’à ce que le récepteur accuse leur réception. Ici vous pouvez changer ce comportement en faisant en sorte que Bitmessage renonce après un certain nombre de jours ou de mois.</p> <p>Si vous souhaitez obtenir le comportement par défaut alors laissez vides ces champs de saisie. </p></body></html> - + Give up after Abandonner après - + and et - + days jours - + months. mois. - + Resends Expire Expiration des renvois automatiques - + Hide connection notifications Cacher les notifications de connexion - + Maximum outbound connections: [0: none] Connexions sortantes maximum: [0: aucune] - + Hardware GPU acceleration (OpenCL): Accélération matérielle GPU (OpenCL) :