Note: We are no longer using monotone. The project has migrated all source repos to git.
I2P geliştirmede Monotone kullanımının ayrıntılarını açıklayan ve Complication tarafından hazırlanmış özgün rehber gözden geçirilmiş olarak sunulmaktadır. Temel yönergeler için hızlı başlangıç rehberine bakabilirsiniz.
I2P dağıtılmış bir geliştirme modeli kullanır. Kaynak kodu, bağımsız olarak yönetilen Monotone ("MTN") depolarına kopyalanmıştır. Kod gönderme hakkı olan geliştiriciler, değişikliklerini depoya itebilir (gönderme hakkı verilmeden önce bir lisans anlaşması imzalanmalıdır).
Dikkate değer Monotone özelliklerinden bazıları şunlardır: Dağıtılmış sürüm denetimi, şifreli kimlik doğrulama, erişim denetimi, küçük boyutu, az sayıda bağımlılığı olması, projeleri sıkıştırılmış bir SQLite veri tabanı dosyasında depolaması ve kesintiye uğramış eşitleme girişimlerini sürdürme yeteneğinin olması.
Bir Monotone istemcisi işletmek
Monotone anahtarları üretmek
Taşıyıcı anahtarı, değişikliklerinizi bir Monotone veri havuzu sunucusuna itme olanağı sağlar. Monotone üzerine kod göndermek için (temel olarak kodunuzu imzalamak), ayrıca bir gönderim anahtarı da gereklidir. Herkese açık I2P Monotone sunucularının hiçbirinde, kaynak kodunu okumak (veya çekmek) için şu anda bir anahtar gerekmez.
Taşıyıcı anahtarı olmadan bir kişi şu işlemleri yapamaz:
- Genel okuma izni olmayan bir sunucudan kod çekemez
- Herhangi bir sunucuya kod itemez
- Bir Monotone sunucusu işletemez
Gönderim anahtarı olmadan bir kişi şu işlemleri yapamaz:
- Herhangi bir kod gönderemez
Yalnızca MTN üzerinden kod almayı düşünüyorsanız, sonraki bölüme geçebilirsiniz. Eğer isterseniz anahtarları oluşturmak için aşağıdakileri okuyabilirsiniz.
Alışkanlığa göre anahtarlar bir e-posta adresi gibi adlandırılır. Ancak anahtara karşılık gelen bir e-posta adresinin bulunması şart değildir. Örneğin, anahtarlarınız şu şekilde adlandırılmış olabilir:
- yourname@mail.i2p
- yourname-transport@mail.i2p
Monotone, anahtarları $HOME/.monotone/keys
klasörü altında anahtarlar ile aynı adı taşıyan metin dosyalarında tutar. Örneğin:
/home/complication/.monotone/keys/complication@mail.i2p
Taşıyıcı ve gönderim anahtarları oluşturmak için komut satırına aşağıdaki komutları yazın:
$ mtn genkey yourname-transport@someplace
$ mtn genkey yourname@someplace
Monotone, anahtarlarınızı korumak için sizden bir parola ister. Gönderim anahtarı için bir parola belirlemeniz önemle önerilir. Birçok kullanıcı, özellikle Monotone sunucusu işleyenler, taşıyıcı anahtarı parolasını boş bırakacaktır.
Güvenme ve deponuzu hazırlama
Monotone güvenlik modeli, hiç kimsenin fark edilmeden bir geliştiriciyi kolayca taklit etmesini engeller. Geliştiriciler hata yapabildiğinden ve saldırıya uğrayabildiğinden, yalnızca el ile gözden geçirmek kodun kalitesinden emin olunmasını sağlar. Monotone güvenilirlik modeli, doğru farkları okumanızı sağlar. Okuma farklarını değiştirmez.
Monotone deposu, projenin tüm kaynak kodunu ve geçmişini içeren tek bir dosyadır (sıkıştırılmış bir SQLite veri tabanı).
Monotone, geliştiriciler anahtarlarını Monotone içine aktardıktan ve güven değerlendirme bağlantılarını ayarladıktan sonra, güvenilmeyen kodun çalışma alanınıza gönderilmesini engeller. Güvenilmeyen kodu çalışma alanınızdan temizlemek için kullanılabilecek komutlar vardır. Ancak pratikte kullanılan itme erişim ilkeleri nedeniyle bunlara gerek duyulmaz.
Bir depoda birçok dal bulunabilir. Örneğin, depomuzda aşağıdaki ana dallar bulunur:
- i2p.i2p — I2P yöneltici ve ilgili programlar
- i2p.www — I2P projesi sitesi
- i2p.syndie — Syndie, dağıtılmış forumlar aracı
Alışkanlık olarak, I2P Monotone deposu i2p.mtn
olarak adlandırılır.
Sunuculardan kaynak kodunu çekmeden önce, deponuz için bir veri tabanının
başlatılması gerekir. Yerel deponuzu başlatmak için i2p.mtn
dosyasının
ve dal klasörlerinin kaydedilmesini istediğiniz klasöre geçin ve aşağıdaki komutu
verin:
$ mtn --db="i2p.mtn" db init
Geliştirici anahtarlarını edinmek ve dağıtmak
Geliştiricilerin kod işlemek için kullandığı anahtarlar, Monotone üzerinde güvenilirlik değerlendirmesi için gereklidir. Diğer geliştiricilerin taşıyıcı anahtarları yalnızca Monotone sunucu işletmecileri için gereklidir.
Geliştiricilerin gönderim anahtarları, GPG imzalı başka bir sayfada yayınlanır.
Özgünlüklerini doğruladıktan sonra geliştiricilerin anahtarlarını içe aktarmak için
tüm anahtarları yeni bir dosyaya kopyalayın. Bu dosyayı (
keys.txt
gibi) i2p.mtn
dosyasının bulunduğu
klasörde oluşturun. Şu komutu vererek anahtarları içe aktarın:
$ mtn --db="i2p.mtn" read < keys.txt
Not: Anahtarları asla $HOME/.monotone/keys
klasörüne el ile eklemeyin.
Güven değerlendirme bağlantılarını kurmak
Varsayılan Monoton güvenilirlik ilkesi, gereksinimlerimiz için çok gevşektir: Varsayılan olarak her göndericiye güvenilir. Bu durum, I2P geliştirmesi için kabul edilemez.
$HOME/.monotone
klasörüne geçin ve monotonerc
dosyasını bir metin düzenleyiciyle açın. Aşağıdaki iki işlevi kopyalayıp bu dosyaya yapıştırın:
-- This implements a list of trusted signers.
-- It is used on checkout and update.
-- It is not used for repo sync/push/pull.
-- If you do not include this function in ~/.monotone/monotonerc, the
-- default is to trust everybody, which is probably a bad thing
-- in an anonymous network.
-- Update the list below to reflect the signers YOU trust.
--
-- ref: http://www.monotone.ca/docs/Trust-Evaluation-Hooks.html
-- Modified to use key identities instead of key names, since
-- monotone allows duplicate key names, so any key-name-based
-- trust system is insecure.
--
-- Modified from intersection() to use key identities instead of key names, since
-- monotone allows duplicate key names.
--
-- a: table of ID structures (see above)
-- b: table of hex IDs
--
function keyintersection(a,b)
local s={}
local t={}
for k,v in pairs(a) do s[v.id] = 1 end
for k,v in pairs(b) do if s[v] ~= nil then table.insert(t,v) end end
return t
end
--
-- from mtn source project.hh and lua_hooks.cc:
-- signers is a table of integers (starting with 1) to the following ID structure:
-- struct ID
-- {
-- id: (key_id in key_identity_info) hex of revision id hash;
-- given_name: (given_name in key_identity_info) // name given when creating the key
-- name: (official_name in key_identity_info) // name returned by hooks or (once implented) policy
-- };
-- id: hex of revision id hash;
-- name: cert_name
-- val: cert_value
--
function get_revision_cert_trust(signers, id, name, val)
local trusted_signers = {
"5bc185cfd680eb512fdb9626b9fb4298e136215e", -- BlubMail@mail.i2p
"f6706ac205e6b5d7a7e3ea4244ab0ef497f0a099", -- cervantes@mail.i2p
"690f278ff6c6157cbaf23b0d602b6d6dcf368313", -- complication@mail.i2p
"eb4ac08d5ddbb2bd73889f86c1211424025a6f07", -- dev@robertfoss.se
"aae785027c240ebbb0a883fd8ebcf8d6ecee4104", -- dev@welterde.de
"86478595288d1b96b58f0c8cd8a8971bc430f8fd", -- dg2@mail.i2p
-- completed dev agreement 2013-07 but never checked in anything
--"5f75b8f0769770edc3267c21ddc9a00ddae31394", -- digit@mail.i2p
"4ebaace9973913416af92ee8d0fb93d64753df4c", -- dream@mail.i2p
"7e498ae94c9c322404adfc61b16bed388095906b", -- duck@mail.i2p
"6c728b0ffed3c2bf7fb0f3c583b30f966d9bacd5", -- echelon2@mail.i2p
"0e4e7ebebafbdf4cdacc45a47ba155b1215d8e8b", -- forget@mail.i2p
"f332b3d3b11b2efdae220cea75b9d5ba9ec3b52d", -- hamada@mail.i2p
"d681db14fd98da1efd6f8ceb2be6b91d784bdf5c", -- hankhill19580@gmail.com
"e246444b4fe69ba599e13403c4ab931066de902f", -- hiddenz@mail.i2p
"a61146ee69ddb9fcf3b82b19a62b8114b60d367e", -- HungryHobo@mail.i2p
"4844b1fd45f5a68744fa28d2f3e3b61a3cf83b95", -- kytv@mail.i2p
"6b2acfc9fe2f69b796631a514660fd7bdd237e2d", -- laziestgravy@mail.i2p
"c9b970f5e8917eada663d4c6b22096617021c95c", -- m1xxy@mail.i2p
"3be64909d6ab7c3d7afe16f20f24e672708b576b", -- magma@mail.i2p
"2977a6f4e11819a3f928783175caadc0071fc4de", -- mathiasdm@mail.i2p
"de9d196e8057e1629178edbfa1ed754c648d7340", -- meeh@mail.i2p
"2a0bba98558d7a9d7e4b1bd807789601252c0024", -- mkvore-commit@mail.i2p
"6ade4b7a9a6425194f482ab351950e4230dbbc85", -- neutron@mail.i2p
"bc74b49fd8a20513b2745a3d13414b7e9818dd18", -- Oldaris@mail.i2p
"3fb8d1ee1e82981a8076ddbcbf4d18f372b8bba7", -- privateer@mail.i2p
"e3815f0c985663182534fbd7d6a2bf93204a0bd0", -- russiansponsor@mail.i2p
"2ef1ae1e73a30e1afc0b4a7af89b4380b3dd46b7", -- slumlord@mail.i2p
"1092773c40f5813b9179d52a8ab7b499b9554da3", -- sponge@mail.i2p
"01265f0c817b24548478341fb75e672720a78b21", -- str4d@mail.i2p
"38fe2aa37e1eb9a300a2061ef153265c48031c6b", -- walking@mail.i2p
"a0eb78d437efad120dd9edcd776a327ec2c2adde", -- zab@mail.i2p
"2158706490e62a17c8140b6e9eabca965b681bc7", -- zab2@mail.i2p
"56810cd6434ab33593260e188b32bb83e4e9a139", -- z3r0fox@mail.i2p
"896e399990704373125f782ae2ee19b6611ac612" -- zzz@mail.i2p
}
local t = keyintersection(signers, trusted_signers)
if t == nil then return false end
if #t>= 1 then return true end
return false
end
İlk işlev, bizim durumumuzda bir revizyonun imzalayanları ile güvenilir imzalayanlarından oluşan iki küme arasındaki kesişimi belirler.
İkinci işlev, argüman olarak "imzalayanlar" ve "güvenilir" ile ilk işlevi çağırarak belirli bir revizyondaki güvenilirliği belirler. Kesişim kümesi boşsa, revizyona güvenilmez. Kesişim kümesi boş değilse, revizyon güvenilirdir. Olabilecek diğer durumlar revizyona güvenilmez.
Güvenilirlik değerlendirme bağlantıları hakkında ayrıntılı bilgi almak için resmi Monotone belgelerine bakabilirsiniz.
i2p.i2p
, i2p.www
ve i2p.syndie
dallarını çekmek
I2P, projenin Monotone sunucusuna yönelen önceden yapılandırılmış bir tünel ile gönderilir. 127.0.0.1:8998 adresinden kaynak kodunu çekmeyi denemeden önce tünelin I2PTunnel içinden başlatıldığından emin olun.
i2p.mtn
dosyasını hazırladığınız klasörü yazın. Yalnızca I2P kaynaklarını mı
yoksa I2P sitesi ve Syndie kaynaklarını da mı istediğinize bağlı olarak,
çekme
işlemini farklı şekillerde gerçekleştirebilirsiniz.
Yalnızca I2P kaynakları istiyorsanız:
$ mtn --db="i2p.mtn" -k "" pull "mtn://127.0.0.1:8998?i2p.i2p"
Tüm dalları istiyorsanız:
$ mtn --db="i2p.mtn" -k "" pull "mtn://127.0.0.1:8998?i2p.*"
Yukarıdaki örneklerin çekilmesi, boş bir taşıyıcı anahtarı belirtilerek anonim olarak yapılır. Herkes anonim olarak çekerse, sunucunun denetimini ele geçiren bir saldırganın bazı kişilere kurcalanmış verileri seçici olarak sağlaması daha zor olacaktır.
Güven değerlendirmesinin işe yaradığını doğrulamak
Güven değerlendirmesinin işe yaradığını doğrulamak için:
monotonerc
dosyanızın yedeğini alın.monotonerc
dosyanızı değiştirerek Trusted_signers değişkenini aşağıdaki şekilde ayarlayın:local trusted_signers = {}
-
monotonerc
yukarıdaki gibi yapılandırıldığında, Monotone artık hiçbir göndericiye güvenmez.i2p.mtn
dosyasının oluşturulduğu klasöre geçiş yapıp I2P dalına göndermeyi deneyerek bunu doğrulayın:$ mtn --db="i2p.mtn" co --branch="i2p.i2p"
i2p.i2p
adlı bir dizin görünmemelidir. Aşağıdakiler gibi birçok hata iletisi görmelisiniz:mtn: warning: trust function disliked 1 signers of branch cert on revision 523c15f6f50cad3bb002f830111fc189732f693b mtn: warning: trust function disliked 1 signers of branch cert on revision 8ac13edc2919dbd5bb596ed9f203aa780bf23ff0 mtn: warning: trust function disliked 1 signers of branch cert on revision 8c4dd8ad4053baabb102a01cd3f91278142a2cd1 mtn: misuse: branch 'i2p.i2p' is empty
Sonuçlardan memnunsanız, yukarıda oluşturulan
monotonerc
yedeğini geri yükleyin. Önerildiği gibi bir yedekleme oluşturmadıysanız, Güvenilirlik değerlendirme bağlantılarını ayarlama konusunu yeniden okuyun.Son sürümün çalışan bir kopyasına geçmek
Zaten kullanıma alınmış bir dalınız varsa, sonraki bölüme atlayın.
i2p.mtn
dosyasının bulunduğu klasöre geçin. Oradaki şunu yazın:- $
mtn --db="i2p.mtn" co --branch="i2p.i2p"
Geçiş, hata iletileri olmadan tamamlanmalı ve geçerli klasörde
i2p.i2p
adlı bir klasör görünmelidir. Tebrikler! Derlenmeye hazır en son I2P kaynaklarına geçtiniz.Çalışan kopyanızı son sürüme güncellemek
Bunu henüz yapmadıysanız, sunucudan yerel Monotone deponuza taze kodları çekin. Bunu yapmak için
i2p.mtn
dosyasının bulunduğu klasöre geçin ve şunu yazın:- $
mtn --db="i2p.mtn" -k "" pull "mtn://127.0.0.1:8998?i2p.i2p"
Şimdi
i2p.i2p
klasörünüee geçin ve orada şunu yazın:- $
mtn update
Bir sorun çıkmadıysa…Tebrikler! En son I2P kaynaklarına geçtiniz. Bu kaynaklar derlenmeye hazır olmalı.
Bir Monotone sunucusu işletmek
Geliştiricinin taşıyıcı anahtarlarını edinmek ve dağıtmak
Bir sunucu işletmecisi olarak, belirli geliştiricilere itme erişimi izni vermek isteyebilirsiniz.
Çekme ve itme erişimi izinlerini vermek
Monotone sunucusu varsayılan olarak tüm erişimi reddeder.
Tüm istemcilere çekme erişimi vermek için aşağıdakileri ayarlayın
$HOME/.monotone/read-permissions
:pattern "*" allow "*"
Açıkça izin verilmeden hiç kimse sunucunuza kod itemexz. İtme erişimi vermek için:
-
Kullanıcının taşıma anahtarının adını şuraya ekleyin:
$HOME/.monotone/yazma izinleri
, örneğin
her satıra bir anahtar yazın.zzz-transport@mail.i2p complivation-transport@mail.i2p
- Taşıma anahtarını veri tabanınızın içine aktarın. Taşıyıcı anahtarlarını içe aktarma işlemi, Geliştirici anahtarlarını edinmek ve dağıtmak bölümünde açıklanan gönderim anahtarlarını içe aktarma işlemiyle aynıdır.
Monotone uygulamasını sunucu kipinde çalıştırmak
Monotone sunucunuz için ayrı bir veri tabanı kullanılmalıdır çünkü monotone, başkalarına sunulurken veri tabanını kilitler. Geliştirme veri tabanınızın bir kopyasını alın, ardından sunucuyu şu komutla başlatın:
- $
mtn serve --bind="127.0.0.1:8998" --db="i2p.mtn" --key "myserver-transport@mail.i2p"
Sunucunuzun I2P üzerinden başkaları tarafından erişilebilir olması için bir sunucu tüneli oluşturmanız gerekir. "Standart" tünel türünü ve "Toplu" profili kullanın.
Debian GNU/Linux altındaki farklılıklar
Debian (diğer bazı dağıtımların yanı sıra), Monotone uygulamasını arka plan işlemleri/hizmetleri çatısıyla bütünleştirdi. Monotone sunucuları Debian sistemlerinde hala "sıradan şekilde" çalıştırılabilse de, bunu "Debian yoluyla" yapmak daha kolay olabilir.
İzinleri vermek için,
/etc/monotone/read-permissions
ve/etc/monotone/write-permissions
dosyaları düzenlenmelidir. Monotone uygulamasının başlangıçta yüklenmesi sağlamak veya sunucu, bağlantı noktası veya veri tabanı konumunu değiştirmek için/etc/default/monotone
dosyasını da düzenlemeniz gerekir.