Sobrescrever determinados caracteres em string
Olá.
Estou quase concluindo uma classe aqui que gera o octal ou texto de permissões de sistemas Unix. A pessoa informa através de um array quais permissões o dono, membros do grupo do dono e outros usuários terão sobre determinada coisa (arquivo, diretório, espaço na memória, etc...).
A geração do octal está beleza, o problema é a forma de texto, ex:
Octal | Textual
777 | -rwxrwxrwx
O problema está mais especificamente ao gerar o texto daquelas permissões com 4 dígitos, onde o primeiro deles faz umas coisas doidas lá que não sei explicar, e em texto substitui alguns carácteres da permissão normal, ex:
Octal | Textual
7000 | ---S--S--T
7777 | -rwSrwSrwT
Como se nota, ao usar o formato de 4 dígitos, é primeiramente gerada a permissão com os 3 últimos dígitos, no caso o 777 foi -rwxrwxrwx, depois gera do primeiro dígito, no caso 7000 ficou ---S--S--T. Por último ele substitui os carácteres do 777 pelos gerados no 7000, formando o 7777 (-rwSrwSrwT).
Estou querendo seguir essas mesmas etapas aqui na classe, mas o problema é na hora de fazer essa substituição ou junção de uma string com a outra. Não faço ideia de como fazer isso. Bom, talvez até faça, mas seria uma bela demonstração de sLow Level POG, hehe.
Além disso tudo, tem esse primeiro caractere, que no caso é -, que informa o tipo de alvo da regra de permissão, no caso arquivo regular, mas isso aí não é problema.
Código atual da classe:
class Permission { const SET_USER = ['numeric' => 4, 'textual' => '---S------'], SET_GROUP = ['numeric' => 2, 'textual' => '------S---'], STICKY = ['numeric' => 1, 'textual' => '---------T'], SET_USER_GROUP = ['numeric' => 6, 'textual' => '---S--S---'], SET_USER_STICKY = ['numeric' => 5, 'textual' => '---S-----T'], SET_USER_GROUP_STICKY = ['numeric' => 7, 'textual' => '---S--S--T'], SET_GROUP_STICKY = ['numeric' => 3, 'textual' => '------S--T'], NONE = ['numeric' => 0, 'textual' => '---'], READ_ONLY = ['numeric' => 4, 'textual' => 'r--'], WRITE_ONLY = ['numeric' => 2, 'textual' => '-w-'], EXECUTE_ONLY = ['numeric' => 1, 'textual' => '--x'], READ_WRITE = ['numeric' => 6, 'textual' => 'rw-'], READ_EXECUTE = ['numeric' => 5, 'textual' => 'r-x'], READ_WRITE_EXECUTE = ['numeric' => 7, 'textual' => 'rwx'], WRITE_EXECUTE = ['numeric' => 3, 'textual' => '-wx'], TARGET_REGULAR_FILE = '-', TARGET_DIRECTORY = 'd', TARGET_SYMBOLIC_LINK = 'l', TARGET_UNIX_DOMAIN_SOCKET = 's', TARGET_NAMED_PIPE = 'p', TARGET_CHARACTER_DEVICE_FILE = 'c', TARGET_BLOCK_DEVICE_FILE = 'b'; private $permissions; public function __construct($permissions) { $this->defineNotInformed($permissions); asort($permissions); $this->permissions = $permissions; } private function defineNotInformed(&$permissions) { if (!isset($permissions['owner'])) $this->permissions['owner'] = self::NONE; if (!isset($permissions['group'])) $this->permissions['group'] = self::NONE; if (!isset($permissions['users'])) $this->permissions['users'] = self::NONE; } public function getNumber() { $numeric = isset($this->permissions[0]) ? $this->permissions[0] : null; foreach ($this->permissions as $permission) $numeric .= $permission['numeric']; return intval($numeric); } public function getText($target = self::TARGET_REGULAR_FILE) { //return $target . ??? } }
Ah, essas constantes SET_USER, SET_GROUP, STICKY, SET_USER_GROUP, SET_USER_STICKY, SET_USER_GROUP_STICKY e SET_GROUP_STICKY armazenam o código desse primeiro dígito no formato de 4 dígitos 'textual', e o seu número nesse formato, X000, onde X é 'numeric'.
As constantes TARGET_* armazenam o primeiro caractere do código da permissão em texto, como citei ali encima, e as demais, são as permissões em texto e número para cada usuário/grupo de usuários abrangente (se eu tentar explicar mais vai confundir quem lê, não sou bom em explicações assim, e não acho que entender isso aí seja vital para ajudar a resolver o problema).
Alguma sugestão?
Até mais.
Discussão (3)
Carregando comentários...