/** * */ package org.archive.petabox; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.Reader; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * reads petabox credential from a file in Mozilla cookie format. * by default it reads ~/.iaauth. specify File or call {@link #setCookieFile(File)} to * read cookies from different file. * @author Kenji Nagahashi * */ public class CookieFilePetaboxCredentialProvider extends PetaboxCredentialProvider { private static final Log LOG = LogFactory.getLog(CookieFilePetaboxCredentialProvider.class); private static final String DEFAULT_COOKIE_FILENAME = ".iaauth"; private File cookieFile = null; private String cachedUser; private String cachedSignature; private File getDefautlFile() { String home = System.getProperty("user.home"); if (home == null) return null; File f = new File(home, DEFAULT_COOKIE_FILENAME); return f; } public CookieFilePetaboxCredentialProvider() { } public CookieFilePetaboxCredentialProvider(File cookieFile) { this.cookieFile = cookieFile; } public File getCookieFile() { return cookieFile; } public void setCookieFile(File cookieFile) { this.cookieFile = cookieFile; clearCached(); } protected void readCredential() { File cf = cookieFile != null ? cookieFile : getDefautlFile(); if (!cf.canRead()) { LOG.info(cf + ": cannot read"); return; } try { Reader r = new FileReader(cf); BufferedReader br = new BufferedReader(r); try { String line; while ((line = br.readLine()) != null) { if (line.startsWith("#")) continue; String[] fields = line.split("\\s+"); if (fields.length < 7) continue; // XXX this means this class works only against archive.org if (!fields[0].equals(".archive.org")) continue; if (fields[5].equals("logged-in-user")) { this.cachedUser = fields[6]; } else if (fields[5].equals("logged-in-sig")) { this.cachedSignature = fields[6]; } } } finally { br.close(); } } catch (IOException ex) { LOG.warn("error reading "+cf.getPath(), ex); } } protected void clearCached() { cachedUser = cachedSignature = null; } /* (non-Javadoc) * @see org.archive.crawler.petabox.PetaboxCredentialProvider#getSignature() */ @Override public String getSignature() { if (cachedSignature == null) readCredential(); return cachedSignature; } /* (non-Javadoc) * @see org.archive.crawler.petabox.PetaboxCredentialProvider#getUser() */ @Override public String getUser() { if (cachedUser == null) readCredential(); return cachedUser; } }