Bir süredir pfSense ile ilgileniyorum, çeşitli konularda pfSense forumlarından yardım alıyorum. Türkçe bölümünde görevli arkadaşlar konuyla çok ilgililer bu nedenle bende ufak tefek katılar da bulunmak istedim. Captive Portal admin girişi yapmadan aşağıda hazırladığım dosya ile basit şekilde kullanıcı tanımlayabiliriniz.
<?php
/**
* Captive Portal'dan bagimsiz olarak kullanici eklenebilmesi icin hazirlanmistir.
* Test edilmedi, mevcut bir sistemden orneklenmistir. Kullanim icin PHP bilgisi gerekmektedir.
*
* 2011.08.13
* Aydin Yakar
*/
require("guiconfig_user.inc"); //guiconfig.inc dosyasi auth kaldirilarak guiconfig_user.inc isimle kaydedildi.
if($_POST) {
//kullanici adi ve sifreyi kucuk harf yapalim
$_username = strtolower($_POST['username']);
$_password = strtolower($_POST['password']);
$_bitistar = $_POST['bitistarihi'];
$_adsoyad = $_POST['adisoyadi'];
if (!is_array($config['captiveportal']['user']))
{
$config['captiveportal']['user'] = array();
}
captiveportal_users_sort();
$a_user = &$config['captiveportal']['user'];
//suresi dolan hesaplari sil
$changed = false;
for ($i = 0; $i < count($a_user); $i++) {
if ($a_user[$i]['expirationdate'] && (strtotime("-1 day") > strtotime($a_user[$i]['expirationdate']))) {
unset($a_user[$i]);
$changed = true;
}
}
if ($changed) {
write_config();
}
foreach ($a_user as $userent) {
if ($userent['name'] == $_username && $userent['password'] == md5($_password)) {
// login Ok, oturum ac
$loginok = true;
$loginDetay = $userent;
break;
}
}
//kullanici ve sifre var ayni zamanda dogru
if($loginok)
{
// Login
$orig_host = $_ENV['HTTP_HOST'];
$orig_request = $_POST['redirurl'];
$clientip = $_SERVER['REMOTE_ADDR'];
$clientmac = arp_get_mac_by_ip($clientip);
$macfilter = !isset($config['captiveportal']['nomacfilter']);
if (!$clientmac && $macfilter) {
captiveportal_logportalauth("unauthenticated","noclientmac",$clientip,"ERROR");
echo "An error occured. Please check the system logs for more information.";
log_error("Captive portal could not deterimine clients MAC address. Disable MAC address filtering in captive portal if you do not needs this functionality.");
exit;
}
captiveportal_logportalauth($loginDetay['name'],$clientmac,$clientip,"LOGIN");
portal_allow($clientip, $clientmac,$loginDetay['name']);
header("Location: $orig_request");
}
else
{
$userent['name'] = $_username;
$userent['fullname'] = $_adsoyad;
$userent['expirationdate'] = date("m/d/Y", strtotime($_bitistar));
$userent['password'] = md5($_password);
$a_user[] = $userent;
write_config();
// Login
$orig_host = $_ENV['HTTP_HOST'];
$orig_request = $_POST['redirurl'];
$clientip = $_SERVER['REMOTE_ADDR'];
$clientmac = arp_get_mac_by_ip($clientip);
$macfilter = !isset($config['captiveportal']['nomacfilter']);
if (!$clientmac && $macfilter) {
captiveportal_logportalauth("unauthenticated","noclientmac",$clientip,"ERROR");
echo "An error occured. Please check the system logs for more information.";
log_error("Captive portal could not deterimine clients MAC address. Disable MAC address filtering in captive portal if you do not needs this functionality.");
exit;
}
captiveportal_logportalauth($userent['name'],$clientmac,$clientip,"LOGIN");
portal_allow($clientip, $clientmac,$userent['name']);
}
}
else
{
/**
* Yeni kullanici olusturulmasi icin gerekli kayit formunu olusturunuz.
* username = kullanici adi.
* password = sifresi
* bitistarihi = kullanicinin kullanim suresi
* adisoyadi = adi ve soyadi
*
* Form POST methodu ile gonderilmelidir.
*/
?>
<form name="yeniUyelik" action="uye_kayit.php" method="post">
Kulllanici Adi: <input type="text" name="username"><br />
Sifre: <input type="text" name="password"><br />
Ad Soyad: <input type="text" name="adisoyadi"><br />
Uye Bitis Tarihi: <input type="text" name="bitistarihi"><br />
<input type="submit" name="gonder" value="Kaydet">
</form>
<?php
}
?>
Konuyla ilgili pfSense forumunda sorular ve cevaplar yer almaktadır, yorum ve forum mesajları ile siz de katkıda bulunabilirsiniz.
NOT: Bu düzenleme pfSense 1.2.3 için yapılmışdır, şuanda mevcut sürüm olan pfSense 2.0 Release’de deneme şansım olmadı fakat onda da bu işlemden çok farklı değil.

15 Ağustos 2011 Pazartesi, 9:34 am | 



Eylül 30, 2011 at 11:35 pm
Güzel yazı elinize sağlık Aydın Bey. Arkasında büyük bir emek olduğu anlaşılıyor.
Ekim 1, 2011 at 12:36 pm
teşekkür ederim
Kasım 24, 2011 at 2:14 pm
Aydın bey merhaba
forumada yazdım ancak henüz problemi aşamadım.
buradaki işlemleri sırasıyla yaptım ancak sayfayı actığımda ” Fatal error: Call to undefined function is_subsystem_dirty() in /usr/local/www/guiconfig_user.inc on line 89″ hatası veriyor.
87 /* Some ajax scripts still need access to GUI */
88 if(!$ignorefirmwarelock) {
89 if (is_subsystem_dirty(‘firmwarelock’)) {
if (!$d_isfwfile) {
header(“Location: system_firmware.php”);
exit;
} else {
return;
}
}
}
guiconfig_user.inc içeriği bu şekilde 89 da bu satır var : if (is_subsystem_dirty(‘firmwarelock’)) {
yardımcı olabilirseniz sevinirim
Aralık 13, 2011 at 12:33 pm
Hatadan anlaşıldığı üzere “is_subsystem_dirty()” fonksiyonu tanımlanmamış. Öncelikle WinSCP programıyla bağlanarak sistemdeki dosyaları bilgisayarınıza indirin ve Notepad++ tarzı bir program ile hata veren fonksiyonun tanımlandığı dosyayı bularak çalıştırdığınız dosyaya include ediniz sorun düzelecektir.