File indexing completed on 2024-05-12 04:46:01

0001 #include "fileproperties.h"
0002 #include <QFile>
0003 #include <QFileInfo>
0004 
0005 #include <KUser>
0006 #include <QDebug>
0007 
0008 // Only maxentries users are listed in the plugin
0009 // increase if you need more
0010 #define MAXENTRIES 1000
0011 
0012 FileProperties::FileProperties(QObject *parent) : QObject(parent)
0013 {
0014   connect(this, &FileProperties::urlChanged, [this]()
0015   {
0016       this->setData ();
0017     });
0018 }
0019 
0020 const QUrl &FileProperties::url() const
0021 {
0022   return m_url;
0023 }
0024 
0025 void FileProperties::setUrl(const QUrl &newUrl)
0026 {
0027   if (m_url == newUrl)
0028     return;
0029   m_url = newUrl;
0030   emit urlChanged();
0031 }
0032 
0033 bool Permission::checkPermission(const QUrl &url, const Permission::UserType &user, const Permission::PermissionType &type)
0034 {
0035   qDebug() << "Checkign permissions" <<url << user << type;
0036 
0037   if(!url.isValid () || url.isEmpty () || !url.isLocalFile ())
0038     {
0039       return false;
0040     }
0041 
0042   qDebug() << "Checkign permissions" << user << type;
0043 
0044   QFile file(url.toLocalFile ());
0045 
0046   auto permissions = file.permissions ();
0047 
0048   switch(user)
0049     {
0050     case UserType::OWNER:
0051       switch(type)
0052         {
0053         case WRITE:
0054           return permissions & QFileDevice::WriteOwner;
0055         case READ:
0056           return permissions & QFileDevice::ReadOwner;
0057         case EXECUTE:
0058           return permissions & QFileDevice::ExeOwner;
0059         default: return false;
0060         }
0061       break;
0062     case UserType::GROUP:
0063       switch(type)
0064         {
0065         case WRITE:
0066           return permissions & QFileDevice::WriteGroup;
0067         case READ:
0068           return permissions & QFileDevice::ReadGroup;
0069         case EXECUTE:
0070           return permissions & QFileDevice::ExeGroup;
0071         default: return false;
0072         }
0073       break;
0074     case UserType::OTHER:
0075       switch(type)
0076         {
0077         case WRITE:
0078           return permissions & QFileDevice::WriteOther;
0079         case READ:
0080           return permissions & QFileDevice::ReadOther;
0081         case EXECUTE:
0082           return permissions & QFileDevice::ExeOther;
0083         default: return false;
0084         }
0085       break;
0086     }
0087 
0088   return false;
0089 }
0090 
0091 bool Permission::setPermission(const QUrl &url, const UserType &user, const PermissionType &key, const bool &state)
0092 {
0093   qDebug() << "Setting permissions" <<url << user << key << state;
0094 
0095   if(!url.isValid () || url.isEmpty () || !url.isLocalFile ())
0096     {
0097       return false;
0098     }
0099 
0100   qDebug() << "Setting permissions" <<url << user << key << state;
0101 
0102   QFile file(url.toLocalFile ());
0103   auto permissions = file.permissions ();
0104   qDebug() << "Setting permissions" <<url << user << key << state << permissions;
0105 
0106   switch(user)
0107     {
0108     case UserType::OWNER:
0109       switch(key)
0110         {
0111         case WRITE:
0112           permissions = state ? (permissions | QFileDevice::WriteOwner) : (permissions & (~QFileDevice::WriteOwner));
0113           break;
0114         case READ:
0115           if(state)
0116             {
0117               permissions = permissions | QFileDevice::ReadOwner;
0118             }else
0119             {
0120               permissions = permissions & (~QFileDevice::ReadOwner);
0121               qDebug() << "Setting permissions" <<permissions;
0122 
0123             }
0124           break;
0125         case EXECUTE:
0126           permissions = state ? (permissions | QFileDevice::ExeOwner) : (permissions & (~QFileDevice::ExeOwner));
0127           break;
0128         default: return false;
0129         }
0130       break;
0131 
0132     case UserType::GROUP:
0133       switch(key)
0134         {
0135         case WRITE:
0136           permissions = state ? (permissions | QFileDevice::WriteGroup) : (permissions & (~QFileDevice::WriteGroup));
0137           break;
0138         case READ:
0139           permissions = state ? (permissions | QFileDevice::ReadGroup) : (permissions & (~QFileDevice::ReadGroup));
0140           break;
0141         case EXECUTE:
0142           permissions = state ? (permissions | QFileDevice::ExeGroup) : (permissions & (~QFileDevice::ExeGroup));
0143           break;
0144         default: return false;
0145         }
0146       break;
0147 
0148     case UserType::OTHER:
0149       switch(key)
0150         {
0151         case WRITE:
0152           permissions = state ? (permissions | QFileDevice::WriteOther) : (permissions & (~QFileDevice::WriteOther));
0153           break;
0154         case READ:
0155           permissions = state ? (permissions | QFileDevice::ReadOther) : (permissions & (~QFileDevice::ReadOther));
0156           break;
0157         case EXECUTE:
0158           permissions = state ? (permissions | QFileDevice::ExeOther) : (permissions & (~QFileDevice::ExeOther));
0159           break;
0160         default: return false;
0161         }
0162       break;
0163     }
0164 
0165   return file.setPermissions (permissions);
0166 }
0167 
0168 void FileProperties::setData()
0169 {
0170   if(!m_url.isValid () || m_url.isEmpty () || !m_url.isLocalFile ())
0171     {
0172       return;
0173     }
0174 
0175   QFileInfo file(m_url.toLocalFile ());
0176   m_group = file.group ();
0177   m_owner = file.owner ();
0178 
0179   emit groupChanged ();
0180   emit ownerChanged ();
0181 
0182 
0183   m_users = KUser::allUserNames (MAXENTRIES);
0184   m_groups = KUser().groupNames (MAXENTRIES);
0185   // sort both lists
0186   m_users.sort();
0187   m_groups.sort();
0188 
0189   emit groupsChanged ();
0190   emit usersChanged ();
0191 }
0192 
0193 const QString &FileProperties::group() const
0194 {
0195   return m_group;
0196 }
0197 
0198 void FileProperties::setGroup(const QString &newGroup)
0199 {
0200   if (m_group == newGroup)
0201     return;
0202   m_group = newGroup;
0203   emit groupChanged();
0204 }
0205 
0206 const QStringList &FileProperties::groups() const
0207 {
0208   return m_groups;
0209 }
0210 
0211 const QString &FileProperties::owner() const
0212 {
0213   return m_owner;
0214 }
0215 
0216 void FileProperties::setOwner(const QString &newOwner)
0217 {
0218   if (m_owner == newOwner)
0219     return;
0220   m_owner = newOwner;
0221   emit ownerChanged();
0222 }
0223 
0224 const QStringList &FileProperties::users() const
0225 {
0226   return m_users;
0227 }
0228 
0229 Permission::Permission(QObject *parent) : QObject(parent)
0230 {
0231   connect(this, &Permission::urlChanged, [this]()
0232   {
0233       this->setData();
0234     });
0235 
0236   connect(this, &Permission::userChanged, [this]()
0237   {
0238       this->setData();
0239     });
0240 }
0241 
0242 const QUrl &Permission::url() const
0243 {
0244   return m_url;
0245 }
0246 
0247 void Permission::setUrl(const QUrl &newUrl)
0248 {
0249   if (m_url == newUrl)
0250     return;
0251   m_url = newUrl;
0252   emit urlChanged();
0253 }
0254 
0255 Permission::PermissionType Permission::type() const
0256 {
0257   return m_type;
0258 }
0259 
0260 void Permission::setType(PermissionType newType)
0261 {
0262   if (m_type == newType)
0263     return;
0264   m_type = newType;
0265   emit typeChanged();
0266 }
0267 
0268 Permission::UserType Permission::user() const
0269 {
0270   return m_user;
0271 }
0272 
0273 void Permission::setUser(UserType newUser)
0274 {
0275   if (m_user == newUser)
0276     return;
0277   m_user = newUser;
0278   emit userChanged();
0279 }
0280 
0281 bool Permission::read() const
0282 {
0283   return m_read;
0284 }
0285 
0286 void Permission::setRead(bool newRead)
0287 {
0288   if (m_read == newRead)
0289     return;
0290 
0291   if(!Permission::setPermission (m_url, m_user, PermissionType::READ, newRead))
0292     {
0293       qDebug() << "Setting permissions failed";
0294 
0295       return;
0296     }
0297 
0298   qDebug() << "Setting permissions?";
0299 
0300   m_read = newRead;
0301   emit readChanged();
0302 
0303 }
0304 
0305 bool Permission::write() const
0306 {
0307   return m_write;
0308 }
0309 
0310 void Permission::setWrite(bool newWrite)
0311 {
0312   if (m_write == newWrite)
0313     return;
0314 
0315   if(!Permission::setPermission (m_url, m_user, PermissionType::WRITE, newWrite))
0316     {
0317       return;
0318     }
0319 
0320   m_write = newWrite;
0321   emit writeChanged();
0322 }
0323 
0324 bool Permission::execute() const
0325 {
0326   return m_execute;
0327 }
0328 
0329 void Permission::setExecute(bool newExecute)
0330 {
0331   if (m_execute == newExecute)
0332     return;
0333 
0334   if(!Permission::setPermission (m_url, m_user, PermissionType::EXECUTE, newExecute))
0335     {
0336       return;
0337     }
0338 
0339   m_execute = newExecute;
0340   emit executeChanged();
0341 }
0342 
0343 void Permission::setData()
0344 {
0345   m_read = Permission::checkPermission (m_url, m_user, PermissionType::READ);
0346   m_write = Permission::checkPermission (m_url, m_user, PermissionType::WRITE);
0347   m_execute = Permission::checkPermission (m_url, m_user, PermissionType::EXECUTE);
0348   emit this->readChanged ();
0349   emit this->writeChanged ();
0350   emit this->executeChanged ();
0351 }