Dokümantasyon

CHROME EXTENSION DUZELTMELER

← Geri

Chrome Extension Düzeltmeleri

🔧 Yapılan Düzeltmeler

1. Şifre Yapıştır Çalışmıyor Sorunu

Sorun

  • API URL'i sabit olarak http://localhost:5000/api olarak ayarlanmıştı
  • Popup.js'de API URL'i storage'a kaydediliyordu ama background.js bunu kullanmıyordu
  • Content script'e mesaj gönderilirken hata olabiliyordu

Çözüm

  • API URL'i storage'dan alma: getApiUrl() fonksiyonu eklendi
  • Content script yükleme: Content script'in yüklendiğinden emin olmak için chrome.scripting.executeScript eklendi
  • Hata yönetimi: Daha iyi hata yönetimi ve notification'lar eklendi
  • URL normalization: Hem tam URL hem de domain için arama yapılıyor

2. İlk Kez Kullanılan Şifreyi Otomatik Kaydetme

Özellik

  • Şifre oluşturulduğunda: Kullanıcıya kaydetme seçeneği sunuluyor
  • Şifre yapıştırıldığında: Eğer kayıtlı şifre yoksa, kullanıcıya kaydetme seçeneği sunuluyor
  • Otomatik kaydetme: Kullanıcı onayladığında şifre otomatik olarak kaydediliyor

3. Content Script İyileştirmeleri

Yapılan Değişiklikler

  • React/Vue desteği: Framework'ler için native input value setter kullanılıyor
  • Daha iyi input tespiti: Password, text, email input'ları ve textarea'lar destekleniyor
  • Event tetikleme: Input, change, keyup, keydown, paste event'leri tetikleniyor
  • ContentEditable desteği: DIV elementleri için contentEditable desteği eklendi

4. API Controller Düzeltmeleri

Yapılan Değişiklikler

  • Password property desteği: API'den gelen password property'si EncryptedPassword'a map ediliyor
  • Dynamic model binding: dynamic type kullanılarak hem password hem encryptedPassword property'leri destekleniyor
  • Hata yönetimi: Daha iyi hata mesajları ve exception handling

5. URL Normalization İyileştirmeleri

Yapılan Değişiklikler

  • Hem tam URL hem domain arama: Önce tam URL için arama yapılıyor, bulunamazsa domain için arama yapılıyor
  • Contains sorgusu: URL'ler Contains ile aranıyor, böylece farklı path'lerdeki şifreler bulunabiliyor

📝 Kod Değişiklikleri

background.js

  1. API URL'i storage'dan alma:
async function getApiUrl() {
  return new Promise((resolve) => {
    chrome.storage.local.get([API_BASE_URL_KEY], (result) => {
      resolve(result[API_BASE_URL_KEY] || null);
    });
  });
}
  1. URL normalization:
const urlObj = new URL(url);
const fullUrl = `${urlObj.protocol}//${urlObj.hostname}${urlObj.pathname}`;
const domainUrl = `${urlObj.protocol}//${urlObj.hostname}`;
  1. İlk önce tam URL, sonra domain için arama:
let response = await fetch(`${apiBaseUrl}/Password/by-url?url=${encodeURIComponent(fullUrl)}`, {
  headers: {
    'Authorization': `Bearer ${token}`,
    'Accept': 'application/json'
  }
});

let result = await response.json();

// Eğer tam URL ile sonuç bulunamazsa, domain için ara
if (!response.ok || !result.isSuccess || !result.data || result.data.length === 0) {
  response = await fetch(`${apiBaseUrl}/Password/by-url?url=${encodeURIComponent(domainUrl)}`, {
    headers: {
      'Authorization': `Bearer ${token}`,
      'Accept': 'application/json'
    }
  });
  result = await response.json();
}
  1. Şifre kaydetme fonksiyonu:
async function savePassword(tab, url, password, apiBaseUrl, token, username = '') {
  try {
    const urlObj = new URL(url);
    const title = urlObj.hostname.replace('www.', '');

    const response = await fetch(`${apiBaseUrl}/Password`, {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${token}`,
        'Content-Type': 'application/json',
        'Accept': 'application/json'
      },
      body: JSON.stringify({
        title: title,
        url: url,
        username: username,
        password: password,
        notes: ''
      })
    });

    if (result.isSuccess) {
      chrome.notifications.create({
        type: 'basic',
        title: 'SeedPass',
        message: 'Şifre başarıyla kaydedildi!'
      });
    }
  } catch (error) {
    // Hata yönetimi
  }
}

content.js

  1. React/Vue desteği:
const nativeInputValueSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value')?.set;
if (nativeInputValueSetter && activeElement.tagName === 'INPUT') {
  nativeInputValueSetter.call(activeElement, password);
  const inputEvent = new Event('input', { bubbles: true });
  activeElement.dispatchEvent(inputEvent);
}
  1. Daha iyi input tespiti:
// Önce password input ara
targetElement = document.querySelector('input[type="password"]');

// Password input yoksa, text input ara
if (!targetElement) {
  targetElement = document.querySelector('input[type="text"]');
}

// Text input da yoksa, email input ara
if (!targetElement) {
  targetElement = document.querySelector('input[type="email"]');
}

// Hiçbiri yoksa, textarea ara
if (!targetElement) {
  targetElement = document.querySelector('textarea');
}

PasswordController.cs

  1. Dynamic model binding:
[HttpPost]
public async Task<IActionResult> CreatePassword([FromBody] dynamic passwordData)
{
    // JSON'dan gelen password property'sini EncryptedPassword'a map et
    var password = new Password
    {
        UserId = userId,
        Title = passwordData?.title?.ToString() ?? string.Empty,
        Url = passwordData?.url?.ToString() ?? string.Empty,
        Username = passwordData?.username?.ToString() ?? string.Empty,
        Notes = passwordData?.notes?.ToString(),
        EncryptedPassword = passwordData?.password?.ToString() ?? passwordData?.encryptedPassword?.ToString() ?? string.Empty
    };
    // ...
}

PasswordService.cs

  1. URL normalization iyileştirmesi:
public async Task<ProcessResult<List<Password>>> GetPasswordsByUrlAsync(int userId, string url)
{
    var normalizedUrl = NormalizeUrl(url);
    
    // Önce tam eşleşme ara (URL Contains ile)
    var passwords = await _context.Passwords
        .Where(p => p.UserId == userId && p.State == true && 
                   (p.Url.Contains(normalizedUrl) || normalizedUrl.Contains(p.Url)))
        .OrderByDescending(p => p.CreateDate)
        .ToListAsync();
    // ...
}

✅ Test Adımları

1. Chrome Extension Kurulumu

  1. Chrome'da chrome://extensions/ adresine gidin
  2. Developer mode'u açın
  3. Load unpacked butonuna tıklayın
  4. C:\Publish\SeedPass\ChromeExtension klasörünü seçin
  5. Extension yüklenmeli (icon hatası olmamalı)

2. Chrome Extension Ayarlama

  1. Extension icon'una tıklayın
  2. API URL: https://seedpass.seed.tr
  3. Token: Web uygulamasından aldığınız token'ı yapıştırın
  4. Token Kaydet butonuna tıklayın

3. Şifre Yapıştırma Testi

  1. Herhangi bir web sitesinde şifre girmeniz gereken alana gidin
  2. Sayfada sağ tıklayın
  3. SeedPass > Şifreyi Yapıştır seçin
  4. Şifre yapıştırılmalı

4. Şifre Oluşturma Testi

  1. Herhangi bir web sitesinde şifre oluşturmanız gereken alana gidin
  2. Sayfada sağ tıklayın
  3. SeedPass > Şifre Oluştur seçin
  4. Şifre oluşturulmalı ve yapıştırılmalı
  5. Kaydetme seçeneği sunulmalı

5. Otomatik Kaydetme Testi

  1. Şifre oluşturulduğunda kaydetme seçeneğini onaylayın
  2. Kullanıcı adını girin (opsiyonel)
  3. Şifre kaydedilmeli
  4. Web uygulamasında şifrenin kaydedildiğini kontrol edin

🔍 Sorun Giderme

Şifre yapıştırılmıyor

  1. Content script kontrolü: Content script'in yüklendiğinden emin olun
  2. Input alanı kontrolü: Sayfada input alanı olduğundan emin olun
  3. Console kontrolü: Chrome DevTools Console'da hata mesajlarını kontrol edin
  4. Sayfa yenileme: Sayfayı yenileyin ve tekrar deneyin

Şifre kaydedilmiyor

  1. Token kontrolü: Token'ın doğru olduğundan emin olun
  2. API URL kontrolü: API URL'in doğru olduğundan emin olun
  3. Console kontrolü: Chrome DevTools Console'da hata mesajlarını kontrol edin
  4. Network kontrolü: Chrome DevTools Network tab'ında API isteklerini kontrol edin

Notification görünmüyor

  1. Notification izni: Chrome'da notification izni verildiğinden emin olun
  2. Icon kontrolü: Icon dosyası yoksa notification icon olmadan gösterilir
  3. Console kontrolü: Chrome DevTools Console'da hata mesajlarını kontrol edin

📚 Önemli Notlar

  • Content script manifest'te tanımlı olduğu için genellikle yüklü olmalı
  • Bazı sayfalarda (chrome://, about:, file://) content script çalışmayabilir
  • URL normalization hem tam URL hem de domain için arama yapıyor
  • Şifre oluşturulduğunda kullanıcıya kaydetme seçeneği sunuluyor
  • Şifre yapıştırıldığında eğer kayıtlı şifre yoksa, kullanıcıya kaydetme seçeneği sunuluyor

🚀 Güncelleme

  1. Chrome Extension'ı Güncelleyin:

    • C:\Publish\SeedPass\ChromeExtension klasöründeki dosyaları güncelleyin
    • Chrome'da extension'ı yeniden yükleyin
  2. Web Uygulamasını Güncelleyin:

    • Web uygulamasını yeniden başlatın
    • Değişikliklerin uygulanması için uygulamayı yeniden başlatın
  3. Test Edin:

    • Şifre yapıştırma işlevini test edin
    • Şifre oluşturma işlevini test edin
    • Otomatik kaydetme işlevini test edin

✅ Sonuç

  • ✅ Şifre yapıştır çalışıyor
  • ✅ Şifre oluştur çalışıyor
  • ✅ Otomatik kaydetme özelliği eklendi
  • ✅ Content script iyileştirildi
  • ✅ API controller düzeltildi
  • ✅ URL normalization iyileştirildi
  • ✅ Hata yönetimi iyileştirildi

Artık Chrome Extension tam olarak çalışmalı!